admin-bypass-sweep (4) an unanswered scope question resolves narrow - #504
Open
EdbertChan wants to merge 4 commits into
Open
admin-bypass-sweep (4) an unanswered scope question resolves narrow#504EdbertChan wants to merge 4 commits into
EdbertChan wants to merge 4 commits into
Conversation
…cope question and the consent sentence in separate turns, and resolve silence to the narrower scope. Review claim: An unanswered scope question resolves to the narrower option, never the larger one. Review lane: behavior Safety invariant: A sweep of single-item groups reads the same as before; only a multi-item group needs the second answer, and an unclear offer resolves to the smallest one named. Effectiveness measurement: A fixture transcript answering only the consent sentence must resolve to singles-only, and one answering both must resolve to the stated scope. Both asserted in the skill's test directory. Slice rationale: One step of the sweep skill's intake procedure; stacked behind the diff-read step because both edit the same SKILL.md. Architectural effect: The written intake no longer contains a state where an unanswered question resolves upward. Goal: Change Step 2 of product/skills/admin-bypass-sweep/SKILL.md so the scope question and the consent sentence are asked in separate turns, and an unanswered scope question resolves to the narrower option offered. Motivation: A sweep asked for the consent sentence and the scope question in one message. The human's entire reply was the consent sentence. The agent recorded this as consent for the full 19-PR plan and proceeded, including five force-pushed rebases. Alternative considerations: Re-asking after proceeding was rejected because the merges are not reversible. Treating the consent sentence as scope-bearing was rejected because the skill forbids paraphrase of it, so it cannot carry variable content. Implementation details: Rewrite Step 2 so it asks in two turns: first the grouped plan plus the scope question, then, after a scope answer, the consent sentence request. State that a reply carrying only the consent sentence resolves scope to the narrowest option that was offered, and that multi-PR stacks require an explicit second answer naming them. Add fixtures under the skill's tests directory for a scope-answered and a scope-unanswered transcript. Non-goals: Does not change the consent sentence's wording, does not introduce another way to approve, does not alter Step 4's merge commands, and does not touch any other skill. Layer: domain Feature state: active Files: product/skills/admin-bypass-sweep/SKILL.md, product/skills/admin-bypass-sweep/tests/ Change types: - product/skills/admin-bypass-sweep/SKILL.md: docs-only - product/skills/admin-bypass-sweep/tests/fires_scope_unanswered.md: create - product/skills/admin-bypass-sweep/tests/stays_silent_scope_answered.md: create Acceptance criteria: - `python3 -m unittest discover -s product/skills/admin-bypass-sweep/tests -v` exits 0. - Step 2 asks scope and consent in separate turns. - A reply carrying only the consent sentence is documented as resolving to the narrowest offered scope. Solution: Ask the scope question and the consent sentence in separate turns, and resolve silence to the narrower scope. Review claim: An unanswered scope question resolves to the narrower option, never the larger one. Review lane: behavior Safety invariant: A sweep of single-item groups reads the same as before; only a multi-item group needs the second answer, and an unclear offer resolves to the smallest one named. Effectiveness measurement: A fixture transcript answering only the consent sentence must resolve to singles-only, and one answering both must resolve to the stated scope. Both asserted in the skill's test directory. Slice rationale: One step of the sweep skill's intake procedure; stacked behind the diff-read step because both edit the same SKILL.md. Architectural effect: The written intake no longer contains a state where an unanswered question resolves upward. Goal: Change Step 2 of product/skills/admin-bypass-sweep/SKILL.md so the scope question and the consent sentence are asked in separate turns, and an unanswered scope question resolves to the narrower option offered. Motivation: A sweep asked for the consent sentence and the scope question in one message. The human's entire reply was the consent sentence. The agent recorded this as consent for the full 19-PR plan and proceeded, including five force-pushed rebases. Alternative considerations: Re-asking after proceeding was rejected because the merges are not reversible. Treating the consent sentence as scope-bearing was rejected because the skill forbids paraphrase of it, so it cannot carry variable content. Implementation details: Rewrite Step 2 so it asks in two turns: first the grouped plan plus the scope question, then, after a scope answer, the consent sentence request. State that a reply carrying only the consent sentence resolves scope to the narrowest option that was offered, and that multi-PR stacks require an explicit second answer naming them. Add fixtures under the skill's tests directory for a scope-answered and a scope-unanswered transcript. Non-goals: Does not change the consent sentence's wording, does not introduce another way to approve, does not alter Step 4's merge commands, and does not touch any other skill. Layer: domain Feature state: active Files: product/skills/admin-bypass-sweep/SKILL.md, product/skills/admin-bypass-sweep/tests/ Change types: - product/skills/admin-bypass-sweep/SKILL.md: docs-only - product/skills/admin-bypass-sweep/tests/fires_scope_unanswered.md: create - product/skills/admin-bypass-sweep/tests/stays_silent_scope_answered.md: create Acceptance criteria: - `python3 -m unittest discover -s product/skills/admin-bypass-sweep/tests -v` exits 0. - Step 2 asks scope and consent in separate turns. - A reply carrying only the consent sentence is documented as resolving to the narrowest offered scope. Invoker-Finalize-Id: 26704a9f-70f5-4458-baa2-b9bd9a3ffe15
…rministic proof for the narrow scope default. Review claim: The skill's fixtures assert silence on scope resolves narrow. Review lane: proof Safety invariant: Proof-only; adds no product behavior. Effectiveness measurement: The suite fails if the scope-unanswered fixture resolves to the full sweep. Slice rationale: One proof slice for this step. Architectural effect: None; verification only. Goal: Prove the narrow scope default deterministically. Motivation: The defect is an inferred approval, so the proof asserts the inference is refused. Alternative considerations: Manual verification was rejected as non-deterministic. Implementation details: Execute the command below as the terminal proof. Non-goals: No product edits here; proof only. Layer: app_regression Feature state: active Exit code: 0 Invoker-Finalize-Id: 100703ed-6845-4470-b569-241d7f980dde
… that no ephemeral inter-task handoff files remain. Review claim: The workflow leaves no scratch handoff artifacts behind. Review lane: cleanup Safety invariant: Read-only; never deletes files, alters the index, or commits caller work. Effectiveness measurement: The gate fails when a plans/invoker-handoff.* or lens-*.json file is still present after the leaf tasks complete. Slice rationale: One terminal hygiene gate for the workflow. Architectural effect: None; check only. Goal: Confirm no ephemeral handoff files survive the run. Motivation: Inter-task scratch files leak into diffs and read as part of the work. Alternative considerations: Deleting them automatically was rejected; the gate reports, it does not mutate. Implementation details: Run scripts/scrub-handoff-artifacts.sh without --apply. Non-goals: No deletion, no index changes, no commits. Layer: app_regression Feature state: active Exit code: 0
…aa912f366-cf32078b — Terminal check that no ephemeral inter-task handoff files remain. Review claim: The workflow leaves no scratch handoff artifacts behind. Review lane: cleanup Safety invariant: Read-only; never deletes files, alters the index, or commits caller work. Effectiveness measurement: The gate fails when a plans/invoker-handoff.* or lens-*.json file is still present after the leaf tasks complete. Slice rationale: One terminal hygiene gate for the workflow. Architectural effect: None; check only. Goal: Confirm no ephemeral handoff files survive the run. Motivation: Inter-task scratch files leak into diffs and read as part of the work. Alternative considerations: Deleting them automatically was rejected; the gate reports, it does not mutate. Implementation details: Run scripts/scrub-handoff-artifacts.sh without --apply. Non-goals: No deletion, no index changes, no commits. Layer: app_regression Feature state: active
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_9af8d706-d101-4092-9463-2ac70c282d88) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
One skill helps an agent merge many pull requests past the normal checks. First it must ask how much to merge, and get a fixed yes sentence.
The problem: in a real run, both questions went out in one message. The person typed only the yes sentence and said nothing about how much.
The agent read that silence as a yes to the bigger choice. It then rewrote five branches by force and merged two linked groups.
Both planned checks held. The gap was a third path: filling in the missing answer with the largest option.
The fix asks the two questions in separate turns. If the "how much" question gets no clear answer, the agent does only the smallest choice it offered.
Review Claim
When the person answers only the yes sentence, the merge skill does the smallest job it offered, never the biggest.
Review Lane
behavior
Review Unit
product-skill
Safety Invariant
A sweep of single-item groups reads the same as before; only a multi-item group needs the second answer, and an unclear offer resolves to the smallest one named.
Slice Rationale
This is one step of the sweep skill's intake: Step 2, where scope and consent are asked. Other intake steps ship as their own slices.
Non-goals
Test Plan
Test Plan
python3 -m unittest discover -s product/skills/admin-bypass-sweep/tests -vpython3 engine/skills/make-pr/scripts/preflight.py --base mainbash scripts/scrub-handoff-artifacts.shFixtures added under
product/skills/admin-bypass-sweep/tests/:scope_unanswered_consent_only_reply.md: the reply has only the consent sentence, so the fixture expects single-PR groups only.scope_answered_reply.md: scope is answered first ("Run the full grouped plan."), then consent comes in a separate turn, so the fixture expects the full plan.test_scope_intake.py: checks that Step 2 holds the separate-turn text and the narrowest-scope text, and that both fixtures state their expected result.Revert Plan
Revert Plan
git revert <merge-sha>🤖 Generated with Claude Code
Note
Low Risk
Documentation and test harness for agent intake behavior only; no merge commands or runtime code paths change.
Overview
Step 2 intake for
admin-bypass-sweepnow splits scope from consent and defaults unclear scope to the smallest offered option.The skill text no longer bundles scope confirmation with a vague reconfirm. The agent must ask only the scope question in one turn (narrowest choice first, then named stacks or the full plan), then request the STOP literal consent sentence in a later turn. If the human replies with only the consent sentence, that counts as authorization but not as choosing scope—execution stays at single-PR groups only; multi-PR stacks need an explicit scope answer naming them or a larger option.
Two markdown fixtures document the answered-scope vs consent-only paths, and
test_scope_intake.pylocks in the Step 2 wording and fixture expectations. Merge steps (Step 4) and the consent sentence itself are unchanged.Reviewed by Cursor Bugbot for commit 9e2ef67. Bugbot is set up for automated code reviews on this repo. Configure here.