deadbyte-mcp 0.15.74 → 0.15.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/MANIFEST.SHA256 +102 -42
  2. package/PROVENANCE.json +19 -21
  3. package/README.txt +23 -18
  4. package/RELEASE.json +51 -18
  5. package/SBOM.cdx.json +2 -2
  6. package/TEST-MATRIX.json +22 -2
  7. package/bin/deadbyte-desktop-uia-r199-fixed.exe +0 -0
  8. package/bin/deadbyte-desktop-uia-r199-fixed.obj +0 -0
  9. package/bin/deadbyte-desktop-uia-r199.exe +0 -0
  10. package/bin/deadbyte-desktop-uia-r199.obj +0 -0
  11. package/bin/deadbyte-fs-read-r197-fixed.exe +0 -0
  12. package/bin/deadbyte-fs-read-r198.exe +0 -0
  13. package/bin/deadbyte-fs-read-r198.obj +0 -0
  14. package/bin/deadbyte-root-relative-probe-r197.exe +0 -0
  15. package/bridge/package.json +1 -1
  16. package/controller/deadbyte-process-policy.json +4 -4
  17. package/docs/R184-package-lock.json +2 -8
  18. package/native/deadbyte-desktop-uia-r199.cpp +345 -0
  19. package/native/deadbyte-fs-read-r197.cpp +174 -0
  20. package/native/deadbyte-fs-read-r198.cpp +181 -0
  21. package/native/deadbyte-root-relative-probe-r197.cpp +97 -0
  22. package/package.json +4 -2
  23. package/scripts/build-native-desktop-uia-r199-fixed.ps1 +28 -0
  24. package/scripts/build-native-desktop-uia-r199.ps1 +28 -0
  25. package/scripts/build-native-fs-read-r197-fixed.ps1 +28 -0
  26. package/scripts/build-native-fs-read-r197.ps1 +28 -0
  27. package/scripts/build-native-fs-read-r198.ps1 +28 -0
  28. package/scripts/build-native-root-probe-r197.ps1 +28 -0
  29. package/scripts/gate-windows-r195.ps1 +114 -0
  30. package/scripts/gate-windows-r206.ps1 +116 -0
  31. package/scripts/init-desktop-policy-r199.ps1 +85 -0
  32. package/scripts/npm-release-r48.mjs +17 -0
  33. package/scripts/npm-release-readiness-r195.mjs +72 -0
  34. package/scripts/npm-release-readiness-r206.mjs +76 -0
  35. package/scripts/r193-owner-request-live.mjs +5 -6
  36. package/scripts/r193-owner-uac-broker.mjs +3 -3
  37. package/scripts/r205-candidate-selection.mjs +22 -0
  38. package/src/candidate-selection-evidence-r206.mjs +71 -0
  39. package/src/candidate-selection-r205.mjs +96 -0
  40. package/src/desktop-postcondition-r196.mjs +30 -0
  41. package/src/desktop-runtime-r40.mjs +44 -7
  42. package/src/desktop-uia-identity-r199.mjs +51 -0
  43. package/src/desktop-uia-r40.mjs +9 -1
  44. package/src/machine-fs-handle-read-r196.mjs +43 -0
  45. package/src/machine-fs-native-read-r197.mjs +73 -0
  46. package/src/machine-fs-native-read-r198.mjs +76 -0
  47. package/src/machine-fs-read-worker.mjs +5 -25
  48. package/src/machine-fs.mjs +31 -16
  49. package/src/r195-canonical-owner-observation.mjs +15 -0
  50. package/src/remote-destination-journal-r202.mjs +120 -0
  51. package/src/remote-device-r44.mjs +89 -14
  52. package/src/remote-payload-boundary-r201.mjs +71 -0
  53. package/src/remote-terminal-evidence-r200.mjs +60 -0
  54. package/src/version.mjs +1 -1
  55. package/test/desktop-runtime-r40.test.mjs +111 -0
  56. package/test/desktop-uia-r40.test.mjs +15 -0
  57. package/test/fixtures/r197-junction-swap-worker.mjs +21 -0
  58. package/test/fixtures/r203-journal-writer.mjs +6 -0
  59. package/test/process-policy-refresh.test.mjs +4 -4
  60. package/test/r130-release-security-contract.test.mjs +8 -8
  61. package/test/r132-release-identity.test.mjs +7 -7
  62. package/test/r153-prepublish-identity.test.mjs +1 -1
  63. package/test/r160-release-contract.test.mjs +3 -3
  64. package/test/r165-live-cli-skew.test.mjs +1 -1
  65. package/test/r167-release-contract.test.mjs +11 -11
  66. package/test/r168-release-contract.test.mjs +4 -4
  67. package/test/r172-release-contract.test.mjs +6 -6
  68. package/test/r173-release-contract.test.mjs +16 -16
  69. package/test/r179-release-contract.test.mjs +12 -12
  70. package/test/r190-release-contract.test.mjs +10 -10
  71. package/test/r191-release-contract.test.mjs +12 -12
  72. package/test/r192-release-identity.test.mjs +9 -9
  73. package/test/r193-release-identity.test.mjs +24 -22
  74. package/test/r193-release-readiness.test.mjs +2 -2
  75. package/test/r193-windows-gate.test.mjs +8 -8
  76. package/test/r194-release-identity.test.mjs +19 -15
  77. package/test/r194-release-readiness.test.mjs +2 -2
  78. package/test/r194-windows-gate.test.mjs +7 -6
  79. package/test/r195-canonical-owner-observation.test.mjs +32 -0
  80. package/test/r195-release-readiness.test.mjs +22 -0
  81. package/test/r196-desktop-postcondition.test.mjs +53 -0
  82. package/test/r196-handle-bound-read.test.mjs +99 -0
  83. package/test/r196-remote-outcome.test.mjs +94 -0
  84. package/test/r197-namespace-race.test.mjs +41 -0
  85. package/test/r197-native-dispatch-race.test.mjs +49 -0
  86. package/test/r197-native-file-read.test.mjs +60 -0
  87. package/test/r197-native-root-open.test.mjs +61 -0
  88. package/test/r198-root-identity.test.mjs +88 -0
  89. package/test/r199-native-uia-worker.test.mjs +28 -0
  90. package/test/r199-uia-identity.test.mjs +43 -0
  91. package/test/r200-remote-reconcile.test.mjs +106 -0
  92. package/test/r201-payload-boundary.test.mjs +78 -0
  93. package/test/r201-payload-fuzz.test.mjs +37 -0
  94. package/test/r201-tool-boundary-fuzz.test.mjs +120 -0
  95. package/test/r202-destination-journal.test.mjs +92 -0
  96. package/test/r203-atomic-journal.test.mjs +86 -0
  97. package/test/r205-candidate-selection-cli.test.mjs +31 -0
  98. package/test/r205-candidate-selection.test.mjs +83 -0
  99. package/test/r206-candidate-evidence.test.mjs +64 -0
  100. package/test/r206-release-contract.test.mjs +42 -0
  101. package/test/r206-release-readiness.test.mjs +23 -0
  102. package/test/r59-tool-surface-compat.test.mjs +1 -1
  103. package/test/r64-machine-fs-large-read.test.mjs +26 -12
