Skip to content

chore(distribution): arm the .github automerge canary - #418

Merged
kyle-sexton merged 2 commits into
mainfrom
chore/sync-audit-phase1-canary
Aug 17, 2026
Merged

chore(distribution): arm the .github automerge canary#418
kyle-sexton merged 2 commits into
mainfrom
chore/sync-audit-phase1-canary

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

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 .github canary arms.

Fix

automerge: false removed from the melodic-software/.github target (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: .github has 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 .github PR, strict_required_status_checks_policy: false, squash triple-aligned, arming mutation + Workflows grant proven live under the current pin.

Canary trigger note: .github is 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

kyle-sexton and others added 2 commits August 17, 2026 12:30
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
kyle-sexton enabled auto-merge (squash) August 17, 2026 16:32
@cursor

cursor Bot commented Aug 17, 2026

Copy link
Copy Markdown

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

claude Bot commented Aug 17, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 9s —— View job


Code review: PR #418 — arm the .github automerge canary

Verdict: no issues found. This is a clean, well-scoped config + docs change and its claims check out against the repo.

What I verified:

  • distribution/sync-manifest.yml: automerge: false removed only from the melodic-software/.github target (L321-329); the remaining 7 targets still carry the explicit opt-out (grep confirms exactly 7 automerge: false occurrences left) — matches the PR body's claim.
  • distribution/sync-manifest.sh:723-732 confirms "absent automerge key = armed (true)" is the actual schema/engine behavior, not just asserted in prose — the PR's "engine treats absent as true" claim is accurate.
  • Component/target counts: manually counted 38 top-level components: entries and 8 targets: entries — matches the PR body's "38 components, 8 targets."
  • The re-cut header comment (L313-319) accurately reflects the new state (canary armed, proof cited, remaining fleet gated on the canary's first organic PR) and is internally consistent with docs/topics/standards-sync-audit/PLAN.md Phase 1.4's 7-day time-box.
  • PLAN.md phase-status edits are consistent with actual state: 1.2 flipped [DOING] → [DONE] (matches feat(workflows): watchdog test-mode dispatch, classifier fixes, v0.15.0 re-pin #416 merged), 1.4 flipped [PENDING] → [DOING] (matches this PR being the canary-arm step).
  • design/design-resolution.md's test-synthetic-candidates type fix (numberstring, with the string-on-both-sides rationale) matches the type actually used across the caller/reusable contract described in the addendum — no leftover number references found elsewhere in the doc set.
  • No other file in the repo (docs, runner-policy.test.mjs visibility map, etc.) encodes an assumption about .github's automerge state that this change would invalidate.
  • CI is green (ci, do-not-merge, pr-title, pr-issue-linkage all passed); this review lane is the only one still running.

No inline comments posted — nothing rose to a line-anchored finding.
· branch

@kyle-sexton
kyle-sexton merged commit 8fba432 into main Aug 17, 2026
46 checks passed
@kyle-sexton
kyle-sexton deleted the chore/sync-audit-phase1-canary branch August 17, 2026 16:33
@github-actions

Copy link
Copy Markdown

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>
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.

Phase 1.4: arm the melodic-software/.github automerge canary

1 participant