fix: time constraints cap scale and bind the whole /plan chain (#886)#25
Conversation
A /plan run on a hackathon-demo ask burned 18 AskUserQuestion rounds: the Scale budgets never reached the chained eng/design reviews (separate invocations with no Scale header, and plan-design-review/design-review/ review were not garrytan#886 targets), the collected time box was never used, and reviews spent rounds on ceremony (re-confirming handoff-named targets, one round per finding, optional-extras offers). - Overlay garrytan#886 now targets review, plan-design-review, and design-review; the binding scale inherits across chain handoffs; an explicit user time constraint caps scale at session/hobby regardless of higher vectors; obvious in-boundary fixes are applied and reported, not asked; question rounds are batched and never spent on ceremony. - The /plan Build scale section makes the time-constraint ceiling explicit and requires every handoff to carry scale + time box. - Shared judgment contract gains infer-don't-ask and time-budget clauses for all six dispatchers. - EXPECTED_PARITY_CHECKS 5027 -> 5033 (2 per newly targeted module). Evidence: ~/.claude/projects/-Users-sinabina-orca-projects-SwipeMusic/1b922b73-*.jsonl Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…an#886) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
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. |
|
CI failure attribution (verified, not assumed): The three failing checks are pre-existing repo-wide breakage, not this branch:
This diff is judgment-text only ( |
There was a problem hiding this comment.
5 issues found across 36 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="scripts/gstack2/bug-fix-overlays.ts">
<violation number="1" location="scripts/gstack2/bug-fix-overlays.ts:355">
P2: Direct review/design runs may infer a capped scale without printing the scale or time box, so users cannot verify the constraint being enforced. The shared overlay should explicitly print both after resolving them, including for non-`/plan` entry points.</violation>
<violation number="2" location="scripts/gstack2/bug-fix-overlays.ts:677">
P2: An empty or whitespace-only handoff target is treated as unambiguous and skips the target gate. Checking for a non-empty string preserves the no-ceremony behavior only when a target was actually supplied.</violation>
<violation number="3" location="scripts/gstack2/bug-fix-overlays.ts:678">
P2: Session/hobby regressions claim minor findings were applied even when `minor_findings` is zero or absent. Include the finding count in this result so the executable contract describes an action that occurred.</violation>
<violation number="4" location="scripts/gstack2/bug-fix-overlays.ts:678">
P2: The regression marks all findings as safe to apply solely because the scale is session/hobby. That does not test the overlay's required obvious-fix and authorized-mutation conditions, and can hide a workflow that applies unsafe findings without asking. The fixture/evaluator should model those conditions explicitly and only expect automatic application when both are true.</violation>
</file>
<file name="scripts/gstack2/generate-skill-tree.ts">
<violation number="1" location="scripts/gstack2/generate-skill-tree.ts:483">
P2: At product and venture scale, the shared contract now suppresses optional-extra question rounds even though the proportional-planning overlay only removes those rounds at session/hobby and explicitly preserves full question pressure at larger scales. The global rule should keep the no-ceremony restriction scoped to session/hobby (or otherwise defer to the specialist workflow at larger scales).</violation>
</file>
Tip: instead of fixing issues one by one fix them all with cubic
Re-trigger cubic
| review_iterations_max: small ? 1 : 3, | ||
| step_unit: ['hours', 'days', 'weeks', 'stage-appropriate', 'stage-appropriate'][rank], | ||
| target_confirmation_round: input.handoff_target == null, | ||
| minor_findings_applied_not_asked: small, |
There was a problem hiding this comment.
P2: Session/hobby regressions claim minor findings were applied even when minor_findings is zero or absent. Include the finding count in this result so the executable contract describes an action that occurred.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/gstack2/bug-fix-overlays.ts, line 678:
<comment>Session/hobby regressions claim minor findings were applied even when `minor_findings` is zero or absent. Include the finding count in this result so the executable contract describes an action that occurred.</comment>
<file context>
@@ -647,20 +655,27 @@ export function evaluateBugFixRegression(pr: number, rawInput: unknown): Record<
review_iterations_max: small ? 1 : 3,
step_unit: ['hours', 'days', 'weeks', 'stage-appropriate', 'stage-appropriate'][rank],
+ target_confirmation_round: input.handoff_target == null,
+ minor_findings_applied_not_asked: small,
};
}
</file context>
| minor_findings_applied_not_asked: small, | |
| minor_findings_applied_not_asked: small && Number(input.minor_findings ?? 0) > 0, |
| outside_voices: small ? 'on-request' : 'offer', | ||
| review_iterations_max: small ? 1 : 3, | ||
| step_unit: ['hours', 'days', 'weeks', 'stage-appropriate', 'stage-appropriate'][rank], | ||
| target_confirmation_round: input.handoff_target == null, |
There was a problem hiding this comment.
P2: An empty or whitespace-only handoff target is treated as unambiguous and skips the target gate. Checking for a non-empty string preserves the no-ceremony behavior only when a target was actually supplied.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/gstack2/bug-fix-overlays.ts, line 677:
<comment>An empty or whitespace-only handoff target is treated as unambiguous and skips the target gate. Checking for a non-empty string preserves the no-ceremony behavior only when a target was actually supplied.</comment>
<file context>
@@ -647,20 +655,27 @@ export function evaluateBugFixRegression(pr: number, rawInput: unknown): Record<
outside_voices: small ? 'on-request' : 'offer',
review_iterations_max: small ? 1 : 3,
step_unit: ['hours', 'days', 'weeks', 'stage-appropriate', 'stage-appropriate'][rank],
+ target_confirmation_round: input.handoff_target == null,
+ minor_findings_applied_not_asked: small,
};
</file context>
| target_confirmation_round: input.handoff_target == null, | |
| target_confirmation_round: typeof input.handoff_target !== 'string' || input.handoff_target.trim().length === 0, |
| The /plan dispatcher prints a \`Scale:\` header line classified from fifteen build-scale vectors (its Build scale section). This rule authorizes every planning specialist to size its machinery to that scale while keeping every STOP gate and approval boundary; a polite user answering every question is not evidence the full machinery is wanted, and the user can always ask for the complete treatment. | ||
| The /plan dispatcher prints a \`Scale:\` header line classified from fifteen build-scale vectors (its Build scale section). This rule authorizes every planning and review specialist to size its machinery to that scale while keeping every STOP gate and approval boundary; a polite user answering every question is not evidence the full machinery is wanted, and the user can always ask for the complete treatment. | ||
|
|
||
| The binding scale comes from the first available source: the printed \`Scale:\` header, a chain handoff that names a scale or time box, or on-the-spot classification from the prompt and cheap repository evidence. An explicit user time constraint is a ceiling, not one vector among fifteen: work that must fit one sitting caps the scale at \`session\`, and a day-or-two deadline caps it at \`hobby\`, regardless of higher vectors. A chained invocation inherits the upstream scale and time box without re-asking, and every handoff it emits carries them forward. |
There was a problem hiding this comment.
P2: Direct review/design runs may infer a capped scale without printing the scale or time box, so users cannot verify the constraint being enforced. The shared overlay should explicitly print both after resolving them, including for non-/plan entry points.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/gstack2/bug-fix-overlays.ts, line 355:
<comment>Direct review/design runs may infer a capped scale without printing the scale or time box, so users cannot verify the constraint being enforced. The shared overlay should explicitly print both after resolving them, including for non-`/plan` entry points.</comment>
<file context>
@@ -346,21 +346,29 @@ At the Phase 5 approval gate, print the full design-doc body as direct assistant
-The /plan dispatcher prints a \`Scale:\` header line classified from fifteen build-scale vectors (its Build scale section). This rule authorizes every planning specialist to size its machinery to that scale while keeping every STOP gate and approval boundary; a polite user answering every question is not evidence the full machinery is wanted, and the user can always ask for the complete treatment.
+The /plan dispatcher prints a \`Scale:\` header line classified from fifteen build-scale vectors (its Build scale section). This rule authorizes every planning and review specialist to size its machinery to that scale while keeping every STOP gate and approval boundary; a polite user answering every question is not evidence the full machinery is wanted, and the user can always ask for the complete treatment.
+
+The binding scale comes from the first available source: the printed \`Scale:\` header, a chain handoff that names a scale or time box, or on-the-spot classification from the prompt and cheap repository evidence. An explicit user time constraint is a ceiling, not one vector among fifteen: work that must fit one sitting caps the scale at \`session\`, and a day-or-two deadline caps it at \`hobby\`, regardless of higher vectors. A chained invocation inherits the upstream scale and time box without re-asking, and every handoff it emits carries them forward.
- \`session\` and \`hobby\`: batch every question the initial prompt left unanswered into one AskUserQuestion round (two rounds for hobby); skip web or landscape research, outside voices, second opinions, and visual sketches unless the user asks (privacy gates are unchanged whenever they run); cap any adversarial or spec review loop at one iteration; keep the decision artifact near one page with next steps sized in hours (session) or days (hobby), never a phased multi-week roadmap or a distribution plan the user did not ask for.
</file context>
| The binding scale comes from the first available source: the printed \`Scale:\` header, a chain handoff that names a scale or time box, or on-the-spot classification from the prompt and cheap repository evidence. An explicit user time constraint is a ceiling, not one vector among fifteen: work that must fit one sitting caps the scale at \`session\`, and a day-or-two deadline caps it at \`hobby\`, regardless of higher vectors. A chained invocation inherits the upstream scale and time box without re-asking, and every handoff it emits carries them forward. | |
| The binding scale comes from the first available source: the printed \`Scale:\` header, a chain handoff that names a scale or time box, or on-the-spot classification from the prompt and cheap repository evidence. An explicit user time constraint is a ceiling, not one vector among fifteen: work that must fit one sitting caps the scale at \`session\`, and a day-or-two deadline caps it at \`hobby\`, regardless of higher vectors. A chained invocation inherits the upstream scale and time box without re-asking, and every handoff it emits carries them forward. After resolving them, print the binding \`Scale:\` and \`Time box:\` before proceeding, including when classification happened on the spot. |
| '8. Match the user language. Empty or contradictory evidence blocks confident success.', | ||
| '9. Recommendations remain traceable downstream, including what evidence would change them.', | ||
| '10. The user makes the final decision.', | ||
| '10. Ask only what cannot be inferred. Question rounds are for decisions that are consequential and still open after the prompt, the repository, and platform convention are consulted; infer the rest, state each inferred default in one line, and batch what remains. Never spend a round confirming what a handoff already names or offering optional extras.', |
There was a problem hiding this comment.
P2: At product and venture scale, the shared contract now suppresses optional-extra question rounds even though the proportional-planning overlay only removes those rounds at session/hobby and explicitly preserves full question pressure at larger scales. The global rule should keep the no-ceremony restriction scoped to session/hobby (or otherwise defer to the specialist workflow at larger scales).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/gstack2/generate-skill-tree.ts, line 483:
<comment>At product and venture scale, the shared contract now suppresses optional-extra question rounds even though the proportional-planning overlay only removes those rounds at session/hobby and explicitly preserves full question pressure at larger scales. The global rule should keep the no-ceremony restriction scoped to session/hobby (or otherwise defer to the specialist workflow at larger scales).</comment>
<file context>
@@ -476,7 +480,9 @@ function sharedJudgmentContract(): string {
'8. Match the user language. Empty or contradictory evidence blocks confident success.',
'9. Recommendations remain traceable downstream, including what evidence would change them.',
- '10. The user makes the final decision.',
+ '10. Ask only what cannot be inferred. Question rounds are for decisions that are consequential and still open after the prompt, the repository, and platform convention are consulted; infer the rest, state each inferred default in one line, and batch what remains. Never spend a round confirming what a handoff already names or offering optional extras.',
+ '11. A user-stated time constraint binds every phase and every chained skill. Skip or compress optional phases that do not fit it, noting each skip in one line.',
+ '12. The user makes the final decision.',
</file context>
| review_iterations_max: small ? 1 : 3, | ||
| step_unit: ['hours', 'days', 'weeks', 'stage-appropriate', 'stage-appropriate'][rank], | ||
| target_confirmation_round: input.handoff_target == null, | ||
| minor_findings_applied_not_asked: small, |
There was a problem hiding this comment.
P2: The regression marks all findings as safe to apply solely because the scale is session/hobby. That does not test the overlay's required obvious-fix and authorized-mutation conditions, and can hide a workflow that applies unsafe findings without asking. The fixture/evaluator should model those conditions explicitly and only expect automatic application when both are true.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At scripts/gstack2/bug-fix-overlays.ts, line 678:
<comment>The regression marks all findings as safe to apply solely because the scale is session/hobby. That does not test the overlay's required obvious-fix and authorized-mutation conditions, and can hide a workflow that applies unsafe findings without asking. The fixture/evaluator should model those conditions explicitly and only expect automatic application when both are true.</comment>
<file context>
@@ -647,20 +655,27 @@ export function evaluateBugFixRegression(pr: number, rawInput: unknown): Record<
review_iterations_max: small ? 1 : 3,
step_unit: ['hours', 'days', 'weeks', 'stage-appropriate', 'stage-appropriate'][rank],
+ target_confirmation_round: input.handoff_target == null,
+ minor_findings_applied_not_asked: small,
};
}
</file context>
garrytan#538 + code-intelligence contract (parity 5056) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Problem
A
/planrun on a hackathon-demo ask (SwipeMusic) burned 18 AskUserQuestion rounds / 28 questions despite the user stating a tight time budget:Scale:header, which chained eng/design review invocations never see — 13 of the 18 rounds came from that chain running at full pressure.review,plan-design-review, anddesign-reviewwere not GENERAL: Reduce Token Overhead garrytan/gstack#886 targets at all.audience=public, pushing a throwaway hackathon build toward product-grade treatment.Evidence:
~/.claude/projects/-Users-sinabina-orca-projects-SwipeMusic/1b922b73-*.jsonlFix
session(one sitting) orhobby(day or two) regardless of higher vectors; printed with the scale.review,plan-design-review,design-review.Mechanics
EXPECTED_PARITY_CHECKS5027 → 5033 (+2 per newly targeted module); GENERAL: Reduce Token Overhead garrytan/gstack#886 regression fixture/evaluator extended to pin the ceiling, no-target-confirmation, and apply-not-ask behaviors.check:gstack2-generatedgate).Testing
bun run test:gstack2— parity green at 5033 checks.bun test— free suite green (exit 0).bun run eval:select— 0/178 E2E, 0/28 LLM-judge tests affected by this diff.🤖 Generated with Claude Code
Summary by cubic
Caps build scale by user-stated time boxes and binds scale/time across the entire
/planchain, includingreviewmodules, to cut wasted rounds. Extends garrytan#886 proportional planning so chained specialists inherit scale and act proportionally; parity now at 5,080 checks.review,plan-design-review, anddesign-review.session/hobby; print the constraint with the scale.session/hobby.Written for commit 420793d. Summary will update on new commits.