@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.
- package/dist/cli/doctor-readiness-blockers.d.ts +154 -0
- package/dist/cli/doctor-readiness-blockers.d.ts.map +1 -0
- package/dist/cli/doctor-readiness-blockers.js +280 -0
- package/dist/cli/doctor-readiness-blockers.js.map +1 -0
- 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 +9 -5
- package/dist/cli/doctor-readiness.d.ts.map +1 -1
- package/dist/cli/doctor-readiness.js +40 -27
- 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/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +17 -0
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- 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-cursor/.claude-plugin/plugin.json +1 -1
- 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
|
@@ -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,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
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
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;
|
|
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
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
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 =
|
|
94
|
-
|
|
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
|
|
106
|
-
blockers
|
|
107
|
-
blocker_count:
|
|
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
|
-
`(
|
|
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
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
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
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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":"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,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,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;
|
|
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;
|
|
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"}
|