deadbyte-mcp 0.15.44 → 0.15.45

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 (157) hide show
  1. package/MANIFEST.SHA256 +69 -131
  2. package/PROVENANCE.json +257 -243
  3. package/README.txt +18 -18
  4. package/RELEASE.json +348 -334
  5. package/SBOM.cdx.json +2 -2
  6. package/TEST-MATRIX.json +503 -491
  7. package/bridge/package.json +1 -1
  8. package/controller/deadbyte-controller.ps1 +1857 -1769
  9. package/controller/deadbyte-desktop-policy.json +6 -6
  10. package/controller/deadbyte-process-policy.json +4 -4
  11. package/docs/R68-COMPAT-HOST-EXEC-CANDIDATE.md +63 -0
  12. package/docs/R69-LIVE-OUTCOME-R70-POLICY-TRANSFER.md +136 -0
  13. package/docs/R70-CODING-DIGEST-SUPERVISOR-CHECKPOINT-20261013.md +42 -0
  14. package/docs/R70-FINITE-GRANT-OWNER-BOUNDARY-20261013.md +80 -0
  15. package/docs/R70-OWNER-BOOTSTRAP-CHECKPOINT-20261013.md +60 -0
  16. package/docs/R70-REFERENCE-MECHANISMS.json +95 -0
  17. package/docs/R70-TRUST-GUARD-EXPIRY-CHECKPOINT-20261013.md +47 -0
  18. package/package.json +2 -2
  19. package/scripts/benchmark-l0-r71.mjs +76 -0
  20. package/scripts/gate-windows-r71.ps1 +64 -0
  21. package/scripts/npm-release-r48.mjs +2 -0
  22. package/scripts/npm-release-readiness-r71.mjs +21 -0
  23. package/scripts/verify-r70-full-regression.ps1 +72 -0
  24. package/src/authority-continuity-r65.mjs +28 -8
  25. package/src/autonomous-mcp-tools.mjs +1 -1
  26. package/src/autonomous-output-contracts.mjs +4 -1
  27. package/src/autonomous-policy.mjs +54 -7
  28. package/src/capability-ledger.mjs +1 -1
  29. package/src/capability-resolver.mjs +2 -1
  30. package/src/commander-compat-runtime.mjs +30 -2
  31. package/src/deadbyte-cli.mjs +8 -6
  32. package/src/native-diff-v2.mjs +18 -5
  33. package/src/native-diff.mjs +21 -5
  34. package/src/r70-owner-approval.mjs +78 -0
  35. package/src/remote-live-log.mjs +48 -14
  36. package/src/remote-result-journal.mjs +1 -1
  37. package/src/runtime-update.mjs +2051 -1891
  38. package/src/tool-audit.mjs +2 -0
  39. package/src/version.mjs +1 -1
  40. package/test/autonomous-local-supervisor.test.mjs +2 -1
  41. package/test/autonomous-output-contract.test.mjs +17 -1
  42. package/test/autonomous-supervisor-integration.test.mjs +2 -1
  43. package/test/capability-resolver.test.mjs +17 -0
  44. package/test/codex-autonomous-r44.test.mjs +1 -1
  45. package/test/commander-compat-runtime.test.mjs +42 -0
  46. package/test/controller-policy-preflight-r59.test.mjs +1 -0
  47. package/test/native-diff-topology-r36.test.mjs +35 -2
  48. package/test/native-diff.test.mjs +83 -3
  49. package/test/r59-tool-surface-compat.test.mjs +9 -5
  50. package/test/r65-authority-runtime-epoch.test.mjs +9 -1
  51. package/test/r67-isolated-slot-rollback-restore.test.mjs +2 -1
  52. package/test/r67-npm-publish-gate.test.mjs +4 -2
  53. package/test/r67-release-contract.test.mjs +8 -7
  54. package/test/r69-live-outcome.test.mjs +137 -0
  55. package/test/r70-autonomous-grant-expiry.test.mjs +89 -0
  56. package/test/r70-autonomous-policy-bootstrap.test.mjs +166 -0
  57. package/test/r70-controller-autonomous-root.test.mjs +104 -0
  58. package/test/r70-controller-grant-subset.test.mjs +28 -0
  59. package/test/r70-controller-owner-issue-boundary.test.mjs +80 -0
  60. package/test/r70-controller-policy-snapshot.test.mjs +66 -0
  61. package/test/r70-owner-approval.test.mjs +67 -0
  62. package/test/r71-full-verifier-artifact.test.mjs +28 -0
  63. package/test/r71-isolated-slot-rollback-restore.test.mjs +62 -0
  64. package/test/r71-native-diff-mcp-wire.test.mjs +75 -0
  65. package/test/r71-publish-fence.test.mjs +38 -0
  66. package/test/r71-release-identity.test.mjs +31 -0
  67. package/test/remote-result-journal.test.mjs +12 -0
  68. package/test/remote-session-cli.test.mjs +2 -1
  69. package/test/standing-grants.test.mjs +2 -2
  70. package/test/tool-audit.test.mjs +14 -0
  71. package/bin/appcontainer-stage.obj +0 -0
  72. package/bin/bootstrap-advapi32.obj +0 -0
  73. package/bin/bootstrap-exitcode.obj +0 -0
  74. package/bin/bootstrap-kernel32.obj +0 -0
  75. package/bin/child-control-probe.obj +0 -0
  76. package/bin/child-control-stage.obj +0 -0
  77. package/bin/contained-reverse-worker.obj +0 -0
  78. package/bin/contained-transform-worker.obj +0 -0
  79. package/bin/containment-probe.obj +0 -0
  80. package/bin/deadbyte-contain.obj +0 -0
  81. package/bin/deadbyte-desktop-input-r40.obj +0 -0
  82. package/bin/deadbyte-desktop-observer-r40.obj +0 -0
  83. package/bin/deadbyte-desktop-uia-r40.obj +0 -0
  84. package/bin/deadbyte-exec.obj +0 -0
  85. package/bin/deadbyte-hardware-observer-r45.obj +0 -0
  86. package/bin/deadbyte-native-inspect-r67.obj +0 -0
  87. package/bin/deadbyte-process-host.obj +0 -0
  88. package/bin/deadbyte-tunnel-host.obj +0 -0
  89. package/conpty-input-observer.obj +0 -0
  90. package/miniconpty.obj +0 -0
  91. package/proof/CONTAINMENT-BUILD.txt +0 -163
  92. package/proof/MCP-SMOKE-STATUS.txt +0 -9
  93. package/proof/NODE-SYNTAX.txt +0 -4
  94. package/proof/PROOF.txt +0 -6
  95. package/proof/R34-TASK8-SUPERVISOR-CHECKPOINT.json +0 -29
  96. package/proof/R34-TASK9-MCP-SURFACE-CHECKPOINT.json +0 -28
  97. package/proof/SECRET-SCAN.txt +0 -4
  98. package/proof/SOURCE-GATES.txt +0 -16
  99. package/proof/STATUS.txt +0 -11
  100. package/proof/TARGET-V0313-CONTAINMENT-PASS.sha256 +0 -1
  101. package/proof/TARGET-V0313-CONTAINMENT-PASS.txt +0 -215
  102. package/proof/TARGET-V040-CONTAINED-IPC-FAIL.sha256 +0 -1
  103. package/proof/TARGET-V040-CONTAINED-IPC-FAIL.txt +0 -299
  104. package/proof/TARGET-V041-CONTAINED-CREATEPROCESS-203.sha256 +0 -1
  105. package/proof/TARGET-V041-CONTAINED-CREATEPROCESS-203.txt +0 -311
  106. package/proof/TARGET-V042-CONTAINED-CREATEPROCESS-203.sha256 +0 -1
  107. package/proof/TARGET-V042-CONTAINED-CREATEPROCESS-203.txt +0 -313
  108. package/proof/TARGET-V043-CONTAINED-CREATEPROCESS-203.sha256 +0 -1
  109. package/proof/TARGET-V043-CONTAINED-CREATEPROCESS-203.txt +0 -308
  110. package/proof/TARGET-V044-CONTAINED-PASS.sha256 +0 -1
  111. package/proof/TARGET-V044-CONTAINED-PASS.txt +0 -432
  112. package/proof/TARGET-V045-DUAL-OPERATION-PASS.sha256 +0 -1
  113. package/proof/TARGET-V045-DUAL-OPERATION-PASS.txt +0 -481
  114. package/proof/TARGET-V046-FIXED-EXECUTABLE-REGISTRY-PASS.sha256 +0 -1
  115. package/proof/TARGET-V046-FIXED-EXECUTABLE-REGISTRY-PASS.txt +0 -610
  116. package/proof/TARGET-V047-RUNTIME-MANIFEST-PASS.sha256 +0 -1
  117. package/proof/TARGET-V047-RUNTIME-MANIFEST-PASS.txt +0 -642
  118. package/proof/TARGET-V050-BATCH-GATE-PASS.sha256 +0 -1
  119. package/proof/TARGET-V050-BATCH-GATE-PASS.txt +0 -713
  120. package/proof/TESTS.txt +0 -686
  121. package/proof/TRUST-EPHEMERAL.txt +0 -4
  122. package/proof/V03-FREEZE.txt +0 -27
  123. package/proof/V041-IPC-HOTFIX.txt +0 -16
  124. package/proof/V042-ENV-HOTFIX.txt +0 -15
  125. package/proof/V043-DRIVE-CWD-HOTFIX.txt +0 -14
  126. package/proof/V044-LOCALAPPDATA-HOTFIX.txt +0 -18
  127. package/proof/V045-OPERATION-REGISTRY.txt +0 -7
  128. package/proof/V046-WORKER-REGISTRY.txt +0 -12
  129. package/proof/V047-WORKER-MANIFEST.txt +0 -18
  130. package/proof/V050-BATCH-TRUST-CLOSURE.txt +0 -21
  131. package/proof/V060-ACTIVE-NETWORK-AUTHORITY.txt +0 -29
  132. package/proof/V070-NODE-SYNTAX.txt +0 -36
  133. package/proof/V070-NODE-TESTS.txt +0 -752
  134. package/proof/V070-PACK-DRY-RUN.txt +0 -126
  135. package/proof/V070-SOURCE-GATE.txt +0 -30
  136. package/proof/V070-STATIC-SCAN.txt +0 -4
  137. package/proof/V070-WINDOWS-GATE-PENDING.txt +0 -25
  138. package/proof/V071-NODE-SYNTAX.txt +0 -1
  139. package/proof/V071-NODE-TESTS.txt +0 -796
  140. package/proof/V071-PACK-DRY-RUN.json +0 -656
  141. package/proof/V071-SOURCE-GATE.txt +0 -16
  142. package/proof/V071-WINDOWS-GATE-PENDING.txt +0 -24
  143. package/proof/V073-NODE-SYNTAX.txt +0 -4
  144. package/proof/V073-SOURCE-GATE.txt +0 -21
  145. package/proof/V073-STATIC-SCAN.txt +0 -10
  146. package/proof/V073-WINDOWS-GATE-PENDING.txt +0 -5
  147. package/proof/VERIFY.txt +0 -7
  148. package/proof/WINDOWS-CONTAINED-STATUS.txt +0 -5
  149. package/proof/WINDOWS-CONTAINMENT-STATUS.txt +0 -3
  150. package/proof/commander-closure-20260927/CONTINUATION.json +0 -43
  151. package/proof/commander-closure-20260927/RESULT.json +0 -30
  152. package/proof/commander-closure-20260927/SEARCH-CONTINUATION.json +0 -30
  153. package/proof/commander-closure-20260927/XLS-REFERENCE-PROBE.json +0 -13
  154. package/proof/commander-closure-20260928/DIFFERENTIAL-CHECKPOINT.json +0 -122
  155. package/proof/r59-full-regression-current.json +0 -13
  156. package/proof/r59-full-regression-current.stderr.log +0 -0
  157. package/proof/r59-full-regression-current.stdout.log +0 -1268
