@slowcook-ai/cli 0.22.0 → 0.23.0

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.
Files changed (49) hide show
  1. package/AGENTS.md +7 -1
  2. package/dist/commands/estimate/index.d.ts +2 -0
  3. package/dist/commands/estimate/index.d.ts.map +1 -0
  4. package/dist/commands/estimate/index.js +70 -0
  5. package/dist/commands/estimate/index.js.map +1 -0
  6. package/dist/commands/estimate/model.d.ts +117 -0
  7. package/dist/commands/estimate/model.d.ts.map +1 -0
  8. package/dist/commands/estimate/model.js +158 -0
  9. package/dist/commands/estimate/model.js.map +1 -0
  10. package/dist/commands/menu/prd.d.ts.map +1 -1
  11. package/dist/commands/menu/prd.js +17 -0
  12. package/dist/commands/menu/prd.js.map +1 -1
  13. package/dist/commands/reconcile/index.d.ts.map +1 -1
  14. package/dist/commands/reconcile/index.js +8 -5
  15. package/dist/commands/reconcile/index.js.map +1 -1
  16. package/dist/commands/refine/agent.d.ts.map +1 -1
  17. package/dist/commands/refine/agent.js +22 -2
  18. package/dist/commands/refine/agent.js.map +1 -1
  19. package/dist/commands/refine/context.d.ts +2 -0
  20. package/dist/commands/refine/context.d.ts.map +1 -1
  21. package/dist/commands/refine/context.js +21 -0
  22. package/dist/commands/refine/context.js.map +1 -1
  23. package/dist/commands/refine/history-index.d.ts +17 -0
  24. package/dist/commands/refine/history-index.d.ts.map +1 -1
  25. package/dist/commands/refine/history-index.js +106 -12
  26. package/dist/commands/refine/history-index.js.map +1 -1
  27. package/dist/commands/refine/index.d.ts.map +1 -1
  28. package/dist/commands/refine/index.js +11 -6
  29. package/dist/commands/refine/index.js.map +1 -1
  30. package/dist/commands/refine/llm.d.ts +1 -1
  31. package/dist/commands/refine/llm.d.ts.map +1 -1
  32. package/dist/commands/refine/llm.js +1 -1
  33. package/dist/commands/refine/llm.js.map +1 -1
  34. package/dist/commands/refine/mock-fixtures.d.ts +2 -0
  35. package/dist/commands/refine/mock-fixtures.d.ts.map +1 -1
  36. package/dist/commands/refine/mock-fixtures.js +32 -5
  37. package/dist/commands/refine/mock-fixtures.js.map +1 -1
  38. package/dist/commands/refine/spec-yaml.d.ts +1 -1
  39. package/dist/commands/refine/spec-yaml.d.ts.map +1 -1
  40. package/dist/commands/refine/spec-yaml.js +17 -2
  41. package/dist/commands/refine/spec-yaml.js.map +1 -1
  42. package/dist/commands/testgen/agent.d.ts +5 -0
  43. package/dist/commands/testgen/agent.d.ts.map +1 -1
  44. package/dist/commands/testgen/agent.js +65 -1
  45. package/dist/commands/testgen/agent.js.map +1 -1
  46. package/dist/commands/testgen/index.d.ts.map +1 -1
  47. package/dist/commands/testgen/index.js +11 -6
  48. package/dist/commands/testgen/index.js.map +1 -1
  49. package/package.json +8 -8
package/AGENTS.md CHANGED
@@ -236,7 +236,13 @@ non-negotiable defaults unless the user specifically overrides.
236
236
  Read before emitting/consuming `testing-surfaces.json`, writing `epic` or
237
237
  `acceptance_scenarios` on a spec, or generating the LCR review matrix. Defines
238
238
  why a scenario is a task (not a route) and why universal states (loading/error)
239
- get one Foundations home instead of a per-page repeat.
239
+ get one Foundations home instead of a per-page repeat. **Design drives state:**
240
+ when building or reviewing a mock, treat each affordance as a requirement and each
241
+ affordance-variant as a State; an affordance's *interaction* (what activating it
242
+ does — e.g. opening a confirm modal vs navigating away) is part of the requirement
243
+ too, so reproduce the flow, never a stub; never simplify a component without recording
244
+ what you dropped — a "drifted from design" comment is a dropped requirement, not a
245
+ cosmetic nit, and "doesn't *behave* like design" is the same class of miss.
240
246
  - [REPORTING.md](./REPORTING.md) — how to file a slowcook bug
