@codyswann/lisa 2.272.0 → 2.274.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 (78) hide show
  1. package/dist/cli/doctor-readiness-blockers.d.ts +154 -0
  2. package/dist/cli/doctor-readiness-blockers.d.ts.map +1 -0
  3. package/dist/cli/doctor-readiness-blockers.js +280 -0
  4. package/dist/cli/doctor-readiness-blockers.js.map +1 -0
  5. package/dist/cli/doctor-readiness-journey-freshness.d.ts +36 -0
  6. package/dist/cli/doctor-readiness-journey-freshness.d.ts.map +1 -0
  7. package/dist/cli/doctor-readiness-journey-freshness.js +166 -0
  8. package/dist/cli/doctor-readiness-journey-freshness.js.map +1 -0
  9. package/dist/cli/doctor-readiness-journey.d.ts +110 -0
  10. package/dist/cli/doctor-readiness-journey.d.ts.map +1 -0
  11. package/dist/cli/doctor-readiness-journey.js +233 -0
  12. package/dist/cli/doctor-readiness-journey.js.map +1 -0
  13. package/dist/cli/doctor-readiness.d.ts +9 -5
  14. package/dist/cli/doctor-readiness.d.ts.map +1 -1
  15. package/dist/cli/doctor-readiness.js +40 -27
  16. package/dist/cli/doctor-readiness.js.map +1 -1
  17. package/dist/cli/doctor-worker-epoch.d.ts +5 -0
  18. package/dist/cli/doctor-worker-epoch.d.ts.map +1 -1
  19. package/dist/cli/doctor-worker-epoch.js +10 -134
  20. package/dist/cli/doctor-worker-epoch.js.map +1 -1
  21. package/dist/cli/doctor-worker-journey.d.ts +118 -0
  22. package/dist/cli/doctor-worker-journey.d.ts.map +1 -0
  23. package/dist/cli/doctor-worker-journey.js +222 -0
  24. package/dist/cli/doctor-worker-journey.js.map +1 -0
  25. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  26. package/dist/core/upstream-evidence-manifest.js +17 -0
  27. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  28. package/package.json +1 -1
  29. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  31. package/plugins/lisa-agy/plugin.json +1 -1
  32. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  35. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-expo-agy/plugin.json +1 -1
  42. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  47. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  52. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  57. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  62. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-rails-agy/plugin.json +1 -1
  67. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  72. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  77. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Readiness journey-evidence wiring (RRR-6, #1858).
3
+ *
4
+ * The execution/proof readiness dimension may not *assume* end-to-end
5
+ * operability — the PRD requires it to be backed by at least one representative
6
+ * journey executed by the configured worker. #1742 already ships that journey
7
+ * machinery inside `lisa doctor`; this module connects it to the readiness
8
+ * verdict without building a second harness (intake decision F5). It consumes
9
+ * the shared runner in `doctor-worker-journey.ts`, applies a freshness contract
10
+ * (same worker signature, evidence newer than the current artifact head), and:
11
+ *
12
+ * - reuses fresh qualification evidence, running no journey;
13
+ * - triggers a `lisa-use-the-product` journey when evidence is absent or stale,
14
+ * respecting the per-environment mutation policy from `.lisa.config.json`
15
+ * (a `forbidden` policy renders `SKIP` naming the policy — readiness never
16
+ * overrides it);
17
+ * - reports the claim as *not established* (a stated-reason `SKIP`, never a
18
+ * guessed pass) when a journey cannot be run;
19
+ * - files a build-ready ticket through the existing #1742 path and stands up
20
+ * blocker 7 when a journey fails, expressed in PRD #1738's claim→evidence
21
+ * shape so there is one evidence definition across both PRDs.
22
+ *
23
+ * It also surfaces #1742's scaffolding-subtraction candidate count into the
24
+ * proportionality dimension's `machinery_to_remove` field — surfaced, never
25
+ * auto-deleted. Warn-only per intake decision O1: nothing here hard-blocks.
26
+ * @module cli/doctor-readiness-journey
27
+ */
28
+ import { type MutationPolicy, resolveMutationPolicy } from "./doctor-readiness-journey-freshness.js";
29
+ import { type RuntimeWorkerSignature } from "./doctor-worker-journey.js";
30
+ export { resolveMutationPolicy, type MutationPolicy };
31
+ /** The execution/proof readiness dimension id (readiness-rubric, RRR-1). */
32
+ export declare const EXECUTION_PROOF_DIMENSION_ID = "execution-proof";
33
+ /** The proportionality readiness dimension id (readiness-rubric, RRR-1). */
34
+ export declare const PROPORTIONALITY_DIMENSION_ID = "proportionality";
35
+ /** Per-dimension status, mirroring the shared doctor readiness statuses. */
36
+ type ReadinessStatus = "PASS" | "WARN" | "FAIL" | "SKIP";
37
+ /** A per-dimension record the readiness collector persists. */
38
+ export interface JourneyDimensionRecord {
39
+ readonly id: string;
40
+ readonly status: ReadinessStatus;
41
+ readonly findings: readonly unknown[];
42
+ }
43
+ /** The outcome of running a representative journey. */
44
+ export type JourneyOutcome = {
45
+ readonly result: "passed";
46
+ readonly evidence: string;
47
+ } | {
48
+ readonly result: "failed";
49
+ readonly evidence: string;
50
+ readonly failureDetail?: string;
51
+ };
52
+ /** Context handed to a representative-journey runner. */
53
+ export interface JourneyRunContext {
54
+ readonly targetPath: string;
55
+ readonly signature: RuntimeWorkerSignature;
56
+ readonly mutationPolicy: MutationPolicy;
57
+ }
58
+ /** Runs one representative journey through `lisa-use-the-product`. */
59
+ export type JourneyRunner = (context: JourneyRunContext) => Promise<JourneyOutcome>;
60
+ /** The build-ready ticket a failing journey files through the #1742 path. */
61
+ export interface JourneyTicketRequest {
62
+ readonly summary: string;
63
+ readonly detail: string;
64
+ readonly signature: RuntimeWorkerSignature;
65
+ }
66
+ /** Files a build-ready ticket and returns its reference. */
67
+ export type JourneyTicketFiler = (request: JourneyTicketRequest) => Promise<string>;
68
+ /** Options for {@link assessExecutionProofDimension}. */
69
+ export interface ExecutionProofOptions {
70
+ /** Injected "now"; defaults to the current time. */
71
+ readonly now?: Date;
72
+ /**
73
+ * Injected artifact-head timestamp for the freshness comparison. When omitted,
74
+ * it is resolved from the git HEAD commit time; when that cannot be resolved,
75
+ * freshness falls back to "no drift and evidence present".
76
+ */
77
+ readonly artifactHead?: Date | null;
78
+ /**
79
+ * The representative-journey runner. Omitted means the journey cannot be run
80
+ * in this context (headless/no worker) — the claim is reported as *not
81
+ * established* rather than assumed.
82
+ */
83
+ readonly runJourney?: JourneyRunner;
84
+ /** Files a build-ready ticket on a failing journey (default: no-op recorder). */
85
+ readonly fileTicket?: JourneyTicketFiler;
86
+ /** Overrides the resolved mutation policy (default: read `.lisa.config.json`). */
87
+ readonly mutationPolicy?: MutationPolicy;
88
+ }
89
+ /** Options for {@link assessProportionalityDimension}. */
90
+ export interface ProportionalityOptions {
91
+ /** Overrides the resolved subtraction-candidate count (default: scan the repo). */
92
+ readonly subtractionCount?: number;
93
+ }
94
+ /**
95
+ * Assess the execution/proof dimension by reusing #1742's journey machinery.
96
+ * @param targetPath - Project path to assess
97
+ * @param options - Injected collaborators and freshness inputs
98
+ * @returns The execution/proof dimension record
99
+ */
100
+ export declare function assessExecutionProofDimension(targetPath: string, options?: ExecutionProofOptions): Promise<JourneyDimensionRecord>;
101
+ /**
102
+ * Assess the proportionality dimension: surface #1742's scaffolding-subtraction
103
+ * candidate count into `machinery_to_remove`. Surfaced, never auto-deleted
104
+ * (intake decision, RRR-6 technical approach point 6); it is never a blocker.
105
+ * @param targetPath - Project path to scan
106
+ * @param options - Injected subtraction count
107
+ * @returns The proportionality dimension record
108
+ */
109
+ export declare function assessProportionalityDimension(targetPath: string, options?: ProportionalityOptions): Promise<JourneyDimensionRecord>;
110
+ //# sourceMappingURL=doctor-readiness-journey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-readiness-journey.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-journey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAEL,KAAK,cAAc,EACnB,qBAAqB,EAEtB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAEL,KAAK,sBAAsB,EAE5B,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,CAAC;AAEtD,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,oBAAoB,CAAC;AAE9D,4EAA4E;AAC5E,eAAO,MAAM,4BAA4B,oBAAoB,CAAC;AAU9D,4EAA4E;AAC5E,KAAK,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEzD,+DAA+D;AAC/D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED,uDAAuD;AACvD,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACxD;IACE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEN,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC;AAED,sEAAsE;AACtE,MAAM,MAAM,aAAa,GAAG,CAC1B,OAAO,EAAE,iBAAiB,KACvB,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,6EAA6E;AAC7E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;CAC5C;AAED,4DAA4D;AAC5D,MAAM,MAAM,kBAAkB,GAAG,CAC/B,OAAO,EAAE,oBAAoB,KAC1B,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,yDAAyD;AACzD,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC;IACpC,iFAAiF;IACjF,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IACzC,kFAAkF;IAClF,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;CAC1C;AAED,0DAA0D;AAC1D,MAAM,WAAW,sBAAsB;IACrC,mFAAmF;IACnF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAsBjC;AAED;;;;;;;GAOG;AACH,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAuBjC"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Readiness journey-evidence wiring (RRR-6, #1858).
3
+ *
4
+ * The execution/proof readiness dimension may not *assume* end-to-end
5
+ * operability — the PRD requires it to be backed by at least one representative
6
+ * journey executed by the configured worker. #1742 already ships that journey
7
+ * machinery inside `lisa doctor`; this module connects it to the readiness
8
+ * verdict without building a second harness (intake decision F5). It consumes
9
+ * the shared runner in `doctor-worker-journey.ts`, applies a freshness contract
10
+ * (same worker signature, evidence newer than the current artifact head), and:
11
+ *
12
+ * - reuses fresh qualification evidence, running no journey;
13
+ * - triggers a `lisa-use-the-product` journey when evidence is absent or stale,
14
+ * respecting the per-environment mutation policy from `.lisa.config.json`
15
+ * (a `forbidden` policy renders `SKIP` naming the policy — readiness never
16
+ * overrides it);
17
+ * - reports the claim as *not established* (a stated-reason `SKIP`, never a
18
+ * guessed pass) when a journey cannot be run;
19
+ * - files a build-ready ticket through the existing #1742 path and stands up
20
+ * blocker 7 when a journey fails, expressed in PRD #1738's claim→evidence
21
+ * shape so there is one evidence definition across both PRDs.
22
+ *
23
+ * It also surfaces #1742's scaffolding-subtraction candidate count into the
24
+ * proportionality dimension's `machinery_to_remove` field — surfaced, never
25
+ * auto-deleted. Warn-only per intake decision O1: nothing here hard-blocks.
26
+ * @module cli/doctor-readiness-journey
27
+ */
28
+ import { isQualificationEvidenceFresh, resolveMutationPolicy, resolveMutationPolicyForPath, } from "./doctor-readiness-journey-freshness.js";
29
+ import { resolveWorkerJourneyEvidence, } from "./doctor-worker-journey.js";
30
+ // Re-export the mutation-policy resolver so `.lisa/readiness.json` readers and
31
+ // tests keep one import path even though the gate lives in a sibling module for
32
+ // file-size hygiene.
33
+ export { resolveMutationPolicy };
34
+ /** The execution/proof readiness dimension id (readiness-rubric, RRR-1). */
35
+ export const EXECUTION_PROOF_DIMENSION_ID = "execution-proof";
36
+ /** The proportionality readiness dimension id (readiness-rubric, RRR-1). */
37
+ export const PROPORTIONALITY_DIMENSION_ID = "proportionality";
38
+ /**
39
+ * The claim id and boundary blocker 7 binds to, named once so the execution
40
+ * proof evidence uses one vocabulary across every branch.
41
+ */
42
+ const OPERABILITY_CLAIM_ID = "end-to-end-operability";
43
+ const OPERABILITY_BOUNDARY = "configured-worker-representative-journey";
44
+ const PROVABILITY_BLOCKER_ID = "B7";
45
+ /**
46
+ * Assess the execution/proof dimension by reusing #1742's journey machinery.
47
+ * @param targetPath - Project path to assess
48
+ * @param options - Injected collaborators and freshness inputs
49
+ * @returns The execution/proof dimension record
50
+ */
51
+ export async function assessExecutionProofDimension(targetPath, options = {}) {
52
+ const policy = options.mutationPolicy ?? (await resolveMutationPolicyForPath(targetPath));
53
+ if (policy === "forbidden") {
54
+ return skipDimension(`mutation policy '${policy}' forbids exercising this environment; the ` +
55
+ "representative journey was not run and end-to-end operability is not asserted", { policy });
56
+ }
57
+ const evidence = await resolveWorkerJourneyEvidence(targetPath);
58
+ if (await isQualificationEvidenceFresh(evidence, targetPath, options.artifactHead)) {
59
+ return reuseFreshEvidence(evidence);
60
+ }
61
+ return runRepresentativeJourney(targetPath, evidence, options);
62
+ }
63
+ /**
64
+ * Assess the proportionality dimension: surface #1742's scaffolding-subtraction
65
+ * candidate count into `machinery_to_remove`. Surfaced, never auto-deleted
66
+ * (intake decision, RRR-6 technical approach point 6); it is never a blocker.
67
+ * @param targetPath - Project path to scan
68
+ * @param options - Injected subtraction count
69
+ * @returns The proportionality dimension record
70
+ */
71
+ export async function assessProportionalityDimension(targetPath, options = {}) {
72
+ const count = options.subtractionCount ??
73
+ (await resolveWorkerJourneyEvidence(targetPath)).subtractionCount;
74
+ if (count <= 0) {
75
+ return { id: PROPORTIONALITY_DIMENSION_ID, status: "SKIP", findings: [] };
76
+ }
77
+ return {
78
+ id: PROPORTIONALITY_DIMENSION_ID,
79
+ status: "SKIP",
80
+ findings: [
81
+ {
82
+ machinery_to_remove: [
83
+ `${count} worker-specific scaffolding-subtraction candidate` +
84
+ `${count === 1 ? "" : "s"} surfaced by the worker-epoch runner (#1742)`,
85
+ ],
86
+ evidence: `Scaffolding-subtraction candidates surfaced: ${count}. Surfaced for ` +
87
+ "operator review only — nothing is auto-deleted.",
88
+ auto_deleted: false,
89
+ },
90
+ ],
91
+ };
92
+ }
93
+ /**
94
+ * Build the reuse branch: fresh evidence establishes the claim, no journey runs.
95
+ * @param evidence - Resolved worker journey evidence
96
+ * @returns The execution/proof dimension record
97
+ */
98
+ function reuseFreshEvidence(evidence) {
99
+ return {
100
+ id: EXECUTION_PROOF_DIMENSION_ID,
101
+ status: "PASS",
102
+ findings: [
103
+ {
104
+ blocker: PROVABILITY_BLOCKER_ID,
105
+ evidence: `Reused fresh qualification evidence for ${evidence.signature.host}: ` +
106
+ `${evidence.evidence} (recorded in .lisa/worker-config.json). No new ` +
107
+ "journey executed.",
108
+ claim_evidence: establishedClaim(),
109
+ worker_config_ref: ".lisa/worker-config.json",
110
+ reused: true,
111
+ },
112
+ ],
113
+ };
114
+ }
115
+ /**
116
+ * Build the journey-run branch: run the representative journey (or report the
117
+ * claim as not established when it cannot run), and record the result in PRD
118
+ * #1738's claim→evidence shape.
119
+ * @param targetPath - Project path (unused beyond context assembly)
120
+ * @param evidence - Resolved worker journey evidence
121
+ * @param options - Injected runner and ticket filer
122
+ * @returns The execution/proof dimension record
123
+ */
124
+ async function runRepresentativeJourney(targetPath, evidence, options) {
125
+ if (!options.runJourney) {
126
+ return skipDimension("end-to-end operability not established: no representative journey could " +
127
+ "be run (headless/no configured worker) and no fresh qualification " +
128
+ "evidence is on file. lisa-use-the-product must drive a real journey " +
129
+ "before this claim is asserted.", { evidence_status: "not-established" });
130
+ }
131
+ const policy = options.mutationPolicy ?? (await resolveMutationPolicyForPath(targetPath));
132
+ const outcome = await options.runJourney({
133
+ targetPath,
134
+ signature: evidence.signature,
135
+ mutationPolicy: policy,
136
+ });
137
+ if (outcome.result === "passed") {
138
+ return journeyPassed(evidence, outcome.evidence);
139
+ }
140
+ return journeyFailed(evidence, outcome, options);
141
+ }
142
+ /**
143
+ * Build the passing-journey branch: the claim is established by a fresh run.
144
+ * @param evidence - Resolved worker journey evidence
145
+ * @param journeyEvidence - The evidence pointer the journey produced
146
+ * @returns The execution/proof dimension record
147
+ */
148
+ function journeyPassed(evidence, journeyEvidence) {
149
+ return {
150
+ id: EXECUTION_PROOF_DIMENSION_ID,
151
+ status: "PASS",
152
+ findings: [
153
+ {
154
+ blocker: PROVABILITY_BLOCKER_ID,
155
+ evidence: `Representative journey run through lisa-use-the-product by ` +
156
+ `${evidence.signature.host}: ${journeyEvidence}.`,
157
+ claim_evidence: establishedClaim(),
158
+ worker_config_ref: ".lisa/worker-config.json",
159
+ reused: false,
160
+ },
161
+ ],
162
+ };
163
+ }
164
+ /**
165
+ * Build the failing-journey branch: file a build-ready ticket through the #1742
166
+ * path and stand up blocker 7 via PRD #1738's evidence shape.
167
+ * @param evidence - Resolved worker journey evidence
168
+ * @param outcome - The failing journey outcome
169
+ * @param options - Injected ticket filer
170
+ * @returns The execution/proof dimension record
171
+ */
172
+ async function journeyFailed(evidence, outcome, options) {
173
+ const detail = outcome.failureDetail ?? "the representative journey did not pass";
174
+ const summary = `Representative journey failed for ${evidence.signature.host}: ${detail}`;
175
+ const fileTicket = options.fileTicket ?? (async () => "");
176
+ const ticketRef = await fileTicket({
177
+ summary,
178
+ detail: `${summary}. Journey evidence: ${outcome.evidence}.`,
179
+ signature: evidence.signature,
180
+ });
181
+ const ticketSuffix = ticketRef
182
+ ? ` Build-ready ticket filed: ${ticketRef}.`
183
+ : "";
184
+ return {
185
+ id: EXECUTION_PROOF_DIMENSION_ID,
186
+ status: "FAIL",
187
+ findings: [
188
+ {
189
+ blocker: PROVABILITY_BLOCKER_ID,
190
+ invariant_violated: "end-to-end operability must be proven by a passing representative journey",
191
+ evidence: `${summary}. Journey evidence: ${outcome.evidence}.${ticketSuffix}`,
192
+ why_proof_missed: "the representative journey executed by the configured worker failed",
193
+ claim_evidence: {
194
+ claim_id: OPERABILITY_CLAIM_ID,
195
+ boundary: OPERABILITY_BOUNDARY,
196
+ required_evidence_kinds: ["representative-journey"],
197
+ not_established: [OPERABILITY_BOUNDARY],
198
+ },
199
+ ticket_ref: ticketRef,
200
+ },
201
+ ],
202
+ };
203
+ }
204
+ /**
205
+ * The established-claim shape (blocker 7 CLEAR): a bound claim whose
206
+ * `not_established` list is empty, reviewed.
207
+ * @returns PRD #1738 claim→evidence establishing the operability claim
208
+ */
209
+ function establishedClaim() {
210
+ return {
211
+ claim_id: OPERABILITY_CLAIM_ID,
212
+ boundary: OPERABILITY_BOUNDARY,
213
+ required_evidence_kinds: ["representative-journey"],
214
+ not_established: [],
215
+ not_established_reviewed: true,
216
+ };
217
+ }
218
+ /**
219
+ * Build a stated-reason SKIP dimension record — the honest degrade that reports
220
+ * a claim as not established rather than guessing it. Carries no `blocker`
221
+ * field, so it never stands up a ship blocker.
222
+ * @param reason - Operator-language reason for the SKIP
223
+ * @param extra - Extra fields to attach to the finding
224
+ * @returns The execution/proof dimension record
225
+ */
226
+ function skipDimension(reason, extra = {}) {
227
+ return {
228
+ id: EXECUTION_PROOF_DIMENSION_ID,
229
+ status: "SKIP",
230
+ findings: [{ reason, skip: true, ...extra }],
231
+ };
232
+ }
233
+ //# sourceMappingURL=doctor-readiness-journey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-readiness-journey.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-journey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EACL,4BAA4B,EAE5B,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,4BAA4B,GAG7B,MAAM,4BAA4B,CAAC;AAEpC,+EAA+E;AAC/E,gFAAgF;AAChF,qBAAqB;AACrB,OAAO,EAAE,qBAAqB,EAAuB,CAAC;AAEtD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,4BAA4B,GAAG,iBAAiB,CAAC;AAE9D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,4BAA4B,GAAG,iBAAiB,CAAC;AAE9D;;;GAGG;AACH,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AACtD,MAAM,oBAAoB,GAAG,0CAA0C,CAAC;AACxE,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAyEpC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,UAAkB,EAClB,UAAiC,EAAE;IAEnC,MAAM,MAAM,GACV,OAAO,CAAC,cAAc,IAAI,CAAC,MAAM,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7E,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,aAAa,CAClB,oBAAoB,MAAM,6CAA6C;YACrE,+EAA+E,EACjF,EAAE,MAAM,EAAE,CACX,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAChE,IACE,MAAM,4BAA4B,CAChC,QAAQ,EACR,UAAU,EACV,OAAO,CAAC,YAAY,CACrB,EACD,CAAC;QACD,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,wBAAwB,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,UAAkB,EAClB,UAAkC,EAAE;IAEpC,MAAM,KAAK,GACT,OAAO,CAAC,gBAAgB;QACxB,CAAC,MAAM,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC;IACpE,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,4BAA4B,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO;QACL,EAAE,EAAE,4BAA4B;QAChC,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE;YACR;gBACE,mBAAmB,EAAE;oBACnB,GAAG,KAAK,oDAAoD;wBAC1D,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,8CAA8C;iBAC1E;gBACD,QAAQ,EACN,gDAAgD,KAAK,iBAAiB;oBACtE,iDAAiD;gBACnD,YAAY,EAAE,KAAK;aACpB;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CACzB,QAA+B;IAE/B,OAAO;QACL,EAAE,EAAE,4BAA4B;QAChC,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE;YACR;gBACE,OAAO,EAAE,sBAAsB;gBAC/B,QAAQ,EACN,2CAA2C,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI;oBACtE,GAAG,QAAQ,CAAC,QAAQ,kDAAkD;oBACtE,mBAAmB;gBACrB,cAAc,EAAE,gBAAgB,EAAE;gBAClC,iBAAiB,EAAE,0BAA0B;gBAC7C,MAAM,EAAE,IAAI;aACb;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,wBAAwB,CACrC,UAAkB,EAClB,QAA+B,EAC/B,OAA8B;IAE9B,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,aAAa,CAClB,0EAA0E;YACxE,oEAAoE;YACpE,sEAAsE;YACtE,gCAAgC,EAClC,EAAE,eAAe,EAAE,iBAAiB,EAAE,CACvC,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GACV,OAAO,CAAC,cAAc,IAAI,CAAC,MAAM,4BAA4B,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACvC,UAAU;QACV,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,cAAc,EAAE,MAAM;KACvB,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CACpB,QAA+B,EAC/B,eAAuB;IAEvB,OAAO;QACL,EAAE,EAAE,4BAA4B;QAChC,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE;YACR;gBACE,OAAO,EAAE,sBAAsB;gBAC/B,QAAQ,EACN,6DAA6D;oBAC7D,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,eAAe,GAAG;gBACnD,cAAc,EAAE,gBAAgB,EAAE;gBAClC,iBAAiB,EAAE,0BAA0B;gBAC7C,MAAM,EAAE,KAAK;aACd;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,aAAa,CAC1B,QAA+B,EAC/B,OAAsD,EACtD,OAA8B;IAE9B,MAAM,MAAM,GACV,OAAO,CAAC,aAAa,IAAI,yCAAyC,CAAC;IACrE,MAAM,OAAO,GAAG,qCAAqC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC1F,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC;QACjC,OAAO;QACP,MAAM,EAAE,GAAG,OAAO,uBAAuB,OAAO,CAAC,QAAQ,GAAG;QAC5D,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,SAAS;QAC5B,CAAC,CAAC,8BAA8B,SAAS,GAAG;QAC5C,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,EAAE,EAAE,4BAA4B;QAChC,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE;YACR;gBACE,OAAO,EAAE,sBAAsB;gBAC/B,kBAAkB,EAChB,2EAA2E;gBAC7E,QAAQ,EAAE,GAAG,OAAO,uBAAuB,OAAO,CAAC,QAAQ,IAAI,YAAY,EAAE;gBAC7E,gBAAgB,EACd,qEAAqE;gBACvE,cAAc,EAAE;oBACd,QAAQ,EAAE,oBAAoB;oBAC9B,QAAQ,EAAE,oBAAoB;oBAC9B,uBAAuB,EAAE,CAAC,wBAAwB,CAAC;oBACnD,eAAe,EAAE,CAAC,oBAAoB,CAAC;iBACxC;gBACD,UAAU,EAAE,SAAS;aACtB;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,gBAAgB;IACvB,OAAO;QACL,QAAQ,EAAE,oBAAoB;QAC9B,QAAQ,EAAE,oBAAoB;QAC9B,uBAAuB,EAAE,CAAC,wBAAwB,CAAC;QACnD,eAAe,EAAE,EAAE;QACnB,wBAAwB,EAAE,IAAI;KAC/B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,aAAa,CACpB,MAAc,EACd,QAAiC,EAAE;IAEnC,OAAO;QACL,EAAE,EAAE,4BAA4B;QAChC,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import type { DoctorCheck } from "./doctor.js";
2
+ export { CLAIM_EVIDENCE_UNAVAILABLE_REASON, SHIP_BLOCKER_IDS, assessProvabilityBlocker, assessReadiness, computeNarrowedClaim, detectShipBlockers, } from "./doctor-readiness-blockers.js";
3
+ export type { BlockerDetectionOptions, DetectedBlocker, ProvabilityAssessment, ReadinessAssessment, ReadinessDimensionInput, ReadinessVerdict, ShipBlockerId, } from "./doctor-readiness-blockers.js";
2
4
  /**
3
5
  * Schema version stamped into `.lisa/readiness.json`. Bump only alongside a
4
6
  * deliberate shape change; readers key off this to stay forward-compatible.
@@ -22,11 +24,13 @@ export declare function resolveReadinessReportPath(root: string): string;
22
24
  * This is the flag-gated collector `runDoctor` appends only when
23
25
  * `options.readiness` is true, so the default doctor path stays byte-identical.
24
26
  * It is warn-only per intake decision O1: it never returns `fail` and never
25
- * changes doctor's exit-code semantics. Every dimension is reported (never
26
- * silently omitted); in this Lisa version each renders `SKIP` with a reason
27
- * because the evidence-gathering surfaces ship with later PRD #1739 tickets.
28
- * Persistence is atomic and never throws a write error degrades the check to
29
- * `warn` instead of aborting the run.
27
+ * changes doctor's exit-code semantics a standing blocker flips the readiness
28
+ * verdict to `NOT_READY` but still emits a `warn` check, because the gate is on
29
+ * the *claim*, not the *process*. Every dimension is reported (never silently
30
+ * omitted); in this Lisa version each renders `SKIP` with a reason because the
31
+ * evidence-gathering surfaces ship with later PRD #1739 tickets, so no blocker
32
+ * stands yet. Persistence is atomic and never throws — a write error degrades
33
+ * the check to `warn` instead of aborting the run.
30
34
  * @param targetPath - Project path to assess and persist under
31
35
  * @returns Doctor check result
32
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-readiness.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAiF1C,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EACA,CAAC;AAsBtD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CA0CtB"}
1
+ {"version":3,"file":"doctor-readiness.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiB/C,OAAO,EACL,iCAAiC,EACjC,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,GACd,MAAM,gCAAgC,CAAC;AAQxC;;;GAGG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AA8E1C,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EACA,CAAC;AAsBtD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CAsCtB"}
@@ -2,7 +2,13 @@ import { rename, writeFile } from "node:fs/promises";
2
2
  import { mkdir } from "node:fs/promises";
3
3
  import * as path from "node:path";
4
4
  import process from "node:process";
5
+ import { assessReadiness, } from "./doctor-readiness-blockers.js";
6
+ import { EXECUTION_PROOF_DIMENSION_ID, PROPORTIONALITY_DIMENSION_ID, assessExecutionProofDimension, assessProportionalityDimension, } from "./doctor-readiness-journey.js";
5
7
  import { getPackageVersion } from "./version.js";
8
+ // Re-export the blocker-gate surface (RRR-5, #1857) so `.lisa/readiness.json`
9
+ // readers and tests keep one import path even though the gate lives in a
10
+ // sibling module for file-size hygiene.
11
+ export { CLAIM_EVIDENCE_UNAVAILABLE_REASON, SHIP_BLOCKER_IDS, assessProvabilityBlocker, assessReadiness, computeNarrowedClaim, detectShipBlockers, } from "./doctor-readiness-blockers.js";
6
12
  /** Doctor check name for the repository-readiness collector. */
7
13
  const REPOSITORY_READINESS_CHECK_NAME = "Repository readiness";
8
14
  /** Repo-relative display path for the persisted readiness report. */
@@ -81,30 +87,28 @@ export function resolveReadinessReportPath(root) {
81
87
  * This is the flag-gated collector `runDoctor` appends only when
82
88
  * `options.readiness` is true, so the default doctor path stays byte-identical.
83
89
  * It is warn-only per intake decision O1: it never returns `fail` and never
84
- * changes doctor's exit-code semantics. Every dimension is reported (never
85
- * silently omitted); in this Lisa version each renders `SKIP` with a reason
86
- * because the evidence-gathering surfaces ship with later PRD #1739 tickets.
87
- * Persistence is atomic and never throws a write error degrades the check to
88
- * `warn` instead of aborting the run.
90
+ * changes doctor's exit-code semantics a standing blocker flips the readiness
91
+ * verdict to `NOT_READY` but still emits a `warn` check, because the gate is on
92
+ * the *claim*, not the *process*. Every dimension is reported (never silently
93
+ * omitted); in this Lisa version each renders `SKIP` with a reason because the
94
+ * evidence-gathering surfaces ship with later PRD #1739 tickets, so no blocker
95
+ * stands yet. Persistence is atomic and never throws — a write error degrades
96
+ * the check to `warn` instead of aborting the run.
89
97
  * @param targetPath - Project path to assess and persist under
90
98
  * @returns Doctor check result
91
99
  */
92
100
  export async function checkRepositoryReadiness(targetPath) {
93
- const dimensions = READINESS_DIMENSIONS.map(dimension => ({
94
- id: dimension.id,
95
- status: "SKIP",
96
- findings: [],
97
- }));
98
- const verdict = computeReadinessVerdict(dimensions);
101
+ const dimensions = await buildReadinessDimensions(targetPath);
102
+ const { verdict, blockers, narrowed_claim } = assessReadiness(dimensions);
99
103
  const report = {
100
104
  schema_version: READINESS_SCHEMA_VERSION,
101
105
  generated_at: new Date().toISOString(),
102
106
  lisa_version: resolveLisaVersion(),
103
107
  worker_signature: currentWorkerSignature(),
104
108
  verdict,
105
- narrowed_claim: null,
106
- blockers: [],
107
- blocker_count: 0,
109
+ narrowed_claim,
110
+ blockers,
111
+ blocker_count: blockers.length,
108
112
  dimensions,
109
113
  };
110
114
  const reportPath = resolveReadinessReportPath(targetPath);
@@ -124,24 +128,33 @@ export async function checkRepositoryReadiness(targetPath) {
124
128
  name: REPOSITORY_READINESS_CHECK_NAME,
125
129
  status: verdict === "READY" ? "ok" : "warn",
126
130
  detail: `Repository readiness assessed: ${verdict} across 8 ownership dimensions ` +
127
- `(all SKIP pending evidence wiring in later PRD #1739 tickets; see readiness-rubric). ` +
131
+ `(${blockers.length} standing ship blocker${blockers.length === 1 ? "" : "s"}; ` +
132
+ `all SKIP pending evidence wiring in later PRD #1739 tickets; see readiness-rubric). ` +
128
133
  `Report written to ${READINESS_REPORT_DISPLAY_PATH} (schema_version ${READINESS_SCHEMA_VERSION}).`,
129
134
  };
130
135
  }
131
136
  /**
132
- * Reduce per-dimension statuses to the shipped verdict ladder. FAIL wins over
133
- * WARN, WARN over the rest; a report of only PASS/SKIP is READY.
134
- * @param dimensions - Per-dimension records
135
- * @returns Overall verdict
137
+ * Build the eight readiness dimensions in fixed render order. The execution/proof
138
+ * and proportionality dimensions are wired to #1742's shared journey runner
139
+ * (RRR-6, #1858): execution/proof reuses fresh qualification evidence or reports
140
+ * the operability claim as not established (a stated-reason SKIP) when no journey
141
+ * runner is injected, and proportionality surfaces the scaffolding-subtraction
142
+ * candidate count into `machinery_to_remove`. The remaining six render `SKIP`
143
+ * with a reason until their evidence surfaces ship (later PRD #1739 tickets), per
144
+ * the never-silently-omit contract.
145
+ * @param targetPath - Project path to assess
146
+ * @returns The eight per-dimension records, in fixed order
136
147
  */
137
- function computeReadinessVerdict(dimensions) {
138
- if (dimensions.some(dimension => dimension.status === "FAIL")) {
139
- return "NOT_READY";
140
- }
141
- if (dimensions.some(dimension => dimension.status === "WARN")) {
142
- return "READY_WITH_WARNINGS";
143
- }
144
- return "READY";
148
+ async function buildReadinessDimensions(targetPath) {
149
+ return Promise.all(READINESS_DIMENSIONS.map(async (dimension) => {
150
+ if (dimension.id === EXECUTION_PROOF_DIMENSION_ID) {
151
+ return assessExecutionProofDimension(targetPath);
152
+ }
153
+ if (dimension.id === PROPORTIONALITY_DIMENSION_ID) {
154
+ return assessProportionalityDimension(targetPath);
155
+ }
156
+ return { id: dimension.id, status: "SKIP", findings: [] };
157
+ }));
145
158
  }
146
159
  /**
147
160
  * Atomically write the readiness report: write a sibling temp file, then rename
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-readiness.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor-readiness.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,OAAO,EACL,eAAe,GAGhB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,8EAA8E;AAC9E,yEAAyE;AACzE,wCAAwC;AACxC,OAAO,EACL,iCAAiC,EACjC,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AAWxC,gEAAgE;AAChE,MAAM,+BAA+B,GAAG,sBAAsB,CAAC;AAE/D,qEAAqE;AACrE,MAAM,6BAA6B,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;AAE3E;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAY1C;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAsC;IAC9D;QACE,EAAE,EAAE,iBAAiB;QACrB,QAAQ,EACN,mIAAmI;QACrI,UAAU,EACR,kIAAkI;KACrI;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,QAAQ,EACN,2FAA2F;QAC7F,UAAU,EACR,2IAA2I;KAC9I;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,QAAQ,EACN,kHAAkH;QACpH,UAAU,EACR,uJAAuJ;KAC1J;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,QAAQ,EACN,iIAAiI;QACnI,UAAU,EACR,uJAAuJ;KAC1J;IACD;QACE,EAAE,EAAE,qBAAqB;QACzB,QAAQ,EACN,+GAA+G;QACjH,UAAU,EACR,8GAA8G;KACjH;IACD;QACE,EAAE,EAAE,2BAA2B;QAC/B,QAAQ,EACN,qFAAqF;QACvF,UAAU,EACR,oHAAoH;KACvH;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,QAAQ,EACN,gLAAgL;QAClL,UAAU,EACR,mIAAmI;KACtI;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,QAAQ,EACN,iIAAiI;QACnI,UAAU,EACR,8JAA8J;KACjK;CACF,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,uBAAuB,GAClC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAsBtD;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAY;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,UAAkB;IAElB,MAAM,UAAU,GAAG,MAAM,wBAAwB,CAAC,UAAU,CAAC,CAAC;IAC9D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAoB;QAC9B,cAAc,EAAE,wBAAwB;QACxC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACtC,YAAY,EAAE,kBAAkB,EAAE;QAClC,gBAAgB,EAAE,sBAAsB,EAAE;QAC1C,OAAO;QACP,cAAc;QACd,QAAQ;QACR,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,UAAU;KACX,CAAC;IAEF,MAAM,UAAU,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,+BAA+B;YACrC,MAAM,EAAE,MAAM;YACd,MAAM,EACJ,kCAAkC,OAAO,mCAAmC;gBAC5E,uCAAuC,6BAA6B,IAAI;gBACxE,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;SAC9D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,+BAA+B;QACrC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;QAC3C,MAAM,EACJ,kCAAkC,OAAO,iCAAiC;YAC1E,IAAI,QAAQ,CAAC,MAAM,yBAAyB,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI;YAChF,sFAAsF;YACtF,qBAAqB,6BAA6B,oBAAoB,wBAAwB,IAAI;KACrG,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,wBAAwB,CACrC,UAAkB;IAElB,OAAO,OAAO,CAAC,GAAG,CAChB,oBAAoB,CAAC,GAAG,CACtB,KAAK,EAAE,SAAS,EAAqC,EAAE;QACrD,IAAI,SAAS,CAAC,EAAE,KAAK,4BAA4B,EAAE,CAAC;YAClD,OAAO,6BAA6B,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,SAAS,CAAC,EAAE,KAAK,4BAA4B,EAAE,CAAC;YAClD,OAAO,8BAA8B,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5D,CAAC,CACF,CACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,sBAAsB,CACnC,UAAkB,EAClB,MAAuB;IAEvB,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,GAAG,UAAU,MAAM,CAAC;IACrC,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1E,MAAM,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,sBAAsB;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,CACX,GAAG,CAAC,gBAAgB;QACpB,GAAG,CAAC,iBAAiB;QACrB,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,aAAa;YAClC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,GAAG,CAAC,UAAU;gBACd,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,SAAS,CAAC,CACjB,CAAC,WAAW,EAAE,CAAC;IAChB,MAAM,KAAK,GAAG,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC;IACpE,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,aAAa,IAAI,SAAS,CAAC;IAC1E,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;AACvC,CAAC"}
@@ -4,6 +4,11 @@ import type { DoctorCheck } from "./doctor.js";
4
4
  * runtime signature still matches it. This is intentionally read-only: doctor
5
5
  * tells the operator when requalification is needed; lifecycle/repair flows own
6
6
  * filing any build-ready tickets from failed representative journeys.
7
+ *
8
+ * The journey machinery it consumes now lives in `doctor-worker-journey.ts` so
9
+ * the readiness execution/proof dimension (RRR-6, #1858) reuses the exact same
10
+ * runner rather than forking a second harness (intake decision F5). This
11
+ * function's output is unchanged by that extraction.
7
12
  * @param targetPath - Project path to inspect
8
13
  * @returns Doctor check result
9
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-worker-epoch.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-worker-epoch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA4B/C;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CAoCtB"}
1
+ {"version":3,"file":"doctor-worker-epoch.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-worker-epoch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAe/C;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,CAoCtB"}