feat(autonomy): ship the autonomous-pipeline reminder as a reusable contract - #2032
Conversation
…ontract The guidance existed only hand-authored inline in two of this repository's three lane launch prompts. That is a launch surface for these lanes, not a reusable artifact for an adopting org's own pipeline, which was the real remainder the alignment audit left open. reference/autonomous-pipeline-reminder.md states the two stopping failures a pipeline cannot recover from — a turn ending on unexecuted intent, and a turn stopping to ask permission nobody is there to give — then gives the paste-ready clause set, with the companion checkpoint instruction folded in so a consumer pastes one block rather than assembling two. The clause set is authored locally rather than reproduced from the guide it derives from, per this repository's rule against hand-copying upstream content. Its citation and recheck trigger live in the plugin README, because reference/ contracts are written in surface classes and may not name vendors. Two boundaries ship with it. An attended lane deliberately does not carry the reminder — "recommend, then wait for my direction" is the opposite posture — so the two-of-three split is the contract rather than an inconsistency. And the lane-stop gate mechanizes exactly one clause: it performs no content classification beyond its sentinel check, so it cannot tell a blocked-on-user stop from a lazy one. That scope is now stated in the gate's own header, so a reader does not infer coverage it does not have. Closes #2010 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NNmc2T3y81efZTaDZHerWo
|
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 finished @kyle-sexton's task in 39s —— View job Security review
Scope reviewed: all 6 files changed in this PR (
No security issues found. This PR is documentation-and-comment-only:
Nothing here falls into command/SQL/path/template injection, authz/access-control, credential handling, or CI trust-boundary categories. |
|
Claude finished @kyle-sexton's task in 6m 1s —— View job Review complete
I reviewed all 6 changed files ( Findings (posted inline)
Everything else checked out
Unable to verify (author-claimed, not independently confirmed)My sandboxed shell in this lane only allows read-only |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7c80f4de1c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Claude has reviewed this PR 3 times. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
Coverage note on the provenance pointer
That is the correct resolution of the contract, but it is a drift seam: a later README restructure could rot the pointer silently. I could not confirm from this repository's own files that anything gates relative-link integrity — Stating it rather than leaving it implicit: treat relative-link coverage for this pointer as unverified. If the offline lane does cover it, nothing needs doing. If it does not, the mitigation is a one-line anchor check rather than moving the citation back — |
…se claim Review caught three defects in the first draft, two of them self-contradictions inside the block whose entire purpose is removing ambiguity. The block authorized "opening a draft" and then told the pipeline to pause for any action that leaves the working environment. Opening a draft leaves the working environment. The pause test is now irreversibility, an outward action the original request did not ask for, a scope change, or user-only input — and the block says outright that visibility outside the working tree is not by itself a reason to ask. The discarded clause was mine, not the source guide's, whose test is reversible-and-follows-from-the-request. The block also said offering follow-ups once the task is done is fine, then listed "an offer to continue, expand, or clean up afterwards" among the shapes never to end on. Naming further work is a report when the run is complete and a deferral mid-run, so the enumerated shape is now the mid-run case specifically, and the discriminator — whether the run is over — is stated rather than left to inference. Third, the file claimed this plugin's worker and merge lanes carry the reminder. They do not: a repo-wide grep finds no reference to it, because launch prompts are pasted into a terminal that may have no plugin installed and stay self-contained by design. The text now says that plainly, and it strengthens rather than weakens the case for the file — the clauses existed only as prose duplicated across two launch surfaces, reusable by nobody. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NNmc2T3y81efZTaDZHerWo
All three findings addressed in 00e5fdfBoth reviewers were right, and two of the three were self-contradictions inside the block whose entire purpose is removing ambiguity. Thanks — these were mine. 1. Draft-vs-pause contradiction (Codex, line 37). The block authorized "opening a draft" and then said pause for any action that leaves the working environment. Opening a draft leaves the working environment. The discarded clause was my addition, not the source guide's — the guide's test is reversible and follows from the original request. The pause test is now irreversibility, an outward action the request did not ask for, a scope change, or user-only input, and the block states outright that visibility outside the working tree is not by itself a reason to ask. 2. Follow-up contradiction (Claude, line 53). "Offering follow-ups once the task is done is also fine" against "an offer to continue, expand, or clean up afterwards" in the never-end-on list. Naming further work is a report when the run is complete and a deferral mid-run. The enumerated shape is now "a mid-run offer to do work that is already within this run's scope", and the discriminator — whether the run is over — is stated in the block rather than left to inference. 3. False claim about the lanes (both, line 70). Verified: no lane references this file. The text now says so plainly, and it strengthens the case for the file rather than weakening it — launch prompts are pasted into a terminal that may have no plugin installed, so they stay self-contained by design, which is exactly why the clauses existed only as prose duplicated across two launch surfaces and reusable by nobody. Re-verified after the edits: |
|
Claude finished @kyle-sexton's task in 1m 18s —— View job Security review
Scope reviewed: all 6 files changed in this PR across both commits (
No security issues found. This PR is documentation-and-comment-only across both commits:
Nothing here falls into command/SQL/path/template injection, authz/access-control, credential handling, or CI trust-boundary categories. (Prior review threads on this PR flagged prose-consistency/accuracy issues in the reminder text — those are correctness/documentation concerns, not security findings, and are out of scope for this lane.) |
|
Claude finished @kyle-sexton's task in 4m 22s —— View job Review complete
This PR was already reviewed twice (by Claude and by Codex), and the follow-up commit What the fix commit got right
What's still open (posted inline)The "lanes carry the reminder" false claim was fixed in one place but not the other. The fix commit only touched Everything else checked
Not independently verified (author-claimed in the PR body, would need tools not exercised in this pass): |
The previous fix corrected the reference file and the changelog and left the convention doc saying the opposite. Read against Pointer-not-copy's own definition twelve lines above it, the paragraph implied the worker and merge lane launch prompts consume reference/autonomous-pipeline-reminder.md. They do not, and the reference file now says so itself. The paragraph now states what is true: the clauses are hand-authored inline in each autonomous lane's launch prompt, deliberately, because a paste block must work in a terminal with no plugin installed — and that is the one place in this doc where Pointer-not-copy does not reach, since the rule governs a mechanism a plugin owns and a self-contained paste block owns its own text. The reference is named as the once-stated clause set an adopting org drops into its own pipeline, and as the wording a lane author should read when changing these clauses, rather than as a source the prompts import. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NNmc2T3y81efZTaDZHerWo
|
Claude finished @kyle-sexton's task in 1m 4s —— View job Security review
Scope reviewed: all 6 files changed across all 3 commits (
The third commit ( No security issues found. This PR remains documentation-and-comment-only end to end:
Nothing here falls into command/SQL/path/template injection, authz/access-control, credential handling, or CI trust-boundary categories. (The prior review threads on this PR — lane-coverage accuracy and an internal wording contradiction — are correctness/documentation concerns, already addressed across the fix commits, and out of scope for this security lane.) |
|
Claude finished @kyle-sexton's task in 2m 28s —— View job Code review complete
This PR has been through three review rounds already (Claude ×3, Codex ×1), which surfaced three real findings — two internal contradictions in the paste-ready reminder block, and a false claim that this repo's worker/merge lanes consume the new reference file. Commit It does.
This now agrees with the corrected I also re-checked the two earlier contradictions fixed in No new findings. All three previously-flagged issues (two contradictions, one false claim) are now resolved and consistent across every file that restates them. Not independently verified in this pass: |
Closes #2010
Summary
The third follow-up from the Fable 5 prompting-guide alignment audit (#2000). The issue named the
real remainder plainly: nothing shipped the autonomous-pipeline reminder as a reusable artifact for
a consumer's own pipeline — it existed only hand-authored inline in two of this repository's three
lane launch prompts, which is a launch surface for these lanes and not something anyone else can
use. The issue left one shape to decide first: whether a pointer plus a locally-authored equivalent
earns its place, or whether the doctrine surface already suffices.
It earns its place.
autonomyis the consumer-facing autonomous-pipeline seam an adopting orginstalls and binds;
playbooks:fable-5is a separately installable doctrine plugin with nodependency wiring between them. An org that installs
autonomyto run a governed pipeline shouldnot have to also install and arm a second plugin to learn that its pipeline must not end a turn on
unexecuted intent. This is the same composition reasoning applied to
context-guardin #2031.Fix
New:
plugins/autonomy/reference/autonomous-pipeline-reminder.md(0.12.3→0.13.0).The file states the two stopping failures a pipeline cannot recover from — a turn ending on
unexecuted intent, and a turn stopping to ask permission nobody is there to give — notes that both
are stopping failures rather than doing failures (which is why review catches them late: the
artifact looks reasonable and only the absent effect gives it away), then gives the paste-ready
clause set:
real change of scope, or input only the launcher can supply;
not a request;
reporting one, do it now with tool calls;
The companion checkpoint instruction the source guide asks to be paired with this reminder is folded
into the pause clause, so a consumer pastes one block instead of noticing a cross-reference and
assembling two.
Locally authored, not reproduced. Copying the upstream text would have violated this
repository's own rule against hand-copying upstream content — which is exactly why the issue was
filed rather than fixed in #2000. The wording is this repository's own; the citation, the exact
section, and the recheck trigger are recorded in the plugin README.
Two boundaries ship with it, because an artifact that reads as universally applicable gets
applied where it does damage:
the opposite posture, and pasting the block into one converts a working human-in-the-loop review
into an agent acting on its own recommendations. So the two-of-three split the issue observed is
the contract, not an inconsistency — this repository's attended-queue prompt opens with "I am
present. Recommend, then wait for my direction before mutating."
lane-stop-gatehook mechanizes exactly one clause. It performs no content classificationbeyond its literal sentinel check, so it cannot tell a blocked-on-user stop from a lazy one; both
get the same single nudge. That over-blocking stays benign — a genuinely blocked lane costs one
wasted nudge and then stops with the operator alerted — but it is over-blocking, not
classification. The scope is now stated in the gate's own header, so a reader of the hook does
not infer coverage it does not have.
Also changed:
docs/conventions/loop-lane/README.mdnow points at the reference for the clauseset rather than leaving it implicit in the launch prompts, keeping only the two boundaries that are
lane-topology facts rather than reminder content.
Verification
scripts/validate-plugins.sh— passes. This caught a real contract violation on the first run:autonomy reference/ contracts must use surface classes, never vendor names(
scripts/validate-plugin-contracts.mjs:236). The provenance citation moved to the pluginREADME.md, which is the surface that may name a vendor, andreference/points at it. Greppedthe new file for every banned token — clean.
python3 scripts/check-contract-clause-coverage.py— passes; 4 canonical surfaces, 14 taggedrestatements, 10 surfaces that point rather than restate.
scripts/check-changelog-parity.sh --check-bump origin/mainand--check-order— the versionbump carries its
## [0.13.0]entry; 72 changelogs read newest-first.shellcheck plugins/autonomy/hooks/lane-stop-gate.sh— clean. The hook edit is comment-only; noexecutable line changed.
markdownlint-cli2over the four changed/added markdown files — 0 issues.node scripts/generate-catalog.mjs— catalog already in sync (no manifest description change).session and its "Rare cases of early stopping" snippet read verbatim; the local wording was then
revised to cover two clauses an earlier draft had missed (a plan or list of remaining steps, and
an analysis standing in place of acting on it) and to add the scope-change pause condition from
the companion checkpoint instruction.
Related
turns on a different decision.
— fetched this session for the "Rare cases of early stopping" clause set and the "Strong
instruction following" checkpoint instruction it pairs with.
Scope note
The issue judged the gate's partial coverage low priority rather than a defect, and this PR does not
change that judgement or the gate's behavior. It closes the documentation half — the reusable
artifact, and an honest statement of what the mechanism covers — and leaves the gate's classification
limits as they are, now stated rather than implicit.