Skip to content

chore: repin the kit's caller stubs to v1.10.0 + land the bonsai-status-sync stub - #26

Merged
mcarter-astronautdev merged 5 commits into
mainfrom
chore/repin-v1.10.0
Aug 2, 2026
Merged

chore: repin the kit's caller stubs to v1.10.0 + land the bonsai-status-sync stub#26
mcarter-astronautdev merged 5 commits into
mainfrom
chore/repin-v1.10.0

Conversation

@mcarter-astronautdev

Copy link
Copy Markdown
Member

Step 2 of the README release order for v1.10.0 (b394c6d). Tag is already cut and pushed.

What this does

Lands the bonsai-status-sync caller stub. templates/github/bonsai-status-sync.yml goes from the 190-line per-repo copy to the 66-line stub, pinned to b394c6d… # v1.10.0. This is the half that #21 deliberately deferred — a new reusable's stub can't be pinned until the tag containing it exists. The stub is verbatim the one specified in docs/reusable-conversion-scope.md; the only substitution was the placeholder pin.

Repins the other five stubs — note they jump v1.8.0v1.10.0. v1.9.0 never got its kit repin commit. The templates sat at 80c35fe through that release while the deployed fleet was waved to a54c91e, so the fleet has been a release ahead of the kit templates since 2026-08-01. This closes it. I found this while checking preconditions, not from the docs — worth knowing the audit didn't catch it.

Three doc edits that were correct before this commit and would be wrong after it:

  • templates/github/README.mdbonsai-status-sync.yml moved from Full workflows to Caller stubs (five → six), and onboarding step 5 rewritten: the board strings now live only in the central reusable, so a board rename is a kit release + fleet repin, not a local edit. Editing them in one repo would silently do nothing.
  • README.md — latest tag, the pin-sequence note above, stub no longer "pending", kit paragraph reads six stubs + claude.yml, and the wave-diff basename trap scoped to the v1.10.0 wave.
  • .github/workflows/lint.yml — "six reusables" verified still correct (6 workflow_call-only files). No change.

Verification

  • actionlint clean across .github/workflows/ and templates/github/
  • lint.yml's placeholder-pin guard passes — no @000…000 left
  • Stub parses; triggers issues / pull_request / pull_request_review, all three permissions: present, BONSAI_BEARER_TOKEN enumerated explicitly rather than secrets: inherit

Not in this PR

The fleet is not waved. Consumer repos still run the 190-line copy until the v1.10.0 wave — 18 repo@branch pairs across 11 repos. When that runs, step 3's trap applies: the diff carries templates/github/bonsai-status-sync.yml and .github/workflows/bonsai-status-sync.yml with the same basename, so the wave script must assert no destination path is written twice after the path rewrite. Otherwise the reusable lands in a client repo as the workflow, fires on nothing, and looks green.

Phase 2 pilot (foundrae-blackridge@staging, private leg first) is still to run — the vars.BONSAI_URL-resolves-against-the-caller assertion is the last untested assumption.

…us-sync stub

Step 2 of the README release order for v1.10.0 (b394c6d).

- templates/github/bonsai-status-sync.yml: replaced the 190-line per-repo copy
  with the 66-line caller stub, pinned to b394c6d # v1.10.0. This completes the
  Phase 1 conversion started in #21 — the status machine, actor gate, linkage
  logic and cascade caveat now live in one central file.

- Repinned the other five stubs. Note these jump v1.8.0 -> v1.10.0: v1.9.0 never
  got its kit repin commit, so the templates sat at 80c35fe through that release
  while the deployed fleet was waved to a54c91e. This closes that gap.

- templates/github/README.md: moved bonsai-status-sync.yml from "Full workflows"
  to "Caller stubs" (five -> six), and rewrote onboarding step 5 — the board
  strings are no longer editable per repo, so a board rename is now a kit release
  + fleet repin rather than a local edit.

- README.md: latest tag v1.9.0 -> v1.10.0 with the pin-sequence note, stub is no
  longer "pending", the kit paragraph now reads six stubs + claude.yml, and the
  wave-diff basename trap is scoped to the v1.10.0 wave specifically.

- lint.yml header's "six reusables" verified still correct (6 workflow_call-only
  files in .github/workflows/); no change needed.

actionlint clean across both halves. The placeholder-pin guard passes. The fleet
is NOT waved yet — consumer repos still run the 190-line copy until then.
@mcarter-astronautdev

Copy link
Copy Markdown
Member Author

@claude please run /code-review:code-review

…rapper

0bbb125 is older than the Admin API wrapper: graphql_guard.py does not exist
at that SHA. So every fleet runner has been executing admin-graphql.sh with no
fail-closed allowlist, leaving the Driver Engineering scope grant as the only
control on destructive mutations — exactly the control the 25-scope narrowing
was designed to lean on the wrapper for.

Bumped in lockstep across both kit files, per the standing rule that a smoke
test must verify the revision the implementer actually runs.

claude.yml stays a per-repo copy, so no client repo is guarded until a wave
copies this out. Not tagged yet — fold into the v1.10.0 wave or cut v1.11.0.
@mcarter-astronautdev

Copy link
Copy Markdown
Member Author

Coordination note (from the driver-agents session): the Shopify operator-tripwire block is being added to templates/github/claude.yml's --append-system-prompt as part of this release — it pairs with the DRIVER_AGENTS_REF bump to 4d63371, which is the ref that ships the allowlist wrapper the tripwire refers to. A stacked PR targeting this branch is coming shortly.

Decision on the open tag question (per Maria): this PR now carries kit content changes, so it ships as v1.11.0 — content changes get their own tag. After both land: merge, tag v1.11.0, repin stubs to that SHA, then one wave. Please hold the tag/repin/wave until the stacked tripwire PR is merged into this branch.