241
247
  - [docs/plans/](./docs/plans/) — the roadmap / design docs (if a story
242
248
  references one, read it before running the agent)
@@ -0,0 +1,2 @@
1
+ export declare function runEstimate(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/estimate/index.ts"],"names":[],"mappings":"AAsBA,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C/D"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * `slowcook estimate` — the post-`menu` budget. Reads active specs, computes a
3
+ * 3-point dual-currency estimate per story (countable drivers ⊕ the LLM `effort`
4
+ * block), and rolls the backlog up to portfolio percentiles via Monte-Carlo.
5
+ *
6
+ * This is the earliest, highest-decision-value point on the cone of uncertainty;
7
+ * dash consumes this output for the Forecast/roadmap surfaces. See
8
+ * dash docs/BUDGETING-AND-ROADMAP.md.
9
+ */
10
+ import { resolve } from "node:path";
11
+ import { listActiveSpecs } from "../refine/spec-yaml.js";
12
+ import { estimateStory, monteCarloPortfolio, SEED_CALIBRATION } from "./model.js";
13
+ function argFlag(argv, flag) {
14
+ const i = argv.indexOf(flag);
15
+ return i >= 0 ? argv[i + 1] : undefined;
16
+ }
17
+ const usd = (cents) => `$${(cents / 100).toLocaleString(undefined, { maximumFractionDigits: 0 })}`;
18
+ const hrs = (h) => `${h.toFixed(1)}h`;
19
+ const tok = (t) => (t >= 1_000_000 ? `${(t / 1_000_000).toFixed(1)}M` : `${Math.round(t / 1000)}k`);
20
+ export async function runEstimate(argv) {
21
+ const cwd = resolve(argFlag(argv, "--cwd") ?? ".");
22
+ const asJson = argv.includes("--json");
23
+ const byEpic = argv.includes("--by-epic");
24
+ const iterations = Number(argFlag(argv, "--iterations") ?? "10000");
25
+ const specs = listActiveSpecs(cwd);
26
+ if (specs.length === 0) {
27
+ console.error("estimate: no active specs under specs/ — run `menu` first.");
28
+ process.exit(1);
29
+ }
30
+ const estimates = specs.map((s) => estimateStory(s, SEED_CALIBRATION));
31
+ const portfolio = monteCarloPortfolio(estimates, iterations);
32
+ const withEffort = specs.filter((s) => s.effort).length;
33
+ if (asJson) {
34
+ process.stdout.write(JSON.stringify({ estimates, portfolio, calibration: "seed", withEffort }, null, 2) + "\n");
35
+ return;
36
+ }
37
+ console.log(`slowcook estimate — ${estimates.length} stories · ${withEffort} carry an \`effort\` block · seed calibration\n`);
38
+ const rows = byEpic ? groupByEpic(estimates) : [{ label: null, items: estimates }];
39
+ for (const group of rows) {
40
+ if (group.label !== null)
41
+ console.log(`\n ▟ ${group.label}`);
42
+ for (const e of group.items) {
43
+ const flags = [e.risk !== "low" ? `risk:${e.risk}` : "", e.confidence < 0.6 ? `conf:${e.confidence}` : "", ...e.qualitativeDrivers]
44
+ .filter(Boolean).join(" ");
45
+ console.log(` story-${e.storyId} ${usd(e.costCents.m).padStart(8)} p50 ${usd(e.costCents.p).padStart(8)} p-hi` +
46
+ ` ${hrs(e.hours.m).padStart(7)} · ${tok(e.tokens.m).padStart(5)} tok ${e.title.slice(0, 46)}` +
47
+ (flags ? `\n ↳ ${flags}` : ""));
48
+ }
49
+ }
50
+ const P = portfolio;
51
+ console.log(`\n ── Portfolio (Monte-Carlo, ${P.iterations.toLocaleString()} runs over ${P.stories} stories) ──`);
52
+ console.log(` Cost p50 ${usd(P.costCents.p50)} p85 ${usd(P.costCents.p85)} p95 ${usd(P.costCents.p95)} (Σ-deterministic ${usd(P.deterministic.costCents)})`);
53
+ console.log(` Labor p50 ${hrs(P.hours.p50)} p85 ${hrs(P.hours.p85)} p95 ${hrs(P.hours.p95)}`);
54
+ console.log(` Compute p50 ${tok(P.tokens.p50)} p85 ${tok(P.tokens.p85)} p95 ${tok(P.tokens.p95)} tokens`);
55
+ console.log(`\n p85 is the commitment threshold. The cone narrows as vibe/brew actuals replace these assumptions.`);
56
+ }
57
+ function groupByEpic(estimates) {
58
+ const map = new Map();
59
+ const order = [];
60
+ for (const e of estimates) {
61
+ const k = e.epic ?? "(no epic)";
62
+ if (!map.has(k)) {
63
+ map.set(k, []);
64
+ order.push(k);
65
+ }
66
+ map.get(k).push(e);
67
+ }
68
+ return order.map((label) => ({ label, items: map.get(label) }));
69
+ }
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/estimate/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Budgeting — the deterministic estimation model (pure). Converts a story's
3
+ * COUNTABLE drivers (spec structure) + the LLM's RELATIVE `effort` block into a
4
+ * 3-point, dual-currency estimate (human manhours + agent tokens), then rolls a
5
+ * backlog up to portfolio percentiles via Monte-Carlo simulation.
6
+ *
7
+ * Boundary: the LLM sizes relative + names qualitative drivers (it's unreliable at
8
+ * absolute hours); THIS model owns the absolute conversion via calibrated
9
+ * coefficients. The seed coefficients below are illustrative defaults — the real
10
+ * ones are LEARNED from actuals (reference-class forecasting / the SizeCostTable).
11
+ * See dash docs/BUDGETING-AND-ROADMAP.md.
12
+ */
13
+ import type { Spec, EffortSize } from "@slowcook-ai/core";
14
+ /** Countable complexity drivers extracted from the spec structure (the inside view). */
15
+ export interface StoryDrivers {
16
+ entities: number;
17
+ fields: number;
18
+ relations: number;
19
+ endpoints: number;
20
+ surfaces: number;
21
+ /** Σ declared states across surfaces (≥1 per surface) — the EPSS matrix size. */
22
+ epssCells: number;
23
+ scenarios: number;
24
+ invariants: number;
25
+ fidelityModes: number;
26
+ openQuestions: number;
27
+ personas: number;
28
+ }
29
+ /** A 3-point estimate (optimistic / most-likely / pessimistic) in one unit. */
30
+ export interface ThreePoint {
31
+ o: number;
32
+ m: number;
33
+ p: number;
34
+ }
35
+ /** A story's estimate across both currencies, 3-point each. */
36
+ export interface StoryEstimate {
37
+ storyId: string;
38
+ title: string;
39
+ epic: string | null;
40
+ /** human manhours (design + qa + review). */
41
+ hours: ThreePoint;
42
+ /** agent tokens (build + test). */
43
+ tokens: ThreePoint;
44
+ /** total cost in cents (labor + compute). */
45
+ costCents: ThreePoint;
46
+ risk: "low" | "medium" | "high";
47
+ confidence: number;
48
+ drivers: StoryDrivers;
49
+ qualitativeDrivers: string[];
50
+ }
51
+ /** Calibration — seed coefficients (illustrative; calibrate from actuals). */
52
+ export interface Calibration {
53
+ /** relative weight per t-shirt size. */
54
+ weight: Record<EffortSize, number>;
55
+ /** human hours per design/qa weight unit. */
56
+ designHoursPerWeight: number;
57
+ qaHoursPerWeight: number;
58
+ /** agent k-tokens per build weight unit. */
59
+ buildKTokPerWeight: number;
60
+ /** structural coefficients (the inside view). */
61
+ structural: {
62
+ designBase: number;
63
+ dSurf: number;
64
+ dMode: number;
65
+ buildBaseK: number;
66
+ bEntity: number;
67
+ bField: number;
68
+ bApi: number;
69
+ bSurf: number;
70
+ qaBase: number;
71
+ qCell: number;
72
+ qInv: number;
73
+ testBaseK: number;
74
+ tScenario: number;
75
+ reviewBase: number;
76
+ rSurf: number;
77
+ rInv: number;
78
+ };
79
+ /** multiplier per qualitative driver (default 1.0 when absent). */
80
+ driverMult: Record<string, number>;
81
+ /** added band per risk level. */
82
+ riskAdd: Record<"low" | "medium" | "high", number>;
83
+ baseBand: number;
84
+ /** $/hour (cents) blended labor rate. */
85
+ roleRateCents: number;
86
+ /** $/million-tokens (cents) blended compute rate. */
87
+ tokenRateCentsPerM: number;
88
+ }
89
+ export declare const SEED_CALIBRATION: Calibration;
90
+ /** Count the structural drivers from a spec (the inside view). */
91
+ export declare function extractDrivers(spec: Spec): StoryDrivers;
92
+ /** Estimate one story: countable drivers ⊕ the LLM effort block → 3-point dual-currency. */
93
+ export declare function estimateStory(spec: Spec, calib?: Calibration): StoryEstimate;
94
+ /** Sample a triangular(o,m,p) distribution given u∈[0,1). */
95
+ export declare function sampleTriangular(tp: ThreePoint, u: number): number;
96
+ export interface Percentiles {
97
+ p50: number;
98
+ p85: number;
99
+ p95: number;
100
+ }
101
+ export interface PortfolioForecast {
102
+ hours: Percentiles;
103
+ tokens: Percentiles;
104
+ costCents: Percentiles;
105
+ /** the deterministic Σ of most-likely values (the v1 method) for comparison. */
106
+ deterministic: {
107
+ hours: number;
108
+ tokens: number;
109
+ costCents: number;
110
+ };
111
+ iterations: number;
112
+ stories: number;
113
+ }
114
+ /** Monte-Carlo: per iteration draw a systemic factor, then sample each story's
115
+ * 3-point per currency, sum, report percentiles. */
116
+ export declare function monteCarloPortfolio(estimates: StoryEstimate[], iterations?: number, seed?: number): PortfolioForecast;
117
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/commands/estimate/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ export const SEED_CALIBRATION = {
2
+ weight: { xs: 1, s: 2, m: 4, l: 7, xl: 12 },
3
+ designHoursPerWeight: 2.0,
4
+ qaHoursPerWeight: 1.5,
5
+ buildKTokPerWeight: 80,
6
+ structural: {
7
+ designBase: 1, dSurf: 1.5, dMode: 0.8,
8
+ buildBaseK: 40, bEntity: 30, bField: 4, bApi: 15, bSurf: 20,
9
+ qaBase: 1, qCell: 0.6, qInv: 0.4,
10
+ testBaseK: 30, tScenario: 20,
11
+ reviewBase: 0.5, rSurf: 0.4, rInv: 0.2,
12
+ },
13
+ driverMult: {
14
+ "external-integration": 1.4, "novel-algorithm": 1.5, "stateful-flow": 1.25,
15
+ "multi-persona": 1.2, "data-migration": 1.3, realtime: 1.4, compliance: 1.3,
16
+ concurrency: 1.35, "ambiguous-requirements": 1.3,
17
+ },
18
+ riskAdd: { low: 0, medium: 0.25, high: 0.6 },
19
+ baseBand: 0.5,
20
+ roleRateCents: 8000,
21
+ tokenRateCentsPerM: 900,
22
+ };
23
+ /** Count the structural drivers from a spec (the inside view). */
24
+ export function extractDrivers(spec) {
25
+ const entities = spec.data_contract?.entities ?? [];
26
+ const surfaces = spec.surfaces ?? [];
27
+ const epssCells = surfaces.reduce((n, s) => n + Math.max(1, s.states?.length ?? 1), 0);
28
+ const personas = new Set();
29
+ if (spec.persona?.id)
30
+ personas.add(spec.persona.id);
31
+ for (const a of spec.actors ?? [])
32
+ personas.add(a.name);
33
+ return {
34
+ entities: entities.length,
35
+ fields: entities.reduce((n, e) => n + (e.fields?.length ?? 0), 0),
36
+ relations: entities.reduce((n, e) => n + (e.relations?.length ?? 0), 0),
37
+ endpoints: spec.data_contract?.api?.length ?? 0,
38
+ surfaces: surfaces.length,
39
+ epssCells,
40
+ scenarios: spec.acceptance_scenarios?.length ?? 0,
41
+ invariants: spec.invariants?.length ?? 0,
42
+ fidelityModes: spec.fidelity?.modes?.length ?? 1,
43
+ openQuestions: spec.open_questions?.addressable?.length ?? 0,
44
+ personas: personas.size,
45
+ };
46
+ }
47
+ /** Geometric mean of two positive numbers (blends structural + LLM views). */
48
+ const geomean = (a, b) => Math.sqrt(Math.max(a, 0.01) * Math.max(b, 0.01));
49
+ /** Spread a most-likely value into a right-skewed 3-point using risk + confidence. */
50
+ function spread(m, risk, confidence, calib) {
51
+ const band = Math.min(1.2, Math.max(0.1, (calib.baseBand * (1 + calib.riskAdd[risk])) / Math.max(confidence, 0.3)));
52
+ return { o: m * (1 - 0.35 * band), m, p: m * (1 + 1.0 * band) };
53
+ }
54
+ /** Estimate one story: countable drivers ⊕ the LLM effort block → 3-point dual-currency. */
55
+ export function estimateStory(spec, calib = SEED_CALIBRATION) {
56
+ const d = extractDrivers(spec);
57
+ const s = calib.structural;
58
+ const eff = spec.effort;
59
+ // Structural most-likely (the inside view).
60
+ const designH_s = s.designBase + s.dSurf * d.surfaces + s.dMode * d.surfaces * Math.max(0, d.fidelityModes - 1);
61
+ const buildK_s = s.buildBaseK + s.bEntity * d.entities + s.bField * d.fields + s.bApi * d.endpoints + s.bSurf * d.surfaces;
62
+ const qaH_s = s.qaBase + s.qCell * d.epssCells + s.qInv * d.invariants;
63
+ const testK_s = s.testBaseK + s.tScenario * d.scenarios;
64
+ const reviewH_s = s.reviewBase + s.rSurf * d.surfaces + s.rInv * d.invariants;
65
+ // LLM holistic most-likely (the t-shirt view), blended when present.
66
+ const w = (sz) => calib.weight[sz];
67
+ const designH = eff ? geomean(designH_s, w(eff.design) * calib.designHoursPerWeight) : designH_s;
68
+ const buildK = eff ? geomean(buildK_s, w(eff.build) * calib.buildKTokPerWeight) : buildK_s;
69
+ const qaH = eff ? geomean(qaH_s, w(eff.qa) * calib.qaHoursPerWeight) : qaH_s;
70
+ const testK = eff ? geomean(testK_s, w(eff.qa) * calib.buildKTokPerWeight * 0.5) : testK_s;
71
+ const reviewH = eff ? geomean(reviewH_s, w(eff.build) * 0.3) : reviewH_s;
72
+ // Qualitative driver multiplier (hits implementation/test more than design).
73
+ const mult = (eff?.drivers ?? []).reduce((acc, dr) => acc * (calib.driverMult[dr] ?? 1), 1);
74
+ const designMult = Math.sqrt(mult);
75
+ const hoursM = designH * designMult + qaH * mult + reviewH * mult;
76
+ const tokensM = (buildK * mult + testK * mult) * 1000;
77
+ const costM = Math.round((hoursM * calib.roleRateCents) + (tokensM / 1_000_000) * calib.tokenRateCentsPerM);
78
+ const risk = eff?.risk ?? "medium";
79
+ const confidence = eff?.confidence ?? 0.5;
80
+ return {
81
+ storyId: spec.story_id,
82
+ title: spec.title,
83
+ epic: spec.epic ?? null,
84
+ hours: spread(hoursM, risk, confidence, calib),
85
+ tokens: spread(tokensM, risk, confidence, calib),
86
+ costCents: spread(costM, risk, confidence, calib),
87
+ risk,
88
+ confidence,
89
+ drivers: d,
90
+ qualitativeDrivers: eff?.drivers ?? [],
91
+ };
92
+ }
93
+ // ── Monte-Carlo portfolio rollup ─────────────────────────────────────────────
94
+ /** Deterministic PRNG (mulberry32) so the simulation is reproducible + testable. */
95
+ function mulberry32(seed) {
96
+ let a = seed >>> 0;
97
+ return () => {
98
+ a |= 0;
99
+ a = (a + 0x6d2b79f5) | 0;
100
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
101
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
102
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
103
+ };
104
+ }
105
+ /** Sample a triangular(o,m,p) distribution given u∈[0,1). */
106
+ export function sampleTriangular(tp, u) {
107
+ const { o, m, p } = tp;
108
+ if (p <= o)
109
+ return o;
110
+ const fc = (m - o) / (p - o);
111
+ return u < fc ? o + Math.sqrt(u * (p - o) * (m - o)) : p - Math.sqrt((1 - u) * (p - o) * (p - m));
112
+ }
113
+ function percentiles(sorted) {
114
+ const at = (q) => sorted[Math.min(sorted.length - 1, Math.floor(q * sorted.length))];
115
+ return { p50: at(0.5), p85: at(0.85), p95: at(0.95) };
116
+ }
117
+ /** Common-mode (systemic) risk factor applied to the WHOLE backlog per iteration —
118
+ * models correlated overruns (a slow team / hard codebase runs everything long).
119
+ * Without it, idiosyncratic story risk over-diversifies and the portfolio band is
120
+ * unrealistically tight. Right-skewed: systemic surprises are usually bad. */
121
+ const SYSTEMIC = { o: 0.92, m: 1.0, p: 1.35 };
122
+ /** Monte-Carlo: per iteration draw a systemic factor, then sample each story's
123
+ * 3-point per currency, sum, report percentiles. */
124
+ export function monteCarloPortfolio(estimates, iterations = 10_000, seed = 0x5c00c) {
125
+ const rand = mulberry32(seed);
126
+ const hours = [], tokens = [], cost = [];
127
+ for (let i = 0; i < iterations; i++) {
128
+ const sf = sampleTriangular(SYSTEMIC, rand()); // shared by all stories this iteration
129
+ let h = 0, t = 0, c = 0;
130
+ for (const e of estimates) {
131
+ // one shared draw per story keeps the currencies correlated (a story that
132
+ // runs long runs long in BOTH hours and tokens) — more realistic than independent.
133
+ const u = rand();
134
+ h += sampleTriangular(e.hours, u) * sf;
135
+ t += sampleTriangular(e.tokens, u) * sf;
136
+ c += sampleTriangular(e.costCents, u) * sf;
137
+ }
138
+ hours.push(h);
139
+ tokens.push(t);
140
+ cost.push(c);
141
+ }
142
+ hours.sort((a, b) => a - b);
143
+ tokens.sort((a, b) => a - b);
144
+ cost.sort((a, b) => a - b);
145
+ return {
146
+ hours: percentiles(hours),
147
+ tokens: percentiles(tokens),
148
+ costCents: percentiles(cost),
149
+ deterministic: {
150
+ hours: estimates.reduce((n, e) => n + e.hours.m, 0),
151
+ tokens: estimates.reduce((n, e) => n + e.tokens.m, 0),
152
+ costCents: estimates.reduce((n, e) => n + e.costCents.m, 0),
153
+ },
154
+ iterations,
155
+ stories: estimates.length,
156
+ };
157
+ }
158
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/commands/estimate/model.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../../src/commands/menu/prd.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,EAAE,CAqC/D"}
1
+ {"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../../src/commands/menu/prd.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,aAAa;IAC5B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,EAAE,CAsD/D"}
@@ -45,6 +45,23 @@ export function parsePrdInitiatives(md) {
45
45
  current.body += line + "\n";
46
46
  continue;
47
47
  }
48
+ // dash dogfood: PRDs also anchor sections as bold LIST ITEMS
49
+ // (`- **7.9a Title** {#anchor} — body…`). Only EXPLICITLY anchored
50
+ // bullets become initiatives — plain bullets stay body text.
51
+ const li = !inFence
52
+ ? /^\s*[-*]\s+\*\*(.+?)\*\*\s*\{#([\w-]+)\}\s*(?:[—–-]\s*)?(.*)$/.exec(line)
53
+ : null;
54
+ if (li) {
55
+ const parentLevel = current !== null ? current.level : 2;
56
+ flush();
57
+ current = {
58
+ anchor: li[2],
59
+ title: li[1].trim(),
60
+ level: parentLevel + 1,
61
+ body: (li[3] ?? "") + "\n",
62
+ };
63
+ continue;
64
+ }
48
65
  const h = !inFence ? /^(#{1,6})\s+(.+?)\s*$/.exec(line) : null;
49
66
  if (h) {
50
67
  flush();
@@ -1 +1 @@
1
- {"version":3,"file":"prd.js","sourceRoot":"","sources":["../../../src/commands/menu/prd.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,OAAO;SACX,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,uDAAuD;SAChF,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,IAAI,OAAO,GAAyB,IAAI,CAAC;IACzC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,GAAG,CAAC,OAAO,CAAC;YACnB,IAAI,OAAO;gBAAE,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;YACzC,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/D,IAAI,CAAC,EAAE,CAAC;YACN,KAAK,EAAE,CAAC;YACR,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;YAC3B,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YAClB,IAAI,MAAM,GAAkB,IAAI,CAAC;YACjC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;gBACtB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACzD,CAAC;YACD,OAAO,GAAG,EAAE,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACzE,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"prd.js","sourceRoot":"","sources":["../../../src/commands/menu/prd.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/reconcile/index.ts"],"names":[],"mappings":"AAuDA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyIlF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/reconcile/index.ts"],"names":[],"mappings":"AAuDA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0IlF"}
@@ -15,7 +15,7 @@
15
15
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
16
16
  import { join, resolve } from "node:path";
17
17
  import YAML from "yaml";
18
- import { AnthropicClient, RECONCILE_SYSTEM, formatCostFooter } from "@slowcook-ai/llm-anthropic";
18
+ import { createLlmClient, RECONCILE_SYSTEM, formatCostFooter } from "@slowcook-ai/llm-anthropic";
19
19
  import { listActiveSpecs, SPECS_DIR, schemas, normalizeScenarioArrays } from "../refine/spec-yaml.js";
20
20
  import { parsePrdInitiatives } from "../menu/prd.js";
21
21
  import { anchorHash } from "../trace/check.js";
@@ -90,12 +90,15 @@ export async function reconcile(argv, _cliVersion) {
90
90
  console.log("[dry-run] would call the model; skipping.");
91
91
  return;
92
92
  }
93
- const apiKey = process.env["ANTHROPIC_API_KEY"];
94
- if (!apiKey) {
95
- console.error("reconcile: ANTHROPIC_API_KEY not set (or pass --dry-run).");
93
+ // sc#233 — environment-decided runtime: ANTHROPIC_API_KEY or SLOWCOOK_LLM=claude-cli.
94
+ let llm;
95
+ try {
96
+ llm = await createLlmClient();
97
+ }
98
+ catch (err) {
99
+ console.error(`reconcile: ${err instanceof Error ? err.message : String(err)} (or pass --dry-run).`);
96
100
  process.exit(1);
97
101
  }
98
- const llm = new AnthropicClient(apiKey);
99
102
  const res = await llm.complete({
100
103
  system: RECONCILE_SYSTEM,
101
104
  cacheSystem: false,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/reconcile/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/reconcile/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAcxC,SAAS,GAAG,CAAC,IAAc,EAAE,IAAY;IACvC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1C,CAAC;AACD,MAAM,GAAG,GAAG,CAAC,IAAc,EAAE,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE3E,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACjD,OAAO;QACL,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;QACjF,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;QAC3E,iBAAiB,EAAE,OAAO,MAAM,CAAC,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE;KAChG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc,EAAE,WAAmB;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,aAAa,CAAC;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,aAAa,CAAC;IAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACtE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,mCAAmC,OAAO,OAAO,SAAS,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,wDAAwD,CAAC,CAAC;QACnG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,wBAAwB,MAAM,GAAG,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,mBAAmB,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAChG,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,sBAAsB,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,SAAS,OAAO,OAAO,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhD,MAAM,WAAW,GAAG;QAClB,wBAAwB;QACxB,WAAW,MAAM,EAAE;QACnB,UAAU,IAAI,CAAC,KAAK,EAAE;QACtB,EAAE;QACF,IAAI,CAAC,IAAI;QACT,EAAE;QACF,+BAA+B,OAAO,GAAG;QACzC,SAAS;QACT,QAAQ;QACR,KAAK;QACL,EAAE;QACF,6DAA6D;KAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,OAAO,MAAM,YAAY,KAAK,GAAG,CAAC,CAAC;IAE1E,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,sFAAsF;IACtF,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,eAAe,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC;QAC7B,MAAM,EAAE,gBAAgB;QACxB,WAAW,EAAE,KAAK;QAClB,KAAK;QACL,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAClD,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,IAAI,GAAoB,CAAC;IACzB,IAAI,CAAC;QACH,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,4CAA6C,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+EAA+E;IAC/E,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;IAC5F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,cAAc,CAAC,MAAM,oBAAoB,CAAC,CAAC;QAClE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,YAAY;YAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAEtD,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,+EAA+E;IAC/E,IAAI,SAAkB,CAAC;IACvB,IAAI,CAAC;QACH,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAA4B,CAAC,CAAC;IACpG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,iDAAkD,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAClH,sDAAsD;IACxD,CAAC;IAED,wEAAwE;IACxE,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAExE,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAC;YAC7F,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,SAAS,OAAO,iBAAiB,CAAC,CAAC;YACtF,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,eAAe,SAAS,UAAU,OAAO,iBAAiB,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,UAAU,OAAO,8DAA8D,CAAC,CAAC;IACzH,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,SAAS,OAAO,iBAAiB,CAAC,CAAC;QACtF,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,0BAA0B,SAAS,UAAU,OAAO,iBAAiB,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,mDAAmD,OAAO,qCAAqC,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/refine/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/commands/refine/agent.ts"],"names":[],"mappings":"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"}
@@ -95,7 +95,15 @@ export async function runRefinement(ctx) {
95
95
  // instead of silently omitting them. Same call is reused for the
96
96
  // relationship-analysis step below.
97
97
  const activeSpecs = listActiveSpecs(ctx.repoRoot);
98
- if (!issue.labels.includes(LABEL_MULTIFURCATION_PROPOSED)) {
98
+ // sc#240 — lineage guard: an issue born from an accepted split ("Split
99
+ // from #N" in the body, any phrasing) already had its granularity decided
100
+ // by the PM one round ago. Three dogfood occurrences of re-splitting such
101
+ // issues, zero true positives — skip the assessment deterministically.
102
+ const isSplitChild = /split from #\d+/i.test(issue.body ?? "");
103
+ if (isSplitChild) {
104
+ console.log(" multifurcation: skipped (split-lineage issue — granularity already PM-decided)");
105
+ }
106
+ if (!isSplitChild && !issue.labels.includes(LABEL_MULTIFURCATION_PROPOSED)) {
99
107
  const existingComments = await ctx.forge.listIssueComments(ctx.issueNumber);
100
108
  if (!hasExistingMultifurcationComment(existingComments)) {
101
109
  try {
@@ -593,7 +601,7 @@ const EmittedSpecSchema = z.object({
593
601
  note: z.string().optional(),
594
602
  }))
595
603
  .optional(),
596
- });
604
+ }).passthrough();
597
605
  /**
598
606
  * 0.11.6 — coerce common LLM emit variance to the shapes zod expects.
599
607
  * The amendment prompt already tells the agent "acceptance_scenarios is
@@ -688,7 +696,19 @@ export function parseAgentOutput(raw, ctx) {
688
696
  .join("\n")}\n\nRaw YAML:\n${yamlBlock.slice(0, 500)}`);
689
697
  }
690
698
  const d = parsed.data;
699
+ // sc#236 ROOT CAUSE — the passthrough parse preserved repo-local fields
700
+ // (prd_ref, epic, surfaces, …) but this hand-enumerated rebuild dropped
701
+ // them. Start from the model's extras; the enumerated fields win.
702
+ const KNOWN_REBUILD_KEYS = new Set([
703
+ "$schema", "story_id", "title", "status", "created_at", "supersedes",
704
+ "superseded_by", "token_budget_usd", "estimate", "source_issue",
705
+ "refined_by", "actors", "preconditions", "invariants", "api_contract",
706
+ "ui_behavior", "acceptance_scenarios", "non_goals", "related_specs",
707
+ "proposals",
708
+ ]);
709
+ const repoLocalExtras = Object.fromEntries(Object.entries(d).filter(([k]) => !KNOWN_REBUILD_KEYS.has(k)));
691
710
  const spec = {
711
+ ...repoLocalExtras,
692
712
  $schema: "./spec.schema.json",
693
713
  story_id: ctx.storyId,
694
714
  title: d.title,