Reads: the replies the marketer pasted or uploaded; research/audience/ledger.csv; the pack the replies answer (outreach/<D>-<slug>/pack.md); ../write-outreach/references/replies-and-objections.md.
Does:
- For each reply: the category (
interested · send-info · question · timing · using-rival · price · wrong-person · not-interested · how-did-you-get-this · no-show · stop · angry · out-of-office · bounce), which touch it answered, and the person's exact words that matter (an objection, a pain phrase, a named rival, a date). - Match to the ledger row by email, then profile URL, then name + root domain (outcomes-ledger's keys). Unmatched replies are shown back, never guessed onto a row — a
stop,angryorbouncefrom an unknown address gets a suppression-only row holding just itskey_hash, the reason and the date (outcomes-ledger § Suppression without personal data); keeping the raw address needs the marketer's yes. The matched rows'sequence_idtells which pack the replies belong to. - The status it gives (replies-and-objections.md table):
replied,meeting,not-a-fit,unsubscribed,do-not-contact,bounced— andrecontact_afterfortiming.stop,angryandbounceare permanent suppressions. - One reply → hand back for the draft answer. A batch → counts by category, by touch and by segment for reading-results.md.
- Pain phrases worth keeping → a request line in this pack's
results-working.md(Quote needed: for research-audience · <phrase, segment, date> · return to: outreach/<D>-<slug>/results-working.md), with no name or email. Unnamed referrals →Find needed:lines there too.
Writes: the ledger through the outcomes-ledger skill (../outcomes-ledger/SKILL.md) (entity: person, statuses only from the replies the marketer gave — never inferred), and the category counts.
Rules: never mark anyone contacted or replied on inference; never draft a pitch to a stop or angry reply; no names, emails or reply text in the brand brain — counts and anonymised phrases only.