AGENTS.md tells agents the merge is director-gated, which inverts the pull-request-and-merge lane and strands finished work #937

Closed
opened 2026-08-25 23:17:36 +00:00 by coilyco-ops · 2 comments
Owner

What

AGENTS.md in this repo carries a hand-written one-line summary of the git workflow:

Git workflow - pull-request-and-merge, declared as ward.workflow in this file's frontmatter. Agents push a branch and open a Forgejo pull request. Nothing lands straight on main, and the merge stays director-gated.

The lane authority says the opposite. agentic_os/generators/generate_git_workflow.py in agentic-os is the canonical source for this block, and it states that the agent that authored the code merges its own pull request on pull-request-and-merge. Its own docstring names this exact reading as the bug it was written to correct:

pull-request-and-merge carries the merge because the agent that authored the code merges its own pull request. Reading pull-request-and-merge as "someone else merges it later" inverts the two lanes and leaves finished work sitting unmerged.

Why it matters

An agent reading this repo's AGENTS.md stops at the open pull request and hands back. That is the stranded-work failure the lane slug was renamed to prevent, and it is invisible until someone reads the merge queue.

The sentence also claims to be "byte-identical across the five PR-lane repos (agentic-os, deploy, infrastructure, sirens-echo, ward)". It is not: agentic-os carries the generated block instead, which says the agent merges. So the claim of identity is itself stale, and the other three repos are worth checking for the same drift.

Fix

Adopt the generated git-workflow block here rather than hand-maintaining a summary of it. agentic-os ships both scripts/apply-git-workflow.py (the writer) and the check-git-workflow pre-commit hook (the drift gate), so the block stops diverging once this repo is on it. This repo has no generated-block markers in AGENTS.md today, which is why it drifted.

Check deploy, sirens-echo, and ward for the same stale sentence while landing it.

Found by

Surfaced while landing #936, whose merge decision the contradiction blocked. Sibling fleet-writer change: coilyco-flight-deck/agentic-os#1244

## What `AGENTS.md` in this repo carries a hand-written one-line summary of the git workflow: > **Git workflow** - `pull-request-and-merge`, declared as `ward.workflow` in this file's frontmatter. Agents push a branch and open a Forgejo pull request. Nothing lands straight on `main`, and the merge stays director-gated. The lane authority says the opposite. `agentic_os/generators/generate_git_workflow.py` in agentic-os is the canonical source for this block, and it states that the agent that authored the code merges its own pull request on `pull-request-and-merge`. Its own docstring names this exact reading as the bug it was written to correct: > `pull-request-and-merge` carries the merge because the agent that authored the code merges its own pull request. Reading `pull-request-and-merge` as "someone else merges it later" inverts the two lanes and leaves finished work sitting unmerged. ## Why it matters An agent reading this repo's `AGENTS.md` stops at the open pull request and hands back. That is the stranded-work failure the lane slug was renamed to prevent, and it is invisible until someone reads the merge queue. The sentence also claims to be "byte-identical across the five PR-lane repos (agentic-os, deploy, infrastructure, sirens-echo, ward)". It is not: agentic-os carries the generated block instead, which says the agent merges. So the claim of identity is itself stale, and the other three repos are worth checking for the same drift. ## Fix Adopt the generated git-workflow block here rather than hand-maintaining a summary of it. agentic-os ships both `scripts/apply-git-workflow.py` (the writer) and the `check-git-workflow` pre-commit hook (the drift gate), so the block stops diverging once this repo is on it. This repo has no generated-block markers in `AGENTS.md` today, which is why it drifted. Check `deploy`, `sirens-echo`, and `ward` for the same stale sentence while landing it. ## Found by Surfaced while landing https://forgejo.coilysiren.me/coilyco-flight-deck/infrastructure/pulls/936, whose merge decision the contradiction blocked. Sibling fleet-writer change: https://forgejo.coilysiren.me/coilyco-flight-deck/agentic-os/pulls/1244
Author
Owner

This repo's copy is fixed in #940. Measuring the rest changed the shape of the remainder, so leaving the numbers here rather than in the pull request alone.

The drift is fleet-wide

A dry run of agentic-os/scripts/apply-git-workflow.py across the 20 checked-out repos:

Summary: ok=1, skip=1, would-write=18

agentic-os is the only repo already current. Every other repo drifts, on both lanes, not just the four PR-lane siblings this issue named.

Why, structurally

agentic-os wires git-workflow as a local hook in its own .pre-commit-config.yaml. The managed hook set that apply-agentic-os-hooks.py writes into consumer repos does not include it. So the authoring repo is gated against this drift and no consumer repo ever has been, which is exactly why one repo stayed current and 18 did not.

Ordering constraint

Adding git-workflow to the fleet hook set first turns 18 repos red until each takes its block. So the blocks land first, per repo on its own lane, and the gate follows once the tree is clean.

There is a second cost per repo. The block is about 2.3 KB and lands in a file most repos cap at 4000 chars. This repo was already opted up to 8000 for the engineer/QA prohibition and still went 133 over, so it needed another raise. Repos sitting near their cap will each need the same, and that is a judgement call per repo rather than something the applier can make.

Scope

That rollout belongs here as ansible rather than as a hand run of the authored applier, per the authoring-vs-rollout split the applier's own docstring states. It also wants a decision from Kai first, since it is 18 pull requests across lanes plus a per-repo cap judgement, so I have not started it.

