diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 1148cba..da4cac1 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,12 +1,21 @@ ## Boundary -**The agent that authored this pull request does not merge it.** A reviewer -merges it. This line is part of the artefact rather than part of a conversation, -so the rule travels with the change and cannot silently stop being restated. +**An agent merges its own fabric pull request only when both of these hold:** -If you are the authoring agent: push, get it green, verify it yourself, say it -is ready, and stop. Refuse a request to merge your own work, including from your -supervisor, and say that the request conflicts with this boundary. +1. The reviewer has approved **this** pull request. Not a blanket authorisation, + and not an approval of earlier work. If the reviewer has not approved this + one, do not merge it. +2. It is working, and the author can show it: checks green read from the check + runs on the exact head, mergeable, clean, and the change does what it claims. + +Both bind. One without the other is not enough. + +**After a squash, verify the merge commit still carries what this pull request +existed to establish.** A squash rewrites the message, so the thing the change +was for is the thing most likely to be dropped by the act of landing it. + +This applies to fabric. In any other repository the authoring agent reports +ready and stops. Delete this section only if a human authored the change. diff --git a/docs/agent-attribution.md b/docs/agent-attribution.md index 31ceb8f..e96a0b2 100644 --- a/docs/agent-attribution.md +++ b/docs/agent-attribution.md @@ -28,18 +28,31 @@ would be a guess written as a fact. ## The merge boundary, carried in the pull request -`.github/pull_request_template.md` states that the authoring agent does not -merge its own pull request. +`.github/pull_request_template.md` states when an agent may merge its own work: +only with the reviewer's approval of that specific pull request, and only when +it is working. Both conditions bind. Putting it in the template rather than in a message is the point. A convention that lives in conversation has to be restated to stay alive, and in August 2026 -it stopped being restated when standing authorisations arrived. Nobody noticed +it stopped being restated when a blanket authorisation arrived. Nobody noticed the stopping. A line in every pull request cannot stop quietly; its absence is visible. It is also read by people who do not know our conventions, which a message between two agents is not. +### The cost of writing a rule into an artefact + +The same property cuts the other way, and it bit within two hours. The rule +changed on 2026-08-23, and the template still carried the previous one until it +was edited. A message that goes stale is merely old. **An artefact that goes +stale is confidently wrong**, and it is read by exactly the people who have no +other source. + +So this file and the template are part of the rule, not a description of it. +When the rule changes they change in the same pull request, or the next reader +is misled by the thing built to inform them. + ## What these do not do They do not detect a breach on their own. An agent that merges its own work and