deadbyte-mcp 0.15.22 → 0.15.24

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 (59) hide show
  1. package/MANIFEST.SHA256 +58 -36
  2. package/PROVENANCE.json +11 -10
  3. package/README.txt +18 -7
  4. package/RELEASE.json +26 -39
  5. package/SBOM.cdx.json +3 -3
  6. package/TEST-MATRIX.json +32 -86
  7. package/package.json +4 -3
  8. package/proof/commander-closure-20260928/DIFFERENTIAL-CHECKPOINT.json +111 -0
  9. package/scripts/activate-skill-creator-1.1.1.mjs +46 -0
  10. package/scripts/build-advanced-pcb-skill.mjs +208 -0
  11. package/scripts/commander-real-performance-benchmark-r47.mjs +12 -3
  12. package/scripts/diagnose-skill-tree.mjs +8 -0
  13. package/scripts/npm-release-r48.mjs +252 -0
  14. package/scripts/pcb-skill-src-SKILL.md.txt +67 -0
  15. package/scripts/pcb-skill-src-bringup-evidence.md.txt +22 -0
  16. package/scripts/pcb-skill-src-constraint-model.md.txt +17 -0
  17. package/scripts/pcb-skill-src-emc-mechanical-dfm.md.txt +17 -0
  18. package/scripts/pcb-skill-src-high-speed-layout.md.txt +27 -0
  19. package/scripts/pcb-skill-src-kicad-native.md.txt +30 -0
  20. package/scripts/pcb-skill-src-kicad_pcb_probe.py.txt +159 -0
  21. package/scripts/pcb-skill-src-pcb_constraint_gate.py.txt +76 -0
  22. package/scripts/pcb-skill-src-power-integrity.md.txt +15 -0
  23. package/scripts/prepare-skill-creator-1.1.1.mjs +113 -0
  24. package/scripts/test-skill-creator-semver-matrix.mjs +30 -0
  25. package/scripts/test-skill-creator-semver.mjs +22 -0
  26. package/src/atomic-mutation.mjs +12 -4
  27. package/src/coding-mcp-tools.mjs +15 -1
  28. package/src/coding-output-contracts.mjs +9 -3
  29. package/src/commander-office-reader-r48.mjs +36 -3
  30. package/src/commander-pdf-r48.mjs +36 -1
  31. package/src/commander-wire-adapter-r47.mjs +56 -2
  32. package/src/deadbyte-cli.mjs +70 -15
  33. package/src/host-plane.mjs +10 -31
  34. package/src/machine-fs-mcp-tools.mjs +7 -1
  35. package/src/machine-fs-output-contracts.mjs +6 -0
  36. package/src/mcp-server.mjs +14 -2
  37. package/src/output-contracts.mjs +6 -4
  38. package/src/remote-live-log.mjs +189 -35
  39. package/src/stdio-protocol-guard.mjs +71 -0
  40. package/src/tool-audit.mjs +1 -1
  41. package/src/version.mjs +1 -1
  42. package/test/atomic-mutation.test.mjs +61 -0
  43. package/test/coding-mcp-unknown-effect.test.mjs +42 -0
  44. package/test/commander-biff-reference-r48.test.mjs +38 -0
  45. package/test/commander-core-bridge-r47.test.mjs +19 -0
  46. package/test/commander-office-reader-r48.test.mjs +18 -2
  47. package/test/commander-pdf-r48.test.mjs +35 -0
  48. package/test/commander-protocol-adversarial-r48.test.mjs +166 -0
  49. package/test/commander-real-parity-r47.test.mjs +37 -3
  50. package/test/commander-schema-differential-r48.test.mjs +1 -1
  51. package/test/commander-wire-contract-r47.test.mjs +32 -0
  52. package/test/full-max-catalog-r48.test.mjs +1 -1
  53. package/test/machine-fs-mcp-tools.test.mjs +12 -0
  54. package/test/output-schema.test.mjs +20 -1
  55. package/test/r48-release-contract.test.mjs +27 -21
  56. package/test/remote-live-log-r37.test.mjs +106 -7
  57. package/test/remote-session-cli.test.mjs +40 -0
  58. package/test/tool-audit.test.mjs +17 -0
  59. package/test/tunnel-stdio-compat.test.mjs +3 -1
