67 lines
2.2 KiB
JavaScript
67 lines
2.2 KiB
JavaScript
import { readFile, access } from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
import { fail, pass, repositoryRoot } from './lib.mjs';
|
|
|
|
const required = [
|
|
'docs/PHASE_16_IMPLEMENTATION_AND_LAUNCH_REPORT_v1.0.md',
|
|
'docs/DECISION_LOG_v16.0.md',
|
|
'docs/IMPLEMENTATION_ISSUE_REGISTER_v1.6.csv',
|
|
'docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md',
|
|
'docs/phase16/LAUNCH_AUTHORIZATION_RECORD_v1.0.md',
|
|
'docs/phase16/FINAL_RELEASE_GATE_MATRIX_v1.0.csv',
|
|
'docs/phase16/COMMAND_AND_PLATFORM_ACTION_MATRIX_v1.0.csv',
|
|
'docs/phase16/DEFERRED_WORK_REGISTER_v1.0.csv',
|
|
'docs/phase16/FEATURE_FLAG_RELEASE_STATE_v1.0.csv',
|
|
'docs/phase16/SECRET_PROVISIONING_RECORD_v1.0.csv',
|
|
];
|
|
const failures = [];
|
|
for (const file of required) {
|
|
try {
|
|
await access(path.join(repositoryRoot, file));
|
|
} catch {
|
|
failures.push(`Missing required Phase 16 artifact: ${file}`);
|
|
}
|
|
}
|
|
const status = await readFile(
|
|
path.join(repositoryRoot, 'docs/phase16/FINAL_LAUNCH_STATUS_v1.0.md'),
|
|
'utf8',
|
|
);
|
|
const auth = await readFile(
|
|
path.join(repositoryRoot, 'docs/phase16/LAUNCH_AUTHORIZATION_RECORD_v1.0.md'),
|
|
'utf8',
|
|
);
|
|
const flags = await readFile(
|
|
path.join(repositoryRoot, 'docs/phase16/FEATURE_FLAG_RELEASE_STATE_v1.0.csv'),
|
|
'utf8',
|
|
);
|
|
const secrets = await readFile(
|
|
path.join(repositoryRoot, 'docs/phase16/SECRET_PROVISIONING_RECORD_v1.0.csv'),
|
|
'utf8',
|
|
);
|
|
if (!status.includes('Launch aborted before deployment'))
|
|
failures.push('Final launch status is missing or inconsistent.');
|
|
if (!auth.includes('**Rejected**'))
|
|
failures.push('Launch authorization is not explicitly rejected.');
|
|
if (
|
|
/\btrue\b/.test(
|
|
flags
|
|
.split('\n')
|
|
.slice(1)
|
|
.map((line) => line.split(',')[1])
|
|
.join('\n'),
|
|
)
|
|
)
|
|
failures.push('A Phase 16 production feature flag is enabled.');
|
|
if (
|
|
!secrets.includes('No production credentials exist') &&
|
|
!secrets.includes('No credential supplied')
|
|
)
|
|
failures.push(
|
|
'Secret provisioning record does not explicitly preserve missing credentials as blockers.',
|
|
);
|
|
if (failures.length) fail(failures);
|
|
else
|
|
pass(
|
|
'Phase 16 no-go governance, disabled feature state, blocked approvals, and evidence package are explicit and internally consistent.',
|
|
);
|