@@ -0,0 +1,62 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import {createHash} from 'node:crypto';
4
+ import {mkdtemp,mkdir,readFile,rm,writeFile,lstat} from 'node:fs/promises';
5
+ import os from 'node:os';
6
+ import path from 'node:path';
7
+ import {fileURLToPath} from 'node:url';
8
+ import {atomicWriteActivePointer,materializeReleaseSlot,parseActivePointer,parseManifest,renderStableLauncherPs1,verifyManifestTreeExact} from '../src/release-slot.mjs';
9
+
10
+ const candidate=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
11
+ const parent=path.join(os.homedir(),'.deadbyte-mcp','releases','v0.15.44-9f500af433df3e77');
12
+ const parentManifestSha='9f500af433df3e7778d4f11acf418526d5889f478114c955c8c72c0077a0636e';
13
+ const sha=bytes=>createHash('sha256').update(bytes).digest('hex');
14
+
15
+ async function generation(state,label){
16
+ const root=path.join(state,'generations',label);
17
+ await mkdir(root,{recursive:true});
18
+ const config=Buffer.from(`@{ Label = '${label}' }\r\n`,'utf8');
19
+ await writeFile(path.join(root,'controller-config.psd1'),config,{flag:'wx'});
20
+ const manifest=Buffer.from(`${sha(config)} controller-config.psd1\n`,'utf8');
21
+ await writeFile(path.join(root,'GENERATION.SHA256'),manifest,{flag:'wx'});
22
+ return {root,manifest_sha256:sha(manifest),config_path:path.join(root,'controller-config.psd1')};
23
+ }
24
+
25
+ test('R71 isolated immutable slot activates, rolls back exact sealed R70, and restores same R71 bytes with no authority',async()=>{
26
+ const base=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r71-slot-parity-'));
27
+ const state=path.join(base,'state');
28
+ try{
29
+ const parentManifest=await readFile(path.join(parent,'MANIFEST.SHA256'));
30
+ const candidateManifest=await readFile(path.join(candidate,'MANIFEST.SHA256'));
31
+ assert.equal(sha(parentManifest),parentManifestSha);
32
+ const candidateManifestSha=sha(candidateManifest);
33
+ const parentSlot=await materializeReleaseSlot({source:parent,stateRoot:state,version:'0.15.44',manifestSha256:parentManifestSha});
34
+ const candidateSlot=await materializeReleaseSlot({source:candidate,stateRoot:state,version:'0.15.45',manifestSha256:candidateManifestSha});
35
+ const parentGeneration=await generation(state,'r70-parent');
36
+ const candidateGeneration=await generation(state,'r71-candidate');
37
+ const launcherSha=sha(Buffer.from(renderStableLauncherPs1(),'utf8'));
38
+ const pointerPath=path.join(state,'active-release.json');
39
+ const pointer=(slot,version,g)=>({schema:'deadbyte.active-release.v1',release_id:slot.release_id,version,
40
+ manifest_sha256:slot.manifest_sha256,release_root:slot.release_root,generation_root:g.root,
41
+ generation_manifest_sha256:g.manifest_sha256,launcher_sha256:launcherSha,config_path:g.config_path});
42
+
43
+ const activated=await atomicWriteActivePointer(pointerPath,pointer(candidateSlot,'0.15.45',candidateGeneration));
44
+ assert.equal(activated.release_id,candidateSlot.release_id);
45
+ await verifyManifestTreeExact(candidateSlot.release_root,parseManifest(candidateManifest.toString('utf8')));
46
+
47
+ const rolledBack=await atomicWriteActivePointer(pointerPath,pointer(parentSlot,'0.15.44',parentGeneration));
48
+ assert.equal(rolledBack.release_id,parentSlot.release_id);
49
+ assert.equal(rolledBack.manifest_sha256,parentManifestSha);
50
+ await verifyManifestTreeExact(parentSlot.release_root,parseManifest(parentManifest.toString('utf8')));
51
+
52
+ const restored=await atomicWriteActivePointer(pointerPath,pointer(candidateSlot,'0.15.45',candidateGeneration));
53
+ assert.deepEqual(restored,activated);
54
+ assert.deepEqual(parseActivePointer(await readFile(pointerPath,'utf8')),activated);
55
+ await verifyManifestTreeExact(candidateSlot.release_root,parseManifest(candidateManifest.toString('utf8')));
56
+ for(const name of ['process-grant.json','coding-grant.json','autonomous-grant.json','desktop-grant.json','host-grant.json']){
57
+ await assert.rejects(()=>lstat(path.join(state,'runtime',name)),{code:'ENOENT'});
58
+ }
59
+ }finally{
60
+ await rm(base,{recursive:true,force:true});
61
+ }
62
+ });
@@ -0,0 +1,75 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import {createHash,randomBytes} from 'node:crypto';
4
+ import {access,mkdtemp,mkdir,readFile,rm,writeFile} from 'node:fs/promises';
5
+ import os from 'node:os';
6
+ import path from 'node:path';
7
+ import {fileURLToPath} from 'node:url';
8
+ import {Client} from '@modelcontextprotocol/client';
9
+ import {StdioClientTransport,getDefaultEnvironment} from '@modelcontextprotocol/client/stdio';
10
+ import {generateTrustKeypair} from '../src/trust.mjs';
11
+
12
+ const root=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
13
+ const sha=bytes=>createHash('sha256').update(bytes).digest('hex');
14
+ const exists=file=>access(file).then(()=>true,()=>false);
15
+
16
+ test('R71 compact MCP tools/list and tools/call permit Coding-read preview without Autonomous apply authority',
17
+ {timeout:30_000},async()=>{
18
+ const state=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r71-native-wire-'));
19
+ const project=path.join(state,'project');
20
+ const trust=path.join(state,'trust');
21
+ await mkdir(project);await mkdir(trust);
22
+ const keys=await generateTrustKeypair({privateKeyPath:path.join(trust,'private.pem'),
23
+ publicKeyPath:path.join(trust,'public.pem')});
24
+ const target=path.join(project,'candidate.txt');
25
+ await writeFile(target,'before\n');
26
+ const before=sha(await readFile(target));
27
+ const codingPath=path.join(state,'coding-policy.json');
28
+ const codingLease=path.join(state,'coding-lease.json');
29
+ await writeFile(codingPath,JSON.stringify({schema:'deadbyte.coding-policy.v1',enabled:true,
30
+ lease_file:codingLease,evidence_dir:path.join(state,'coding-evidence'),
31
+ roots:{project:{path:project,read:true,write:true,exec:false,deny_paths:[]}},commands:{}}));
32
+ await writeFile(codingLease,JSON.stringify({schema:'deadbyte.coding-lease.v1',
33
+ policy_sha256:sha(await readFile(codingPath)),instance_nonce:randomBytes(32).toString('hex'),
34
+ root_ids:['project'],armed_at_utc:new Date().toISOString(),
35
+ expires_at_utc:new Date(Date.now()+60_000).toISOString()}));
36
+ const autonomousPath=path.join(state,'autonomous-policy.json');
37
+ await writeFile(autonomousPath,JSON.stringify({schema:'deadbyte.autonomous-policy.v1',enabled:true,
38
+ lease_file:path.join(state,'autonomous-lease.json'),evidence_dir:path.join(state,'autonomous-evidence'),
39
+ root_ids:['project'],coding_policy_sha256:sha(await readFile(codingPath)),
40
+ planner:{backend:'client_sampling',max_tokens:2048},profiles:{},limits:{max_files_per_diff:8}}));
41
+ const client=new Client({name:'deadbyte-r71-native-wire',version:'0.15.45'},
42
+ {versionNegotiation:{mode:{pin:'2026-07-28'}}});
43
+ const transport=new StdioClientTransport({command:process.execPath,
44
+ args:[path.join(root,'src','mcp-server.mjs')],cwd:root,
45
+ env:{...getDefaultEnvironment(),DEADBYTE_STATE_ROOT:state,DEADBYTE_CAPABILITY_PROFILE:'compact',
46
+ DEADBYTE_SIGNING_KEY:keys.privateKeyPath,DEADBYTE_VERIFY_KEY:keys.publicKeyPath,
47
+ DEADBYTE_PRIVILEGED_POLICY:'',DEADBYTE_CODING_RUNTIME:'1',DEADBYTE_CODING_POLICY:codingPath,
48
+ DEADBYTE_AUTONOMOUS_RUNTIME:'1',DEADBYTE_AUTONOMOUS_POLICY:autonomousPath},stderr:'pipe'});
49
+ try{
50
+ await client.connect(transport);
51
+ const tools=(await client.listTools()).tools;
52
+ const preview=tools.find(tool=>tool.name==='native_diff_preview');
53
+ assert.ok(preview,'compact catalog must expose native_diff_preview');
54
+ assert.match(preview.description,/Coding read authority/i);
55
+ assert.equal(preview.outputSchema?.additionalProperties,false);
56
+ const request={root_id:'project',title:'read only wire proof',operations:[
57
+ {kind:'replace',path:'candidate.txt',expected_sha256:before,old_string:'before',
58
+ new_string:'after',expected_replacements:1}]};
59
+ const accepted=await client.callTool({name:'native_diff_preview',arguments:request});
60
+ assert.equal(accepted.isError,false);
61
+ assert.equal(accepted.structuredContent.status,'preview_only');
62
+ assert.equal(accepted.structuredContent.diff_id,undefined);
63
+ assert.equal(sha(await readFile(target)),before);
64
+ assert.equal(await exists(path.join(state,'autonomous-evidence','native-diffs')),false);
65
+ const denied=await client.callTool({name:'native_diff_preview',arguments:{...request,root_id:'outside'}});
66
+ assert.equal(denied.isError,true);
67
+ await rm(codingLease);
68
+ const revoked=await client.callTool({name:'native_diff_preview',arguments:request});
69
+ assert.equal(revoked.isError,true);
70
+ assert.equal(sha(await readFile(target)),before);
71
+ }finally{
72
+ await client.close().catch(()=>{});
73
+ await rm(state,{recursive:true,force:true});
74
+ }
75
+ });
@@ -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 {assertR71NpmPublishReady} from '../scripts/npm-release-readiness-r71.mjs';
5
+
6
+ test('R71 publish script enforces successor metadata before packing or dispatch',async()=>{
7
+ const source=await readFile(new URL('../scripts/npm-release-r48.mjs',import.meta.url),'utf8');
8
+ const guard=source.indexOf('assertR71NpmPublishReady(release)');
9
+ const pack=source.indexOf("'pack', '--json'");
10
+ const submit=source.indexOf("'publish',publishTarball");
11
+ assert.ok(guard>0&&guard<pack&&guard<submit,'R71 release fence must precede pack and publish');
12
+ });
13
+
14
+ test('R71 publication stays blocked while candidate gates are pending',async()=>{
15
+ const release=JSON.parse(await readFile(new URL('../RELEASE.json',import.meta.url),'utf8'));
16
+ assert.throws(()=>assertR71NpmPublishReady(release),/PUBLISH_BLOCKED/);
17
+ });
18
+
19
+ test('R71 fence accepts only the exact sealed parent and complete independently verified gate vector',()=>{
20
+ const release={version:'0.15.45',train:'R71',parent:{
21
+ release_id:'v0.15.44-9f500af433df3e77',
22
+ manifest_sha256:'9f500af433df3e7778d4f11acf418526d5889f478114c955c8c72c0077a0636e',
23
+ generation_manifest_sha256:'c35f6ccca58083acd53484a983ef401ee18f28b11185cd02c7b1eb3e29028c71'},
24
+ r71_candidate:{status:'CANDIDATE_SEALED',full_regression:'PASS',manifest:'PASS',
25
+ windows_gate:'PASS',hot_swap:'PASS',package_acceptance:'PASS',
26
+ local_coding_preview:'PASS_CODING_READ_ONLY_NO_AUTONOMOUS_APPLY',
27
+ public_catalog:'PASS_43_TOOLS',signed_public_mcp:'PASS',performance_l0:'PASS',
28
+ owner_independent_project_grant:'DISABLED_FAIL_CLOSED_NO_OWNER_ENROLLMENT'}};
29
+ assert.doesNotThrow(()=>assertR71NpmPublishReady(release));
30
+ for(const key of Object.keys(release.r71_candidate)){
31
+ const altered=structuredClone(release);
32
+ altered.r71_candidate[key]='PENDING';
33
+ assert.throws(()=>assertR71NpmPublishReady(altered),/PUBLISH_BLOCKED/);
34
+ }
35
+ const wrongParent=structuredClone(release);
36
+ wrongParent.parent.manifest_sha256='0'.repeat(64);
37
+ assert.throws(()=>assertR71NpmPublishReady(wrongParent),/PUBLISH_BLOCKED/);
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
+
5
+ const json=async rel=>JSON.parse(await readFile(new URL('../'+rel,import.meta.url),'utf8'));
6
+ const parent={release_id:'v0.15.44-9f500af433df3e77',
7
+ manifest_sha256:'9f500af433df3e7778d4f11acf418526d5889f478114c955c8c72c0077a0636e',
8
+ generation_manifest_sha256:'c35f6ccca58083acd53484a983ef401ee18f28b11185cd02c7b1eb3e29028c71'};
9
+
10
+ test('R71 current source, package, bridge, provenance and Windows gate bind exact predecessor',async()=>{
11
+ const [pkg,lock,bridge,release,provenance,matrix,sbom,version]=await Promise.all([
12
+ json('package.json'),json('package-lock.json'),json('bridge/package.json'),json('RELEASE.json'),
13
+ json('PROVENANCE.json'),json('TEST-MATRIX.json'),json('SBOM.cdx.json'),
14
+ readFile(new URL('../src/version.mjs',import.meta.url),'utf8')]);
15
+ for(const observed of [pkg.version,lock.version,lock.packages[''].version,bridge.version,
16
+ release.version,provenance.version,matrix.version,sbom.metadata.component.version]){
17
+ assert.equal(observed,'0.15.45');
18
+ }
19
+ assert.match(version,/DEADBYTE_VERSION = '0\.15\.45'/);
20
+ assert.equal(release.train,'R71');
21
+ assert.equal(matrix.train,'R71');
22
+ assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r71:0.15.45');
23
+ assert.deepEqual(release.runtime_predecessor,parent);
24
+ assert.equal(release.parent.release_id,parent.release_id);
25
+ assert.equal(release.parent.manifest_sha256,parent.manifest_sha256);
26
+ assert.equal(release.parent.generation_manifest_sha256,parent.generation_manifest_sha256);
27
+ assert.equal(provenance.parent_release_id,parent.release_id);
28
+ assert.equal(provenance.parent_manifest_sha256,parent.manifest_sha256);
29
+ assert.equal(provenance.parent_generation_manifest_sha256,parent.generation_manifest_sha256);
30
+ assert.match(pkg.scripts['gate:windows'],/gate-windows-r71\.ps1/);
31
+ });
@@ -71,3 +71,15 @@ test('remote result journal preserves explicit unknown side-effect state across
71
71
  await assert.rejects(journal.recordTerminal({...item('req-invalid',H('5'),'error'),side_effect_state:'committed'}),/side_effect_state invalid/);
72
72
  }finally{await rm(root,{recursive:true,force:true});}
73
73
  });
