deadbyte-mcp 0.15.68 → 0.15.69

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 (83) hide show
  1. package/MANIFEST.SHA256 +81 -38
  2. package/PROVENANCE.json +35 -23
  3. package/README.txt +44 -31
  4. package/RELEASE.json +30 -17
  5. package/SBOM.cdx.json +2 -2
  6. package/TEST-MATRIX.json +25 -2
  7. package/bridge/package.json +1 -1
  8. package/controller/deadbyte-controller.ps1 +65 -1
  9. package/controller/deadbyte-process-policy.json +4 -4
  10. package/docs/R184-package-lock.json +97 -0
  11. package/docs/R186-OWNER-CONSENT-HANDOFF.txt +87 -0
  12. package/package.json +1 -1
  13. package/scripts/install-r186-owner-trust.ps1 +59 -0
  14. package/scripts/r175-focused-runner.mjs +38 -0
  15. package/scripts/r176-log-preview.mjs +18 -0
  16. package/scripts/r177-owner-trust-inventory.ps1 +36 -0
  17. package/scripts/r178-full-regression.mjs +21 -0
  18. package/scripts/r178-npm-ci.mjs +10 -0
  19. package/scripts/r178-npm-preflight.mjs +16 -0
  20. package/scripts/r178-release-gates-readonly.mjs +9 -0
  21. package/scripts/r178-shard-regression.mjs +25 -0
  22. package/scripts/r179-predecessor-registry.mjs +24 -0
  23. package/scripts/r179-protected-inventory.ps1 +21 -0
  24. package/scripts/r186-focused-runner.mjs +22 -0
  25. package/scripts/r186-owner-anchor-inspect.mjs +6 -0
  26. package/scripts/r186-owner-consent-check.mjs +86 -0
  27. package/scripts/r186-owner-grant-cli.mjs +45 -0
  28. package/scripts/r186-owner-key-local.mjs +22 -0
  29. package/scripts/r186-owner-review-export.mjs +34 -0
  30. package/src/deadbyte-cli.mjs +69 -56
  31. package/src/r174-owner-webauthn.mjs +176 -0
  32. package/src/r175-foreground-boundary.mjs +28 -0
  33. package/src/r186-owner-anchor.mjs +12 -0
  34. package/src/r186-owner-consent-preflight.mjs +63 -0
  35. package/src/r186-owner-grant-broker.mjs +96 -0
  36. package/src/r186-owner-local-signing.mjs +25 -0
  37. package/src/r186-owner-request.mjs +40 -0
  38. package/src/r186-owner-review-export.mjs +49 -0
  39. package/src/remote-live-log.mjs +81 -5
  40. package/src/remote-session-guardian.mjs +23 -0
  41. package/src/version.mjs +1 -1
  42. package/test/helpers/r175-active-pointer.mjs +28 -0
  43. package/test/helpers/release-lock.mjs +12 -0
  44. package/test/r129-sdk-security-baseline.test.mjs +2 -1
  45. package/test/r130-release-security-contract.test.mjs +11 -10
  46. package/test/r132-release-identity.test.mjs +12 -11
  47. package/test/r153-prepublish-identity.test.mjs +1 -1
  48. package/test/r155-default-live-log.test.mjs +17 -16
  49. package/test/r160-package-decision-manifest.test.mjs +1 -1
  50. package/test/r160-release-contract.test.mjs +4 -5
  51. package/test/r163-isolated-slot-rollback-restore.test.mjs +6 -6
  52. package/test/r165-live-cli-skew.test.mjs +6 -6
  53. package/test/r167-release-contract.test.mjs +15 -13
  54. package/test/r168-protected-entrypoint.test.mjs +5 -2
  55. package/test/r168-release-contract.test.mjs +4 -3
  56. package/test/r168-remote-one-shot-coherence.test.mjs +2 -1
  57. package/test/r172-release-contract.test.mjs +7 -7
  58. package/test/r173-release-contract.test.mjs +18 -17
  59. package/test/r174-owner-webauthn.test.mjs +144 -0
  60. package/test/r175-cli-flags.test.mjs +23 -0
  61. package/test/r175-foreground-boundary.test.mjs +87 -0
  62. package/test/r175-guardian-owner-boundary.test.mjs +56 -0
  63. package/test/r176-pretty-live-log.test.mjs +54 -0
  64. package/test/r177-windows-absolute-live-path.test.mjs +37 -0
  65. package/test/r179-absolute-path-live-log.test.mjs +40 -0
  66. package/test/r179-release-contract.test.mjs +62 -0
  67. package/test/r186-controller-owner-grant.test.mjs +20 -0
  68. package/test/r186-owner-consent-preflight.test.mjs +98 -0
  69. package/test/r186-owner-enrollment.test.mjs +20 -0
  70. package/test/r186-owner-grant-broker.test.mjs +85 -0
  71. package/test/r186-owner-local-signing.test.mjs +30 -0
  72. package/test/r186-owner-request.test.mjs +28 -0
  73. package/test/r186-owner-review-export.test.mjs +52 -0
  74. package/test/r48-release-contract.test.mjs +2 -1
  75. package/test/r51-runtime-coherence.test.mjs +4 -2
  76. package/test/r58-cleanup-retention.test.mjs +5 -12
  77. package/test/r58-concurrent-recovery.test.mjs +5 -1
  78. package/test/r58-stale-owner.test.mjs +9 -3
  79. package/test/r59-tool-surface-compat.test.mjs +1 -1
  80. package/test/remote-live-log-r37.test.mjs +2 -2
  81. package/test/remote-live-log-recovery-r36.test.mjs +1 -1
  82. package/test/remote-session-cli.test.mjs +92 -126
  83. package/node_modules/which/CHANGELOG.md +0 -166
