@phamvuhoang/otto-core 0.20.0 → 0.22.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 (72) hide show
  1. package/dist/index.d.ts +5 -4
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +5 -4
  4. package/dist/index.js.map +1 -1
  5. package/dist/loop.d.ts.map +1 -1
  6. package/dist/loop.js +212 -19
  7. package/dist/loop.js.map +1 -1
  8. package/dist/model-tier.d.ts +5 -0
  9. package/dist/model-tier.d.ts.map +1 -1
  10. package/dist/model-tier.js +13 -0
  11. package/dist/model-tier.js.map +1 -1
  12. package/dist/panel.d.ts +37 -3
  13. package/dist/panel.d.ts.map +1 -1
  14. package/dist/panel.js +126 -39
  15. package/dist/panel.js.map +1 -1
  16. package/dist/plan-artifacts.d.ts +10 -0
  17. package/dist/plan-artifacts.d.ts.map +1 -0
  18. package/dist/plan-artifacts.js +63 -0
  19. package/dist/plan-artifacts.js.map +1 -0
  20. package/dist/plan-gate.d.ts +10 -1
  21. package/dist/plan-gate.d.ts.map +1 -1
  22. package/dist/plan-gate.js +22 -4
  23. package/dist/plan-gate.js.map +1 -1
  24. package/dist/plan-report-cli.d.ts +2 -1
  25. package/dist/plan-report-cli.d.ts.map +1 -1
  26. package/dist/plan-report-cli.js +9 -32
  27. package/dist/plan-report-cli.js.map +1 -1
  28. package/dist/plan-rubric.d.ts +24 -0
  29. package/dist/plan-rubric.d.ts.map +1 -1
  30. package/dist/plan-rubric.js +122 -0
  31. package/dist/plan-rubric.js.map +1 -1
  32. package/dist/render.d.ts.map +1 -1
  33. package/dist/render.js +3 -1
  34. package/dist/render.js.map +1 -1
  35. package/dist/report-finalize.d.ts +26 -0
  36. package/dist/report-finalize.d.ts.map +1 -0
  37. package/dist/report-finalize.js +222 -0
  38. package/dist/report-finalize.js.map +1 -0
  39. package/dist/report-rubric.d.ts +1 -1
  40. package/dist/report-rubric.d.ts.map +1 -1
  41. package/dist/report-rubric.js +3 -3
  42. package/dist/report-rubric.js.map +1 -1
  43. package/dist/review-severity.d.ts +41 -0
  44. package/dist/review-severity.d.ts.map +1 -0
  45. package/dist/review-severity.js +101 -0
  46. package/dist/review-severity.js.map +1 -0
  47. package/dist/risk.d.ts +3 -2
  48. package/dist/risk.d.ts.map +1 -1
  49. package/dist/risk.js +8 -7
  50. package/dist/risk.js.map +1 -1
  51. package/dist/run-report.d.ts +8 -0
  52. package/dist/run-report.d.ts.map +1 -1
  53. package/dist/run-report.js.map +1 -1
  54. package/dist/runner.d.ts +2 -0
  55. package/dist/runner.d.ts.map +1 -1
  56. package/dist/runner.js +1 -1
  57. package/dist/runner.js.map +1 -1
  58. package/dist/stage-exec.d.ts.map +1 -1
  59. package/dist/stage-exec.js +3 -2
  60. package/dist/stage-exec.js.map +1 -1
  61. package/package.json +1 -1
  62. package/templates/lens-guidance/correctness.md +1 -0
  63. package/templates/lens-guidance/security.md +1 -0
  64. package/templates/lens-guidance/structural.md +25 -0
  65. package/templates/lens-guidance/task-fit.md +1 -0
  66. package/templates/lens-guidance/tests.md +1 -0
  67. package/templates/plan.md +36 -4
  68. package/templates/quality-report.md +18 -9
  69. package/templates/report-rewrite.md +25 -0
  70. package/templates/review-lens.md +16 -1
  71. package/templates/review-synth.md +18 -2
  72. package/templates/review-verify.md +11 -6
