Cai
2026-08-24 156ea25b402479f0abc54c558bbf87f9eaaa0422
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import fs from 'node:fs';
import path from 'node:path';
import crypto from 'node:crypto';
import {spawnSync} from 'node:child_process';
 
const ROOT=process.cwd();
const CASE_ROOT=path.join('ana-data','cases','机器人案例','ANA-ROBOT-INDUSTRY-001');
const MANIFEST=path.join(CASE_ROOT,'manifest','artifact_manifest.csv');
const RUN='RUN-ANA-ROBOT-COVERAGE-FIRST-DESIGN-REPAIR-005';
const BATCH='BATCH-ANA-ROBOT-COVERAGE-FIRST-DESIGN-REPAIR-005';
const CHECKED_AT=new Date().toISOString();
const P={
  harness:path.join(CASE_ROOT,'manifest','coverage_first_stage1_validation_regression_harness_repair005_20260729.mjs'),
  builder:path.join(CASE_ROOT,'manifest','coverage_first_design_repair005_package_builder_20260729.mjs'),
  matrix4:path.join(CASE_ROOT,'evidence','coverage_first_stage1_validation_supersession_matrix_repair004_20260729.csv'),
  matrix5:path.join(CASE_ROOT,'evidence','coverage_first_stage1_validation_supersession_matrix_repair005_20260729.csv'),
  final89:path.join(CASE_ROOT,'evidence','coverage_first_stage1_validation_check_authority_repair004_20260729.csv'),
  cases:path.join(CASE_ROOT,'evidence','coverage_first_stage1_validation_regression_negative_cases_repair004_20260729.csv'),
  results:path.join(CASE_ROOT,'evidence','coverage_first_stage1_validation_regression_results_repair005_20260729.csv'),
  stageSet:path.join(CASE_ROOT,'manifest','coverage_first_stage1_execution_artifact_set_repair005_20260729.csv'),
  packageSet:path.join(CASE_ROOT,'manifest','coverage_first_design_repair005_artifact_set_20260729.csv'),
  baseline:path.join(CASE_ROOT,'evidence','coverage_first_design_repair005_baseline_20260729.csv'),
  request:path.join(CASE_ROOT,'manifest','review_request_coverage_first_design_repair005_20260729.md'),
  validation:path.join(CASE_ROOT,'manifest','coverage_first_design_repair005_validation_20260729.csv')
};
 
