chore(distribution): re-arm fleet automerge - #489
Conversation
The .github canary was observed end-to-end on 2026-08-23 — PR 62 armed on open and self-merged 31 seconds later with all four required contexts green — which discharges the Phase 1.4 gate. Removes automerge: false from the seven original targets plus codex-plugins. Three Phase 4 targets keep the key: agent-plugins, claude-code-proxy and cursor-plugins resolve base + signing only, not the org ci-gate ruleset, so they carry no required status checks and an armed sync PR would merge with nothing gating it. Proven live — claude-code-proxy PR 182 merged with ci-status, Ruff, Pester and pytest all failing, because none of them are required. codex-plugins entered in the same Phase 4 window and is armed, because it alone among the four carries ci-gate. Each surviving key now names its own blocker and removal trigger, so the opt-out does not read as roster vintage. Phase 1.6 tracks extending ci-gate to the three, which is a Pulumi change in github-iac. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EtfvgtanSD6nyC9JqYMz6A
|
Claude finished @kyle-sexton's task in 2m 10s —— View job Code review complete
No blocking findings. This is the CI code-review lane (correctness/maintainability; security is scoped to a separate lane where present). What I checked, independently (not just restating the PR's own claims):
One non-blocking note (not filed as an inline finding since it's PR-description narrative, not a change to either file in this diff): the PR body states the engine's "literal-spelling rule rejects" an |
|
Claude has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
Claiming for triage ( |
VerificationConfirmed the diff matches the PR's own claims. This is the implementation PR for issue #488 ( Classification
OutcomeRouting human-gated. Labels applied: Recommended next step: a human reviews and merges this PR directly. |
Conflicts in docs/topics/standards-sync-audit/PLAN.md are all the same shape: main's #494 style pass rewrote em-dashes to plain punctuation on lines this branch had already rewritten for content. Resolved by taking this branch's content and applying #494's punctuation to it, so the file carries the Phase 1.4/1.5 [DONE] records and the new Phase 1.6 section without reintroducing the em-dashes #494 removed (count back to 1, the ai-slop-ignore verbatim quote main also kept). The engine line reference in Phase 1.5's Sanity Check stays at this branch's `:666-684`, verified against distribution/sync-manifest.mjs (automerge parsing is 666-684 today); main's `:723-732` is stale. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013FKgumzQEj4s9cbzh5k2UX
Summary
Phase 1.5 of the standards-sync audit: the
.githubcanary was observed end-to-end on 2026-08-23, inside the Phase 1.4 time box. PR 62 opened at 02:28:08Z, the sync App armed auto-merge on it two seconds later (enabledBythe App itself, SQUASH), and it self-merged at 02:28:39Z withmergedBythe same App and no human action, all four required contexts green. That discharges the 1.4 gate, so the fleet re-arms.Fix
automerge: falseremoved from 8 targets — the 7 originals (ci-runner, ci-workflows, claude-code-plugins, dotfiles, github-iac, medley, provisioning) plus codex-plugins. Absent key = armed default (schema-optional; the engine setsautomergeValue = "true"unless the key is present,sync-manifest.mjs:666-684). Removal rather than anautomerge: trueflip, matching PR #299 and PR #418. (To be precise about the engine: an explicit literaltruewould be both schema-legal and engine-legal; the literal-spelling rule atsync-manifest.mjs:678-682only rejects non-canonical spellings such asTrueoryes. Removal is the house pattern because it keeps the armed default terse, not because a flip would be rejected.)Three Phase 4 targets keep the key: agent-plugins, claude-code-proxy, cursor-plugins. Their default branches are not covered by the org
ci-gateruleset (id 17989001) — the rule supplyingpr-title,pr-issue-linkage,do-not-mergeandci-statusas required contexts. They resolvebase+signingonly, so they carry no required status checks at all and an armed sync PR would merge with nothing gating it.That is proven live rather than inferred: claude-code-proxy PR 182 merged 2026-08-23 with
ci-status, Ruff, Pester and pytest all FAILURE, precisely because none of them are required. agent-plugins PR 2 and cursor-plugins PR 12 each show a single GitGuardian entry as their entire check rollup.The opt-out is therefore not roster vintage — codex-plugins entered in the same Phase 4 window and is armed here, because it alone among the four carries
ci-gate(verified on its PR 22: all four contexts SUCCESS). Each surviving key now carries a comment naming its own blocker and removal trigger, and the fleet-automerge header comment is re-cut to the restored state.This corrects the count in #481 and in PLAN.md Phase 1.5 (7 removals, residue 0). Both were authored on 2026-08-17 against an 8-target roster, two days before the Phase 4 expansion took it to 12;
git log -Sputs both lines in the same commit,967ef48. Phase 4R reconciled the Brief against the new roster but never revisited 1.5's count.Also in this PR: PLAN.md Phases 1.4 and 1.5 tagged DONE with evidence, the stale 1.5 sanity check corrected (
→ 0was arithmetic from the 8-target era), the discharged Brief constraint marked, and a new Phase 1.6 filed to extendci-gateto the three disarmed repositories — a Pulumi change in github-iac per repo convention, never the GitHub UI or ad-hocgh.Verification
node distribution/sync-manifest.mjs validate→Manifest valid: 33 components, 12 targets, exit 0 (counts unchanged — pure policy change).yq '[.targets[] | select(has("automerge"))] | length'→ 3, and those three are exactly agent-plugins, claude-code-proxy, cursor-plugins.Engine-computed matrix (
sync-manifest.mjs matrix) — 9 armed, 3 disarmed:npm run lint:md→ 118 files, 0 issues. Pre-commit lefthook green (editorconfig, typos, gitleaks, markdownlint).Merge-path safety for the 8 armed targets was checked the same way Phase 1.4 checked
.github:gh api repos/<repo>/rules/branches/mainfor required contexts plusstatusCheckRollupon each repo's most recent real bot sync PR. All 8 carry the four required contexts withallow_auto_mergeandallow_squash_mergetrue. github-iac PR 348 is currently open and BLOCKED on a flakedpr-title— the armed-BLOCKED condition the now-proven watchdog reports, not a blocker to arming.The two conditional comment re-cuts from Phases 1.1 and 1.2 were checked and had already landed on
main(ci-workflows reusable, now at lines 215-218 after file growth; the standards caller at lines 20-22). Neither becomes false when the fleet re-arms, so neither is carried here.Related
Closes #488. Related: #481 (operator checklist — its 11 → 4 count is superseded by 11 → 3), #418 (canary), #299 (prior fleet restore), #406 (audit umbrella).
🤖 Generated with Claude Code
https://claude.ai/code/session_01EtfvgtanSD6nyC9JqYMz6A