cclaw-cli 0.51.6 → 0.51.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -45,37 +45,34 @@ export const SCOPE = {
|
|
|
45
45
|
},
|
|
46
46
|
executionModel: {
|
|
47
47
|
checklist: [
|
|
48
|
-
"**
|
|
49
|
-
"**
|
|
50
|
-
"**
|
|
51
|
-
"**
|
|
52
|
-
"**Compare implementation alternatives** —
|
|
53
|
-
"**
|
|
54
|
-
"**
|
|
55
|
-
"**
|
|
56
|
-
`**Outside voice when warranted** — run/reconcile the loop for complex/high-risk or configured scope; otherwise do a concise adversarial self-check. ${reviewLoopPolicySummary("scope")} ${reviewLoopSecondOpinionSummary("scope")}`,
|
|
57
|
-
"**Write the scope contract** — include in-scope/out-of-scope, discretion areas, deferred items, locked decisions, error/rescue notes, completion dashboard, and explicit approval."
|
|
48
|
+
"**CEO pass first** — read brainstorm, name the job-to-be-done, challenge whether this is the right product slice, and propose the highest-leverage scope in one pass.",
|
|
49
|
+
"**Pick one of four gstack modes** — SCOPE EXPANSION, SELECTIVE EXPANSION, HOLD SCOPE, or SCOPE REDUCTION. State why and what user signal would change the mode.",
|
|
50
|
+
"**Draft the 10-star vs v1 boundary** — show what would make the product meaningfully better, then explicitly choose what ships now, what is deferred, and what is excluded.",
|
|
51
|
+
"**Premise and leverage check** — test right problem, direct path, no-action outcome, existing-code leverage, and reversibility before asking the user anything.",
|
|
52
|
+
"**Compare implementation alternatives** — include minimum viable, product-grade, and ideal architecture options with effort/risk/reuse, then recommend one.",
|
|
53
|
+
"**Run outside voice before final approval** — always do at least a concise adversarial self-check for scope; for complex/high-risk/configured scope, iterate until threshold. Record the loop summary in `## Spec Review Loop` before asking approval.",
|
|
54
|
+
"**Ask only one decision-changing question** — if the user rejects the contract but is unsure, offer 3-4 concrete scope moves instead of open-ended interrogation.",
|
|
55
|
+
"**Write the scope contract** — include in-scope/out-of-scope, discretion areas, deferred items, locked decisions, error/rescue notes, completion dashboard, scope summary, and explicit approval."
|
|
58
56
|
],
|
|
59
57
|
interactionProtocol: [
|
|
60
58
|
decisionProtocolInstruction("scope mode selection", "present expand/selective/hold/reduce as labeled options with trade-offs and mark one as (recommended)", "recommend the option that best covers the prime-directive failure modes, four data-flow paths, observability, and deferred handling for the in-scope set with the smallest blast radius. Base your recommendation on default heuristics: greenfield -> expand, enhancement -> selective, bugfix/hotfix/refactor -> hold, broad blast radius -> reduce"),
|
|
61
|
-
"Do not walk the full checklist by default. Lead with
|
|
59
|
+
"Do not walk the full checklist by default. Lead with an opinionated scope contract and the one decision that matters most.",
|
|
62
60
|
"Challenge premise first, take a firm position, and name one concrete condition that would change it.",
|
|
63
61
|
"Push back on weak framing: vague scope needs a specific user/problem, platform vision needs a narrow wedge, social proof needs behavioral evidence.",
|
|
64
62
|
"Resolve one structural scope issue at a time; otherwise state the assumption and move on.",
|
|
65
|
-
"
|
|
66
|
-
`Before final approval,
|
|
63
|
+
"If the user says no but cannot name the change, offer concrete moves: keep scope, add one obvious adjacent capability, reduce to wedge, or re-open stack/product direction.",
|
|
64
|
+
`Before final approval, record outside-voice findings and a \`## Spec Review Loop\` table using ${reviewLoopPolicySummary("scope")}`,
|
|
67
65
|
"**STOP.** Wait for explicit approval of the scope contract before advancing.",
|
|
68
|
-
"**STOP BEFORE ADVANCE.** Mandatory delegation `planner` must be completed or explicitly waived
|
|
66
|
+
"**STOP BEFORE ADVANCE.** Mandatory delegation `planner` must be completed or explicitly waived. Then close with `node .cclaw/hooks/stage-complete.mjs scope --passed=scope_mode_selected,scope_contract_written,scope_user_approved --evidence-json '{\"scope_mode_selected\":\"<mode + rationale>\",\"scope_contract_written\":\"<artifact path + sections>\"}'`. Do not include `scope_user_approved` manually; stage-complete auto-hydrates its review-loop envelope from `## Spec Review Loop`."
|
|
69
67
|
],
|
|
70
68
|
process: [
|
|
71
69
|
"Run configured pre-scope audit only when enabled.",
|
|
72
|
-
"
|
|
73
|
-
"Compare
|
|
74
|
-
"Select scope mode with explicit user
|
|
75
|
-
"Run
|
|
76
|
-
|
|
77
|
-
"
|
|
78
|
-
"Produce scope summary and completion dashboard."
|
|
70
|
+
"Run the gstack-style CEO scope pass: job-to-be-done, premise challenge, 10-star upside, smallest useful wedge, and what would change the recommendation.",
|
|
71
|
+
"Compare minimum viable, product-grade, and ideal architecture scope alternatives with explicit reuse/effort/risk.",
|
|
72
|
+
"Select scope mode with explicit rationale; ask for user opt-in only when changing or expanding scope.",
|
|
73
|
+
"Run outside voice / adversarial self-check before final approval and record a valid `## Spec Review Loop` table.",
|
|
74
|
+
"Write explicit scope contract, discretion areas, deferred items, error/rescue registry, and D-XX locked decisions.",
|
|
75
|
+
"Produce scope summary and completion dashboard before asking final approval."
|
|
79
76
|
],
|
|
80
77
|
requiredGates: [
|
|
81
78
|
{ id: "scope_mode_selected", description: "One scope mode was explicitly selected." },
|
|
@@ -90,8 +87,8 @@ export const SCOPE = {
|
|
|
90
87
|
"Selected mode and rationale are documented.",
|
|
91
88
|
"Locked Decisions section lists stable D-XX IDs for non-negotiable boundaries.",
|
|
92
89
|
"Premise challenge findings documented.",
|
|
93
|
-
"Outside Voice findings and dispositions are recorded (accept/reject/defer with rationale).",
|
|
94
|
-
`Spec review loop summary includes
|
|
90
|
+
"Outside Voice findings and dispositions are recorded (accept/reject/defer with rationale) before final approval.",
|
|
91
|
+
`Spec review loop summary includes a table with columns Iteration, Quality Score, Findings, plus Stop reason, Target score, and Max iterations. stage-complete auto-hydrates scope_user_approved evidence from this section. ${reviewLoopPolicySummary("scope")}`,
|
|
95
92
|
reviewLoopSecondOpinionSummary("scope"),
|
|
96
93
|
"Deferred items list with one-line rationale for each.",
|
|
97
94
|
"When an upside deferred idea is parked, a seed file is created under `.cclaw/seeds/` and referenced in the artifact.",
|
|
@@ -359,9 +359,15 @@ async function hydrateReviewLoopEvidenceFromArtifact(projectRoot, stage, track,
|
|
|
359
359
|
return;
|
|
360
360
|
if (!selectedGateIds.includes(gateId))
|
|
361
361
|
return;
|
|
362
|
-
const
|
|
363
|
-
if (
|
|
362
|
+
const reviewStage = stage === "scope" || stage === "design" ? stage : null;
|
|
363
|
+
if (!reviewStage)
|
|
364
364
|
return;
|
|
365
|
+
const existing = evidenceByGate[gateId];
|
|
366
|
+
if (typeof existing === "string" && existing.trim().length > 0) {
|
|
367
|
+
const existingIssue = validateGateEvidenceShape(stage, gateId, existing);
|
|
368
|
+
if (!existingIssue)
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
365
371
|
const resolved = await resolveArtifactPath(stage, {
|
|
366
372
|
projectRoot,
|
|
367
373
|
track,
|
|
@@ -374,9 +380,6 @@ async function hydrateReviewLoopEvidenceFromArtifact(projectRoot, stage, track,
|
|
|
374
380
|
catch {
|
|
375
381
|
return;
|
|
376
382
|
}
|
|
377
|
-
const reviewStage = stage === "scope" || stage === "design" ? stage : null;
|
|
378
|
-
if (!reviewStage)
|
|
379
|
-
return;
|
|
380
383
|
const envelope = extractReviewLoopEnvelopeFromArtifact(raw, reviewStage, resolved.relPath);
|
|
381
384
|
if (!envelope)
|
|
382
385
|
return;
|