@codyswann/lisa 2.273.0 → 2.275.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.
- package/dist/cli/doctor-readiness-journey-freshness.d.ts +36 -0
- package/dist/cli/doctor-readiness-journey-freshness.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-journey-freshness.js +166 -0
- package/dist/cli/doctor-readiness-journey-freshness.js.map +1 -0
- package/dist/cli/doctor-readiness-journey.d.ts +110 -0
- package/dist/cli/doctor-readiness-journey.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-journey.js +233 -0
- package/dist/cli/doctor-readiness-journey.js.map +1 -0
- package/dist/cli/doctor-readiness.d.ts.map +1 -1
- package/dist/cli/doctor-readiness.js +25 -5
- package/dist/cli/doctor-readiness.js.map +1 -1
- package/dist/cli/doctor-worker-epoch.d.ts +5 -0
- package/dist/cli/doctor-worker-epoch.d.ts.map +1 -1
- package/dist/cli/doctor-worker-epoch.js +10 -134
- package/dist/cli/doctor-worker-epoch.js.map +1 -1
- package/dist/cli/doctor-worker-journey.d.ts +118 -0
- package/dist/cli/doctor-worker-journey.d.ts.map +1 -0
- package/dist/cli/doctor-worker-journey.js +222 -0
- package/dist/cli/doctor-worker-journey.js.map +1 -0
- package/dist/cli/health-cmd.d.ts +31 -0
- package/dist/cli/health-cmd.d.ts.map +1 -0
- package/dist/cli/health-cmd.js +101 -0
- package/dist/cli/health-cmd.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +20 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +30 -1
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/health/agentic.d.ts +2 -0
- package/dist/health/agentic.d.ts.map +1 -1
- package/dist/health/agentic.js +4 -4
- package/dist/health/agentic.js.map +1 -1
- package/dist/health/consumer.d.ts +28 -0
- package/dist/health/consumer.d.ts.map +1 -0
- package/dist/health/consumer.js +50 -0
- package/dist/health/consumer.js.map +1 -0
- package/dist/health/evaluation-protocol.d.ts +45 -0
- package/dist/health/evaluation-protocol.d.ts.map +1 -0
- package/dist/health/evaluation-protocol.js +119 -0
- package/dist/health/evaluation-protocol.js.map +1 -0
- package/dist/health/index.d.ts +3 -0
- package/dist/health/index.d.ts.map +1 -1
- package/dist/health/index.js +3 -0
- package/dist/health/index.js.map +1 -1
- package/dist/health/prepare.d.ts +15 -0
- package/dist/health/prepare.d.ts.map +1 -0
- package/dist/health/prepare.js +31 -0
- package/dist/health/prepare.js.map +1 -0
- package/dist/health/storage.d.ts +8 -0
- package/dist/health/storage.d.ts.map +1 -1
- package/dist/health/storage.js +13 -3
- package/dist/health/storage.js.map +1 -1
- package/package.json +3 -2
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-health/SKILL.md +142 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-health/agents/openai.yaml +4 -0
- package/plugins/lisa/commands/health.md +8 -0
- package/plugins/lisa/skills/lisa-health/SKILL.md +142 -0
- package/plugins/lisa/skills/lisa-health/agents/openai.yaml +4 -0
- package/plugins/lisa-agy/commands/lisa/health.md +8 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-health/SKILL.md +142 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/commands/lisa/health.md +8 -0
- package/plugins/lisa-copilot/skills/lisa-health/SKILL.md +142 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/commands/lisa/health.md +8 -0
- package/plugins/lisa-cursor/skills/lisa-health/SKILL.md +142 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/commands/health.md +8 -0
- package/plugins/src/base/skills/lisa-health/SKILL.md +142 -0
- package/scripts/verify-health-consumer-built.mjs +239 -0
- package/ui/README.md +16 -12
|
@@ -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;
|
|
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 =
|
|
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":"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,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,
|
|
1
|
+
{"version":3,"file":"doctor-readiness.js","sourceRoot":"","sources":["../../src/cli/doctor-readiness.ts"],"names":[],"mappings":"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"}
|