feat(aosguard): own the merge decision instead of deferring it to Ward #1085
No reviewers
Labels
No labels
burndown-2026-06
burndown-2026-08
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/agentic-os!1085
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/wt57-aosguard-owns-merge"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The forgejo surface withheld
pr mergeon the grounds that it "rides Ward's compiled PR workflow gate". That made a capability of this bundle conditional on a second tool existing, which is precisely what aos#778 says AOSguard must not do.It cost something
An agent holding
pr createand nopr mergeeither strands its work or pushes the merge commit by hand. The hand-push empties the pull request it just opened:base...headcollapses the moment main contains head, so the PR renders no diff and readsmerged=false.Six pull requests in
coilyco-bridge/deploywent that way today before the cause was diagnosed.What changed
can merge pronrepoMergePullRequest, bounded by the samecoily*owner gate every other{owner}leaf carrieskubectl.kdlno longer claims grants "audit-log through ward" when the audit path is the generated binary's ownEvery remaining
wardmention in the policy now asserts independence rather than deferring. Theward#NNNcitations stay: those are provenance, not reliance.The vendored contract needed extending
The committed spec is a curated subset (45 paths), not full upstream, and specgen prunes fail-closed:
Spliced in the POST only, plus
MergePullRequestOption. The is-mergedGETand cancel-auto-mergeDELETEon the same path stay out, because neither is granted. 45 to 46 paths, 70 to 71 definitions, deterministic gzip preserved.Verified, not assumed
Refused before any API call. The verb builds, exposes
--Doas required, and branch protection still applies on top.pre-commit run --all-filesgreen,pytest tests/test_aosguard.py19 passed, lock and build both clean.This is an authority expansion
Not a cleanup. Agents that reach this binary can now merge pull requests in
coily*repositories. Kai granted it deliberately after I flagged the alternative, which was to keep merge human-only but say so on AOS's own reasoning rather than Ward's.Landing it ships through the aosguard release train to every host, so I have left the merge to you rather than pushing it myself. Which would also be ironic.
The forgejo surface withheld `pr merge` on the grounds that "merge rides Ward's compiled PR workflow gate". That made a capability of this bundle conditional on a second tool existing, which is the thing aos#778 says AOSguard must not do. It was not only untidy. An agent holding `pr create` and no `pr merge` either strands its work or pushes the merge commit by hand, and the hand-push empties the pull request it just opened: base...head collapses the moment main contains head, so the PR renders no diff and reads merged=false. Six pull requests in coilyco-bridge/deploy went that way today. Merge is granted now, bounded by the same coily* owner gate every other {owner} leaf carries rather than by another tool's trusted-owner list. Verified: a non-coily owner is refused before any API call. Adding the verb needed the vendored contract extended, since it is a curated subset rather than full upstream and specgen prunes fail-closed. Spliced in the POST only, with MergePullRequestOption, leaving the is-merged GET and the cancel-auto-merge DELETE out because neither is granted. Also corrects two misattributions found while surveying: the header called this "the aos-authored ward bundle", and kubectl.kdl claimed grants audit through Ward when the audit path is the generated binary's own. Kai granted the authority expansion deliberately. Co-authored-by: Kai Siren <coilysiren@gmail.com> Co-authored-by: Claude <noreply@anthropic.com>