@@ -49,3 +49,15 @@ test('R31 machine filesystem schemas expose root-relative IDs/preconditions only
49
49
  assert.equal(move.safeParse({ root_id:'core', source_path:'a', destination_path:'b', pid:1234, expected_source_identity:hex('a') }).success, false);
50
50
  assert.equal(del.safeParse({ root_id:'core', path:'a', expected_source_identity:hex('a') }).success, true);
51
51
  });
52
+
53
+ test('post-effect mutation uncertainty survives the public structured error boundary',async()=>{
54
+ const server=new FakeServer(),fake=runtime();
55
+ fake.write=async()=>{const error=new Error('post-commit verifier lost');error.outcome='FAILED_AFTER_UNKNOWN_EFFECT';error.side_effect_state='unknown';error.expected_after_sha256=hex('e');throw error;};
56
+ registerMachineFsTools(server,{runtime:fake});
57
+ const result=await server.tools.get('machine_fs_write').handler({root_id:'core',path:'a.txt',content:'x',encoding:'utf8',expected_sha256:'absent'});
58
+ assert.equal(result.isError,true);
59
+ assert.equal(result.structuredContent.status,'failed');
60
+ assert.equal(result.structuredContent.outcome,'FAILED_AFTER_UNKNOWN_EFFECT');
61
+ assert.equal(result.structuredContent.side_effect_state,'unknown');
62
+ assert.equal(result.structuredContent.expected_after_sha256,hex('e'));
63
+ });
@@ -7,7 +7,7 @@ import { fileURLToPath } from 'node:url';
7
7
  import { Client } from '@modelcontextprotocol/client';
8
8
  import { StdioClientTransport, getDefaultEnvironment } from '@modelcontextprotocol/client/stdio';
9
9
  import { generateTrustKeypair } from '../src/trust.mjs';
10
- import { structuredToolResult, workspaceOpenOutputSchema } from '../src/output-contracts.mjs';
10
+ import { hostFileWriteOutputSchema, structuredToolResult, workspaceOpenOutputSchema } from '../src/output-contracts.mjs';
11
11
 
12
12
  const here = path.dirname(fileURLToPath(import.meta.url));
13
13
  const repoRoot = path.resolve(here, '..');
@@ -85,3 +85,22 @@ test('DEADBYTE validates structured output locally even on isError paths', () =>
85
85
  /DEADBYTE output contract violation/
86
86
  );
87
87
  });
88
+
89
+ test('host mutation contract preserves explicit post-effect uncertainty', () => {
90
+ const expected = 'a'.repeat(64);
91
+ const parsed = hostFileWriteOutputSchema.parse({
92
+ status: 'failed',
93
+ error: 'post-commit observation failed',
94
+ outcome: 'FAILED_AFTER_UNKNOWN_EFFECT',
95
+ side_effect_state: 'unknown',
96
+ expected_after_sha256: expected
97
+ });
98
+ assert.equal(parsed.expected_after_sha256, expected);
99
+ assert.throws(() => hostFileWriteOutputSchema.parse({
100
+ status: 'failed',
101
+ error: 'post-commit observation failed',
102
+ outcome: 'FAILED_AFTER_UNKNOWN_EFFECT',
103
+ side_effect_state: 'unknown',
104
+ expected_after_sha256: 'not-a-hash'
105
+ }));
106
+ });
@@ -6,37 +6,43 @@ import { DEADBYTE_VERSION } from '../src/version.mjs';
6
6
  const root=new URL('../',import.meta.url);
7
7
  const read=rel=>readFile(new URL(rel,root),'utf8');
8
8
 
