63 lines
2.3 KiB
JavaScript
63 lines
2.3 KiB
JavaScript
const EXPECTED_TRACE_SUMMARY = Object.freeze({
|
|
acceptanceCriteria: 52,
|
|
errorCategories: 9,
|
|
featureModules: 13,
|
|
parentFamilies: 89,
|
|
penProductFrames: 18,
|
|
productContracts: 19,
|
|
requirements: 109,
|
|
tasks: 52,
|
|
testCases: 117,
|
|
uiPages: 22,
|
|
});
|
|
|
|
const REQUIRED_UPSTREAM = Object.freeze({
|
|
"TASK-WP7-01": "passed",
|
|
"TASK-WP7-02": "passed",
|
|
"TASK-WP7-03": "deferred_nonblocking_first_version",
|
|
"TASK-WP7-04": "deferred_nonblocking_first_version",
|
|
"TASK-WP7-05": "passed",
|
|
});
|
|
|
|
const shaPattern = /^[0-9a-f]{40}$/i;
|
|
|
|
export function buildWp706PrefreezeReport({ currentCommit, releaseExists, trace, upstream }) {
|
|
if (releaseExists) throw new Error("WP7_06_RELEASE_WRITTEN_PREMATURELY");
|
|
if (!shaPattern.test(currentCommit ?? "")) throw new Error("WP7_06_CURRENT_COMMIT_INVALID");
|
|
if (trace?.status !== "passed" || !Array.isArray(trace?.errors) || trace.errors.length > 0) {
|
|
throw new Error("WP7_06_TRACE_VALIDATION_FAILED");
|
|
}
|
|
for (const [key, expected] of Object.entries(EXPECTED_TRACE_SUMMARY)) {
|
|
if (trace.summary?.[key] !== expected) throw new Error(`WP7_06_TRACE_COUNT_MISMATCH:${key}`);
|
|
}
|
|
|
|
for (const [taskId, expectedStatus] of Object.entries(REQUIRED_UPSTREAM)) {
|
|
const item = upstream?.[taskId];
|
|
if (!item || !shaPattern.test(item.head ?? "")) throw new Error(`WP7_06_UPSTREAM_HEAD_INVALID:${taskId}`);
|
|
if (item.merged !== true) throw new Error(`WP7_06_UPSTREAM_NOT_MERGED:${taskId}`);
|
|
if (item.status !== expectedStatus) throw new Error(`WP7_06_UNSUPPORTED_STATUS:${taskId}`);
|
|
}
|
|
|
|
return {
|
|
schema_version: "1.0",
|
|
task_id: "TASK-WP7-06",
|
|
status: "passed",
|
|
current_commit: currentCommit.toLowerCase(),
|
|
release_json_written: false,
|
|
trace_summary: { ...EXPECTED_TRACE_SUMMARY },
|
|
upstream: Object.fromEntries(Object.entries(REQUIRED_UPSTREAM).map(([taskId]) => [taskId, {
|
|
branch: upstream[taskId].branch,
|
|
head: upstream[taskId].head.toLowerCase(),
|
|
merged: true,
|
|
status: upstream[taskId].status,
|
|
}])),
|
|
deferred_external_tasks: Object.entries(REQUIRED_UPSTREAM)
|
|
.filter(([, status]) => status === "deferred_nonblocking_first_version")
|
|
.map(([taskId]) => taskId),
|
|
final_release_allowed: false,
|
|
next_task: "TASK-WP7-07",
|
|
};
|
|
}
|
|
|
|
export { EXPECTED_TRACE_SUMMARY, REQUIRED_UPSTREAM };
|