74
+
75
+ test('R69 replay retains an input-required result as pending, never ok',async()=>{
76
+ const root=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r69-remote-pending-'));
77
+ try{
78
+ const file=path.join(root,'journal.json');
79
+ let journal=await openRemoteResultJournal({filePath:file,sessionId:session,maxEntries:8});
80
+ await journal.recordTerminal(item('req-input',H('6'),'pending'));
81
+ journal=await openRemoteResultJournal({filePath:file,sessionId:session,maxEntries:8});
82
+ const replay=await journal.replayAfter('r1:'+session+':0',{limit:8});
83
+ assert.equal(replay.events[0].status,'pending');
84
+ }finally{await rm(root,{recursive:true,force:true});}
85
+ });
@@ -273,7 +273,8 @@ winTest('bare remote uses one unified live timeline, keeps authority semantics,
273
273
  assert.deepEqual(ready.slice(0,8),['status','start','status','status','armprocess','armcoding','armautonomous','status']);
274
274
  assert.equal(child.exitCode,null,'remote session must remain foreground after becoming ready');
275
275
  const tailDeadline=Date.now()+3000;
276
- while(Date.now()<tailDeadline&&!/\[AUTH\] process ARMED \| coding ARMED \| autonomous ARMED \| desktop DISARMED \| host DISARMED/.test(output.stdout)) await sleep(50);
276
+ while(Date.now()<tailDeadline&&(!/\[AUTH\] process ARMED \| coding ARMED \| autonomous ARMED \| desktop DISARMED \| host DISARMED/.test(output.stdout)||
277
+ !/\[READY\] DEADBYTE MCP online/.test(output.stdout))) await sleep(50);
277
278
  assert.match(output.stdout,/\[DISPLAY\] ASCII fallback: stdout_not_tty/);
278
279
  assert.match(output.stdout,/\[DEVICE\] Starting DEADBYTE MCP/);
279
280
  assert.match(output.stdout,/\[BRIDGE\] Local bridge connected/);
@@ -85,13 +85,13 @@ test('host standing grant remains armed until explicit revocation', async () =>
85
85
  assert.equal(status.remaining_ms, null);
86
86
  });