package/RELEASE.json CHANGED
@@ -1,31 +1,31 @@
1
1
  {
2
2
  "schema": "deadbyte.release.v1",
3
3
  "name": "deadbyte-mcp",
4
- "version": "0.15.68",
5
- "train": "R173",
6
- "label": "R173 epoch-revoked authority proof hotfix",
4
+ "version": "0.15.69",
5
+ "train": "R179",
6
+ "label": "R179 foreground observer and native crash guardian release candidate",
7
7
  "protocol_revision": "2026-07-28",
8
8
  "parent": {
9
- "version": "0.15.61",
10
- "release_id": "v0.15.61-055d1ff0aa99e60b",
11
- "manifest_sha256": "055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf",
12
- "generation_manifest_sha256": "f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4",
9
+ "version": "0.15.68",
10
+ "release_id": "v0.15.68-ff29dbb2fbb89862",
11
+ "manifest_sha256": "ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885",
12
+ "generation_manifest_sha256": "2887d4a8d54ea6fc6b28869072f72491c892dfe28178b3537936dce958147bd2",
13
13
  "activation_status": "PRODUCTION_ACTIVE"
14
14
  },
15
15
  "runtime_predecessor": {
16
- "version": "0.15.61",
17
- "release_id": "v0.15.61-055d1ff0aa99e60b",
18
- "manifest_sha256": "055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf",
19
- "generation_manifest_sha256": "f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4"
16
+ "version": "0.15.68",
17
+ "release_id": "v0.15.68-ff29dbb2fbb89862",
18
+ "manifest_sha256": "ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885",
19
+ "generation_manifest_sha256": "2887d4a8d54ea6fc6b28869072f72491c892dfe28178b3537936dce958147bd2"
20
20
  },
21
21
  "source_predecessor": {
22
- "version": "0.15.67",
23
- "train": "R172",
24
- "source_path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.67-r172-final-remote-recovery",
22
+ "version": "0.15.68",
23
+ "train": "R173",
24
+ "source_path": "https://registry.npmjs.org/deadbyte-mcp/-/deadbyte-mcp-0.15.68.tgz",
25
25
  "release_status": "PUBLISHED_REGISTRY_VERIFIED",
26
- "manifest_status": "VERIFIED_FINAL_BYTES",
27
- "manifest_sha256": "4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8",
28
- "tarball_sha256": "0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d"
26
+ "manifest_status": "ACTIVE_PRODUCTION_MANIFEST_VERIFIED",
27
+ "manifest_sha256": "ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885",
28
+ "tarball_sha256": "1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf"
29
29
  },
30
30
  "consolidation": {
31
31
  "frontend_status_vocabulary": true,
@@ -548,5 +548,18 @@
548
548
  "npm_publish": "NOT_RUN",
549
549
  "production_activation": "NOT_RUN",
550
550
  "stable_final_claim": false
551
+ },
552
+ "r179": {
553
+ "scope": "FOREGROUND_OBSERVATION_ONLY_CRASH_GUARDIAN_AND_READABLE_WINDOWS_LOGS",
554
+ "source_predecessor_version": "0.15.68",
555
+ "source_predecessor_manifest_sha256": "ff29dbb2fbb898625592afb47835a4a62ef289429f1e0a89a83242398cd98885",
556
+ "source_predecessor_tarball_sha256": "1a7f1fe05a06178b8d772a140be6e0470790b743cef690c3f8f8165cc61075bf",
557
+ "owner_approved_autonomous_grant": "NOT_ISSUED",
558
+ "protected_full_regression": "NOT_VERIFIED",
559
+ "windows_gate": "BLOCKED_R89_UNTRUSTED_INSTALLATION",
560
+ "foreground_live_integration": "NOT_VERIFIED",
561
+ "npm_publish": "NOT_RUN",
562
+ "production_activation": "NOT_RUN",
563
+ "stable_final_claim": false
551
564
  }
552
565
  }
package/SBOM.cdx.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "bomFormat": "CycloneDX",
3
3
  "specVersion": "1.6",
4
- "serialNumber": "urn:cdx:deadbyte-mcp:r173:0.15.68",
4
+ "serialNumber": "urn:cdx:deadbyte-mcp:r179:0.15.69",
5
5
  "version": 1,
6
6
  "metadata": {
7
7
  "component": {
8
8
  "type": "application",
9
9
  "name": "deadbyte-mcp",
10
- "version": "0.15.68"
10
+ "version": "0.15.69"
11
11
  }
12
12
  },
13
13
  "components": [
package/TEST-MATRIX.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": "deadbyte.test-matrix.v1",
3
- "version": "0.15.68",
4
- "train": "R173",
3
+ "version": "0.15.69",
4
+ "train": "R179",
5
5
  "primary_platform": "win32-x64",
6
6
  "reference": {
7
7
  "package": "@wonderwhy-er/desktop-commander",
@@ -124,6 +124,21 @@
124
124
  "id": "r168-claim-preservation",
125
125
  "command": "Verify read-only R168 signed epoch audit and old R65 claim",
126
126
  "expected": "Unresolved claim is preserved; no test key used as owner approval; production pointer and Coding scope unchanged"
127
+ },
128
+ {
129
+ "id": "r179-owner-authorized-autonomous",
130
+ "command": "Issue independently signed owner consent from protected broker, verify exact policy and epoch, then arm Autonomous",
131
+ "expected": "Owner proof bound to active release, scoped project, policy hashes, expiry and independently protected signing key"
132
+ },
133
+ {
134
+ "id": "r179-protected-full",
135
+ "command": "node --test --test-concurrency=4 test/*.test.mjs in exact protected 0.15.69 installation",
136
+ "expected": "Zero failures; all skips reviewed; R89 trusted installation and native tests pass"
137
+ },
138
+ {
139
+ "id": "r179-live-log-and-foreground",
140
+ "command": "Run Ctrl+C, restart, crash and concurrent sessions with pre-existing standing grants and confirm no implicit revocation",
141
+ "expected": "Owner standing grants unchanged; observation-only marker CAS; signed audit remains verifiable"
127
142
  }
128
143
  ],
