Skip to content

0.2.14: a scheduled morning check no longer stops at its first call (with #22, #24, #25, #26, #28) - #30

Merged
SaiSatya16 merged 8 commits into
mainfrom
release/0.2.14
Oct 23, 2026
Merged

SaiSatya16 merged 8 commits into
mainfrom
release/0.2.14

Conversation

@SaiSatya16

@SaiSatya16 SaiSatya16 commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

What this is

Plugin 0.2.14. Its main change: a morning check scheduled from the plugin no longer stops at its first call. Base main at f4f3efb (0.2.13, tag v0.2.13). Written against AdCopilot v2.44.0 (deployed 2026-10-22), which already has every server half. Text only: the manifest changes only its version. The tools_revision is unchanged and AdCopilot has no server change for this.

Why it ranks first. Since AdCopilot v2.42.3, Claude lists get_org_context ("AdCopilot: what is connected and where you are") under Write/delete tools. The plugin's set-up put only the read-only tools on Always allow, so every scheduled run waited at its first call for an approval nobody was there to give. A production read on 2026-10-21 found 23 scheduling workspaces whose last run fell between 10-16 and the v2.42.3 deploy, and 19 of them had not been seen since. Daily scheduled tasks are the plugin's steadiest source of real tool calls.

What is in it

Eight commits, each authored as Atromx Intelligence (the eighth is the review round below):

  1. 0.2.13: a scheduled run sends claude-scheduled from every skill; the daily run still keeps no note #22, rebased onto 0.2.13 (fix/scheduled-marker @ f623fad; it was stacked on the stale 0.2.12 branch, so it is brought in as its net diff):
    • Every file that sends source: "claude-plugin/0.2.14" now also says, in one shared sentence, that a scheduled run sends source: "claude-scheduled" instead, never claude-plugin. That is 13 files besides adcopilot-daily.
    • New case review-scheduled-unmarked.
  2. The daily set-up lets the run's two AdCopilot tools through:
    • skills/adcopilot-daily/SKILL.md, Claude set-up step 1, now says what AdCopilot's schedule_recipe.ALWAYS_ALLOW_STEP says (checked against origin/release/v2.44.1):
      • open Customize, then Connectors, then AdCopilot, then Tool permissions;
      • set Read-only tools to Always allow;
      • under Write/delete tools, set "AdCopilot: what is connected and where you are" and "AdCopilot: save business notes and progress" to Always allow too (they keep AdCopilot's own notes and never change Google Ads);
      • every other Write/delete tool stays on Needs approval.
    • The Team/Enterprise "Blocked" advice now leaves those two tools out.
    • The recipe handed over is v2.44.0's SCHEDULED_CHECKIN word for word. Its first call is CHECKIN_FIRST_CALL: Call get_org_context first, with source "claude-scheduled" and task "AdCopilot morning check".
    • The run's step 1 sends that task whenever the instructions open with "AdCopilot morning check", even when an older saved recipe's first call does not name it; any other scheduled task sends the task its own instructions give, or none (review round).
    • daily-scheduled-run gains a names-the-morning-check grader.
  3. docs(plugin): AdCopilot v2.44's audit count: 70 checks, each listed, and the score from the checks that apply #25, squashed: v2.44's audit count. The skills now say seventy checks, each listed, with the score taken from the checks that apply.
  4. test(plugin): every count of the audit's checks is AdCopilot's 70 (stacked on #25) #28, squashed (stacked on docs(plugin): AdCopilot v2.44's audit count: 70 checks, each listed, and the score from the checks that apply #25): tests/test_check_count.py.
  5. 0.2.14: adcopilot-fix-checks, one yes/no a reply, the habit offer after a checked fix, one related read #24, squashed: the new adcopilot-fix-checks skill, one yes/no per reply, the habit offer only after a checked fix, and at most one related read. Its server half (adcopilot#942) is live in v2.44.0.
  6. 0.2.13: an audit finding's ready call is proposed as it stands, and a draft asks for what only the customer can give #26, brought in as its net diff from 0.2.14: adcopilot-fix-checks, one yes/no a reply, the habit offer after a checked fix, one related read #24's base: an audit finding's ready call is proposed as it stands, and for a draft the skill asks for the customer's needs instead of filling them in. Its server half (A2 recommended_actions) is live in v2.44.0.
  7. The README's 0.2.14 note, which covers every change above in one paragraph. The Evals section now counts thirty cases.

68 files changed (4,102 insertions, 270 deletions) against main.

Every copy of the permissions step. A grep for Needs approval / Always allow / Tool permissions finds the step in one model-read file, skills/adcopilot-daily/SKILL.md, and in the README (the "Every morning" section and the 0.2.14 note).

  • commands/daily.md, the connect skill and the launch skill hand over to that set-up and carry no copy.
  • AlwaysAllowStep.test_every_copy_names_both_tools fails if any paragraph in a model-read file or the README gives the step without both titles and Needs approval.
  • test_the_old_step_is_gone_everywhere fails if the old wording comes back.
  • The get_org_context mocks of habit-offer-chat and habit-offer-untold still quote v2.41.0's server step. They are frozen renders of that release's answer, held by the v2.41.0-fixture tests, and are not hand-edited.

Review round (2026-10-23)

Nine findings; none blocking, none on money, auth or tenant isolation. Plugin-side:

  • The daily run's task could mark a customer's own schedule as the morning check (skills/adcopilot-daily/SKILL.md, the run's step 1). It sent task "AdCopilot morning check" "even when the instructions do not name it", and the run covers any scheduled task, so a customer's own task landing in this skill was counted by is_morning_check_task. Now the task goes only when the instructions open with "AdCopilot morning check" (the older saved recipe included: daily-scheduled-run's prompt is that recipe); any other scheduled task sends the task its own instructions give, or none. Held by test_the_run_names_the_morning_check_task.
  • The README said nothing on AdCopilot's side stops a change in a scheduled run. Since D186 (scheduled_guard.py) the server refuses every write tool on the connection for the run (up to 20 minutes) once its first call carries claude-scheduled, AdCopilot's own notes aside. The morning section now says so, with what it does not see (a run that skips that first call or sends another source) and the Blocked advice kept. Held by test_the_schedule_section_says_what_keeps_a_run_to_reads.
  • The release notes would go false once the evals ran. The 0.2.14 note and the Evals section now state run states as of when the text was written, so the paragraph the release publishes stays true whatever runs before the tag. The release script still requires "must be run before this version is tagged".
  • The 0.2.13 note had been rewritten to claude-plugin/0.2.14 by 0.2.14: adcopilot-fix-checks, one yes/no a reply, the habit offer after a checked fix, one related read #24's bump. Back to 0.2.13; test_each_release_note_names_its_own_marker holds every release note to its own version.
  • The squash commit on public main would carry the merging account's personal address, as f4f3efb, 8a9ab2d and the 0.2.11 and 0.2.10 squashes do. support@atromx.com belongs to the atromx-intelligence account, not the merging one, so --author-email with it cannot work; the release script now passes the merging account's GitHub noreply address, checks that gh is signed in as that account, warns if the merge commit's author differs, and has --default-author as the fallback.

The other four findings are in AdCopilot's one-off notice to people who already schedule the check, which lives outside this repository: its approval line now keeps its condition, it names both places to find the setting, a failed send no longer stops the send run, and a workspace whose morning check was seen on one day only since 2026-10-16 is now included.

Kept on purpose: the daily run still calls no save_org_context

Every schedule set up before 0.2.14 keeps that tool on Needs approval, so a run that kept a note would stop at a prompt nobody can answer. The ban lifts only after two things: AdCopilot's one-off notice to people who already schedule the check (notice_2026_10_schedule_allow, naming both tools) has been sent, and its effect has been measured. That is a later version.

Not in this release

Checks run (on release/0.2.14 at its head, 4e5540e)

  • claude plugin validate . --strict: passed (Claude Code 2.1.309).
  • claude plugin validate .claude-plugin/plugin.json --strict: passed.
  • python3 -m unittest discover -s tests: 252 tests OK (251 before the review round, plus test_each_release_note_names_its_own_marker). This includes:
    • AlwaysAllowStep, which checks that every copy names both titles;
    • ScheduledSourceMarker;
    • FindingActions;
    • FixChecks;
    • CheckCount;
    • the eval-case structure tests, which cover graders, mocks and fixtures offline.
  • checks.yml's other steps, run locally:
    • the manifests parse;
    • every skill and command has a name and a description;
    • no download-and-execute pattern is present;
    • the manifest (0.2.14) is ahead of the latest tag (v0.2.13).
  • Not run:
    • the eval suite and the tools-only ablation (paid; the founder runs them, see below);
    • the README checklist's real-account steps 1 to 6.

Live evals (founder step, paid)

On the fixtures, never against production. The cost is about $1 a case, so roughly $30 to $35 for 30 cases x 3 runs, and about as much again for the tools-only arm. There is a $40 ceiling on each. Run it at most three times. It refuses unless production reads the version given:

bash ~/Documents/atromx/_tools/plugin-0212-evals/run.sh --live --ref 4e5540e7603c05f39aab38d02c010bb2031c11b3 --expect v2.44.1
  • Pass --expect with the version that is live when you run it.
  • Add --skip-ablation to run the suite alone (about $30 to $35).
  • Without --live it is a dry run that writes only its plan.

Release (founder step)

The release script refuses a moved head, a moved main, a commit not authored as Atromx Intelligence or carrying a Co-authored-by trailer, an existing v0.2.14, or a folded PR merged on its own. It then marks this draft ready and squash-merges it with --match-head-commit, the squash commit authored with the merging account's GitHub noreply address rather than its personal one (--default-author is the fallback if GitHub refuses that address). It then leaves the comment "Released in 0.2.14 (#30)" on #22, #24, #25, #26 and #28 and shuts each one, makes an annotated tag v0.2.14 as Atromx Intelligence support@atromx.com, and creates the GitHub release from the README's 0.2.14 paragraph. Its --check writes nothing and passes on this head (4e5540e): bash ~/Documents/atromx/_tools/plugin-release-0214.sh --check, then the release itself is bash ~/Documents/atromx/_tools/plugin-release-0214.sh, after the evals.

Not merged. Draft until the evals have run.

🤖 Generated with Claude Code

…very skill; the daily run still keeps no note

PR #22 (fix/scheduled-marker @ f623fad, stacked on the stale 0.2.12 branch)
brought onto main (0.2.13, f4f3efb) as its net diff from its base b376f9d,
applied three-way:

- connect, launch and measure: #22's hunks (the shared scheduled-run
  sentence; connect's steps 2 and 3 and launch's step 1 refer back to the
  source given at the top).
- README: main's released 0.2.13 and 0.2.12 notes kept; #22's own 0.2.13
  note is rewritten as the 0.2.14 note later in this branch.
- tests/test_structure.py: main's NoCompiledCaches and #22's
  ScheduledSourceMarker both kept.
- evals/ablation/tools-only.sh: both comments joined.
- .gitignore: both rules kept (*.pyc and *.py[cod]).
- review-scheduled-unmarked's marker grader gains weight 5, so it is
  daily-scheduled-run's line for line again (0.2.12 weighed that one 5).
…the recipe names the morning check

Since AdCopilot v2.42.3, Claude lists get_org_context ("AdCopilot: what is
connected and where you are") under Write/delete tools, and the plugin's
set-up put only the read-only tools on Always allow, so a scheduled run
stopped at its first call with nobody to answer.

- adcopilot-daily, set-up step 1 (Claude app): what AdCopilot's
  schedule_recipe.ALWAYS_ALLOW_STEP says at v2.44.0 (live): Customize,
  Connectors, AdCopilot, Tool permissions; Read-only tools on Always allow;
  under Write/delete tools "AdCopilot: what is connected and where you are"
  and "AdCopilot: save business notes and progress" on Always allow too
  (they keep AdCopilot's own notes and never change Google Ads); every other
  Write/delete tool on Needs approval. The Team/Enterprise "Blocked" advice
  now leaves those two out, since blocking them would stop every run.
- The recipe it hands over is v2.44.0's SCHEDULED_CHECKIN word for word,
  whose first call is CHECKIN_FIRST_CALL ('... with source
  "claude-scheduled" and task "AdCopilot morning check".'); the run's step 1
  sends that task even when an older saved recipe does not name it.
- The run keeps its ban on save_org_context: schedules set up before this
  version still ask before it. Its reason now says so.
- README: a paragraph under "Every morning" with the same setting and both
  titles; the "Blocked" sentence and release step 6 follow.
- daily-scheduled-run: names-the-morning-check (weight 2) fails a
  get_org_context call without the task; the prompt stays an older recipe
  that names none. Floor arithmetic updated (18/23 without the marker).
- tests: AlwaysAllowStep (every copy of the step, in the files the model
  reads and the README, names both titles and Needs approval; the old step
  is gone; the run names the task), the set-up test rewritten, and the
  frozen v2.41.0 fixtures checked against the v2.41.0 recipe.

The grep for "Needs approval" / "Always allow" found the step in one model-
read file only (skills/adcopilot-daily/SKILL.md); commands/daily.md and the
connect and launch skills hand over to that set-up and carry no copy.
…and the score from the checks that apply

PR #25 (audit/honest-count-score @ b94c185, base main) squashed in, with two
differences:

- Its edits to the tool snapshots (evals/mocks/adcopilot/_tools.json and the
  six per-case _tools.json) are left out. Those files are frozen copies of
  the server's served text at the revision each one stamps (0066a60e), and
  plugin issue #5 holds that they are refreshed whole, by a generator, never
  edited by hand; a 74 changed to 70 under a 0066a60e stamp would be a
  snapshot of no server. The fictional fixture-2 text in audit-stale-tools'
  mock and replays is not a snapshot and takes #25's change.
- review-scheduled-unmarked (#22) carries review-follows-related-reads'
  mocks byte for byte, so its full_audit.md takes #25's change too.
PR #28 (audit/checks-info @ db103b5, stacked on #25) squashed in:
tests/test_check_count.py. Its scan leaves out the stamped eval tool
snapshots (*/mocks/adcopilot/_tools.json), which keep the count they were
taken with until plugin issue #5's whole refresh from the server (0.2.15);
test_only_stamped_snapshots_are_skipped holds that only a file whose
descriptions carry a "Tools revision:" stamp is left out. #25's edits to
those snapshots stay out, as in the commit before.
…er after a checked fix, one related read

PR #24 (feat/0.2.13-fix-checks @ 307fc77, base main) squashed in. Its server
half (AtromxIntelligence/adcopilot#942, "run at most one related read") is
live in AdCopilot v2.44.0.

Merged with #22's change:
- connect, launch and measure keep #22's wording (the scheduled-run sentence;
  later calls refer back to the source given at the top), now at 0.2.14.
- adcopilot-fix-checks, a new marked file, carries #22's scheduled-run
  sentence after its keep sentence, like every other marked file.
- tests: 14 marker sites (13 after #22, plus fix-checks); 13 files besides
  adcopilot-daily carry the scheduled-run sentence; #22's comments now say
  0.2.14, the version it ships in.
… and a draft asks for what only the customer can give

PR #26 (feat/finding-actions-drafts @ 8ef6ca4, stacked on #24's 874eee4)
brought in as its net diff from that base, applied three-way. Its server
half (AdCopilot v2.44 audit lane A2, recommended_actions kind "tool" and
"skeleton") is live in AdCopilot v2.44.0.

- skills/adcopilot-fix-checks and skills/adcopilot-review: #26's text as
  written (a ready call proposed as it stands, with the condition its why
  gives; a draft's needs asked for, never filled in; the review skill's
  PHRASE rule for its own negatives only).
- tests/test_structure.py: FixChecks gains #26's test; #26's
  FindingActions class sits after AlwaysAllowStep (the conflict was only
  where both branches appended a class at the end of the file).
…n the order it matters

One note for the version, as the release checklist reads it: written
against AdCopilot v2.44.0 (deployed 2026-10-22), none of its steps run.

- First the reason the version goes out first: the daily set-up lets
  "AdCopilot: what is connected and where you are" and "AdCopilot: save
  business notes and progress" through (every other Write/delete tool
  still on Needs approval), and the recipe's first call names the
  morning check's task.
- Second #22's scheduled marker from every file that sends the plugin's.
- What does not change: the daily run still calls no save_org_context;
  the ban lifts only once the people who already schedule the check have
  been told to set the two tools to Always allow and that notice has been
  measured (AdCopilot notice_2026_10_schedule_allow).
- Third to eighth #24's six changes, as #24 wrote them; ninth #25/#28's
  seventy checks; tenth #26's ready calls and drafts.
- Release order: every server half is live in v2.44.0.

The Evals section counts thirty cases (#22's review-scheduled-unmarked
and #24's fix-checks-three-checks both new), and names both as written
and never run.
…; the server's scheduled-run hold; release notes that stay true

- adcopilot-daily, the run's step 1: the task "AdCopilot morning check" goes
  whenever the instructions open with those words, even when an older saved
  recipe's first call does not name it; any other scheduled task sends the
  task its own instructions give, or none. A customer's own scheduled task
  that landed in this skill sent the morning check's task, and AdCopilot
  (is_morning_check_task) counted it as the morning check.
- README, the morning section: since D186 AdCopilot refuses every write tool
  on a connection in a scheduled run that opened with the claude-scheduled
  first call (AdCopilot's own notes aside). "Nothing on AdCopilot's side
  stops a change" was no longer true.
- README, the 0.2.14 note and the Evals section: run states are said as of
  when the text was written, so the note the release publishes stays true
  after the founder's eval run.
- README, the 0.2.13 note: its marker is claude-plugin/0.2.13 again (#24's
  bump had rewritten it).
- tests: each of the three is held, and a release note's marker must be its
  own version.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants