deadbyte-mcp 0.13.0 → 0.15.0

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 (153) hide show
  1. package/.gitattributes +7 -0
  2. package/AGENTS.md +18 -0
  3. package/CONTEXT.md +3 -3
  4. package/MANIFEST.SHA256 +152 -75
  5. package/R42-PARENT.json +19 -0
  6. package/R43-PARENT.json +20 -0
  7. package/R44-DONORS.json +99 -0
  8. package/R44-PARENT.json +18 -0
  9. package/README.txt +7 -2
  10. package/bin/appcontainer-stage.obj +0 -0
  11. package/bin/bootstrap-advapi32.obj +0 -0
  12. package/bin/bootstrap-exitcode.obj +0 -0
  13. package/bin/bootstrap-kernel32.obj +0 -0
  14. package/bin/child-control-probe.obj +0 -0
  15. package/bin/child-control-stage.obj +0 -0
  16. package/bin/contained-reverse-worker.obj +0 -0
  17. package/bin/contained-transform-worker.obj +0 -0
  18. package/bin/containment-probe.obj +0 -0
  19. package/bin/deadbyte-contain.obj +0 -0
  20. package/bin/deadbyte-exec.obj +0 -0
  21. package/bin/deadbyte-process-host.obj +0 -0
  22. package/bin/deadbyte-tunnel-host.obj +0 -0
  23. package/controller/README.TXT +4 -5
  24. package/controller/deadbyte-controller.ps1 +1 -1
  25. package/controller/deadbyte-desktop-policy.json +5 -5
  26. package/controller/deadbyte-process-policy.json +4 -4
  27. package/docs/ARCHITECTURE.md +8 -1
  28. package/docs/R44-ARCHITECTURE.md +37 -0
  29. package/harness/r42-agent-evals.json +48 -0
  30. package/harness/task-contract.schema.json +33 -0
  31. package/package.json +15 -8
  32. package/proof/CONTAINMENT-BUILD.txt +6 -6
  33. package/scripts/agent-eval-r42.mjs +46 -0
  34. package/scripts/deferred-slot-operation-r42.mjs +126 -0
  35. package/scripts/deferred-slot-operation-r43.mjs +126 -0
  36. package/scripts/deferred-slot-operation-r44.mjs +126 -0
  37. package/scripts/final-closure-r42.mjs +116 -0
  38. package/scripts/final-closure-r43.mjs +115 -0
  39. package/scripts/final-closure-r44.mjs +121 -0
  40. package/scripts/final-closure-verify-r42.mjs +223 -0
  41. package/scripts/final-closure-verify-r43.mjs +213 -0
  42. package/scripts/final-closure-verify-r44.mjs +220 -0
  43. package/scripts/finalize-r43.mjs +217 -0
  44. package/scripts/finalize-r44.mjs +217 -0
  45. package/scripts/full-regression-r43.mjs +20 -0
  46. package/scripts/full-regression-r44.mjs +20 -0
  47. package/scripts/gate-windows-r42.ps1 +54 -0
  48. package/scripts/gate-windows-r43.ps1 +36 -0
  49. package/scripts/gate-windows-r44.ps1 +36 -0
  50. package/scripts/release-parity-r42.mjs +235 -0
  51. package/scripts/release-parity-r43.mjs +218 -0
  52. package/scripts/release-parity-r44.mjs +242 -0
  53. package/scripts/release-parity-tests-r42.ps1 +6 -0
  54. package/scripts/release-parity-tests-r43.ps1 +8 -0
  55. package/scripts/release-parity-tests-r44.ps1 +8 -0
  56. package/scripts/verify-r42-parent.mjs +101 -0
  57. package/scripts/verify-r43-parent.mjs +126 -0
  58. package/scripts/verify-r44-parent.mjs +142 -0
  59. package/scripts/windows-gate-evidence-r42.mjs +64 -0
  60. package/scripts/windows-gate-evidence-r43.mjs +55 -0
  61. package/scripts/windows-gate-evidence-r44.mjs +55 -0
  62. package/src/agent-backend-r44.mjs +254 -0
  63. package/src/agent-eval-r42.mjs +73 -0
  64. package/src/agent-eval-runner-r42.mjs +138 -0
  65. package/src/agent-governance-r42.mjs +142 -0
  66. package/src/autonomous-context-engine.mjs +2 -0
  67. package/src/autonomous-loop-state.mjs +10 -0
  68. package/src/autonomous-mcp-tools.mjs +21 -6
  69. package/src/autonomous-output-contracts.mjs +18 -2
  70. package/src/autonomous-planner-contracts.mjs +3 -0
  71. package/src/autonomous-planner.mjs +46 -6
  72. package/src/autonomous-policy.mjs +50 -5
  73. package/src/autonomous-runtime.mjs +138 -25
  74. package/src/autonomous-supervisor-host.mjs +12 -2
  75. package/src/autonomous-supervisor.mjs +1 -1
  76. package/src/capability-ledger.mjs +2 -1
  77. package/src/codex-app-server-r44.mjs +154 -0
  78. package/src/coding-plane.mjs +66 -19
  79. package/src/durable-job-r44.mjs +145 -0
  80. package/src/evidence-publisher-r42.mjs +76 -0
  81. package/src/external-job-provider-r44.mjs +126 -0
  82. package/src/host-plane.mjs +27 -6
  83. package/src/job-supervisor-host-r44.mjs +112 -0
  84. package/src/machine-fs-smoke-client.mjs +1 -1
  85. package/src/machine-fs.mjs +21 -10
  86. package/src/mcp-host-smoke-client.mjs +1 -1
  87. package/src/mcp-server.mjs +20 -3
  88. package/src/mcp-smoke-client.mjs +1 -1
  89. package/src/native-diff-v2.mjs +3 -3
  90. package/src/native-diff.mjs +3 -2
  91. package/src/observation-smoke-client.mjs +1 -1
  92. package/src/operator-surface.mjs +2 -2
  93. package/src/process-policy.mjs +19 -0
  94. package/src/process-runtime.mjs +5 -2
  95. package/src/process-smoke-client.mjs +2 -2
  96. package/src/provider-circuit.mjs +10 -4
  97. package/src/r44-compact-disarmed-probe.mjs +74 -0
  98. package/src/r44-full-surface-probe.mjs +34 -0
  99. package/src/remote-device-r44.mjs +205 -0
  100. package/src/remote-mcp-autonomous-smoke-client.mjs +4 -4
  101. package/src/remote-mcp-r44-parity-client.mjs +203 -0
  102. package/src/remote-mcp-smoke-client.mjs +7 -4
  103. package/src/runtime-update.mjs +64 -31
  104. package/src/skill-mcp-tools-r44.mjs +37 -0
  105. package/src/skill-plane-r44.mjs +203 -0
  106. package/src/tunnel-stdio-compat-smoke.mjs +1 -1
  107. package/src/version.mjs +1 -1
  108. package/test/agent-backend-r44.test.mjs +115 -0
  109. package/test/agent-eval-r42.test.mjs +39 -0
  110. package/test/agent-eval-runner-r42.test.mjs +61 -0
  111. package/test/agent-governance-r42.test.mjs +77 -0
  112. package/test/agent-runtime.test.mjs +3 -3
  113. package/test/autonomous-loop.test.mjs +97 -11
  114. package/test/autonomous-r34-e2e.test.mjs +2 -1
  115. package/test/autonomous-runtime.test.mjs +2 -2
  116. package/test/capability-ledger-r36.test.mjs +3 -3
  117. package/test/cli-entrypoint.test.mjs +1 -1
  118. package/test/codex-app-server-r44.test.mjs +115 -0
  119. package/test/codex-autonomous-r44.test.mjs +87 -0
  120. package/test/coding-plane.test.mjs +2 -2
  121. package/test/coding-runtime.test.mjs +36 -1
  122. package/test/compact-catalog-r36.test.mjs +3 -3
  123. package/test/compact-max-catalog-r40.test.mjs +4 -2
  124. package/test/compact-max-catalog-r44.test.mjs +97 -0
  125. package/test/core.test.mjs +1 -1
  126. package/test/durable-job-r44.test.mjs +75 -0
  127. package/test/evidence-publisher-r42.test.mjs +53 -0
  128. package/test/external-job-provider-r44.test.mjs +46 -0
  129. package/test/full-max-catalog-r40.test.mjs +5 -3
  130. package/test/full-max-catalog-r44.test.mjs +91 -0
  131. package/test/host-plane.test.mjs +15 -1
  132. package/test/human-clarification-r42.test.mjs +53 -0
  133. package/test/native-diff.test.mjs +28 -0
  134. package/test/output-schema.test.mjs +2 -2
  135. package/test/process-policy.test.mjs +22 -1
  136. package/test/prompts-resources.test.mjs +1 -1
  137. package/test/provider-responses-r42.test.mjs +90 -0
  138. package/test/r33-closeout-regression.test.mjs +14 -16
  139. package/test/r33-finalization.test.mjs +7 -7
  140. package/test/r42-finalization.test.mjs +38 -0
  141. package/test/r43-finalization.test.mjs +31 -0
  142. package/test/r43-finalizer.test.mjs +34 -0
  143. package/test/r43-parent.test.mjs +29 -0
  144. package/test/r44-finalization.test.mjs +58 -0
  145. package/test/r44-finalizer.test.mjs +48 -0
  146. package/test/r44-parent.test.mjs +25 -0
  147. package/test/release-version.test.mjs +53 -19
  148. package/test/remote-device-r44.test.mjs +104 -0
  149. package/test/runtime-self-update.test.mjs +42 -0
  150. package/test/skill-mcp-r44.test.mjs +38 -0
  151. package/test/skill-plane-r44.test.mjs +93 -0
  152. package/test/standing-grants.test.mjs +5 -1
  153. package/test/task-contract-r42.test.mjs +41 -0
@@ -9,7 +9,8 @@ import {
9
9
  PROCESS_POLICY_SCHEMA,
10
10
  assertProcessArmed,
11
11
  loadProcessPolicy,
12
- processSessionStatus
12
+ processSessionStatus,
13
+ recheckProcessAuthority
13
14
  } from '../src/process-policy.mjs';
14
15
 
15
16
  const sha = bytes => createHash('sha256').update(bytes).digest('hex');
@@ -69,6 +70,26 @@ test('process policy loads pinned native host, profile and root while grant is a
69
70
  await assert.rejects(() => assertProcessArmed(policy, 'other', 'core'), /profile 'other' is not included/);
70
71
  });
71
72
 
73
+ test('process authority recheck rejects grant generation or scope drift before side effects', async () => {
74
+ const f = await fixture();
75
+ const policy = await loadProcessPolicy(f.policyPath);
76
+ const grant = {
77
+ schema: PROCESS_GRANT_SCHEMA,
78
+ policy_sha256: policy.policy_sha256,
79
+ instance_nonce: 'a'.repeat(64),
80
+ profile_ids: ['node'],
81
+ root_ids: ['core'],
82
+ granted_at_utc: '2026-09-14T00:00:00Z'
83
+ };
84
+ await writeFile(f.grantFile, JSON.stringify(grant));
85
+ const initial = await assertProcessArmed(policy, 'node', 'core');
86
+ await writeFile(f.grantFile, JSON.stringify({ ...grant, instance_nonce: 'b'.repeat(64) }));
87
+ await assert.rejects(() => recheckProcessAuthority(policy, initial, 'node', 'core'), /process authority changed during operation/);
88
+ await writeFile(f.grantFile, JSON.stringify({ ...grant, profile_ids: ['node', 'node'] }));
89
+ const deduped = await recheckProcessAuthority(policy, initial, 'node', 'core');
90
+ assert.equal(deduped.instance_nonce, initial.instance_nonce);
91
+ });
92
+
72
93
  test('process grant with wrong policy digest is disarmed', async () => {
73
94
  const f = await fixture();
74
95
  const policy = await loadProcessPolicy(f.policyPath);
@@ -30,7 +30,7 @@ test('MCP exposes compact workflow prompts and source-of-truth context resources
30
30
  const surfaceState=JSON.parse(surfaceText);
31
31
  assert.equal(surfaceState.schema,'deadbyte.surface-profile.v1');
32
32
  assert.equal(surfaceState.profile,'full');
33
- assert.equal(surfaceState.compact_tool_limit,42);
33
+ assert.equal(surfaceState.compact_tool_limit,43);
34
34
  const context=await client.readResource({uri:'deadbyte://context'});
35
35
  const contextText=context.contents.map(c=>'text' in c?c.text:'').join('\n');
36
36
  assert.match(contextText,/Machine truth/i); assert.match(contextText,/Authority plane/i); assert.match(contextText,/Loop Supervisor/i);
@@ -0,0 +1,90 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { loadAutonomousPolicy } from '../src/autonomous-policy.mjs';
7
+ import { requestProviderDecision } from '../src/autonomous-planner.mjs';
8
+ import { providerCircuitId } from '../src/provider-circuit.mjs';
9
+
10
+ const H = value => String(value).repeat(64).slice(0,64);
11
+
12
+ async function policyFixture(planner) {
13
+ const root = await mkdtemp(path.join(os.tmpdir(),'deadbyte-r42-provider-'));
14
+ const project = path.join(root,'project');
15
+ await mkdir(project);
16
+ const codingPolicy = {
17
+ policy_sha256:H('c'), roots:{project:{path:project}}, commands:{}
18
+ };
19
+ const policyPath = path.join(root,'autonomous-policy.json');
20
+ await writeFile(policyPath,JSON.stringify({
21
+ schema:'deadbyte.autonomous-policy.v1', enabled:true,
22
+ lease_file:path.join(root,'grant.json'), evidence_dir:path.join(root,'evidence'),
23
+ coding_policy_sha256:codingPolicy.policy_sha256, root_ids:['project'], planner,
24
+ profiles:{}, limits:{max_wall_ms:null}
25
+ }));
26
+ const policy = await loadAutonomousPolicy(policyPath,codingPolicy);
27
+ return {root,policy,cleanup:()=>rm(root,{recursive:true,force:true})};
28
+ }
29
+
30
+ test('R42 policy accepts bounded OpenAI Responses planner configuration',async()=>{
31
+ const f=await policyFixture({
32
+ backend:'openai_responses', endpoint:'https://api.openai.com/v1/responses',
33
+ model:'gpt-5', api_key_env:'OPENAI_API_KEY', max_tokens:4096,
34
+ reasoning_effort:'medium', timeout_ms:45000, max_response_bytes:131072,
35
+ circuit:{failure_threshold:2,open_ms:1000,half_open_probe_limit:1}
36
+ });
37
+ try {
38
+ assert.equal(f.policy.planner.backend,'openai_responses');
39
+ assert.equal(f.policy.planner.reasoning_effort,'medium');
40
+ assert.equal(f.policy.planner.store,false);
41
+ assert.match(providerCircuitId(f.policy.planner),/^openai_responses:[0-9a-f]{64}$/);
42
+ } finally { await f.cleanup(); }
43
+ });
44
+
45
+ test('R42 Responses adapter sends JSON mode and extracts bounded output with provenance',async()=>{
46
+ const old=process.env.DEADBYTE_R42_TEST_KEY;
47
+ process.env.DEADBYTE_R42_TEST_KEY='test-only-token';
48
+ const policy={planner:{
49
+ backend:'openai_responses', endpoint:'https://api.openai.com/v1/responses', model:'gpt-5',
50
+ api_key_env:'DEADBYTE_R42_TEST_KEY', max_tokens:2048, reasoning_effort:'high', store:false,
51
+ timeout_ms:30000, max_response_bytes:65536
52
+ }};
53
+ let captured;
54
+ const fetchImpl=async(url,options)=>{
55
+ captured={url,options,body:JSON.parse(options.body)};
56
+ return new Response(JSON.stringify({
57
+ id:'resp_test_123', status:'completed', model:'gpt-5-2026-01-01',
58
+ output:[{type:'message',role:'assistant',content:[{type:'output_text',text:'{"schema":"deadbyte.autonomous-decision.v2","kind":"pause","reason":"need fixture"}'}]}],
59
+ usage:{input_tokens:111,output_tokens:22,total_tokens:133}
60
+ }),{status:200,headers:{'content-type':'application/json'}});
61
+ };
62
+ try {
63
+ const result=await requestProviderDecision(policy,'bounded prompt',fetchImpl);
64
+ assert.equal(captured.url,policy.planner.endpoint);
65
+ assert.equal(captured.options.headers.authorization,'Bearer test-only-token');
66
+ assert.deepEqual(captured.body.text,{format:{type:'json_object'}});
67
+ assert.equal(captured.body.store,false);
68
+ assert.equal(captured.body.max_output_tokens,2048);
69
+ assert.deepEqual(captured.body.reasoning,{effort:'high'});
70
+ assert.equal(captured.body.input[0].role,'system');
71
+ assert.equal(captured.body.input[1].role,'user');
72
+ assert.equal(result.backend,'openai_responses');
73
+ assert.equal(result.response_id,'resp_test_123');
74
+ assert.deepEqual(result.usage,{input_tokens:111,output_tokens:22,total_tokens:133});
75
+ assert.match(result.raw_text,/deadbyte\.autonomous-decision\.v2/);
76
+ } finally {
77
+ if(old===undefined) delete process.env.DEADBYTE_R42_TEST_KEY; else process.env.DEADBYTE_R42_TEST_KEY=old;
78
+ }
79
+ });
80
+
81
+ test('R42 Responses adapter fails closed on refusal and incomplete response',async()=>{
82
+ const policy={planner:{backend:'openai_responses',endpoint:'https://api.openai.com/v1/responses',model:'gpt-5',
83
+ api_key_env:null,max_tokens:2048,reasoning_effort:null,store:false,timeout_ms:30000,max_response_bytes:65536}};
84
+ const refusal=async()=>new Response(JSON.stringify({id:'resp_refuse',status:'completed',model:'gpt-5',
85
+ output:[{type:'message',content:[{type:'refusal',refusal:'cannot comply'}]}]}),{status:200});
86
+ await assert.rejects(requestProviderDecision(policy,'x',refusal),/refusal|output_text/i);
87
+ const incomplete=async()=>new Response(JSON.stringify({id:'resp_incomplete',status:'incomplete',model:'gpt-5',output:[],
88
+ incomplete_details:{reason:'max_output_tokens'}}),{status:200});
89
+ await assert.rejects(requestProviderDecision(policy,'x',incomplete),/not completed|incomplete/i);
90
+ });
@@ -86,25 +86,23 @@ test('audit restart reconciles an orphan request with an explicit interrupted re
86
86
  }finally{await rm(stateRoot,{recursive:true,force:true});}
87
87
  });
88
88
 
89
- test('Windows current R41 gate emits manifest-bound machine-readable evidence outside the candidate tree', async()=>{
90
- const stateRoot=await temp('deadbyte-r33-windows-evidence-');
89
+ test('Windows current R44 gate emits signed-R43-parent feature evidence outside the candidate tree', async()=>{
90
+ const stateRoot=await temp('deadbyte-r44-windows-evidence-');
91
91
  try{
92
- const gate=await readFile(path.join(root,'scripts','gate-windows-r41.ps1'),'utf8');
93
- assert.match(gate,/windows-gate-evidence-r41\.mjs/,'gate-windows-r41.ps1 must invoke the evidence writer');
94
- const result=await run(process.execPath,[path.join(root,'scripts','windows-gate-evidence-r41.mjs')],{
95
- cwd:root,env:{...process.env,DEADBYTE_STATE_ROOT:stateRoot}
96
- });
97
- assert.equal(result.code,0,result.stderr||result.stdout);
98
- const summary=JSON.parse(result.stdout.trim());
99
- assert.equal(summary.status,'written');
100
- const evidence=JSON.parse(await readFile(summary.path,'utf8'));
92
+ const gate=await readFile(path.join(root,'scripts','gate-windows-r44.ps1'),'utf8');
93
+ assert.match(gate,/windows-gate-evidence-r44\.mjs/);assert.match(gate,/r44-parent-verify/);
101
94
  const manifestSha=sha256(await readFile(path.join(root,'MANIFEST.SHA256')));
102
- assert.equal(evidence.schema,'deadbyte.r41-windows-gate.v1');
103
- assert.equal(evidence.status,'passed');
104
- assert.equal(evidence.exit_code,0);
105
- assert.equal(evidence.version,'0.13.0');
95
+ const {writeWindowsGateEvidence}=await import('../scripts/windows-gate-evidence-r44.mjs');
96
+ const summary=await writeWindowsGateEvidence({candidateRoot:root,stateRoot,clock:()=>new Date('2026-09-21T00:01:00.000Z')});
97
+ const evidence=JSON.parse(await readFile(summary.path,'utf8'));
98
+ assert.equal(evidence.schema,'deadbyte.r44-windows-gate.v1');assert.equal(evidence.version,'0.15.0');
106
99
  assert.equal(evidence.manifest_sha256,manifestSha);
107
- assert.equal(evidence.marker,'DEADBYTE V0.13.0 / R41 WINDOWS BATCH GATE: PASS');
100
+ assert.equal(evidence.marker,'DEADBYTE V0.15.0 / R44 REMOTE AGENT SKILL WINDOWS BATCH GATE: PASS');
101
+ assert.equal(evidence.parent.release_id,'v0.14.1-0a5a833892593283');
102
+ assert.equal(evidence.parent.final_closure_sha256,'2f29e94dd726638c23b2e520a608dcf2a6919e43348855be3940599d557f920b');
103
+ for(const key of ['skill_integrity','agent_backend_persistence','codex_protocol_contract','remote_device_identity','durable_job_supervisor','real_external_supervisor_smoke','full_regression_required']) assert.equal(evidence.features[key],true,key);
108
104
  assert.ok(summary.path.startsWith(path.join(stateRoot,'evidence','release')));
105
+ const historical=await readFile(path.join(root,'scripts','windows-gate-evidence-r43.mjs'),'utf8');
106
+ assert.match(historical,/version:'0\.14\.1'/);assert.match(historical,/deadbyte\.r43-windows-gate\.v1/);
109
107
  }finally{await rm(stateRoot,{recursive:true,force:true});}
110
108
  });
@@ -19,9 +19,9 @@ test('R34 public parity catalog is exact, unique, and includes production coding
19
19
 
20
20
  test('release parity and final verifier are package entry points', async () => {
21
21
  const pkg = JSON.parse(await text('package.json'));
22
- assert.equal(pkg.scripts['release:parity'], 'node scripts/release-parity-r41.mjs');
23
- assert.equal(pkg.scripts['release:final:write'], 'node scripts/final-closure-r41.mjs');
24
- assert.equal(pkg.scripts['release:final:verify'], 'node scripts/final-closure-verify-r41.mjs');
22
+ assert.equal(pkg.scripts['release:parity'], 'node scripts/release-parity-r44.mjs');
23
+ assert.equal(pkg.scripts['release:final:write'], 'node scripts/final-closure-r44.mjs');
24
+ assert.equal(pkg.scripts['release:final:verify'], 'node scripts/final-closure-verify-r44.mjs');
25
25
  assert.equal(typeof validateParityEvidence, 'function');
26
26
  assert.equal(typeof verifyFinalClosureObject, 'function');
27
27
  });
@@ -45,11 +45,11 @@ test('final closure verifier canonicalizes traversal order before exact-tree com
45
45
  assert.match(verifier, /const expected=\[\.\.\.entries\.keys\(\)\]\.sort\(\(a,b\)=>a\.localeCompare\(b,'en'\)\);/);
46
46
  });
47
47
 
48
- test('R36 autonomous live gate binds the compact gateway contract instead of the historical 73-tool public catalog', async () => {
48
+ test('R44 autonomous live gate binds the current compact gateway contract instead of the historical 73-tool public catalog', async () => {
49
49
  const autonomous = await text('src/remote-mcp-autonomous-smoke-client.mjs');
50
- assert.match(autonomous, /R36_COMPACT_GATEWAYS/);
51
- assert.match(autonomous, /R36_COMPACT_TOOL_LIMIT/);
52
- assert.match(autonomous, /names\.length > R36_COMPACT_TOOL_LIMIT/);
50
+ assert.match(autonomous, /R44_COMPACT_GATEWAYS/);
51
+ assert.match(autonomous, /R44_COMPACT_TOOL_LIMIT/);
52
+ assert.match(autonomous, /names\.length > R44_COMPACT_TOOL_LIMIT/);
53
53
  for (const name of ['autonomous_goal_submit','autonomous_goal_run','autonomous_goal_verify','autonomous_release_gate','native_diff_apply','native_diff_verify']) {
54
54
  assert.match(autonomous,new RegExp(name));
55
55
  }
@@ -0,0 +1,38 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { validateParityEvidence,R42_PREDECESSOR_RELEASE_ID,R42_PREDECESSOR_MANIFEST } from '../scripts/release-parity-r42.mjs';
5
+ import { verifyFinalClosureObject } from '../scripts/final-closure-verify-r42.mjs';
6
+
7
+ const root=new URL('../',import.meta.url);const text=rel=>readFile(new URL(rel,root),'utf8');
8
+ function parity(){const manifest='a'.repeat(64);return {schema:'deadbyte.r42-parity.v1',status:'passed',execution_provider:'deadbyte_mcp',rdc_operation_count:0,
9
+ candidate:{release_id:`v0.14.0-${manifest.slice(0,16)}`,version:'0.14.0',manifest_sha256:manifest},
10
+ immutable_slot:{protected:true,release_root:'C:/immutable/r42',development_root:'D:/Projects/deadbyte-mcp/development/deadbyte-mcp-r42-agentic-dev'},
11
+ local_full:{status:'passed',tool_count:80,strict_output_schemas:true},
12
+ public_compact:{status:'passed',tool_count:42,capability_closure:true,gateway_count:6,desktop_armed:false,desktop_observation_receipt_verified:true,desktop_grounding_receipt_verified:true},
13
+ autonomous:{status:'passed',signed_release_verified:true},desktop_guarded:{status:'passed',native_injected:true,replay_performed:false,predispatch_retry_count:0,observation_receipts_verified:1,action_receipts_verified:3},
14
+ deterministic_memory:{status:'passed',goal_count:1,snapshot_count:1,index_count:1},model_eval:{status:'passed',path:'C:/evidence/eval.json',evidence_sha256:'e'.repeat(64),payload_sha256:'f'.repeat(64),suite_sha256:'d'.repeat(64),case_count:3},
15
+ before_rollback_disarmed:{status:'passed',capability_closure:true,coding_armed:false,autonomous_armed:false,desktop_armed:false},rollback:{state:'completed'},restore:{state:'completed'},stage_restore:{status:'restored',manifest_sha256:manifest},
16
+ predecessor:{release_id:R42_PREDECESSOR_RELEASE_ID,version:'0.13.0',manifest_sha256:R42_PREDECESSOR_MANIFEST},predecessor_disarmed:{status:'passed',tool_count:42,capability_closure:true},
17
+ successor:{release_id:`v0.14.0-${manifest.slice(0,16)}`,version:'0.14.0',manifest_sha256:manifest},successor_disarmed:{status:'passed',capability_closure:true,coding_armed:false,autonomous_armed:false,desktop_armed:false},
18
+ requirements:Object.fromEntries(['tree_read','precondition_mutation','search','owned_process','observation','coding_loop','autonomy','interrupted_recovery','evidence_verification','compact_closure','full_surface','desktop_readonly','desktop_guarded_input','deterministic_memory','model_eval'].map(key=>[key,true]))};}
19
+
20
+ test('R42 parity requires exact R41 predecessor and immutable R42 slot',()=>{const value=parity();assert.equal(validateParityEvidence(value),true);
21
+ assert.throws(()=>validateParityEvidence({...value,predecessor:{...value.predecessor,manifest_sha256:'b'.repeat(64)}}),/predecessor/i);
22
+ assert.throws(()=>validateParityEvidence({...value,immutable_slot:{...value.immutable_slot,development_root:value.immutable_slot.release_root}}),/immutable-slot/i);});
23
+
24
+ test('R42 release machinery binds 0.14.0, R41 predecessor, memory gates and R42 domains',async()=>{const [gate,deferred,paritySource,writer,verifier,evidence,suite]=await Promise.all([
25
+ text('scripts/gate-windows-r42.ps1'),text('scripts/deferred-slot-operation-r42.mjs'),text('scripts/release-parity-r42.mjs'),text('scripts/final-closure-r42.mjs'),text('scripts/final-closure-verify-r42.mjs'),text('scripts/windows-gate-evidence-r42.mjs'),text('scripts/release-parity-tests-r42.ps1')]);
26
+ assert.equal(R42_PREDECESSOR_RELEASE_ID,'v0.13.0-3255be10de4daf08');assert.equal(R42_PREDECESSOR_MANIFEST,'3255be10de4daf0837d67d1ab1913b785b8b8215bc7405823c2ff46968c4b98f');
27
+ assert.match(gate,/r42-parent-verify/);assert.match(gate,/r42-model-backed-eval/);assert.match(gate,/memory-history-r41\.test\.mjs/);assert.match(gate,/DEADBYTE V0\.14\.0 \/ R42 WINDOWS BATCH GATE: PASS/);
28
+ assert.match(deferred,/--expected-version','0\.14\.0'/);assert.match(paritySource,/deadbyte\.r42-parity\.v1/);
29
+ for(const source of [writer,verifier]){assert.match(source,/DEADBYTE-R42-FINAL-CLOSURE-V1/);assert.match(source,/deadbyte\.r42-final-closure\.v1/);assert.match(source,/R42 AGENTIC GOVERNANCE BASELINE/);}
30
+ assert.equal(typeof verifyFinalClosureObject,'function');assert.match(evidence,/deadbyte\.r42-windows-gate\.v1/);assert.match(suite,/memory-autonomous-integration-r41\.test\.mjs/);
31
+ });
32
+
33
+
34
+ test('R42 preserves release-namespaced deterministic memory storage',async()=>{
35
+ const [server,paritySource]=await Promise.all([text('src/mcp-server.mjs'),text('scripts/release-parity-r42.mjs')]);
36
+ assert.match(server,/memoryRoot:path\.join\(autonomousPolicy\.evidence_dir,'memory-r41',packageManifestSha256\)/);
37
+ assert.match(paritySource,/memoryRoot:path\.join\(stateRoot,'evidence','autonomous','memory-r41',candidateManifest\)/);
38
+ });
@@ -0,0 +1,31 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { validateParityEvidence,R43_PREDECESSOR_RELEASE_ID,R43_PREDECESSOR_MANIFEST } from '../scripts/release-parity-r43.mjs';
5
+ import { verifyFinalClosureObject } from '../scripts/final-closure-verify-r43.mjs';
6
+
7
+ const root=new URL('../',import.meta.url);const text=rel=>readFile(new URL(rel,root),'utf8');
8
+ function parity(){const manifest='a'.repeat(64);return {schema:'deadbyte.r43-parity.v1',status:'passed',execution_provider:'deadbyte_mcp',rdc_operation_count:0,
9
+ candidate:{release_id:`v0.14.1-${manifest.slice(0,16)}`,version:'0.14.1',manifest_sha256:manifest},
10
+ immutable_slot:{protected:true,release_root:'C:/immutable/r43',development_root:'D:/Projects/deadbyte-mcp/development/deadbyte-mcp-r42-agentic-dev'},
11
+ local_full:{status:'passed',tool_count:80,strict_output_schemas:true},
12
+ public_compact:{status:'passed',tool_count:42,capability_closure:true,gateway_count:6,desktop_armed:false,desktop_observation_receipt_verified:true,desktop_grounding_receipt_verified:true},
13
+ autonomous:{status:'passed',signed_release_verified:true},desktop_guarded:{status:'passed',native_injected:true,replay_performed:false,predispatch_retry_count:0,observation_receipts_verified:1,action_receipts_verified:3},
14
+ deterministic_memory:{status:'passed',goal_count:1,snapshot_count:1,index_count:1},
15
+ before_rollback_disarmed:{status:'passed',capability_closure:true,coding_armed:false,autonomous_armed:false,desktop_armed:false},rollback:{state:'completed'},restore:{state:'completed'},stage_restore:{status:'restored',manifest_sha256:manifest},
16
+ predecessor:{release_id:R43_PREDECESSOR_RELEASE_ID,version:'0.14.0',manifest_sha256:R43_PREDECESSOR_MANIFEST},predecessor_disarmed:{status:'passed',tool_count:42,capability_closure:true},
17
+ successor:{release_id:`v0.14.1-${manifest.slice(0,16)}`,version:'0.14.1',manifest_sha256:manifest},successor_disarmed:{status:'passed',capability_closure:true,coding_armed:false,autonomous_armed:false,desktop_armed:false},
18
+ requirements:Object.fromEntries(['tree_read','precondition_mutation','search','owned_process','observation','coding_loop','autonomy','interrupted_recovery','evidence_verification','compact_closure','full_surface','desktop_readonly','desktop_guarded_input','deterministic_memory'].map(key=>[key,true]))};}
19
+
20
+ test('R43 parity requires exact R42 predecessor and immutable R43 slot',()=>{const value=parity();assert.equal(validateParityEvidence(value),true);
21
+ assert.throws(()=>validateParityEvidence({...value,predecessor:{...value.predecessor,manifest_sha256:'b'.repeat(64)}}),/predecessor/i);
22
+ assert.throws(()=>validateParityEvidence({...value,immutable_slot:{...value.immutable_slot,development_root:value.immutable_slot.release_root}}),/immutable-slot/i);});
23
+
24
+ test('R43 release machinery binds 0.14.1 exact R42 predecessor and no fresh model credential dependency',async()=>{const [gate,deferred,paritySource,writer,verifier,evidence,suite,finalizer]=await Promise.all([
25
+ text('scripts/gate-windows-r43.ps1'),text('scripts/deferred-slot-operation-r43.mjs'),text('scripts/release-parity-r43.mjs'),text('scripts/final-closure-r43.mjs'),text('scripts/final-closure-verify-r43.mjs'),text('scripts/windows-gate-evidence-r43.mjs'),text('scripts/release-parity-tests-r43.ps1'),text('scripts/finalize-r43.mjs')]);
26
+ assert.equal(R43_PREDECESSOR_RELEASE_ID,'v0.14.0-08cd8f3b98c90e0e');assert.equal(R43_PREDECESSOR_MANIFEST,'08cd8f3b98c90e0e250cf506ff396515065ff5457909f850b75b0b6e8ecc2dd1');
27
+ assert.match(gate,/r43-parent-verify/);assert.doesNotMatch(gate,/model-backed-eval|OPENAI_API_KEY/);assert.match(gate,/full-regression/);assert.match(gate,/r43:full:test/);assert.match(gate,/DEADBYTE V0\.14\.1 \/ R43 AUTHORITY HARDENING WINDOWS BATCH GATE: PASS/);
28
+ assert.match(deferred,/--expected-version','0\.14\.1'/);assert.match(paritySource,/deadbyte\.r43-parity\.v1/);assert.doesNotMatch(paritySource,/verifyR42ModelEval|model_eval/);
29
+ for(const source of [writer,verifier]){assert.match(source,/DEADBYTE-R43-FINAL-CLOSURE-V1/);assert.match(source,/deadbyte\.r43-final-closure\.v1/);assert.match(source,/R43 AUTHORITY HARDENING PATCH/);assert.doesNotMatch(source,/model_eval/);}
30
+ assert.equal(typeof verifyFinalClosureObject,'function');assert.match(evidence,/deadbyte\.r43-windows-gate\.v1/);assert.match(evidence,/parent_activation_receipt_sha256/);assert.match(suite,/autonomous-loop\.test\.mjs/);assert.match(suite,/runtime-self-update\.test\.mjs/);assert.match(suite,/r43-finalizer\.test\.mjs/);assert.match(finalizer,/--restore-standing-grants/);assert.match(finalizer,/final_authority\?\.process_armed===true/);assert.match(finalizer,/requires Process standing grant/);assert.match(finalizer,/runReleaseParity/);assert.match(finalizer,/writeFinalClosure/);assert.match(finalizer,/verifyFinalClosureObject/);assert.match(finalizer,/--rollback-receipt/);assert.match(finalizer,/parity_scratch/);
31
+ });
@@ -0,0 +1,34 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { validateFinalizerAuthorityStatus, validateWindowsGateEvidence } from '../scripts/finalize-r43.mjs';
4
+
5
+ const manifest='a'.repeat(64);
6
+ const parent={parent_release_id:'v0.14.0-08cd8f3b98c90e0e',
7
+ parent_manifest_sha256:'08cd8f3b98c90e0e250cf506ff396515065ff5457909f850b75b0b6e8ecc2dd1',
8
+ parent_generation_manifest_sha256:'df8ca9894a3e2ca9a9f145cfa3e4e23fd71f42c1988266a1591fc16261ab18a5'};
9
+ const valid=()=>({schema:'deadbyte.r43-windows-gate.v1',status:'passed',exit_code:0,version:'0.14.1',
10
+ marker:'DEADBYTE V0.14.1 / R43 AUTHORITY HARDENING WINDOWS BATCH GATE: PASS',manifest_sha256:manifest,
11
+ parent:{release_id:parent.parent_release_id,manifest_sha256:parent.parent_manifest_sha256,
12
+ generation_manifest_sha256:parent.parent_generation_manifest_sha256,
13
+ activation_receipt_sha256:'074140ad8b94501e0a095a7fa132dc5d6e2c57102c9eeaaa2ac9e4ea93b9b187'},
14
+ hardening:{authority_toctou:true,absolute_execution_deadline:true,pre_spawn_authority_recheck:true,
15
+ full_regression_required:true,model_path_changed:false}});
16
+
17
+ test('R43 detached finalizer requires explicit Process+Coding+Autonomous grants and keeps Desktop+Host disarmed',()=>{
18
+ assert.equal(validateFinalizerAuthorityStatus({
19
+ process_armed:true,coding_armed:true,autonomous_armed:true,desktop_armed:false,host_armed:false
20
+ }),true);
21
+ assert.throws(()=>validateFinalizerAuthorityStatus({
22
+ process_armed:false,coding_armed:true,autonomous_armed:true,desktop_armed:false,host_armed:false
23
+ }),/Process standing grant/);
24
+ assert.throws(()=>validateFinalizerAuthorityStatus({
25
+ process_armed:true,coding_armed:true,autonomous_armed:true,desktop_armed:false,host_armed:true
26
+ }),/Host DISARMED/);
27
+ });
28
+
29
+ test('R43 detached finalizer accepts only exact parent-bound hardening gate evidence',()=>{
30
+ assert.equal(validateWindowsGateEvidence(valid(),manifest,parent),true);
31
+ assert.throws(()=>validateWindowsGateEvidence({...valid(),manifest_sha256:'b'.repeat(64)},manifest,parent),/candidate mismatch/);
32
+ assert.throws(()=>validateWindowsGateEvidence({...valid(),hardening:{...valid().hardening,authority_toctou:false}},manifest,parent),/hardening contract/);
33
+ assert.throws(()=>validateWindowsGateEvidence({...valid(),parent:{...valid().parent,release_id:'v0.14.0-bad'}},manifest,parent),/parent mismatch/);
34
+ });
@@ -0,0 +1,29 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { verifyR43Parent } from '../scripts/verify-r43-parent.mjs';
5
+
6
+ const root=new URL('../',import.meta.url);
7
+
8
+ test('R43 parent contract binds exact immutable R42 release and signed activation evidence', async()=>{
9
+ const record=JSON.parse(await readFile(new URL('../R43-PARENT.json',import.meta.url),'utf8'));
10
+ assert.equal(record.schema,'deadbyte.r43-parent.v1');
11
+ assert.equal(record.parent_release_id,'v0.14.0-08cd8f3b98c90e0e');
12
+ assert.equal(record.parent_version,'0.14.0');
13
+ assert.equal(record.parent_manifest_sha256,'08cd8f3b98c90e0e250cf506ff396515065ff5457909f850b75b0b6e8ecc2dd1');
14
+ assert.equal(record.parent_generation_manifest_sha256,'df8ca9894a3e2ca9a9f145cfa3e4e23fd71f42c1988266a1591fc16261ab18a5');
15
+ assert.equal(record.parent_manifest_file_count,1820);
16
+ assert.equal(record.parent_generation_file_count,7);
17
+ assert.equal(record.parent_final_closure_present,false);
18
+ const verified=await verifyR43Parent(new URL('../R43-PARENT.json',import.meta.url));
19
+ assert.equal(verified.status,'passed');
20
+ assert.equal(verified.release_files,1820);
21
+ assert.equal(verified.generation_files,7);
22
+ assert.equal(verified.parent_activation_receipt_sha256,'074140ad8b94501e0a095a7fa132dc5d6e2c57102c9eeaaa2ac9e4ea93b9b187');
23
+ });
24
+
25
+ test('R43 parent record explicitly refuses to invent missing R42 final closure evidence', async()=>{
26
+ const record=JSON.parse(await readFile(new URL('../R43-PARENT.json',import.meta.url),'utf8'));
27
+ assert.equal(record.parent_final_closure_present,false);
28
+ assert.equal(Object.prototype.hasOwnProperty.call(record,'parent_final_closure_path'),false);
29
+ });
@@ -0,0 +1,58 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { validateParityEvidence,R44_PREDECESSOR_RELEASE_ID,R44_PREDECESSOR_MANIFEST } from '../scripts/release-parity-r44.mjs';
5
+ import { verifyFinalClosureObject } from '../scripts/final-closure-verify-r44.mjs';
6
+
7
+ const root=new URL('../',import.meta.url);const text=rel=>readFile(new URL(rel,root),'utf8');
8
+ const featureGate=manifest=>({schema:'deadbyte.r44-windows-gate.v1',status:'passed',exit_code:0,version:'0.15.0',
9
+ marker:'DEADBYTE V0.15.0 / R44 REMOTE AGENT SKILL WINDOWS BATCH GATE: PASS',manifest_sha256:manifest,
10
+ features:{skill_integrity:true,agent_backend_persistence:true,codex_protocol_contract:true,remote_device_identity:true,
11
+ durable_job_supervisor:true,real_external_supervisor_smoke:true,full_regression_required:true,codex_live_binary_required:false}});
12
+ function parity(){
13
+ const manifest='a'.repeat(64),gate=featureGate(manifest);
14
+ const requirements=Object.fromEntries(['tree_read','precondition_mutation','search','owned_process','observation','coding_loop','autonomy',
15
+ 'interrupted_recovery','evidence_verification','compact_closure','full_surface','desktop_readonly','desktop_guarded_input','deterministic_memory',
16
+ 'skill_integrity','agent_backend_persistence','codex_protocol_contract','remote_device_identity','durable_job_supervisor','real_external_supervisor_smoke'].map(key=>[key,true]));
17
+ return {schema:'deadbyte.r44-parity.v1',status:'passed',execution_provider:'deadbyte_mcp',rdc_operation_count:0,
18
+ candidate:{release_id:`v0.15.0-${manifest.slice(0,16)}`,version:'0.15.0',manifest_sha256:manifest},
19
+ immutable_slot:{protected:true,release_root:'C:/immutable/r44',development_root:'D:/Projects/deadbyte-mcp/development/deadbyte-mcp-r42-agentic-dev'},
20
+ local_full:{status:'passed',tool_count:81,strict_output_schemas:true},
21
+ public_compact:{status:'passed',tool_count:43,capability_closure:true,gateway_count:6,skill_catalog_verified:true,
22
+ desktop_armed:false,desktop_observation_receipt_verified:true,desktop_grounding_receipt_verified:true},
23
+ autonomous:{status:'passed',signed_release_verified:true},desktop_guarded:{status:'passed',native_injected:true,replay_performed:false,
24
+ predispatch_retry_count:0,observation_receipts_verified:1,action_receipts_verified:3},
25
+ deterministic_memory:{status:'passed',goal_count:1,snapshot_count:1,index_count:1},
26
+ feature_gate:gate,feature_gate_sha256:'f'.repeat(64),
27
+ before_rollback_disarmed:{status:'passed',capability_closure:true,coding_armed:false,autonomous_armed:false,desktop_armed:false},
28
+ rollback:{state:'completed'},restore:{state:'completed'},stage_restore:{status:'restored',manifest_sha256:manifest},
29
+ predecessor:{release_id:R44_PREDECESSOR_RELEASE_ID,version:'0.14.1',manifest_sha256:R44_PREDECESSOR_MANIFEST},
30
+ predecessor_disarmed:{status:'passed',tool_count:42,capability_closure:true},
31
+ successor:{release_id:`v0.15.0-${manifest.slice(0,16)}`,version:'0.15.0',manifest_sha256:manifest},
32
+ successor_disarmed:{status:'passed',tool_count:43,capability_closure:true,skill_catalog_verified:true,coding_armed:false,autonomous_armed:false,desktop_armed:false},
33
+ requirements};
34
+ }
35
+
36
+ test('R44 parity requires exact R43 predecessor, 81/43 surface and feature contract',()=>{
37
+ const value=parity();assert.equal(validateParityEvidence(value),true);
38
+ assert.throws(()=>validateParityEvidence({...value,predecessor:{...value.predecessor,manifest_sha256:'b'.repeat(64)}}),/predecessor/i);
39
+ assert.throws(()=>validateParityEvidence({...value,local_full:{...value.local_full,tool_count:80}}),/81-tool/i);
40
+ assert.throws(()=>validateParityEvidence({...value,public_compact:{...value.public_compact,tool_count:42}}),/compact/i);
41
+ assert.throws(()=>validateParityEvidence({...value,feature_gate:{...value.feature_gate,features:{...value.feature_gate.features,codex_protocol_contract:false}}}),/codex_protocol_contract/);
42
+ });
43
+
44
+ test('R44 release machinery is isolated from R43 and binds 0.15.0 signed closure domains',async()=>{
45
+ const [gate,deferred,paritySource,writer,verifier,evidence,suite,finalizer,parent]=await Promise.all([
46
+ text('scripts/gate-windows-r44.ps1'),text('scripts/deferred-slot-operation-r44.mjs'),text('scripts/release-parity-r44.mjs'),
47
+ text('scripts/final-closure-r44.mjs'),text('scripts/final-closure-verify-r44.mjs'),text('scripts/windows-gate-evidence-r44.mjs'),
48
+ text('scripts/release-parity-tests-r44.ps1'),text('scripts/finalize-r44.mjs'),text('R44-PARENT.json')]);
49
+ assert.equal(R44_PREDECESSOR_RELEASE_ID,'v0.14.1-0a5a833892593283');
50
+ assert.equal(R44_PREDECESSOR_MANIFEST,'0a5a8338925932830986421dda60ec5643f62f600404de4992fda2a5e79d09a9');
51
+ assert.match(gate,/r44-parent-verify/);assert.match(gate,/r44:full:test/);assert.match(gate,/DEADBYTE V0\.15\.0 \/ R44 REMOTE AGENT SKILL WINDOWS BATCH GATE: PASS/);
52
+ assert.match(deferred,/--expected-version','0\.15\.0'/);assert.match(paritySource,/deadbyte\.r44-parity\.v1/);assert.match(paritySource,/tool_count===81/);assert.match(paritySource,/tool_count===43/);
53
+ for(const source of [writer,verifier]){assert.match(source,/DEADBYTE-R44-FINAL-CLOSURE-V1/);assert.match(source,/deadbyte\.r44-final-closure\.v1/);assert.match(source,/R44 REMOTE AGENT SKILL BASELINE/);}
54
+ assert.equal(typeof verifyFinalClosureObject,'function');assert.match(evidence,/deadbyte\.r44-windows-gate\.v1/);assert.match(evidence,/final_closure_sha256/);
55
+ assert.match(suite,/skill-plane-r44\.test\.mjs/);assert.match(suite,/codex-app-server-r44\.test\.mjs/);assert.match(suite,/external-job-provider-r44\.test\.mjs/);
56
+ assert.match(finalizer,/--restore-standing-grants/);assert.match(finalizer,/runReleaseParity/);assert.match(finalizer,/writeFinalClosure/);assert.match(finalizer,/verifyFinalClosureObject/);assert.match(finalizer,/--rollback-receipt/);
57
+ const parentRecord=JSON.parse(parent);assert.equal(parentRecord.parent_final_closure_sha256,'2f29e94dd726638c23b2e520a608dcf2a6919e43348855be3940599d557f920b');
58
+ });
@@ -0,0 +1,48 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { validateFinalizerAuthorityStatus, validateWindowsGateEvidence } from '../scripts/finalize-r44.mjs';
4
+ import { windowsPowerShellEnvironment } from '../src/runtime-update.mjs';
5
+
6
+ const manifest='a'.repeat(64);
7
+ const parent={
8
+ release_id:'v0.14.1-0a5a833892593283',
9
+ manifest_sha256:'0a5a8338925932830986421dda60ec5643f62f600404de4992fda2a5e79d09a9',
10
+ generation_manifest_sha256:'fcfcb5a47d55039b7bb5d42faa0739b57b13d8a420d4418ae09d96d2862967cb',
11
+ closure_sha256:'2f29e94dd726638c23b2e520a608dcf2a6919e43348855be3940599d557f920b'
12
+ };
13
+ const features=()=>({skill_integrity:true,agent_backend_persistence:true,codex_protocol_contract:true,
14
+ remote_device_identity:true,durable_job_supervisor:true,real_external_supervisor_smoke:true,full_regression_required:true,
15
+ codex_live_binary_required:false});
16
+ const valid=()=>({schema:'deadbyte.r44-windows-gate.v1',status:'passed',exit_code:0,version:'0.15.0',
17
+ marker:'DEADBYTE V0.15.0 / R44 REMOTE AGENT SKILL WINDOWS BATCH GATE: PASS',manifest_sha256:manifest,
18
+ parent:{release_id:parent.release_id,manifest_sha256:parent.manifest_sha256,
19
+ generation_manifest_sha256:parent.generation_manifest_sha256,final_closure_sha256:parent.closure_sha256},
20
+ features:features()});
21
+
22
+ test('R44 detached finalizer requires Process+Coding+Autonomous and Desktop+Host DISARMED',()=>{
23
+ assert.equal(validateFinalizerAuthorityStatus({process_armed:true,coding_armed:true,autonomous_armed:true,desktop_armed:false,host_armed:false}),true);
24
+ assert.throws(()=>validateFinalizerAuthorityStatus({process_armed:false,coding_armed:true,autonomous_armed:true,desktop_armed:false,host_armed:false}),/Process standing grant/);
25
+ assert.throws(()=>validateFinalizerAuthorityStatus({process_armed:true,coding_armed:true,autonomous_armed:true,desktop_armed:true,host_armed:false}),/Desktop DISARMED/);
26
+ assert.throws(()=>validateFinalizerAuthorityStatus({process_armed:true,coding_armed:true,autonomous_armed:true,desktop_armed:false,host_armed:true}),/Host DISARMED/);
27
+ });
28
+
29
+ test('R44 detached finalizer accepts only exact signed-R43-parent feature gate evidence',()=>{
30
+ assert.equal(validateWindowsGateEvidence(valid(),manifest,parent),true);
31
+ assert.throws(()=>validateWindowsGateEvidence({...valid(),manifest_sha256:'b'.repeat(64)},manifest,parent),/candidate mismatch/);
32
+ assert.throws(()=>validateWindowsGateEvidence({...valid(),parent:{...valid().parent,release_id:'v0.14.1-bad'}},manifest,parent),/parent mismatch/);
33
+ assert.throws(()=>validateWindowsGateEvidence({...valid(),parent:{...valid().parent,final_closure_sha256:'b'.repeat(64)}},manifest,parent),/parent/);
34
+ assert.throws(()=>validateWindowsGateEvidence({...valid(),features:{...features(),skill_integrity:false}},manifest,parent),/skill_integrity/);
35
+ });
36
+
37
+ test('R44 detached finalizer isolates Windows PowerShell modules from the parent runtime',()=>{
38
+ const env=windowsPowerShellEnvironment({
39
+ SystemRoot:'C:\\Windows',USERPROFILE:'C:\\Users\\operator',ProgramFiles:'C:\\Program Files',
40
+ PSModulePath:'C:\\poisoned-runtime-modules'
41
+ });
42
+ assert.equal(env.PSModulePath,[
43
+ 'C:\\Users\\operator\\Documents\\WindowsPowerShell\\Modules',
44
+ 'C:\\Program Files\\WindowsPowerShell\\Modules',
45
+ 'C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Modules'
46
+ ].join(';'));
47
+ assert.doesNotMatch(env.PSModulePath,/poisoned-runtime-modules/);
48
+ });
@@ -0,0 +1,25 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { verifyR44Parent } from '../scripts/verify-r44-parent.mjs';
6
+
7
+ const here=path.dirname(fileURLToPath(import.meta.url));
8
+ const root=path.resolve(here,'..');
9
+
10
+ test('R44 parent is exact sealed R43 final baseline',async()=>{
11
+ const result=await verifyR44Parent(path.join(root,'R44-PARENT.json'));
12
+ assert.equal(result.ok,true);
13
+ assert.equal(result.release_id,'v0.14.1-0a5a833892593283');
14
+ assert.equal(result.manifest_sha256,'0a5a8338925932830986421dda60ec5643f62f600404de4992fda2a5e79d09a9');
15
+ assert.equal(result.generation_manifest_sha256,'fcfcb5a47d55039b7bb5d42faa0739b57b13d8a420d4418ae09d96d2862967cb');
16
+ assert.equal(result.release_files,1834);
17
+ assert.equal(result.generation_files,7);
18
+ assert.equal(result.closure_sha256,'2f29e94dd726638c23b2e520a608dcf2a6919e43348855be3940599d557f920b');
19
+ assert.equal(result.recorded_all_disarmed,true);
20
+ });
21
+
22
+ test('R44 parent proof is historical and does not require current grants to remain absent',async()=>{
23
+ const result=await verifyR44Parent(path.join(root,'R44-PARENT.json'));
24
+ assert.equal(result.proof_class,'immutable-slot+generation+signed-final-closure');
25
+ });
@@ -3,23 +3,57 @@ import assert from 'node:assert/strict';
3
3
  import { readFile } from 'node:fs/promises';
4
4
  import { createHash } from 'node:crypto';
5
5
  const root=new URL('../',import.meta.url);const text=rel=>readFile(new URL(rel,root),'utf8');
6
- const R41_PREDECESSOR_RELEASE_ID='v0.12.0-70906ae0a7e4f062';
7
- const R41_PREDECESSOR_MANIFEST='70906ae0a7e4f0627efbb5087b40b85677c81ed6d64ed89c0ba2af846e390f39';
8
- test('R41 authority agrees on V0.13.0 and preserves exact sealed public R40 predecessor',async()=>{
9
- const pkg=JSON.parse(await text('package.json'));
10
- const [version,controller,gate,readme,architecture,controllerReadme,deferred,parity,closure,closureVerify,windowsGate,parent,semanticConfig]=await Promise.all([
11
- text('src/version.mjs'),text('controller/deadbyte-controller.ps1'),text('scripts/gate-windows-r41.ps1'),text('README.txt'),text('docs/ARCHITECTURE.md'),text('controller/README.TXT'),text('scripts/deferred-slot-operation-r41.mjs'),text('scripts/release-parity-r41.mjs'),text('scripts/final-closure-r41.mjs'),text('scripts/final-closure-verify-r41.mjs'),text('scripts/windows-gate-evidence-r41.mjs'),text('R41-PARENT.json'),text('controller/deadbyte-semantic-lsp-config.json')]);
12
- assert.equal(pkg.version,'0.13.0');assert.equal(pkg.scripts['gate:windows'],'powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-r41.ps1');
13
- assert.equal(pkg.scripts['self-update:deferred'],'node scripts/deferred-slot-operation-r41.mjs');assert.equal(pkg.scripts['release:parity'],'node scripts/release-parity-r41.mjs');
14
- assert.equal(pkg.scripts['release:final:write'],'node scripts/final-closure-r41.mjs');assert.equal(pkg.scripts['release:final:verify'],'node scripts/final-closure-verify-r41.mjs');
15
- assert.equal(pkg.scripts['desktop:policy:refresh'],'powershell -NoProfile -ExecutionPolicy Bypass -File scripts/init-desktop-policy-r40.ps1');
16
- assert.match(version,/DEADBYTE_VERSION = '0\.13\.0'/);assert.match(controller,/CONTROLLER V0\.13\.0 \/ R41/);assert.match(gate,/DEADBYTE V0\.13\.0 \/ R41 WINDOWS BATCH GATE: PASS/);
17
- assert.match(readme,/^DEADBYTE MCP V0\.13\.0 \/ R41 DETERMINISTIC MEMORY BASELINE$/m);assert.match(architecture,/^# DEADBYTE MCP V0\.13\.0 \/ R41 ARCHITECTURE$/m);assert.match(controllerReadme,/^DEADBYTE MCP V0\.13\.0 \/ R41 CONTROLLER$/m);
18
- assert.match(deferred,/--expected-version','0\.13\.0'/);assert.match(deferred,/--enable-desktop/);assert.match(parity,/R41_PREDECESSOR_RELEASE_ID='v0\.12\.0-70906ae0a7e4f062'/);assert.match(parity,new RegExp(R41_PREDECESSOR_MANIFEST));
19
- assert.match(parity,/version==='0\.13\.0'|version:'0\.13\.0'/);assert.match(closure,/version:'0\.13\.0'/);assert.match(closureVerify,/DEADBYTE V0\.13\.0 \/ R41 WINDOWS BATCH GATE: PASS/);assert.match(windowsGate,/version:'0\.13\.0'/);
20
- assert.equal(JSON.parse(parent).parent_manifest_sha256,R41_PREDECESSOR_MANIFEST);
21
- assert.equal(createHash('sha256').update(Buffer.from(semanticConfig,'utf8')).digest('hex'),'d274b099a298c1033fea8f1e8849751693bbc0448778d619400acb82d4f53a3b');assert.equal(R41_PREDECESSOR_RELEASE_ID,'v0.12.0-70906ae0a7e4f062');
6
+ const PARENT_RELEASE='v0.14.1-0a5a833892593283';
7
+ const PARENT_MANIFEST='0a5a8338925932830986421dda60ec5643f62f600404de4992fda2a5e79d09a9';
8
+ const PARENT_CLOSURE='2f29e94dd726638c23b2e520a608dcf2a6919e43348855be3940599d557f920b';
9
+
10
+ test('R44 current authority agrees on V0.15.0 and preserves exact sealed R43 parent',async()=>{
11
+ const pkg=JSON.parse(await text('package.json'));
12
+ const [version,controller,gate,readme,architecture,controllerReadme,deferred,parity,closure,closureVerify,windowsGate,parent,r43Gate,r43Parity,r43Closure]=await Promise.all([
13
+ text('src/version.mjs'),text('controller/deadbyte-controller.ps1'),text('scripts/gate-windows-r44.ps1'),text('README.txt'),
14
+ text('docs/ARCHITECTURE.md'),text('controller/README.TXT'),text('scripts/deferred-slot-operation-r44.mjs'),
15
+ text('scripts/release-parity-r44.mjs'),text('scripts/final-closure-r44.mjs'),text('scripts/final-closure-verify-r44.mjs'),
16
+ text('scripts/windows-gate-evidence-r44.mjs'),text('R44-PARENT.json'),
17
+ text('scripts/gate-windows-r43.ps1'),text('scripts/release-parity-r43.mjs'),text('scripts/final-closure-r43.mjs')
18
+ ]);
19
+ assert.equal(pkg.version,'0.15.0');
20
+ assert.equal(pkg.scripts['gate:windows'],'powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-r44.ps1');
21
+ assert.equal(pkg.scripts['r44:parent:verify'],'node scripts/verify-r44-parent.mjs');
22
+ assert.equal(pkg.scripts['r44:full:test'],'node scripts/full-regression-r44.mjs');
23
+ assert.equal(pkg.scripts['self-update:deferred'],'node scripts/deferred-slot-operation-r44.mjs');
24
+ assert.equal(pkg.scripts['release:parity'],'node scripts/release-parity-r44.mjs');
25
+ assert.equal(pkg.scripts['release:final:write'],'node scripts/final-closure-r44.mjs');
26
+ assert.equal(pkg.scripts['release:final:verify'],'node scripts/final-closure-verify-r44.mjs');
27
+ assert.equal(pkg.scripts['finalize:r44'],'node scripts/finalize-r44.mjs');
28
+ assert.match(version,/DEADBYTE_VERSION = '0\.15\.0'/);
29
+ assert.match(controller,/CONTROLLER V0\.15\.0 \/ R44/);
30
+ assert.match(gate,/DEADBYTE V0\.15\.0 \/ R44 REMOTE AGENT SKILL WINDOWS BATCH GATE: PASS/);
31
+ assert.match(readme,/^DEADBYTE MCP V0\.15\.0 \/ R44 REMOTE AGENT \+ SKILL BASELINE$/m);
32
+ assert.match(architecture,/^# DEADBYTE MCP V0\.15\.0 \/ R44 ARCHITECTURE$/m);
33
+ assert.match(controllerReadme,/^DEADBYTE MCP V0\.15\.0 \/ R44 CONTROLLER$/m);
34
+ assert.match(deferred,/--expected-version','0\.15\.0'/);
35
+ assert.match(parity,/R44_PREDECESSOR_RELEASE_ID='v0\.14\.1-0a5a833892593283'/);assert.match(parity,new RegExp(PARENT_MANIFEST));
36
+ assert.match(parity,/tool_count===81/);assert.match(parity,/tool_count===43/);
37
+ assert.match(closure,/version:'0\.15\.0'/);assert.match(closure,/DEADBYTE-R44-FINAL-CLOSURE-V1/);
38
+ assert.match(closureVerify,/R44_FULL_TOOL_COUNT=81/);assert.match(closureVerify,/R44_COMPACT_TOOL_COUNT=43/);
39
+ assert.match(windowsGate,/deadbyte\.r44-windows-gate\.v1/);
40
+ const parentRecord=JSON.parse(parent);
41
+ assert.equal(parentRecord.parent_release_id,PARENT_RELEASE);assert.equal(parentRecord.parent_manifest_sha256,PARENT_MANIFEST);
42
+ assert.equal(parentRecord.parent_final_closure_sha256,PARENT_CLOSURE);
43
+ assert.match(r43Gate,/DEADBYTE V0\.14\.1 \/ R43 AUTHORITY HARDENING WINDOWS BATCH GATE: PASS/);
44
+ assert.match(r43Parity,/deadbyte\.r43-parity\.v1/);assert.match(r43Closure,/version:'0\.14\.1'/);
45
+ });
46
+
47
+ test('R44 keeps ONLINE reuse and explicit Desktop authority',async()=>{
48
+ const [cli,controller]=await Promise.all([text('src/deadbyte-cli.mjs'),text('controller/deadbyte-controller.ps1')]);
49
+ assert.match(cli,/controllerRuntimeReady/);assert.match(cli,/Runtime already ONLINE; reusing verified bridge\/cloud\/supervisor/);
50
+ const start=controller.indexOf('function Recover-AutonomousSupervisor'),end=controller.indexOf('function Show-State',start);
51
+ assert.ok(start>=0&&end>start);const block=controller.slice(start,end);
52
+ assert.doesNotMatch(block,/\$host\s*=/i);assert.match(block,/\$hostStatus\s*=\s*Get-HostArmStatus/);
53
+ assert.match(controller,/armdesktop/);assert.match(controller,/disarmdesktop/);
54
+ });
55
+
56
+ test('semantic config remains byte-pinned across R44 feature work',async()=>{
57
+ const semantic=await text('controller/deadbyte-semantic-lsp-config.json');
58
+ assert.equal(createHash('sha256').update(Buffer.from(semantic,'utf8')).digest('hex'),'d274b099a298c1033fea8f1e8849751693bbc0448778d619400acb82d4f53a3b');
22
59
  });
23
- test('R40 keeps ONLINE reuse and PowerShell Host collision fix while Desktop stays explicit',async()=>{const [cli,controller]=await Promise.all([text('src/deadbyte-cli.mjs'),text('controller/deadbyte-controller.ps1')]);assert.match(cli,/controllerRuntimeReady/);assert.match(cli,/Runtime already ONLINE; reusing verified bridge\/cloud\/supervisor/);const start=controller.indexOf('function Recover-AutonomousSupervisor'),end=controller.indexOf('function Show-State',start);assert.ok(start>=0&&end>start);const block=controller.slice(start,end);assert.doesNotMatch(block,/\$host\s*=/i);assert.match(block,/\$hostStatus\s*=\s*Get-HostArmStatus/);assert.match(controller,/armdesktop/);assert.match(controller,/disarmdesktop/);});
24
- test('sealed R39 tooling remains historical 0.11.3 authority with exact 0.11.2 predecessor',async()=>{const [parity,gate,closure]=await Promise.all([text('scripts/release-parity-r39.mjs'),text('scripts/gate-windows-r39.ps1'),text('scripts/final-closure-r39.mjs')]);assert.match(parity,/R39_PREDECESSOR_RELEASE_ID='v0\.11\.2-058605dfccaa3035'/);assert.match(parity,/version==='0\.11\.3'|version:'0\.11\.3'/);assert.match(gate,/DEADBYTE V0\.11\.3 \/ R39 WINDOWS BATCH GATE: PASS/);assert.match(closure,/version:'0\.11\.3'/);});
25
- test('sealed R37 tooling remains historical 0.11.1 authority',async()=>{const [parity,gate,closure]=await Promise.all([text('scripts/release-parity.mjs'),text('scripts/gate-windows.ps1'),text('scripts/final-closure.mjs')]);assert.match(parity,/R37_PREDECESSOR_RELEASE_ID='v0\.11\.0-08c2a0008b1f84c9'/);assert.match(parity,/version==='0\.11\.1'|version:'0\.11\.1'/);assert.match(gate,/DEADBYTE V0\.11\.1 \/ R37 WINDOWS BATCH GATE: PASS/);assert.match(closure,/version:'0\.11\.1'/);});