Repository navigation
v0.2.4 — the morning check as a schedule, and a scheduled run that only reads
Each AdCopilot flow now ends by offering to turn the morning check into a schedule. A new skill, adcopilot-daily, runs that check with nobody there and only reads.
The offer. /setup, /launch, /measure, /audit, /daily, /weekly and /negatives all close with the same short offer, worded for where you are:
- in claude.ai, Cowork or the desktop app, a Claude scheduled task;
- in Claude Code, a routine via
/schedule.
The offer is not a question, and it comes at most once a conversation. It never appears in an unattended run, and it waits for a campaign that is switched on. It stops once AdCopilot reports a schedule: routine.daily.status user_set, or a date in routine.scheduled_last_seen_at. These are the two fields that stop AdCopilot's own offer. AdCopilot's emailed check-in does not count as a schedule.
adcopilot-daily.
- The run calls
get_org_contextwithsource: "claude-scheduled", which AdCopilot records from v2.30.2. It reads pacing, search terms, disapprovals and recent changes, and never asks anything along the way. It opens with "All clear" or "Needs a look" and ends with one yes/no fix. It skips manager accounts, whose figures Google refuses. - The set-up hands over AdCopilot's own morning-check recipe (
SCHEDULED_CHECKIN) word for word, with the steps for each surface. It says plainly what keeps a scheduled run to reads: the instructions. On Automatically approve, or in a Claude Code routine, every tool runs without asking. The one enforced stop is setting Write/delete tools to Blocked, and then no chat can change the account either.
Commands. /daily now reads budget pacing, the last 7 days of search terms, disapprovals and change history. /weekly and /negatives are new. /negatives proposes keywords, adds them only after a yes, then reads them back.
README. "Change anything in a scheduled run" is no longer listed under "What it will not do". Nothing on AdCopilot's side enforces it, so the schedule section says what does and does not.
RELEASE GATE, as run:
- AdCopilot v2.30.2. The recipe copy is identical to
schedule_recipe.pyon its main branch. - Claude Code 2.1.289, judge
sonnet,--no-publish. claude plugin validate . --strictpasses.tests/test_structure.pypasses all 49 tests in CI, and gitleaks finds nothing.- Habit cases:
- Every case passed the 0.8 threshold on both runs.
- habit-offer-chat scored 1.00, then 0.96; habit-recorded-stays-quiet scored 1.00.
- habit-offer-code and habit-offer-untold scored 0.83 and 0.86 both times. Each failed one run in two on the offer rubric, and in every failed run the closing offer is word for word the sentence the passing runs end on.
- Re-judged outside the harness, both of those replies pass.
daily-scheduled-runscored 1.00 on 3 runs. Tools-only ablation: 1.00 vs 0.65, delta +0.35 foradcopilot-daily.- launch-manual-settings, setup-duplicate-server and unrelated-request-stays-quiet scored 1.00 on one run each. audit-stale-tools scored 0.71, as under 0.2.3; the offer is correctly absent there.