feat: capture reviewed authoring evidence
This commit is contained in:
@@ -0,0 +1,60 @@
|
|||||||
|
import { describe, expect, it } from "vitest";
|
||||||
|
import { reviewedAuthoringEvidenceFor } from "./reviewed-authoring-evidence.js";
|
||||||
|
import type { PreparedLifecycleStepId } from "./authoring-projection.js";
|
||||||
|
|
||||||
|
describe("reviewed authoring evidence", () => {
|
||||||
|
it("projects the six prepared lifecycle steps into reviewed evidence kinds", () => {
|
||||||
|
const steps: readonly PreparedLifecycleStepId[] = [
|
||||||
|
"discover",
|
||||||
|
"draft",
|
||||||
|
"diagnose",
|
||||||
|
"repair",
|
||||||
|
"artifact",
|
||||||
|
"deployment",
|
||||||
|
];
|
||||||
|
|
||||||
|
expect(steps.map((step) => reviewedAuthoringEvidenceFor(step).kind)).toEqual([
|
||||||
|
"inventory",
|
||||||
|
"draft",
|
||||||
|
"diagnostic",
|
||||||
|
"repair",
|
||||||
|
"artifact",
|
||||||
|
"deployment",
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("pins the reviewed diagnostic and repair facts", () => {
|
||||||
|
expect(reviewedAuthoringEvidenceFor("diagnose")).toMatchObject({
|
||||||
|
kind: "diagnostic",
|
||||||
|
workspaceId: "lda_report_workflow",
|
||||||
|
revision: 3,
|
||||||
|
status: "invalid",
|
||||||
|
diagnostic: {
|
||||||
|
code: "missing_outcome_edge",
|
||||||
|
path: "nodes[analyze]",
|
||||||
|
message: "reachable node is missing edges for outcomes ['ok']",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(reviewedAuthoringEvidenceFor("repair")).toMatchObject({
|
||||||
|
kind: "repair",
|
||||||
|
fromRevision: 3,
|
||||||
|
toRevision: 4,
|
||||||
|
command: "wf draft set-route lda_report_workflow --revision 3 --step analyze --outcome ok --to __end__",
|
||||||
|
status: "valid",
|
||||||
|
diagnosticCount: 0,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("does not serialize disposable or obsolete evidence language", () => {
|
||||||
|
const serialized = JSON.stringify(
|
||||||
|
["discover", "draft", "diagnose", "repair", "artifact", "deployment"].map(
|
||||||
|
(step) => reviewedAuthoringEvidenceFor(step as PreparedLifecycleStepId),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(serialized).not.toContain("presentation_diag_probe");
|
||||||
|
expect(serialized).not.toContain("missing output projection");
|
||||||
|
expect(serialized).not.toContain("no state projection");
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
import type { PreparedLifecycleStepId } from "./authoring-projection.js";
|
||||||
|
|
||||||
|
export type ReviewedAuthoringEvidence =
|
||||||
|
| {
|
||||||
|
readonly kind: "inventory";
|
||||||
|
readonly sourceCount: 6;
|
||||||
|
readonly sources: readonly string[];
|
||||||
|
readonly capability: {
|
||||||
|
readonly name: string;
|
||||||
|
readonly inputs: readonly string[];
|
||||||
|
readonly outputs: readonly string[];
|
||||||
|
readonly outcomes: readonly string[];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
readonly kind: "draft";
|
||||||
|
readonly workspaceId: "lda_report_workflow";
|
||||||
|
readonly revision: 2;
|
||||||
|
readonly status: "valid";
|
||||||
|
readonly stepCount: 2;
|
||||||
|
readonly routeCount: 2;
|
||||||
|
readonly steps: readonly string[];
|
||||||
|
readonly routes: readonly string[];
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
readonly kind: "diagnostic";
|
||||||
|
readonly workspaceId: "lda_report_workflow";
|
||||||
|
readonly revision: 3;
|
||||||
|
readonly status: "invalid";
|
||||||
|
readonly diagnostic: {
|
||||||
|
readonly code: "missing_outcome_edge";
|
||||||
|
readonly path: "nodes[analyze]";
|
||||||
|
readonly message: string;
|
||||||
|
readonly explanation: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
readonly kind: "repair";
|
||||||
|
readonly fromRevision: 3;
|
||||||
|
readonly toRevision: 4;
|
||||||
|
readonly command: string;
|
||||||
|
readonly status: "valid";
|
||||||
|
readonly diagnosticCount: 0;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
readonly kind: "artifact";
|
||||||
|
readonly artifactId: "lda_report_case_study";
|
||||||
|
readonly version: 1;
|
||||||
|
readonly immutable: true;
|
||||||
|
readonly requiredSources: readonly string[];
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
readonly kind: "deployment";
|
||||||
|
readonly deploymentId: "lda_report_case_study.default";
|
||||||
|
readonly status: "runnable";
|
||||||
|
readonly bindings: readonly {
|
||||||
|
readonly requirement: string;
|
||||||
|
readonly source: string;
|
||||||
|
}[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ReviewedAuthoringStep = {
|
||||||
|
readonly step: PreparedLifecycleStepId;
|
||||||
|
readonly evidence: ReviewedAuthoringEvidence;
|
||||||
|
};
|
||||||
|
|
||||||
|
const localSourceIds = [
|
||||||
|
"local.lda_docs",
|
||||||
|
"local.lda_report",
|
||||||
|
"local.issue_board",
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
// This catalog is static by design: presentation playback uses reviewed CLI facts,
|
||||||
|
// rather than invoking authoring or exposing disposable probe workspace IDs.
|
||||||
|
const reviewedAuthoringEvidence: Readonly<
|
||||||
|
Record<PreparedLifecycleStepId, ReviewedAuthoringEvidence>
|
||||||
|
> = {
|
||||||
|
discover: {
|
||||||
|
kind: "inventory",
|
||||||
|
sourceCount: 6,
|
||||||
|
sources: localSourceIds,
|
||||||
|
capability: {
|
||||||
|
name: "local.lda_report.analyze_documents",
|
||||||
|
inputs: ["documents"],
|
||||||
|
outputs: ["analysis"],
|
||||||
|
outcomes: ["ok"],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
draft: {
|
||||||
|
kind: "draft",
|
||||||
|
workspaceId: "lda_report_workflow",
|
||||||
|
revision: 2,
|
||||||
|
status: "valid",
|
||||||
|
stepCount: 2,
|
||||||
|
routeCount: 2,
|
||||||
|
steps: ["read_documents", "analyze"],
|
||||||
|
routes: ["read_documents.ok -> analyze", "analyze.ok -> __end__"],
|
||||||
|
},
|
||||||
|
diagnose: {
|
||||||
|
kind: "diagnostic",
|
||||||
|
workspaceId: "lda_report_workflow",
|
||||||
|
revision: 3,
|
||||||
|
status: "invalid",
|
||||||
|
diagnostic: {
|
||||||
|
code: "missing_outcome_edge",
|
||||||
|
path: "nodes[analyze]",
|
||||||
|
message: "reachable node is missing edges for outcomes ['ok']",
|
||||||
|
explanation: "The workflow cannot prove where execution goes next.",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
repair: {
|
||||||
|
kind: "repair",
|
||||||
|
fromRevision: 3,
|
||||||
|
toRevision: 4,
|
||||||
|
command:
|
||||||
|
"wf draft set-route lda_report_workflow --revision 3 --step analyze --outcome ok --to __end__",
|
||||||
|
status: "valid",
|
||||||
|
diagnosticCount: 0,
|
||||||
|
},
|
||||||
|
artifact: {
|
||||||
|
kind: "artifact",
|
||||||
|
artifactId: "lda_report_case_study",
|
||||||
|
version: 1,
|
||||||
|
immutable: true,
|
||||||
|
requiredSources: localSourceIds,
|
||||||
|
},
|
||||||
|
deployment: {
|
||||||
|
kind: "deployment",
|
||||||
|
deploymentId: "lda_report_case_study.default",
|
||||||
|
status: "runnable",
|
||||||
|
bindings: localSourceIds.map((source) => ({
|
||||||
|
requirement: source,
|
||||||
|
source,
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const reviewedAuthoringEvidenceFor = (
|
||||||
|
step: PreparedLifecycleStepId,
|
||||||
|
): ReviewedAuthoringEvidence => reviewedAuthoringEvidence[step];
|
||||||
Reference in New Issue
Block a user