87
87
 
88
- test('controller emits standing grants and hides expiry UX', async () => {
88
+ test('controller retains coding/host standing grants but issues bounded autonomous expiry', async () => {
89
89
  const controller = await import('node:fs/promises').then(fs => fs.readFile(
90
90
  new URL('../controller/deadbyte-controller.ps1', import.meta.url), 'utf8'));
91
91
  assert.match(controller, /deadbyte\.host-grant\.v2/);
92
92
  assert.match(controller, /deadbyte\.coding-grant\.v2/);
93
93
  assert.match(controller, /deadbyte\.autonomous-grant\.v2/);
94
- assert.doesNotMatch(controller, /expires_at_utc/);
94
+ assert.match(controller, /expires_at_utc=\$now\.AddHours\(1\)\.ToString\('o'\)/);
95
95
  assert.doesNotMatch(controller, /AddMinutes\((?:15|30|60)\)/);
96
96
  assert.doesNotMatch(controller, /expires=/);
97
97
  });
@@ -71,6 +71,20 @@ test('tool wrapper durably records request before handler and writes correlated
71
71
  }finally{await rm(root,{recursive:true,force:true});}
72
72
  });
73
73
 
74
+ test('R69 audit retains explicit unknown side effect even when a tool envelope says ok',async()=>{
75
+ const root=await temp();
76
+ try{
77
+ const k=await keys(root);
78
+ const audit=await createToolAudit({stateRoot:root,signingKeyPath:k.privateKeyPath,contextProvider:async()=>context()});
79
+ const server=fakeServer();installToolAudit(server,audit);
80
+ server.registerTool('uncertain_write',{},async()=>({isError:false,
81
+ structuredContent:{status:'ok',side_effect_state:'unknown'}}));
82
+ await server.handlers.get('uncertain_write')({path:'scratch.txt'});
83
+ const all=await events(root);
84
+ assert.equal(all.at(-1).outcome.side_effect_state,'unknown');
85
+ }finally{await rm(root,{recursive:true,force:true});}
86
+ });
87
+
74
88
  test('audit failure before request commit prevents handler side effects',async()=>{
75
89
  const server=fakeServer();let sideEffect=false;
76
90
  installToolAudit(server,{async recordRequest(){throw new Error('audit unavailable');},async recordResult(){throw new Error('unexpected');}});
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/miniconpty.obj DELETED
Binary file
@@ -1,163 +0,0 @@
1
- ==== launcher ====
2
- deadbyte-contain.cpp
3
- exit_code=0
4
- ==== probe ====
5
- containment-probe.cpp
6
- exit_code=0
7
- ==== bootstrap-kernel32 ====
8
- bootstrap-kernel32.cpp
9
- exit_code=0
10
- ==== bootstrap-advapi32 ====
11
- bootstrap-advapi32.cpp
12
- exit_code=0
13
- ==== construction-launcher ====
14
- appcontainer-stage.cpp
15
- exit_code=0
16
- ==== bootstrap-exitcode ====
17
- bootstrap-exitcode.cpp
18
- exit_code=0
19
- ==== child-control-launcher ====
20
- child-control-stage.cpp
21
- exit_code=0
22
- ==== child-control-probe ====
23
- child-control-probe.cpp
24
- exit_code=0
25
- ==== contained-launcher ====
26
- deadbyte-exec.cpp
27
- exit_code=0
28
- ==== contained-worker ====
29
- contained-transform-worker.cpp
30
- exit_code=0
31
- ==== contained-reverse-worker ====
32
- contained-reverse-worker.cpp
33
- exit_code=0
34
- ==== named-tunnel-host ====
35
- deadbyte-tunnel-host.cpp
36
- exit_code=0
37
- ==== process-host ====
38
- deadbyte-process-host.cpp
39
- exit_code=0
40
- ==== probe-dependencies ====
41
-
42
- Dump of file D:\Projects\deadbyte-mcp\development\deadbyte-mcp-0.15.44-r67\bin\containment-probe.exe
43
-
44
- File Type: EXECUTABLE IMAGE
45
-
46
- Image has the following dependencies:
47
-
48
- ADVAPI32.dll
49
- KERNEL32.dll
50
-
51
- Summary
52
-
53
- 2000 .data
54
- 1000 .fptable
55
- 2000 .pdata
56
- E000 .rdata
57
- 1000 .reloc
58
- 19000 .text
59
- exit_code=0
60
- ==== contained-launcher-dependencies ====
61
-
62
- Dump of file D:\Projects\deadbyte-mcp\development\deadbyte-mcp-0.15.44-r67\bin\deadbyte-exec.exe
63
-
64
- File Type: EXECUTABLE IMAGE
65
-
66
- Image has the following dependencies:
67
-
68
- USERENV.dll
69
- ADVAPI32.dll
70
- ole32.dll
71
- bcrypt.dll
72
- WS2_32.dll
73
- KERNEL32.dll
74
-
75
- Summary
76
-
77
- 3000 .data
78
- 1000 .fptable
79
- 3000 .pdata
80
- 17000 .rdata
81
- 1000 .reloc
82
- 3B000 .text
83
- exit_code=0
84
- ==== contained-worker-dependencies ====
85
-
86
- Dump of file D:\Projects\deadbyte-mcp\development\deadbyte-mcp-0.15.44-r67\bin\contained-transform-worker.exe
87
-
88
- File Type: EXECUTABLE IMAGE
89
-
90
- Image has the following dependencies:
91
-
92
- ADVAPI32.dll
93
- WS2_32.dll
94
- KERNEL32.dll
95
-
96
- Summary
97
-
98
- 2000 .data
99
- 1000 .fptable
100
- 2000 .pdata
101
- F000 .rdata
102
- 1000 .reloc
103
- 19000 .text
104
- exit_code=0
105
- ==== contained-reverse-worker-dependencies ====
106
-
107
- Dump of file D:\Projects\deadbyte-mcp\development\deadbyte-mcp-0.15.44-r67\bin\contained-reverse-worker.exe
108
-
109
- File Type: EXECUTABLE IMAGE
110
-
111
- Image has the following dependencies:
112
-
113
- ADVAPI32.dll
114
- WS2_32.dll
115
- KERNEL32.dll
116
-
117
- Summary
118
-
119
- 2000 .data
120
- 1000 .fptable
121
- 2000 .pdata
122
- F000 .rdata
123
- 1000 .reloc
124
- 19000 .text
125
- exit_code=0
126
- ==== named-tunnel-host-dependencies ====
127
-
128
- Dump of file D:\Projects\deadbyte-mcp\development\deadbyte-mcp-0.15.44-r67\bin\deadbyte-tunnel-host.exe
129
-
130
- File Type: EXECUTABLE IMAGE
131
-
132
- Image has the following dependencies:
133
-
134
- KERNEL32.dll
135
-
136
- Summary
137
-
138
- 2000 .data
139
- 1000 .fptable
140
- 2000 .pdata
141
- C000 .rdata
142
- 1000 .reloc
143
- 18000 .text
144
- exit_code=0
145
- ==== process-host-dependencies ====
146
-
147
- Dump of file D:\Projects\deadbyte-mcp\development\deadbyte-mcp-0.15.44-r67\bin\deadbyte-process-host.exe
148
-
149
- File Type: EXECUTABLE IMAGE
150
-
151
- Image has the following dependencies:
152
-
153
- KERNEL32.dll
154
-
155
- Summary
156
-
157
- 2000 .data
158
- 1000 .fptable
159
- 2000 .pdata
160
- F000 .rdata
161
- 1000 .reloc
162
- 1C000 .text
163
- exit_code=0
@@ -1,9 +0,0 @@
1
- DEADBYTE MCP V0.6.0 MCP LIVE SMOKE
2
- STATUS=PASS
3
- PROTOCOL_REVISION=2026-07-28
4
- PROTOCOL_ERA=modern
5
- TOOLS=contained_transform,evidence_verify,file_read,proof_execute,workspace_open
6
- SIGNATURE_ALGORITHM=ed25519
7
- SIGNATURE_VALID=true
8
- INDEPENDENT_VERIFY=true
9
- OUTPUT_SHA256=72562501a654ddbb4f8810f8ba9017d02b29516853101456445e7642988fbd1b
@@ -1,4 +0,0 @@
1
- DEADBYTE_MCP_VERSION=0.7.3
2
- NODE_SYNTAX_FILES=44
3
- NODE_SYNTAX_PASS=44
4
- NODE_SYNTAX_FAIL=0
package/proof/PROOF.txt DELETED
@@ -1,6 +0,0 @@
1
- DEADBYTE MCP V0.6.0 SIGNED PROOF REGRESSION
2
- STATUS=PASS
3
- RECEIPT_SHA256=5bc4f1ace478b79fc491811888b039ebffb72d09f7cd51f520f6569a0cc3d0d4
4
- KEY_ID=64ee8445e138c19a2049dc4242924d056f2b62913ed65364916413eb684a946e
5
- SIGNATURE_ALGORITHM=ed25519
6
- OUTPUT_SHA256=72562501a654ddbb4f8810f8ba9017d02b29516853101456445e7642988fbd1b
@@ -1,29 +0,0 @@
1
- {
2
- "schema": "deadbyte.r34.task8-checkpoint.v1",
3
- "task": 8,
4
- "status": "passed",
5
- "workspace": "D:\\Projects\\deadbyte-mcp-r34-loop-engine",
6
- "node_executable_sha256": "9a4eb5f1c29c6a2e93852ead46b999e284a6a5ca8bab4d4e241d587d025a52de",
7
- "sources": {
8
- "src/autonomous-local-supervisor.mjs": "ab0158c3f6e270ee367ae96455dd2b75a902c808b2a10ac2c5b75fdda00be6c3",
9
- "src/autonomous-supervisor.mjs": "8ea06b5941de9b346ab4e97ff6ed236964b864fbe725602baee3a54dd74527c0",
10
- "src/autonomous-supervisor-host.mjs": "335022086ef41e6cc9853468d928acc864deab8009383dc22518a6ec7e749fa1",
11
- "src/deadbyte-cli.mjs": "0b0d41a51559502a6ff377a4f74e6f80ea77d37002a700e04bd7c4dd3f226b42",
12
- "controller/deadbyte-controller.ps1": "279dfe20345193ca229cc442b25796f12d4c8ec9f9d3e2d26a607a7342b96a5a",
13
- "controller/deadbyte-controller.config.psd1.example": "f20a5bf0df576dbdd32af657640b26c5c50c39dce0b465b7488c218917c729f7"
14
- },
15
- "regression": {
16
- "tests": 40,
17
- "passed": 40,
18
- "failed": 0,
19
- "receipt_id": "473fb1f0f7e6a2dec1ea9d80",
20
- "receipt_sha256": "255e3679051eff46ae745b16f07d6a3c40f87e42259ac651ef286c9d876ceae2",
21
- "receipt_signature_valid": true,
22
- "marker": "TASK8_REGRESSION=PASS"
23
- },
24
- "authority_contract": {
25
- "self_arm": false,
26
- "recovery_operations": ["resume","disarmautonomous","disarmcoding","disarmprocess","disarmhost","status"],
27
- "final_required": "ONLINE + process/coding/autonomous/host DISARMED"
28
- }
29
- }
@@ -1,28 +0,0 @@
1
- {
2
- "schema": "deadbyte.r34-task9-checkpoint.v1",
3
- "status": "passed",
4
- "workspace": "D:\\Projects\\deadbyte-mcp-r34-loop-engine",
5
- "public_tool_count": 68,
6
- "public_tool_unique_count": 68,
7
- "public_tool_catalog_sha256": "bb7c08e116178e3da4b577b591f7058eb6caf7632358e765d28ccb20b2e36f45",
8
- "mcp_server_sha256": "5a6cd82c332e4cef30c4ccfeb12f8cb3634cb6c92104931768b42ba6a84b62b3",
9
- "controller_sha256": "cf8ab26a7481801da07c5c0a842df4ce1279854ed67781f967e5412da5c2aa3d",
10
- "supervisor_integration_test_sha256": "127e170995460daabab88860f20f1b4c2416839e018df0e1cda23b58d032beab",
11
- "exact_surface_gate": {
12
- "tests": 19,
13
- "pass": 19,
14
- "fail": 0,
15
- "receipt_id": "dc0b7e9c6c9e340c037bc54a",
16
- "receipt_sha256": "f6b8ac9b6d499d51f60c7f8053a2e591e09654cdfe5bf69c449b15d133e48506"
17
- },
18
- "catalog_observation": {
19
- "receipt_id": "7dd6df7d9b575e786101d1d0",
20
- "receipt_sha256": "226e0861c01cb485ef94b91c1562a3cb70123698b9a52bb62ba883940be940cf"
21
- },
22
- "supervision": {
23
- "in_process_compatibility": true,
24
- "external_owner_mode": true,
25
- "bridge_external_mode_does_not_execute_goal": true,
26
- "standalone_host_advances_durable_goal": true
27
- }
28
- }
@@ -1,4 +0,0 @@
1
- DEADBYTE_MCP_VERSION=0.7.3
2
- RESULT=PASS
3
- No private-key material, MCP secret path literal, node_modules, shell:true, broad taskkill-by-image, or Stop-Process -Name occurs in the source package.
4
- The tunnel stdio compatibility adapter imports no child_process API and performs no file write.
@@ -1,16 +0,0 @@
1
- DEADBYTE MCP V0.7.3 SOURCE/ADVERSARIAL GATES
2
- TESTS=142
3
- PASS=142
4
- FAIL=0
5
- TUNNEL_STDIO_COMPAT_TESTS=10_10_PASS
6
- NODE_SYNTAX=PASS_44_44
7
- PROTOCOL_REVISION=2026-07-28
8
- STRICT_SDK_LEGACY_POLICY=reject
9
- TUNNEL_STARTUP_PROBE_COMPAT=SOURCE_PASS_TARGET_PENDING
10
- LEGACY_CAPABILITY_TRANSLATION=NONE
11
- SIGNED_PROOF_REGRESSION=PASS
12
- INDEPENDENT_VERIFIER_REGRESSION=PASS
13
- ACTIVE_NETWORK_SOURCE_GATES=PASS
14
- EXECUTION_AUTHORITY_SOURCE_GATES=PASS
15
- PRIVILEGED_HOST_PLANE_SOURCE_GATES=PASS
16
- WINDOWS_NATIVE_BATCH_GATE=PENDING_TARGET
package/proof/STATUS.txt DELETED
@@ -1,11 +0,0 @@
1
- DEADBYTE MCP V0.7.3
2
- SOURCE_TESTS=PASS_142_142
3
- TUNNEL_STDIO_COMPAT=SOURCE_PASS_TARGET_PENDING
4
- MCP_PROTOCOL=2026-07-28
5
- STRICT_CORE_LEGACY=REJECT
6
- LEGACY_STARTUP_PROBE_ADAPTER=OPTIONAL_NARROW_PREFILTER
7
- LEGACY_CAPABILITY_TRANSLATION=NONE
8
- PRIVILEGED_HOST_PLANE=LOCAL_POLICY_PLUS_EXPIRING_ARM_LEASE
9
- GENERAL_UNBOUNDED_COMMAND_EXECUTION=NOT_EXPOSED
10
- WINDOWS_BATCH_GATE=PENDING_TARGET
11
- PUBLIC_TUNNEL_GATE=PENDING_TARGET
@@ -1 +0,0 @@
1
- e6a8f91b62b5fdb861ee039ae05a9c3572535d16608297ec75c6440e5ea6d20d TARGET-V0313-CONTAINMENT-PASS.txt