88 lines
2.6 KiB
TypeScript
88 lines
2.6 KiB
TypeScript
import { mkdir, readFile } from "node:fs/promises";
|
|
|
|
import { documentationReviewArtifactSchema } from "./contracts/release-artifacts.ts";
|
|
import { writeValidatedJsonArtifact } from "./lib/validated-json-artifact.ts";
|
|
|
|
type DocumentationReview = Readonly<{
|
|
sourcePath: string;
|
|
sha256: string;
|
|
thresholdSatisfied: boolean;
|
|
verdict: string;
|
|
score: number;
|
|
}>;
|
|
|
|
type ReviewLedger = Readonly<{
|
|
evidenceReport: Readonly<{
|
|
repoPath: string;
|
|
canonicalSha256: string;
|
|
}>;
|
|
reviews: Record<string, DocumentationReview>;
|
|
reviewer: string;
|
|
standard: string;
|
|
status: string;
|
|
}>;
|
|
|
|
const ledger = JSON.parse(
|
|
await readFile("docs/architecture/review-ledger.json", "utf8"),
|
|
) as ReviewLedger;
|
|
const evidence = await readFile(ledger.evidenceReport.repoPath, "utf8");
|
|
const results = [];
|
|
for (const [diagram, review] of Object.entries(ledger.reviews)) {
|
|
const sourceReferenced = evidence.includes(review.sourcePath);
|
|
const digestReferenced =
|
|
/^[0-9a-f]{64}$/.test(review.sha256) &&
|
|
evidence.includes(review.sha256);
|
|
const scorePass =
|
|
review.thresholdSatisfied === true &&
|
|
review.verdict === "PASS" &&
|
|
typeof review.score === "number" &&
|
|
evidence.includes(`| ${review.score} | PASS |`);
|
|
results.push({
|
|
diagram,
|
|
sourcePath: review.sourcePath,
|
|
sha256: review.sha256,
|
|
sourceReferenced,
|
|
digestReferenced,
|
|
reviewer: ledger.reviewer,
|
|
score: review.score,
|
|
scorePass,
|
|
passed:
|
|
sourceReferenced &&
|
|
digestReferenced &&
|
|
ledger.reviewer === "wiki-diagram-reviewer" &&
|
|
ledger.standard === "rules/diagram-standards.md v2" &&
|
|
scorePass &&
|
|
ledger.status === "PASS_SCOPED",
|
|
});
|
|
}
|
|
const reportDigestValid =
|
|
/^[0-9a-f]{64}$/.test(ledger.evidenceReport.canonicalSha256) &&
|
|
evidence.includes(ledger.evidenceReport.canonicalSha256);
|
|
const passed =
|
|
reportDigestValid &&
|
|
results.length === 2 &&
|
|
results.every((result) => result.passed);
|
|
await mkdir("artifacts/quality", { recursive: true });
|
|
await writeValidatedJsonArtifact({
|
|
path: "artifacts/quality/documentation-review.json",
|
|
schema: documentationReviewArtifactSchema,
|
|
value: {
|
|
schemaVersion: 1,
|
|
generatedAt: new Date().toISOString(),
|
|
status: ledger.status,
|
|
reviewer: ledger.reviewer,
|
|
standard: ledger.standard,
|
|
evidenceReport: ledger.evidenceReport,
|
|
reportDigestValid,
|
|
results,
|
|
passed,
|
|
},
|
|
});
|
|
if (!passed) {
|
|
process.stderr.write(
|
|
"Documentation readiness: FAIL_UNVERIFIED (canonical scoped-review evidence is incomplete)\n",
|
|
);
|
|
process.exit(1);
|
|
}
|
|
process.stdout.write("Documentation readiness: PASS_SCOPED\n");
|