Skip to content

Feedback Bridge — Engagement to Roster Suggestions

social/feedback-bridge reads the posts log + engagement snapshot history (both produced by research/viral-gate-status) and emits a suggested roster delta — topics ranked by max-views, formulas weighted by win rate against a baseline. Suggestions are appended to ~/.fabric/roster-suggestions.jsonl.

A roster change during a campaign is a confound. If the feedback bridge auto-promoted a topic mid-week and the next week’s growth spiked, you can’t tell whether the new topic worked or whether it was random. Human-in-the-loop preserves the experiment.

For longer-running operations (post-30d), an operator can apply suggestions weekly and treat the roster as a living document — just not during the validation window itself.

cohort: validation-cohort-1
posts_log_path: ~/.fabric/posts.tsv
snapshots_path: ~/.fabric/post-engagement-snapshots.jsonl
roster_path: examples/character-rosters/validation-cohort-1.yaml
suggestions_path: ~/.fabric/roster-suggestions.jsonl
window_days: 14
baseline_threshold: 5000
FieldRequiredDescription
cohortno (default default)Cohort label to evaluate.
posts_log_pathnoTSV posts log. Empty = ~/.fabric/posts.tsv. Same shape as viral-gate.
snapshots_pathnoJSONL snapshot history written by research/viral-gate-status.
roster_pathnoOptional roster YAML. When set, untouched topics from topics_pool appear in the rank with max_views=null.
suggestions_pathnoJSONL output. Empty = ~/.fabric/roster-suggestions.jsonl.
window_daysno (default 14)Mirrors viral-gate’s evaluation window.
baseline_thresholdno (default 5000)Per-run views bar for “win”. 5k is plan 073’s failure-cluster floor.

Most natural pairing — run viral-gate first to refresh snapshots, then the feedback bridge:

Terminal window
fab-workflow research/viral-gate-status \
--input posts_log_path=~/.fabric/posts.tsv
fab-workflow social/feedback-bridge \
--input cohort=validation-cohort-1 \
--input roster_path=examples/character-rosters/validation-cohort-1.yaml

The workflow output mirrors what’s appended to the JSONL log:

{
"cohort": "validation-cohort-1",
"posts_log_path": "/Users/me/.fabric/posts.tsv",
"snapshots_path": "/Users/me/.fabric/post-engagement-snapshots.jsonl",
"suggestions_path": "/Users/me/.fabric/roster-suggestions.jsonl",
"suggested_at": "2026-05-06T12:34:00+00:00",
"posts_evaluated": 21,
"posts_with_metrics": 19,
"topic_rank": [
{
"topic": "The exact prompt I use to draft cold emails…",
"max_views": 67000,
"posts_evaluated": 2,
"formula_used_most": "youre_doing_it_wrong",
"rank": 1
},
{
"topic": "Stop optimizing your morning routine…",
"max_views": 1200,
"posts_evaluated": 1,
"formula_used_most": "reframe",
"rank": 8
},
{
"topic": "(untouched pool topic)",
"max_views": null,
"posts_evaluated": 0,
"formula_used_most": "",
"rank": 22
}
],
"formula_weights": [
{
"formula": "youre_doing_it_wrong",
"posts_evaluated": 8,
"posts_winning": 5,
"win_rate": 0.625,
"delta": 1
},
{
"formula": "validation",
"posts_evaluated": 5,
"posts_winning": 1,
"win_rate": 0.20,
"delta": -1
}
],
"rationale": "Top topic 'The exact prompt I use…' hit 67,000 views (55.8× the bottom-ranked topic with data). Formulas above cohort win-rate avg (vs 5,000 views): youre_doing_it_wrong (62%). Below avg: validation (20%)."
}

delta:

  • +1 — formula’s win rate is ≥10pp above the cohort average. Promote.
  • -1 — formula’s win rate is ≥10pp below. Demote or remove from allowed_formulas.
  • 0 — at average. Leave alone.
  1. Open the roster YAML at roster_path.
  2. Reorder topics_pool to put high-rank topics first. Drop topics that consistently rank in the bottom quartile across multiple weekly suggestions (one bad week is noise).
  3. Adjust allowed_formulas ordering — promote delta=+1 formulas to the front so slot_offset rotation hits them more often.
  4. Commit the roster change with a note explaining which week’s suggestion drove it. This makes the campaign auditable.

The committed example roster examples/character-rosters/validation-cohort-1.yaml is your starting point.

This workflow closes the loop in the 30-day validation playbook. Run it weekly (every Monday) alongside research/viral-gate-status and social/account-growth. Apply suggestions only at Day 14 and Day 21 checkpoints — frequent reroll dilutes the signal.