deadbyte-mcp 0.15.39 → 0.15.42
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.
- package/DEADBYTE-MCP.cmd +8 -4
- package/MANIFEST.SHA256 +99 -45
- package/PROVENANCE.json +90 -20
- package/README.txt +39 -18
- package/RELEASE.json +85 -20
- package/SBOM.cdx.json +2 -2
- package/TEST-MATRIX.json +134 -34
- package/bridge/package.json +1 -1
- package/controller/deadbyte-controller.ps1 +132 -12
- package/controller/deadbyte-process-policy.json +4 -4
- package/docs/R64-EVIDENCE.json +95 -0
- package/docs/R64-REFERENCE-GAP-MATRIX.json +98 -0
- package/docs/R64-SCOPE.json +41 -0
- package/docs/R65-AUTHORITY-CONTINUITY-DESIGN.json +27 -0
- package/docs/R65-REFERENCE-GAP-MATRIX.json +22 -0
- package/package.json +7 -4
- package/scripts/deploy-r48.mjs +123 -7
- package/scripts/gate-windows-r63-prepublish.ps1 +45 -0
- package/scripts/gate-windows-r64-prepublish.ps1 +68 -0
- package/scripts/gate-windows-r65-prepublish.ps1 +65 -0
- package/scripts/npm-publication-r65.mjs +139 -0
- package/scripts/npm-release-r48.mjs +62 -37
- package/scripts/r64-predecessor-reproducer.mjs +32 -0
- package/scripts/r64-read-benchmark.mjs +84 -0
- package/scripts/r65-canonical-full.mjs +45 -0
- package/scripts/r65-focused.mjs +37 -0
- package/scripts/verify-r65-parent-source.mjs +75 -0
- package/src/activation-continuity-engine-r65.mjs +225 -0
- package/src/activation-lock-r65.mjs +155 -0
- package/src/activation-preflight-r65.mjs +197 -0
- package/src/authority-continuity-r65.mjs +541 -0
- package/src/authority-epoch-cli-r65.mjs +10 -0
- package/src/autonomous-policy.mjs +7 -3
- package/src/coding-plane.mjs +12 -3
- package/src/compact-gateway-mcp-tools.mjs +1 -1
- package/src/deadbyte-cli.mjs +16 -2
- package/src/desktop-policy-r40.mjs +6 -3
- package/src/doctor-transactions-r58.mjs +1 -1
- package/src/host-plane.mjs +9 -3
- package/src/machine-fs-mcp-tools.mjs +1 -1
- package/src/machine-fs.mjs +7 -4
- package/src/process-policy.mjs +7 -4
- package/src/remote-authority.mjs +20 -1
- package/src/runtime-update.mjs +15 -5
- package/src/version.mjs +1 -1
- package/test/audit-context.test.mjs +15 -4
- package/test/autonomous-local-supervisor.test.mjs +7 -6
- package/test/autonomous-supervisor-integration.test.mjs +8 -7
- package/test/capability-resolver.test.mjs +11 -5
- package/test/codex-autonomous-r44.test.mjs +7 -6
- package/test/coding-observation.test.mjs +4 -3
- package/test/commander-real-parity-r47.test.mjs +5 -4
- package/test/commander-torture-r47.test.mjs +5 -4
- package/test/desktop-policy-r40.test.mjs +6 -4
- package/test/desktop-runtime-r40.test.mjs +8 -3
- package/test/host-inline-r45.test.mjs +4 -3
- package/test/machine-fs-runtime.test.mjs +4 -3
- package/test/process-longrun-r36.test.mjs +3 -2
- package/test/process-policy.test.mjs +10 -6
- package/test/process-runtime.test.mjs +9 -6
- package/test/r52-host-revocation.test.mjs +1 -0
- package/test/r59-tool-surface-compat.test.mjs +14 -4
- package/test/r62-release-contract.test.mjs +2 -1
- package/test/r63-one-shot-coherence.test.mjs +38 -0
- package/test/r63-release-contract.test.mjs +59 -0
- package/test/r64-machine-fs-large-read.test.mjs +136 -0
- package/test/r64-release-contract.test.mjs +52 -0
- package/test/r65-activation-lock-recovery.test.mjs +72 -0
- package/test/r65-activation-lock.test.mjs +59 -0
- package/test/r65-activation-orchestration.test.mjs +179 -0
- package/test/r65-activation-preflight.test.mjs +35 -0
- package/test/r65-authority-continuity-decision.test.mjs +58 -0
- package/test/r65-authority-durable-policy-binding.test.mjs +34 -0
- package/test/r65-authority-epoch-cli.test.mjs +125 -0
- package/test/r65-authority-epoch-races.test.mjs +87 -0
- package/test/r65-authority-epoch-recovery.test.mjs +82 -0
- package/test/r65-authority-epoch-store.test.mjs +94 -0
- package/test/r65-authority-fixture.mjs +41 -0
- package/test/r65-authority-grant-capture.test.mjs +37 -0
- package/test/r65-authority-observation-epoch.test.mjs +25 -0
- package/test/r65-authority-policy-envelope.test.mjs +46 -0
- package/test/r65-authority-restored-safe.test.mjs +75 -0
- package/test/r65-authority-runtime-epoch.test.mjs +115 -0
- package/test/r65-authority-runtime-policy-binding.test.mjs +29 -0
- package/test/r65-authority-test-trust.mjs +20 -0
- package/test/r65-cli-invocation.test.mjs +38 -0
- package/test/r65-controller-authority-epoch-live.test.mjs +100 -0
- package/test/r65-controller-authority-epoch.test.mjs +37 -0
- package/test/r65-deploy-preflight.test.mjs +55 -0
- package/test/r65-epoch-native-activation-integration.test.mjs +141 -0
- package/test/r65-epoch-native-continuity-engine.test.mjs +112 -0
- package/test/r65-epoch-native-cross-plane.test.mjs +95 -0
- package/test/r65-legacy-authority-migration.test.mjs +63 -0
- package/test/r65-legacy-auto-restore-rejection.test.mjs +17 -0
- package/test/r65-npm-publication.test.mjs +114 -0
- package/test/r65-parent-source-verifier.test.mjs +63 -0
- package/test/r65-release-contract.test.mjs +74 -0
- package/test/r65-transaction-precondition.test.mjs +36 -0
- package/test/remote-session-cli.test.mjs +13 -11
- package/test/standing-grants.test.mjs +20 -4
|
@@ -937,6 +937,47 @@ function Assert-PolicyRootsAvailable($Policy, [string]$Plane) {
|
|
|
937
937
|
return $rootIds
|
|
938
938
|
}
|
|
939
939
|
|
|
940
|
+
function Get-AuthorityEpochStatus($Cfg, [string]$Plane, [string]$GrantFile, [string]$GrantNonce) {
|
|
941
|
+
if ([string]::IsNullOrWhiteSpace($GrantNonce) -or $GrantNonce -cnotmatch '^[0-9a-f]{64}$') {
|
|
942
|
+
return [pscustomobject]@{ Trusted=$false; Reason='epoch-grant-nonce-invalid'; Seq=$null; Action=$null; EventSha256=$null }
|
|
943
|
+
}
|
|
944
|
+
try {
|
|
945
|
+
$verified = Invoke-AuthorityEpochCommand $Cfg $Plane 'status' $GrantFile
|
|
946
|
+
if (-not $verified.trusted) {
|
|
947
|
+
return [pscustomobject]@{ Trusted=$false; Reason=[string]$verified.reason; Seq=$verified.seq; Action=$verified.action; EventSha256=$verified.event_sha256 }
|
|
948
|
+
}
|
|
949
|
+
return [pscustomobject]@{ Trusted=$true; Reason=[string]$verified.reason; Seq=$verified.seq; Action=$verified.action; EventSha256=$verified.event_sha256 }
|
|
950
|
+
} catch {
|
|
951
|
+
return [pscustomobject]@{ Trusted=$false; Reason='authority-epoch-verifier-unavailable'; Seq=$null; Action=$null; EventSha256=$null }
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
function Invoke-AuthorityEpochCommand($Cfg, [string]$Plane, [string]$Action, [string]$GrantFile, [string]$UpdateId = '', [string]$ExpectedHead = '') {
|
|
956
|
+
$cli = Join-Path ([string]$Cfg.CoreRoot) 'src\authority-epoch-cli-r65.mjs'
|
|
957
|
+
if (-not (Test-Path -LiteralPath $cli -PathType Leaf)) { Fail "authority epoch CLI missing: $cli" }
|
|
958
|
+
$node = [string]$Cfg.Bridge.FilePath
|
|
959
|
+
if ([string]::IsNullOrWhiteSpace($node) -or -not (Test-Path -LiteralPath $node -PathType Leaf)) { Fail 'authority epoch Node executable unavailable' }
|
|
960
|
+
$policyFile = switch ($Plane) {
|
|
961
|
+
'process' { [string]$Cfg.ProcessPolicyFile }
|
|
962
|
+
'coding' { [string]$Cfg.CodingPolicyFile }
|
|
963
|
+
'autonomous' { [string]$Cfg.AutonomousPolicyFile }
|
|
964
|
+
'desktop' { [string]$Cfg.DesktopPolicyFile }
|
|
965
|
+
'host' { [string]$Cfg.HostPolicyFile }
|
|
966
|
+
default { Fail "authority epoch plane invalid: $Plane" }
|
|
967
|
+
}
|
|
968
|
+
if ([string]::IsNullOrWhiteSpace($policyFile) -or -not (Test-Path -LiteralPath $policyFile -PathType Leaf)) { Fail "authority epoch policy unavailable for $Plane" }
|
|
969
|
+
$args = @($cli, $Action, '--plane', $Plane, '--grant-file', $GrantFile, '--policy-file', $policyFile)
|
|
970
|
+
if ($Action -in @('transaction-revoke','transaction-restore')) {
|
|
971
|
+
if ([string]::IsNullOrWhiteSpace($UpdateId) -or $ExpectedHead -cnotmatch '^[0-9a-f]{64}$') { Fail 'authority epoch transaction binding invalid' }
|
|
972
|
+
$args += @('--update-id', $UpdateId, '--expected-head', $ExpectedHead)
|
|
973
|
+
}
|
|
974
|
+
$output = @(& $node @args)
|
|
975
|
+
$exit = $LASTEXITCODE
|
|
976
|
+
if ($exit -ne 0) { Fail "authority epoch command '$Action' failed for $Plane (exit=$exit)" }
|
|
977
|
+
try { return (($output -join [Environment]::NewLine) | ConvertFrom-Json) }
|
|
978
|
+
catch { Fail "authority epoch command '$Action' returned invalid JSON for $Plane" }
|
|
979
|
+
}
|
|
980
|
+
|
|
940
981
|
function Get-HostPolicyMetadata($Cfg) {
|
|
941
982
|
if ([string]::IsNullOrWhiteSpace([string]$Cfg.HostPolicyFile)) { Fail 'privileged host plane is not configured' }
|
|
942
983
|
$policyPath = [string]$Cfg.HostPolicyFile
|
|
@@ -961,7 +1002,10 @@ function Get-HostArmStatus($Cfg) {
|
|
|
961
1002
|
try { $arm = Get-Content -LiteralPath $meta.ArmFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='invalid-grant' } }
|
|
962
1003
|
if ($arm.schema -ne 'deadbyte.host-grant.v2') { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='grant-schema' } }
|
|
963
1004
|
if ([string]$arm.policy_sha256 -ne [string]$meta.Sha256) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='policy-digest' } }
|
|
964
|
-
return [pscustomobject]@{ Configured=$true; Armed=$
|
|
1005
|
+
if ([string]$arm.instance_nonce -cnotmatch '^[0-9a-f]{64}$') { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='nonce-invalid' } }
|
|
1006
|
+
$epoch = Get-AuthorityEpochStatus $Cfg 'host' $meta.ArmFile ([string]$arm.instance_nonce)
|
|
1007
|
+
if (-not $epoch.Trusted) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason=[string]$epoch.Reason } }
|
|
1008
|
+
return [pscustomobject]@{ Configured=$true; Armed=$true; Reason='standing-grant'; EpochSeq=$epoch.Seq; EpochSha256=$epoch.EventSha256 }
|
|
965
1009
|
}
|
|
966
1010
|
|
|
967
1011
|
function Arm-Host($Cfg) {
|
|
@@ -981,15 +1025,23 @@ function Arm-Host($Cfg) {
|
|
|
981
1025
|
$tmp = $meta.ArmFile + '.tmp'
|
|
982
1026
|
$body | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath $tmp -Encoding UTF8
|
|
983
1027
|
Move-Item -LiteralPath $tmp -Destination $meta.ArmFile -Force
|
|
1028
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'host' 'grant' $meta.ArmFile | Out-Null }
|
|
1029
|
+
catch {
|
|
1030
|
+
Remove-Item -LiteralPath $meta.ArmFile -Force -ErrorAction SilentlyContinue
|
|
1031
|
+
throw
|
|
1032
|
+
}
|
|
984
1033
|
Write-Host 'PRIVILEGED HOST PLANE ENABLED UNTIL EXPLICIT REVOKE'
|
|
985
1034
|
}
|
|
986
1035
|
|
|
987
1036
|
function Disarm-Host($Cfg) {
|
|
988
1037
|
$meta = Get-HostPolicyMetadata $Cfg
|
|
1038
|
+
$epochError = $null
|
|
989
1039
|
if (Test-Path -LiteralPath $meta.ArmFile) {
|
|
990
|
-
|
|
1040
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'host' 'user-revoke' $meta.ArmFile | Out-Null } catch { $epochError = $_.Exception }
|
|
1041
|
+
Remove-Item -LiteralPath $meta.ArmFile -Force -ErrorAction SilentlyContinue
|
|
991
1042
|
}
|
|
992
1043
|
if (Test-Path -LiteralPath $meta.ArmFile) { throw 'Host authority revocation failed: grant remains present' }
|
|
1044
|
+
if ($null -ne $epochError) { throw $epochError }
|
|
993
1045
|
Write-Host 'PRIVILEGED HOST PLANE DISARMED'
|
|
994
1046
|
}
|
|
995
1047
|
|
|
@@ -1021,10 +1073,13 @@ function Get-ProcessGrantStatus($Cfg) {
|
|
|
1021
1073
|
try { $grant = Get-Content -LiteralPath $meta.GrantFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='invalid-grant' } }
|
|
1022
1074
|
if ($grant.schema -ne 'deadbyte.process-grant.v1') { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='grant-schema' } }
|
|
1023
1075
|
if ([string]$grant.policy_sha256 -ne [string]$meta.Sha256) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='policy-digest' } }
|
|
1076
|
+
if ([string]$grant.instance_nonce -cnotmatch '^[0-9a-f]{64}$') { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='nonce-invalid' } }
|
|
1024
1077
|
$profiles = @($grant.profile_ids); $roots = @($grant.root_ids)
|
|
1025
1078
|
if ($profiles.Count -lt 1 -or @($profiles | Where-Object { $_ -notin $meta.ProfileIds }).Count -gt 0) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='profiles-invalid' } }
|
|
1026
1079
|
if ($roots.Count -lt 1 -or @($roots | Where-Object { $_ -notin $meta.RootIds }).Count -gt 0) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='roots-invalid' } }
|
|
1027
|
-
|
|
1080
|
+
$epoch = Get-AuthorityEpochStatus $Cfg 'process' $meta.GrantFile ([string]$grant.instance_nonce)
|
|
1081
|
+
if (-not $epoch.Trusted) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason=[string]$epoch.Reason } }
|
|
1082
|
+
return [pscustomobject]@{ Configured=$true; Armed=$true; Reason='standing-grant'; EpochSeq=$epoch.Seq; EpochSha256=$epoch.EventSha256 }
|
|
1028
1083
|
}
|
|
1029
1084
|
|
|
1030
1085
|
function Arm-Process($Cfg) {
|
|
@@ -1045,12 +1100,23 @@ function Arm-Process($Cfg) {
|
|
|
1045
1100
|
$tmp = $meta.GrantFile + '.tmp'
|
|
1046
1101
|
$body | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath $tmp -Encoding UTF8
|
|
1047
1102
|
Move-Item -LiteralPath $tmp -Destination $meta.GrantFile -Force
|
|
1103
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'process' 'grant' $meta.GrantFile | Out-Null }
|
|
1104
|
+
catch {
|
|
1105
|
+
Remove-Item -LiteralPath $meta.GrantFile -Force -ErrorAction SilentlyContinue
|
|
1106
|
+
throw
|
|
1107
|
+
}
|
|
1048
1108
|
Write-Host 'PROCESS PLANE ENABLED UNTIL EXPLICIT REVOKE'
|
|
1049
1109
|
}
|
|
1050
1110
|
|
|
1051
1111
|
function Disarm-Process($Cfg) {
|
|
1052
1112
|
$meta = Get-ProcessPolicyMetadata $Cfg
|
|
1053
|
-
|
|
1113
|
+
$epochError = $null
|
|
1114
|
+
if (Test-Path -LiteralPath $meta.GrantFile -PathType Leaf) {
|
|
1115
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'process' 'user-revoke' $meta.GrantFile | Out-Null } catch { $epochError = $_.Exception }
|
|
1116
|
+
Remove-Item -LiteralPath $meta.GrantFile -Force -ErrorAction SilentlyContinue
|
|
1117
|
+
}
|
|
1118
|
+
if (Test-Path -LiteralPath $meta.GrantFile) { throw 'Process authority revocation failed: grant remains present' }
|
|
1119
|
+
if ($null -ne $epochError) { throw $epochError }
|
|
1054
1120
|
Write-Host 'PROCESS PLANE DISARMED'
|
|
1055
1121
|
}
|
|
1056
1122
|
|
|
@@ -1080,9 +1146,12 @@ function Get-CodingLeaseStatus($Cfg) {
|
|
|
1080
1146
|
try { $lease = Get-Content -LiteralPath $meta.LeaseFile -Raw -Encoding UTF8 | ConvertFrom-Json } catch { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='invalid-grant' } }
|
|
1081
1147
|
if ($lease.schema -ne 'deadbyte.coding-grant.v2') { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='grant-schema' } }
|
|
1082
1148
|
if ([string]$lease.policy_sha256 -ne [string]$meta.Sha256) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='policy-digest' } }
|
|
1149
|
+
if ([string]$lease.instance_nonce -cnotmatch '^[0-9a-f]{64}$') { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='nonce-invalid' } }
|
|
1083
1150
|
$roots = @($lease.root_ids)
|
|
1084
1151
|
if ($roots.Count -lt 1 -or @($roots | Where-Object { $_ -notin $meta.RootIds }).Count -gt 0) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='roots-invalid' } }
|
|
1085
|
-
|
|
1152
|
+
$epoch = Get-AuthorityEpochStatus $Cfg 'coding' $meta.LeaseFile ([string]$lease.instance_nonce)
|
|
1153
|
+
if (-not $epoch.Trusted) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason=[string]$epoch.Reason } }
|
|
1154
|
+
return [pscustomobject]@{ Configured=$true; Armed=$true; Reason='standing-grant'; EpochSeq=$epoch.Seq; EpochSha256=$epoch.EventSha256 }
|
|
1086
1155
|
}
|
|
1087
1156
|
|
|
1088
1157
|
function Arm-Coding($Cfg) {
|
|
@@ -1103,13 +1172,27 @@ function Arm-Coding($Cfg) {
|
|
|
1103
1172
|
$tmp = $meta.LeaseFile + '.tmp'
|
|
1104
1173
|
$body | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath $tmp -Encoding UTF8
|
|
1105
1174
|
Move-Item -LiteralPath $tmp -Destination $meta.LeaseFile -Force
|
|
1175
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'coding' 'grant' $meta.LeaseFile | Out-Null }
|
|
1176
|
+
catch {
|
|
1177
|
+
Remove-Item -LiteralPath $meta.LeaseFile -Force -ErrorAction SilentlyContinue
|
|
1178
|
+
throw
|
|
1179
|
+
}
|
|
1106
1180
|
Write-Host 'CODING PLANE ENABLED UNTIL EXPLICIT REVOKE'
|
|
1107
1181
|
}
|
|
1108
1182
|
|
|
1109
1183
|
function Disarm-Coding($Cfg) {
|
|
1110
1184
|
$meta = Get-CodingPolicyMetadata $Cfg
|
|
1111
|
-
|
|
1112
|
-
|
|
1185
|
+
$epochError = $null
|
|
1186
|
+
if (Test-Path -LiteralPath $meta.LeaseFile -PathType Leaf) {
|
|
1187
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'coding' 'user-revoke' $meta.LeaseFile | Out-Null } catch { $epochError = $_.Exception }
|
|
1188
|
+
Remove-Item -LiteralPath $meta.LeaseFile -Force -ErrorAction SilentlyContinue
|
|
1189
|
+
}
|
|
1190
|
+
try { Disarm-Autonomous $Cfg -Quiet } catch {
|
|
1191
|
+
if ($null -eq $epochError) { $epochError = $_.Exception }
|
|
1192
|
+
else { Write-Warning "autonomous lease cleanup failed after coding revocation: $($_.Exception.Message)" }
|
|
1193
|
+
}
|
|
1194
|
+
if (Test-Path -LiteralPath $meta.LeaseFile) { throw 'Coding authority revocation failed: grant remains present' }
|
|
1195
|
+
if ($null -ne $epochError) { throw $epochError }
|
|
1113
1196
|
Write-Host 'CODING PLANE DISARMED; AUTONOMOUS AUTHORITY REVOKED'
|
|
1114
1197
|
}
|
|
1115
1198
|
|
|
@@ -1145,9 +1228,12 @@ function Get-AutonomousLeaseStatus($Cfg) {
|
|
|
1145
1228
|
if ($lease.schema -ne 'deadbyte.autonomous-grant.v2') { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='grant-schema' } }
|
|
1146
1229
|
if ([string]$lease.policy_sha256 -ne [string]$meta.Sha256) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='policy-digest' } }
|
|
1147
1230
|
if ([string]$lease.coding_policy_sha256 -ne [string]$meta.CodingPolicySha256) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='coding-policy-digest' } }
|
|
1231
|
+
if ([string]$lease.instance_nonce -cnotmatch '^[0-9a-f]{64}$') { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='nonce-invalid' } }
|
|
1148
1232
|
$roots = @($lease.root_ids)
|
|
1149
1233
|
if ($roots.Count -lt 1 -or @($roots | Where-Object { $_ -notin $meta.RootIds }).Count -gt 0) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='roots-invalid' } }
|
|
1150
|
-
|
|
1234
|
+
$epoch = Get-AuthorityEpochStatus $Cfg 'autonomous' $meta.LeaseFile ([string]$lease.instance_nonce)
|
|
1235
|
+
if (-not $epoch.Trusted) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason=[string]$epoch.Reason } }
|
|
1236
|
+
return [pscustomobject]@{ Configured=$true; Armed=$true; Reason='standing-grant'; EpochSeq=$epoch.Seq; EpochSha256=$epoch.EventSha256 }
|
|
1151
1237
|
}
|
|
1152
1238
|
|
|
1153
1239
|
function Arm-Autonomous($Cfg) {
|
|
@@ -1164,13 +1250,24 @@ function Arm-Autonomous($Cfg) {
|
|
|
1164
1250
|
$tmp = $meta.LeaseFile + '.tmp'
|
|
1165
1251
|
$body | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath $tmp -Encoding UTF8
|
|
1166
1252
|
Move-Item -LiteralPath $tmp -Destination $meta.LeaseFile -Force
|
|
1253
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'autonomous' 'grant' $meta.LeaseFile | Out-Null }
|
|
1254
|
+
catch {
|
|
1255
|
+
Remove-Item -LiteralPath $meta.LeaseFile -Force -ErrorAction SilentlyContinue
|
|
1256
|
+
throw
|
|
1257
|
+
}
|
|
1167
1258
|
Write-Host 'AUTONOMOUS PLANE ENABLED UNTIL EXPLICIT REVOKE'
|
|
1168
1259
|
}
|
|
1169
1260
|
|
|
1170
1261
|
function Disarm-Autonomous($Cfg, [switch]$Quiet) {
|
|
1171
1262
|
if ([string]::IsNullOrWhiteSpace([string]$Cfg.AutonomousPolicyFile)) { return }
|
|
1172
1263
|
$meta = Get-AutonomousPolicyMetadata $Cfg
|
|
1173
|
-
|
|
1264
|
+
$epochError = $null
|
|
1265
|
+
if (Test-Path -LiteralPath $meta.LeaseFile -PathType Leaf) {
|
|
1266
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'autonomous' 'user-revoke' $meta.LeaseFile | Out-Null } catch { $epochError = $_.Exception }
|
|
1267
|
+
Remove-Item -LiteralPath $meta.LeaseFile -Force -ErrorAction SilentlyContinue
|
|
1268
|
+
}
|
|
1269
|
+
if (Test-Path -LiteralPath $meta.LeaseFile) { throw 'Autonomous authority revocation failed: grant remains present' }
|
|
1270
|
+
if ($null -ne $epochError) { throw $epochError }
|
|
1174
1271
|
if (-not $Quiet) { Write-Host 'AUTONOMOUS PLANE DISARMED' }
|
|
1175
1272
|
}
|
|
1176
1273
|
|
|
@@ -1244,7 +1341,9 @@ function Get-DesktopGrantStatus($Cfg) {
|
|
|
1244
1341
|
$unique = @($actions | Sort-Object -Unique)
|
|
1245
1342
|
if ($actions.Count -lt 1 -or $actions.Count -ne $unique.Count) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='actions-invalid'; ActionKinds=@() } }
|
|
1246
1343
|
if (@($actions | Where-Object { $_ -notin $meta.ActionKinds }).Count -gt 0) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason='actions-outside-policy'; ActionKinds=@() } }
|
|
1247
|
-
|
|
1344
|
+
$epoch = Get-AuthorityEpochStatus $Cfg 'desktop' $meta.GrantFile ([string]$grant.instance_nonce)
|
|
1345
|
+
if (-not $epoch.Trusted) { return [pscustomobject]@{ Configured=$true; Armed=$false; Reason=[string]$epoch.Reason; ActionKinds=$actions } }
|
|
1346
|
+
return [pscustomobject]@{ Configured=$true; Armed=$true; Reason='standing-grant'; ActionKinds=$actions; EpochSeq=$epoch.Seq; EpochSha256=$epoch.EventSha256 }
|
|
1248
1347
|
}
|
|
1249
1348
|
|
|
1250
1349
|
function Arm-Desktop($Cfg) {
|
|
@@ -1265,13 +1364,24 @@ function Arm-Desktop($Cfg) {
|
|
|
1265
1364
|
$tmp = $meta.GrantFile + '.tmp'
|
|
1266
1365
|
$body | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath $tmp -Encoding UTF8
|
|
1267
1366
|
Move-Item -LiteralPath $tmp -Destination $meta.GrantFile -Force
|
|
1367
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'desktop' 'grant' $meta.GrantFile | Out-Null }
|
|
1368
|
+
catch {
|
|
1369
|
+
Remove-Item -LiteralPath $meta.GrantFile -Force -ErrorAction SilentlyContinue
|
|
1370
|
+
throw
|
|
1371
|
+
}
|
|
1268
1372
|
Write-Host ("DESKTOP PLANE ENABLED UNTIL EXPLICIT REVOKE [{0}]" -f ($meta.ActionKinds -join ','))
|
|
1269
1373
|
}
|
|
1270
1374
|
|
|
1271
1375
|
function Disarm-Desktop($Cfg, [switch]$Quiet) {
|
|
1272
1376
|
$grantFile = Get-DesktopGrantFileForRevoke $Cfg
|
|
1273
1377
|
if ([string]::IsNullOrWhiteSpace([string]$grantFile)) { return }
|
|
1274
|
-
|
|
1378
|
+
$epochError = $null
|
|
1379
|
+
if (Test-Path -LiteralPath $grantFile -PathType Leaf) {
|
|
1380
|
+
try { Invoke-AuthorityEpochCommand $Cfg 'desktop' 'user-revoke' $grantFile | Out-Null } catch { $epochError = $_.Exception }
|
|
1381
|
+
Remove-Item -LiteralPath $grantFile -Force -ErrorAction SilentlyContinue
|
|
1382
|
+
}
|
|
1383
|
+
if (Test-Path -LiteralPath $grantFile) { throw 'Desktop authority revocation failed: grant remains present' }
|
|
1384
|
+
if ($null -ne $epochError) { throw $epochError }
|
|
1275
1385
|
if (-not $Quiet) { Write-Host 'DESKTOP PLANE DISARMED' }
|
|
1276
1386
|
}
|
|
1277
1387
|
|
|
@@ -1346,7 +1456,17 @@ function Convert-OwnedObservation($Owned) {
|
|
|
1346
1456
|
}
|
|
1347
1457
|
|
|
1348
1458
|
function Convert-AuthorityObservation($Authority) {
|
|
1349
|
-
[ordered]@{ configured=[bool]$Authority.Configured; armed=[bool]$Authority.Armed; reason=(Get-BoundedObservationReason $Authority.Reason) }
|
|
1459
|
+
$out = [ordered]@{ configured=[bool]$Authority.Configured; armed=[bool]$Authority.Armed; reason=(Get-BoundedObservationReason $Authority.Reason) }
|
|
1460
|
+
$seqProp = $Authority.PSObject.Properties['EpochSeq']
|
|
1461
|
+
$shaProp = $Authority.PSObject.Properties['EpochSha256']
|
|
1462
|
+
if ($null -ne $seqProp -or $null -ne $shaProp) {
|
|
1463
|
+
if ($null -eq $seqProp -or $null -eq $shaProp -or [int64]$seqProp.Value -lt 1 -or [string]$shaProp.Value -cnotmatch '^[0-9a-f]{64}$') {
|
|
1464
|
+
Fail 'authority epoch observation incomplete or invalid'
|
|
1465
|
+
}
|
|
1466
|
+
$out['epoch_seq'] = [int64]$seqProp.Value
|
|
1467
|
+
$out['epoch_sha256'] = [string]$shaProp.Value
|
|
1468
|
+
}
|
|
1469
|
+
return $out
|
|
1350
1470
|
}
|
|
1351
1471
|
|
|
1352
1472
|
function Get-DownstreamCoreObservation($Cfg, $Bridge) {
|
|
@@ -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.
|
|
5
|
-
"state_dir": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.
|
|
4
|
+
"grant_file": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.42-r65\\controller\\runtime\\process-grant.json",
|
|
5
|
+
"state_dir": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.42-r65\\controller\\runtime\\process-state",
|
|
6
6
|
"native_host": {
|
|
7
|
-
"path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.
|
|
7
|
+
"path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.42-r65\\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.
|
|
12
|
+
"path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.42-r65",
|
|
13
13
|
"deny_paths": [
|
|
14
14
|
"node_modules",
|
|
15
15
|
"controller/runtime",
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "deadbyte.r64-evidence.v1",
|
|
3
|
+
"source_predecessor_manifest_sha256": "d6f75feada9ad0ae2c248b3a833ac9cf0e04150d2430ddaa70b3dfb64a0b0a86",
|
|
4
|
+
"red": {
|
|
5
|
+
"command": "node --test test/r64-machine-fs-large-read.test.mjs",
|
|
6
|
+
"tests": 2,
|
|
7
|
+
"failed": 2,
|
|
8
|
+
"raw_reproduction": "D:\\Projects\\deadbyte-mcp\\testing\\0.15.41-r64\\predecessor-red-reproduced.log",
|
|
9
|
+
"raw_reproduction_note": "Fresh post-change re-execution against immutable R63 predecessor; original pre-edit console RED was observed but its raw output was not persisted",
|
|
10
|
+
"observed_boundaries": [
|
|
11
|
+
"Full machine_fs_read schema rejected offset=4194306",
|
|
12
|
+
"Runtime rejected page-two next_offset=4194306 with machine fs read offset must be in [-4194304, 4194304]"
|
|
13
|
+
]
|
|
14
|
+
},
|
|
15
|
+
"green": {
|
|
16
|
+
"command": "node --test test/r64-machine-fs-large-read.test.mjs",
|
|
17
|
+
"tests": 8,
|
|
18
|
+
"passed": 8,
|
|
19
|
+
"raw_log": "D:\\Projects\\deadbyte-mcp\\testing\\0.15.41-r64\\hash-cancel-behavior-green.log",
|
|
20
|
+
"focused_command": "npm run r64:focused:test",
|
|
21
|
+
"focused_tests": 42,
|
|
22
|
+
"focused_passed": 42
|
|
23
|
+
},
|
|
24
|
+
"inherited_failures_repaired_in_r64_only": [
|
|
25
|
+
"R63 source included a 0.15.39 npm tarball; R64 copy moved to testing evidence without changing R63",
|
|
26
|
+
"R63 process policy remained bound to R62 path; R64 copy repinned to its own root",
|
|
27
|
+
"R63 README still advertised 0.15.39; R64 package documentation now identifies 0.15.41",
|
|
28
|
+
"Historical R59 tool surface expected no schema changes; R64 test now requires only the authorized machine_fs input change",
|
|
29
|
+
"Historical R62 contract asserted current package=0.15.39 even on R63; version-scoped historical contract retained"
|
|
30
|
+
],
|
|
31
|
+
"full_regression_pre_final_seal": {
|
|
32
|
+
"command": "npm test",
|
|
33
|
+
"tests": 1272,
|
|
34
|
+
"passed": 1232,
|
|
35
|
+
"skipped": 40,
|
|
36
|
+
"failed": 0,
|
|
37
|
+
"log_path": "D:\\Projects\\deadbyte-mcp\\testing\\0.15.41-r64\\full-regression-1.log",
|
|
38
|
+
"log_sha256": "c45f4295f745b5c6674aa8f742268d35c5c922bf5a3a2dafa4bbde48ed729871"
|
|
39
|
+
},
|
|
40
|
+
"benchmark_pre_final_seal": {
|
|
41
|
+
"path": "D:\\Projects\\deadbyte-mcp\\testing\\0.15.41-r64\\read-benchmark-v2.json",
|
|
42
|
+
"sha256": "ba5455687e2233ebfe4516ca50f8c319e70c6393b8b6258fd95d154b79518614",
|
|
43
|
+
"alternating_rounds": 7,
|
|
44
|
+
"read_ops_per_round": 400,
|
|
45
|
+
"errors": 0,
|
|
46
|
+
"median_before_ops_per_second": 3059.36,
|
|
47
|
+
"median_after_ops_per_second": 3173.65,
|
|
48
|
+
"median_before_p95_ms": 1.9078,
|
|
49
|
+
"median_after_p95_ms": 1.9296,
|
|
50
|
+
"median_before_control_p95_ms": 0.6386,
|
|
51
|
+
"median_after_control_p95_ms": 0.6086,
|
|
52
|
+
"limitation": "direct runtime and governor with local scratch I/O, not full public MCP transport; per-round variation remains"
|
|
53
|
+
},
|
|
54
|
+
"benchmark_cross_boundary": {
|
|
55
|
+
"path": "D:\\Projects\\deadbyte-mcp\\testing\\0.15.41-r64\\read-benchmark-after-cancel.json",
|
|
56
|
+
"rounds": 7,
|
|
57
|
+
"r63_page_two": "rejected in every round",
|
|
58
|
+
"r64_page_two": "passed in every round at offset 4259840",
|
|
59
|
+
"median_before_small_page_ops_per_second": 2632.13,
|
|
60
|
+
"median_after_small_page_ops_per_second": 2624.96,
|
|
61
|
+
"median_before_small_page_p95_ms": 2.35,
|
|
62
|
+
"median_after_small_page_p95_ms": 2.32,
|
|
63
|
+
"control_probe_limitation": "local governor read/hash probe, not actual public machine_ping or machine_status",
|
|
64
|
+
"hash_file_cancellation": "R64 read timeout now aborts the default SHA-256 stream; focused source invariant and injected-worker timeout GREEN"
|
|
65
|
+
},
|
|
66
|
+
"real_control_under_bulk_benchmark": {
|
|
67
|
+
"path": "D:\\Projects\\deadbyte-mcp\\testing\\0.15.41-r64\\real-control-after-cancel.json",
|
|
68
|
+
"rounds": 7,
|
|
69
|
+
"calls_per_round": 400,
|
|
70
|
+
"median_r63_control_p95_ms": 3.96,
|
|
71
|
+
"median_r64_control_p95_ms": 3.85,
|
|
72
|
+
"limitation": "signed machine runtime ping/status under concurrent local bulk reads; not public MCP transport"
|
|
73
|
+
},
|
|
74
|
+
"hash_file_cancellation_red_green": {
|
|
75
|
+
"red_log": "D:\\Projects\\deadbyte-mcp\\testing\\0.15.41-r64\\hash-cancel-red-2.log",
|
|
76
|
+
"red": "default createReadStream lacked an abort signal",
|
|
77
|
+
"green_log": "D:\\Projects\\deadbyte-mcp\\testing\\0.15.41-r64\\hash-cancel-behavior-green.log",
|
|
78
|
+
"green": "8/8 focused tests pass; injected default hash stream observed abort on timeout"
|
|
79
|
+
},
|
|
80
|
+
"production_mutation": false,
|
|
81
|
+
"publish_or_activate": false,
|
|
82
|
+
"windows_preflight_repair": {
|
|
83
|
+
"red": "npm run gate:windows exited 1 because inherited Windows PowerShell environment did not resolve Get-FileHash at R64 source manifest check",
|
|
84
|
+
"change": "Compute SHA-256 with built-in .NET cryptography without PowerShell module discovery",
|
|
85
|
+
"green": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-r64-prepublish.ps1 -Stage preflight exited 0 and verified exact R63 source manifest"
|
|
86
|
+
},
|
|
87
|
+
"windows_gate": {
|
|
88
|
+
"status": "PASS_PREPACKAGE",
|
|
89
|
+
"log": "D:\\Projects\\deadbyte-mcp\\testing\\0.15.41-r64\\windows-gate-final-2.log",
|
|
90
|
+
"focused": "40/40",
|
|
91
|
+
"full_regression": "1233 pass / 40 documented skip / 0 fail",
|
|
92
|
+
"doctor": "PASS with isolated empty state; production foreground process identity observation was inaccessible and production was not modified"
|
|
93
|
+
},
|
|
94
|
+
"package_verify_only": "PENDING"
|
|
95
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "deadbyte.reference-gap-matrix.v1",
|
|
3
|
+
"train": "R64",
|
|
4
|
+
"method": "Local read-only source comparison; ideas only, no donor source bytes copied",
|
|
5
|
+
"references": [
|
|
6
|
+
{
|
|
7
|
+
"reference": "better-remote-commander",
|
|
8
|
+
"subsystem": "remote transport",
|
|
9
|
+
"behavior": "Correlates calls and results by ID, replaces stale device sockets, and uses heartbeat supervision",
|
|
10
|
+
"evidence_paths": ["better-remote-commander/packages/relay/src/device-hub.ts"],
|
|
11
|
+
"deadbyte_equivalent": ["bridge/src/remote-dispatch-r60.mjs", "bridge/src/reconnect-delay-r60.mjs", "src/remote-result-journal.mjs"],
|
|
12
|
+
"deadbyte_state": "stronger",
|
|
13
|
+
"security_implications": "Relay socket identity alone would weaken durable mutation claim semantics",
|
|
14
|
+
"performance_implications": "No demonstrated R64 hot-path gain",
|
|
15
|
+
"license_attribution": "README declares MIT, but no bytes copied",
|
|
16
|
+
"proposed_action": "KEEP-OURS: retain durable claim and no-blind-replay behavior",
|
|
17
|
+
"priority": "SKIP"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"reference": "cua",
|
|
21
|
+
"subsystem": "desktop lifecycle",
|
|
22
|
+
"behavior": "Separates session lifecycle from authority and requires fresh observation after actuation",
|
|
23
|
+
"evidence_paths": ["cua/rfcs/3007-cua-driver-lifecycle-sessions.md", "cua/rfcs/3682-typed-native-window-sdk.md"],
|
|
24
|
+
"deadbyte_equivalent": ["src/desktop-runtime-r40.mjs", "src/desktop-contract.mjs"],
|
|
25
|
+
"deadbyte_state": "parity",
|
|
26
|
+
"security_implications": "Public session labels must not become authority; no desktop expansion in R64",
|
|
27
|
+
"performance_implications": "Not on the selected file-read path",
|
|
28
|
+
"license_attribution": "Component-specific licenses; architecture only, no bytes copied",
|
|
29
|
+
"proposed_action": "KEEP-OURS: retain snapshot-bound actuation and independent verification",
|
|
30
|
+
"priority": "SKIP"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"reference": "desktop-commander",
|
|
34
|
+
"subsystem": "bounded presentation history",
|
|
35
|
+
"behavior": "Caps stored output per entry and on-disk history size",
|
|
36
|
+
"evidence_paths": ["desktop-commander/dist/utils/toolHistory.js"],
|
|
37
|
+
"deadbyte_equivalent": ["src/workload-substrate.mjs", "src/remote-result-journal.mjs"],
|
|
38
|
+
"deadbyte_state": "parity",
|
|
39
|
+
"security_implications": "Presentation retention cannot replace signed evidence",
|
|
40
|
+
"performance_implications": "Bounded memory is already enforced in current stream and journal primitives",
|
|
41
|
+
"license_attribution": "Root LICENSE is MIT; no bytes copied",
|
|
42
|
+
"proposed_action": "KEEP-OURS: preserve separate bounded presentation and durable evidence",
|
|
43
|
+
"priority": "SKIP"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"reference": "open-remote-mcp",
|
|
47
|
+
"subsystem": "authority",
|
|
48
|
+
"behavior": "Relay policy can narrow but cannot widen local device authority",
|
|
49
|
+
"evidence_paths": ["open-remote-mcp/docs/ARCHITECTURE.md", "open-remote-mcp/apps/server/src/lib/security.ts"],
|
|
50
|
+
"deadbyte_equivalent": ["src/coding-plane.mjs", "bridge/src/remote-dispatch-r60.mjs"],
|
|
51
|
+
"deadbyte_state": "parity",
|
|
52
|
+
"security_implications": "Local policy remains the final enforcement authority",
|
|
53
|
+
"performance_implications": "No read-path optimization",
|
|
54
|
+
"license_attribution": "README declares MIT; NOTICE.md retained in reference; no bytes copied",
|
|
55
|
+
"proposed_action": "KEEP-OURS: no relay-created root or grant",
|
|
56
|
+
"priority": "SKIP"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"reference": "remcp",
|
|
60
|
+
"subsystem": "large-file reading",
|
|
61
|
+
"behavior": "read_binary accepts offsets beyond one chunk and returns a next byte offset",
|
|
62
|
+
"evidence_paths": ["remcp/packages/runtime/src/tools/files.mjs:readBinaryTool", "remcp/packages/runtime/src/catalog.mjs"],
|
|
63
|
+
"deadbyte_equivalent": ["src/machine-fs.mjs:readRange", "src/machine-fs-mcp-tools.mjs", "src/compact-gateway-mcp-tools.mjs"],
|
|
64
|
+
"deadbyte_state": "weaker",
|
|
65
|
+
"security_implications": "Widen only positional offset; keep per-call byte cap, root and authority enforcement",
|
|
66
|
+
"performance_implications": "Enables bounded paging of files over 4 MiB without whole-file buffering",
|
|
67
|
+
"license_attribution": "Runtime LICENSE is MIT; behavior reimplemented independently",
|
|
68
|
+
"proposed_action": "ADAPT: allow safe positive next_offset while preserving the existing read schema shape",
|
|
69
|
+
"priority": "P0"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"reference": "secure-host-mcp",
|
|
73
|
+
"subsystem": "workspace and process",
|
|
74
|
+
"behavior": "Bounds workspace reads and command output; tracks cancelable jobs",
|
|
75
|
+
"evidence_paths": ["secure-host-mcp/src/workspace.ts", "secure-host-mcp/src/executor.ts", "secure-host-mcp/test/workspace.test.ts"],
|
|
76
|
+
"deadbyte_equivalent": ["src/machine-fs.mjs", "src/process-runtime.mjs"],
|
|
77
|
+
"deadbyte_state": "stronger",
|
|
78
|
+
"security_implications": "Generic command strings and caller environment would widen DEADBYTE authority",
|
|
79
|
+
"performance_implications": "Current read/output limits already bound retained bytes",
|
|
80
|
+
"license_attribution": "README displays MIT badge, root license file absent in local corpus; no bytes copied",
|
|
81
|
+
"proposed_action": "KEEP-OURS: retain policy-pinned commands and separate process authority",
|
|
82
|
+
"priority": "SKIP"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"reference": "winremote-mcp",
|
|
86
|
+
"subsystem": "Windows privilege tiers",
|
|
87
|
+
"behavior": "Requires authenticated remote transport before exposing high-risk tier-3 controls",
|
|
88
|
+
"evidence_paths": ["winremote-mcp/src/winremote/tiers.py", "winremote-mcp/tests/test_security_hardening.py"],
|
|
89
|
+
"deadbyte_equivalent": ["src/desktop-policy-r40.mjs", "src/coding-plane.mjs", "bridge/src/remote-dispatch-r60.mjs"],
|
|
90
|
+
"deadbyte_state": "stronger",
|
|
91
|
+
"security_implications": "Broad tier-3 shell/file authority would weaken independently revocable planes",
|
|
92
|
+
"performance_implications": "Not on selected read path",
|
|
93
|
+
"license_attribution": "README declares MIT, root license file absent in local corpus; no bytes copied",
|
|
94
|
+
"proposed_action": "KEEP-OURS: retain fine-grained local planes, not broad capability tiers",
|
|
95
|
+
"priority": "SKIP"
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "deadbyte.r64-scope.v1",
|
|
3
|
+
"task_id": "deadbyte-r64-large-file-read",
|
|
4
|
+
"version_target": "0.15.41",
|
|
5
|
+
"train": "R64",
|
|
6
|
+
"source_predecessor": {
|
|
7
|
+
"path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.40-r63",
|
|
8
|
+
"version": "0.15.40",
|
|
9
|
+
"manifest_sha256": "d6f75feada9ad0ae2c248b3a833ac9cf0e04150d2430ddaa70b3dfb64a0b0a86",
|
|
10
|
+
"manifest_file_count": 2227,
|
|
11
|
+
"release_status": "not proven published or activated"
|
|
12
|
+
},
|
|
13
|
+
"runtime_predecessor": {
|
|
14
|
+
"release_id": "v0.15.39-3cda3b1c65b7b7c5",
|
|
15
|
+
"manifest_sha256": "3cda3b1c65b7b7c561c5a8617156ab87d69cf162f447f3e99a4cb4a76471b3de",
|
|
16
|
+
"generation_manifest_sha256": "f47cb96083679e764725df1bde6eda53169a39f55772c173ab22f89a1dfaa7ab"
|
|
17
|
+
},
|
|
18
|
+
"selected_work": [
|
|
19
|
+
"Permit machine_fs_read positive offsets through Number.MAX_SAFE_INTEGER, subject to actual file size",
|
|
20
|
+
"Apply the same numeric-bound widening in full and compact inputs without changing tool names, field names or per-call max_bytes",
|
|
21
|
+
"Document that independent pages are not an atomic whole-file snapshot",
|
|
22
|
+
"Abort default hash_file streaming when a bounded read times out; retain existing timeout and authority semantics"
|
|
23
|
+
],
|
|
24
|
+
"rejected_work": [
|
|
25
|
+
"New file-transfer tool or chunked mutation protocol: out of scope and new authority surface",
|
|
26
|
+
"Generic remote shell, broad privilege tiers and donor subsystem ports: weaker authority model",
|
|
27
|
+
"Changing negative tail offset bounds or read length caps: unnecessary for the reproduced defect"
|
|
28
|
+
],
|
|
29
|
+
"acceptance_criteria": [
|
|
30
|
+
"RED test proves both schema and runtime reject page two solely because offset exceeds 4 MiB",
|
|
31
|
+
"GREEN test reads page two using returned next_offset while per-call length remains capped",
|
|
32
|
+
"Invalid/unsafe offsets, out-of-file offsets, denied roots and changed-file pages are handled explicitly",
|
|
33
|
+
"Focused, full regression, Windows gate, manifest, doctor, benchmark and verify-only package gates pass on exact R64 bytes",
|
|
34
|
+
"Hashing on the default read path receives an abort signal bound to timeout"
|
|
35
|
+
],
|
|
36
|
+
"public_surface_delta": "0 new tools; same compact 43-tool names; existing read offset numeric maximum widens only",
|
|
37
|
+
"authority_delta": "none",
|
|
38
|
+
"assurance_mode": "MATERIAL",
|
|
39
|
+
"acceptance_environment": "local production Windows host; isolated candidate and scratch files; production runtime untouched",
|
|
40
|
+
"stop_condition": "RELEASE_READY only after every prepublish gate; never publish or activate"
|
|
41
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "deadbyte.r65-authority-continuity-design.v1",
|
|
3
|
+
"status": "PARTIAL_IMPLEMENTATION",
|
|
4
|
+
"authority": "Current R65 candidate source and read-only R64 generation policies; production remains immutable.",
|
|
5
|
+
"observed_contracts": {
|
|
6
|
+
"controller": "controller/deadbyte-controller.ps1 Get-*GrantStatus checks schema and policy_sha256; Process/Coding/Autonomous/Desktop additionally carry scope and instance_nonce; Host carries nonce but no explicit scope.",
|
|
7
|
+
"process": "src/process-policy.mjs rechecks policy hash, nonce, profile_ids and root_ids; grant schema deadbyte.process-grant.v1.",
|
|
8
|
+
"coding": "src/coding-plane.mjs rechecks policy hash, nonce and root_ids; standing grant schema deadbyte.coding-grant.v2.",
|
|
9
|
+
"autonomous": "controller/deadbyte-controller.ps1 requires a Coding grant, coding_policy_sha256 and root_ids; grant schema deadbyte.autonomous-grant.v2.",
|
|
10
|
+
"desktop": "src/desktop-policy-r40.mjs and controller validate policy hash, nonce and action_kinds; grant schema deadbyte.desktop-grant.v1.",
|
|
11
|
+
"host": "controller/deadbyte-controller.ps1 validates policy hash; grant schema deadbyte.host-grant.v2 includes instance_nonce and granted_at_utc but no scoped IDs.",
|
|
12
|
+
"revocation": "R64 controller arm/disarm replace/delete grant files but expose no durable monotonic per-plane revocation epoch or transaction-owned temporary revoke. An absent grant after temporary revoke cannot prove no independent user revoke occurred."
|
|
13
|
+
},
|
|
14
|
+
"selected_method": {
|
|
15
|
+
"policy_envelope": "Derive canonical authority-bearing fields from each known policy schema; omit only operational grant/evidence storage paths and presentation descriptions. Unknown fields fail closed. Raw policy SHA remains evidence, not the sole ceiling comparator.",
|
|
16
|
+
"comparison": "EQUAL, NARROWER, WIDER, UNVERIFIED. Added capabilities, relaxed deny rules and larger ceilings are WIDER. Changed executable/native pins or disjoint roots are UNVERIFIED. Both deny automatic restoration.",
|
|
17
|
+
"r64_predecessor_continuity": "Because R64 has no durable revocation epoch, an armed predecessor cannot receive automatic cross-generation restoration. Outcome must be REAUTH_REQUIRED and disarmed unless a later explicit user grant is observed.",
|
|
18
|
+
"updater_boundary": "One restoration engine is required. The current inner updater's Process/Coding/Autonomous re-arm must be disabled or constrained by a verified continuity plan before any R65 activation with standing authority is permitted.",
|
|
19
|
+
"current_safety_guard": "scripts/deploy-r48.mjs --preflight returns AUTHORITY_POLICY_UNVERIFIED for armed vectors before opening an update transaction. This guard must not be removed until continuity integration is proven."
|
|
20
|
+
},
|
|
21
|
+
"acceptance_open": [
|
|
22
|
+
"Read-only capture of exact grant bytes and scope, bound to predecessor release/generation and candidate manifest.",
|
|
23
|
+
"Durable transaction-owned revocation epoch with crash-safe exclusion of external revocation/replacement.",
|
|
24
|
+
"Single restoration decision path across updater and deploy; separate runtime and authority outcomes.",
|
|
25
|
+
"Isolated end-to-end activation, interruption, rollback and independent receipt verification."
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "deadbyte.r65-reference-gap-matrix.v1",
|
|
3
|
+
"purpose": "Release/control-plane mechanisms only; donor source is read-only and no donor bytes are copied.",
|
|
4
|
+
"license_review": {
|
|
5
|
+
"better-remote-commander": "package.json declares MIT; no source bytes copied",
|
|
6
|
+
"cua": "pyproject.toml declares MIT; no source bytes copied",
|
|
7
|
+
"desktop-commander": "root LICENSE declares MIT; no source bytes copied",
|
|
8
|
+
"open-remote-mcp": "no root LICENSE or package declaration confirmed in this pass; architecture principle only, no source bytes copied",
|
|
9
|
+
"remcp": "package.json declares MIT; no source bytes copied",
|
|
10
|
+
"secure-host-mcp": "package.json declares MIT; no source bytes copied",
|
|
11
|
+
"winremote-mcp": "pyproject.toml declares MIT; no source bytes copied"
|
|
12
|
+
},
|
|
13
|
+
"decisions": [
|
|
14
|
+
{"reference":"better-remote-commander","evidence_path":"packages/agent/src/transport/ws-client.ts","mechanism":"bounded exponential reconnect and explicit unauthorized branch","deadbyte_comparison":"R64 has remote guardian and recovery, but npm visibility after accepted publish was not reconciled","decision":"ADAPT","r65_action":"bounded registry availability polling and terminal/unknown classification; no relay or multi-device import"},
|
|
15
|
+
{"reference":"cua","evidence_path":"rfcs/3007-cua-driver-lifecycle-sessions.md","mechanism":"idempotent lifecycle cleanup and host-held resume identity","deadbyte_comparison":"DEADBYTE has owned supervisor and signed transaction evidence; deterministic precondition failures still need terminality","decision":"ADAPT","r65_action":"preflight/transaction boundary tests and exact ownership preservation; no desktop redesign"},
|
|
16
|
+
{"reference":"desktop-commander","evidence_path":"dist/utils/toolHistory.js","mechanism":"bounded presentation history and trim target","deadbyte_comparison":"DEADBYTE evidence durability and bounded LIVELOG are stronger for authoritative release receipts","decision":"KEEP-OURS","r65_action":"do not batch or trim authoritative transaction journals"},
|
|
17
|
+
{"reference":"open-remote-mcp","evidence_path":"docs/ARCHITECTURE.md","mechanism":"relay policy may narrow but local device remains final enforcement","deadbyte_comparison":"DEADBYTE already enforces local authority planes; activation restore must preserve exact vector","decision":"KEEP-OURS","r65_action":"regress no-widening during activation orchestration"},
|
|
18
|
+
{"reference":"remcp","evidence_path":"packages/client/test/cli-update-runtime.test.mjs","mechanism":"separate client/runtime update and coherence checks","deadbyte_comparison":"DEADBYTE has immutable slots and version binding; exact-version npm invocation needs reproducible tests","decision":"ADAPT","r65_action":"CLI/package resolution matrix and isolated install test without runtime dependency"},
|
|
19
|
+
{"reference":"secure-host-mcp","evidence_path":"src/runtime.ts","mechanism":"explicit bounded runtime state vocabulary","deadbyte_comparison":"DEADBYTE has verified identities but activation preflight was not a separate read-only state classification","decision":"ADAPT","r65_action":"typed preflight classification; reject dirty/unknown state before mutation"},
|
|
20
|
+
{"reference":"winremote-mcp","evidence_path":"src/winremote/process_mgr.py","mechanism":"Windows process enumeration with stale-process handling","deadbyte_comparison":"DEADBYTE ledger binds PID to creation identity and hash, stronger than PID/name kill paths","decision":"SKIP","r65_action":"retain verified ownership; never adopt caller-selected PID/name termination"}
|
|
21
|
+
]
|
|
22
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deadbyte-mcp",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.42",
|
|
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.",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"node": ">=22"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
-
"test": "node --test test/*.test.mjs",
|
|
11
|
+
"test": "node --test --test-concurrency=4 test/*.test.mjs",
|
|
12
12
|
"manifest:write": "node scripts/release-manifest.mjs write",
|
|
13
13
|
"manifest:verify": "node scripts/release-manifest.mjs verify",
|
|
14
14
|
"r41:parent:verify": "node scripts/verify-r41-parent.mjs",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"contained:run": "node src/contained-cli.mjs workspaces/demo input.txt",
|
|
43
43
|
"contained:smoke": "node src/contained-smoke.mjs",
|
|
44
44
|
"mcp:contained:smoke": "node src/mcp-contained-smoke-client.mjs",
|
|
45
|
-
"gate:windows": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-
|
|
45
|
+
"gate:windows": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-r65-prepublish.ps1",
|
|
46
46
|
"authority:smoke": "node src/authority-smoke.mjs",
|
|
47
47
|
"mcp:remote:smoke": "node src/remote-mcp-smoke-client.mjs",
|
|
48
48
|
"mcp:host:smoke": "node src/mcp-host-smoke-client.mjs",
|
|
@@ -87,7 +87,10 @@
|
|
|
87
87
|
"r60:focused:test": "node --test --test-concurrency=1 test/r60-authority-coherence.test.mjs test/r60-authority-enforcement.test.mjs test/r60-bridge-dispatch.test.mjs test/r60-clock-discipline.test.mjs test/r60-live-timeline.test.mjs test/r60-reconnect-errors.test.mjs test/r60-reconnect-jitter.test.mjs test/r60-remote-call-recovery.test.mjs test/r60-windows-log-decode.test.mjs test/r60-release-contract.test.mjs",
|
|
88
88
|
"r60:full:test": "node scripts/full-regression-r60.mjs",
|
|
89
89
|
"r61:focused:test": "node --test --test-concurrency=1 test/r61-release-contract.test.mjs test/r61-release-bridge-binding.test.mjs test/r61-control-lane.test.mjs test/r61-live-timeline-bounds.test.mjs test/r61-npm-artifact-identity.test.mjs test/remote-live-log-r37.test.mjs test/bridge-runtime-r59.test.mjs test/commander-schema-differential-r48.test.mjs test/package-boundary.test.mjs test/r60-bridge-dispatch.test.mjs test/r60-authority-enforcement.test.mjs",
|
|
90
|
-
"r62:focused:test": "node --test --test-concurrency=1 test/r62-release-contract.test.mjs test/r62-doctor-transactions-reconcile.test.mjs test/r62-doctor-receipt-semantics.test.mjs test/r62-rollback-failure-receipt.test.mjs test/r58-doctor-transactions.test.mjs test/r58-completed-update-receipt.test.mjs test/runtime-self-update.test.mjs test/r56-rollback-launcher-restore.test.mjs"
|
|
90
|
+
"r62:focused:test": "node --test --test-concurrency=1 test/r62-release-contract.test.mjs test/r62-doctor-transactions-reconcile.test.mjs test/r62-doctor-receipt-semantics.test.mjs test/r62-rollback-failure-receipt.test.mjs test/r58-doctor-transactions.test.mjs test/r58-completed-update-receipt.test.mjs test/runtime-self-update.test.mjs test/r56-rollback-launcher-restore.test.mjs",
|
|
91
|
+
"r63:focused:test": "node --test --test-concurrency=1 test/r63-release-contract.test.mjs test/r63-one-shot-coherence.test.mjs test/r51-runtime-coherence.test.mjs test/remote-session-cli.test.mjs",
|
|
92
|
+
"r64:focused:test": "node --test --test-concurrency=1 test/r64-release-contract.test.mjs test/r64-machine-fs-large-read.test.mjs test/machine-fs-runtime.test.mjs test/compact-gateway-r36.test.mjs test/r61-control-lane.test.mjs test/r60-bridge-dispatch.test.mjs",
|
|
93
|
+
"r65:focused:test": "node scripts/r65-focused.mjs"
|
|
91
94
|
},
|
|
92
95
|
"bundleDependencies": [
|
|
93
96
|
"@modelcontextprotocol/server",
|