docs: add dev m5 gate report
This commit is contained in:
@@ -8,8 +8,24 @@ import { fileURLToPath } from "node:url";
|
||||
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
||||
const reportsDir = path.join(repoRoot, "reports/dev-gate");
|
||||
|
||||
const allowedIssues = new Set(["pikasTech/HWLAB#31", "pikasTech/HWLAB#33", "pikasTech/HWLAB#36"]);
|
||||
const requiredPreflightIssue = "pikasTech/HWLAB#34";
|
||||
const contractIssue = "pikasTech/HWLAB#31";
|
||||
const issueFamily = Object.freeze({
|
||||
DEV_DEPLOY_APPLY: "pikasTech/HWLAB#33",
|
||||
DEV_GATE_PREFLIGHT: "pikasTech/HWLAB#34",
|
||||
DEV_ARTIFACT_PUBLISH: "pikasTech/HWLAB#35",
|
||||
DEV_EDGE_HEALTH: "pikasTech/HWLAB#36",
|
||||
DEV_M4_AGENT_LOOP: "pikasTech/HWLAB#37",
|
||||
DEV_M3_HARDWARE_LOOP: "pikasTech/HWLAB#38",
|
||||
DEV_M5_GATE_REPORT: "pikasTech/HWLAB#39",
|
||||
DEV_BASE_IMAGE_PREFLIGHT: "pikasTech/HWLAB#40",
|
||||
DEV_EVIDENCE_BLOCKER_AGGREGATOR: "pikasTech/HWLAB#41"
|
||||
});
|
||||
const allowedIssues = new Set([
|
||||
contractIssue,
|
||||
...Object.values(issueFamily)
|
||||
]);
|
||||
const requiredPreflightIssue = issueFamily.DEV_GATE_PREFLIGHT;
|
||||
const requiredMilestoneIds = ["M0", "M1", "M2", "M3", "M4", "M5"];
|
||||
const requiredValidationCommands = [
|
||||
"node --check scripts/validate-dev-gate-report.mjs",
|
||||
"node scripts/validate-dev-gate-report.mjs"
|
||||
@@ -26,7 +42,7 @@ const requiredDocs = [
|
||||
"docs/dev-acceptance-matrix.md",
|
||||
"docs/m0-contract-audit.md"
|
||||
];
|
||||
const requiredDevM3Issue = "pikasTech/HWLAB#38";
|
||||
const requiredDevM3Issue = issueFamily.DEV_M3_HARDWARE_LOOP;
|
||||
const requiredDevM3ValidationCommands = [
|
||||
"node --check scripts/dev-m3-hardware-loop-smoke.mjs",
|
||||
"node scripts/dev-m3-hardware-loop-smoke.mjs --live --confirm-dev --confirmed-non-production"
|
||||
@@ -35,7 +51,7 @@ const requiredDevM3Docs = [
|
||||
"docs/dev-acceptance-matrix.md",
|
||||
"docs/m3-hardware-loop.md"
|
||||
];
|
||||
const requiredDevEdgeIssue = "pikasTech/HWLAB#36";
|
||||
const requiredDevEdgeIssue = issueFamily.DEV_EDGE_HEALTH;
|
||||
const requiredDevEdgeValidationCommands = [
|
||||
"node --check scripts/dev-edge-health-smoke.mjs",
|
||||
"node --check scripts/src/dev-edge-health-smoke-lib.mjs",
|
||||
@@ -259,6 +275,55 @@ async function validateReport(relativePath) {
|
||||
if (Object.hasOwn(report, "notes")) {
|
||||
assertString(report.notes, `${label}.notes`);
|
||||
}
|
||||
|
||||
if (Object.hasOwn(report, "gateStatus")) {
|
||||
assertStatus(report.gateStatus, `${label}.gateStatus`);
|
||||
}
|
||||
|
||||
if (Object.hasOwn(report, "milestones")) {
|
||||
assertArray(report.milestones, `${label}.milestones`);
|
||||
assert.deepEqual(
|
||||
report.milestones.map((milestone) => milestone.id),
|
||||
requiredMilestoneIds,
|
||||
`${label}.milestones must cover M0-M5 in order`
|
||||
);
|
||||
assertUnique(
|
||||
report.milestones.map((milestone) => milestone.id),
|
||||
`${label}.milestones`
|
||||
);
|
||||
|
||||
for (const [index, milestone] of report.milestones.entries()) {
|
||||
const milestoneLabel = `${label}.milestones[${index}]`;
|
||||
assertObject(milestone, milestoneLabel);
|
||||
for (const field of ["id", "status", "commands", "evidence", "summary"]) {
|
||||
assert.ok(Object.hasOwn(milestone, field), `${milestoneLabel} missing ${field}`);
|
||||
}
|
||||
assert.match(milestone.id, /^M[0-5]$/, `${milestoneLabel}.id`);
|
||||
assertStatus(milestone.status, `${milestoneLabel}.status`);
|
||||
assertStringArray(milestone.commands, `${milestoneLabel}.commands`, { minLength: 1 });
|
||||
assertUnique(milestone.commands, `${milestoneLabel}.commands`);
|
||||
assertStringArray(milestone.evidence, `${milestoneLabel}.evidence`, { minLength: 1 });
|
||||
assertUnique(milestone.evidence, `${milestoneLabel}.evidence`);
|
||||
assertString(milestone.summary, `${milestoneLabel}.summary`);
|
||||
if (Object.hasOwn(milestone, "blocker")) {
|
||||
assertString(milestone.blocker, `${milestoneLabel}.blocker`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.hasOwn(report.devPreconditions, "commands")) {
|
||||
assertStringArray(report.devPreconditions.commands, `${label}.devPreconditions.commands`, {
|
||||
minLength: 1
|
||||
});
|
||||
assertUnique(report.devPreconditions.commands, `${label}.devPreconditions.commands`);
|
||||
}
|
||||
|
||||
if (Object.hasOwn(report.devPreconditions, "evidence")) {
|
||||
assertStringArray(report.devPreconditions.evidence, `${label}.devPreconditions.evidence`, {
|
||||
minLength: 1
|
||||
});
|
||||
assertUnique(report.devPreconditions.evidence, `${label}.devPreconditions.evidence`);
|
||||
}
|
||||
}
|
||||
|
||||
async function assertDocumentSet(documentsValue, label, requiredDocs) {
|
||||
|
||||
Reference in New Issue
Block a user