@codyswann/lisa 2.273.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 (73) hide show
  1. package/dist/cli/doctor-readiness-journey-freshness.d.ts +36 -0
  2. package/dist/cli/doctor-readiness-journey-freshness.d.ts.map +1 -0
  3. package/dist/cli/doctor-readiness-journey-freshness.js +166 -0
  4. package/dist/cli/doctor-readiness-journey-freshness.js.map +1 -0
  5. package/dist/cli/doctor-readiness-journey.d.ts +110 -0
  6. package/dist/cli/doctor-readiness-journey.d.ts.map +1 -0
  7. package/dist/cli/doctor-readiness-journey.js +233 -0
  8. package/dist/cli/doctor-readiness-journey.js.map +1 -0
  9. package/dist/cli/doctor-readiness.d.ts.map +1 -1
  10. package/dist/cli/doctor-readiness.js +25 -5
  11. package/dist/cli/doctor-readiness.js.map +1 -1
  12. package/dist/cli/doctor-worker-epoch.d.ts +5 -0
  13. package/dist/cli/doctor-worker-epoch.d.ts.map +1 -1
  14. package/dist/cli/doctor-worker-epoch.js +10 -134
  15. package/dist/cli/doctor-worker-epoch.js.map +1 -1
  16. package/dist/cli/doctor-worker-journey.d.ts +118 -0
  17. package/dist/cli/doctor-worker-journey.d.ts.map +1 -0
  18. package/dist/cli/doctor-worker-journey.js +222 -0
  19. package/dist/cli/doctor-worker-journey.js.map +1 -0
  20. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  21. package/dist/core/upstream-evidence-manifest.js +5 -0
  22. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  23. package/package.json +1 -1
  24. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa-agy/plugin.json +1 -1
  27. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  30. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-expo-agy/plugin.json +1 -1
  37. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  42. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  47. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  52. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  57. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails-agy/plugin.json +1 -1
  62. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  67. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  72. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