Suggest this issue stays open as the rollout tracker once the pull request above merges, rather than closing with it.

This repo's copy is fixed in https://forgejo.coilysiren.me/coilyco-flight-deck/infrastructure/pulls/940. Measuring the rest changed the shape of the remainder, so leaving the numbers here rather than in the pull request alone. ## The drift is fleet-wide A dry run of `agentic-os/scripts/apply-git-workflow.py` across the 20 checked-out repos: ``` Summary: ok=1, skip=1, would-write=18 ``` agentic-os is the only repo already current. Every other repo drifts, on both lanes, not just the four PR-lane siblings this issue named. ## Why, structurally agentic-os wires `git-workflow` as a local hook in its own `.pre-commit-config.yaml`. The managed hook set that `apply-agentic-os-hooks.py` writes into consumer repos does not include it. So the authoring repo is gated against this drift and no consumer repo ever has been, which is exactly why one repo stayed current and 18 did not. ## Ordering constraint Adding `git-workflow` to the fleet hook set first turns 18 repos red until each takes its block. So the blocks land first, per repo on its own lane, and the gate follows once the tree is clean. There is a second cost per repo. The block is about 2.3 KB and lands in a file most repos cap at 4000 chars. This repo was already opted up to 8000 for the engineer/QA prohibition and still went 133 over, so it needed another raise. Repos sitting near their cap will each need the same, and that is a judgement call per repo rather than something the applier can make. ## Scope That rollout belongs here as ansible rather than as a hand run of the authored applier, per the authoring-vs-rollout split the applier's own docstring states. It also wants a decision from Kai first, since it is 18 pull requests across lanes plus a per-repo cap judgement, so I have not started it. Suggest this issue stays open as the rollout tracker once the pull request above merges, rather than closing with it.
Author
Owner

Rollout complete. Closing, with the one residual tracked elsewhere.

Landed

16 repos carry the managed block. 13 went straight to main on merge-remote-main, and 3 landed through pull requests on their own lanes: agent-proxy, deploy, and this repo. agentic-os was already current.

Two repos needed an AGENTS.md char cap raise, both with the reason written next to the number: this repo 8000 to 8500, deploy 6500 to 8700. The block is about 2.3 KB of machine-generated text a consumer repo cannot trim, which is the same argument each cap had already been raised on once.

Tooling

scripts/git-workflow-migrate.py in #943, sibling of the pointer migration. The shared clean-on-main guard moved to migrate_common.py.

The gate that stops this recurring is in coilyco-flight-deck/agentic-os#1262: git-workflow is now in the fleet hook set, so consumer repos get it on their next managed-block refresh. Blocks first, then the gate, as the ordering note above required.

Not done, and why

  • sirens-echo - block written and pushed, pull request open at coilyco-gaming/sirens-echo#1156, red on drift that predates it. That repo's role-drift-check clones the catalog at an unpinned main, so the upstream seat retitles invalidated its committed role record with no commit on its side. Filed at coilyco-gaming/sirens-echo#1157. Its config refresh should wait for that, or the new gate lands on a repo whose block is still absent.
  • coilysiren/coilysiren - exempt in code. GitHub is canonical for the profile repo, so a Forgejo main push would land the commit on the downstream side.
  • Two host checkouts - deploy and this repo were dirty when the bulk run reached them, so it refused them and they landed through worktrees instead. Both left exactly as found, untracked files included.
Rollout complete. Closing, with the one residual tracked elsewhere. ## Landed 16 repos carry the managed block. 13 went straight to `main` on `merge-remote-main`, and 3 landed through pull requests on their own lanes: agent-proxy, deploy, and this repo. agentic-os was already current. Two repos needed an AGENTS.md char cap raise, both with the reason written next to the number: this repo 8000 to 8500, deploy 6500 to 8700. The block is about 2.3 KB of machine-generated text a consumer repo cannot trim, which is the same argument each cap had already been raised on once. ## Tooling `scripts/git-workflow-migrate.py` in https://forgejo.coilysiren.me/coilyco-flight-deck/infrastructure/pulls/943, sibling of the pointer migration. The shared clean-on-main guard moved to `migrate_common.py`. The gate that stops this recurring is in https://forgejo.coilysiren.me/coilyco-flight-deck/agentic-os/pulls/1262: `git-workflow` is now in the fleet hook set, so consumer repos get it on their next managed-block refresh. Blocks first, then the gate, as the ordering note above required. ## Not done, and why * **sirens-echo** - block written and pushed, pull request open at https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/pulls/1156, red on drift that predates it. That repo's `role-drift-check` clones the catalog at an unpinned `main`, so the upstream seat retitles invalidated its committed role record with no commit on its side. Filed at https://forgejo.coilysiren.me/coilyco-gaming/sirens-echo/issues/1157. Its config refresh should wait for that, or the new gate lands on a repo whose block is still absent. * **coilysiren/coilysiren** - exempt in code. GitHub is canonical for the profile repo, so a Forgejo `main` push would land the commit on the downstream side. * **Two host checkouts** - deploy and this repo were dirty when the bulk run reached them, so it refused them and they landed through worktrees instead. Both left exactly as found, untracked files included.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/infrastructure#937
No description provided.