129
144
  "observed_pre_release_evidence": {
@@ -645,5 +660,13 @@
645
660
  "new_authority_scopes": 0,
646
661
  "publication": "NOT_RUN",
647
662
  "production_activation": "NOT_RUN"
663
+ },
664
+ "r179": {
665
+ "owner_consent": "NOT_VERIFIED",
666
+ "protected_full": "NOT_VERIFIED",
667
+ "foreground_live": "NOT_VERIFIED",
668
+ "package_verify_only": "PASS_2552_MANIFEST_ENTRIES",
669
+ "registry_publish": "NOT_RUN",
670
+ "production_activation": "NOT_RUN"
648
671
  }
649
672
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deadbyte-chatgpt-bridge",
3
- "version": "0.15.68",
3
+ "version": "0.15.69",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "engines": {
@@ -1015,6 +1015,10 @@ function Invoke-AuthorityEpochCommand($Cfg, [string]$Plane, [string]$Action, [st
1015
1015
  'src\foreground-marker-cas-win32.mjs',
1016
1016
  'src\foreground-process-identity.mjs',
1017
1017
  'src\windows-powershell-environment.mjs',
1018
+ 'scripts\r186-owner-grant-cli.mjs',
1019
+ 'src\r186-owner-grant-broker.mjs',
1020
+ 'src\r186-owner-consent-preflight.mjs',
1021
+ 'src\r70-owner-approval.mjs',
1018
1022
  'bin\deadbyte-epoch-lock-r85.node',
1019
1023
  'docs\R85-EPOCH-LOCK-BINARY.json',
1020
1024
  'native\deadbyte-epoch-lock-r85.cpp'
@@ -1391,6 +1395,57 @@ function Get-AutonomousLeaseStatus($Cfg) {
1391
1395
  return [pscustomobject]@{ Configured=$true; Armed=$true; Reason='standing-grant'; EpochSeq=$epoch.Seq; EpochSha256=$epoch.EventSha256 }
1392
1396
  }
1393
1397
 
1398
+ function Invoke-R186ProtectedAutonomousGrant($Cfg, $Meta) {
1399
+ if (-not $Cfg.ContainsKey('AuthorityEpochRoot') -or [string]::IsNullOrWhiteSpace([string]$Cfg.AuthorityEpochRoot)) {
1400
+ Fail 'R70_OWNER_ENROLLMENT_REQUIRED: protected authority root unavailable'
1401
+ }
1402
+ $protectedRoot = [System.IO.Path]::GetFullPath([string]$Cfg.AuthorityEpochRoot)
1403
+ $releaseRoot = [System.IO.Path]::GetFullPath([string]$Cfg.CoreRoot)
1404
+ $relativeFiles = @(
1405
+ 'scripts\r186-owner-grant-cli.mjs',
1406
+ 'src\r186-owner-grant-broker.mjs',
1407
+ 'src\r186-owner-consent-preflight.mjs',
1408
+ 'src\r70-owner-approval.mjs',
1409
+ 'src\authority-continuity-r65.mjs',
1410
+ 'src\privileged-install-trust-r89.mjs',
1411
+ 'src\epoch-lock-r85.mjs',
1412
+ 'src\canonical-json.mjs',
1413
+ 'src\text-policy.mjs',
1414
+ 'src\foreground-marker-cas-win32.mjs',
1415
+ 'src\foreground-process-identity.mjs',
1416
+ 'src\windows-powershell-environment.mjs',
1417
+ 'src\release-slot.mjs',
1418
+ 'bin\deadbyte-epoch-lock-r85.node',
1419
+ 'docs\R85-EPOCH-LOCK-BINARY.json',
1420
+ 'native\deadbyte-epoch-lock-r85.cpp'
1421
+ )
1422
+ $releaseManifest = Join-Path $releaseRoot 'MANIFEST.SHA256'
1423
+ $protectedManifest = Join-Path $protectedRoot 'MANIFEST.SHA256'
1424
+ if (-not (Test-Path -LiteralPath $releaseManifest -PathType Leaf) -or
1425
+ -not (Test-Path -LiteralPath $protectedManifest -PathType Leaf) -or
1426
+ (Get-ExecutableHash $releaseManifest) -cne (Get-ExecutableHash $protectedManifest)) {
1427
+ Fail 'R186 protected owner broker release manifest mismatch'
1428
+ }
1429
+ foreach ($relative in $relativeFiles) {
1430
+ $source = Join-Path $releaseRoot $relative
1431
+ $protected = Join-Path $protectedRoot $relative
1432
+ if (-not (Test-Path -LiteralPath $source -PathType Leaf) -or
1433
+ -not (Test-Path -LiteralPath $protected -PathType Leaf) -or
1434
+ (Get-ExecutableHash $source) -cne (Get-ExecutableHash $protected)) {
1435
+ Fail "R186 protected owner broker source mismatch: $relative"
1436
+ }
1437
+ }
1438
+ Assert-ProtectedEpochSourceAcl -Files @($relativeFiles | ForEach-Object { Join-Path $protectedRoot $_ })
1439
+ $cli = Join-Path $protectedRoot 'scripts\r186-owner-grant-cli.mjs'
1440
+ $node = [string]$Cfg.Bridge.FilePath
1441
+ if ([string]::IsNullOrWhiteSpace($node) -or -not (Test-Path -LiteralPath $node -PathType Leaf)) { Fail 'R186 protected owner broker Node unavailable' }
1442
+ $output = @(& $node $cli $RuntimeDir ([string]$Cfg.CodingPolicyFile) ([string]$Cfg.AutonomousPolicyFile))
1443
+ $exit = $LASTEXITCODE
1444
+ if ($exit -ne 0) { Fail "R70_OWNER_ENROLLMENT_REQUIRED: protected owner grant broker rejected (exit=$exit)" }
1445
+ try { return (($output -join [Environment]::NewLine) | ConvertFrom-Json) }
1446
+ catch { Fail 'R186 protected owner grant broker returned invalid JSON' }
1447
+ }
1448
+
1394
1449
  function Arm-Autonomous($Cfg) {
1395
1450
  $coding = Get-CodingLeaseStatus $Cfg
1396
1451
  if (-not $coding.Armed) { Fail 'autonomous plane requires an active coding lease; run armcoding first' }
@@ -1403,7 +1458,16 @@ function Arm-Autonomous($Cfg) {
1403
1458
  $legacyOwnerPolicySha256 = '6274492644c303b38117541cc22a59e88e6ff5fdef7051a5d57ad336f45765f5'
1404
1459
  $selectedRoots = @($meta.RootIds)
1405
1460
  if ([string]$meta.Sha256 -cne $legacyOwnerPolicySha256 -or $selectedRoots.Count -ne 1 -or [string]$selectedRoots[0] -cne 'core') {
1406
- Fail 'R70_OWNER_ENROLLMENT_REQUIRED: project/successor Autonomous grant needs independent owner authorization before arm'
1461
+ $ownerApproval = Join-Path $RuntimeDir 'owner-consent\autonomous-approval.json'
1462
+ if (-not (Test-Path -LiteralPath $ownerApproval -PathType Leaf)) {
1463
+ Fail 'R70_OWNER_ENROLLMENT_REQUIRED: bounded owner approval is absent'
1464
+ }
1465
+ $issued = Invoke-R186ProtectedAutonomousGrant $Cfg $meta
1466
+ if ($null -eq $issued -or [string]$issued.status -cne 'GRANTED' -or $issued.authority_granted -ne $true) {
1467
+ Fail 'R70_OWNER_ENROLLMENT_REQUIRED: protected owner grant broker did not issue authority'
1468
+ }
1469
+ Write-Host 'AUTONOMOUS PLANE ENABLED BY OWNER-SIGNED BOUNDED GRANT'
1470
+ return
1407
1471
  }
1408
1472
  Ensure-Directory $RuntimeDir
1409
1473
  $nonceBytes = New-Object byte[] 32
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "schema": "deadbyte.process-policy.v1",
3
3
  "enabled": true,
4
- "grant_file": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.68-r173-epoch-proof\\controller\\runtime\\process-grant.json",
5
- "state_dir": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.68-r173-epoch-proof\\controller\\runtime\\process-state",
4
+ "grant_file": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.69-r186-owner-consent\\controller\\runtime\\process-grant.json",
5
+ "state_dir": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.69-r186-owner-consent\\controller\\runtime\\process-state",
6
6
  "native_host": {
7
- "path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.68-r173-epoch-proof\\bin\\deadbyte-process-host.exe",
7
+ "path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.69-r186-owner-consent\\bin\\deadbyte-process-host.exe",
8
8
  "sha256": "daf9cfb371bee88cafbf5597eaa507fec504dbe0b0ddd40d0c3c2e02817f49e4"
9
9
  },
10
10
  "roots": {
11
11
  "core": {
12
- "path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.68-r173-epoch-proof",
12
+ "path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.69-r186-owner-consent",
13
13
  "deny_paths": [
14
14
  "node_modules",
15
15
  "controller/runtime",
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "deadbyte-mcp",
3
+ "version": "0.15.69",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "deadbyte-mcp",
9
+ "version": "0.15.69",
10
+ "bundleDependencies": [
11
+ "@modelcontextprotocol/server",
12
+ "@modelcontextprotocol/client",
13
+ "typescript",
14
+ "zod"
15
+ ],
16
+ "dependencies": {
17
+ "@modelcontextprotocol/client": "2.3.1",
18
+ "@modelcontextprotocol/server": "2.3.1",
19
+ "typescript": "5.9.3",
20
+ "zod": "4.4.3"
21
+ },
22
+ "bin": {
23
+ "deadbyte-mcp": "src/deadbyte-cli.mjs"
24
+ },
25
+ "engines": {
26
+ "node": ">=22"
27
+ }
28
+ },
29
+ "node_modules/@modelcontextprotocol/client": {
30
+ "version": "2.3.1",
31
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/client/-/client-2.3.1.tgz",
32
+ "integrity": "sha512-mIGZXpHsjnZ6lD+gD/WCMpR5k8yVQQ8nNFH1N0Srf7AvnwTUMYD6pvTY8ng2+He5FfV7YMZLmrjL7cLa/cc3dQ==",
33
+ "inBundle": true,
34
+ "license": "Apache-2.0",
35
+ "dependencies": {
36
+ "@modelcontextprotocol/core": "2.3.1",
37
+ "cross-spawn": "^7.0.5",
38
+ "eventsource": "^3.0.2",
39
+ "eventsource-parser": "^3.0.8",
40
+ "jose": "^6.1.3",
41
+ "pkce-challenge": "^5.0.0",
42
+ "zod": "^4.2.0"
43
+ },
44
+ "engines": {
45
+ "node": ">=20"
46
+ }
47
+ },
48
+ "node_modules/@modelcontextprotocol/core": {
49
+ "version": "2.3.1",
50
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/core/-/core-2.3.1.tgz",
51
+ "integrity": "sha512-laVmIhPGpWi7rG9q+0UigblRN0Hws/Yjlb6qLFtVqryXVLkc4h+yN8z731POD2LnAGQlFe7/tXhUm7Bi0YB91g==",
52
+ "inBundle": true,
53
+ "license": "Apache-2.0",
54
+ "dependencies": {
55
+ "zod": "^4.2.0"
56
+ },
57
+ "engines": {
58
+ "node": ">=20"
59
+ }
60
+ },
61
+ "node_modules/@modelcontextprotocol/server": {
62
+ "version": "2.3.1",
63
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/server/-/server-2.3.1.tgz",
64
+ "integrity": "sha512-e59MfWuSssj6DoQ96JCTqdW1AXT5/XtnTl0WWd6MU1Ka434fFUGGosCLJbGNySDhHGvxQWoRWK137FXYFkYNWw==",
65
+ "inBundle": true,
66
+ "license": "Apache-2.0",
67
+ "dependencies": {
68
+ "@modelcontextprotocol/core": "2.3.1",
69
+ "zod": "^4.2.0"
70
+ },
71
+ "engines": {
72
+ "node": ">=20"
73
+ }
74
+ },
75
+ "node_modules/cross-spawn": {
76
+ "version": "7.0.6",
77
+ "inBundle": true,
78
+ "license": "MIT",
79
+ "dependencies": {"path-key":"^3.1.0","shebang-command":"^2.0.0","which":"^2.0.1"},
80
+ "engines": {"node":">= 8"}
81
+ },
82
+ "node_modules/eventsource": {
83
+ "version":"3.0.7","inBundle":true,"license":"MIT",
84
+ "dependencies":{"eventsource-parser":"^3.0.1"},"engines":{"node":">=18.0.0"}
85
+ },
86
+ "node_modules/eventsource-parser": {"version":"3.1.1","inBundle":true,"license":"MIT","engines":{"node":">=18.0.0"}},
87
+ "node_modules/isexe": {"version":"2.0.0","inBundle":true,"license":"ISC"},
88
+ "node_modules/jose": {"version":"6.2.10","inBundle":true,"license":"MIT","funding":{"url":"https://github.com/sponsors/panva"}},
89
+ "node_modules/path-key": {"version":"3.1.1","inBundle":true,"license":"MIT","engines":{"node":">=8"}},
90
+ "node_modules/pkce-challenge": {"version":"5.0.1","inBundle":true,"license":"MIT","engines":{"node":">=16.20.0"}},
91
+ "node_modules/shebang-command": {"version":"2.0.0","inBundle":true,"license":"MIT","dependencies":{"shebang-regex":"^3.0.0"},"engines":{"node":">=8"}},
92
+ "node_modules/shebang-regex": {"version":"3.0.0","inBundle":true,"license":"MIT","engines":{"node":">=8"}},
93
+ "node_modules/typescript": {"version":"5.9.3","inBundle":true,"license":"Apache-2.0","bin":{"tsc":"bin/tsc","tsserver":"bin/tsserver"},"engines":{"node":">=14.17"}},
94
+ "node_modules/which": {"version":"2.0.2","inBundle":true,"license":"ISC","dependencies":{"isexe":"^2.0.0"},"bin":{"node-which":"bin/node-which"},"engines":{"node":">= 8"}},
95
+ "node_modules/zod": {"version":"4.4.3","inBundle":true,"license":"MIT","funding":{"url":"https://github.com/sponsors/colinhacks"}}
96
+ }
97
+ }
@@ -0,0 +1,87 @@
1
+ DEADBYTE MCP / R186 OWNER CONSENT
2
+ 2026-10-28
3
+
4
+ CURRENT STATE
5
+
6
+ production remains 0.15.68
7
+ R185 exact tarball 0.15.69 is frozen and protected regression was green
8
+ R186 is an isolated development successor and is not published or activated
9
+
10
+ WHAT R186 ADDS
11
+
12
+ src/r186-owner-consent-preflight.mjs
13
+ verifies owner Ed25519 public key against an exact pinned fingerprint
14
+ verifies the R70 project/policy/artifact/time-bound signature
15
+ returns verified_readonly and authority_granted=false
16
+
17
+ scripts/r186-owner-consent-check.mjs
18
+ loads public owner trust only from these fixed Windows locations
19
+
20
+ C:\Program Files\DEADBYTE-OwnerTrust\owner-anchor.json
21
+ C:\Program Files\DEADBYTE-OwnerTrust\owner-public.pem
22
+
23
+ requires the native R89 protected ACL check for the owner files
24
+ requires protected exact installation for executable verifier source
25
+ verifies the entire installed release manifest before trusting a proof
26
+ derives policy SHA256 from the actual policy files
27
+ derives reviewed_artifact_sha256 from the exact installed MANIFEST.SHA256 bytes
28
+ refuses to enroll a key or grant any authority
29
+
30
+ OWNER ACTION REQUIRED OUTSIDE THIS AGENT
31
+
32
+ the owner must generate and retain the Ed25519 private key on an independently
33
+ controlled device that DEADBYTE MCP and ChatGPT cannot read or execute on
34
+ do not send private key bytes or passwords to ChatGPT or DEADBYTE MCP
35
+
36
+ the owner must inspect and approve the public key fingerprint before a trusted
37
+ administrator-only installation at the two fixed Program Files paths
38
+ owner-anchor.json must have exactly these fields:
39
+
40
+ schema = deadbyte.r186-owner-anchor.v1
41
+ owner_key_id = lowercase SHA256 of Ed25519 SPKI DER public key
42
+
43
+ owner-public.pem contains only that public key
44
+ both files and their ancestor paths must pass Windows R89 ACL trust
45
+
46
+ AFTER A PROTECTED R186 RELEASE EXISTS
47
+
48
+ prepare an R70 owner subject for the exact installed release manifest
49
+ bind root_id, real project_root, the exact coding and autonomous policy SHA256
50
+ bind issued_at_utc and expires_at_utc to at most 1 hour
51
+
52
+ the owner signs that exact subject using the independent private key
53
+ the signed R70 approval is submitted as data, not as an owner key
54
+ R186 preflight may then report verified_readonly
55
+
56
+ STILL REQUIRED BEFORE ARMING OR PUBLISH
57
+
58
+ a separate protected one-time acceptance broker that consumes the owner approval
59
+ owner proof bound to native signed epoch and no-clobber race/crash recovery
60
+ agent-writable consent receipts must never act as grant issuance authority
61
+ controller Arm-Autonomous must invoke that protected broker on the current
62
+ verified runtime with no fallback to a writable source or caller-supplied key
63
+ the owner must explicitly approve this new authority issuance
64
+ run full protected regression again on exact new tarball
65
+ run real foreground live integration without revoking owner standing grants
66
+ publish only after independent release gate passes
67
+ activation is a separate user-approved step
68
+
69
+ NO PUBLISH AND NO GRANT HAVE OCCURRED IN R186
70
+
71
+ LIVE OWNER TRUST INVENTORY / 2026-10-28
72
+
73
+ old public key: C:\Users\DEADBYTE\.deadbyte-mcp\trust\r70-owner-public.pem
74
+ format: Ed25519 public only
75
+ SPKI DER SHA256: b07c6312673a190af6ac40fe86830dfe8c60e2747405f5151b9ae9bb9a71ad10
76
+ owner: local DEADBYTE account, writable to that account
77
+ R89 result: EPOCH_NATIVE_SLOT_UNTRUSTED
78
+ new protected C:\Program Files\DEADBYTE-OwnerTrust enrollment: NOT PRESENT
79
+
80
+ this fingerprint is an observation, not independent proof of owner enrollment
81
+ before any migration, the owner must compare it out of band with the key held
82
+ on their independent device and approve exact scope and expiry
83
+
84
+ R186 FOCUSED RESULT
85
+ 29 pass / 0 fail / 0 skip for R70, R174 and R186
86
+ independent trust enrollment: NOT RUN
87
+ one-time protected grant issuance: NOT IMPLEMENTED
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deadbyte-mcp",
3
- "version": "0.15.68",
3
+ "version": "0.15.69",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Authenticated MCP agentic runtime with signed skills, persistent model backends, identity-bound remote devices, durable job supervision, immutable release slots, and separately revocable machine authority.",
@@ -0,0 +1,59 @@
1
+ #requires -Version 5.1
2
+ #requires -RunAsAdministrator
3
+ [CmdletBinding()]
4
+ param(
5
+ [Parameter(Mandatory=$true)][string]$OwnerPublicKeyPath,
6
+ [Parameter(Mandatory=$true)][string]$NodePath
7
+ )
8
+ $ErrorActionPreference = 'Stop'
9
+ $target = 'C:\Program Files\DEADBYTE-OwnerTrust'
10
+ $packageRoot = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..'))
11
+ $programFiles = [System.IO.Path]::GetFullPath($env:ProgramFiles).TrimEnd('\') + '\'
12
+ if (-not ($packageRoot.TrimEnd('\') + '\').StartsWith($programFiles,[System.StringComparison]::OrdinalIgnoreCase)) {
13
+ throw 'R186 owner enrollment installer must run from a protected Program Files package'
14
+ }
15
+ if (-not (Test-Path -LiteralPath $NodePath -PathType Leaf)) { throw 'R186 Node executable missing' }
16
+ if (-not (Test-Path -LiteralPath $OwnerPublicKeyPath -PathType Leaf)) { throw 'R186 owner public key missing' }
17
+ if (Test-Path -LiteralPath $target) { throw 'R186 owner trust already exists; replacement requires a separate revocation workflow' }
18
+ $inspect = Join-Path $packageRoot 'scripts\r186-owner-anchor-inspect.mjs'
19
+ if (-not (Test-Path -LiteralPath $inspect -PathType Leaf)) { throw 'R186 protected anchor inspector missing' }
20
+ $json = @(& $NodePath $inspect ([System.IO.Path]::GetFullPath($OwnerPublicKeyPath))) -join [Environment]::NewLine
21
+ if ($LASTEXITCODE -ne 0) { throw 'R186 owner public key inspection failed' }
22
+ $material = $json | ConvertFrom-Json
23
+ if ([string]$material.anchor.schema -cne 'deadbyte.r186-owner-anchor.v1' -or
24
+ [string]$material.anchor.owner_key_id -cnotmatch '^[0-9a-f]{64}$' -or
25
+ [string]$material.public_key_pem -notmatch 'BEGIN PUBLIC KEY') { throw 'R186 owner anchor material invalid' }
26
+ Write-Host ''
27
+ Write-Host 'DEADBYTE OWNER KEY FINGERPRINT (SHA-256 SPKI):'
28
+ Write-Host ([string]$material.anchor.owner_key_id) -ForegroundColor Yellow
29
+ Write-Host 'Confirm this fingerprint using your independent owner-key display.'
30
+ $typed = Read-Host 'Type the complete 64-character fingerprint to enroll it'
31
+ if ([string]$typed -cne [string]$material.anchor.owner_key_id) { throw 'R186 owner fingerprint confirmation mismatch' }
32
+
33
+ $admins = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')
34
+ $system = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-18')
35
+ $users = New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-545')
36
+ $inherit = [System.Security.AccessControl.InheritanceFlags]'ContainerInherit, ObjectInherit'
37
+ $none = [System.Security.AccessControl.PropagationFlags]::None
38
+ $allow = [System.Security.AccessControl.AccessControlType]::Allow
39
+ New-Item -ItemType Directory -Path $target -ErrorAction Stop | Out-Null
40
+ $dirAcl = New-Object System.Security.AccessControl.DirectorySecurity
41
+ $dirAcl.SetAccessRuleProtection($true,$false)
42
+ $dirAcl.SetOwner($admins)
43
+ $dirAcl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule($admins,'FullControl',$inherit,$none,$allow)))
44
+ $dirAcl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule($system,'FullControl',$inherit,$none,$allow)))
45
+ $dirAcl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule($users,'ReadAndExecute',$inherit,$none,$allow)))
46
+ Set-Acl -LiteralPath $target -AclObject $dirAcl
47
+
48
+ $utf8 = New-Object System.Text.UTF8Encoding($false)
49
+ $anchorPath = Join-Path $target 'owner-anchor.json'
50
+ $keyPath = Join-Path $target 'owner-public.pem'
51
+ $anchorText = $material.anchor | ConvertTo-Json -Compress
52
+ foreach ($entry in @(@($anchorPath,$anchorText),@($keyPath,[string]$material.public_key_pem))) {
53
+ $stream = [System.IO.File]::Open([string]$entry[0],[System.IO.FileMode]::CreateNew,[System.IO.FileAccess]::Write,[System.IO.FileShare]::None)
54
+ try {
55
+ $writer = New-Object System.IO.StreamWriter($stream,$utf8)
56
+ try { $writer.Write([string]$entry[1]); $writer.Flush(); $stream.Flush($true) } finally { $writer.Dispose() }
57
+ } finally { $stream.Dispose() }
58
+ }
59
+ Write-Host "R186_OWNER_TRUST_ENROLLED owner_key_id=$($material.anchor.owner_key_id)"
@@ -0,0 +1,38 @@
1
+ // R175 development-only verification runner. Executes fixed local tests, not production.
2
+ import {spawnSync} from 'node:child_process';
3
+ import path from 'node:path';
4
+ import {fileURLToPath} from 'node:url';
5
+
6
+ const repo=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
7
+ const groups=Object.freeze({
8
+ boundary:['r175-foreground-boundary','r175-guardian-owner-boundary','r175-cli-flags',
9
+ 'remote-live-log-recovery-r36','stabilization-guardian',
10
+ 'r58-guardian-channel','r76-pinned-marker-cas'],
11
+ owner:['r174-owner-webauthn','r70-owner-approval','r70-autonomous-grant-expiry',
12
+ 'r70-autonomous-policy-bootstrap','r70-controller-owner-issue-boundary'],
13
+ legacy:['r51-runtime-coherence','r72-remote-safe-contract'],
14
+ logs:['r176-pretty-live-log','r155-default-live-log','remote-live-log-r37','r155-commander-live-log','r67-live-log-secret-canary','r177-windows-absolute-live-path'],
15
+ foreground:['remote-session-cli']
16
+ });
17
+ const group=process.argv[2]??'boundary';
18
+ if(!Object.hasOwn(groups,group))throw Error('R175 test group invalid');
19
+ for(const p of ['src/deadbyte-cli.mjs','src/remote-session-guardian.mjs','src/r175-foreground-boundary.mjs']){
20
+ const c=spawnSync(process.execPath,['--check',p],{cwd:repo,encoding:'utf8',windowsHide:true,timeout:20000});
21
+ if(c.error||c.status!==0)throw Error('R175 syntax '+p+': '+String(c.stderr||c.error));
22
+ }
23
+ const tests=groups[group].map(x=>'test/'+x+'.test.mjs');
24
+ const r=spawnSync(process.execPath,['--test','--test-concurrency=1',...tests],{
25
+ cwd:repo,encoding:'utf8',windowsHide:true,timeout:180000,
26
+ maxBuffer:12*1024*1024
27
+ });
28
+ const log=(r.stdout??'')+(r.stderr??'');
29
+ const output=log.split(/\r?\n/);
30
+ for(const row of output.filter(x=>/^(ℹ (tests|pass|fail|skipped|duration_ms)|✔|✖)/.test(x)).slice(-40))
31
+ process.stdout.write(row+'\n');
32
+ process.stdout.write('R175_GROUP='+group+' EXIT='+String(r.status)+'\n');
33
+ if(r.error)process.stderr.write('R175_RUNNER_ERROR='+String(r.error)+'\n');
34
+ if(r.status!==0){
35
+ const errors=output.filter(x=>/Error:|AssertionError|Missing expected|expected|actual|✖|fail/gi.test(x));
36
+ for(const line of errors.slice(-25))process.stderr.write(line.slice(0,700)+'\n');
37
+ process.exitCode=1;
38
+ }
@@ -0,0 +1,18 @@
1
+ // R176 presentation preview with fixed synthetic events. No runtime access.
2
+ import {createLiveTimelineTracker,defaultForegroundTimelineOptions} from '../src/remote-live-log.mjs';
3
+ const base=Date.parse('2026-10-27T12:25:56.000Z');let offset=0;
4
+ const tracker=createLiveTimelineTracker({clock:()=>base+offset,rootPaths:{projects:String.raw`D:\Projects`},...defaultForegroundTimelineOptions({verbose:false})});
5
+ let seq=0;
6
+ function send(e){const lines=tracker.observe(e,{sequence:++seq});for(const l of (Array.isArray(lines)?lines:[lines]))if(l)process.stdout.write(l+'\n');}
7
+ function call(requestId,tool,args,ms,status='ok',reason=null){
8
+ offset+=ms;send({event_type:'tool.request',tool,request_id:requestId,args});
9
+ offset+=ms;send({event_type:'tool.result',tool,request_id:requestId,
10
+ outcome:{status,is_error:status==='denied',duration_ms:ms, ...(reason?{reason}:{})}});
11
+ }
12
+ call('r176-write-preview','coding_file_write',{root_id:'projects',path:'deadbyte-mcp/development/deadbyte-mcp-0.15.69-r174-owner-consent/src/alpha.mjs',content:'example-only'},17);
13
+ for(let i=0;i<5;i++)call('poll-'+i,'machine_status',{},2);
14
+ call('r176-denied','host_file_read',{root_id:'core',path:'secret-file'},1,'denied','arm file missing');
15
+ offset+=1;send({event_type:'tool.request',tool:'coding_file_write',request_id:'r176-unknown',args:{root_id:'core',path:'output.bin'}});
16
+ offset+=1;send({event_type:'tool.result',tool:'coding_file_write',request_id:'r176-unknown',outcome:{status:'interrupted',side_effect_state:'unknown',reason:'result unavailable after dispatch'}});
17
+ for(const l of tracker.reconcileInterrupted())process.stdout.write(l+'\n');
18
+ process.stdout.write(tracker.summary()+'\n');
@@ -0,0 +1,36 @@
1
+ $ErrorActionPreference='Stop'
2
+ $state=Join-Path $HOME '.deadbyte-mcp'
3
+ $trust=Join-Path $state 'trust'
4
+ $pub=Join-Path $trust 'r70-owner-public.pem'
5
+ Write-Output ('R177_TRUST_DIR_EXISTS='+(Test-Path -LiteralPath $trust -PathType Container))
6
+ Write-Output ('R177_OWNER_PUBLIC_KEY_EXISTS='+(Test-Path -LiteralPath $pub -PathType Leaf))
7
+ if(Test-Path -LiteralPath $pub -PathType Leaf){
8
+ $entry=Get-Item -LiteralPath $pub
9
+ $acl=Get-Acl -LiteralPath $pub
10
+ Write-Output ('R177_PUBLIC_KEY_BYTES='+$entry.Length)
11
+ Write-Output ('R177_PUBLIC_KEY_SHA256='+(Get-FileHash -LiteralPath $pub -Algorithm SHA256).Hash.ToLowerInvariant())
12
+ Write-Output ('R177_PUBLIC_KEY_OWNER='+$acl.Owner)
13
+ Write-Output ('R177_PUBLIC_KEY_READONLY='+$entry.IsReadOnly)
14
+ }
15
+ $activePath=Join-Path $state 'active-release.json'
16
+ if(Test-Path $activePath){
17
+ $a=Get-Content -LiteralPath $activePath -Raw|ConvertFrom-Json
18
+ Write-Output ('R177_ACTIVE_VERSION='+$a.version)
19
+ Write-Output ('R177_ACTIVE_RELEASE='+$a.release_id)
20
+ $codingFile=Join-Path $a.generation_root 'coding-policy.json'
21
+ if(Test-Path $codingFile){
22
+ $policy=Get-Content -LiteralPath $codingFile -Raw|ConvertFrom-Json
23
+ foreach($root in $policy.roots.PSObject.Properties){
24
+ Write-Output ('R177_CODING_ROOT='+$root.Name+' exec='+[bool]$root.Value.exec+' write='+[bool]$root.Value.write)
25
+ }
26
+ }
27
+ }
28
+ $evidence=Join-Path $state 'evidence'
29
+ if(Test-Path -LiteralPath $evidence){
30
+ Get-ChildItem -LiteralPath $evidence -Recurse -File -ErrorAction SilentlyContinue|
31
+ Where-Object { $_.Name -match 'owner|approval|enrollment' }|
32
+ Sort-Object LastWriteTimeUtc -Descending|
33
+ Select-Object -First 12 |
34
+ ForEach-Object{Write-Output ('R177_OWNER_EVIDENCE_NAME='+$_.Name+' size='+$_.Length+' utc='+$_.LastWriteTimeUtc.ToString('o'))}
35
+ }
36
+ Write-Output 'R177_READ_ONLY_COMPLETE=true'
@@ -0,0 +1,21 @@
1
+ import {spawnSync} from 'node:child_process';
2
+ import {readdirSync,mkdirSync,writeFileSync,readFileSync} from 'node:fs';
3
+ import {createHash} from 'node:crypto';
4
+ import path from 'node:path';
5
+ const root=path.resolve(import.meta.dirname,'..');
6
+ const testRoot=path.join(root,'test');
7
+ const files=readdirSync(testRoot).filter(n=>n.endsWith('.test.mjs')).sort().map(n=>path.join('test',n));
8
+ const outDir=path.resolve(root,'..','..','testing','r178-01569-candidate');
9
+ mkdirSync(outDir,{recursive:true});
10
+ const args=['--test','--test-concurrency=4',...files];
11
+ console.log('R178_TOTAL_TEST_FILES='+files.length);
12
+ const result=spawnSync(process.execPath,args,{cwd:root,encoding:'utf8',windowsHide:true,timeout:300000,maxBuffer:40*1024*1024,
13
+ env:{...process.env,DEADBYTE_RELEASE_TEST:'1'}});
14
+ const log=String(result.stdout||'')+'\n=== STDERR ===\n'+String(result.stderr||'');
15
+ const fp=path.join(outDir,'R178-FULL-REGRESSION.txt');
16
+ writeFileSync(fp,log);
17
+ console.log('R178_FULL_EXIT='+result.status+' signal='+result.signal+' error='+String(result.error?.code??'none'));
18
+ for(const l of log.split(/\r?\n/).filter(s=>/^(ℹ (tests|pass|fail|skipped|duration_ms)|# (tests|pass|fail|skipped|duration_ms)|✖|not ok)/.test(s)).slice(-30))console.log(l.slice(0,300));
19
+ console.log('R178_EVIDENCE='+fp);
20
+ console.log('R178_EVIDENCE_SHA256='+createHash('sha256').update(readFileSync(fp)).digest('hex'));
21
+ if(result.status!==0)process.exitCode=1;
@@ -0,0 +1,10 @@
1
+ import {spawnSync} from 'node:child_process';
2
+ import path from 'node:path';
3
+ const root=path.resolve(import.meta.dirname,'..');
4
+ const npm=process.env.npm_execpath||path.join(path.dirname(process.execPath),'node_modules','npm','bin','npm-cli.js');
5
+ const r=spawnSync(process.execPath,[npm,'ci','--ignore-scripts','--no-audit','--no-fund','--prefer-offline'],{cwd:root,encoding:'utf8',timeout:180000,windowsHide:true,maxBuffer:1024*1024});
6
+ console.log('NPM_CI_EXIT='+r.status);
7
+ if(r.error)console.log('NPM_CI_ERROR='+String(r.error.code));
8
+ console.log('NPM_CI_STDOUT='+String(r.stdout||'').slice(-1500));
9
+ console.log('NPM_CI_STDERR='+String(r.stderr||'').slice(-1500));
10
+ if(r.status!==0)process.exitCode=1;