chore(distribution): arm the .github automerge canary - #418
Merged
Conversation
Standards-sync audit Phase 1.4: the watchdog's tracking-issue lifecycle is proven (plan Phase 1.3 proof artifact — create/update/close/fail via dispatched test-mode runs), so the .github target's explicit opt-out comes off; an absent automerge key is the armed default. Header comment re-cut to the in-progress restore state. Merge-path safety verified 2026-08-17: all four required contexts fire on every PR there, strict up-to-date policy off, squash triple-aligned, arming mutation + Workflows grant proven live. Also: design addendum records the synthetic-candidate count as a string (post-merge Codex threads on the Phase 1.2 PR). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013NhxMDn7vZdbs7Cq32m56M
kyle-sexton
enabled auto-merge (squash)
August 17, 2026 16:32
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
Claude finished @kyle-sexton's task in 2m 9s —— View job Code review: PR #418 — arm the
|
|
Claude has reviewed this PR 1 time. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
kyle-sexton
added a commit
that referenced
this pull request
Aug 26, 2026
## Summary Phase 1.5 of the standards-sync audit: the `.github` canary 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 (`enabledBy` the App itself, SQUASH), and it self-merged at 02:28:39Z with `mergedBy` the same App and no human action, all four required contexts green. That discharges the 1.4 gate, so the fleet re-arms. ## Fix `automerge: false` removed 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 sets `automergeValue = "true"` unless the key is present, `sync-manifest.mjs:666-684`). Removal rather than an `automerge: true` flip, matching PR #299 and PR #418. (To be precise about the engine: an explicit literal `true` would be both schema-legal and engine-legal; the literal-spelling rule at `sync-manifest.mjs:678-682` only rejects non-canonical spellings such as `True` or `yes`. 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-gate` ruleset (id 17989001) — the rule supplying `pr-title`, `pr-issue-linkage`, `do-not-merge` and `ci-status` as required contexts. They resolve `base` + `signing` only, 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 -S` puts 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 (`→ 0` was arithmetic from the 8-target era), the discharged Brief constraint marked, and a new **Phase 1.6** filed to extend `ci-gate` to the three disarmed repositories — a Pulumi change in github-iac per repo convention, never the GitHub UI or ad-hoc `gh`. ## 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: ``` melodic-software/.github automerge=true melodic-software/agent-plugins automerge=false melodic-software/ci-runner automerge=true melodic-software/ci-workflows automerge=true melodic-software/claude-code-plugins automerge=true melodic-software/claude-code-proxy automerge=false melodic-software/codex-plugins automerge=true melodic-software/cursor-plugins automerge=false melodic-software/dotfiles automerge=true melodic-software/github-iac automerge=true melodic-software/medley automerge=true melodic-software/provisioning automerge=true ``` `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/main` for required contexts plus `statusCheckRollup` on each repo's most recent real bot sync PR. All 8 carry the four required contexts with `allow_auto_merge` and `allow_squash_merge` true. github-iac PR 348 is currently open and BLOCKED on a flaked `pr-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.com/claude-code) https://claude.ai/code/session_01EtfvgtanSD6nyC9JqYMz6A Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
Summary
Phase 1.4 of the standards-sync audit: the watchdog lifecycle proof passed (create/update/close/fail via dispatched test-mode runs — proof artifact in the plan, PR #416), so the
.githubcanary arms.Fix
automerge: falseremoved from themelodic-software/.githubtarget (absent key = armed default, schema-optional — engine treats absent as true); the fleet-automerge header comment re-cut to the in-progress restore state. Design addendum type nit from #416's post-merge threads folded in.Verification
bash distribution/sync-manifest.sh validate→ 38 components, 8 targets;yq:.githubhas no automerge key, exactly 7 targets still carry the explicit opt-out. Merge-path safety (verified 2026-08-17, evidence in plan 1.4): four required contexts fire on every.githubPR,strict_required_status_checks_policy: false, squash triple-aligned, arming mutation + Workflows grant proven live under the current pin.Canary trigger note:
.githubis byte-in-sync — this flip opens no PR by itself. The canary fires on the next organic canonical change to one of its 7 components (recent cadence ~5/week), time-boxed 7 days before Phase 1.5 proceeds on the proof alone. No manufactured canonical change (it would fan PRs fleet-wide).Related
Closes #417. Related: #406 (audit umbrella), #416 (proof + caller).
🤖 Generated with Claude Code
https://claude.ai/code/session_013NhxMDn7vZdbs7Cq32m56M