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.
Why HITL?
Section titled “Why HITL?”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-1posts_log_path: ~/.fabric/posts.tsvsnapshots_path: ~/.fabric/post-engagement-snapshots.jsonlroster_path: examples/character-rosters/validation-cohort-1.yamlsuggestions_path: ~/.fabric/roster-suggestions.jsonlwindow_days: 14baseline_threshold: 5000| Field | Required | Description |
|---|---|---|
cohort | no (default default) | Cohort label to evaluate. |
posts_log_path | no | TSV posts log. Empty = ~/.fabric/posts.tsv. Same shape as viral-gate. |
snapshots_path | no | JSONL snapshot history written by research/viral-gate-status. |
roster_path | no | Optional roster YAML. When set, untouched topics from topics_pool appear in the rank with max_views=null. |
suggestions_path | no | JSONL output. Empty = ~/.fabric/roster-suggestions.jsonl. |
window_days | no (default 14) | Mirrors viral-gate’s evaluation window. |
baseline_threshold | no (default 5000) | Per-run views bar for “win”. 5k is plan 073’s failure-cluster floor. |
Running it
Section titled “Running it”Most natural pairing — run viral-gate first to refresh snapshots, then the feedback bridge:
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.yamlOutput shape
Section titled “Output shape”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 fromallowed_formulas.0— at average. Leave alone.
How to apply a suggestion
Section titled “How to apply a suggestion”- Open the roster YAML at
roster_path. - Reorder
topics_poolto put high-rank topics first. Drop topics that consistently rank in the bottom quartile across multiple weekly suggestions (one bad week is noise). - Adjust
allowed_formulasordering — promotedelta=+1formulas to the front soslot_offsetrotation hits them more often. - 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.
Validation campaign integration
Section titled “Validation campaign integration”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.