… runbooks

Review surfaced five problems; this fixes the four that are independent of the
v1.11.0 tag decision.

- templates/github/bonsai-status-sync.yml header said "Inherits secrets" while
  the body says "Explicit, NOT `secrets: inherit`". Wrong in the dangerous
  direction: the natural cleanup from reading the header is to swap the explicit
  map for `secrets: inherit`, which would hand an issues-triggered, centrally
  pinned file every org secret the repo holds. actionlint can't see comments, so
  nothing in CI catches it. Fixed in the stub AND in the scope doc's canonical
  block so it doesn't regenerate at the next conversion.

- Same header claimed omitting `permissions:` yields a 403. It actually yields a
  silent startup_failure — no check run, no notification. Corrected both copies.

- README release-order step 3: documented that the five pre-existing stubs' pin
  hunks CANNOT apply during this wave. They patch from 80c35fe (v1.8.0) but every
  deployed stub holds a54c91e (v1.9.0) — v1.9.0 shipped without a kit repin while
  the 2026-08-01 wave repinned the fleet anyway, so no kit revision has ever
  carried a54c91e in a pin line. `git apply` would reject all five on target #1.

- De-staled both scope docs, which still asserted the stub had not landed: the
  decision banner, the Why paragraph, the phase table (Phase 5 done), the
  "Phase 1 landed" section, the placeholder pin in the canonical block, and the
  BONSAI_TOKEN / @claude-grep citations that moved out of templates/ at the repin.
  Recounted 261291955: 13 -> 11 across 4 files, since the kit stub no longer
  carries the actor gate.

Stub is 67 lines now. The scope doc's canonical block is byte-identical to the
landed file (verified by diff). actionlint clean; placeholder-pin guard passes.
…decision

The DRIVER_AGENTS_REF bump inserted 5 lines at templates/github/claude.yml:183,
taking the file 460 -> 465. Both scope docs open with an explicit "every file:line
citation is re-verified" guarantee, which is exactly why they get trusted without
re-checking — so every citation at or past the insertion point was silently wrong.

Resolved all ~60 bare `:NNN` citations across both docs to their referent file
before touching anything: most point at ticketed-review.yml, pr-first-review.yml,
templates/github/README.md, or external claude-code-action sources and were
correct. Ten were stale:

- reusable-conversion-scope.md: :195/:202-206/:233 -> :200/:207-211/:238,
  :239 -> :244, :195-197 -> :200-202, :311 -> :316, :449-452 -> :454-457,
  :304 -> :309, :456 -> :461.
- identity-unification-scope.md: :213 -> :218 (assertion 9's private-clone line,
  which a future session would have executed against a `for` loop), :233 -> :238,
  :458 -> :463, :195-197 -> :200-202.

Two more were stale for a different reason and a +5 would not have fixed them:
the `on:` block and actor-gate citations still pointed into
templates/github/bonsai-status-sync.yml, which is now a 67-line stub containing
neither. Repointed to the stub's :24-33 and the reusable's :139-141.

Also recomputed the claude.yml line counts (460 -> 465; comment ratio 291/460 ->
296/465, 64%) and corrected the DRIVER_AGENTS_REF lockstep assertion, which still
named 0bbb125 — the exact SHA this PR replaces.

README: recorded the v1.11.0 decision and removed the fold-into-v1.10.0 option.
Folding would put claude.yml content on 18 branches that exists in no tag, and
fleet-pin-audit.sh compares only stub pin lines against the latest tag, so it
would report the fleet uniform and green over the gap.

actionlint clean. The scope doc's canonical stub block is still byte-identical to
the landed file.
…#27)

Appends the Shopify Admin API operator tripwire to templates/github/claude.yml's static --append-system-prompt, so the fleet gets the fail-closed wrapper (DRIVER_AGENTS_REF 4d63371) and the instruction block that describes it in one wave.

The blockquote is copied from driver-agents docs/agent-instructions-shopify.md @ 4d63371 and is byte-exact after whitespace collapse (978 chars). A kit-side, explicitly non-canonical lead-in precedes it: it un-scopes the block from the conduct rules above and tells the model how to report a trip on a CI rail that has no way to set a job exit code.

Review fixes folded in before merge: corrected a new comment that misdescribed the provisioning gate as issues-only when it excludes only /code-review; gave a tripped tripwire a sink so it cannot stop silently on a green job; added a lint.yml guard asserting the prompt survives shell-quote tokenization (one apostrophe upstream silently truncates it, and nothing else would catch that before 18 branches took a copy); and re-anchored the six doc citations the +12 line shift moved.

actionlint green, new tokenization guard green.
@mcarter-astronautdev
mcarter-astronautdev merged commit 90f0d06 into main Aug 2, 2026
2 checks passed
@mcarter-astronautdev
mcarter-astronautdev deleted the chore/repin-v1.10.0 branch August 2, 2026 04:37
mcarter-astronautdev added a commit to DriverDigital/vite-plugin-shopify-clean that referenced this pull request Aug 2, 2026
Fleet wave for v1.11.0 (90f0d06).
- bonsai-status-sync.yml: 190-line per-repo copy -> 67-line caller stub
- five caller stubs repinned a54c91e (v1.9.0) -> 90f0d06 (v1.11.0)
- claude.yml: DRIVER_AGENTS_REF -> 4d63371 (fail-closed Admin API allowlist)
  plus the Shopify operator tripwire in the static system prompt

Centrally reviewed in DriverDigital/workflows#26 and #27; piloted on
vite-plugin-shopify-clean (vars.BONSAI_URL proven to resolve against the
caller) and foundrae-blackridge. [skip ci] so no deploy or review run fires.
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.

1 participant