Load: ../run-paid-campaigns/references/meta-levers.md, ../run-paid-campaigns/references/proposal-and-log.md (exact grammar). Steps by each move's lever (the playbook's Before you start 3): GooseWorks levers — 1–8; connector levers — 1, 2, 4, then 9–11; written instructions — 1, 2, 4 (no tool call), then 7 on the marketer's "done". Local mode has only the last two and calls no gooseworks: tool; its files live under gooseworks-local/<brand-slug>/ (host file tools).
Stage (step 7)
- Re-read
ads/campaigns/<slug>/state.md. If it doesn't exist, create it with the frontmatter (campaign,stage,goose_campaign_id,meta_push_ids: [],meta_campaign_id,updated_at,updated_by; local mode: no ids), the header lines,## Open recommendationsand## Meta objects. - Write each open move as one line
- R<n> (YYYY-MM-DD): <move> — evidence <…> — awaitingunder## Open recommendations(next free number; never reuse one), and its follow-up as- R<n> check YYYY-MM-DD: <rule> · trip-wire <…>under## Checks due(the server deletes bullets on close; checks must survive). - GooseWorks levers only. For each Meta budget change, swap or launch without an id yet:
gooseworks:propose_meta_budget_change/gooseworks:propose_meta_creative_replacement(withreason,evidenceasreport:<YYYY-MM-DD>oruser request,recommendation_ref), orgooseworks:prepare_meta_ad_push(withgoose_campaign_id) then push status until it awaits approval. Put each returned change id in its bullet; add each push id tometa_push_idsimmediately — the server finds this folder only through that list orgoose_campaign_id. Never re-propose an item that already has an id. - Write the proposal in
proposal-and-log.md's one template (numbered moves, no ids) with the real approval links, the pause sentence and the cards; deliver it by its § Delivery, scheduled or not. Stop.
Apply (step 8)
-
Pauses:
gooseworks:pause_meta_ad_pushonly on the marketer's own words in this turn naming the ads (user_instruction), withpush_idandmeta_ad_idsfrom## Meta objects, andrecommendation_ref. A bare "yes" → ask for the sentence. Report each ad's state after; anything not confirmed is named. -
Links: read change or push status → approved / declined / waiting. Budget changes, swaps and pauses made with
recommendation_ref: the server writes thedecisions.mdblock and removes the bullet — never duplicate it. Launches / graduations (norecommendation_refonprepare_meta_ad_push): when push status shows approved or declined, remove the bullet yourself and append a block withEvidence: push:<id>if none exists. Never say "done" early. A refused budget change (budget moved in Ads Manager): relay, re-read, never retry blind. -
Instructions (cards), holds the marketer chose, declines given in chat, and check results (with the verdict word — worked / didn't work / too early / can't tell — in the Outcome line): re-read
decisions.mdimmediately before writing, append a### YYYY-MM-DD — <title>block (Recommended / Evidence / Decided / Outcome, one line each, date never earlier than the newest block), then delete that recommendation's bullet fromstate.md(writeNone.if the section empties). -
Save the run record (
../run-paid-campaigns/references/run-memory.md), each change id and push id copied into its money-move row.
Apply through a connector (any ads platform)
The rule is ../run-paid-campaigns/references/meta-levers.md § With an ads-platform connector; follow it exactly. Here only the bookkeeping:
9. Staged by steps 1, 2 and 4: each change is an open R<n> bullet and its card. No connector call yet.
10. Apply each one only on its named yes, by that rule.
11. Log after the read-back: re-read decisions.md, append a ### YYYY-MM-DD — <title> block (Recommended and Evidence as usual; Decided: the marketer's words; Outcome: applied , read back — the applied time the outcome check uses, or the failure) and delete the bullet from state.md. In local mode nothing else writes these files, so every block is yours.
Never: approve on the marketer's behalf; pause on your own judgement or a schedule; revert for a kill; break the connector rule; keep a ledger anywhere but these two files (the run record links them and adds only recipes, results and the scorecard).