@@ -100,6 +100,48 @@ test('desktop runtime performs observe-target-fresh-guard-effect-post chain',asy
100
100
  }),{ok:true,receipt_sha256:result.receipt_sha256,kind:'desktop_action_completed',receipt_id:result.receipt_id});
101
101
  });
102
102
 
103
+ test('R196 Desktop explicit postimage is signed separately from injection completion',async()=>{
104
+ const fx=await fixture();
105
+ const result=await fx.runtime.action({
106
+ intentId:H('r196-postimage'),kind:'click_primary',expectedFrameId:fx.expected.frame_id,
107
+ point:{x:20,y:20},expectedPostcondition:{kind:'frame_image_sha256',expected_sha256:H('after')}
108
+ });
109
+ assert.equal(result.injected,true);
110
+ assert.equal(result.side_effect_state,'confirmed_injected');
111
+ assert.equal(result.task_success,null,'generic task success must remain unknown');
112
+ assert.equal(result.postcondition.status,'satisfied');
113
+ assert.equal(result.postcondition.reason,'exact_post_image_observed');
114
+ assert.match(result.postcondition_sha256,/^[0-9a-f]{64}$/);
115
+ const receipt=JSON.parse(await readFile(path.join(fx.evidence,result.receipt_id+'.json'),'utf8'));
116
+ assert.equal(receipt.payload.postcondition.status,'satisfied');
117
+ assert.equal(receipt.payload.postcondition_sha256,result.postcondition_sha256);
118
+ assert.equal(verifyDesktopReceiptObject(receipt,{
119
+ policySha256:fx.policy.policy_sha256,publicKey:fx.publicKey,keyId:'test-key'
120
+ }).ok,true,'postcondition evidence must be in signed receipt');
121
+ });
122
+
123
+ test('R196 Desktop injected input without expected postimage is not application success',async()=>{
124
+ const before={frame:F('2026-09-19T02:00:00.700Z'),backend:'fake',byte_length:4};
125
+ const after={frame:F('2026-09-19T02:00:01.000Z'),backend:'fake',byte_length:4};
126
+ const fx=await fixture({captureFrames:[before,after]});
127
+ const result=await fx.runtime.action({
128
+ intentId:H('r196-disabled-like'),kind:'click_primary',expectedFrameId:fx.expected.frame_id,point:{x:20,y:20},
129
+ expectedPostcondition:{kind:'frame_image_sha256',expected_sha256:H('desired-but-unobserved')}
130
+ });
131
+ assert.equal(result.injected,true);
132
+ assert.equal(result.postcondition.status,'unsatisfied');
133
+ assert.equal(result.task_success,null);
134
+ });
135
+
136
+ test('R196 Desktop malformed postcondition fails before input dispatch',async()=>{
137
+ const fx=await fixture();
138
+ await assert.rejects(fx.runtime.action({
139
+ intentId:H('r196-forgery'),kind:'click_primary',expectedFrameId:fx.expected.frame_id,point:{x:20,y:20},
140
+ expectedPostcondition:{kind:'frame_image_sha256',expected_sha256:H('after'),_internal:true}
141
+ }),/unsupported desktop postcondition/);
142
+ assert.equal(fx.calls.length,0);
143
+ });
144
+
103
145
  test('desktop runtime refuses effect when expected frame is stale',async()=>{
104
146
  const fx=await fixture({times:['2026-09-19T02:00:03.500Z']});
105
147
  await assert.rejects(fx.runtime.action({
@@ -322,3 +364,72 @@ test('T5 UIA grounding re-observes and binds candidate to fresh frame without mu
322
364
  assert.equal(JSON.stringify(result).includes('Save'),false);
323
365
  assert.equal(fx.calls.length,0);
324
366
  });
367
+
368
+ test('R199 stale UIA RuntimeId must refuse action before input delivery',async()=>{
369
+ const at='2026-09-19T02:00:00.700Z';
370
+ const f1={frame:F(at),backend:'fake',byte_length:4};
371
+ const f2={frame:F('2026-09-19T02:00:00.750Z'),backend:'fake',byte_length:4};
372
+ const f3={frame:F('2026-09-19T02:00:01.100Z',H('post')),backend:'fake',byte_length:4};
373
+ let lookups=0;
374
+ const grounderProvider=async({query})=>{
375
+ lookups++;
376
+ assert.equal(query.value,'Save');
377
+ return {status:'ok',query_sha256:H('R199-Save'),query_kind:'name_exact',ordinal:0,
378
+ visited:2,truncated:false,provider_receipt_sha256:H('uia-provider'),
379
+ matches:[{rect:{left:100,top:120,width:80,height:30},control_type:50000,
380
+ enabled:true,offscreen:false,runtime_id:lookups===1?[17,222,0]:[17,223,0]}]};
381
+ };
382
+ const fx=await fixture({captureFrames:[f1,f2,f3],grounderProvider});
383
+ const q={kind:'name_exact',value:'Save',max_results:8,ordinal:0};
384
+ const target=await fx.runtime.ground({frameId:fx.expected.frame_id,query:q});
385
+ await assert.rejects(fx.runtime.action({intentId:H('R199-stale'),kind:'click_primary',
386
+ expectedFrameId:target.frame.frame_id,targetId:target.target.target_id}),/UIA.*(identity|stale|changed)/i);
387
+ assert.equal(lookups,2,'re-ground must happen exactly once before effect');
388
+ assert.equal(fx.calls.length,0,'stale UIA target must never dispatch input');
389
+ });
390
+ test('R199 matching RuntimeId permits guarded input but never claims application success',async()=>{
391
+ const f1={frame:F('2026-09-19T02:00:00.700Z'),backend:'fake',byte_length:4};
392
+ const f2={frame:F('2026-09-19T02:00:00.750Z'),backend:'fake',byte_length:4};
393
+ const f3={frame:F('2026-09-19T02:00:01.100Z',H('post')),backend:'fake',byte_length:4};
394
+ let lookups=0;
395
+ const grounderProvider=async()=>({status:'ok',query_sha256:H('R199-Save'),query_kind:'name_exact',ordinal:0,
396
+ visited:2,truncated:false,provider_receipt_sha256:H('uia-provider'),
397
+ matches:[{rect:{left:100,top:120,width:80,height:30},control_type:50000,
398
+ enabled:true,offscreen:false,runtime_id:[17,222,0]}]});
399
+ const fx=await fixture({captureFrames:[f1,f2,f3],grounderProvider});
400
+ const target=await fx.runtime.ground({frameId:fx.expected.frame_id,query:{kind:'name_exact',value:'Save',ordinal:0}});
401
+ const result=await fx.runtime.action({intentId:H('R199-valid'),kind:'click_primary',
402
+ expectedFrameId:target.frame.frame_id,targetId:target.target.target_id});
403
+ assert.equal(fx.calls.length,1);
404
+ assert.equal(result.injected,true);
405
+ assert.equal(result.task_success,null);
406
+ assert.equal(result.side_effect_state,'confirmed_injected');
407
+ });
408
+
409
+ test('R199 UIA target without RuntimeId cannot be used to inject coordinates',async()=>{
410
+ const f1={frame:F('2026-09-19T02:00:00.700Z'),backend:'fake',byte_length:4};
411
+ const f2={frame:F('2026-09-19T02:00:00.750Z'),backend:'fake',byte_length:4};
412
+ const grounderProvider=async()=>({status:'ok',query_sha256:H('legacy'),query_kind:'name_exact',ordinal:0,
413
+ visited:2,truncated:false,provider_receipt_sha256:H('provider'),
414
+ matches:[{rect:{left:100,top:120,width:80,height:30},control_type:50000,enabled:true,offscreen:false}]});
415
+ const fx=await fixture({captureFrames:[f1,f2],grounderProvider});
416
+ const result=await fx.runtime.ground({frameId:fx.expected.frame_id,query:{kind:'name_exact',value:'Save',ordinal:0}});
417
+ await assert.rejects(fx.runtime.action({intentId:H('legacy-noid'),kind:'click_primary',
418
+ expectedFrameId:result.frame.frame_id,targetId:result.target.target_id}),/UIA.*RuntimeId/i);
419
+ assert.equal(fx.calls.length,0);
420
+ });
421
+ test('R199 recreated UIA element at identical coordinates gets a different target id',async()=>{
422
+ const f1={frame:F('2026-09-19T02:00:00.700Z'),backend:'fake',byte_length:4};
423
+ let count=0;
424
+ const grounderProvider=async()=>({status:'ok',query_sha256:H('stable-query'),query_kind:'name_exact',
425
+ ordinal:0,visited:2,truncated:false,provider_receipt_sha256:H('provider'),
426
+ matches:[{rect:{left:100,top:120,width:80,height:30},control_type:50000,
427
+ enabled:true,offscreen:false,runtime_id:[7,++count,9]}]});
428
+ const fx=await fixture({captureFrames:[f1,f1],grounderProvider});
429
+ const query={kind:'name_exact',value:'Save',ordinal:0};
430
+ const first=await fx.runtime.ground({frameId:fx.expected.frame_id,query});
431
+ const next=await fx.runtime.ground({frameId:fx.expected.frame_id,query});
432
+ assert.notEqual(first.target.target_id,next.target.target_id);
433
+ assert.notEqual(first.grounding.element_token_sha256,next.grounding.element_token_sha256);
434
+ assert.equal(fx.calls.length,0);
435
+ });
@@ -40,3 +40,18 @@ test('T5 UIA response rejects foreground substitution and oversized query',()=>{
40
40
  assert.throws(()=>parseDesktopUiaResponse(raw,{expectedWindow:win,expectedBounds:bounds,query:{kind:'root',value:'',max_results:1,ordinal:0}}),/hwnd mismatch/);
41
41
  assert.throws(()=>serializeDesktopUiaRequest({expectedWindow:win,query:{kind:'name_exact',value:'x'.repeat(513)}}),/bytes invalid/);
42
42
  });
43
+
44
+ test('R199 UIA parser keeps bounded native RuntimeId and refuses malformed identities',()=>{
45
+ const query={kind:'name_exact',value:'Save',max_results:2,ordinal:0};
46
+ const make=id=>Buffer.from(JSON.stringify({
47
+ schema:'deadbyte.desktop-uia-ground.v1',foreground_hwnd:win.hwnd,foreground_pid:win.pid,
48
+ query_kind:query.kind,visited:2,truncated:false,matches:[
49
+ {left:10,top:20,width:100,height:30,control_type:50000,enabled:true,offscreen:false,runtime_id:id}
50
+ ]}));
51
+ const parse=id=>parseDesktopUiaResponse(make(id),{expectedWindow:win,expectedBounds:bounds,query});
52
+ assert.deepEqual(parse([17,-2147483648,2147483647]).matches[0].runtime_id,[17,-2147483648,2147483647]);
53
+ assert.throws(()=>parse([]),/RuntimeId missing/);
54
+ assert.throws(()=>parse(Array(65).fill(1)),/RuntimeId shape/);
55
+ assert.throws(()=>parse([1,2.3]),/component invalid/);
56
+ assert.throws(()=>parse([1,2147483648]),/component invalid/);
57
+ });
@@ -0,0 +1,21 @@
1
+ import {rename,symlink,realpath,open,writeFile} from 'node:fs/promises';
2
+ import {createHash} from 'node:crypto';
3
+ import path from 'node:path';
4
+ import {readRangeFromHandle} from '../../src/machine-fs-handle-read-r196.mjs';
5
+ const [file,off,len,doHash]=process.argv.slice(2);
6
+ const dir=path.dirname(file),project=path.dirname(dir),tmp=path.dirname(project);
7
+ const external=path.join(tmp,'external'),backup=path.join(project,'swapped-original');
8
+ try{
9
+ await writeFile(path.join(tmp,'r197-worker-entered.marker'),'entered\n',{flag:'wx'});
10
+ await rename(dir,backup);
11
+ await symlink(external,dir,'junction');
12
+ const resolved=await realpath(file);
13
+ if(!resolved.toLowerCase().startsWith((external+path.sep).toLowerCase()))throw Error('R197_SWAP_NOT_OUTSIDE');
14
+ const handle=await open(file,'r');
15
+ let result;
16
+ try{result=await readRangeFromHandle(handle,{offset:Number(off),length:Number(len),hashFile:doHash==='1'});}
17
+ finally{await handle.close();}
18
+ const hash=createHash('sha256').update(Buffer.from(result.data_base64,'base64')).digest('hex');
19
+ await writeFile(path.join(tmp,'r197-escaped-open.marker'),hash+'\n',{flag:'wx'});
20
+ process.stdout.write(JSON.stringify(result));
21
+ }catch(e){process.stderr.write('R197_RACE_WORKER '+String(e?.stack??e));process.exitCode=1;}
@@ -0,0 +1,6 @@
1
+ import fs from 'node:fs/promises';
2
+ import {openRemoteDestinationJournalR202} from '../../src/remote-destination-journal-r202.mjs';
3
+ const fixture=JSON.parse(await fs.readFile(process.argv[2],'utf8'));
4
+ const journal=await openRemoteDestinationJournalR202({directory:fixture.directory,device:fixture.device});
5
+ const result=await journal.commitSignedTerminal({request:fixture.request,envelope:fixture.envelope});
6
+ process.stdout.write(JSON.stringify({status:result.status})+'\n');
@@ -70,13 +70,13 @@ test('R167 process policy binds coherently to the explicit development root', as
70
70
  // The distributed policy is pinned to its explicit development provenance,
71
71
  // not to the physical extraction path of the exact immutable npm tarball.
72
72
  const release = JSON.parse(await readFile(path.join(repoRoot, 'RELEASE.json'), 'utf8'));
73
- const approvedRoot = release.r194?.development_policy_root;
74
- assert.equal(typeof approvedRoot, 'string', 'R191 development policy root must be explicit in release metadata');
75
- assert.ok(path.isAbsolute(approvedRoot), 'R191 development policy root must be absolute');
73
+ const approvedRoot = release.r206?.development_policy_root;
74
+ assert.equal(typeof approvedRoot, 'string', 'R206 development policy root must be explicit in release metadata');
75
+ assert.ok(path.isAbsolute(approvedRoot), 'R206 development policy root must be absolute');
76
76
  const expectedRoot = path.resolve(approvedRoot);
77
77
  if (process.env.DEADBYTE_EXPECTED_DEVELOPMENT_ROOT) {
78
78
  assert.equal(path.resolve(process.env.DEADBYTE_EXPECTED_DEVELOPMENT_ROOT), expectedRoot,
79
- 'caller-supplied development root cannot override R191 release provenance');
79
+ 'caller-supplied development root cannot override R206 release provenance');
80
80
  }
81
81
  const policyPath = path.join(repoRoot, 'controller', 'deadbyte-process-policy.json');
82
82
  const policy = JSON.parse(await readFile(policyPath, 'utf8'));
@@ -14,14 +14,14 @@ test('current successor retains the R130 security baseline with truthful R190 id
14
14
  read('SBOM.cdx.json'),readReleaseLock(root),read('TEST-MATRIX.json')]);
15
15
  assert.equal(pkg.name,'deadbyte-mcp');
16
16
  for(const actual of [pkg.version,release.version,provenance.version,matrix.version,bom.metadata.component.version,lock.version,lock.packages[''].version,DEADBYTE_VERSION])
17
- assert.equal(actual,'0.15.74');
18
- assert.equal(release.train,'R194');
19
- assert.equal(matrix.train,'R194');
20
- assert.equal(release.source_predecessor.version,'0.15.73');
21
- assert.equal(release.source_predecessor.train,'R193');
22
- assert.match(release.source_predecessor.source_path,/r193-final-closure/i);
23
- assert.equal(release.source_predecessor.manifest_status,'FROZEN_R193_CLOSURE_VERIFIED');
24
- assert.equal(release.runtime_predecessor.version,'0.15.72');
17
+ assert.equal(actual,'0.15.75');
18
+ assert.equal(release.train,'R206');
19
+ assert.equal(matrix.train,'R206');
20
+ assert.equal(release.source_predecessor.version,'0.15.75');
21
+ assert.equal(release.source_predecessor.train,'R205');
22
+ assert.match(release.source_predecessor.source_path,/r205-evidence-selection-dev/i);
23
+ assert.equal(release.source_predecessor.manifest_status,'R205_MANIFEST_VERIFIED');
24
+ assert.equal(release.runtime_predecessor.version,'0.15.74');
25
25
  assert.equal(provenance.r160.source_predecessor_manifest_status,'STALE_REJECTED');
26
26
  assert.equal(pkg.dependencies['@modelcontextprotocol/client'],'2.3.1');
27
27
  assert.equal(pkg.dependencies['@modelcontextprotocol/server'],'2.3.1');
@@ -16,17 +16,17 @@ test('R190 package identity preserves R132 evidence and published R179 source pr
16
16
  for(const value of [pkg.version,lock.version,lock.packages[''].version,release.version,prov.version,bom.metadata.component.version,matrix.version,DEADBYTE_VERSION]){
17
17
  assert.equal(value,pkg.version);
18
18
  }
19
- assert.equal(release.train,'R194');
20
- assert.equal(matrix.train,'R194');
21
- assert.equal(release.source_predecessor.version,'0.15.73');
22
- assert.equal(release.source_predecessor.train,'R193');
23
- assert.match(release.source_predecessor.source_path,/r193-final-closure/i);
19
+ assert.equal(release.train,'R206');
20
+ assert.equal(matrix.train,'R206');
21
+ assert.equal(release.source_predecessor.version,'0.15.75');
22
+ assert.equal(release.source_predecessor.train,'R205');
23
+ assert.match(release.source_predecessor.source_path,/r205-evidence-selection-dev/i);
24
24
  assert.equal(prov.r160.source_predecessor_manifest_status,'STALE_REJECTED');
25
25
  assert.equal(release.r165.published_source_manifest_sha256,'4adf7d94682fbb71c4a91eb3147ecc48076bbc5d79cb67fcb875cde6a1bb4805');
26
26
  assert.equal(release.r165.published_source_tarball_sha256,'812e97609b7c51353ed25f2202129737e43bb4fbe0778c3adec43ec065352641');
27
- assert.equal(release.source_predecessor.tarball_sha256,'13c3dd23a535609aa53173b328c7d9299d5dcada684f3253a88af6a4b300c534');
27
+ assert.equal(release.source_predecessor.tarball_sha256,null);
28
28
  assert.notEqual(release.r179.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
29
- assert.equal(release.runtime_predecessor.version,'0.15.72');
29
+ assert.equal(release.runtime_predecessor.version,'0.15.74');
30
30
  assert.equal(prov.runtime_predecessor.release_id,release.runtime_predecessor.release_id);
31
31
  assert.equal(prov.runtime_predecessor.manifest_sha256,release.runtime_predecessor.manifest_sha256);
32
32
  assert.equal(prov.runtime_predecessor.generation_manifest_sha256,release.runtime_predecessor.generation_manifest_sha256);
@@ -26,7 +26,7 @@ test('R153 historical verifier refuses current successor package identity',async
26
26
  const state={pkg:JSON.parse(await readFile(path.join(root,'package.json'),'utf8')),
27
27
  release:JSON.parse(await readFile(path.join(root,'RELEASE.json'),'utf8')),
28
28
  bridge:JSON.parse(await readFile(path.join(root,'bridge/package.json'),'utf8'))};
29
- assert.equal(state.pkg.version,'0.15.74');
29
+ assert.equal(state.pkg.version,'0.15.75');
30
30
  assert.throws(()=>verifyR153Lineage(state),/package version/);
31
31
  await assert.rejects(verifyR153IdentityTree(root),/package version/);
32
32
  });
@@ -8,9 +8,9 @@ const read=async rel=>JSON.parse(await readFile(path.join(root,rel),'utf8'));
8
8
 
9
9
  test('R160 historical contract remains distinct from the current package identity',async()=>{
10
10
  const [release,provenance]=await Promise.all([read('RELEASE.json'),read('PROVENANCE.json')]);
11
- assert.equal(release.runtime_predecessor.version,'0.15.72');
12
- assert.equal(release.runtime_predecessor.release_id,'v0.15.72-0a5d9436e06e2d9e');
13
- assert.equal(release.runtime_predecessor.manifest_sha256,'0a5d9436e06e2d9e7cf9179417465955d8ca5ba88655b13dd019190243c1cc90');
11
+ assert.equal(release.runtime_predecessor.version,'0.15.74');
12
+ assert.equal(release.runtime_predecessor.release_id,'v0.15.74-e84bf4eed16e9443');
13
+ assert.equal(release.runtime_predecessor.manifest_sha256,'e84bf4eed16e9443fbd0bf9f0f562e26b01db778647aefcc8b12fd7f48636b47');
14
14
  assert.equal(release.r160.runtime_predecessor_version,'0.15.61');
15
15
  assert.equal(release.r160.source_predecessor_train,'R159');
16
16
  assert.equal(release.r160.public_tool_delta,0);
@@ -17,7 +17,7 @@ const hashMarker=c=>c.repeat(64);
17
17
  async function fixture(t,kind){
18
18
  assert.equal(typeof envRoot,'string'); assert.ok(path.isAbsolute(envRoot));
19
19
  assert.match(sha(await readFile(path.join(envRoot,'MANIFEST.SHA256'))),/^[0-9a-f]{64}$/);
20
- assert.equal(JSON.parse(await readFile(path.join(envRoot,'package.json'),'utf8')).version,'0.15.74');
20
+ assert.equal(JSON.parse(await readFile(path.join(envRoot,'package.json'),'utf8')).version,'0.15.75');
21
21
  const dir=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r164-skew-e2e-'));
22
22
  t.after(async()=>{await rm(dir,{recursive:true,force:true,maxRetries:10,retryDelay:150});});
23
23
  const state=path.join(dir,'state'),bin=path.join(state,'bin');
@@ -8,7 +8,7 @@ import {DEADBYTE_VERSION} from '../src/version.mjs';
8
8
  const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
9
9
  const read=async rel=>JSON.parse(await readFile(path.join(root,rel),'utf8'));
10
10
  const readOptional=async rel=>{try{return await read(rel);}catch(error){if(error?.code==='ENOENT')return null;throw error;}};
11
- const VERSION='0.15.74';
11
+ const VERSION='0.15.75';
12
12
  const R166_MANIFEST='ad3c091fbbe2bac6d234548724008b67305fd483ad6542f92d5aeb1aa84f5849';
13
13
  const R166_TARBALL='3d22412c3cebabd66bfa92ca4dbaaf3ef49acba7f92436a16485d7e4cb18c653';
14
14
 
@@ -20,20 +20,20 @@ test('current package identity retains the immutable R167/R173 activation lineag
20
20
  provenance.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION];
21
21
  if(lock)versions.push(lock.version,lock.packages[''].version);
22
22
  for(const version of versions)assert.equal(version,VERSION);
23
- assert.equal(release.train,'R194');
24
- assert.equal(matrix.train,'R194');
25
- assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r194:0.15.74');
23
+ assert.equal(release.train,'R206');
24
+ assert.equal(matrix.train,'R206');
25
+ assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r206:0.15.75');
26
26
  assert.deepEqual(release.runtime_predecessor,{
27
- version:'0.15.72',release_id:'v0.15.72-0a5d9436e06e2d9e',
28
- manifest_sha256:'0a5d9436e06e2d9e7cf9179417465955d8ca5ba88655b13dd019190243c1cc90',
29
- generation_manifest_sha256:'aec7b998306a3bbbcc59088648e7bc46ca7e203d749d4550b5b5f372032f92b0'
27
+ version:'0.15.74',release_id:'v0.15.74-e84bf4eed16e9443',
28
+ manifest_sha256:'e84bf4eed16e9443fbd0bf9f0f562e26b01db778647aefcc8b12fd7f48636b47',
29
+ generation_manifest_sha256:'598f896be9ce65e6b0c618e8c8f6eaa2a9d91617a76a146bf3deb385a56d19e7'
30
30
  });
31
- assert.equal(release.source_predecessor.version,'0.15.73');
32
- assert.equal(release.source_predecessor.train,'R193');
33
- assert.equal(release.source_predecessor.tarball_sha256,'13c3dd23a535609aa53173b328c7d9299d5dcada684f3253a88af6a4b300c534');
31
+ assert.equal(release.source_predecessor.version,'0.15.75');
32
+ assert.equal(release.source_predecessor.train,'R205');
33
+ assert.equal(release.source_predecessor.tarball_sha256,null);
34
34
  assert.equal(release.r173.source_predecessor_version,'0.15.67');
35
35
  assert.equal(release.r167.source_predecessor_manifest_sha256,R166_MANIFEST);
36
- assert.equal(provenance.source_predecessor_manifest_file_sha256,'e0b3f8b333f1c1260a97b178d1a8beff5742355296a9fe7daba378612604a3bd');
36
+ assert.equal(provenance.source_predecessor_manifest_file_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
37
37
  assert.equal(provenance.r173.source_predecessor_manifest_sha256,'4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8');
38
38
  assert.equal(release.r172.source_predecessor_manifest_sha256,'962e227dace247d59aa860211388fbde461c5f9c8a7e8a878e34a14a27d355f8');
39
39
  assert.equal(release.r172.source_predecessor_tarball_sha256,'31b194a4fbff7dbdb9f4f275b4ea49c5115f7b0bb2241c0c72d72ef690311a5d');
@@ -13,10 +13,10 @@ const predecessorTarball='fc3ae5b1505e316bc9dfedf8d063cb00641754c8f5f1306a31f8cc
13
13
 
14
14
  test('R172 preserves the immutable R168 publication lineage separately from current identity',async()=>{
15
15
  const release=await read('RELEASE.json');
16
- assert.equal(release.runtime_predecessor.version,'0.15.72');
17
- assert.equal(release.parent.version,'0.15.72');
18
- assert.equal(release.runtime_predecessor.release_id,'v0.15.72-0a5d9436e06e2d9e');
19
- assert.equal(release.parent.release_id,'v0.15.72-0a5d9436e06e2d9e');
16
+ assert.equal(release.runtime_predecessor.version,'0.15.74');
17
+ assert.equal(release.parent.version,'0.15.74');
18
+ assert.equal(release.runtime_predecessor.release_id,'v0.15.74-e84bf4eed16e9443');
19
+ assert.equal(release.parent.release_id,'v0.15.74-e84bf4eed16e9443');
20
20
  assert.notEqual(release.runtime_predecessor.release_id,parent);
21
21
  assert.notEqual(release.parent.release_id,parent);
22
22
  assert.equal(release.r168.scope,'REMOTE_VERSION_SKEW_FAIL_CLOSED_AND_READONLY_RECONCILIATION');
@@ -16,12 +16,12 @@ test('R190 binds the published source predecessor separately from the active run
16
16
  const versions=[pkg.version,bridge.version,release.version,provenance.version,matrix.version,
17
17
  bom.metadata.component.version,DEADBYTE_VERSION];
18
18
  if(lock)versions.push(lock.version,lock.packages[''].version);
19
- for(const value of versions)assert.equal(value,'0.15.74');
20
- assert.equal(release.train,'R194'); assert.equal(matrix.train,'R194');
21
- assert.equal(release.source_predecessor.version,'0.15.73');
22
- assert.equal(release.source_predecessor.manifest_sha256,'e0b3f8b333f1c1260a97b178d1a8beff5742355296a9fe7daba378612604a3bd');
23
- assert.equal(release.source_predecessor.tarball_sha256,'13c3dd23a535609aa53173b328c7d9299d5dcada684f3253a88af6a4b300c534');
24
- assert.equal(release.runtime_predecessor.release_id,'v0.15.72-0a5d9436e06e2d9e');
19
+ for(const value of versions)assert.equal(value,'0.15.75');
20
+ assert.equal(release.train,'R206'); assert.equal(matrix.train,'R206');
21
+ assert.equal(release.source_predecessor.version,'0.15.75');
22
+ assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
23
+ assert.equal(release.source_predecessor.tarball_sha256,null);
24
+ assert.equal(release.runtime_predecessor.release_id,'v0.15.74-e84bf4eed16e9443');
25
25
  assert.equal(release.r173.public_tool_delta,0); assert.equal(release.r173.authority_scope_delta,0);
26
26
  });
27
27
 
@@ -13,21 +13,21 @@ test('R190 package identity binds the exact published R179 source and live runti
13
13
  json('package.json'),readReleaseLock(root),json('bridge/package.json'),json('RELEASE.json'),
14
14
  json('PROVENANCE.json'),json('TEST-MATRIX.json'),json('SBOM.cdx.json')
15
15
  ]);
16
- assert.equal(pkg.version,'0.15.74');
17
- assert.equal(lock.version,'0.15.74');
18
- assert.equal(lock.packages[''].version,'0.15.74');
19
- assert.equal(bridge.version,'0.15.74');
20
- assert.equal(release.version,'0.15.74');
21
- assert.equal(release.train,'R194');
22
- assert.equal(matrix.version,'0.15.74');
23
- assert.equal(matrix.train,'R194');
24
- assert.equal(sbom.metadata.component.version,'0.15.74');
25
- assert.equal(release.source_predecessor.version,'0.15.73');
26
- assert.equal(release.source_predecessor.train,'R193');
27
- assert.equal(release.source_predecessor.manifest_sha256,'e0b3f8b333f1c1260a97b178d1a8beff5742355296a9fe7daba378612604a3bd');
28
- assert.equal(release.source_predecessor.tarball_sha256,'13c3dd23a535609aa53173b328c7d9299d5dcada684f3253a88af6a4b300c534');
29
- assert.equal(release.runtime_predecessor.version,'0.15.72');
30
- assert.equal(provenance.version,'0.15.74');
31
- assert.equal(provenance.parent_tarball_sha256,'15ab5d9808cbca342aee3f64c6d1123e8fbb72964674eab460e355c8675bf84d');
16
+ assert.equal(pkg.version,'0.15.75');
17
+ assert.equal(lock.version,'0.15.75');
18
+ assert.equal(lock.packages[''].version,'0.15.75');
19
+ assert.equal(bridge.version,'0.15.75');
20
+ assert.equal(release.version,'0.15.75');
21
+ assert.equal(release.train,'R206');
22
+ assert.equal(matrix.version,'0.15.75');
23
+ assert.equal(matrix.train,'R206');
24
+ assert.equal(sbom.metadata.component.version,'0.15.75');
25
+ assert.equal(release.source_predecessor.version,'0.15.75');
26
+ assert.equal(release.source_predecessor.train,'R205');
27
+ assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
28
+ assert.equal(release.source_predecessor.tarball_sha256,null);
29
+ assert.equal(release.runtime_predecessor.version,'0.15.74');
30
+ assert.equal(provenance.version,'0.15.75');
31
+ assert.equal(provenance.parent_tarball_sha256,'5da436a3f8068107e74caf6da58ff1e211d4a62f94266853136b601762f36f0c');
32
32
  assert.equal(provenance.source_predecessor_manifest_file_sha256,release.source_predecessor.manifest_sha256);
33
33
  });
@@ -7,27 +7,27 @@ import {DEADBYTE_VERSION} from '../src/version.mjs';
7
7
  import {readReleaseLock} from './helpers/release-lock.mjs';
8
8
  const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
9
9
  const read=async file=>JSON.parse(await readFile(path.join(root,file),'utf8'));
10
- const parent='v0.15.72-0a5d9436e06e2d9e';
11
- const manifest='0a5d9436e06e2d9e7cf9179417465955d8ca5ba88655b13dd019190243c1cc90';
12
- const generation='aec7b998306a3bbbcc59088648e7bc46ca7e203d749d4550b5b5f372032f92b0';
10
+ const parent='v0.15.74-e84bf4eed16e9443';
11
+ const manifest='e84bf4eed16e9443fbd0bf9f0f562e26b01db778647aefcc8b12fd7f48636b47';
12
+ const generation='598f896be9ce65e6b0c618e8c8f6eaa2a9d91617a76a146bf3deb385a56d19e7';
13
13
  const tarball='1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf';
14
14
  test('R190 version, lock snapshot, bridge, matrix, SBOM and provenance identify exact 0.15.70 successor',async()=>{
15
15
  const [pkg,lock,bridge,release,provenance,matrix,sbom]=await Promise.all([
16
16
  read('package.json'),readReleaseLock(root),read('bridge/package.json'),read('RELEASE.json'),
17
17
  read('PROVENANCE.json'),read('TEST-MATRIX.json'),read('SBOM.cdx.json')]);
18
18
  for(const version of [pkg.version,lock.version,lock.packages[''].version,bridge.version,release.version,provenance.version,
19
- matrix.version,sbom.metadata.component.version,DEADBYTE_VERSION])assert.equal(version,'0.15.74');
20
- assert.equal(release.train,'R194');assert.equal(matrix.train,'R194');
21
- assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r194:0.15.74');
19
+ matrix.version,sbom.metadata.component.version,DEADBYTE_VERSION])assert.equal(version,'0.15.75');
20
+ assert.equal(release.train,'R206');assert.equal(matrix.train,'R206');
21
+ assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r206:0.15.75');
22
22
  assert.equal(release.parent.release_id,parent);assert.equal(release.parent.manifest_sha256,manifest);
23
23
  assert.equal(release.parent.generation_manifest_sha256,generation);
24
- assert.equal(release.source_predecessor.version,'0.15.73');
25
- assert.equal(release.source_predecessor.manifest_sha256,'e0b3f8b333f1c1260a97b178d1a8beff5742355296a9fe7daba378612604a3bd');
26
- assert.equal(release.source_predecessor.tarball_sha256,'13c3dd23a535609aa53173b328c7d9299d5dcada684f3253a88af6a4b300c534');
24
+ assert.equal(release.source_predecessor.version,'0.15.75');
25
+ assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
26
+ assert.equal(release.source_predecessor.tarball_sha256,null);
27
27
  assert.equal(release.runtime_predecessor.release_id,parent);
28
28
  assert.equal(provenance.runtime_predecessor.release_id,parent);
29
- assert.equal(provenance.parent_tarball_sha256,'15ab5d9808cbca342aee3f64c6d1123e8fbb72964674eab460e355c8675bf84d');
30
- assert.equal(provenance.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
29
+ assert.equal(provenance.parent_tarball_sha256,'5da436a3f8068107e74caf6da58ff1e211d4a62f94266853136b601762f36f0c');
30
+ assert.equal(provenance.source_predecessor_tarball_sha256,null);
31
31
  });
32
32
  test('R179 does not misrepresent owner Autonomous enrollment, protected regression or publication as finished',async()=>{
33
33
  const [release,prov,matrix]=await Promise.all(['RELEASE.json','PROVENANCE.json','TEST-MATRIX.json'].map(read));
@@ -48,7 +48,7 @@ test('R190 retains historical R179 and R173 source evidence without promoting it
48
48
  assert.equal(release.r173.source_predecessor_version,'0.15.67');
49
49
  assert.equal(release.r173.source_predecessor_manifest_sha256,'4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8');
50
50
  assert.equal(prov.r173.source_predecessor_version,'0.15.67');
51
- assert.equal(release.source_predecessor.version,'0.15.73');
51
+ assert.equal(release.source_predecessor.version,'0.15.75');
52
52
  assert.notEqual(release.source_predecessor.tarball_sha256,release.r173.source_predecessor_tarball_sha256);
53
53
  });
54
54
  test('R184 ships a semantic lock snapshot matching installed package identity and dependencies',async()=>{
@@ -8,17 +8,17 @@ test('R190 candidate identity separates published source 0.15.69 from active run
8
8
  json('package.json'),json('bridge/package.json'),json('RELEASE.json'),json('PROVENANCE.json'),
9
9
  json('TEST-MATRIX.json'),json('SBOM.cdx.json'),readFile(new URL('../src/version.mjs',import.meta.url),'utf8')]);
10
10
  for(const value of [pkg.version,bridge.version,release.version,provenance.version,matrix.version,
11
- sbom.metadata.component.version])assert.equal(value,'0.15.74');
12
- assert.match(versionSource,/DEADBYTE_VERSION = '0\.15\.74'/);
13
- assert.equal(release.train,'R194');assert.equal(matrix.train,'R194');
14
- assert.equal(release.source_predecessor.version,'0.15.73');
15
- assert.equal(release.source_predecessor.tarball_sha256,'13c3dd23a535609aa53173b328c7d9299d5dcada684f3253a88af6a4b300c534');
16
- assert.equal(release.source_predecessor.manifest_sha256,'e0b3f8b333f1c1260a97b178d1a8beff5742355296a9fe7daba378612604a3bd');
17
- assert.equal(release.runtime_predecessor.version,'0.15.72');
18
- assert.equal(release.runtime_predecessor.release_id,'v0.15.72-0a5d9436e06e2d9e');
19
- assert.equal(provenance.source_predecessor_version,'0.15.73');
11
+ sbom.metadata.component.version])assert.equal(value,'0.15.75');
12
+ assert.match(versionSource,/DEADBYTE_VERSION = '0\.15\.75'/);
13
+ assert.equal(release.train,'R206');assert.equal(matrix.train,'R206');
14
+ assert.equal(release.source_predecessor.version,'0.15.75');
15
+ assert.equal(release.source_predecessor.tarball_sha256,null);
16
+ assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
17
+ assert.equal(release.runtime_predecessor.version,'0.15.74');
18
+ assert.equal(release.runtime_predecessor.release_id,'v0.15.74-e84bf4eed16e9443');
19
+ assert.equal(provenance.source_predecessor_version,'0.15.75');
20
20
  assert.equal(provenance.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
21
- assert.match(sbom.serialNumber,/r194:0\.15\.74$/);
21
+ assert.match(sbom.serialNumber,/r206:0\.15\.75$/);
22
22
  });
23
23
 
24
24
  test('R190 release metadata records verified recovery without claiming publication or activation',async()=>{
@@ -6,23 +6,23 @@ import path from 'node:path';
6
6
  import {DEADBYTE_VERSION} from '../src/version.mjs';
7
7
  const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
8
8
  const json=async f=>JSON.parse(await readFile(path.join(root,f),'utf8'));
9
- const predecessor='v0.15.72-0a5d9436e06e2d9e';
10
- const publishedManifest='0a5d9436e06e2d9e7cf9179417465955d8ca5ba88655b13dd019190243c1cc90';
11
- const publishedTarball='15ab5d9808cbca342aee3f64c6d1123e8fbb72964674eab460e355c8675bf84d';
9
+ const predecessor='v0.15.74-e84bf4eed16e9443';
10
+ const publishedManifest='e84bf4eed16e9443fbd0bf9f0f562e26b01db778647aefcc8b12fd7f48636b47';
11
+ const publishedTarball='5da436a3f8068107e74caf6da58ff1e211d4a62f94266853136b601762f36f0c';
12
12
  test('R191 exact version identity includes bundled bridge, lock snapshot, SBOM, provenance and matrix',async()=>{
13
13
  const [pkg,bridge,lock,release,provenance,matrix,bom]=await Promise.all(['package.json','bridge/package.json','docs/R184-package-lock.json','RELEASE.json','PROVENANCE.json','TEST-MATRIX.json','SBOM.cdx.json'].map(json));
14
- for(const ver of [pkg.version,bridge.version,lock.version,lock.packages[''].version,release.version,provenance.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION])assert.equal(ver,'0.15.74');
15
- for(const train of [release.train,matrix.train])assert.equal(train,'R194');
16
- assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r194:0.15.74');
14
+ for(const ver of [pkg.version,bridge.version,lock.version,lock.packages[''].version,release.version,provenance.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION])assert.equal(ver,'0.15.75');
15
+ for(const train of [release.train,matrix.train])assert.equal(train,'R206');
16
+ assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r206:0.15.75');
17
17
  assert.equal(release.parent.release_id,predecessor);
18
18
  assert.equal(provenance.parent_release_id,predecessor);
19
- assert.equal(release.source_predecessor.version,'0.15.73');
20
- assert.equal(release.source_predecessor.manifest_sha256,'e0b3f8b333f1c1260a97b178d1a8beff5742355296a9fe7daba378612604a3bd');
21
- assert.equal(release.source_predecessor.tarball_sha256,'13c3dd23a535609aa53173b328c7d9299d5dcada684f3253a88af6a4b300c534');
22
- assert.equal(provenance.source_predecessor_version,'0.15.73');
19
+ assert.equal(release.source_predecessor.version,'0.15.75');
20
+ assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
21
+ assert.equal(release.source_predecessor.tarball_sha256,null);
22
+ assert.equal(provenance.source_predecessor_version,'0.15.75');
23
23
  assert.equal(provenance.parent_tarball_sha256,publishedTarball);
24
- assert.equal(provenance.source_predecessor_tarball_sha256,'13c3dd23a535609aa53173b328c7d9299d5dcada684f3253a88af6a4b300c534');
25
- assert.equal(provenance.source_predecessor_manifest_file_sha256,'e0b3f8b333f1c1260a97b178d1a8beff5742355296a9fe7daba378612604a3bd');
24
+ assert.equal(provenance.source_predecessor_tarball_sha256,null);
25
+ assert.equal(provenance.source_predecessor_manifest_file_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
26
26
  assert.equal(release.r191_activation_repair.npm_publish,'NOT_RUN');
27
27
  assert.equal(release.r191_activation_repair.production_activation,'NOT_RUN');
28
28
  assert.equal(release.r190_foreground_recovery.status,'PREPUBLISH_VERIFIED');
@@ -3,21 +3,21 @@ import {readFile} from 'node:fs/promises';import {createHash} from 'node:crypto'
3
3
  import {DEADBYTE_VERSION} from '../src/version.mjs';
4
4
  const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
5
5
  const read=async name=>JSON.parse(await readFile(path.join(root,name),'utf8'));
6
- const prevHash='0a5d9436e06e2d9e7cf9179417465955d8ca5ba88655b13dd019190243c1cc90';
7
- const prevTar='15ab5d9808cbca342aee3f64c6d1123e8fbb72964674eab460e355c8675bf84d';
6
+ const prevHash='e84bf4eed16e9443fbd0bf9f0f562e26b01db778647aefcc8b12fd7f48636b47';
7
+ const prevTar='5da436a3f8068107e74caf6da58ff1e211d4a62f94266853136b601762f36f0c';
8
8
  test('R193 current identity retains exact published R192 predecessor evidence',async()=>{
9
9
  const [pkg,bridge,lock,release,prov,matrix,bom]=await Promise.all([
10
10
  read('package.json'),read('bridge/package.json'),read('docs/R184-package-lock.json'),
11
11
  read('RELEASE.json'),read('PROVENANCE.json'),read('TEST-MATRIX.json'),read('SBOM.cdx.json')]);
12
12
  for(const actual of [pkg.version,bridge.version,lock.version,lock.packages[''].version,
13
13
  release.version,prov.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION])
14
- assert.equal(actual,'0.15.74');
15
- assert.equal(release.train,'R194');assert.equal(matrix.train,'R194');
16
- assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r194:0.15.74');
17
- assert.equal(release.parent.release_id,'v0.15.72-0a5d9436e06e2d9e');
14
+ assert.equal(actual,'0.15.75');
15
+ assert.equal(release.train,'R206');assert.equal(matrix.train,'R206');
16
+ assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r206:0.15.75');
17
+ assert.equal(release.parent.release_id,'v0.15.74-e84bf4eed16e9443');
18
18
  assert.equal(release.parent.manifest_sha256,prevHash);
19
- assert.equal(release.source_predecessor.tarball_sha256,'13c3dd23a535609aa53173b328c7d9299d5dcada684f3253a88af6a4b300c534');
20
- assert.equal(release.source_predecessor.manifest_sha256,'e0b3f8b333f1c1260a97b178d1a8beff5742355296a9fe7daba378612604a3bd');
19
+ assert.equal(release.source_predecessor.tarball_sha256,null);
20
+ assert.equal(release.source_predecessor.manifest_sha256,'166eebde18d53a9ec46f738383c289733f9cd37918b3572b7515d1ab9b122c92');
21
21
  assert.equal(prov.parent_tarball_sha256,prevTar);
22
22
  assert.equal(prov.parent_manifest_sha256,prevHash);
23
23
  assert.equal(release.r192.production_activation,'NOT_RUN');
@@ -33,7 +33,7 @@ test('R192 foreground reader enforces caller-safe telemetry rather than changing
33
33
  assert.match(log,/sanitizeAuditArgs\(compact\[6\]\)/);
34
34
  const [policy,release]=await Promise.all([
35
35
  read('controller/deadbyte-process-policy.json'),read('RELEASE.json')]);
36
- const approved=release.r194.development_policy_root;
36
+ const approved=release.r206.development_policy_root;
37
37
  assert.equal(typeof approved,'string');
38
38
  assert.ok(path.isAbsolute(approved));
39
39
  assert.equal(path.resolve(policy.roots.core.path),path.resolve(approved));