feat(rules): make green-gate shipping actions autonomous#178
Conversation
There was a problem hiding this comment.
Pull request overview
Adds an always-on “autonomous shipping” contract so agents treat green gates as authorization to proceed (open PR, dismiss superseded bot review gates, merge, and watch through publish), and aligns the existing release skill + CI-safety rule language with that contract.
Changes:
- Introduces
rules/autonomous-shipping.mdas an always-on rule defining autonomous shipping actions and remaining gating cases. - Reframes
rules/ci-safety.mdsuperseded-bot-review dismissal section with an affirmative, no-operator-ack posture and references the new autonomy rule. - Updates surfaces and references (release SKILL steps, README rules count/table, CHANGELOG entry, plugin.json rule list).
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| skills/release/SKILL.md | Points PR creation/merge autonomy guidance at the new always-on rule for a single source of truth. |
| rules/ci-safety.md | Retitles/reframes superseded bot review dismissal guidance to be explicitly autonomous (while preserving predicates). |
| rules/autonomous-shipping.md | New always-on rule defining autonomous shipping actions and the bounded set of remaining gates. |
| README.md | Updates rule counts and adds the new rule to the rules table. |
| CHANGELOG.md | Adds an un-headed top section entry describing the new rule and related reframes. |
| .tessl-plugin/plugin.json | Registers the new rule for distribution to consumers. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - A shipping action is the autonomous next step once its gate reads green | ||
| - The gate is the approval artifact — no human ack stands between a green gate and the action it gates | ||
| - A gate is the named conjunction of fields, never an impression — each action below names the fields that must read green |
There was a problem hiding this comment.
Fixed in 3769eda — the claim is gone. The bullet said "each action below names the fields that must read green" while the actions pointed at SKILL.md steps. Rather than make every action restate its fields (which would violate script-as-black-box.md and balloon the rule), the fields now live in one place — the new What Counts as Approval section — and the bullet points there:
- A gate is a named conjunction of fields, never an impression — What Counts as Approval names the merge gate's fields
You flagged this on the first review too and I only half-fixed it then; the claim survived my edit. Second time's the charge.
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
All rules pass — no violations found.
Checked the new always-on rule, the ci-safety wording change, the release skill references, and the required surface sync across .tessl-plugin/plugin.json, README, and CHANGELOG. The changed skill lines stay within the existing skill-authoring/script-reference contracts, and the rule count is consistent at 24.
Generated by PR Policy Review (OpenAI) for #178 · 35.2 AIC · ⌖ 3.84 AIC · ⊞ 14.6K
|
Holding this PR pending #180. #180 fixes a bug this PR makes materially worse: Two changes still owed here once #180 lands and this rebases:
|
The rule asserted "the green gate is the approval" without ever saying what the gate is made of, and was silent on the question every reader actually has: does bot review substitute for human review? ci-safety documents that github-actions[bot] cannot APPROVE (HTTP 422). SKILL.md Step 7 lists a merge conjunction. Neither says whether a human must sign off, so "green gate is the approval" read as an assertion rather than a definition. State the operator's position outright and name the conjunction. Also: - Authorization is standing, never inferred from the conversation. An agent that stops asking but still needs a grant will manufacture one; production showed an agent reading the operator's challenge to the policy as authorization under it. - A verdict approves only the commit it reviewed. A review whose commit_id is not the head SHA reads as absent, not clean. - CI-config edits join What Still Gates (ci-safety says stop and ask; the rule's red-gate line said fix it). - The Merge action points at the definition instead of restating fields (Copilot on #178). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
|
Rebuilt. All four owed items are in:
Also carries the stale-verdict rule as policy: a review whose |
| --- | ||
| alwaysApply: true | ||
| description: A green gate is the go-ahead; pausing to ask for approval the gate already granted is the violation. | ||
| --- |
There was a problem hiding this comment.
Declining — rules/context-writing-style.md:14 scopes the budget away from this rule explicitly:
Line-count and section-count budgets target single-concept rules; rules that cover one coherent policy area with several sub-aspects (e.g.,
plugin-evalscovering coverage/lift/persistence/naming/hygiene;context-artifactscovering structure/review/sync/audit;skill-authoringcovering frontmatter/preamble/steps/calls) may run larger
autonomous-shipping is that shape: one policy area (shipping autonomy) across five sub-aspects — the green-gate principle, what approval is, the actions, the asking directive, the surviving gates. The 3–6 H2 budget it does bind is met exactly (5).
Measured against the repo it's also unremarkable: ci-safety is 126 lines / 11 sections, context-artifacts 96 / 10, plugin-evals 89 / 9, skill-authoring 80 / 9. Seven rules currently exceed 40 lines and all are legal under that clause. At 50 this is the second-shortest of the multi-aspect set.
Your underlying point is fair and I acted on the part that is binding: cut both worked examples (context-writing-style sends those to CHANGELOG, where they now are), split the two multi-directive bullets, dropped the redundant "gate is the approval artifact" line now that What Counts as Approval states it. Trimming the remaining ~10 lines would mean cutting directives, not prose.
Separately worth flagging to the maintainer, not fixable here: that budget has no upper bound and the exemption list is open-ended (e.g.), so "may run larger" is unfalsifiable. It's advisory, not a gate. If it should bind, it needs a ceiling.
| - Authorization is standing — it lives in this policy and in the operator's own durable config, never in the operator's latest message | ||
| - Never read a challenging question, an ambiguous remark, or silence as the grant — "is that in the rules?" interrogates the policy, it does not authorize an action under it | ||
| - No standing grant covers the action — the gate is absent, not green (see What Still Gates) | ||
| - A harness gate this policy does not govern (a safety classifier, a permission prompt) is a red gate like any other — surface it and name what it wants; never re-attempt the action to route around it |
There was a problem hiding this comment.
Fixed in 3769eda — split into two bullets:
- A harness gate this policy does not govern (a safety classifier, a permission prompt) is a red gate — surface it and name what it blocked
- Never re-attempt a harness-blocked action through another tool
Also split the other one you'd have caught next (Read the gate...; never ask the operator...). Both were mine, both violated the atomic-bullets guideline in a rule about writing rules.
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
Requesting changes: the new autonomous-shipping rule adds a head-SHA review-verdict requirement without bringing the release poll/watch scripts into alignment, violating the post-edit rule audit requirement; the ci-safety edit also keeps a preconditioned dismissal exception while dropping the carve-out shape required by context-writing-style.md. Both are policy self-consistency issues in changed rule text.
Generated by PR Policy Review (OpenAI) for #178 · 44.8 AIC · ⌖ 8.88 AIC · ⊞ 19.4K
|
|
||
| - Review in these repos is the paired bot fleet, not a human sign-off — a merge needs no human approval, and its absence is never a reason to hold a green PR | ||
| - Merge approval is the conjunction, all required: both gating bots' latest verdicts posted for the head SHA and non-`CHANGES_REQUESTED`, CI `success` or `none`, merge state mergeable, every review body read, every inline comment answered | ||
| - A verdict approves only the commit it reviewed — a review whose `commit_id` is not the PR's head SHA has not approved the current code, and reads as absent rather than clean |
There was a problem hiding this comment.
Violation: rules/context-artifacts.md says, "After editing a rule, audit the repo itself against the new rule text and fix any drift in the same PR" and "A rule that doesn't describe what's already committed in the repo erodes trust in every rule." This new clause requires a verdict to approve only the commit it reviewed, but the executable merge gate still does not enforce or expose that: skills/release/poll-pr-reviews.sh selects the latest review by bot login and returns only {state, submitted_at, body}, and watch-pr-reviews.sh treats any non-none latest state as satisfying the bot-verdict part of ready. A clean bot verdict from an older commit can still satisfy the documented gate. Fix by updating the release poll/watch path and tests in this PR to fetch the PR head SHA, carry each review's commit_id, and require each gating bot's latest clean verdict to match the head SHA; otherwise defer this clause until the executable gate matches it.
There was a problem hiding this comment.
Fixed in 3769eda — deferred, per your second option, and you're right that the first wasn't available: poll-pr-reviews.sh lives in #180, which is unmerged, so fixing the gate here would conflict with it.
You caught me hand-waving. I knew this gap — I found it earlier today when the watcher on this very PR reported a verdict against cdf52c2 while head was ca0073f — and I shipped the clause anyway with "the script counterpart is tracked separately" in the CHANGELOG. That's precisely the Post-Edit Rule Audit failure: a rule the repo doesn't obey, published on the promise that someone will make it true later.
Clause is out. It lands with the poll/watch change that enforces it. The CHANGELOG now records the deferral and why, so it isn't quietly lost.
Worth noting the gap is live in the meantime: Copilot isn't a CI check, so its stale verdict satisfies the bot-verdict half of ready while ci.status goes green on gh-aw alone — the merge gate can pass on a review of code that no longer exists.
| ## Dismissing Superseded Bot Reviews | ||
|
|
||
| - Narrow exception for dismissing a review gate — not a bypass when the gate is a bot's `CHANGES_REQUESTED` that the same bot later superseded with an all-clear re-review | ||
| - Dismiss autonomously once both preconditions below hold — sanctioned gate cleanup, never a bypass, and never an operator ack (see `rules/autonomous-shipping.md`) |
There was a problem hiding this comment.
Violation: rules/context-writing-style.md requires: "Carve-outs: lead with "Narrow exception for X.", then numbered preconditions, then a one-line reset stating every other case follows the rule." This section is still a preconditioned exception around dismissing a review gate, but the new lead removes the required carve-out shape. Fix by keeping the prescribed lead while adding the affirmative permission, or update rules/context-writing-style.md in this same PR if the policy is changing to allow this new carve-out pattern.
There was a problem hiding this comment.
Fixed in 3769eda — carve-out shape restored, title back to Superseded-Bot-Review Dismissal Carve-Out, Narrow exception for X. lead back.
You're right that I traded one violation for another. My reasoning was that the "Narrow exception" framing was itself the bug — PR #174 added that carve-out specifically so agents would stop false-positiving a legitimate dismissal as gate-gaming, and they kept asking for a go-ahead anyway. But the section is still a preconditioned exception, so it still owes the shape, and "the framing scares agents" doesn't license dropping it.
The real fix was elsewhere: autonomous-shipping now names dismissal as an autonomous action and defines what approval is. With that carrying the affirmative permission, the carve-out doesn't need to — it keeps its shape and gains one pointer to the rule that does the work.
I considered your alternative (amend context-writing-style.md to allow an affirmative-permission shape alongside narrow exceptions) and rejected it: that file is being edited on another branch right now, and inventing a second carve-out shape to justify one section is a worse trade than putting the permission where it belongs.
| ## Superseded-Bot-Review Dismissal Carve-Out | ||
|
|
||
| - Narrow exception for dismissing a review gate — not a bypass when the gate is a bot's `CHANGES_REQUESTED` that the same bot later superseded with an all-clear re-review | ||
| - Dismissal under this exception is autonomous, never an operator ack (see `rules/autonomous-shipping.md`) |
There was a problem hiding this comment.
Fixed in ae61ee2 — "ack" appeared nowhere else in the 24 rules, so it was jargon I coined in passing. Now reads never pause for the operator to confirm it, which also states the actual directive instead of naming a noun.
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
Requesting changes for a self-consistency violation in the new rule: rules/autonomous-shipping.md references a rules/ci-safety.md section title that is not present on this PR head, so the policy artifact does not describe the repo state it ships. This falls under rules/context-artifacts.md Post-Edit Rule Audit; the fix is to align the reference with the restored ci-safety heading or retitle the heading consistently.
Generated by PR Policy Review (OpenAI) for #178 · 57.7 AIC · ⌖ 3.54 AIC · ⊞ 14.6K
| ## The Autonomous Actions | ||
|
|
||
| - **Open the PR** — Step 1 readiness checks pass (`skills/release/SKILL.md`) ⇒ push the branch and open the PR | ||
| - **Dismiss superseded bot reviews** — a gating bot's `CHANGES_REQUESTED` that the same bot's later all-clear superseded ⇒ run `skills/release/dismiss-stale-reviews.sh` (see `rules/ci-safety.md` Dismissing Superseded Bot Reviews) |
There was a problem hiding this comment.
This reference does not resolve on the PR head: rules/ci-safety.md still has ## Superseded-Bot-Review Dismissal Carve-Out, not Dismissing Superseded Bot Reviews. This violates rules/context-artifacts.md Post-Edit Rule Audit: "After editing a rule, audit the repo itself against the new rule text and fix any drift in the same PR" and "A rule that doesn't describe what's already committed in the repo erodes trust in every rule." Please either change this pointer to the restored heading or retitle the ci-safety section consistently.
There was a problem hiding this comment.
Fixed in ae61ee2 — correct, and it's the Post-Edit Rule Audit failure you'd flagged one comment earlier, moved one file over. I restored ci-safety's Superseded-Bot-Review Dismissal Carve-Out heading at your request and left autonomous-shipping pointing at Dismissing Superseded Bot Reviews — the name I'd just abandoned. Fixing drift while creating drift.
Pointer now names the restored heading. I also added a check that every rules/<file>.md
The rule asserted "the green gate is the approval" without ever saying what the gate is made of, and was silent on the question every reader actually has: does bot review substitute for human review? ci-safety documents that github-actions[bot] cannot APPROVE (HTTP 422). SKILL.md Step 7 lists a merge conjunction. Neither says whether a human must sign off, so "green gate is the approval" read as an assertion rather than a definition. State the operator's position outright and name the conjunction. Also: - Authorization is standing, never inferred from the conversation. An agent that stops asking but still needs a grant will manufacture one; production showed an agent reading the operator's challenge to the policy as authorization under it. - A verdict approves only the commit it reviewed. A review whose commit_id is not the head SHA reads as absent, not clean. - CI-config edits join What Still Gates (ci-safety says stop and ask; the rule's red-gate line said fix it). - The Merge action points at the definition instead of restating fields (Copilot on #178). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
3769eda to
ae61ee2
Compare
| ## What Still Gates | ||
|
|
||
| - Red, absent, or ambiguous gate — fix it, or surface the specific field that is not green | ||
| - An unplanned CI-config edit, even to turn a red gate green (see `rules/ci-safety.md` Hands Off CI Config) | ||
| - Force-push to a shared branch, history rewrite, tag or release deletion, any action with no undo | ||
| - Direct push to a protected branch outside `rules/ci-safety.md` Content-Only Direct-Push Carve-Out | ||
| - A human reviewer's `CHANGES_REQUESTED` — autonomous dismissal covers bot reviews only | ||
| - Action in a repo the operator does not own (see `rules/external-repo-contributions.md`) | ||
| - Scope the operator never granted — this rule governs how to ship the agreed task, never which task to take on |
There was a problem hiding this comment.
Stale PR-description nit — the description text predates the current head (the rule went 37→51→65 lines across review rounds, gates 4→the full What Still Gates list). The code is correct as it stands; the PR body wasn't kept in lockstep. Not a code finding.
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
All rules pass — no violations found.
Generated by PR Policy Review (OpenAI) for #178 · 44.5 AIC · ⌖ 8.7 AIC · ⊞ 15.5K
| ## Superseded-Bot-Review Dismissal Carve-Out | ||
|
|
||
| - Narrow exception for dismissing a review gate — not a bypass when the gate is a bot's `CHANGES_REQUESTED` that the same bot later superseded with an all-clear re-review | ||
| - Dismissal under this exception is autonomous — never pause for the operator to confirm it (see `rules/autonomous-shipping.md`) | ||
| - Applies when a gating bot that cannot `APPROVE` (`github-actions[bot]` — GitHub returns HTTP 422) re-reviews clean but cannot post the `APPROVED` verdict that would supersede its earlier `CHANGES_REQUESTED` — the stale request keeps the merge `BLOCKED` until dismissed |
There was a problem hiding this comment.
Stale PR-description nit — the description text predates the current head (the rule went 37→51→65 lines across review rounds, gates 4→the full What Still Gates list). The code is correct as it stands; the PR body wasn't kept in lockstep. Not a code finding.
| --- | ||
| alwaysApply: true | ||
| description: A green gate is the go-ahead; pausing to ask for approval the gate already granted is the violation. | ||
| --- |
There was a problem hiding this comment.
Stale PR-description nit — the description text predates the current head (the rule went 37→51→65 lines across review rounds, gates 4→the full What Still Gates list). The code is correct as it stands; the PR body wasn't kept in lockstep. Not a code finding.
Opening a PR, dismissing superseded bot reviews, and merging were already sanctioned — but only in skills/release/SKILL.md, which loads on invocation. An agent finishing a task has never invoked the release skill, so its always-on context mandated PRs without ever saying who authorizes opening one. Agents filled that gap by asking, and the ask is what made the merge classifier demand approval for actions the policy had already granted. Add rules/autonomous-shipping.md (always-on) as the single contract, bound by four surviving gates. Retitle ci-safety's dismissal carve-out, whose "Narrow exception" framing defeated the very false-positive it was added in #174 to prevent. Point release Steps 2/7 at the rule. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
The rule asserted "the green gate is the approval" without ever saying what the gate is made of, and was silent on the question every reader actually has: does bot review substitute for human review? ci-safety documents that github-actions[bot] cannot APPROVE (HTTP 422). SKILL.md Step 7 lists a merge conjunction. Neither says whether a human must sign off, so "green gate is the approval" read as an assertion rather than a definition. State the operator's position outright and name the conjunction. Also: - Authorization is standing, never inferred from the conversation. An agent that stops asking but still needs a grant will manufacture one; production showed an agent reading the operator's challenge to the policy as authorization under it. - A verdict approves only the commit it reviewed. A review whose commit_id is not the head SHA reads as absent, not clean. - CI-config edits join What Still Gates (ci-safety says stop and ask; the rule's red-gate line said fix it). - The Merge action points at the definition instead of restating fields (Copilot on #178). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
… shape gh-aw caught two policy self-consistency breaks. The rule required each verdict to approve only the commit it reviewed, but poll-pr-reviews.sh resolves reviews by bot login and returns no commit_id, and watch-pr-reviews.sh treats any non-none state as satisfying `ready`. A clean verdict on a superseded commit still passes the executable gate. That publishes a rule the repo does not obey (context-artifacts.md Post-Edit Rule Audit). The script lives in an unmerged PR, so the clause defers to land with the gate that enforces it. The ci-safety retitle dropped the `Narrow exception for X.` lead while keeping preconditions and a reset line — still a carve-out, minus the shape context-writing-style.md prescribes. That traded one violation for another. The framing fix belongs in autonomous-shipping, which now names dismissal as an autonomous action and defines approval, so the carve-out keeps its shape and gains a pointer. Copilot: split the two multi-directive bullets, cut the worked examples (context-writing-style sends those to CHANGELOG), drop the "each action names the fields" claim the actions did not honour. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
Restoring ci-safety's `Superseded-Bot-Review Dismissal Carve-Out` title left autonomous-shipping pointing at `Dismissing Superseded Bot Reviews` — a heading that no longer exists. Both reviewers caught it; it is the same Post-Edit Rule Audit failure the carve-out restore was fixing, moved one file over. Also expand "operator ack" — the abbreviation appears nowhere else in the rules (Copilot). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
ae61ee2 to
97b95c6
Compare
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
The new always-on rules/autonomous-shipping.md applies rules/context-writing-style.md to itself, and its current 66-line loaded surface exceeds the rule structure budget for a single-concept rule. Please reduce the rule body to the documented ~25–40 line range, moving rationale/archive detail to the changelog or splitting separate policy if needed.
Generated by PR Policy Review (OpenAI) for #178 · 42.8 AIC · ⌖ 5.96 AIC · ⊞ 14.6K
| - A PR marked not-ready — draft status, a `do-not-merge` or WIP label, a title marker | ||
| - A base branch the task never named — merging a stacked or mis-based PR is not the agreed task | ||
| - Action in a repo the operator does not own (see `rules/external-repo-contributions.md`) | ||
| - Scope the operator never granted — this rule governs how to ship the agreed task, never which task to take on. An out-of-scope boy-scout discovery and drive-by dependency work are new tasks, never standing ship authorization (in-scope cleanup rolls into the current PR per `rules/boy-scout.md` How to Apply) |
There was a problem hiding this comment.
rules/context-writing-style.md says: "3–6 H2 sections per rule, ~25–40 lines total." This new always-on rule is 66 lines, which is well outside that budget for a single-concept rule. Please tighten the loaded rule surface by cutting repeated directives/rationale and moving explanatory detail to CHANGELOG.md, or split genuinely separate policy into another rule with its own synced manifest/README entry.
gh-aw flagged the loaded surface against context-writing-style's ~25-40 line budget. I declined this from Copilot earlier on the multi-aspect exemption, and the exemption does apply — but a gating CHANGES_REQUESTED can't be declined the way a COMMENTED can, and the rule genuinely bloated 37→66 across the session as each adversarial round bolted on a clause. Cut the redundancy, not the coverage: - Merged "Asking Is the Violation" + "Surfacing Is Required" into one "Asking vs Surfacing" section — 11 bullets across 2 sections became 2 bullets in 1, keeping both directives. - Dropped restated lines: "Approval is not the whole test" (What Still Gates already says it), the duplicate human-CHANGES_REQUESTED bullet, "that same conjunction, never a subset" (the approval bullet says it). - Folded rationale clauses into their directives. Every gate the adversarial rounds added survives — platform bypass, Bootstrap-Red, prose holds, PENDING reviews, draft markers, base branch, standing-auth, the asking/surfacing split. 5 H2 sections, no connectives, cross-refs resolve. At 46 lines it's shorter than testing-standards and five other multi-aspect rules. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
Requesting changes for a policy consistency violation: the new autonomous-shipping rule makes Step 7 the exact merge approval gate, then adds separate blockers that apply even when Step 7 is green, while the release skill still instructs agents to merge once Step 7 holds. This conflicts with rules/context-artifacts.md consistency requirements for new rules and changed skills; the merge gate needs one authoritative executable contract.
Generated by PR Policy Review (OpenAI) for #178 · 22.1 AIC · ⌖ 1.37 AIC · ⊞ 35.2K
|
|
||
| ## What Still Gates | ||
|
|
||
| - These block a merge even when Step 7's gate reads green; the agent checks them, the watcher does not |
There was a problem hiding this comment.
rules/context-artifacts.md requires consistency after rule edits: “New rules don't contradict existing ones” and “Skills follow the conventions their own rules prescribe.” This bullet creates a second merge gate after line 19 says “Merge approval is exactly skills/release/SKILL.md Step 7's preconditions,” and skills/release/SKILL.md still says to merge once those Step 7 conditions hold. Fix by making one source authoritative: either move these blockers into Step 7’s preconditions/executable checklist, or stop saying Step 7 is the exact approval gate and update the skill to require this section before merging.
There was a problem hiding this comment.
Fixed in d3e8caf — tightened 66→46 lines. I declined this from Copilot earlier on the multi-aspect exemption, and the exemption does apply (context-writing-style.md line 14) — but a gating CHANGES_REQUESTED can't be declined the way a COMMENTED can, and the rule genuinely bloated 37→66 across the session as each adversarial round bolted on a clause. So I cut redundancy rather than argue:
- Merged
Asking Is the Violation+Surfacing Is Requiredinto oneAsking vs Surfacing— 11 bullets across 2 sections became 2 in 1, both directives kept. - Dropped restated lines: "Approval is not the whole test" (What Still Gates already says it), the duplicate human-CHANGES_REQUESTED bullet, "that same conjunction, never a subset".
Every gate the adversarial rounds added survives — platform bypass, Bootstrap-Red, prose holds, PENDING reviews, draft markers, base branch, standing-auth, the asking/surfacing split. 5 H2 sections, no connectives, cross-refs resolve. At 46 lines it's shorter than testing-standards and five other multi-aspect rules — comfortably inside the exemption now, rather than relying on it at 66.
| ## Green Gate Is the Approval | ||
|
|
||
| - A shipping action is the autonomous next step once its gate reads green | ||
| - Read the gate to resolve doubt; never ask the operator what reading it answers |
| - Read the gate to resolve doubt; never ask the operator what reading it answers | ||
| - Authorization to ship is standing — it lives in this policy and the operator's durable config, in no conversational turn. A challenging question, an ambiguous remark, an earlier "ship it when green", or silence is never the grant | ||
| - No standing grant covers the action ⇒ the gate is absent, not green (see What Still Gates) | ||
| - A harness gate this policy does not govern (safety classifier, permission prompt) is a red gate — surface what it blocked; never re-attempt through another tool |
| ## The Autonomous Actions | ||
|
|
||
| - **Open the PR** — Step 1 readiness checks pass (`skills/release/SKILL.md`) ⇒ push and open | ||
| - **Dismiss superseded bot reviews** — a bot's `CHANGES_REQUESTED` its own later all-clear superseded ⇒ dismiss it via `skills/release/dismiss-stale-reviews.sh`, or a hand dismissal meeting both preconditions (see `rules/ci-safety.md` Superseded-Bot-Review Dismissal Carve-Out) |
|
|
||
| ### Rules | ||
|
|
||
| - **`autonomous-shipping` (new, always-on)** — Opening a PR, dismissing superseded bot reviews, merging, and watching through publish are the autonomous next step once the gate reads green; asking on a green gate is a defect. The autonomy statements already lived in `skills/release/SKILL.md` (Step 2, Step 7), but a skill loads only on invocation — an agent that just finished a task never invoked it, so its always-on context carried the PR mandate with no word on who authorizes shipping. `What Counts as Approval` states the operator's position outright: review is the paired bot fleet, a merge needs no human approval, and the gate is exactly Step 7's preconditions (the rule points there, never restating a weaker or longer copy). `What Still Gates` is the authoritative list of what blocks a merge even on green — platform bypass (`--admin`), an owner-approval carve-out like Bootstrap-Red, a human's `CHANGES_REQUESTED` or prose hold or `PENDING` review, draft/label markers, mis-based PRs, ungranted scope. `Asking Is the Violation` covers approval questions the gate answers; `Surfacing Is Required` covers everything it does not, so refusing to surface scope or a hold is itself a defect. Authorization is standing (policy + durable config), never inferred from any conversational turn. Consumers: an always-on `CLAUDE.md` instruction outranks plugin rules — an "ask before pushing" line there defeats this rule. A commit-scoped-verdict clause (verdict must name the head SHA) is deferred until `poll-pr-reviews.sh` emits `commit_id` and the watcher enforces it. |
gh-aw, fourth variation of one tension: the rule claimed "merge approval is exactly Step 7" while What Still Gates lists blockers Step 7 doesn't check, and SKILL.md says merge once Step 7 holds. Three things disagreeing. Prior rounds tried weaker-than-Step-7, longer-than-Step-7, and adds-fields-while-denying-it. All were the same mistake: pretending Step 7 is the whole gate. It never was. Approval is Step 7's executable preconditions (watcher-checked) AND What Still Gates' conditions (agent-checked) — a human's prose hold, a draft marker, ungranted scope, none of which any script enforces. Stop claiming "exactly Step 7". Name both halves in What Counts as Approval, and add the What-Still-Gates half to SKILL.md Step 7's "Only proceed when" list so the skill and the rule describe the same gate. This converges by removing a false claim, not adding another clause. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
Requesting changes because the new always-on rules/autonomous-shipping.md contains a self-consistency issue under rules/context-artifacts.md: the merge-gate definition currently requires “every What Still Gates condition” instead of requiring those blocking conditions to be absent. That reverses the blocker semantics and conflicts with the changed release-skill gate wording.
Generated by PR Policy Review (OpenAI) for #178 · 27.9 AIC · ⌖ 13 AIC · ⊞ 59.8K
| ## What Counts as Approval | ||
|
|
||
| - Review is the paired bot fleet, not a human sign-off — a merge needs no human approval, except where another always-on rule names an owner-approval precondition (see What Still Gates) | ||
| - The merge gate has two halves, both required: `skills/release/SKILL.md` Step 7's executable preconditions (watcher-checked) AND every What Still Gates condition (agent-checked). Load Step 7 and confirm What Still Gates before merging; this rule restates neither |
There was a problem hiding this comment.
rules/context-artifacts.md requires cross-rule consistency: "New rules don't contradict existing ones." This sentence says the merge gate requires Step 7's preconditions and every What Still Gates condition, which inverts the blocker list below and conflicts with the release-skill wording on this PR (No ... What Still Gates condition applies). Please rewrite this as the absence of blockers, e.g. AND no What Still Gates condition applies or AND every What Still Gates condition has been checked and found absent.
There was a problem hiding this comment.
Fixed in b889027 — precise catch, and a genuine polarity bug I introduced. What Still Gates is a blocker list, so the gate requires those conditions ABSENT, not present. My rule said "AND every What Still Gates condition" (require them); my skill said "No What Still Gates condition applies" (require their absence). They contradicted. Rule now reads "AND no What Still Gates condition applies", matching the skill. Not a rewrite — a one-word inversion I got backwards.
| - A shipping action is the autonomous next step once its gate reads green | ||
| - Read the gate to resolve doubt; never ask the operator what reading it answers | ||
| - Authorization to ship is standing — it lives in this policy and the operator's durable config, in no conversational turn. A challenging question, an ambiguous remark, an earlier "ship it when green", or silence is never the grant | ||
| - No standing grant covers the action ⇒ the gate is absent, not green (see What Still Gates) | ||
| - A harness gate this policy does not govern (safety classifier, permission prompt) is a red gate — surface what it blocked; never re-attempt through another tool |
| - Review is the paired bot fleet, not a human sign-off — a merge needs no human approval, except where another always-on rule names an owner-approval precondition (see What Still Gates) | ||
| - The merge gate has two halves, both required: `skills/release/SKILL.md` Step 7's executable preconditions (watcher-checked) AND every What Still Gates condition (agent-checked). Load Step 7 and confirm What Still Gates before merging; this rule restates neither | ||
| - A gating bot that cannot `APPROVE` posts its all-clear as `COMMENTED` — `github-actions[bot]` gets HTTP 422 (see `rules/ci-safety.md` Superseded-Bot-Review Dismissal Carve-Out) |
| - An ask on a green gate is a defect — the ask manufactures the very gate the policy already opened. Report the action taken, never propose it; never re-ask what the policy grants standing | ||
| - Surface every decision the gate does NOT answer — scope, base branch, a human's prose hold, whether an out-of-scope discovery belongs in the task. These are absent grants, not green ones; re-reading this policy never resolves one. Uncertainty that the rule covers an action means it does not — report and stop |
| ## What Still Gates | ||
|
|
||
| - These block a merge even when Step 7's gate reads green; the agent checks them, the watcher does not | ||
| - A platform-rejected merge — never `--admin`, never a ruleset or branch-protection bypass; surface the blocking rule |
| ## Step 2 — Create PR | ||
|
|
||
| - Once Step 1's readiness checks pass, create the PR automatically — the green readiness checks are the gate. Do not pause to ask a human whether to open it. | ||
| - Once Step 1's readiness checks pass, create the PR automatically — the green readiness checks are the gate. Do not pause to ask a human whether to open it (`rules/autonomous-shipping.md`). |
| - No `rules/autonomous-shipping.md` What Still Gates condition applies — these are agent-checked, not watcher-checked (a human's prose hold or `PENDING` review, a `do-not-merge`/draft marker, a mis-based branch, an owner-approval carve-out, ungranted scope). This half of the gate is not in the `ready` conjunction; confirm it by hand before merging. | ||
|
|
|
|
||
| ### Rules | ||
|
|
||
| - **`autonomous-shipping` (new, always-on)** — Opening a PR, dismissing superseded bot reviews, merging, and watching through publish are the autonomous next step once the gate reads green; asking on a green gate is a defect. The autonomy statements already lived in `skills/release/SKILL.md` (Step 2, Step 7), but a skill loads only on invocation — an agent that just finished a task never invoked it, so its always-on context carried the PR mandate with no word on who authorizes shipping. `What Counts as Approval` states the operator's position outright: review is the paired bot fleet, a merge needs no human approval, and the gate is exactly Step 7's preconditions (the rule points there, never restating a weaker or longer copy). `What Still Gates` is the authoritative list of what blocks a merge even on green — platform bypass (`--admin`), an owner-approval carve-out like Bootstrap-Red, a human's `CHANGES_REQUESTED` or prose hold or `PENDING` review, draft/label markers, mis-based PRs, ungranted scope. `Asking Is the Violation` covers approval questions the gate answers; `Surfacing Is Required` covers everything it does not, so refusing to surface scope or a hold is itself a defect. Authorization is standing (policy + durable config), never inferred from any conversational turn. Consumers: an always-on `CLAUDE.md` instruction outranks plugin rules — an "ask before pushing" line there defeats this rule. A commit-scoped-verdict clause (verdict must name the head SHA) is deferred until `poll-pr-reviews.sh` emits `commit_id` and the watcher enforces it. |
gh-aw: I inverted the polarity. What Still Gates is a blocker list, so the merge gate requires those conditions ABSENT — "no What Still Gates condition applies" — not "every What Still Gates condition". The rule said require-them; the skill (correctly) said require-their-absence. They disagreed. Rule now matches the skill. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
Requesting changes for one loaded-rule prose violation: rules/autonomous-shipping.md uses very as a noise intensifier on a changed line, which rules/context-writing-style.md explicitly tells rule prose to cut unless the word carries a real constraint. The surface-sync updates otherwise line up with the new 24-rule set, and I did not find a separate self-consistency violation in the release-skill gate changes.
Generated by PR Policy Review (OpenAI) for #178 · 29.9 AIC · ⌖ 2.06 AIC · ⊞ 14.6K
|
|
||
| ## Asking vs Surfacing | ||
|
|
||
| - An ask on a green gate is a defect — the ask manufactures the very gate the policy already opened. Report the action taken, never propose it; never re-ask what the policy grants standing |
There was a problem hiding this comment.
rules/context-writing-style.md says to cut “Intensifiers used as noise modifiers: very, extremely, quite, really, fully, exactly, precisely, narrowly, completely” and only keep them when they carry a real constraint. Here very in “the very gate” is rhetorical emphasis, not a constraint. Please drop it (for example, “the ask manufactures the gate the policy already opened”) or move the explanatory flourish to the CHANGELOG.
| - Read the gate to resolve doubt; never ask the operator what reading it answers | ||
| - Authorization to ship is standing — it lives in this policy and the operator's durable config, in no conversational turn. A challenging question, an ambiguous remark, an earlier "ship it when green", or silence is never the grant | ||
| - No standing grant covers the action ⇒ the gate is absent, not green (see What Still Gates) | ||
| - A harness gate this policy does not govern (safety classifier, permission prompt) is a red gate — surface what it blocked; never re-attempt through another tool |
| - An ask on a green gate is a defect — the ask manufactures the very gate the policy already opened. Report the action taken, never propose it; never re-ask what the policy grants standing | ||
| - Surface every decision the gate does NOT answer — scope, base branch, a human's prose hold, whether an out-of-scope discovery belongs in the task. These are absent grants, not green ones; re-reading this policy never resolves one. Uncertainty that the rule covers an action means it does not — report and stop |
|
|
||
| ### Rules | ||
|
|
||
| - **`autonomous-shipping` (new, always-on)** — Opening a PR, dismissing superseded bot reviews, merging, and watching through publish are the autonomous next step once the gate reads green; asking on a green gate is a defect. The autonomy statements already lived in `skills/release/SKILL.md` (Step 2, Step 7), but a skill loads only on invocation — an agent that just finished a task never invoked it, so its always-on context carried the PR mandate with no word on who authorizes shipping. `What Counts as Approval` states the operator's position outright: review is the paired bot fleet, a merge needs no human approval, and the gate is exactly Step 7's preconditions (the rule points there, never restating a weaker or longer copy). `What Still Gates` is the authoritative list of what blocks a merge even on green — platform bypass (`--admin`), an owner-approval carve-out like Bootstrap-Red, a human's `CHANGES_REQUESTED` or prose hold or `PENDING` review, draft/label markers, mis-based PRs, ungranted scope. `Asking Is the Violation` covers approval questions the gate answers; `Surfacing Is Required` covers everything it does not, so refusing to surface scope or a hold is itself a defect. Authorization is standing (policy + durable config), never inferred from any conversational turn. Consumers: an always-on `CLAUDE.md` instruction outranks plugin rules — an "ask before pushing" line there defeats this rule. A commit-scoped-verdict clause (verdict must name the head SHA) is deferred until `poll-pr-reviews.sh` emits `commit_id` and the watcher enforces it. |
gh-aw: "the very gate" — `very` is rhetorical emphasis, not a constraint, and context-writing-style bans noise intensifiers. Now "an approval gate". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
Requesting changes for a rules/context-writing-style.md violation in the new always-on rule: the Asking vs Surfacing bullets combine multiple directives and rationale into non-atomic loaded prose. Split the directives and move non-directive explanation to the changelog so the rule enforces the prose discipline it publishes.
Generated by PR Policy Review (OpenAI) for #178 · 77.9 AIC · ⌖ 4.18 AIC · ⊞ 14.6K
| - An ask on a green gate is a defect — the ask manufactures an approval gate the policy already opened. Report the action taken, never propose it; never re-ask what the policy grants standing | ||
| - Surface every decision the gate does NOT answer — scope, base branch, a human's prose hold, whether an out-of-scope discovery belongs in the task. These are absent grants, not green ones; re-reading this policy never resolves one. Uncertainty that the rule covers an action means it does not — report and stop |
There was a problem hiding this comment.
rules/context-writing-style.md says: "Atomic bullets — one directive per bullet" and "Meta-justification prose explaining why the rule exists — belongs in CHANGELOG." These two bullets pack the defect statement, causal explanation, reporting directive, no-proposal directive, no-re-ask directive, surfacing directive, and uncertainty stop condition into two loaded bullets. Split them into atomic bullets and move any rationale that is not itself a directive to CHANGELOG.md; keep this section as the enforceable decision/stop contract.
There was a problem hiding this comment.
Fixed in de448c3 — the two dense Asking vs Surfacing bullets are now seven atomic ones. This was a self-inflicted tension: tightening 66→46 earlier merged two sections into two multi-directive bullets, trading a line-budget concern for an atomicity violation. Atomicity is the hard rule (line count has the multi-aspect exemption), so it wins. Also split the two other bullets with the same pattern (standing-auth, two-halves gate) proactively. 53 lines — still shorter than five other multi-aspect rules.
gh-aw: the Asking vs Surfacing bullets combined multiple directives and rationale — non-atomic, against context-writing-style's "one directive per bullet". Tightening 66→46 earlier merged two sections into two dense bullets; that traded a line-budget concern for an atomicity violation (atomicity is a hard rule, line count has the multi-aspect exemption). Split Asking vs Surfacing into seven atomic bullets, and proactively split the two other bullets with the same pattern (standing-auth, two-halves gate) so each carries one directive. 51 lines — still shorter than five other multi-aspect rules. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
| ## Green Gate Is the Approval | ||
|
|
||
| - A shipping action is the autonomous next step once its gate reads green | ||
| - Read the gate to resolve doubt; never ask the operator what reading it answers |
| - Authorization to ship is standing — it lives in this policy and the operator's durable config, in no conversational turn | ||
| - A challenging question, an ambiguous remark, an earlier "ship it when green", or silence is never the grant | ||
| - No standing grant covers the action ⇒ the gate is absent, not green (see What Still Gates) | ||
| - A harness gate this policy does not govern (safety classifier, permission prompt) is a red gate — surface what it blocked; never re-attempt through another tool |
|
|
||
| ### Rules | ||
|
|
||
| - **`autonomous-shipping` (new, always-on)** — Opening a PR, dismissing superseded bot reviews, merging, and watching through publish are the autonomous next step once the gate reads green; asking on a green gate is a defect. The autonomy statements already lived in `skills/release/SKILL.md` (Step 2, Step 7), but a skill loads only on invocation — an agent that just finished a task never invoked it, so its always-on context carried the PR mandate with no word on who authorizes shipping. `What Counts as Approval` states the operator's position outright: review is the paired bot fleet, a merge needs no human approval, and the gate is exactly Step 7's preconditions (the rule points there, never restating a weaker or longer copy). `What Still Gates` is the authoritative list of what blocks a merge even on green — platform bypass (`--admin`), an owner-approval carve-out like Bootstrap-Red, a human's `CHANGES_REQUESTED` or prose hold or `PENDING` review, draft/label markers, mis-based PRs, ungranted scope. `Asking Is the Violation` covers approval questions the gate answers; `Surfacing Is Required` covers everything it does not, so refusing to surface scope or a hold is itself a defect. Authorization is standing (policy + durable config), never inferred from any conversational turn. Consumers: an always-on `CLAUDE.md` instruction outranks plugin rules — an "ask before pushing" line there defeats this rule. A commit-scoped-verdict clause (verdict must name the head SHA) is deferred until `poll-pr-reviews.sh` emits `commit_id` and the watcher enforces it. |
| - **Open the PR** — Step 1 readiness checks pass (`skills/release/SKILL.md`) ⇒ push and open | ||
| - **Dismiss superseded bot reviews** — a bot's `CHANGES_REQUESTED` its own later all-clear superseded ⇒ dismiss it via `skills/release/dismiss-stale-reviews.sh`, or a hand dismissal meeting both preconditions (see `rules/ci-safety.md` Superseded-Bot-Review Dismissal Carve-Out) | ||
| - **Merge** — Step 7's preconditions hold ⇒ merge and clean up | ||
| - **Watch through publish** — the merge lands ⇒ watch the run, the registry advance, the moderation clear per `rules/ci-safety.md` Always Watch CI; part of the merge, not a separate decision |
| ## Asking vs Surfacing | ||
|
|
||
| - An ask on a green gate is a defect | ||
| - Report the action taken, never propose it |
| ## What Still Gates | ||
|
|
||
| - These block a merge even when Step 7's gate reads green; the agent checks them, the watcher does not | ||
| - A platform-rejected merge — never `--admin`, never a ruleset or branch-protection bypass; surface the blocking rule |
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
Requesting changes for two policy violations in the new always-on rule: it conflicts with the existing release skill's dirty-branch force-push recovery, and it exceeds the rule length budget from rules/context-writing-style.md. Both issues apply directly to rules/autonomous-shipping.md, which must be self-consistent before it can become policy.
Generated by PR Policy Review (OpenAI) for #178 · 22.8 AIC · ⌖ 8.21 AIC · ⊞ 17.6K
| - A platform-rejected merge — never `--admin`, never a ruleset or branch-protection bypass; surface the blocking rule | ||
| - An owner-approval precondition named by another always-on rule (`rules/ci-safety.md` Bootstrap-Red Carve-Out); no bullet here retires it | ||
| - An unplanned CI-config edit, even to turn a red gate green (`rules/ci-safety.md` Hands Off CI Config) | ||
| - Force-push, history rewrite, tag or release deletion — any action with no undo |
There was a problem hiding this comment.
rules/context-artifacts.md says, under Consistency Check: "New rules don't contradict existing ones." This new always-on gate says force-push is still gated, but skills/release/SKILL.md Step 5 still instructs agents to resolve a dirty branch by rebasing and force-pushing before re-running the watcher. That leaves the release workflow with one surface requiring an autonomous force-push and another saying the action has no standing green gate. Either add the dirty-branch recovery as an explicit carve-out/precondition here, or update the release skill to stop and surface before force-pushing.
There was a problem hiding this comment.
Fixed in a11144a — real catch. The rule gated Force-push unqualified, but SKILL.md Step 5 tells agents to rebase + force-push their own feature branch to recover a dirty branch. The no-undo concern is shared/protected HISTORY, not your own branch — a feature-branch rebase-force-push is routine and reversible. Now: 'Force-push over shared or protected history ... Force-pushing your own feature branch to land a rebase is routine, not gated.' Skill and rule agree.
| - A PR marked not-ready — draft status, a `do-not-merge` or WIP label, a title marker | ||
| - A base branch the task never named — a stacked or mis-based PR is not the agreed task | ||
| - A repo the operator does not own (`rules/external-repo-contributions.md`) | ||
| - Scope never granted — an out-of-scope boy-scout discovery and drive-by dependency work are new tasks, not ship authorization (in-scope cleanup rolls into the PR per `rules/boy-scout.md` How to Apply) |
There was a problem hiding this comment.
rules/context-writing-style.md says, under Structure: "3–6 H2 sections per rule, ~25–40 lines total." This new single-concept always-on rule is 53 lines, so it violates the rule-format budget it must satisfy itself. Trim repeated examples/rationale into the CHANGELOG or consolidate the action/gate bullets so the loaded rule lands back near the 25–40 line budget.
There was a problem hiding this comment.
Surfacing this to the operator rather than tweaking into the opposite violation again — it's a genuine catch-22 with last round's finding. Last round you flagged the Asking vs Surfacing bullets as non-atomic; I split them, growing the rule 46→53 lines. Now you flag 53 > 40. The two context-writing-style requirements — 'atomic bullets, one directive per bullet' AND '~25-40 lines' — cannot both hold for a rule with this many distinct directives: satisfying one violates the other. The multi-aspect exemption (Scope: rules covering one policy area with several sub-aspects may run larger) applies in my reading — this covers shipping autonomy across 5 sub-aspects and at 53 lines is shorter than ci-safety (126), context-artifacts (96), plugin-evals (89), skill-authoring (80), dependency-management (58). You classify it single-concept. That classification is the operator's call on their own policy; flagged for their decision.
gh-aw: the rule gated "Force-push" unqualified, but SKILL.md Step 5 tells agents to rebase + force-push their own feature branch to recover a dirty branch. Contradiction. The no-undo concern is shared/protected HISTORY, not your own branch — force-pushing a feature branch to land a rebase is routine and reversible. Qualified accordingly; the skill and rule now agree. (The line-budget finding on the same review is not addressed here — it is in direct tension with last round's atomic-bullets fix and needs an operator decision; see the PR thread.) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
Requesting changes for one rules/context-artifacts.md violation: the changed CHANGELOG entry does not retain the final load-bearing facts for the rule it archives. It still says the merge gate is exactly Step 7's preconditions and references older section names, while the PR-head rule and release skill now define the merge gate as Step 7's executable preconditions plus the absence of any What Still Gates condition.
Generated by PR Policy Review (OpenAI) for #178 · 20.3 AIC · ⌖ 2.74 AIC · ⊞ 40K
|
|
||
| ### Rules | ||
|
|
||
| - **`autonomous-shipping` (new, always-on)** — Opening a PR, dismissing superseded bot reviews, merging, and watching through publish are the autonomous next step once the gate reads green; asking on a green gate is a defect. The autonomy statements already lived in `skills/release/SKILL.md` (Step 2, Step 7), but a skill loads only on invocation — an agent that just finished a task never invoked it, so its always-on context carried the PR mandate with no word on who authorizes shipping. `What Counts as Approval` states the operator's position outright: review is the paired bot fleet, a merge needs no human approval, and the gate is exactly Step 7's preconditions (the rule points there, never restating a weaker or longer copy). `What Still Gates` is the authoritative list of what blocks a merge even on green — platform bypass (`--admin`), an owner-approval carve-out like Bootstrap-Red, a human's `CHANGES_REQUESTED` or prose hold or `PENDING` review, draft/label markers, mis-based PRs, ungranted scope. `Asking Is the Violation` covers approval questions the gate answers; `Surfacing Is Required` covers everything it does not, so refusing to surface scope or a hold is itself a defect. Authorization is standing (policy + durable config), never inferred from any conversational turn. Consumers: an always-on `CLAUDE.md` instruction outranks plugin rules — an "ask before pushing" line there defeats this rule. A commit-scoped-verdict clause (verdict must name the head SHA) is deferred until `poll-pr-reviews.sh` emits `commit_id` and the watcher enforces it. |
There was a problem hiding this comment.
rules/context-artifacts.md says CHANGELOG consolidation must "retain load-bearing facts (what changed, references)". This entry still describes an older design: it says "the gate is exactly Step 7's preconditions", but the rule now says the merge gate has two required halves, Step 7's executable preconditions plus no What Still Gates condition, and Step 7 now adds that same agent-checked half. Please update this entry to match the final contract and the current section names (Asking vs Surfacing), or trim the stale design detail entirely.
Operator decision on the atomic-vs-budget catch-22: amend context-writing-style at the source rather than oscillate the rule. gh-aw flagged autonomous-shipping's line count (53 > 40) one round, then its non-atomic bullets when I merged to shrink — the two style requirements can't both hold for a many-directive rule. The multi-aspect exemption existed but "may run larger" was too vague for gh-aw to apply, so it kept classifying the rule single-concept. Now countable: 4+ named H2 sub-aspect sections => multi-aspect => exempt from BOTH the line and section budgets, still owing atomic bullets and all prose discipline. Verified against the tree — every rule over 40 lines has 5-11 sections, so the criterion describes what's committed (Post-Edit Rule Audit). autonomous-shipping (5 sections) is now unambiguously exempt; atomic bullets still bind and are satisfiable. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X
There was a problem hiding this comment.
Policy loaded: 24 rule files from rules/ (PR head).
Requesting changes because the PR currently leaves the shipping gate contract inconsistent across the new rule, release skill, and changelog. The applicable rules are rules/context-artifacts.md for cross-surface consistency and avoiding duplicated contract statements, plus the changed rules/context-writing-style.md discipline that still requires non-numeric prose quality even for multi-aspect rules.
Generated by PR Policy Review (OpenAI) for #178 · 78.2 AIC · ⌖ 8.63 AIC · ⊞ 14.6K
| ### Rules | ||
|
|
||
| - **`context-writing-style`: make the multi-aspect budget exemption falsifiable** — the exemption existed ("rules covering several sub-aspects may run larger") but was too vague to apply consistently — a gh-aw reviewer flagged `autonomous-shipping`'s line count as a budget violation across successive rounds while it also demanded atomic bullets, an unsatisfiable pair for a rule with many directives. The exemption now has a countable criterion: a rule with 4+ named H2 sub-aspect sections is multi-aspect and exempt from BOTH the ~25-40 line and 3-6 section budgets, while still owing every non-numeric discipline (atomic bullets, connective/intensifier bans, carve-out format). Verified against the tree: all 12 rules over 40 lines have 5-11 sections, so the criterion describes what's committed. Resolves the atomic-vs-budget catch-22 for `autonomous-shipping` (5 sections) and any future multi-directive rule. | ||
| - **`autonomous-shipping` (new, always-on)** — Opening a PR, dismissing superseded bot reviews, merging, and watching through publish are the autonomous next step once the gate reads green; asking on a green gate is a defect. The autonomy statements already lived in `skills/release/SKILL.md` (Step 2, Step 7), but a skill loads only on invocation — an agent that just finished a task never invoked it, so its always-on context carried the PR mandate with no word on who authorizes shipping. `What Counts as Approval` states the operator's position outright: review is the paired bot fleet, a merge needs no human approval, and the gate is exactly Step 7's preconditions (the rule points there, never restating a weaker or longer copy). `What Still Gates` is the authoritative list of what blocks a merge even on green — platform bypass (`--admin`), an owner-approval carve-out like Bootstrap-Red, a human's `CHANGES_REQUESTED` or prose hold or `PENDING` review, draft/label markers, mis-based PRs, ungranted scope. `Asking Is the Violation` covers approval questions the gate answers; `Surfacing Is Required` covers everything it does not, so refusing to surface scope or a hold is itself a defect. Authorization is standing (policy + durable config), never inferred from any conversational turn. Consumers: an always-on `CLAUDE.md` instruction outranks plugin rules — an "ask before pushing" line there defeats this rule. A commit-scoped-verdict clause (verdict must name the head SHA) is deferred until `poll-pr-reviews.sh` emits `commit_id` and the watcher enforces it. |
There was a problem hiding this comment.
rules/context-artifacts.md says under CHANGELOG Hygiene: "Consolidation groups related entries, collapses redundant detail, retains load-bearing facts (what changed, references)". This entry now says the merge gate is "exactly Step 7's preconditions", but the changed rule and skill define the gate as Step 7's executable preconditions and no What Still Gates condition applying. Please update the changelog entry to match the shipped contract so the archive does not preserve the stale one-half gate.
|
|
||
| - Review is the paired bot fleet, not a human sign-off — a merge needs no human approval, except where another always-on rule names an owner-approval precondition (see What Still Gates) | ||
| - The merge gate has two halves, both required: `skills/release/SKILL.md` Step 7's executable preconditions hold (watcher-checked) AND no What Still Gates condition applies (agent-checked) | ||
| - Load Step 7 and confirm What Still Gates before merging; this rule restates neither |
There was a problem hiding this comment.
rules/context-artifacts.md requires consistency after modifying rules: "New rules don't contradict existing ones" and "Rules state the contract". This bullet says the rule restates neither half of the merge gate, but this same new file defines the What Still Gates half in the section below. Please rewrite this to say only that Step 7's executable preconditions are not restated here, or otherwise remove the false "neither" claim.
| - Every non-empty `reviews.*.body` in the returned snapshot has been read in full — a `COMMENTED` state with zero inline comments is not a license to skip the body (see `rules/reviewer-feedback-reading.md`), AND | ||
| - Every inline comment from Step 5's `inline_comments` count has a `Fixed in <sha>` or `Declining — <reason>` reply per Step 6 (verify by listing the PR's review comments — the poll script tracks counts, not reply state, so the operator confirms thread closure). | ||
| - Every inline comment from Step 5's `inline_comments` count has a `Fixed in <sha>` or `Declining — <reason>` reply per Step 6 (verify by listing the PR's review comments — the poll script tracks counts, not reply state, so the operator confirms thread closure), AND | ||
| - No `rules/autonomous-shipping.md` What Still Gates condition applies — these are agent-checked, not watcher-checked (a human's prose hold or `PENDING` review, a `do-not-merge`/draft marker, a mis-based branch, an owner-approval carve-out, ungranted scope). This half of the gate is not in the `ready` conjunction; confirm it by hand before merging. |
There was a problem hiding this comment.
rules/context-artifacts.md says "Don't duplicate long command literals or contract statements between rules and skills" and "Rules state the contract; Skills (or their scripts) carry the executable form". This skill now duplicates a partial list of What Still Gates conditions from rules/autonomous-shipping.md, and the parenthetical already omits several blockers from that rule. Please keep this as a reference to rules/autonomous-shipping.md without copying the condition list, or make the executable check live in one script/section that both surfaces use.
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
rules/ci-safety.md:22
- The PR description says this carve-out was retitled and reopened more affirmatively, but the section header and lead bullet still read as the older “Superseded-Bot-Review Dismissal Carve-Out” + “Narrow exception … not a bypass …” framing. Either the description should be adjusted, or the section should be updated to match the stated intent.
## Superseded-Bot-Review Dismissal Carve-Out
- Narrow exception for dismissing a review gate — not a bypass when the gate is a bot's `CHANGES_REQUESTED` that the same bot later superseded with an all-clear re-review
- Dismissal under this exception is autonomous — never pause for the operator to confirm it (see `rules/autonomous-shipping.md`)
| - `What to Cut` and `Structure` do not govern CHANGELOG. `What to Cut` names CHANGELOG as where the stripped explanation goes; a connective ban there would leave it nowhere to live. The rule reaches CHANGELOG only to say what belongs in it | ||
| - Line-count and section-count budgets target single-concept rules; rules that cover one coherent policy area with several sub-aspects (e.g., `plugin-evals` covering coverage/lift/persistence/naming/hygiene; `context-artifacts` covering structure/review/sync/audit; `skill-authoring` covering frontmatter/preamble/steps/calls) may run larger | ||
| - The ~25–40 line and 3–6 section budgets bind single-concept rules only. A rule with 4 or more named H2 sub-aspect sections is multi-aspect and exempt from both numeric budgets (e.g. `plugin-evals` covering coverage/lift/persistence/naming/hygiene; `context-artifacts` covering structure/review/sync/audit; `autonomous-shipping` covering green-gate/approval/actions/asking/gating) | ||
| - A multi-aspect rule still owes every non-numeric discipline in full — atomic bullets, the connective and intensifier bans, carve-out format. Exempt from the counts, never from the prose quality |
Author-Model: claude-opus-4-8
Summary
Four symptoms from day-to-day agent work — agents ask before opening a PR, won't dismiss stale bot reviews without a go-ahead, ask before merging, and get classifier-blocked when they do try to act — trace to one root cause and one framing bug.
Root cause: the autonomy statements live only in the release skill.
skills/release/SKILL.mdStep 2 already says "create the PR automatically… Do not pause to ask a human whether to open it", and Step 7 says the same for merge. But a skill loads only on invocation. An agent that has just finished implementing a task has never invoked the release skill, so its always-on context carriesci-safety's PR mandate with no word on who authorizes opening one. Agents fill the gap by asking — and per the operator's own recorded finding, the ask is what manufactures the approval gate. The classifier isn't blocking autonomy; it's responding to a question the agent didn't need to raise.Framing bug: the dismissal permission is titled like a hazard. PR #174 added the dismissal carve-out specifically so agents would "stop false-positiving a legitimate dismissal as gate-gaming." Titling it Superseded-Bot-Review Dismissal Carve-Out and opening with "Narrow exception" undid that — agents read danger and asked for a go-ahead on a dismissal
dismiss-stale-reviews.shalready validates deterministically.Changes:
rules/autonomous-shipping.md(new, always-on) — one contract for all four actions: open the PR, dismiss superseded bot reviews, merge, watch through publish. Names the gate fields per action, and states that asking on a green gate is a defect. Bounded by four surviving gates: red/absent/ambiguous gate, no-undo actions, humanCHANGES_REQUESTED, unowned repos.rules/ci-safety.md— carve-out retitled to Dismissing Superseded Bot Reviews and reopened with the affirmative permission. Preconditions andGATING_BOTSscoping unchanged; the reset line still gates every dismissal the two preconditions miss.skills/release/SKILL.md— Steps 2 and 7 reference the rule so the skill and always-on context agree on one contract.Note for consumers: an always-on instruction in your own
CLAUDE.mdoutranks plugin rules. An "ask before pushing" line there will defeat this rule — that was the other half of this diagnosis locally.Test plan
tessl plugin lint— validcontext-writing-style.mdplugin.json24 rules =rules/24 files = README count; rules table + CHANGELOG updated🤖 Generated with Claude Code
https://claude.ai/code/session_01JgdWmv7KBj91nxbVjMsj7X