9
- test('R48 0.15.22 successor binds active 0.15.21 parent and native Windows observation release evidence',async()=>{
10
- const [pkg,lock,release,provenance]=await Promise.all([
9
+ test('R48 0.15.24 successor binds exact active 0.15.23 parent and Commander differential evidence',async()=>{
10
+ const [pkg,lock,release,provenance,matrix]=await Promise.all([
11
11
  read('package.json').then(JSON.parse),
12
12
  read('package-lock.json').then(JSON.parse),
13
13
  read('RELEASE.json').then(JSON.parse),
14
- read('PROVENANCE.json').then(JSON.parse)
14
+ read('PROVENANCE.json').then(JSON.parse),
15
+ read('TEST-MATRIX.json').then(JSON.parse)
15
16
  ]);
16
- assert.equal(pkg.version,'0.15.22');
17
- assert.equal(lock.version,'0.15.22');
18
- assert.equal(lock.packages[''].version,'0.15.22');
19
- assert.equal(DEADBYTE_VERSION,'0.15.22');
20
- assert.equal(release.version,'0.15.22');
21
- assert.equal(provenance.version,'0.15.22');
17
+ assert.equal(pkg.version,'0.15.24');
18
+ assert.equal(lock.version,'0.15.24');
19
+ assert.equal(lock.packages[''].version,'0.15.24');
20
+ assert.equal(DEADBYTE_VERSION,'0.15.24');
21
+ assert.equal(release.version,'0.15.24');
22
+ assert.equal(provenance.version,'0.15.24');
23
+ assert.equal(matrix.version,'0.15.24');
22
24
  assert.equal(release.train,'R48');
23
- assert.equal(release.label,'NATIVE WINDOWS OBSERVATION + MACHINE FS RESILIENCE');
24
- assert.equal(release.parent.release_id,'v0.15.21-7c2735e0b1c6cc8d');
25
- assert.equal(release.parent.manifest_sha256,'7c2735e0b1c6cc8dac6581c47b6b557d8d0157a324b67efd4df058e67cdb289f');
26
- assert.equal(release.parent.generation_manifest_sha256,'b376e7fc450f44edddb0d0e1d596014c463f603e4917c56a68906b7f66f99dc7');
27
- assert.equal(release.source_predecessor.version,'0.15.21');
28
- assert.equal(release.source_predecessor.tarball_sha256,'3439f5f4435632e4cde385a6937e3e3d2ffcfb777295dd56aafbf3b036be7493');
29
- assert.equal(release.source_predecessor.manifest_file_sha256,'7c2735e0b1c6cc8dac6581c47b6b557d8d0157a324b67efd4df058e67cdb289f');
25
+ assert.equal(release.label,'COMMANDER DIFFERENTIAL + PROTOCOL HARDENING BASELINE');
26
+ assert.equal(release.parent.release_id,'v0.15.23-c97e3d21e792420e');
27
+ assert.equal(release.parent.manifest_sha256,'c97e3d21e792420ea90dada3c1360cd56e4c1f221daa86596d611b0d1ac351ec');
28
+ assert.equal(release.parent.generation_manifest_sha256,'4d2d3a4dc103576c39171c52db3436366e62d8b872bcafa4c55f2adb6d3a1126');
29
+ assert.equal(release.source_predecessor.version,'0.15.23');
30
+ assert.equal(release.source_predecessor.tarball_sha256,'8c8711805bd05b9d4f61a7c9e123d888eb65121a10c85247807a723154416af4');
31
+ assert.equal(release.source_predecessor.manifest_file_sha256,'c97e3d21e792420ea90dada3c1360cd56e4c1f221daa86596d611b0d1ac351ec');
30
32
  assert.equal(release.source_predecessor.reference_server_sha256,'dfc303bb7dd2e8d01debac50fc43bb8644d00089bffdf2887e149497cff8b305');
31
33
  assert.equal(release.source_predecessor.reference_schemas_sha256,'f342345e34e48769dabaefe1b932f09d41e2e207b422f7794a15ee50ffa8f140');
32
34
  assert.equal(release.capabilities.full_tool_count,116);
33
- assert.equal(release.capabilities.full_tool_catalog.path,'docs/R48-FULL-TOOL-CATALOG.json');
34
- assert.deepEqual(release.capabilities.windows_queries,['registry','services','drivers','sockets','volumes','usb','wsl']);
35
- assert.equal(release.capabilities.machine_fs_list_entry_fault_isolation,true);
36
- assert.equal(release.capabilities.capability_manifest_authority_truth,true);
37
- assert.equal(release.capabilities.capability_manifest_host_grant_truth,true);
35
+ assert.equal(release.capabilities.commander_incremental_pdf_revisions,true);
36
+ assert.equal(release.capabilities.commander_docx_header_footer_search,true);
37
+ assert.equal(release.capabilities.commander_directory_read_fallback,true);
38
+ assert.equal(release.capabilities.commander_binary_detection,true);
39
+ assert.equal(release.capabilities.commander_protocol_adversarial,true);
40
+ assert.equal(release.capabilities.atomic_mutation_unknown_effect,true);
38
41
  assert.equal(provenance.parent_release_id,release.parent.release_id);
39
42
  assert.equal(provenance.parent_manifest_sha256,release.parent.manifest_sha256);
40
43
  assert.equal(provenance.parent_generation_manifest_sha256,release.parent.generation_manifest_sha256);
41
44
  assert.equal(provenance.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
45
+ assert.equal(matrix.full_regression_partition_proof.files,211);
46
+ assert.equal(matrix.full_regression_partition_proof.fail,0);
47
+ assert.equal(matrix.full_regression_partition_proof.task_receipt_sha256,'7711039e4807f6c2af02bbda897d0032b067e0a6631f789fd3bf801258160d3f');
42
48
  });
@@ -1,6 +1,7 @@
1
1
  import test from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { createLiveTimelineTracker, formatRemoteLifecycle, formatRuntimeDiagnosticLine, summarizeLiveToolArgs, truncateUtf8 } from '../src/remote-live-log.mjs';
3
+ import * as live from '../src/remote-live-log.mjs';
4
+ const {createLiveTimelineTracker,formatRemoteLifecycle,formatRuntimeDiagnosticLine,summarizeLiveToolArgs,truncateUtf8}=live;
4
5
 
5
6
  test('R40 human live timeline suppresses noisy read request and emits one categorized terminal line',()=>{
6
7
  let now=1000;
@@ -43,7 +44,7 @@ test('R40 heartbeat burst folds repeated status calls instead of printing every
43
44
  else assert.match(line,/^📡 .*#39 machine_ping ×5 avg 3ms ✓$/);
44
45
  now+=10;
45
46
  }
46
- assert.match(tracker.summary(),/5 calls \| 0 errors .*folded 4 heartbeat lines.*machine_ping×5/);
47
+ assert.match(tracker.summary(),/5 calls \| 5 ok \| 0 errors \| 0 unknown \| 0 mutations .*folded 4 heartbeat lines.*machine_ping×5/);
47
48
  });
48
49
 
49
50
  test('R40 transport IN/OUT echo is hidden by default and available only in verbose diagnostics',()=>{
@@ -64,14 +65,19 @@ test('R40 interrupted spans remain correlated and session summary is available',
64
65
  args:{root_id:'core',path:'x.txt',content:'x'}},{sequence:50});
65
66
  const lines=tracker.reconcileInterrupted('recovery');
66
67
  assert.deepEqual(lines,['⚠ [pending-] OUTCOME_UNKNOWN coding_file_write — recovery ended before terminal result; inspect state before retry']);
67
- assert.match(tracker.summary(),/^📊 \[SUMMARY\] 0 calls \| 0 errors/);
68
+ assert.match(tracker.summary(),/^📊 \[SUMMARY\] 0 calls \| 0 ok \| 0 errors \| 0 unknown \| 0 mutations/);
68
69
  });
69
70
 
70
71
  test('R40 CLI exposes explicit verbose mode while keeping default live mode compact',async()=>{
71
72
  const {readFile}=await import('node:fs/promises');
72
73
  const src=await readFile(new URL('../src/deadbyte-cli.mjs',import.meta.url),'utf8');
73
- assert.match(src,/createLiveTimelineTracker\(\{verbose,displayMode\}\)/);
74
- assert.match(src,/args\.includes\('--verbose'\)/);
74
+ assert.match(src,/readLiveRootPaths\(ctx\.root\)/);
75
+ assert.match(src,/createLiveTimelineTracker\(\{verbose,displayMode,rootPaths,trace\}\)/);
76
+ assert.match(src,/createLiveTimelineFilter\(filterExpression\)/);
77
+ assert.match(src,/createLiveTimelineWriter\(\{stream:process\.stdout,displayMode,rewrite:!verbose\}\)/);
78
+ assert.match(src,/arg==='--verbose'\|\|arg==='-v'/);
79
+ assert.match(src,/arg==='--trace'/);
80
+ assert.match(src,/arg==='--filter'/);
75
81
  assert.match(src,/Transport IN\/OUT hidden/);
76
82
  assert.doesNotMatch(src,/\[cursor \$\{recorded\.cursor\}\]/);
77
83
  });
@@ -88,13 +94,13 @@ test('R40 ASCII display fallback contains no non-ASCII bytes and preserves termi
88
94
  assert.equal(formatRemoteLifecycle('device_start',{displayMode:'ascii'}),'[DEVICE] Starting DEADBYTE MCP...');
89
95
  });
90
96
 
91
- test('R40 interrupted side effect is explicit OUTCOME_UNKNOWN instead of implying failure or replay safety',()=>{
97
+ test('R40 interrupted side effect is explicit failed-after-unknown-effect instead of implying replay safety',()=>{
92
98
  const tracker=createLiveTimelineTracker({clock:()=>1000});
93
99
  tracker.observe({event_type:'tool.request',tool:'coding_file_write',request_id:'unknown-12345678',
94
100
  args:{root_id:'core',path:'x.txt',content:'x'}},{sequence:70});
95
101
  const line=tracker.observe({event_type:'tool.result',tool:'coding_file_write',request_id:'unknown-12345678',
96
102
  outcome:{status:'interrupted',is_error:true,duration_ms:0,side_effect_state:'unknown',recovery:{reason:'runtime_restart'}}},{sequence:71});
97
- assert.match(line,/OUTCOME_UNKNOWN — runtime_restart$/);
103
+ assert.match(line,/FAILED_AFTER_UNKNOWN_EFFECT — runtime_restart$/);
98
104
  assert.doesNotMatch(line,/\s[✓✗]\s/);
99
105
  });
100
106
 
@@ -105,3 +111,96 @@ test('R40 UTF-8 truncation never splits Thai or emoji into replacement character
105
111
  assert.equal(clipped.includes('\uFFFD'),false);
106
112
  assert.ok(clipped.endsWith('…'));
107
113
  });
114
+
115
+
116
+ test('visual opcode projection resolves multiplexed machine_fs operation and exposes terminal evidence',()=>{
117
+ let now=1000;
118
+ const receipt='1'.repeat(64);
119
+ const tracker=createLiveTimelineTracker({clock:()=>now,rootPaths:{projects:'D:\\Projects'}});
120
+ const start=tracker.observe({event_type:'tool.request',tool:'machine_fs',request_id:'machinefs-12345678',
121
+ ts:'1970-01-01T00:00:01.000Z',args:{op:'write',root_id:'projects',path:'S3CORE01-R2/STATUS.txt',content:'x'}},{sequence:80});
122
+ assert.match(start,/^📝 .*machine_fs\.write /);
123
+ assert.ok(start.includes('D:\\Projects\\S3CORE01-R2\\STATUS.txt [root=projects]'));
124
+ now=1007;
125
+ const done=tracker.observe({event_type:'tool.result',tool:'machine_fs',request_id:'machinefs-12345678',
126
+ ts:'1970-01-01T00:00:01.007Z',outcome:{status:'committed',is_error:false,duration_ms:7,receipt_sha256s:[receipt]}},{sequence:81});
127
+ assert.match(done,/^📝 .*machine_fs\.write .*7ms ✅ SUCCEEDED 🧾 receipt=11111111…$/);
128
+ });
129
+
130
+ test('visual opcode projection reserves warning semantics for explicitly unknown side effects',()=>{
131
+ const tracker=createLiveTimelineTracker({clock:()=>1000});
132
+ tracker.observe({event_type:'tool.request',tool:'host_exec',request_id:'unknown-host-1234',
133
+ args:{root_id:'core',command_id:'powershell_inline',mode:'inline'}},{sequence:90});
134
+ const done=tracker.observe({event_type:'tool.result',tool:'host_exec',request_id:'unknown-host-1234',
135
+ outcome:{status:'interrupted',is_error:true,duration_ms:4,side_effect_state:'unknown',recovery:{reason:'runtime_restart'}}},{sequence:91});
136
+ assert.match(done,/^⚠️ .*host_exec .*4ms FAILED_AFTER_UNKNOWN_EFFECT — runtime_restart$/);
137
+ assert.doesNotMatch(done,/❌|🚫/);
138
+ });
139
+
140
+
141
+ test('absolute Windows root rendering shows the operator the real host path and root identity',()=>{
142
+ const tracker=createLiveTimelineTracker({clock:()=>1000,rootPaths:{local_c:'C:\\'}});
143
+ tracker.observe({event_type:'tool.request',tool:'machine_fs',request_id:'localc-123456789',
144
+ args:{op:'read',root_id:'local_c',path:'Users/DEADBYTE/.deadbyte-mcp/active-release.json'}},{sequence:100});
145
+ const line=tracker.observe({event_type:'tool.result',tool:'machine_fs',request_id:'localc-123456789',
146
+ outcome:{is_error:false,duration_ms:1}},{sequence:101});
147
+ assert.ok(line.includes('C:\\Users\\DEADBYTE\\.deadbyte-mcp\\active-release.json [root=local_c]'));
148
+ assert.match(line,/^📖 .*machine_fs\.read /);
149
+ });
150
+
151
+
152
+ test('trace mode exposes deterministic trace/span hierarchy without payload bytes',()=>{
153
+ const tracker=createLiveTimelineTracker({clock:()=>1000,trace:true});
154
+ const start=tracker.observe({event_type:'tool.request',tool:'coding_file_write',request_id:'span-1234567890abcdef',
155
+ context:{parent_span_id:'parent-abcdef123456',job_id:'job-112233445566'},args:{root_id:'core',path:'x.txt',content:'SECRET'}},{sequence:110});
156
+ assert.match(start,/trace=job-1122… span=span-123… parent=parent-a…/);
157
+ assert.doesNotMatch(start,/SECRET/);
158
+ const done=tracker.observe({event_type:'tool.result',tool:'coding_file_write',request_id:'span-1234567890abcdef',
159
+ outcome:{is_error:false,duration_ms:2}},{sequence:111});
160
+ assert.match(done,/trace=job-1122… span=span-123… parent=parent-a…/);
161
+ });
162
+
163
+ test('timeline filter keeps audit observation complete while selecting presentation by category status and trace',()=>{
164
+ const filter=live.createLiveTimelineFilter('category=write,status=error,trace=goal-1234');
165
+ const request={event_type:'tool.request',tool:'machine_fs',request_id:'filter-span-1',
166
+ args:{op:'write',root_id:'projects',path:'x.txt',goal_id:'goal-1234'}};
167
+ assert.equal(filter.accept(request),false,'status-constrained request start is deferred');
168
+ assert.equal(filter.accept({event_type:'tool.result',tool:'machine_fs',request_id:'filter-span-1',
169
+ outcome:{is_error:true,duration_ms:1}}),true);
170
+ const other={event_type:'tool.request',tool:'coding_file_read',request_id:'filter-span-2',
171
+ args:{root_id:'projects',path:'x.txt',goal_id:'goal-1234'}};
172
+ assert.equal(filter.accept(other),false);
173
+ assert.equal(filter.accept({event_type:'tool.result',tool:'coding_file_read',request_id:'filter-span-2',
174
+ outcome:{is_error:true,duration_ms:1}}),false);
175
+ });
176
+
177
+ test('TTY writer rewrites matching visible start in place and never rewrites unrelated output',()=>{
178
+ const writes=[];const stream={isTTY:true,write(value){writes.push(value);return true;}};
179
+ const writer=live.createLiveTimelineWriter({stream,displayMode:'unicode'});
180
+ writer.write('RUNNING',{event_type:'tool.call',request_id:'a'});
181
+ writer.write('DONE',{event_type:'tool.result',request_id:'a'});
182
+ assert.deepEqual(writes,['RUNNING','\r\x1b[2KDONE\n']);
183
+ writes.length=0;
184
+ writer.write('RUN-A',{event_type:'tool.call',request_id:'a'});
185
+ writer.write('OTHER',{event_type:'tool.result',request_id:'b'});
186
+ assert.deepEqual(writes,['RUN-A','\n','OTHER\n']);
187
+ });
188
+
189
+ test('expanded session summary reports outcome classes latency and slowest tool',()=>{
190
+ const tracker=createLiveTimelineTracker({clock:()=>1000});
191
+ const events=[
192
+ ['a','coding_file_read',10,false,false],
193
+ ['b','coding_file_write',50,false,false],
194
+ ['c','coding_command_run',100,true,false],
195
+ ['d','host_exec',200,true,true]
196
+ ];
197
+ for(const [id,tool,duration,isError,unknown] of events){
198
+ tracker.observe({event_type:'tool.request',tool,request_id:id,args:{root_id:'core',path:'x'}});
199
+ tracker.observe({event_type:'tool.result',tool,request_id:id,outcome:{is_error:isError,duration_ms:duration,
200
+ ...(unknown?{side_effect_state:'unknown'}:{})}});
201
+ }
202
+ const summary=tracker.summary();
203
+ assert.match(summary,/4 calls \| 2 ok \| 1 error \| 1 unknown \| 3 mutations/);
204
+ assert.match(summary,/p50 75ms \| p95 200ms/);
205
+ assert.match(summary,/slowest host_exec 200ms/);
206
+ });
@@ -466,3 +466,43 @@ winTest('bare remote surfaces bounded controller-start-failure evidence instead
466
466
  assert.match(output.stderr,/controller-start-failure/i);
467
467
  }finally{await rm(fx.dir,{recursive:true,force:true});}
468
468
  });
469
+
470
+
471
+ winTest('remote --trace --filter selects presentation without dropping journaled events',async()=>{
472
+ const fx=await fixture();
473
+ let child=null;
474
+ try{
475
+ child=spawn(process.execPath,[cliPath,'remote','--trace','--filter','category=write,status=error,trace=goal-1234'],{
476
+ env:fx.env,stdio:['pipe','pipe','pipe'],windowsHide:true
477
+ });
478
+ const output=await collect(child);
479
+ await waitFor(fx.trace,commands=>commands.includes('hoststatus'));
480
+ const marker=JSON.parse(await readFile(path.join(fx.state,'runtime','remote-session.json'),'utf8'));
481
+ const auditDir=path.join(fx.state,'audit');await mkdir(auditDir,{recursive:true});
482
+ const audit=[
483
+ {event_type:'tool.request',tool:'machine_fs',request_id:'filter-write-1234',created_at_utc:'2026-09-19T01:00:00.000Z',
484
+ args:{op:'write',root_id:'projects',path:'x.txt',goal_id:'goal-1234',content:'SECRET'}},
485
+ {event_type:'tool.result',tool:'machine_fs',request_id:'filter-write-1234',created_at_utc:'2026-09-19T01:00:00.010Z',
486
+ outcome:{is_error:true,duration_ms:10,reason:'denied'}},
487
+ {event_type:'tool.request',tool:'coding_file_read',request_id:'filter-read-12345',created_at_utc:'2026-09-19T01:00:00.020Z',
488
+ args:{root_id:'projects',path:'x.txt',goal_id:'goal-1234'}},
489
+ {event_type:'tool.result',tool:'coding_file_read',request_id:'filter-read-12345',created_at_utc:'2026-09-19T01:00:00.030Z',
490
+ outcome:{is_error:true,duration_ms:10,reason:'missing'}}
491
+ ];
492
+ await writeFile(path.join(auditDir,'segment-00000001.jsonl'),audit.map(JSON.stringify).join('\n')+'\n','utf8');
493
+ const deadline=Date.now()+4000;
494
+ while(Date.now()<deadline&&!/machine_fs\.write.*trace=goal-1234/.test(output.stdout)) await sleep(50);
495
+ assert.match(output.stdout,/machine_fs\.write.*trace=goal-123\.\.\. span=filter-w\.\.\..*10ms.*ERR - denied/);
496
+ assert.doesNotMatch(output.stdout,/coding_file_read.*missing/);
497
+ assert.doesNotMatch(output.stdout,/SECRET/);
498
+ const journal=JSON.parse(await readFile(path.join(fx.state,'runtime','remote-results',marker.result_session_id+'.json'),'utf8'));
499
+ assert.equal(journal.events.length,4,'presentation filter must not remove journal evidence');
500
+ child.stdin.end();
501
+ const ended=await Promise.race([output.closed,sleep(6000).then(()=>({timeout:true}))]);
502
+ assert.equal(ended.timeout,undefined);
503
+ assert.equal(ended.code,0,output.stderr);
504
+ }finally{
505
+ if(child?.exitCode===null) child.kill('SIGKILL');
506
+ await rm(fx.dir,{recursive:true,force:true});
507
+ }
508
+ });
@@ -132,3 +132,20 @@ test('controller enables audit only for Bridge child and restores parent audit e
132
132
  assert.match(source,/if \(\$hadAuditRuntimeEnv\) \{ \$env:DEADBYTE_AUDIT_RUNTIME = \$previousAuditRuntimeEnv \}/);
133
133
  assert.match(source,/else \{ Remove-Item Env:DEADBYTE_AUDIT_RUNTIME -ErrorAction SilentlyContinue \}/);
134
134
  });
135
+
136
+
137
+ test('audit outcome reason preserves ordinary letters and Windows paths while folding actual whitespace',async()=>{
138
+ const root=await temp();
139
+ try{
140
+ const k=await keys(root);
141
+ const audit=await createToolAudit({stateRoot:root,signingKeyPath:k.privateKeyPath,contextProvider:async()=>context()});
142
+ const server=fakeServer();installToolAudit(server,audit);
143
+ server.registerTool('broken_read',{},async()=>({
144
+ isError:true,
145
+ structuredContent:{status:'error',error:"Error:\tENOENT: no such file or directory,\nrealpath 'D:\\\\Projects\\\\runtime'"}
146
+ }));
147
+ await server.handlers.get('broken_read')({path:'x'});
148
+ const all=await events(root);
149
+ assert.equal(all.at(-1).outcome.reason,"Error: ENOENT: no such file or directory, realpath 'D:\\\\Projects\\\\runtime'");
150
+ }finally{await rm(root,{recursive:true,force:true});}
151
+ });
@@ -76,7 +76,9 @@ test('probe adapter forwards malformed and unknown input unchanged', () => {
76
76
 
77
77
  test('strict MCP core still rejects legacy at the SDK serving boundary', async () => {
78
78
  const source = await readFile(fileURLToPath(new URL('../src/mcp-server.mjs', import.meta.url)), 'utf8');
79
- assert.match(source, /serveStdio\([\s\S]*\{ legacy: 'reject' \}\)/);
79
+ assert.match(source, /serveStdio\(/);
80
+ assert.match(source, /legacy:\s*'reject'/);
81
+ assert.match(source, /transport:\s*new DeadbyteStdioServerTransport\(\)/);
80
82
  assert.match(source, /installTunnelStdioProbeCompat/);
81
83
  });
82
84