docs: close Phase 0 acceptance gate
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { execFileSync } from 'node:child_process';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { upstream58e2204Operations } from '../src/upstream-58e2204.ts';
|
||||
|
||||
const PHASE_0_2_COMMIT='9dffadbec271227da7ffb192f31dc78c6ee3c2be';
|
||||
const BASELINE_PATH='packages/operation-registry/src/upstream-58e2204.ts';
|
||||
const repoRoot=fileURLToPath(new URL('../../../',import.meta.url));
|
||||
const safetyFields=['operationId','riskLevel','confirmationPolicy','capability','executionPolicy'] as const;
|
||||
type SafetyRow=Record<(typeof safetyFields)[number],string>;
|
||||
|
||||
function git(...args:string[]){return execFileSync('git',args,{cwd:repoRoot,encoding:'utf8',stdio:['ignore','pipe','pipe']}).trim();}
|
||||
|
||||
/** Parse only the JSON array literal assigned to the frozen raw operations constant; never evaluate TypeScript. */
|
||||
export function parseFrozenSafetyBaseline(source:string):SafetyRow[]{
|
||||
const marker='const rawUpstream58e2204Operations = ';
|
||||
const start=source.indexOf('[',source.indexOf(marker)+marker.length);
|
||||
assert.ok(source.includes(marker)&&start>=0,'frozen operation array marker missing');
|
||||
let quoted=false,escaped=false,depth=0,end=-1;
|
||||
for(let i=start;i<source.length;i++){
|
||||
const ch=source[i];
|
||||
if(quoted){if(escaped)escaped=false;else if(ch==='\\')escaped=true;else if(ch==='"')quoted=false;continue;}
|
||||
if(ch==='"'){quoted=true;continue;}if(ch==='[')depth++;else if(ch===']'&&--depth===0){end=i+1;break;}
|
||||
}
|
||||
assert.ok(end>start,'unterminated frozen operation array');
|
||||
const parsed=JSON.parse(source.slice(start,end));
|
||||
assert.ok(Array.isArray(parsed),'frozen operation baseline is not an array');
|
||||
return parsed.map((row:any,index:number)=>Object.fromEntries(safetyFields.map(field=>{assert.equal(typeof row?.[field],'string',`baseline row ${index} missing ${field}`);return [field,row[field]];})) as SafetyRow);
|
||||
}
|
||||
|
||||
export function assertExactSafetyBaseline(actual:readonly SafetyRow[],expected:readonly SafetyRow[]){
|
||||
assert.equal(expected.length,117,'independent baseline must contain exactly 117 operations');
|
||||
assert.equal(new Set(expected.map(x=>x.operationId)).size,117,'independent baseline operationIds must be unique');
|
||||
assert.equal(actual.length,117,'current Registry must contain exactly 117 operations');
|
||||
assert.equal(new Set(actual.map(x=>x.operationId)).size,117,'current Registry operationIds must be unique');
|
||||
const sort=(rows:readonly SafetyRow[])=>[...rows].sort((a,b)=>a.operationId.localeCompare(b.operationId));
|
||||
assert.deepEqual(sort(actual),sort(expected),'current Registry safety fields differ from frozen Phase 0.2 Git object; update requires explicit safety review');
|
||||
}
|
||||
|
||||
const project=(rows:readonly any[]):SafetyRow[]=>rows.map(row=>Object.fromEntries(safetyFields.map(field=>[field,row[field]])) as SafetyRow);
|
||||
|
||||
test('independent Phase 0.2 Git object freezes all 117 Registry safety decisions',()=>{
|
||||
assert.equal(git('rev-parse','9dffadb'),PHASE_0_2_COMMIT);
|
||||
assert.equal(git('cat-file','-t',PHASE_0_2_COMMIT),'commit');
|
||||
const baseline=parseFrozenSafetyBaseline(git('show',`${PHASE_0_2_COMMIT}:${BASELINE_PATH}`));
|
||||
assertExactSafetyBaseline(project(upstream58e2204Operations),baseline);
|
||||
});
|
||||
|
||||
test('independent safety comparison rejects risk, confirmation, capability and execution-policy mutations',()=>{
|
||||
const baseline=parseFrozenSafetyBaseline(git('show',`${PHASE_0_2_COMMIT}:${BASELINE_PATH}`));
|
||||
const mutations:[string,string,string][]=[
|
||||
['postData','riskLevel','R0'],
|
||||
['postSmsSend','confirmationPolicy','none'],
|
||||
['postSmsSend','capability','query'],
|
||||
['postSmsSend','executionPolicy','dedicatedFlow']
|
||||
];
|
||||
for(const [operationId,field,value] of mutations){const current=structuredClone(project(upstream58e2204Operations));(current.find(x=>x.operationId===operationId)! as any)[field]=value;assert.throws(()=>assertExactSafetyBaseline(current,baseline),/safety fields differ/,`${operationId}:${field}`);}
|
||||
});
|
||||
Reference in New Issue
Block a user