Skip to content

feat(autonomy): ship the autonomous-pipeline reminder as a reusable contract - #2032

Merged
kyle-sexton merged 3 commits into
mainfrom
feat/autonomous-pipeline-reminder
Aug 8, 2026
Merged

feat(autonomy): ship the autonomous-pipeline reminder as a reusable contract#2032
kyle-sexton merged 3 commits into
mainfrom
feat/autonomous-pipeline-reminder

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

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. autonomy is the consumer-facing autonomous-pipeline seam an adopting org
installs and binds; playbooks:fable-5 is a separately installable doctrine plugin with no
dependency wiring between them. An org that installs autonomy to run a governed pipeline should
not 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-guard in #2031.

Fix

New: plugins/autonomy/reference/autonomous-pipeline-reminder.md (0.12.30.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:

  • proceed without asking on anything reversible that follows from the original request;
  • pause only for a destructive or irreversible action, one that leaves the working environment, a
    real change of scope, or input only the launcher can supply;
  • ask once and never re-ask what is already settled — offering follow-ups once done is a report,
    not a request;
  • read the final paragraph back before ending a turn, and if it describes an action rather than
    reporting one, do it now with tool calls;
  • an enumeration of the shapes that are work orders to act on rather than messages to end on;
  • end the turn only on completion or a genuine block, and say what the block is.

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:

  • An attended lane deliberately does not carry it. "Recommend, then wait for my direction" is
    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."
  • The lane-stop-gate hook mechanizes exactly one clause. It performs no content classification
    beyond 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.md now points at the reference for the clause
set 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 plugin
    README.md, which is the surface that may name a vendor, and reference/ points at it. Grepped
    the new file for every banned token — clean.
  • python3 scripts/check-contract-clause-coverage.py — passes; 4 canonical surfaces, 14 tagged
    restatements, 10 surfaces that point rather than restate.
  • scripts/check-changelog-parity.sh --check-bump origin/main and --check-order — the version
    bump 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; no
    executable line changed.
  • markdownlint-cli2 over the four changed/added markdown files — 0 issues.
  • node scripts/generate-catalog.mjs — catalog already in sync (no manifest description change).
  • Clause coverage checked against the source, not from recall. The guide page was fetched this
    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

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.

…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
@cursor

cursor Bot commented Aug 8, 2026

Copy link
Copy Markdown

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

claude Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 39s —— View job


Security review

  • Gather context (PR diff, changed files)
  • Review each changed file for security issues
  • Post findings

Scope reviewed: all 6 files changed in this PR (git diff origin/main...HEAD):

  • docs/conventions/loop-lane/README.md — prose addition only.
  • plugins/autonomy/.claude-plugin/plugin.json — version bump 0.12.30.13.0, no other fields touched.
  • plugins/autonomy/CHANGELOG.md — new changelog entry, prose only.
  • plugins/autonomy/README.md — new documentation section, prose only.
  • plugins/autonomy/hooks/lane-stop-gate.sh8-line addition is a comment block only (a SCOPE note above the existing DEFAULT-OFF comment); no executable line changed, sentinel check and control flow are untouched.
  • plugins/autonomy/reference/autonomous-pipeline-reminder.md — new file, all Markdown prose (a paste-ready prompt clause set for a consumer's own pipeline).

No security issues found. This PR is documentation-and-comment-only:

  • No GitHub Actions workflow files are touched, so there's no pull_request_target/workflow_run trust-boundary or github context injection surface here.
  • No hook logic changed — lane-stop-gate.sh's diff is entirely new comment lines; the sentinel-matching and exit-path behavior are byte-for-byte identical to origin/main.
  • No secrets, tokens, or credentials are introduced or handled.
  • No new code execution paths, shell command construction, or file-path handling was added anywhere in the diff.
  • The new reference file is inert prompt text (Markdown) intended to be pasted by a consumer into their own pipeline's prompt — it defines no mechanism and executes nothing itself.
  • The plugin.json change is a version-string bump only; no manifest permission or trust-surface field changed.

Nothing here falls into command/SQL/path/template injection, authz/access-control, credential handling, or CI trust-boundary categories.

@claude

claude Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 6m 1s —— View job


Review complete

I reviewed all 6 changed files (docs/conventions/loop-lane/README.md, plugins/autonomy/.claude-plugin/plugin.json, plugins/autonomy/CHANGELOG.md, plugins/autonomy/README.md, plugins/autonomy/hooks/lane-stop-gate.sh, plugins/autonomy/reference/autonomous-pipeline-reminder.md) against origin/main, plus cross-checked claims against the rest of the repo (not modifying anything, per the review-lane's scope).

Findings (posted inline)

  1. reference/autonomous-pipeline-reminder.md#L69-70 — the "this repo's worker/merge lanes carry the reminder" claim doesn't match the repo. I grepped prompts/loops/loop-lane-prompts.md — the actual "Ready to paste" launch prompts for this repo's own Worker/Merge lanes (and the generic {{REPO}} templates) — for every distinctive phrase in the new reminder (unexecuted intent, permission nobody is there to give, proceed without asking, read your own final paragraph back, etc.). None appear anywhere in that 1951-line file, and this PR's diff never touches it. So as shipped, this repo's own worker/merge lanes do not carry the reminder — contradicting both this line and the parallel present-tense wording added to docs/conventions/loop-lane/README.md#L596 ("An autonomous lane carries a standing reminder..."). That's a meaningful gap for a PR whose stated purpose is making this a consumable artifact — this repo's own lanes are the natural reference implementation and don't yet consume it. This also means the PR body's premise — that the guidance "existed only hand-authored inline in two of this repository's three lane launch prompts" before this PR — isn't evidenced by anything in the tracked prompt file either; the diff never deletes such content from it, so if it existed it was only ever in ephemeral, unpasted session text.

  2. reference/autonomous-pipeline-reminder.md#L41-53 — the paste-ready block contradicts itself. Lines 41–42 say "Offering follow-ups once the task is done is also fine — that is a report, not a request," while line 53 lists "an offer to continue, expand, or clean up afterwards" as a shape that must be acted on rather than ended a turn on. A pipeline pasting this verbatim gets opposite instructions for the same situation. Given the whole point of the artifact is eliminating exactly this stop/continue ambiguity, the wording should distinguish "reporting available, separate follow-up work" (fine to end on) from "offering to continue/expand the current task" (not fine).

Everything else checked out

  • Version bump (0.12.30.13.0) matches the CHANGELOG.md entry and is a correct minor bump for new content.
  • reference/ file carries no vendor tokens (verified against validate-plugin-contracts.mjs's banned-token list: github|gitlab|bitbucket|slack|anthropic|claude|openai|copilot|cursor|devin); provenance is correctly deferred to README.md, consistent with how every other file under plugins/autonomy/reference/ handles vendor references.
  • ../README.md relative link from the new reference file resolves correctly.
  • Pointer-not-copy and the "rule against hand-copying upstream content" are both real, pre-existing conventions elsewhere in the repo (docs/conventions/loop-lane/README.md:13, docs/topics/shadowed-skill-renames/PLAN.md:55) — not invented for this PR.
  • lane-stop-gate.sh diff is comment-only, as claimed; no executable line changed.
  • CHANGELOG version-heading style (no dates) matches every other entry in the file.

Unable to verify (author-claimed, not independently confirmed)

My sandboxed shell in this lane only allows read-only git/gh-style commands — node, python3, bash <script>, and shellcheck invocations were all blocked by the permission gate. I could not independently run scripts/validate-plugins.sh, scripts/check-contract-clause-coverage.py, scripts/check-changelog-parity.sh, shellcheck, markdownlint-cli2, or node scripts/generate-catalog.mjs. The PR body's reported results for those (all passing, specific counts for clause coverage) are author-claimed and unverified by this review — CI should be the actual gate on those.

Branch: feat/autonomous-pipeline-reminder

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread plugins/autonomy/reference/autonomous-pipeline-reminder.md Outdated
Comment thread plugins/autonomy/reference/autonomous-pipeline-reminder.md Outdated
Comment thread plugins/autonomy/reference/autonomous-pipeline-reminder.md Outdated
Comment thread plugins/autonomy/reference/autonomous-pipeline-reminder.md Outdated
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown

Claude has reviewed this PR 3 times. The lane skips further automatic reviews after 5; deleting this comment resets the count.

@kyle-sexton

Copy link
Copy Markdown
Contributor Author

Coverage note on the provenance pointer

scripts/validate-plugin-contracts.mjs:236 bans vendor names under plugins/autonomy/reference/, so the citation and recheck trigger for the reminder's clause set live in the plugin README.md while the clause set itself lives in reference/autonomous-pipeline-reminder.md, which points at the README with a relative link.

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 — .github/workflows/link-check.yml is the weekly external-URL lane and explicitly advisory, and its header refers to a separate offline lychee check I could not locate in-repo (it may live inside the ci-workflows markdown composite action, which is referenced by SHA and not readable here).

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 — reference/ may not name the vendor either way.

…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
@kyle-sexton

Copy link
Copy Markdown
Contributor Author

All three findings addressed in 00e5fdf

Both 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: validate-plugins.sh passes (including the reference/ vendor-name contract), markdownlint clean, changelog order clean.

@claude

claude Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 18s —— View job


Security review

  • Gather context (PR diff, changed files)
  • Review each changed file for security issues
  • Post findings

Scope reviewed: all 6 files changed in this PR across both commits (7c80f4d, 00e5fdf), diffed against origin/main:

  • docs/conventions/loop-lane/README.md — +11 lines, prose only.
  • plugins/autonomy/.claude-plugin/plugin.json — version bump 0.12.30.13.0, no other field touched. permalink
  • plugins/autonomy/CHANGELOG.md — new changelog entries, prose only.
  • plugins/autonomy/README.md — new documentation section, prose only.
  • plugins/autonomy/hooks/lane-stop-gate.sh — an 8-line SCOPE comment block added (L13-19). Diffed byte-for-byte against origin/main: every line of sentinel matching, arm-record trust resolution, marker-consumption ledger, and control flow is unchanged — the diff is comment-only.
  • plugins/autonomy/reference/autonomous-pipeline-reminder.md — new file (first commit), then revised prose (second commit fixing two internal contradictions + a false claim about lane coverage). All Markdown prose — a paste-ready prompt clause set for a consumer's own pipeline. Defines no mechanism and executes nothing itself.

No security issues found. This PR is documentation-and-comment-only across both commits:

  • No GitHub Actions workflow files touched — no pull_request_target/workflow_run trust-boundary surface, no permissions: change.
  • No hook logic changed in lane-stop-gate.sh — verified the full diff line-by-line; the sentinel regex-escaping, the trusted-config precedence chain (managed settings → arm record → user settings → default-off), the marker-consumption ledger, and the fail-open exit paths are byte-for-byte identical to origin/main. The new comment block accurately describes existing behavior; it doesn't alter it.
  • No secrets, tokens, or credentials introduced or handled.
  • No new code execution paths, shell command construction, or file-path handling anywhere in the diff.
  • The new/revised reference file is inert prompt text intended for a consumer to paste into their own pipeline prompt — it has no execution surface in this repository.
  • plugin.json change is a version-string bump only; no manifest permission or trust-surface field changed.

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.)
· Branch: feat/autonomous-pipeline-reminder

@claude

claude Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 4m 22s —— View job


Review complete

  • Gather context (PR diff, changed files, prior review threads)
  • Check whether commit 00e5fdf actually resolves the two contradictions + false claim flagged by prior reviews
  • Review remaining files for correctness / CLAUDE.md alignment
  • Post findings

This PR was already reviewed twice (by Claude and by Codex), and the follow-up commit 00e5fdf ("resolve two contradictions in the reminder and one false claim") addresses most of that feedback. I focused this pass on verifying whether the fix commit actually closed each prior finding, rather than re-deriving them from scratch.

What the fix commit got right

  • The follow-up/offer contradiction (flagged by both Claude and Codex-adjacent review): reference/autonomous-pipeline-reminder.md lines 45–48 and 59 now distinguish "naming further work once the run is genuinely complete" (a report, fine to end on) from "a mid-run offer to do work already within this run's scope" (not fine — the enumerated shape). Read together, these no longer conflict.
  • Codex's external-action pause conflict (draft PRs / follow-ups vs. "pause for anything that leaves the working environment"): the pause clause now reads "an outward action the original request did not ask for" instead of "an action that leaves the working environment" (lines 36–39). Since committing, opening a draft, and filing a follow-up are explicitly pre-authorized two lines above, they no longer trip the pause condition.

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 plugins/autonomy/reference/autonomous-pipeline-reminder.md and CHANGELOG.md — it left docs/conventions/loop-lane/README.md (lines 597–606, +11 new lines from this same PR) unchanged. That paragraph still asserts "An autonomous lane carries a standing reminder … The clause set … live in the autonomy plugin's reference/autonomous-pipeline-reminder.md … this doc points at it rather than restating it, per Pointer-not-copy" — which, combined with this file's own definition of Pointer-not-copy three lines above, reads as "the worker/merge lanes consume this reference file." The reference file itself (as fixed) now says the opposite: "No lane references this file" — the two autonomous lanes carry their own separately hand-authored clauses in prompts/loops/loop-lane-prompts.md, not this artifact. I grepped that 1951-line prompts file for the reminder's distinctive phrasing and confirmed neither the Worker- nor Merge-lane "Ready to paste" sections reference or restate it — consistent with the reference file's corrected account, and inconsistent with the loop-lane README's. plugins/autonomy/CHANGELOG.md already carries the corrected framing verbatim, so this is a one-paragraph fix to bring the last file in line. Full detail and a suggested rewrite direction are in the inline comment: docs/conventions/loop-lane/README.md#L597-L606.

Everything else checked

  • Version bump (0.12.30.13.0) is consistent between plugin.json and the CHANGELOG.md ## [0.13.0] heading.
  • lane-stop-gate.sh's new SCOPE comment block is comment-only, matching the PR's claim (verified against the diff, not re-run through shellcheck here).
  • No other leftover "worker and merge lanes carry it" phrasing found elsewhere in plugins/autonomy/ or docs/conventions/loop-lane/ (grepped for two-of-three, worker and merge lanes carry) — the one CHANGELOG hit already uses the corrected framing.
  • No CLAUDE.md plugin-design-rule issues (repo-agnostic, no hardcoded paths/secrets, versioned correctly); this is a docs/comment-only change with no new code path.
  • Security review was already posted separately by this bot and isn't repeated here per this repo's lane split.

Not independently verified (author-claimed in the PR body, would need tools not exercised in this pass): scripts/validate-plugins.sh, scripts/check-contract-clause-coverage.py, scripts/check-changelog-parity.sh, markdownlint-cli2, node scripts/generate-catalog.mjs output/pass status.
· Branch: feat/autonomous-pipeline-reminder

Comment thread docs/conventions/loop-lane/README.md Outdated
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

claude Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 1m 4s —— View job


Security review

  • Gather context (PR diff at current HEAD 2349740, git diff origin/main...HEAD via gh pr diff)
  • Review each changed file for security issues, focusing on the latest commit
  • Post findings

Scope reviewed: all 6 files changed across all 3 commits (7c80f4d, 00e5fdf, 2349740) in this PR:

  • docs/conventions/loop-lane/README.md — +18/-0, prose only.
  • plugins/autonomy/.claude-plugin/plugin.json — version bump 0.12.30.13.0 only; no other manifest field touched.
  • plugins/autonomy/CHANGELOG.md — +51/-0, prose only.
  • plugins/autonomy/README.md — +16/-0, prose only.
  • plugins/autonomy/hooks/lane-stop-gate.sh — an 8-line SCOPE comment block. Diffed line-by-line against origin/main: sentinel matching, trust resolution, marker-consumption ledger, and control flow are byte-for-byte unchanged. Comment-only.
  • plugins/autonomy/reference/autonomous-pipeline-reminder.md — new file (115 lines), all Markdown prose — a paste-ready prompt clause set intended for a consumer's own pipeline. Defines no mechanism and executes nothing in this repository.

The third commit (2349740, added since the last security pass) only edits the docs/conventions/loop-lane/README.md prose paragraph to correct a factual claim about lane coverage — no code, no manifest, no hook logic touched.

No security issues found. This PR remains documentation-and-comment-only end to end:

  • No GitHub Actions workflow files touched anywhere in the diff — no pull_request_target/workflow_run trust-boundary surface, no permissions: change, nothing for zizmor's advisory lane to flag here.
  • No hook logic changed in lane-stop-gate.sh across any of the three commits — verified the cumulative diff is a comment block only; sentinel regex-escaping, trusted-config precedence, and fail-open exit paths are identical to origin/main.
  • No secrets, tokens, or credentials introduced or handled.
  • No new code execution paths, shell command construction, or file-path/input handling anywhere in the diff.
  • The new/revised reference file is inert prompt text for a consumer to paste into their own pipeline — no execution surface in this repository, no injection vector (it's authored content, not interpolated at runtime).
  • plugin.json change is a version-string bump only; no permission or trust-surface field changed.

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.)
· Branch: feat/autonomous-pipeline-reminder

@claude

claude Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Claude finished @kyle-sexton's task in 2m 28s —— View job


Code review complete

  • Gather context (PR diff, changed files, prior review threads)
  • Verify commit 2349740 actually resolves the last open finding (surviving copy of the lane-reference claim in docs/conventions/loop-lane/README.md)
  • Review full diff for correctness / CLAUDE.md alignment
  • Post findings

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 00e5fdf fixed the first two; it fixed the false claim only in plugins/autonomy/reference/autonomous-pipeline-reminder.md and the changelog, leaving docs/conventions/loop-lane/README.md (lines 597–606) still asserting the opposite. I focused this pass on verifying whether the newest commit, 2349740 ("fix(loop-lane): correct the surviving copy of the lane-reference claim"), actually closes that last gap.

It does. docs/conventions/loop-lane/README.md#L597-L613 now reads:

An autonomous lane carries standing clauses of its own against the two stopping failures... In this repository those clauses are hand-authored inline in each autonomous lane's launch prompt, and deliberately so... Pointer-not-copy does not reach them... The autonomy plugin's reference/autonomous-pipeline-reminder.md states the same clause set once... No lane consumes that file...

This now agrees with the corrected reference/autonomous-pipeline-reminder.md ("No lane references this file...") and CHANGELOG.md ("No lane references this file, and the reference says so rather than implying otherwise"). All three surfaces are consistent as of this commit. I also checked the new paragraph's self-description — "this is the one place in this doc where [Pointer-not-copy] does not reach" — against every other Pointer-not-copy mention in the file (L13, L619); it's accurate, that claim of exemption isn't made anywhere else in the doc.

I also re-checked the two earlier contradictions fixed in 00e5fdf are still holding at current HEAD (they are — the pause clause in reference/autonomous-pipeline-reminder.md lines 33–39 no longer conflicts with the pre-authorized "opening a draft"/"filing a follow-up" actions, and the follow-up/offer distinction in lines 45–48 vs. 59 is now internally consistent), and re-diffed plugin.json (version-only, 0.12.30.13.0, matching CHANGELOG.md) and lane-stop-gate.sh (still comment-only against the pre-PR baseline — no executable line touched by any of the three commits).

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: scripts/validate-plugins.sh, check-contract-clause-coverage.py, check-changelog-parity.sh, and markdownlint-cli2 — all blocked by this lane's sandboxed-shell permission gate (same limitation prior review rounds on this PR hit). The PR body's and author's follow-up comment's reported results for those are author-claimed and unverified by this review.
· Branch: feat/autonomous-pipeline-reminder

@kyle-sexton
kyle-sexton merged commit a8e6607 into main Aug 8, 2026
33 checks passed
@kyle-sexton
kyle-sexton deleted the feat/autonomous-pipeline-reminder branch August 8, 2026 23:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

autonomy: the lane-stop gate covers two of the seven autonomous-pipeline clauses and cannot see a blocked-on-user stop

1 participant