Repository navigation
0.2.14: a scheduled morning check no longer stops at its first call (with #22, #24, #25, #26, #28) - #30
Merged
Conversation
…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.
SaiSatya16
marked this pull request as ready for review
October 23, 2026 01:48
This was referenced Oct 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
mainatf4f3efb(0.2.13, tagv0.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. Thetools_revisionis 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):
fix/scheduled-marker@f623fad; it was stacked on the stale 0.2.12 branch, so it is brought in as its net diff):source: "claude-plugin/0.2.14"now also says, in one shared sentence, that a scheduled run sendssource: "claude-scheduled"instead, neverclaude-plugin. That is 13 files besidesadcopilot-daily.review-scheduled-unmarked.skills/adcopilot-daily/SKILL.md, Claude set-up step 1, now says what AdCopilot'sschedule_recipe.ALWAYS_ALLOW_STEPsays (checked againstorigin/release/v2.44.1):SCHEDULED_CHECKINword for word. Its first call isCHECKIN_FIRST_CALL:Call get_org_context first, with source "claude-scheduled" and task "AdCopilot morning check".daily-scheduled-rungains anames-the-morning-checkgrader.tests/test_check_count.py.adcopilot-fix-checksskill, 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.needsinstead of filling them in. Its server half (A2recommended_actions) is live in v2.44.0.68 files changed (4,102 insertions, 270 deletions) against
main.Every copy of the permissions step. A grep for
Needs approval/Always allow/Tool permissionsfinds 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_toolsfails if any paragraph in a model-read file or the README gives the step without both titles andNeeds approval.test_the_old_step_is_gone_everywherefails if the old wording comes back.get_org_contextmocks ofhabit-offer-chatandhabit-offer-untoldstill 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:
skills/adcopilot-daily/SKILL.md, the run's step 1). It senttask "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 byis_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 bytest_the_run_names_the_morning_check_task.scheduled_guard.py) the server refuses every write tool on the connection for the run (up to 20 minutes) once its first call carriesclaude-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 bytest_the_schedule_section_says_what_keeps_a_run_to_reads.claude-plugin/0.2.14by 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 to0.2.13;test_each_release_note_names_its_own_markerholds every release note to its own version.f4f3efb,8a9ab2dand the 0.2.11 and 0.2.10 squashes do.support@atromx.combelongs to theatromx-intelligenceaccount, not the merging one, so--author-emailwith it cannot work; the release script now passes the merging account's GitHub noreply address, checks thatghis signed in as that account, warns if the merge commit's author differs, and has--default-authoras 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_contextEvery 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
_tools.jsonfiles stay at the revision they were taken at, because this repository has no generator for them. Refreshing them means a wholetools/listread from the live server, never a hand edit, and that moves to 0.2.15.tests/test_check_count.pyskips only the stamped snapshots.Checks run (on
release/0.2.14at 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, plustest_each_release_note_names_its_own_marker). This includes:AlwaysAllowStep, which checks that every copy names both titles;ScheduledSourceMarker;FindingActions;FixChecks;CheckCount;checks.yml's other steps, run locally: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:
--expectwith the version that is live when you run it.--skip-ablationto run the suite alone (about $30 to $35).--liveit 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 existingv0.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-authoris 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 tagv0.2.14as Atromx Intelligence support@atromx.com, and creates the GitHub release from the README's 0.2.14 paragraph. Its--checkwrites nothing and passes on this head (4e5540e):bash ~/Documents/atromx/_tools/plugin-release-0214.sh --check, then the release itself isbash ~/Documents/atromx/_tools/plugin-release-0214.sh, after the evals.Not merged. Draft until the evals have run.
🤖 Generated with Claude Code