@@ -0,0 +1,36 @@
1
+ import type { WorkerJourneyEvidence } from "./doctor-worker-journey.js";
2
+ /** The per-environment mutation policy from `.lisa.config.json` `exploration`. */
3
+ export type MutationPolicy = "forbidden" | "read-only" | "full";
4
+ /**
5
+ * Resolve the per-environment mutation policy from an already-parsed config,
6
+ * mirroring `lisa-use-the-product`'s gate: default `read-only`; a production-
7
+ * named env defaults to `forbidden` and may only be raised to `full` with a
8
+ * written `prodMutationAck`.
9
+ * @param config - Parsed `.lisa.config.json` contents
10
+ * @returns The resolved mutation policy
11
+ */
12
+ export declare function resolveMutationPolicy(config: unknown): MutationPolicy;
13
+ /**
14
+ * Resolve the mutation policy for a path by reading `.lisa.config.json`.
15
+ * @param targetPath - Project path to read config from
16
+ * @returns The resolved mutation policy (read-only when unreadable)
17
+ */
18
+ export declare function resolveMutationPolicyForPath(targetPath: string): Promise<MutationPolicy>;
19
+ /**
20
+ * Determine whether recorded qualification evidence is fresh enough to reuse:
21
+ * the epoch is in sync (no drift), evidence is present, and it is newer than the
22
+ * current artifact head. When the artifact head cannot be resolved, freshness
23
+ * falls back to "no drift and evidence present" (the shipped #1742 notion).
24
+ * @param evidence - Resolved worker journey evidence
25
+ * @param targetPath - Project path (for git artifact-head resolution)
26
+ * @param artifactHeadOverride - Injected artifact head (skips git resolution)
27
+ * @returns True when the evidence may be reused without a new journey
28
+ */
29
+ export declare function isQualificationEvidenceFresh(evidence: WorkerJourneyEvidence, targetPath: string, artifactHeadOverride?: Date | null): Promise<boolean>;
30
+ /**
31
+ * Narrow unknown JSON values to plain records.
32
+ * @param value - Value to inspect
33
+ * @returns True for plain object records
34
+ */
35
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
36
+ //# sourceMappingURL=doctor-readiness-journey-freshness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-readiness-journey-freshness.d.ts","sourceRoot":"","sources":["../../src/cli/doctor-readiness-journey-freshness.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAIxE,kFAAkF;AAClF,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;AAEhE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAsBrE;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC,CAYzB;AAED;;;;;;;;;GASG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,qBAAqB,EAC/B,UAAU,EAAE,MAAM,EAClB,oBAAoB,CAAC,EAAE,IAAI,GAAG,IAAI,GACjC,OAAO,CAAC,OAAO,CAAC,CAclB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Freshness and mutation-policy helpers for the readiness journey wiring
3
+ * (RRR-6, #1858).
4
+ *
5
+ * Split out of `doctor-readiness-journey.ts` for file-size hygiene: this module
6
+ * owns the two gates that decide *whether* a representative journey runs — the
7
+ * per-environment mutation policy read from `.lisa.config.json` (mirroring
8
+ * `lisa-use-the-product`'s gate, which readiness never overrides) and the
9
+ * freshness contract that decides when recorded qualification evidence may be
10
+ * reused instead of re-running a journey (same worker signature, evidence newer
11
+ * than the current artifact head).
12
+ * @module cli/doctor-readiness-journey-freshness
13
+ */
14
+ import { existsSync } from "node:fs";
15
+ import { readFile, stat } from "node:fs/promises";
16
+ import * as path from "node:path";
17
+ import { promisify } from "node:util";
18
+ import { execFile } from "node:child_process";
19
+ const execFileAsync = promisify(execFile);
20
+ /**
21
+ * Resolve the per-environment mutation policy from an already-parsed config,
22
+ * mirroring `lisa-use-the-product`'s gate: default `read-only`; a production-
23
+ * named env defaults to `forbidden` and may only be raised to `full` with a
24
+ * written `prodMutationAck`.
25
+ * @param config - Parsed `.lisa.config.json` contents
26
+ * @returns The resolved mutation policy
27
+ */
28
+ export function resolveMutationPolicy(config) {
29
+ const exploration = isRecord(config) ? config.exploration : undefined;
30
+ if (!isRecord(exploration)) {
31
+ return "read-only";
32
+ }
33
+ const environments = isRecord(exploration.environments)
34
+ ? exploration.environments
35
+ : {};
36
+ const envName = typeof exploration.default === "string" ? exploration.default : "default";
37
+ const envConfig = isRecord(environments[envName])
38
+ ? environments[envName]
39
+ : undefined;
40
+ const level = envConfig && typeof envConfig.mutation === "string"
41
+ ? envConfig.mutation
42
+ : undefined;
43
+ const ack = envConfig && typeof envConfig.prodMutationAck === "string"
44
+ ? envConfig.prodMutationAck.trim() !== ""
45
+ : false;
46
+ return normalizeMutationLevel(envName, level, ack);
47
+ }
48
+ /**
49
+ * Resolve the mutation policy for a path by reading `.lisa.config.json`.
50
+ * @param targetPath - Project path to read config from
51
+ * @returns The resolved mutation policy (read-only when unreadable)
52
+ */
53
+ export async function resolveMutationPolicyForPath(targetPath) {
54
+ const configPath = path.join(targetPath, ".lisa.config.json");
55
+ if (!existsSync(configPath)) {
56
+ return "read-only";
57
+ }
58
+ try {
59
+ return resolveMutationPolicy(JSON.parse(await readFile(configPath, "utf8")));
60
+ }
61
+ catch {
62
+ return "read-only";
63
+ }
64
+ }
65
+ /**
66
+ * Determine whether recorded qualification evidence is fresh enough to reuse:
67
+ * the epoch is in sync (no drift), evidence is present, and it is newer than the
68
+ * current artifact head. When the artifact head cannot be resolved, freshness
69
+ * falls back to "no drift and evidence present" (the shipped #1742 notion).
70
+ * @param evidence - Resolved worker journey evidence
71
+ * @param targetPath - Project path (for git artifact-head resolution)
72
+ * @param artifactHeadOverride - Injected artifact head (skips git resolution)
73
+ * @returns True when the evidence may be reused without a new journey
74
+ */
75
+ export async function isQualificationEvidenceFresh(evidence, targetPath, artifactHeadOverride) {
76
+ if (evidence.evidence === null || evidence.drift.length > 0) {
77
+ return false;
78
+ }
79
+ const artifactHead = artifactHeadOverride ?? (await resolveArtifactHead(targetPath));
80
+ if (artifactHead === null) {
81
+ // Cannot compare to the artifact head: fall back to the #1742 notion.
82
+ return true;
83
+ }
84
+ const evidenceTime = await resolveEvidenceTimestamp(evidence);
85
+ return (evidenceTime !== null && evidenceTime.getTime() >= artifactHead.getTime());
86
+ }
87
+ /**
88
+ * Narrow unknown JSON values to plain records.
89
+ * @param value - Value to inspect
90
+ * @returns True for plain object records
91
+ */
92
+ export function isRecord(value) {
93
+ return typeof value === "object" && value !== null && !Array.isArray(value);
94
+ }
95
+ /**
96
+ * Normalize a raw mutation level for a resolved environment, applying the
97
+ * production carve-out.
98
+ * @param envName - Resolved environment name
99
+ * @param level - Raw mutation level from config
100
+ * @param hasAck - Whether a non-empty prodMutationAck is present
101
+ * @returns The normalized mutation policy
102
+ */
103
+ function normalizeMutationLevel(envName, level, hasAck) {
104
+ const isProduction = /^prod(uction)?$/iu.test(envName);
105
+ if (isProduction) {
106
+ if (level === "full" && hasAck) {
107
+ return "full";
108
+ }
109
+ return "forbidden";
110
+ }
111
+ if (level === "forbidden" || level === "full" || level === "read-only") {
112
+ return level;
113
+ }
114
+ return "read-only";
115
+ }
116
+ /**
117
+ * Resolve the artifact-head timestamp from the git HEAD commit time.
118
+ * @param targetPath - Project path to inspect
119
+ * @returns The HEAD commit time, or null when it cannot be resolved
120
+ */
121
+ async function resolveArtifactHead(targetPath) {
122
+ try {
123
+ const { stdout } = await execFileAsync("git", ["-C", targetPath, "log", "-1", "--format=%cI"], { encoding: "utf8" });
124
+ const parsed = new Date(stdout.trim());
125
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }
131
+ /**
132
+ * Resolve a timestamp for recorded qualification evidence: an explicit
133
+ * `qualifiedAt`/`recordedAt` on the worker entry, else the mtime of
134
+ * `.lisa/worker-config.json`.
135
+ * @param evidence - Resolved worker journey evidence
136
+ * @returns The evidence timestamp, or null when it cannot be resolved
137
+ */
138
+ async function resolveEvidenceTimestamp(evidence) {
139
+ const explicit = readTimestampField(evidence.matched);
140
+ if (explicit !== null) {
141
+ return explicit;
142
+ }
143
+ try {
144
+ return (await stat(evidence.recordPath)).mtime;
145
+ }
146
+ catch {
147
+ return null;
148
+ }
149
+ }
150
+ /**
151
+ * Read an explicit `qualifiedAt`/`recordedAt` timestamp from a worker entry.
152
+ * @param matched - The matched worker entry, if any
153
+ * @returns The parsed timestamp, or null when absent/unparseable
154
+ */
155
+ function readTimestampField(matched) {
156
+ if (!isRecord(matched)) {
157
+ return null;
158
+ }
159
+ const raw = matched.qualifiedAt ?? matched.recordedAt;
160
+ if (typeof raw !== "string") {
161
+ return null;
162
+ }
163
+ const parsed = new Date(raw);
164
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
165
+ }
166
+ //# sourceMappingURL=doctor-readiness-journey-freshness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-readiness-journey-freshness.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness-journey-freshness.ts"],"names":[],"mappings":"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"}
@@ -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":"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"}
@@ -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;AAW/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,CA2CtB"}
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"}
@@ -3,6 +3,7 @@ import { mkdir } from "node:fs/promises";
3
3
  import * as path from "node:path";
4
4
  import process from "node:process";
5
5
  import { assessReadiness, } from "./doctor-readiness-blockers.js";
6
+ import { EXECUTION_PROOF_DIMENSION_ID, PROPORTIONALITY_DIMENSION_ID, assessExecutionProofDimension, assessProportionalityDimension, } from "./doctor-readiness-journey.js";
6
7
  import { getPackageVersion } from "./version.js";
7
8
  // Re-export the blocker-gate surface (RRR-5, #1857) so `.lisa/readiness.json`
8
9
  // readers and tests keep one import path even though the gate lives in a
@@ -97,11 +98,7 @@ export function resolveReadinessReportPath(root) {
97
98
  * @returns Doctor check result
98
99
  */
99
100
  export async function checkRepositoryReadiness(targetPath) {
100
- const dimensions = READINESS_DIMENSIONS.map(dimension => ({
101
- id: dimension.id,
102
- status: "SKIP",
103
- findings: [],
104
- }));
101
+ const dimensions = await buildReadinessDimensions(targetPath);
105
102
  const { verdict, blockers, narrowed_claim } = assessReadiness(dimensions);
106
103
  const report = {
107
104
  schema_version: READINESS_SCHEMA_VERSION,
@@ -136,6 +133,29 @@ export async function checkRepositoryReadiness(targetPath) {
136
133
  `Report written to ${READINESS_REPORT_DISPLAY_PATH} (schema_version ${READINESS_SCHEMA_VERSION}).`,
137
134
  };
138
135
  }
136
+ /**
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
147
+ */
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
+ }));
158
+ }
139
159
  /**
140
160
  * Atomically write the readiness report: write a sibling temp file, then rename
141
161
  * it into place so a reader never observes a partial document.
@@ -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":"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"}