Parent epic: #64
Goal
Port simplicio-learn's retrospective pattern to campaigns: after each campaign window (or piece batch), mine high-signal lessons from journals, gate results, and analytics, dedupe them against existing memory, and write them where the next run actually reads them — so lessons are applied, not re-derived.
Sources
Destinations (durable, lean)
Rules
- Durable, reusable bullets only — no transcripts, no one-off anecdotes.
- Every lesson carries evidence refs (journal/analytics paths) and a confidence tag;
UNVERIFIED lessons never override MEASURED ones (claims discipline from lib/gate/claims-gate.ts).
- Dedupe before write: an equivalent existing lesson gets its evidence count bumped, not duplicated.
Acceptance criteria
- E2E test: a mocked campaign run produces ≥1 lesson with evidence refs; running the retrospective twice does not duplicate it.
- Brief/piece generation demonstrably consumes learnings (e.g. a "losing hook pattern" lesson excludes that pattern in the next batch — asserted in test).
- Memory stays lean: retrospective enforces a max size per learnings file, compacting lowest-confidence entries first.
Parent epic: #64
Goal
Port
simplicio-learn's retrospective pattern to campaigns: after each campaign window (or piece batch), mine high-signal lessons from journals, gate results, and analytics, dedupe them against existing memory, and write them where the next run actually reads them — so lessons are applied, not re-derived.Sources
lib/promotion/classifier.ts).Destinations (durable, lean)
.marketing-engine/clients/<slug>/learnings.md— client-specific bullets (voice, claims that passed/failed compliance, best hooks per channel).data/learnings.jsonl— structured entries feeding brief generation and the strategy ladder ordering in Journal: durable run-journal + stall detector so the loop switches strategy instead of oscillating #66.Rules
UNVERIFIEDlessons never overrideMEASUREDones (claims discipline fromlib/gate/claims-gate.ts).Acceptance criteria