const hash=value=>crypto.createHash('sha256').update(value).digest('hex');
const norm=text=>text.replace(/\r\n/g,'\n').replace(/\r/g,'\n');
const lineCount=text=>norm(text).replace(/\n$/,'').split('\n').length;
const quote=value=>`"${String(value??'').replaceAll('"','""')}"`;
const csv=(cols,rows)=>`${[cols.map(quote).join(','),...rows.map(r=>cols.map(c=>quote(r[c])).join(','))].join('\r\n')}\r\n`;
function parseCsv(text){const rs=[];let r=[],f='',q=false;for(let i=0;i<text.length;i++){const c=text[i];if(q){if(c==='"'&&text[i+1]==='"'){f+='"';i++;}else if(c==='"')q=false;else f+=c;}else if(c==='"')q=true;else if(c===','){r.push(f);f='';}else if(c==='\n'){r.push(f.endsWith('\r')?f.slice(0,-1):f);f='';if(r.some(v=>v!==''))rs.push(r);r=[];}else f+=c;}if(f||r.length){r.push(f);if(r.some(v=>v!==''))rs.push(r);}const h=rs.shift().map((v,i)=>i===0?v.replace(/^\uFEFF/,''):v);return rs.map(v=>Object.fromEntries(h.map((n,i)=>[n,v[i]??''])));}
const read=file=>fs.readFileSync(path.join(ROOT,file));
function identity(file){const b=read(file);return{rows:file.endsWith('.csv')?parseCsv(b.toString('utf8')).length:lineCount(b.toString('utf8')),bytes:b.length,sha256:hash(b)};}
function section(file,marker){const lines=norm(read(file).toString('utf8')).split('\n');const start=lines.findIndex(line=>line.includes(marker));if(start<0)throw new Error(`missing section ${marker}`);const m=lines[start].match(/^(#{1,6})\s/);if(!m)return `${lines[start]}\n`;const depth=m[1].length;let end=lines.length;for(let i=start+1;i<lines.length;i++){const h=lines[i].match(/^(#{1,6})\s/);if(h&&h[1].length<=depth){end=i;break;}}return `${lines.slice(start,end).join('\n').replace(/\n+$/,'')}\n`;}
function add(rows,id,type,file,scope,policy,state,forced){const x=forced??identity(file.split('#')[0]);rows.push({baseline_id:id,authority_type:type,artifact_path:file,rows:x.rows,bytes:x.bytes,sha256:x.sha256,scope_count:scope,identity_policy:policy,required_state:state,checked_at:CHECKED_AT});}
function invokeHarness(){const p=spawnSync(process.execPath,[P.harness,'--self-test'],{cwd:ROOT,encoding:'utf8'});if(p.status!==0)throw new Error(`harness failed ${p.stderr}`);const parsed=JSON.parse(p.stdout.trim());if(parsed.status!=='SELF_TEST_PASS'||parsed.passed!==8||parsed.mutation_cases!==8||parsed.corrected_target!=='COVR3VAL-004->COVR4VAL-072')throw new Error(`harness result invalid ${p.stdout}`);return parsed;}
 
function buildBaseline(){
  const rows=[];
  const fixed=[
    ['MATRIX4',P.matrix4,'97'],['FINAL89',P.final89,'89'],['CASES8',P.cases,'8'],
    ['PAIR84',path.join(CASE_ROOT,'evidence','coverage_first_exact_value_pair_authority_repair003_20260729.csv'),'84'],
    ['FIELD2763',path.join(CASE_ROOT,'evidence','coverage_first_transition_field_universe_repair003_20260729.csv'),'2763'],
    ['GAP3166',path.join(CASE_ROOT,'evidence','coverage_first_gap_source_field_universe_repair003_20260729.csv'),'3166'],
    ['TRANSITION307',path.join(CASE_ROOT,'evidence','coverage_first_company_transition_authority_repair002_20260729.csv'),'307'],
    ['RELATION_AUTHORITY',path.join(CASE_ROOT,'evidence','coverage_first_relation_enum_pairing_authority_repair001_20260729.csv'),''],
    ['CANONICAL_COMPANY',path.join(CASE_ROOT,'outputs','数据表','robot_company_master.csv'),'307'],
    ['CANONICAL_TOPIC',path.join(CASE_ROOT,'outputs','数据表','robot_subindustry_master.csv'),'24'],
    ['PROTECTED49',path.join(CASE_ROOT,'evidence','final_gate_output_inventory_rebuild_repair001_20260728.csv'),'49']
  ];
  fixed.forEach((v,i)=>add(rows,`COVR5BASE-${String(i+1).padStart(3,'0')}`,v[0],v[1],v[2]||String(identity(v[1]).rows),'FULL_FILE_IDENTITY','UNCHANGED'));
  [P.harness,P.builder,P.matrix5,P.results,P.stageSet,P.packageSet].forEach((file,i)=>add(rows,`COVR5BASE-${String(i+12).padStart(3,'0')}`,'REPAIR005_AUTHORITY',file,String(identity(file).rows),'FULL_FILE_IDENTITY','FROZEN'));
  const sections=[
    ['SOURCE_AUDIT','ana-doc/机器人案例/案例审计报告.md','AUDIT-ANA-ROBOT-COVERAGE-FIRST-DESIGN-REPAIR004-REREVIEW-001','FAIL_SOURCE_AUDIT'],
    ['DESIGN','ana-doc/机器人案例/案例分析设计.md','DESIGN-ANA-ROBOT-COVERAGE-FIRST-CHAIN-COMPANY-REPAIR-005','PREPARED'],
    ['RUNLOG','ana-doc/机器人案例/案例执行日志.md','RUN-ANA-ROBOT-COVERAGE-FIRST-DESIGN-REPAIR-005','PREPARED'],
    ['PARENT','ana-doc/案例总纲.md','机器人覆盖优先设计 REPAIR-005 待聚焦复审','PENDING'],
    ['REMAINING',path.join(CASE_ROOT,'manifest','remaining_work_plan_20260704.md'),'NEXT-ROBOT-038R5 supersession 与 executable regression 最小返修','PENDING']
  ];
  sections.forEach((v,i)=>{const b=Buffer.from(section(v[1],v[2]),'utf8');add(rows,`COVR5BASE-${String(i+18).padStart(3,'0')}`,v[0],`${v[1]}#${v[2]}`,String(lineCount(b.toString('utf8'))),'APPEND_STABLE_NORMALIZED_LF_SECTION',v[3],{rows:lineCount(b.toString('utf8')),bytes:b.length,sha256:hash(b)});});
  const next=parseCsv(read(path.join(CASE_ROOT,'manifest','next_action_list.csv')).toString('utf8')).find(row=>Object.values(row).includes('NEXT-ROBOT-038R5'));if(!next)throw new Error('missing next action');const b=Buffer.from(`${Object.values(next).map(quote).join(',')}\n`,'utf8');add(rows,'COVR5BASE-023','NEXT_ACTION',`${path.join(CASE_ROOT,'manifest','next_action_list.csv')}#NEXT-ROBOT-038R5`,'1','APPEND_STABLE_ROW','PENDING',{rows:1,bytes:b.length,sha256:hash(b)});
  add(rows,'COVR5BASE-024','MANIFEST_PREFIX',`${MANIFEST}#PREFIX852`,'852','PREFIX_EXACT_BYTES','IMMUTABLE',{rows:852,bytes:289772,sha256:'999e3a7a039680abcb1ad2337c186969fda8005713f14b71e34356600c7f0b3b'});
  return rows;
}
 
function buildRequest(baseText){return `# 机器人覆盖优先 Stage 1 设计 REPAIR-005 聚焦复审请求\n\n- case_id: \`ANA-ROBOT-INDUSTRY-001\`\n- action_id: \`NEXT-ROBOT-038R5\`\n- source_audit: \`AUDIT-ANA-ROBOT-COVERAGE-FIRST-DESIGN-REPAIR004-REREVIEW-001\`\n- design: \`DESIGN-ANA-ROBOT-COVERAGE-FIRST-CHAIN-COMPANY-REPAIR-005\`\n- batch/run: \`${BATCH} / ${RUN}\`\n\n## 唯一范围\n\n仅复审 COVR3VAL-004 的 supersession 精确指向及 8 个真实 mutation→evaluateRuntime 回归。final89、REPAIR003 authorities 和全部已通过门不重开。\n\n## 冻结结果\n\n- corrected matrix=97;COVR3VAL-004→COVR4VAL-072 恰1;其余96行不变。\n- clean runtime errors=0。\n- 8 cases 全部 mutation_applied=YES、oracle=evaluateRuntime、actual REJECT、expected code matched。\n- tuple swap matched/runtime errors=4/4;其余7例各1/1。\n- Stage1 exact-set=11/order1..11;baseline=${parseCsv(baseText).length}/sha256 ${hash(Buffer.from(baseText))}。\n- manifest prefix=852 rows/289772 bytes/999e3a7a...;reserved Stage1=0。\n\n若聚焦复审 PASS,请只精确释放唯一 Stage1 batch/run;Stage2/3和canonical cutover继续NOT_ALLOWED。\n`;}
 
function buildValidation(harnessResult){
  const m4=parseCsv(read(P.matrix4).toString('utf8')),m5=parseCsv(read(P.matrix5).toString('utf8')),final89=parseCsv(read(P.final89).toString('utf8')),results=parseCsv(read(P.results).toString('utf8')),stage=parseCsv(read(P.stageSet).toString('utf8')),pack=parseCsv(read(P.packageSet).toString('utf8'));
  const shared=['prior_check_id','prior_version','prior_check_group','disposition','final_check_ids','replacement_reason','anti_join_policy'];let changedRows=0,changedOutside=0;for(let i=0;i<m4.length;i++){const diffs=shared.filter(c=>m4[i][c]!==m5[i][c]);if(diffs.length){changedRows++;if(m4[i].prior_check_id!=='COVR3VAL-004'||diffs.some(c=>!['final_check_ids','replacement_reason'].includes(c)))changedOutside++;}}
  const manifestBuffer=read(MANIFEST),manifest=parseCsv(manifestBuffer.toString('utf8')),prefix=manifestBuffer.subarray(0,289772);
  const rows=[];const add=(id,g,n,e,a,ref)=>rows.push({validation_id:id,check_group:g,check_name:n,comparator:'EQ',expected:String(e),actual:String(a),status:String(e)===String(a)?'PASS':'FAIL',evidence_ref:ref});
  add('COVR5DVAL-001','HARNESS','actual invocation status','SELF_TEST_PASS',harnessResult.status,P.harness);
  add('COVR5DVAL-002','HARNESS','clean runtime','PASS',harnessResult.clean_runtime,P.harness);
  add('COVR5DVAL-003','HARNESS','actual invoked cases','8',harnessResult.mutation_cases,P.harness);
  add('COVR5DVAL-004','HARNESS','actual passed cases','8',harnessResult.passed,P.harness);
  add('COVR5DVAL-005','MATRIX','rows/unique','97/97',`${m5.length}/${new Set(m5.map(r=>r.prior_check_id)).size}`,P.matrix5);
  add('COVR5DVAL-006','MATRIX','changed rows','1',changedRows,P.matrix5);
  add('COVR5DVAL-007','MATRIX','changes outside exact row/fields','0',changedOutside,P.matrix5);
  add('COVR5DVAL-008','MATRIX','exact corrected target','1',m5.filter(r=>r.prior_check_id==='COVR3VAL-004'&&r.final_check_ids==='COVR4VAL-072').length,P.matrix5);
  add('COVR5DVAL-009','MATRIX','target semantic identity','1',final89.filter(r=>r.check_id==='COVR4VAL-072'&&r.check_group==='PAIR'&&r.comparator==='ANTI_JOIN_ZERO'&&r.expected==='actual_minus_allowed=0').length,P.final89);
  add('COVR5DVAL-010','RESULT','rows/unique','8/8',`${results.length}/${new Set(results.map(r=>r.case_id)).size}`,P.results);
  add('COVR5DVAL-011','RESULT','mutation applied','8',results.filter(r=>r.mutation_applied==='YES').length,P.results);
  add('COVR5DVAL-012','RESULT','runtime oracle','8',results.filter(r=>r.oracle_function==='evaluateRuntime').length,P.results);
  add('COVR5DVAL-013','RESULT','actual reject and pass','8',results.filter(r=>r.actual_result==='REJECT'&&r.pass==='PASS').length,P.results);
  add('COVR5DVAL-014','RESULT','tuple swap mismatch count','4',results.find(r=>r.mutation_kind==='REVIEWED_COMPANY_TUPLE_SWAP')?.matched_error_count??'',P.results);
  add('COVR5DVAL-015','RESULT','other exact single errors','7',results.filter(r=>r.mutation_kind!=='REVIEWED_COMPANY_TUPLE_SWAP'&&r.matched_error_count==='1'&&r.runtime_error_count==='1').length,P.results);
  add('COVR5DVAL-016','FINAL89','identity rows/hash','89/8a4ea85630bfc0082b923b1066d6c2d5a688f5c82963deb7ace586c1c8d73363',`${final89.length}/${identity(P.final89).sha256}`,P.final89);
  add('COVR5DVAL-017','STAGE_SET','rows/unique/order','11/11/11',`${stage.length}/${new Set(stage.map(r=>r.artifact_path)).size}/${stage.filter((r,i)=>Number(r.generation_order)===i+1).length}`,P.stageSet);
  add('COVR5DVAL-018','STAGE_SET','harness binding policy','1',stage.filter(r=>r.generation_order==='11'&&r.freeze_policy.includes('EXECUTABLE_8_CASE_HARNESS')).length,P.stageSet);
  add('COVR5DVAL-019','PACKAGE_SET','rows/unique/order','8/8/8',`${pack.length}/${new Set(pack.map(r=>r.artifact_path)).size}/${pack.filter((r,i)=>Number(r.generation_order)===i+1).length}`,P.packageSet);
  add('COVR5DVAL-020','PACKAGE_SET','nonvalidation artifacts exist','7',pack.filter(r=>r.generation_order!=='8'&&fs.existsSync(path.join(ROOT,r.artifact_path))).length,P.packageSet);
  add('COVR5DVAL-021','MANIFEST','rows before append','852',manifest.length,MANIFEST);
  add('COVR5DVAL-022','MANIFEST','prefix bytes','289772',prefix.length,MANIFEST);
  add('COVR5DVAL-023','MANIFEST','prefix sha','999e3a7a039680abcb1ad2337c186969fda8005713f14b71e34356600c7f0b3b',hash(prefix),MANIFEST);
  add('COVR5DVAL-024','MANIFEST','repair005 rows before append','0',manifest.filter(r=>r.run_id===RUN).length,MANIFEST);
  add('COVR5DVAL-025','RESERVED','Stage1 manifest rows','0',manifest.filter(r=>r.run_id==='RUN-ANA-ROBOT-COVERAGE-FIRST-STRUCTURED-001').length,MANIFEST);
  add('COVR5DVAL-026','RESERVED','Stage1 artifacts existing','0',stage.filter(r=>fs.existsSync(path.join(ROOT,r.artifact_path))).length,P.stageSet);
  add('COVR5DVAL-027','FINAL','ordinary failures','0',rows.filter(r=>r.status==='FAIL').length,'this validation');
  rows.push({validation_id:'COVR5DVAL-028',check_group:'SELF_REFERENCE',check_name:'validation final identity',comparator:'EQ',expected:'INFO/SELF_REFERENCE_EXCLUDED',actual:'INFO/SELF_REFERENCE_EXCLUDED',status:'INFO',evidence_ref:P.validation});
  return rows;
}
 
if(!process.argv.includes('--execute')){process.stdout.write('Use --execute\n');process.exit(0);}
const harnessResult=invokeHarness();const baseRows=buildBaseline();const baseText=csv(['baseline_id','authority_type','artifact_path','rows','bytes','sha256','scope_count','identity_policy','required_state','checked_at'],baseRows);fs.writeFileSync(P.baseline,baseText,'utf8');fs.writeFileSync(P.request,buildRequest(baseText),'utf8');const validationRows=buildValidation(harnessResult);fs.writeFileSync(P.validation,csv(['validation_id','check_group','check_name','comparator','expected','actual','status','evidence_ref'],validationRows),'utf8');
process.stdout.write(JSON.stringify({harness:{status:harnessResult.status,passed:harnessResult.passed},baseline:identity(P.baseline),request:identity(P.request),validation:identity(P.validation),status:validationRows.reduce((a,r)=>(a[r.status]=(a[r.status]??0)+1,a),{})})+'\n');