@@ -45,6 +45,11 @@ export declare function routeModel(opts: {
45
45
  tier: ModelTier;
46
46
  reasons: string[];
47
47
  };
48
+ /** Base model tier per review lens (P14). Structural/security reasoning gets the
49
+ * strong tier; mechanical lenses run cheaper. Pin (OTTO_MODEL/OTTO_CLAUDE_MODEL)
50
+ * and failure-escalation still take precedence in resolveStageModel/routeModel. */
51
+ export declare const LENS_TIER: Record<string, ModelTier>;
52
+ export declare function tierForLens(lens: string): ModelTier;
48
53
  /** The model decision for one stage: the spec, the tier (when routed), and why. */
49
54
  export type StageModel = {
50
55
  spec: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"model-tier.d.ts","sourceRoot":"","sources":["../src/model-tier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,yCAAyC;AACzC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEnD,kGAAkG;AAClG,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE/D,gEAAgE;AAChE,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAQF,uFAAuF;AACvF,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,UAAU,CAOZ;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,cAAc,EACzB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAO9C;AAUD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBzC;AAED,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;CACrC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,GAAG,UAAU,CAYb"}
1
+ {"version":3,"file":"model-tier.d.ts","sourceRoot":"","sources":["../src/model-tier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,yCAAyC;AACzC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEnD,kGAAkG;AAClG,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE/D,gEAAgE;AAChE,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAQF,uFAAuF;AACvF,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,UAAU,CAOZ;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,cAAc,EACzB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAO9C;AAUD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAiBzC;AAED;;oFAEoF;AACpF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAM/C,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAEnD;AAED,mFAAmF;AACnF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;CACrC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,GAAG,UAAU,CAYb"}
@@ -78,6 +78,19 @@ export function routeModel(opts) {
78
78
  }
79
79
  return { tier, reasons };
80
80
  }
81
+ /** Base model tier per review lens (P14). Structural/security reasoning gets the
82
+ * strong tier; mechanical lenses run cheaper. Pin (OTTO_MODEL/OTTO_CLAUDE_MODEL)
83
+ * and failure-escalation still take precedence in resolveStageModel/routeModel. */
84
+ export const LENS_TIER = {
85
+ structural: "strong",
86
+ security: "strong",
87
+ correctness: "mid",
88
+ "task-fit": "mid",
89
+ tests: "cheap",
90
+ };
91
+ export function tierForLens(lens) {
92
+ return LENS_TIER[lens] ?? "mid";
93
+ }
81
94
  /**
82
95
  * Resolve the model spec for one stage. Precedence (back-compat invariant):
83
96
  * an explicit pin (OTTO_${RUNTIME}_MODEL / OTTO_MODEL) wins and disables
@@ -1 +1 @@
1
- {"version":3,"file":"model-tier.js","sourceRoot":"","sources":["../src/model-tier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-tier.js","sourceRoot":"","sources":["../src/model-tier.ts"],"names":[],"mappings":"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"}
package/dist/panel.d.ts CHANGED
@@ -1,6 +1,21 @@
1
- import type { AgentRuntimeId } from "./agent-runtime.js";
1
+ import { type AgentRuntimeId } from "./agent-runtime.js";
2
+ import { type TierLadder } from "./model-tier.js";
3
+ import type { RiskAssessment } from "./risk.js";
4
+ import { type Finding } from "./review-severity.js";
2
5
  import type { StageResult } from "./runner.js";
3
- import type { TokenMode } from "./tokens.js";
6
+ import { type TokenMode } from "./tokens.js";
7
+ /** Which lenses actually run this iteration. Router off → the full configured
8
+ * pool (today's behavior). Router on → risk-routed subset (Task 5). */
9
+ export declare function routedLenses(changedPaths: string[], available: string[], adaptiveRouter: boolean): string[];
10
+ /** Parse every lens's findings file, tag with its lens, and dedupe across lenses
11
+ * so the verifier sees each issue once. `total` is the pre-dedupe count. */
12
+ export declare function mergeLensFindings(files: {
13
+ lens: string;
14
+ text: string;
15
+ }[]): {
16
+ findings: Finding[];
17
+ total: number;
18
+ };
4
19
  /** Per-sub-agent control returned by the loop: budget-stop + adaptive cooldown. */
5
20
  export type PanelStageControl = {
6
21
  stop: boolean;
@@ -15,6 +30,18 @@ export type RunPanelOptions = {
15
30
  cooldownMs: number;
16
31
  tokenMode?: TokenMode;
17
32
  signal?: AbortSignal;
33
+ /** Changed paths this iteration; routes the lens subset when the adaptive
34
+ * router is on. Default `[]` (with router off) keeps the full pool. */
35
+ changedPaths?: string[];
36
+ /** Adaptive router on → risk-routed lens subset. Default false → full pool. */
37
+ adaptiveRouter?: boolean;
38
+ /** Model routing on → per-lens tier resolves through the ladder. Default false
39
+ * → runtime default model for every lens (today's behavior). */
40
+ modelRouting?: boolean;
41
+ /** tier → model ladder consulted when `modelRouting` resolves a lens tier. */
42
+ tierLadder?: TierLadder;
43
+ /** Change-risk assessment that modulates the routed per-lens tier. */
44
+ riskAssessment?: RiskAssessment;
18
45
  /** Active runtime id; threaded into each sub-stage so panel logs are runtime-labelled. */
19
46
  agentId?: AgentRuntimeId;
20
47
  /** Resume/switch note injected into each panel sub-stage prompt. */
@@ -30,8 +57,15 @@ export type RunPanelOptions = {
30
57
  * can write one evidence record per substage. The lens substages are named by
31
58
  * their lens (free text from OTTO_REVIEW_LENSES); verify/synth use their stage
32
59
  * names. `startedAt` is the ISO timestamp captured before the substage ran.
60
+ * `reviewSeverity` is passed only for the verify and synth substages.
33
61
  */
34
- recordStage?: (stageName: string, sr: StageResult, startedAt: string) => void;
62
+ recordStage?: (stageName: string, sr: StageResult, startedAt: string, reviewSeverity?: {
63
+ blocker: number;
64
+ major: number;
65
+ minor: number;
66
+ nit: number;
67
+ suppressed: number;
68
+ }) => void;
35
69
  };
36
70
  /** Harness-orchestrated reviewer panel: read-only lens reviews → one synth fix(review) commit. */
37
71
  export declare function runPanel(opts: RunPanelOptions): Promise<StageResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAkE7C,mFAAmF;AACnF,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,iBAAiB,CAAC;IACjD;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/E,CAAC;AAkBF,kGAAkG;AAClG,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAwK1E"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGxE,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9D;wEACwE;AACxE,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EAAE,EACnB,cAAc,EAAE,OAAO,GACtB,MAAM,EAAE,CAWV;AAED;6EAC6E;AAC7E,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACtC;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKxC;AAuFD,mFAAmF;AACnF,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;4EACwE;IACxE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;qEACiE;IACjE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,sEAAsE;IACtE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,0FAA0F;IAC1F,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,iBAAiB,CAAC;IACjD;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,WAAW,EACf,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAChG,IAAI,CAAC;CACX,CAAC;AAkBF,kGAAkG;AAClG,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CA+N1E"}
package/dist/panel.js CHANGED
@@ -1,9 +1,64 @@
1
1
  import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { join, posix } from "node:path";
3
+ import { DEFAULT_AGENT } from "./agent-runtime.js";
3
4
  import { git } from "./git.js";
4
5
  import { executeStage } from "./stage-exec.js";
6
+ import { tierForLens } from "./model-tier.js";
5
7
  import { sleep } from "./pacing.js";
8
+ import { classifyRisk, reviewDepthForLevel, selectLenses } from "./risk.js";
9
+ import { dedupeFindings, parseFindings, severityCounts, } from "./review-severity.js";
6
10
  import { bold, dim, green, red, SYM } from "./stream-render.js";
11
+ import { emptyTokenUsage } from "./tokens.js";
12
+ /** Which lenses actually run this iteration. Router off → the full configured
13
+ * pool (today's behavior). Router on → risk-routed subset (Task 5). */
14
+ export function routedLenses(changedPaths, available, adaptiveRouter) {
15
+ if (!adaptiveRouter)
16
+ return [...available];
17
+ const depth = reviewDepthForLevel(classifyRisk(changedPaths).level);
18
+ const routed = selectLenses(depth, available);
19
+ if (routed.length)
20
+ return routed;
21
+ // depth === "single" → no lens subset, but the panel always runs ≥1 lens.
22
+ // Fall back to the medium subset (correctness/tests/task-fit — drops the
23
+ // strong-tier structural/security lenses, matching the low-risk depth) before
24
+ // the full pool, so a low-risk change still gets a proportionate review.
25
+ const medium = selectLenses("lenses", available);
26
+ return medium.length ? medium : [...available];
27
+ }
28
+ /** Parse every lens's findings file, tag with its lens, and dedupe across lenses
29
+ * so the verifier sees each issue once. `total` is the pre-dedupe count. */
30
+ export function mergeLensFindings(files) {
31
+ const all = [];
32
+ for (const { lens, text } of files)
33
+ all.push(...parseFindings(text, lens).findings);
34
+ return { findings: dedupeFindings(all), total: all.length };
35
+ }
36
+ /** Serialize a deduped finding back to a wire-format line:
37
+ * `SEVERITY | file:line | claim | why | fix?` (the trailing `| fix` is omitted
38
+ * when there is no suggested fix). The verifier globs `findings-*.md`, so the
39
+ * single merged file matches and is read exactly once. */
40
+ function findingToWire(f) {
41
+ const loc = f.line ? `${f.file}:${f.line}` : f.file;
42
+ const head = `${f.severity} | ${loc} | ${f.claim} | ${f.why}`;
43
+ return f.suggestedFix ? `${head} | ${f.suggestedFix}` : head;
44
+ }
45
+ /** Bounded-concurrency map over `items` (inline to avoid coupling to fanout.ts).
46
+ * Preserves input order in the result array regardless of completion order. */
47
+ async function boundedMap(items, limit, fn) {
48
+ const out = new Array(items.length);
49
+ let next = 0;
50
+ const width = Math.max(1, Math.min(limit, items.length));
51
+ const worker = async () => {
52
+ while (next < items.length) {
53
+ const i = next++;
54
+ out[i] = await fn(items[i], i);
55
+ }
56
+ };
57
+ await Promise.all(Array.from({ length: width }, worker));
58
+ return out;
59
+ }
60
+ /** Max lens agents run concurrently (independent read-only reviews of one HEAD). */
61
+ const LENS_CONCURRENCY = 4;
7
62
  const LENS_STAGE = {
8
63
  name: "review-lens",
9
64
  template: "review-lens.md",
@@ -28,19 +83,6 @@ function outcomeLine(note, ok = true) {
28
83
  const mark = ok ? green(SYM.check) : red(SYM.cross);
29
84
  process.stderr.write(`${dim(SYM.cont)} ${mark} ${dim(note)}\n`);
30
85
  }
31
- /** Human count of a lens's findings from its free-form output ("skip" = no commit to review). */
32
- function findingsNote(result) {
33
- const t = result.trim();
34
- if (/<lens>\s*SKIP\s*<\/lens>/i.test(t))
35
- return "skipped (no commit)";
36
- const n = t
37
- .split("\n")
38
- .map((l) => l.trim())
39
- .filter((l) => /^[-*]\s+\S/.test(l)).length;
40
- if (n === 0)
41
- return "no findings";
42
- return `${n} finding${n === 1 ? "" : "s"}`;
43
- }
44
86
  function readVerdicts(panelHostDir) {
45
87
  try {
46
88
  const txt = readFileSync(join(panelHostDir, "verdicts.md"), "utf8");
@@ -75,7 +117,9 @@ function lensMutatedRepo(workspaceDir, baseHead) {
75
117
  }
76
118
  /** Harness-orchestrated reviewer panel: read-only lens reviews → one synth fix(review) commit. */
77
119
  export async function runPanel(opts) {
78
- const { lenses, workspaceDir, packageDir, iteration, maxRetries, cooldownMs, tokenMode = "off", signal, agentId, resumeNote = "", onStage, recordStage, } = opts;
120
+ const { workspaceDir, packageDir, iteration, maxRetries, cooldownMs, tokenMode = "off", signal, agentId, resumeNote = "", onStage, recordStage, } = opts;
121
+ // Router off → the full configured pool (today's behavior); on → risk-routed.
122
+ const lenses = routedLenses(opts.changedPaths ?? [], opts.lenses, opts.adaptiveRouter ?? false);
79
123
  const isoNow = () => new Date().toISOString();
80
124
  const panelRel = `panel-${process.pid}-${iteration}-${Date.now()}`;
81
125
  const panelHostDir = join(workspaceDir, ".otto-tmp", panelRel);
@@ -104,33 +148,76 @@ export async function runPanel(opts) {
104
148
  return false;
105
149
  };
106
150
  try {
107
- // 1. Lenses — each finds defects through one lens, read-only.
108
- for (let i = 0; i < lenses.length; i++) {
109
- const lens = lenses[i];
110
- phaseLine(`${lens} lens (${i + 1}/${lenses.length})`);
111
- const lensStartedAt = isoNow();
112
- const sr = await executeStage({
113
- stage: LENS_STAGE,
114
- vars: { LENS: lens, RESUME: resumeNote },
115
- workspaceDir,
116
- packageDir,
117
- iteration,
118
- maxRetries,
119
- tokenMode,
120
- signal,
121
- agentId,
122
- logLabel: `lens-${lens}`,
123
- });
124
- restoreIfMutated(`lens ${lens}`);
125
- writeFileSync(join(panelHostDir, `findings-${lens}.md`), sr.result, "utf8");
126
- outcomeLine(findingsNote(sr.result));
151
+ // 1. Lenses — each finds defects through one lens, read-only. Run them
152
+ // concurrently (bounded) since they are independent reads of the same
153
+ // HEAD. The per-lens reset guard is UNSAFE while siblings run, so we do
154
+ // NOT restore inside the parallel region — the worktree started
155
+ // tracked-clean (when enforceReadOnly), so a single end-of-batch reset
156
+ // below undoes any read-only violation by any lens before verify runs.
157
+ phaseLine(`${lenses.length} lenses (parallel): ${lenses.join(", ")}`);
158
+ const lensStartedAt = isoNow();
159
+ // boundedMap preserves input (lens-index) order in `results`.
160
+ const results = await boundedMap(lenses, LENS_CONCURRENCY, (lens) => executeStage({
161
+ stage: { ...LENS_STAGE, tier: tierForLens(lens) },
162
+ vars: { LENS: lens, RESUME: resumeNote },
163
+ workspaceDir,
164
+ packageDir,
165
+ iteration,
166
+ maxRetries,
167
+ tokenMode,
168
+ signal,
169
+ agentId,
170
+ logLabel: `lens-${lens}`,
171
+ modelRouting: opts.modelRouting,
172
+ tierLadder: opts.tierLadder,
173
+ riskAssessment: opts.riskAssessment,
174
+ }).then((sr) => ({ lens, sr })));
175
+ // One reset for the whole batch: undoes any tracked mutation/commit a lens
176
+ // made in violation of the read-only contract, before the verifier reads.
177
+ restoreIfMutated("lenses");
178
+ // Emit evidence + budget control in lens-INDEX order (deterministic), even
179
+ // though the agents ran concurrently. onStage still owns the budget stop —
180
+ // but since every lens already ran, a stop just skips verify + synth.
181
+ let stop = false;
182
+ let cooldownFactor = 1;
183
+ for (const { lens, sr } of results) {
184
+ const parsed = parseFindings(sr.result, lens).findings.length;
185
+ outcomeLine(/<lens>\s*SKIP\s*<\/lens>/i.test(sr.result.trim())
186
+ ? "skipped (no commit)"
187
+ : `${parsed} finding${parsed === 1 ? "" : "s"}`);
127
188
  recordStage?.(lens, sr, lensStartedAt);
128
189
  const ctrl = onStage?.(sr) ?? { stop: false, cooldownFactor: 1 };
129
190
  if (ctrl.stop)
130
- return sr; // budget exhausted — skip remaining lenses + verify + synth
131
- if (cooldownMs > 0)
132
- await sleep(cooldownMs * ctrl.cooldownFactor, signal);
191
+ stop = true;
192
+ // Lenses ran concurrently, so there is one batch cooldown — pace it by the
193
+ // most-throttled lens (max factor) to honor adaptive backoff.
194
+ cooldownFactor = Math.max(cooldownFactor, ctrl.cooldownFactor);
195
+ }
196
+ if (stop) {
197
+ // Budget exhausted — skip verify + synth, return the last lens result.
198
+ return results[results.length - 1].sr;
133
199
  }
200
+ // Merge + dedupe across lenses into a single findings-merged.md so the
201
+ // verifier (which globs findings-*.md) reads each issue exactly once. We
202
+ // deliberately do NOT also write per-lens findings-<lens>.md files — both
203
+ // would double-count under the glob.
204
+ const { findings } = mergeLensFindings(results.map((r) => ({ lens: r.lens, text: r.sr.result })));
205
+ const counts = severityCounts(findings);
206
+ if (findings.length === 0) {
207
+ // Nothing to verify or fix — return a synthetic clean result.
208
+ outcomeLine("no findings — skipping verify + synth");
209
+ return {
210
+ result: "<review>OK</review>",
211
+ costUsd: 0,
212
+ isError: false,
213
+ apiErrorStatus: null,
214
+ usage: emptyTokenUsage(),
215
+ runtimeId: agentId ?? DEFAULT_AGENT,
216
+ };
217
+ }
218
+ writeFileSync(join(panelHostDir, "findings-merged.md"), findings.map(findingToWire).join("\n") + "\n", "utf8");
219
+ if (cooldownMs > 0)
220
+ await sleep(cooldownMs * cooldownFactor, signal);
134
221
  // 2. Adversarial verify — a skeptic refutes the lens findings, writing
135
222
  // verdicts.md (CONFIRMED/REJECTED) so synth only fixes survivors.
136
223
  phaseLine("adversarial verify");
@@ -148,7 +235,7 @@ export async function runPanel(opts) {
148
235
  logLabel: "verify",
149
236
  });
150
237
  restoreIfMutated("verify");
151
- recordStage?.(VERIFY_STAGE.name, verify, verifyStartedAt);
238
+ recordStage?.(VERIFY_STAGE.name, verify, verifyStartedAt, counts);
152
239
  const verdicts = readVerdicts(panelHostDir);
153
240
  if (verdicts.exists) {
154
241
  outcomeLine(`${verdicts.confirmed} confirmed, ${verdicts.rejected} rejected`);
@@ -204,7 +291,7 @@ export async function runPanel(opts) {
204
291
  else {
205
292
  outcomeLine("clean — no fix needed");
206
293
  }
207
- recordStage?.(SYNTH_STAGE.name, synth, synthStartedAt);
294
+ recordStage?.(SYNTH_STAGE.name, synth, synthStartedAt, counts);
208
295
  onStage?.(synth);
209
296
  return synth;
210
297
  }
package/dist/panel.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"panel.js","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAGhE,MAAM,UAAU,GAAG;IACjB,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,gBAAgB;IAC1B,cAAc,EAAE,mBAAmB;CACpC,CAAC;AACF,MAAM,YAAY,GAAG;IACnB,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE,kBAAkB;IAC5B,cAAc,EAAE,mBAAmB;CACpC,CAAC;AACF,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,iBAAiB;IAC3B,cAAc,EAAE,mBAAmB;CACpC,CAAC;AAEF,8CAA8C;AAC9C,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,CAC/D,CAAC;AACJ,CAAC;AACD,2EAA2E;AAC3E,SAAS,WAAW,CAAC,IAAY,EAAE,EAAE,GAAG,IAAI;IAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,iGAAiG;AACjG,SAAS,YAAY,CAAC,MAAc;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,qBAAqB,CAAC;IACtE,MAAM,CAAC,GAAG,CAAC;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IAClC,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC7C,CAAC;AAMD,SAAS,YAAY,CAAC,YAAoB;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM;YACzD,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM;SACxD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAED;sFACsF;AACtF,SAAS,aAAa,CAAC,YAAoB;IACzC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;AAC/B,CAAC;AAiCD,iFAAiF;AACjF,SAAS,aAAa,CAAC,YAAoB;IACzC,OAAO,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,sBAAsB,CAAC,EAAE,YAAY,CAAC,CAAC;AAC9E,CAAC;AAED,qEAAqE;AACrE,SAAS,eAAe,CACtB,YAAoB,EACpB,QAAuB;IAEvB,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACvE,gFAAgF;IAChF,OAAO,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAqB;IAClD,MAAM,EACJ,MAAM,EACN,YAAY,EACZ,UAAU,EACV,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,GAAG,KAAK,EACjB,MAAM,EACN,OAAO,EACP,UAAU,GAAG,EAAE,EACf,OAAO,EACP,WAAW,GACZ,GAAG,IAAI,CAAC;IACT,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,SAAS,OAAO,CAAC,GAAG,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACnE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC/D,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,iFAAiF;IACjF,iFAAiF;IACjF,8EAA8E;IAC9E,kFAAkF;IAClF,mFAAmF;IACnF,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,eAAe,GACnB,QAAQ,IAAI,IAAI,IAAI,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IACzD,IAAI,QAAQ,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,gHAAgH,CAAC,IAAI,CAC/I,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC;IAEjE,yEAAyE;IACzE,2EAA2E;IAC3E,2EAA2E;IAC3E,4EAA4E;IAC5E,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAW,EAAE;QAChD,IAAI,eAAe,IAAI,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,0DAA0D,QAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CACtH,CAAC;YACF,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAS,CAAC,EAAE,YAAY,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,8DAA8D;QAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,SAAS,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACtD,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC;gBAC5B,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE;gBACxC,YAAY;gBACZ,UAAU;gBACV,SAAS;gBACT,UAAU;gBACV,SAAS;gBACT,MAAM;gBACN,OAAO;gBACP,QAAQ,EAAE,QAAQ,IAAI,EAAE;aACzB,CAAC,CAAC;YACH,gBAAgB,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YACjC,aAAa,CACX,IAAI,CAAC,YAAY,EAAE,YAAY,IAAI,KAAK,CAAC,EACzC,EAAE,CAAC,MAAM,EACT,MAAM,CACP,CAAC;YACF,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YACrC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;YAEvC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;YACjE,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC,CAAC,4DAA4D;YACtF,IAAI,UAAU,GAAG,CAAC;gBAAE,MAAM,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC5E,CAAC;QAED,uEAAuE;QACvE,qEAAqE;QACrE,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAChC,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE;YAC1D,YAAY;YACZ,UAAU;YACV,SAAS;YACT,UAAU;YACV,SAAS;YACT,MAAM;YACN,OAAO;YACP,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;QACH,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,WAAW,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;QAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,WAAW,CACT,GAAG,QAAQ,CAAC,SAAS,eAAe,QAAQ,CAAC,QAAQ,WAAW,CACjE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACtE,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC,CAAC,gCAAgC;QAE/D,yEAAyE;QACzE,yEAAyE;QACzE,wEAAwE;QACxE,qEAAqE;QACrE,+DAA+D;QAC/D,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,WAAW,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YACvE,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,UAAU,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAE3E,qEAAqE;QACrE,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9B,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;YAC/B,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE;YAC1D,YAAY;YACZ,UAAU;YACV,SAAS;YACT,UAAU;YACV,SAAS;YACT,MAAM;YACN,OAAO;YACP,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,2EAA2E;QAC3E,8EAA8E;QAC9E,qEAAqE;QACrE,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,QAAQ,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,QAAQ,CAAC;QAC1E,MAAM,KAAK,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,OAAO,GACX,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,YAAY,CAAC,IAAI,aAAa,CAAC;QACnE,IAAI,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,WAAW,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YAC9B,WAAW,CACT,cAAc,OAAO,mCAAmC,EACxD,KAAK,CACN,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,EAAE,CAAC;YACjB,WAAW,CACT,2DAA2D,EAC3D,KAAK,CACN,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QACD,WAAW,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../src/panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type TaskPlanDocument = {
2
+ taskKey: string;
3
+ specPath: string;
4
+ planPath: string;
5
+ doc: string;
6
+ updatedMs: number;
7
+ };
8
+ export declare function readTaskPlanDocuments(workspaceDir: string): TaskPlanDocument[];
9
+ export declare function latestTaskPlanDocument(workspaceDir: string): TaskPlanDocument | null;
10
+ //# sourceMappingURL=plan-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-artifacts.d.ts","sourceRoot":"","sources":["../src/plan-artifacts.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAsBF,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,GACnB,gBAAgB,EAAE,CA4BpB;AAED,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,GACnB,gBAAgB,GAAG,IAAI,CASzB"}
@@ -0,0 +1,63 @@
1
+ import { readFileSync, readdirSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ function readOptional(path) {
4
+ try {
5
+ return readFileSync(path, "utf8");
6
+ }
7
+ catch {
8
+ return "";
9
+ }
10
+ }
11
+ function updatedMs(paths) {
12
+ let latest = 0;
13
+ for (const p of paths) {
14
+ try {
15
+ latest = Math.max(latest, statSync(p).mtimeMs);
16
+ }
17
+ catch {
18
+ // Missing spec.md or plan.md is fine; callers score whatever exists.
19
+ }
20
+ }
21
+ return latest;
22
+ }
23
+ export function readTaskPlanDocuments(workspaceDir) {
24
+ const tasksDir = join(workspaceDir, ".otto", "tasks");
25
+ let entries;
26
+ try {
27
+ entries = readdirSync(tasksDir, { withFileTypes: true })
28
+ .filter((e) => e.isDirectory())
29
+ .map((e) => e.name)
30
+ .sort();
31
+ }
32
+ catch {
33
+ return [];
34
+ }
35
+ const docs = [];
36
+ for (const taskKey of entries) {
37
+ const specPath = join(".otto", "tasks", taskKey, "spec.md");
38
+ const planPath = join(".otto", "tasks", taskKey, "plan.md");
39
+ const absSpec = join(workspaceDir, specPath);
40
+ const absPlan = join(workspaceDir, planPath);
41
+ const doc = [readOptional(absSpec), readOptional(absPlan)].join("\n");
42
+ if (doc.trim() === "")
43
+ continue;
44
+ docs.push({
45
+ taskKey,
46
+ specPath,
47
+ planPath,
48
+ doc,
49
+ updatedMs: updatedMs([absSpec, absPlan]),
50
+ });
51
+ }
52
+ return docs;
53
+ }
54
+ export function latestTaskPlanDocument(workspaceDir) {
55
+ const docs = readTaskPlanDocuments(workspaceDir);
56
+ if (docs.length === 0)
57
+ return null;
58
+ return docs
59
+ .slice()
60
+ .sort((a, b) => a.updatedMs - b.updatedMs || a.taskKey.localeCompare(b.taskKey))
61
+ .at(-1);
62
+ }
63
+ //# sourceMappingURL=plan-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-artifacts.js","sourceRoot":"","sources":["../src/plan-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAUjC,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;QACvE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,YAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aACrD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAuB,EAAE,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QAChC,IAAI,CAAC,IAAI,CAAC;YACR,OAAO;YACP,QAAQ;YACR,QAAQ;YACR,GAAG;YACH,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,YAAoB;IAEpB,MAAM,IAAI,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,IAAI;SACR,KAAK,EAAE;SACP,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAC1E;SACA,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;AACb,CAAC"}
@@ -7,13 +7,14 @@
7
7
  * `--plan-report` quality flag. Pure: takes a {@link PlanRubricScore}, returns the
8
8
  * verdict; triggers no re-plan itself (loop wiring is a follow-up).
9
9
  */
10
- import type { PlanRubricScore } from "./plan-rubric.js";
10
+ import type { PlanDepthScore, PlanRubricScore } from "./plan-rubric.js";
11
11
  /**
12
12
  * Default ratio a plan must reach to clear the gate. 0.75 = three-quarters of the
13
13
  * rubric criteria; tuned so a plan missing one or two sections still passes but a
14
14
  * thin plan (no scope guard, no tasks, no verify) does not.
15
15
  */
16
16
  export declare const DEFAULT_PLAN_QUALITY_THRESHOLD = 0.75;
17
+ export declare const DEFAULT_PLAN_DEPTH_THRESHOLD = 1;
17
18
  export type PlanGateVerdict = {
18
19
  passed: boolean;
19
20
  /** The plan's rubric ratio (0..1). */
@@ -24,6 +25,12 @@ export type PlanGateVerdict = {
24
25
  missing: string[];
25
26
  /** Criteria still needed to reach the threshold; 0 when passed. */
26
27
  shortfall: number;
28
+ /** Optional depth-gate ratio when a caller supplies the P13 depth score. */
29
+ depthRatio?: number;
30
+ /** Depth threshold applied, when present. */
31
+ depthThreshold?: number;
32
+ /** Depth criteria missing, when present. */
33
+ depthMissing?: string[];
27
34
  };
28
35
  /**
29
36
  * Assess a rubric score against the quality threshold. A plan passes when its
@@ -32,6 +39,8 @@ export type PlanGateVerdict = {
32
39
  */
33
40
  export declare function assessPlanGate(score: PlanRubricScore, opts?: {
34
41
  threshold?: number;
42
+ depth?: PlanDepthScore;
43
+ depthThreshold?: number;
35
44
  }): PlanGateVerdict;
36
45
  /**
37
46
  * Render a gate verdict: a `PASS`/`FAIL` line with the ratio vs threshold, and —
@@ -1 +1 @@
1
- {"version":3,"file":"plan-gate.d.ts","sourceRoot":"","sources":["../src/plan-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,OAAO,CAAC;AAEnD,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,eAAe,EACtB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,eAAe,CAWjB;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CASzD"}
1
+ {"version":3,"file":"plan-gate.d.ts","sourceRoot":"","sources":["../src/plan-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,OAAO,CAAC;AACnD,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,eAAe,EACtB,IAAI,GAAE;IACJ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACpB,GACL,eAAe,CAoBjB;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAqBzD"}
package/dist/plan-gate.js CHANGED
@@ -13,6 +13,7 @@
13
13
  * thin plan (no scope guard, no tasks, no verify) does not.
14
14
  */
15
15
  export const DEFAULT_PLAN_QUALITY_THRESHOLD = 0.75;
16
+ export const DEFAULT_PLAN_DEPTH_THRESHOLD = 1;
16
17
  /**
17
18
  * Assess a rubric score against the quality threshold. A plan passes when its
18
19
  * ratio is at or above the threshold; otherwise `shortfall` is how many more
@@ -20,14 +21,23 @@ export const DEFAULT_PLAN_QUALITY_THRESHOLD = 0.75;
20
21
  */
21
22
  export function assessPlanGate(score, opts = {}) {
22
23
  const threshold = opts.threshold ?? DEFAULT_PLAN_QUALITY_THRESHOLD;
23
- const passed = score.ratio >= threshold;
24
+ const depthThreshold = opts.depthThreshold ?? DEFAULT_PLAN_DEPTH_THRESHOLD;
25
+ const depthPassed = opts.depth ? opts.depth.ratio >= depthThreshold : true;
26
+ const passed = score.ratio >= threshold && depthPassed;
24
27
  const needed = Math.ceil(threshold * score.maxScore) - score.metCount;
25
28
  return {
26
29
  passed,
27
30
  ratio: score.ratio,
28
31
  threshold,
29
32
  missing: score.missing,
30
- shortfall: passed ? 0 : Math.max(0, needed),
33
+ shortfall: score.ratio >= threshold ? 0 : Math.max(0, needed),
34
+ ...(opts.depth
35
+ ? {
36
+ depthRatio: opts.depth.ratio,
37
+ depthThreshold,
38
+ depthMissing: opts.depth.missing,
39
+ }
40
+ : {}),
31
41
  };
32
42
  }
33
43
  const pct = new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 });
@@ -40,7 +50,15 @@ export function formatPlanGate(v) {
40
50
  `(${pct.format(v.ratio * 100)}% vs ${pct.format(v.threshold * 100)}% threshold)`;
41
51
  if (v.passed)
42
52
  return head;
43
- return (head +
44
- `\n re-plan to add ${v.shortfall} more: ${v.missing.join(", ") || "—"}`);
53
+ const lines = [head];
54
+ if (v.shortfall > 0) {
55
+ lines.push(` re-plan to add ${v.shortfall} more: ${v.missing.join(", ") || "—"}`);
56
+ }
57
+ if (v.depthRatio != null &&
58
+ v.depthThreshold != null &&
59
+ v.depthRatio < v.depthThreshold) {
60
+ lines.push(` deepen plan: ${pct.format(v.depthRatio * 100)}% vs ${pct.format(v.depthThreshold * 100)}% depth threshold; missing ${v.depthMissing?.join(", ") || "—"}`);
61
+ }
62
+ return lines.join("\n");
45
63
  }
46
64
  //# sourceMappingURL=plan-gate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plan-gate.js","sourceRoot":"","sources":["../src/plan-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;GAIG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAcnD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAsB,EACtB,OAA+B,EAAE;IAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,8BAA8B,CAAC;IACnE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;IACtE,OAAO;QACL,MAAM;QACN,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS;QACT,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;AAEzE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,CAAkB;IAC/C,MAAM,IAAI,GACR,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG;QAC3C,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC;IACnF,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,CACL,IAAI;QACJ,sBAAsB,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CACzE,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"plan-gate.js","sourceRoot":"","sources":["../src/plan-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;GAIG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC;AACnD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAoB9C;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAsB,EACtB,OAII,EAAE;IAEN,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,8BAA8B,CAAC;IACnE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,4BAA4B,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,SAAS,IAAI,WAAW,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;IACtE,OAAO;QACL,MAAM;QACN,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS;QACT,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAC;gBACE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;gBAC5B,cAAc;gBACd,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;aACjC;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;AAEzE;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,CAAkB;IAC/C,MAAM,IAAI,GACR,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG;QAC3C,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC;IACnF,IAAI,CAAC,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CACR,oBAAoB,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CACvE,CAAC;IACJ,CAAC;IACD,IACE,CAAC,CAAC,UAAU,IAAI,IAAI;QACpB,CAAC,CAAC,cAAc,IAAI,IAAI;QACxB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,cAAc,EAC/B,CAAC;QACD,KAAK,CAAC,IAAI,CACR,kBAAkB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,8BAA8B,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAC5J,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { type PlanRubricScore } from "./plan-rubric.js";
1
+ import { type PlanDepthScore, type PlanRubricScore } from "./plan-rubric.js";
2
2
  /**
3
3
  * `otto-afk --plan-report` read-only surface (issue #63 P8, slice 3).
4
4
  *
@@ -19,6 +19,7 @@ export type PlanReportDeps = {
19
19
  export type TaskPlanScore = {
20
20
  taskKey: string;
21
21
  score: PlanRubricScore;
22
+ depth: PlanDepthScore;
22
23
  };
23
24
  /**
24
25
  * Render the per-task plan scorecards into one report. Pure: takes the already
@@ -1 +1 @@
1
- {"version":3,"file":"plan-report-cli.d.ts","sourceRoot":"","sources":["../src/plan-report-cli.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;GAQG;AAEH,4FAA4F;AAC5F,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B,CAAC;AASF,qDAAqD;AACrD,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAW/D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,CA0BnE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,GAAE,cAA4B,GACjC,OAAO,CAAC,MAAM,CAAC,CAYjB"}
1
+ {"version":3,"file":"plan-report-cli.d.ts","sourceRoot":"","sources":["../src/plan-report-cli.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;GAQG;AAEH,4FAA4F;AAC5F,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B,CAAC;AASF,qDAAqD;AACrD,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAY/D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,EAAE,CAMnE;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,IAAI,GAAE,cAA4B,GACjC,OAAO,CAAC,MAAM,CAAC,CAYjB"}