deadbyte-mcp 0.15.67 → 0.15.68
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/MANIFEST.SHA256 +23 -21
- package/PROVENANCE.json +19 -9
- package/README.txt +20 -20
- package/RELEASE.json +22 -8
- package/SBOM.cdx.json +2 -2
- package/TEST-MATRIX.json +2 -2
- package/bridge/package.json +1 -1
- package/controller/deadbyte-process-policy.json +4 -4
- package/package.json +3 -2
- package/scripts/r173-protected-preflight.mjs +42 -0
- package/src/activation-authority-proof-r75.mjs +28 -4
- package/src/activation-preflight-r65.mjs +2 -1
- package/src/version.mjs +1 -1
- package/test/r130-release-security-contract.test.mjs +7 -7
- package/test/r132-release-identity.test.mjs +8 -8
- package/test/r153-prepublish-identity.test.mjs +1 -1
- package/test/r163-isolated-slot-rollback-restore.test.mjs +2 -2
- package/test/r165-live-cli-skew.test.mjs +2 -2
- package/test/r167-release-contract.test.mjs +9 -9
- package/test/r168-protected-entrypoint.test.mjs +10 -10
- package/test/r172-release-contract.test.mjs +7 -7
- package/test/r173-release-contract.test.mjs +32 -0
- package/test/r59-tool-surface-compat.test.mjs +1 -1
- package/test/r75-authority-evidence.test.mjs +32 -0
package/MANIFEST.SHA256
CHANGED
|
@@ -30,7 +30,7 @@ c814771dddac8bfb184250b868ddb6ab9f5e0e43613c04c3ed8abe09324ec4db bin/deadbyte-n
|
|
|
30
30
|
daf9cfb371bee88cafbf5597eaa507fec504dbe0b0ddd40d0c3c2e02817f49e4 bin/deadbyte-process-host.exe
|
|
31
31
|
b55d2c4490dfb875d40f29a69df2addc5d579991cb7d094674c04d369dfcfac3 bin/deadbyte-tunnel-host.exe
|
|
32
32
|
f0ce7acb1e41325cef8b6789f95bd78b6a6107423773eace57a12b49faa55095 bin/WORKER-REGISTRY.txt
|
|
33
|
-
|
|
33
|
+
dccfb4e262139be78ead880b53488df5c9e3b82927aab0a331789c24cf1276e8 bridge/package.json
|
|
34
34
|
f99413d82f84c808f52d5b8696c190a9142dd08f517f5ec3e442f0769402d189 bridge/src/bridge-health-r59.mjs
|
|
35
35
|
fa0dcc4cde9c03e978c9f9dd24b62afa83f49bdada1f42ead544a9a17edd332f bridge/src/bridge.mjs
|
|
36
36
|
471f41c84c5b339cd81a708a4f36d4470e614946817ad2f9fca295dde2c83fb6 bridge/src/canonical-json-r60.mjs
|
|
@@ -46,7 +46,7 @@ fedd83eaf14a493db077a0a239eeb68df4e19f075c971a9ff4419bb6e5ab86e3 controller/dea
|
|
|
46
46
|
331d168750a18d2b8e351796ddbf8f9619374c707c3cea18b8b166934f8af0d3 controller/deadbyte-desktop-policy.json
|
|
47
47
|
5e8ef223b0dbc52173aaf044a075837eef8964ff0e7e16f83a595e0d17695625 controller/deadbyte-host-policy.json.example
|
|
48
48
|
6f0cc469f51444dd18211fa3346c826abeea4d2ec7a8945f0200dc5c622031ef controller/DEADBYTE-MCP.cmd
|
|
49
|
-
|
|
49
|
+
f6e9d10459d6215c587abfe041ddf517b62493a44c94092ba6136923541e1758 controller/deadbyte-process-policy.json
|
|
50
50
|
d274b099a298c1033fea8f1e8849751693bbc0448778d619400acb82d4f53a3b controller/deadbyte-semantic-lsp-config.json
|
|
51
51
|
3023d2985f5b6e5cc7c0d08cb8b342b362c93dce7ebd4224635362194be40cf2 controller/README.TXT
|
|
52
52
|
101e613518c73c6aa31c725fe1b5f9a24c995dc9876b7b28e1f3e97ac9f8d362 DEADBYTE-MCP-R27-FINAL/R27-ADMIN-CLOSURE.json
|
|
@@ -1427,8 +1427,8 @@ db605a698f917c4006462596e6526fe6a9c6eff9b8409e8472fe545d4b70027c node_modules/z
|
|
|
1427
1427
|
f67a25ded944912bd4621b68df17c7c70a52aae117278c076c0aabbc32a3abba node_modules/zod/v4/mini/schemas.d.ts
|
|
1428
1428
|
51b3a7869df2d3a1bd98acb9d5b6a61bbccc7653d7a3d8fca7f0e0db7e84e284 node_modules/zod/v4/mini/schemas.js
|
|
1429
1429
|
3e3125b5a537a24c3632c1c5c09640ce7bcb3935901b127ad8ae3c37a27f133f node_modules/zod/v4/package.json
|
|
1430
|
-
|
|
1431
|
-
|
|
1430
|
+
2ba5d2dd41dca1807edf56159355d9c8804db9e6cc3167093d2f7846b71204b8 package.json
|
|
1431
|
+
2bb3e2ea787726a4b9cd738044bc353e7eec5cc5051a364e31edd919accb0755 PROVENANCE.json
|
|
1432
1432
|
27ca0f3c9ee3a1b6374a9c8dd98008decdd0c7659c7a569c70ad7b9734c74655 R34-BASELINE.json
|
|
1433
1433
|
0b7ec5ee347ddfa6cca59740fc7a8fe3fc5d51406265bb12189e82fa106319d2 R41-PARENT.json
|
|
1434
1434
|
bd2a789b0aab5663f0d208af2ca8e4ec98179bc8c7b57e70a962d4e06a3dcfc4 R42-PARENT.json
|
|
@@ -1437,9 +1437,9 @@ f932ef78b7a72b1bb0d7aedb5fe42fbb9951c2492eb528b72442f46ddff81a6c R44-DONORS.jso
|
|
|
1437
1437
|
731b4c559fc0d25dea701e4474f02400b27e8e3f4cac9f230d5214497d4490a9 R44-PARENT.json
|
|
1438
1438
|
d33ec5d167dd44800ba4e68372b08db43deb8d01df2ef71dd435ff004ac66c8b R45-PARENT.json
|
|
1439
1439
|
3dc607603fea511e2f428e9546a875ab7e38b6a0bbd5e803e4510de082f30804 R49-PARENT.json
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1440
|
+
87da1401a0a692253316e3c1269c368a5e5bc021fd14a265d12fdbeabf85d201 README.txt
|
|
1441
|
+
20e66377dc6909a415d0efbb5014e7e1b0ae85bf1e14ed3438a17e5379c83275 RELEASE.json
|
|
1442
|
+
935587bf7590c98fe58787c16b14b27addb2d5f4ccc53ea12be8432b4cd22787 SBOM.cdx.json
|
|
1443
1443
|
7c86062c4f69db3179a129d65945ccfab1b1c1c5bcc29b91383eac097d50f2aa scripts/activate-skill-creator-1.1.1.mjs
|
|
1444
1444
|
bd138fe5a64088e8e1a7a5bf6104c5b17317bdc8cf3ad8191ea00ed82ace7d9b scripts/agent-eval-r42.mjs
|
|
1445
1445
|
8d90256a6863f3bbbff02e95cb12389fc6f9e8dbcb77bf1c20c902de371425e8 scripts/archive-source-zips.mjs
|
|
@@ -1612,6 +1612,7 @@ c8b3551936ff7e24d851d6cad580d11fbf495150558d963b7215230481412e2e scripts/r168-p
|
|
|
1612
1612
|
34a0ebb4a5d192e03c6680df40287b6af931e5f2f3e4bff60a66adeb8ae2d87d scripts/r168-source-full-test-runner.mjs
|
|
1613
1613
|
4bde90b78134c1ea51df7493d183c4dd60d2f70b2c55bc4fd0dcf1f5c510ea11 scripts/r168-subject-readonly.mjs
|
|
1614
1614
|
bcb3db79b5c4dc9c0165ddf0d94989f342ff0a0f4be10ed4bfd4709d0763647f scripts/r172-protected-preflight.mjs
|
|
1615
|
+
e7d9392f203e2f5f7a7b154f88740202f5051fbdf0a8657b8e3c6b49d196c382 scripts/r173-protected-preflight.mjs
|
|
1615
1616
|
e19a1d591ccd07af2e87d930ce23b0cc9b814bc2a395408045543847154097d7 scripts/r40-compact-ledger-probe.mjs
|
|
1616
1617
|
68b9a60aca3f3e3e9ec239710f8368594ef3c8a98fff0816d2e9a7950df48287 scripts/r47-core-failures.mjs
|
|
1617
1618
|
75f821cc44f8c31f67de0b28b64021d9fb160984a597e704b29c33f9f3a41dde scripts/r47-syntax-check.mjs
|
|
@@ -1723,12 +1724,12 @@ be332ed7cef04abaec8679198e379d7f42fc67e0833be9f42e25103c88cb5b26 scripts/window
|
|
|
1723
1724
|
105a5c6dcd54e4fabb416df9eaac093654f3ea39c4233a56e0bc6d53371b2128 scripts/workload-contract-regression-r47.mjs
|
|
1724
1725
|
c32cb9054a1b9641ae071c00622c0054272bdb0b519ea22c4ff926a1600a2b46 scripts/workload-stream-regression.mjs
|
|
1725
1726
|
1ee9251c743d817245e858229e1e1db4f7bebb7e5411d370d33c4777528e53e0 scripts/workload-substrate-r47-regression.mjs
|
|
1726
|
-
|
|
1727
|
+
9e277f4be0bbd413bbf5fda31d6b769ceb2308c95c23562d7df29e3eadda4c03 src/activation-authority-proof-r75.mjs
|
|
1727
1728
|
941a7ac8b700a6621e7f73780072ccd93b0094887bab722648c325c66c91d71b src/activation-continuity-abort-r172.mjs
|
|
1728
1729
|
0fca861bfb959b6d84c4767b2f60a4e0ec2403291a6050ee7598f75d2c4c18e0 src/activation-continuity-engine-r65.mjs
|
|
1729
1730
|
7199b09fee30d3efe76bf882bdb4421f1406222487be1753b4409e5018b17e3c src/activation-lock-r65.mjs
|
|
1730
1731
|
6c634aebee33d925f0bc3f1a4f68d97d4115cf6ad39a5f2484e0e44fd4cca32a src/activation-path-r167.mjs
|
|
1731
|
-
|
|
1732
|
+
1c9012bbe4d9b047d48ab14826f1de4fe489f282a26341be5573b3f1744cb677 src/activation-preflight-r65.mjs
|
|
1732
1733
|
467268f6f195e9359b819e35c8b418c81e1cb40c9ba04b990fd2656e354c65a5 src/activation-reconciliation-audit-r168.mjs
|
|
1733
1734
|
a82b05e1c521cc77f3398985d6faa1beb0fe8f65595f50bed474227550d462c5 src/activation-reconciliation-consent-r168.mjs
|
|
1734
1735
|
585f0abd6fd9747448b8345bd5b51e80b458eaac162770bc74928242a0cc1549 src/activation-reconciliation-fence-r168.mjs
|
|
@@ -1958,13 +1959,13 @@ aa765e9a28c69ff58a5b5a0d29b49ea181af4db9076633b102dbca25861e708e src/tunnel-std
|
|
|
1958
1959
|
34719b7d54336b2abbc152ff0c5fb2f0052d4f77753f9b7538adfdd20c804b5b src/uac-approval-contract-r153.mjs
|
|
1959
1960
|
642cb67d1854850e336ee73fbd71b329056bdcbdab35cea19c1a995a155ff5d9 src/verifier-cli.mjs
|
|
1960
1961
|
8f818a4852ce3be3a380cd4736c3073a7a3e0e45cd7c7ca90588a6b843d3d022 src/verifier.mjs
|
|
1961
|
-
|
|
1962
|
+
269648484d5f691add569179392ae421c0b152f493969c5e59c205e8de2ae4ce src/version.mjs
|
|
1962
1963
|
3706206ecaa560b9579f57ed3df104af543331fb09a3ad0d28b217aea2d0256f src/windows-powershell-environment.mjs
|
|
1963
1964
|
7e09c57a97289360aabfaf3d531208e54872efbfb3182f3c18203d2cb88c46b5 src/worker-registry.mjs
|
|
1964
1965
|
76361d5ae9a710273cf64a7525082197b692236bf23689875e5fd1ef4aa96d2b src/worker-scheduler.mjs
|
|
1965
1966
|
4da1b32f5198bb089bc68b7eb6de21ea296678b5020018a73742bf0df57d62fa src/workload-substrate.mjs
|
|
1966
1967
|
1bd637e7634ca0259791c5108fcf324554f70b1db49e5eac3505287c04bbc3be STABILIZATION-PROGRESS.md
|
|
1967
|
-
|
|
1968
|
+
32a9ea5bd28dc9f3be81a482806728fdadd0a59a21be223cd63fb6b8eae722f9 TEST-MATRIX.json
|
|
1968
1969
|
e4f1fb97545f23772ddff28ad3f9954a4714f9854062fca62e0e12c1cb2ec4ae test/agent-backend-r44.test.mjs
|
|
1969
1970
|
2a78c818058b25efdc143a3a97c832da231ccd6ff9d90c7796d681a0251b85c4 test/agent-crash-child.mjs
|
|
1970
1971
|
d9461ab7c118ee75d37a2d6f5e637d7e43505af6a9ad8c7ddafffc8ace185a5b test/agent-crash-worker.mjs
|
|
@@ -2218,9 +2219,9 @@ ce163ee9f288e30a213636e2267b8630016ef8a170f12286e8cdd44219bdab32 test/r124-live
|
|
|
2218
2219
|
17475b51e416ae678f959f8975fab8497eb7c57d13e36cac8656c0e1f7424c0c test/r126-restore-policy-envelope.test.mjs
|
|
2219
2220
|
1721d4bd3bb58c10ad9d86b69ad1d993ec5a1e6315c95b28fa50ab67d4ca302a test/r127-restore-append-policy-boundary.test.mjs
|
|
2220
2221
|
b3d3dda398c94d18e2e156bde65d1338000233407b435134ba0c16175d96620b test/r129-sdk-security-baseline.test.mjs
|
|
2221
|
-
|
|
2222
|
+
55b862a423a5994384f4d7343d2853deab5e745a76e5dcb0f714680e78d2923c test/r130-release-security-contract.test.mjs
|
|
2222
2223
|
bb7963baf412ec0f5aca183f6dd98eda9026fe763017f9af595581b521ae6cb7 test/r131-installed-manifest-boundary.test.mjs
|
|
2223
|
-
|
|
2224
|
+
cb013d23eb051c4d9e68f28091f9a97728e9de04d8df9ac6d315cfdfbfabeed2 test/r132-release-identity.test.mjs
|
|
2224
2225
|
acd236a4d8ba035007bde4166a521b8d4e6044f58c52c0bae9cb42fa75338533 test/r135-autonomous-scope.test.mjs
|
|
2225
2226
|
3fcf657aae1f8466abc5ab82bb5a619966ea9b8a33d4a95a5a5246df5bf3afa1 test/r136-scoped-command-rights.test.mjs
|
|
2226
2227
|
e0c466f25b35eb894166df792b71b23924610d32363756c75ff437dfdaa12a4c test/r136-scoped-observer.test.mjs
|
|
@@ -2244,7 +2245,7 @@ b92f914455cac010b1468cd37a31651e7d423571d0edfeb29829d2281073e1e3 test/r146-lega
|
|
|
2244
2245
|
32f40b649033172384267bbe8f6009dededcba81afff1e3ca51331407197fe3b test/r146-livelog-backpressure.test.mjs
|
|
2245
2246
|
77b3bfcd6fa04e21c7a04206181f7b4cbd5321f799a145859d8e84d0b984d174 test/r147-remote-request-hash.test.mjs
|
|
2246
2247
|
ad184a83ee098eac21d523adbebfd379dcf8b87d4878c2d8dcca95cb22fdc9ee test/r153-clean-activation-recovery.test.mjs
|
|
2247
|
-
|
|
2248
|
+
bbfb36b6c9ff112f0e00f9c1ab81e7706ce81d7c626a2ba14dc2b10a4fca19ec test/r153-prepublish-identity.test.mjs
|
|
2248
2249
|
377b03dbb1d82ed0ddeee261a060b8173d5591dfc20a60d9ea991390a03039b4 test/r153-r60-host-repin-e2e-contract.test.mjs
|
|
2249
2250
|
e2bc7995f2ca85ce5d4a15e647c209d273d8f3871d25bd353046af66ee71bb34 test/r153-r65-signed-precondition-recovery.test.mjs
|
|
2250
2251
|
ce37fc59761ceddf43fd3844b34d57f64f1c8d191ca1d6cba13b643a5e2c02ce test/r153-restricted-reused-pid.test.mjs
|
|
@@ -2267,15 +2268,15 @@ d5d0eddc5c33ae9ea2f31d57381bf595bd85adf8048d2886f67554141f086bde test/r160-mark
|
|
|
2267
2268
|
7816089ae7668f7a5776a50259638cf31dc480116f3445b70afb0b8c64dbb4d3 test/r160-package-decision-manifest.test.mjs
|
|
2268
2269
|
cf624087da10899195500f265ea48a304afa0ebdef74f064cfccb105ec2248d3 test/r160-release-contract.test.mjs
|
|
2269
2270
|
8ddebf4e81e5ccb66533694e7b04775ea9ce063ead75a17c54ce28580a55a0b4 test/r160-stable-launcher.test.mjs
|
|
2270
|
-
|
|
2271
|
+
52aa861ec17d6914bd1bf682dc2b4409dd3586206a3bceb231203f911c1583cc test/r163-isolated-slot-rollback-restore.test.mjs
|
|
2271
2272
|
842222cce8d50ba214a4dc97d5965d711e83a29f6660e784ccaf000f50a4213d test/r163-publish-fence.test.mjs
|
|
2272
2273
|
3473a513db884f2ab40a9e3e875ca6ef2c9e5202fc0bf4df56e388b0d55e5e84 test/r164-remote-history-skew.test.mjs
|
|
2273
|
-
|
|
2274
|
+
b167b60eaedb6fdfe5288a837c6e5689b3ef89357621a8d297f6fcbe0727fea8 test/r165-live-cli-skew.test.mjs
|
|
2274
2275
|
e9c493435956201439479b05d301e81673457abe5c456d8a50153f3d9922daf9 test/r165-publish-fence.test.mjs
|
|
2275
2276
|
425e6756afe323d358287a4d00ab6460e8398a8ee39c4a64e4be7ae191c4676f test/r166-hotfix-contract.test.mjs
|
|
2276
2277
|
13c4c7792152466b6967627b44eb4aaf815e9c20b4bd67a50323420c937d532c test/r166-release-readiness.test.mjs
|
|
2277
2278
|
52e6f015329fecf570ac6211ca9904b929119b66dbf72c6776be5cefcc63b282 test/r167-activation-path.test.mjs
|
|
2278
|
-
|
|
2279
|
+
5747aa22acca96bf45634431fa320c02eab822a64e3e9a80befaa0df7662d49d test/r167-release-contract.test.mjs
|
|
2279
2280
|
471102e7b4e1655423efa80688c786306df62d6b76e23d41c8ebe596b8f63749 test/r167-release-readiness.test.mjs
|
|
2280
2281
|
eb5a5e73fd0284297959f4e6ca1631ebf0f23749c56ec1b4cc75cad5f8f1ca6b test/r168-combined-targeted-runner.mjs
|
|
2281
2282
|
44818657894db72a0ead65e96e734f30c11f10f5914e2c4e2961ee3a3e5b2c70 test/r168-crash-journal.test.mjs
|
|
@@ -2287,7 +2288,7 @@ eb5a5e73fd0284297959f4e6ca1631ebf0f23749c56ec1b4cc75cad5f8f1ca6b test/r168-comb
|
|
|
2287
2288
|
7b0c15a35ec97aa34bedb3759a2c8f276e9b776de2c56a3bebe3be8d6009c102 test/r168-native-r85-protected-scratch.test.mjs
|
|
2288
2289
|
50ea9e611570940170b6960a5114ce491d50d6a250121f28f3cbb6b26db34771 test/r168-npm-resume-identity.test.mjs
|
|
2289
2290
|
191b6db0f79e23b48fd64be5d788dc651ef1af5ab165cff3cbe99f18139872aa test/r168-owner-reconciliation-contract.test.mjs
|
|
2290
|
-
|
|
2291
|
+
41a4dcaa8d00ef5148f9700f71a5dda3558dacc8d6c90ca17bcdcb9310dbc3e8 test/r168-protected-entrypoint.test.mjs
|
|
2291
2292
|
c40ee4e3c6f22ace3da133fee953a88545c773def2fe1ef84d5b552b6c9f649a test/r168-reconciliation-audit.test.mjs
|
|
2292
2293
|
31218d4b085db1b34f410a7487c0fee9ac40286ec512ee56e500650bf551bfcc test/r168-release-contract.test.mjs
|
|
2293
2294
|
0039529761aef4389074f17cd29223a6435b66785616417c030cfd0dd7370951 test/r168-remote-one-shot-coherence.test.mjs
|
|
@@ -2295,7 +2296,8 @@ ccd8b5b287808f5165f5e7fd7ade8278ae84c33463e4f9753059806da503fd3c test/r169-dele
|
|
|
2295
2296
|
2866649338191383446edb60d11d558736a4e6d58cb0cdebd94cd8e162fae6bc test/r169-delegate-cli-integration.test.mjs
|
|
2296
2297
|
5d2725223b48c2d44dab2eade455f9008a36f91522dcdcc3c0594d762c282b2b test/r169-targeted-runner.mjs
|
|
2297
2298
|
bf015b6b85a40f9f81a7627d71217b2994c2161943368bde46be94852ec7eb77 test/r172-activation-recovery.test.mjs
|
|
2298
|
-
|
|
2299
|
+
d7e3b51f3cd90f1876912832d9b13023b566d5b78d8a3c4a9ce9a776660917c9 test/r172-release-contract.test.mjs
|
|
2300
|
+
6c7d5d7b6e1554db8fe8c5c27977f62a93095d3351727eb8e35b33dc21940610 test/r173-release-contract.test.mjs
|
|
2299
2301
|
3c5c3724bce89aa1fa59fe97cc346c40a5674bb5cd6dc3e2f31b86f2d62e75e4 test/r33-closeout-regression.test.mjs
|
|
2300
2302
|
5e3700ee610442dfd7b7ae5e380263f231438be0e32790597142c41362a53c9a test/r33-finalization.test.mjs
|
|
2301
2303
|
7e419d3c1caf79bfc7407207f50e5645298f9b19d91a7d6f595af185b92cd55e test/r36-finalization.test.mjs
|
|
@@ -2361,7 +2363,7 @@ ca8e23abc89f3eadeceb4b6fdad2cb4db5a7933029ece8e8beae2c6a158876b7 test/r58-owner
|
|
|
2361
2363
|
8fc5ed1d3088facf45f9578d9ff8514c3a633f7f342d15eec316e129e7a916c0 test/r58-stale-owner.test.mjs
|
|
2362
2364
|
84be7ee7d167eb06c9f9fc178930daaa81e53a91de40bad6d7df2060bd3dd165 test/r58-windows-gate.test.mjs
|
|
2363
2365
|
76db2a4009d76b86e1da57b91a96b0d6bfeb4063bec3301ede736e2fd5832f39 test/r59-release-contract.test.mjs
|
|
2364
|
-
|
|
2366
|
+
b5a4c09711ed25bfab64045f132eec18f8c6a7e37f949fd30861e223826241f1 test/r59-tool-surface-compat.test.mjs
|
|
2365
2367
|
3befd5d4dc4d8ca9e1f6cbeb9c430671e676c5696d6ee5931c2cbe3244c558a4 test/r60-authority-coherence.test.mjs
|
|
2366
2368
|
60577e231c7d164f57a3960c574d3e369ca140d9dbc477b2444fa62dbf224e51 test/r60-authority-enforcement.test.mjs
|
|
2367
2369
|
a1fa0b1e529da05f3659a33be6d36dab02f93808638cf0f458d057e9c6d1e35b test/r60-bridge-dispatch.test.mjs
|
|
@@ -2461,7 +2463,7 @@ c26ac29f6e47e21cc3d20331391295c4f57c20bc1a9094f27079ee60c11ab75b test/r72-stagi
|
|
|
2461
2463
|
ff8d6c7998053a20a0d6a855d4a0013f0f19e649b91731d970e647242bb66e86 test/r74-kernel-lock.test.mjs
|
|
2462
2464
|
7cb5edf625e965c0e6a6938bd822522777880bd41ad51e73e1daaec6556e2bc2 test/r74-prepublish-contract.test.mjs
|
|
2463
2465
|
d283a882b9d7bb38b8d6a0db97882fcaf9b6dfa717aca79dd0351012cc00ba23 test/r75-activation-authority-proof.test.mjs
|
|
2464
|
-
|
|
2466
|
+
19bfae3e86101af9b5a1ea730498bf0de5fb39f894488b687c516db3a76e00af test/r75-authority-evidence.test.mjs
|
|
2465
2467
|
993186133dc7620bcd3057efda9a0ba1435c938656e4b24a32ace4ce57ea9735 test/r76-pinned-marker-cas.test.mjs
|
|
2466
2468
|
2c21c965864ca4f7deb8f0d5bee4f5a54d20e1c2dbf373f19faa1fc869c33bd1 test/r77-epoch-grant-cas.test.mjs
|
|
2467
2469
|
547c01ea307b182dbcee341773a29eb5e3045245a046e220b85ace373a0fd678 test/r78-parent-junction-cas.test.mjs
|
package/PROVENANCE.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "deadbyte.provenance.v1",
|
|
3
|
-
"version": "0.15.
|
|
4
|
-
"source_model": "published
|
|
3
|
+
"version": "0.15.68",
|
|
4
|
+
"source_model": "published R172 0.15.67 -> isolated R173 0.15.68; active production 0.15.61 unchanged",
|
|
5
5
|
"signing": "ed25519",
|
|
6
|
-
"parent_tarball_sha256": "
|
|
6
|
+
"parent_tarball_sha256": "0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d",
|
|
7
7
|
"parent_activation_status": "PUBLISHED_NOT_ACTIVE",
|
|
8
8
|
"parent_rollback_receipt_sha256": null,
|
|
9
9
|
"runtime_predecessor": {
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"manifest_sha256": "055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf",
|
|
12
12
|
"generation_manifest_sha256": "f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4"
|
|
13
13
|
},
|
|
14
|
-
"source_predecessor_manifest_file_sha256": "
|
|
15
|
-
"source_predecessor_tarball_sha256": "
|
|
16
|
-
"reproducibility": "
|
|
14
|
+
"source_predecessor_manifest_file_sha256": "4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8",
|
|
15
|
+
"source_predecessor_tarball_sha256": "0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d",
|
|
16
|
+
"reproducibility": "R173 source successor to published R172 0.15.67 exact manifest 4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8; live predecessor 0.15.61 held unchanged",
|
|
17
17
|
"public_surface_evidence": {
|
|
18
18
|
"status": "PASS",
|
|
19
19
|
"baseline_release": "v0.15.35-1b5715b276facbc0",
|
|
@@ -77,12 +77,12 @@
|
|
|
77
77
|
"stdio_aggregate_p95_delta_pct": 1.984392678457768,
|
|
78
78
|
"limitations_preserved": true
|
|
79
79
|
},
|
|
80
|
-
"builder": "deadbyte-
|
|
80
|
+
"builder": "deadbyte-r173-epoch-proof-hotfix-isolated",
|
|
81
81
|
"parent_release_id": "v0.15.61-055d1ff0aa99e60b",
|
|
82
82
|
"parent_manifest_sha256": "055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf",
|
|
83
83
|
"parent_generation_manifest_sha256": "f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4",
|
|
84
|
-
"source_predecessor_version": "0.15.
|
|
85
|
-
"source_predecessor_tarball_sha256": "
|
|
84
|
+
"source_predecessor_version": "0.15.67",
|
|
85
|
+
"source_predecessor_tarball_sha256": "0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d",
|
|
86
86
|
"operator_override": {
|
|
87
87
|
"four_hour_soak": "WAIVED_BY_OPERATOR",
|
|
88
88
|
"clean_machine": "WAIVED_BY_OPERATOR",
|
|
@@ -359,5 +359,15 @@
|
|
|
359
359
|
"full_protected_regression": "PENDING_FINAL_BYTES",
|
|
360
360
|
"publication": "NOT_RUN",
|
|
361
361
|
"production_activation": "NOT_RUN"
|
|
362
|
+
},
|
|
363
|
+
"r173": {
|
|
364
|
+
"status": "FOCUSED_GREEN_PREPUBLICATION",
|
|
365
|
+
"source_predecessor_version": "0.15.67",
|
|
366
|
+
"source_predecessor_manifest_sha256": "4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8",
|
|
367
|
+
"source_predecessor_tarball_sha256": "0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d",
|
|
368
|
+
"runtime_predecessor_release_id": "v0.15.61-055d1ff0aa99e60b",
|
|
369
|
+
"epoch_revoked_authority_proof": "SIGNED_HEAD_AND_CAPTURED_GRANT_BOUND",
|
|
370
|
+
"publication": "NOT_RUN",
|
|
371
|
+
"production_activation": "NOT_RUN"
|
|
362
372
|
}
|
|
363
373
|
}
|
package/README.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
DEADBYTE MCP V0.15.
|
|
1
|
+
DEADBYTE MCP V0.15.68 / R173 EPOCH-REVOKED AUTHORITY PROOF HOTFIX
|
|
2
2
|
=========================
|
|
3
3
|
|
|
4
4
|
AUTHENTICATED MACHINE TRUTH + DURABLE AGENT + CODING + AUTONOMOUS PRODUCTION ENGINE
|
|
@@ -16,17 +16,17 @@ check `--version` before issuing a stateful command. The compatibility CMD
|
|
|
16
16
|
fails with an explanation when npm is detected rather than forwarding the
|
|
17
17
|
wrong command to the controller.
|
|
18
18
|
|
|
19
|
-
npx -y deadbyte-mcp@0.15.
|
|
20
|
-
npx -y deadbyte-mcp@0.15.
|
|
21
|
-
npx -y deadbyte-mcp@0.15.
|
|
22
|
-
npx -y deadbyte-mcp@0.15.
|
|
23
|
-
npx -y deadbyte-mcp@0.15.
|
|
24
|
-
npx -y deadbyte-mcp@0.15.
|
|
19
|
+
npx -y deadbyte-mcp@0.15.68 mcp
|
|
20
|
+
npx -y deadbyte-mcp@0.15.68 remote
|
|
21
|
+
npx -y deadbyte-mcp@0.15.68 remote status
|
|
22
|
+
npx -y deadbyte-mcp@0.15.68 remote restart
|
|
23
|
+
npx -y deadbyte-mcp@0.15.68 audit status
|
|
24
|
+
npx -y deadbyte-mcp@0.15.68 audit verify
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
R173 EPOCH-REVOKED AUTHORITY PROOF HOTFIX
|
|
28
28
|
------------------------
|
|
29
|
-
This 0.15.
|
|
29
|
+
This 0.15.68 CLI keeps npm publication and local production activation separate.
|
|
30
30
|
When a newer npm CLI finds an older installed runtime, one-shot remote status
|
|
31
31
|
observes the existing stable launcher and prints VERSION SKEW without deploying.
|
|
32
32
|
On a version mismatch, remote arm/disarm/restart and bare foreground remote
|
|
@@ -45,7 +45,7 @@ CLAUDE DESKTOP
|
|
|
45
45
|
"mcpServers": {
|
|
46
46
|
"deadbyte": {
|
|
47
47
|
"command": "npx",
|
|
48
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
48
|
+
"args": ["-y", "deadbyte-mcp@0.15.68", "mcp"]
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -57,7 +57,7 @@ Save as .cursor/mcp.json:
|
|
|
57
57
|
"mcpServers": {
|
|
58
58
|
"deadbyte": {
|
|
59
59
|
"command": "npx",
|
|
60
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
60
|
+
"args": ["-y", "deadbyte-mcp@0.15.68", "mcp"]
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
}
|
|
@@ -70,7 +70,7 @@ Save as .vscode/mcp.json:
|
|
|
70
70
|
"deadbyte": {
|
|
71
71
|
"type": "stdio",
|
|
72
72
|
"command": "npx",
|
|
73
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
73
|
+
"args": ["-y", "deadbyte-mcp@0.15.68", "mcp"]
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
}
|
|
@@ -80,7 +80,7 @@ Add to the Codex MCP configuration:
|
|
|
80
80
|
|
|
81
81
|
[mcp_servers.deadbyte]
|
|
82
82
|
command = "npx"
|
|
83
|
-
args = ["-y", "deadbyte-mcp@0.15.
|
|
83
|
+
args = ["-y", "deadbyte-mcp@0.15.68", "mcp"]
|
|
84
84
|
|
|
85
85
|
The `mcp` command is the quiet stdio server entry for local MCP clients; stdout is reserved for MCP.
|
|
86
86
|
The remote CLI invokes the stable active-release PowerShell launcher directly with shell=false.
|
|
@@ -369,7 +369,7 @@ CONTROLLER
|
|
|
369
369
|
----------
|
|
370
370
|
Primary operator entry point:
|
|
371
371
|
|
|
372
|
-
npx -y deadbyte-mcp@0.15.
|
|
372
|
+
npx -y deadbyte-mcp@0.15.68 remote
|
|
373
373
|
|
|
374
374
|
The legacy CMD entry remains compatibility-only for R33 rollback safety.
|
|
375
375
|
|
|
@@ -430,7 +430,7 @@ MCP CLIENT CONFIGURATION
|
|
|
430
430
|
------------------------
|
|
431
431
|
The local stdio entry point is quiet and suitable for MCP hosts:
|
|
432
432
|
|
|
433
|
-
npx -y deadbyte-mcp@0.15.
|
|
433
|
+
npx -y deadbyte-mcp@0.15.68 mcp
|
|
434
434
|
|
|
435
435
|
CLAUDE DESKTOP
|
|
436
436
|
Use the standard local-server entry in claude_desktop_config.json:
|
|
@@ -439,7 +439,7 @@ Use the standard local-server entry in claude_desktop_config.json:
|
|
|
439
439
|
"mcpServers": {
|
|
440
440
|
"deadbyte": {
|
|
441
441
|
"command": "npx",
|
|
442
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
442
|
+
"args": ["-y", "deadbyte-mcp@0.15.68", "mcp"]
|
|
443
443
|
}
|
|
444
444
|
}
|
|
445
445
|
}
|
|
@@ -452,7 +452,7 @@ Create .cursor/mcp.json:
|
|
|
452
452
|
"deadbyte": {
|
|
453
453
|
"type": "stdio",
|
|
454
454
|
"command": "npx",
|
|
455
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
455
|
+
"args": ["-y", "deadbyte-mcp@0.15.68", "mcp"]
|
|
456
456
|
}
|
|
457
457
|
}
|
|
458
458
|
}
|
|
@@ -465,7 +465,7 @@ Create .vscode/mcp.json:
|
|
|
465
465
|
"deadbyte": {
|
|
466
466
|
"type": "stdio",
|
|
467
467
|
"command": "npx",
|
|
468
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
468
|
+
"args": ["-y", "deadbyte-mcp@0.15.68", "mcp"]
|
|
469
469
|
}
|
|
470
470
|
}
|
|
471
471
|
}
|
|
@@ -475,9 +475,9 @@ Add this to ~/.codex/config.toml:
|
|
|
475
475
|
|
|
476
476
|
[mcp_servers.deadbyte]
|
|
477
477
|
command = "npx"
|
|
478
|
-
args = ["-y", "deadbyte-mcp@0.15.
|
|
478
|
+
args = ["-y", "deadbyte-mcp@0.15.68", "mcp"]
|
|
479
479
|
|
|
480
|
-
The remote device path remains `npx -y deadbyte-mcp@0.15.
|
|
480
|
+
The remote device path remains `npx -y deadbyte-mcp@0.15.68 remote`. Remote public MCP uses the
|
|
481
481
|
verified HTTPS named-tunnel URL selected by the active generation; do not commit a private device
|
|
482
482
|
URL or tunnel token into a repository.
|
|
483
483
|
|
package/RELEASE.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "deadbyte.release.v1",
|
|
3
3
|
"name": "deadbyte-mcp",
|
|
4
|
-
"version": "0.15.
|
|
5
|
-
"train": "
|
|
6
|
-
"label": "
|
|
4
|
+
"version": "0.15.68",
|
|
5
|
+
"train": "R173",
|
|
6
|
+
"label": "R173 epoch-revoked authority proof hotfix",
|
|
7
7
|
"protocol_revision": "2026-07-28",
|
|
8
8
|
"parent": {
|
|
9
9
|
"version": "0.15.61",
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
"generation_manifest_sha256": "f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4"
|
|
20
20
|
},
|
|
21
21
|
"source_predecessor": {
|
|
22
|
-
"version": "0.15.
|
|
23
|
-
"train": "
|
|
24
|
-
"source_path": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.
|
|
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",
|
|
25
25
|
"release_status": "PUBLISHED_REGISTRY_VERIFIED",
|
|
26
26
|
"manifest_status": "VERIFIED_FINAL_BYTES",
|
|
27
|
-
"manifest_sha256": "
|
|
28
|
-
"tarball_sha256": "
|
|
27
|
+
"manifest_sha256": "4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8",
|
|
28
|
+
"tarball_sha256": "0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d"
|
|
29
29
|
},
|
|
30
30
|
"consolidation": {
|
|
31
31
|
"frontend_status_vocabulary": true,
|
|
@@ -534,5 +534,19 @@
|
|
|
534
534
|
"npm_publish": "NOT_RUN",
|
|
535
535
|
"production_activation": "NOT_RUN",
|
|
536
536
|
"stable_final_claim": false
|
|
537
|
+
},
|
|
538
|
+
"r173": {
|
|
539
|
+
"scope": "EPOCH_REVOKED_AUTHORITY_PROOF_AND_FINAL_REMOTE_RECOVERY",
|
|
540
|
+
"source_predecessor_version": "0.15.67",
|
|
541
|
+
"source_predecessor_train": "R172",
|
|
542
|
+
"source_predecessor_manifest_sha256": "4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8",
|
|
543
|
+
"source_predecessor_tarball_sha256": "0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d",
|
|
544
|
+
"runtime_predecessor_release_id": "v0.15.61-055d1ff0aa99e60b",
|
|
545
|
+
"epoch_revoked_authority_proof": "GREEN_FOCUSED",
|
|
546
|
+
"public_tool_delta": 0,
|
|
547
|
+
"authority_scope_delta": 0,
|
|
548
|
+
"npm_publish": "NOT_RUN",
|
|
549
|
+
"production_activation": "NOT_RUN",
|
|
550
|
+
"stable_final_claim": false
|
|
537
551
|
}
|
|
538
552
|
}
|
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:
|
|
4
|
+
"serialNumber": "urn:cdx:deadbyte-mcp:r173:0.15.68",
|
|
5
5
|
"version": 1,
|
|
6
6
|
"metadata": {
|
|
7
7
|
"component": {
|
|
8
8
|
"type": "application",
|
|
9
9
|
"name": "deadbyte-mcp",
|
|
10
|
-
"version": "0.15.
|
|
10
|
+
"version": "0.15.68"
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
13
|
"components": [
|
package/TEST-MATRIX.json
CHANGED
package/bridge/package.json
CHANGED
|
@@ -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.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",
|
|
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.68-r173-epoch-proof\\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.68-r173-epoch-proof",
|
|
13
13
|
"deny_paths": [
|
|
14
14
|
"node_modules",
|
|
15
15
|
"controller/runtime",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "deadbyte-mcp",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.68",
|
|
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.",
|
|
@@ -98,7 +98,8 @@
|
|
|
98
98
|
"gate:windows": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/gate-windows-r168.ps1 -Stage all",
|
|
99
99
|
"r168:focused:test": "node test/r168-combined-targeted-runner.mjs",
|
|
100
100
|
"r168:release:verify": "node scripts/npm-release-r48.mjs --verify-only",
|
|
101
|
-
"r172:focused:test": "node --test --test-concurrency=1 test/r172-activation-recovery.test.mjs test/r172-release-contract.test.mjs test/r169-delegate-active.test.mjs test/r169-delegate-cli-integration.test.mjs test/r65-activation-lock-recovery.test.mjs test/r65-activation-orchestration.test.mjs"
|
|
101
|
+
"r172:focused:test": "node --test --test-concurrency=1 test/r172-activation-recovery.test.mjs test/r172-release-contract.test.mjs test/r169-delegate-active.test.mjs test/r169-delegate-cli-integration.test.mjs test/r65-activation-lock-recovery.test.mjs test/r65-activation-orchestration.test.mjs",
|
|
102
|
+
"r173:focused:test": "node --test --test-concurrency=1 test/r75-authority-evidence.test.mjs test/r172-activation-recovery.test.mjs test/r173-release-contract.test.mjs test/r65-activation-preflight.test.mjs test/r65-activation-orchestration.test.mjs"
|
|
102
103
|
},
|
|
103
104
|
"bundleDependencies": [
|
|
104
105
|
"@modelcontextprotocol/server",
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// R173 privileged preflight; read-only. Never invokes native CAS or changes grants.
|
|
2
|
+
import {createHash} from 'node:crypto';
|
|
3
|
+
import {readFile} from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import {fileURLToPath} from 'node:url';
|
|
6
|
+
import {parseManifest,verifyManifestTreeExact} from '../src/release-slot.mjs';
|
|
7
|
+
import {inspectTrustedInstallation,privilegedEpochInstallFiles} from '../src/privileged-install-trust-r89.mjs';
|
|
8
|
+
|
|
9
|
+
const root=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
10
|
+
const version='0.15.68',expectedTrain='R173';
|
|
11
|
+
const mandatory=['scripts/r173-protected-preflight.mjs','src/activation-continuity-abort-r172.mjs',
|
|
12
|
+
'src/activation-lock-r65.mjs','src/activation-preflight-r65.mjs',
|
|
13
|
+
'src/activation-reconciliation-journal-r168.mjs','src/activation-reconciliation-terminal-r168.mjs',
|
|
14
|
+
'src/activation-reconciliation-fence-r168.mjs','src/activation-reconciliation-audit-r168.mjs'];
|
|
15
|
+
function denied(reason){throw new Error('R173_'+reason);}
|
|
16
|
+
function actualProtectedRoot(){
|
|
17
|
+
const trusted='C:\\Program Files',rel=path.win32.relative(trusted,root);
|
|
18
|
+
if(!rel||rel==='..'||rel.startsWith('..'+path.win32.sep)||path.win32.isAbsolute(rel))denied('ROOT_UNPROTECTED');
|
|
19
|
+
return root;
|
|
20
|
+
}
|
|
21
|
+
async function main(){
|
|
22
|
+
if(process.platform!=='win32'||process.arch!=='x64')denied('WINDOWS_X64_REQUIRED');
|
|
23
|
+
if(process.argv.length!==2)denied('UNKNOWN_OPTION');
|
|
24
|
+
const verifiedRoot=actualProtectedRoot();
|
|
25
|
+
const pkg=JSON.parse(await readFile(path.join(verifiedRoot,'package.json'),'utf8'));
|
|
26
|
+
const release=JSON.parse(await readFile(path.join(verifiedRoot,'RELEASE.json'),'utf8'));
|
|
27
|
+
if(pkg.name!=='deadbyte-mcp'||pkg.version!==version||release.name!=='deadbyte-mcp'||
|
|
28
|
+
release.version!==version||release.train!==expectedTrain)denied('VERSION_DRIFT');
|
|
29
|
+
const manifest=await readFile(path.join(verifiedRoot,'MANIFEST.SHA256'));
|
|
30
|
+
const entries=parseManifest(manifest.toString('utf8'));
|
|
31
|
+
for(const name of mandatory)if(!entries.has(name))denied('SOURCE_NOT_IN_MANIFEST');
|
|
32
|
+
await verifyManifestTreeExact(verifiedRoot,entries,{allowedExtraPaths:['.npmignore','package-lock.json']});
|
|
33
|
+
const important=[...privilegedEpochInstallFiles(verifiedRoot,process.execPath),
|
|
34
|
+
...mandatory.map(rel=>path.win32.join(verifiedRoot,...rel.split('/'))),
|
|
35
|
+
path.win32.join(verifiedRoot,'MANIFEST.SHA256'),path.win32.join(verifiedRoot,'RELEASE.json'),
|
|
36
|
+
path.win32.join(verifiedRoot,'package.json')];
|
|
37
|
+
await inspectTrustedInstallation(important);
|
|
38
|
+
const hash=createHash('sha256').update(manifest).digest('hex');
|
|
39
|
+
process.stdout.write(JSON.stringify({status:'R173_PROTECTED_PREFLIGHT_READONLY_PASS',version,train:expectedTrain,
|
|
40
|
+
manifest_sha256:hash,files:entries.size,terminalization_authorized:false,activation_authorized:false})+'\n');
|
|
41
|
+
}
|
|
42
|
+
try{await main();}catch(error){process.stderr.write('R173_PROTECTED_PREFLIGHT=BLOCKED '+String(error?.message??error)+'\n');process.exitCode=1;}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {createHash} from 'node:crypto';
|
|
2
2
|
import {lstat,open,realpath} from 'node:fs/promises';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
+
import {createAuthorityEpochStore} from './authority-continuity-r65.mjs';
|
|
4
5
|
|
|
5
6
|
const FIELDS=Object.freeze({process:'grant_file',coding:'lease_file',autonomous:'lease_file',desktop:'grant_file',host:'arm_file'});
|
|
6
7
|
const sha=bytes=>createHash('sha256').update(bytes).digest('hex');
|
|
@@ -22,7 +23,9 @@ async function readRegularPinned(file,label){
|
|
|
22
23
|
}finally{await handle.close();}
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
export async function observeAuthorityEvidence({stateRoot,policyPaths,policySha256,authority
|
|
26
|
+
export async function observeAuthorityEvidence({stateRoot,policyPaths,policySha256,authority,
|
|
27
|
+
epochStoreFactory=createAuthorityEpochStore}){
|
|
28
|
+
if(typeof epochStoreFactory!=='function')throw new Error('authority epoch store factory invalid');
|
|
26
29
|
const runtimeRoot=await realpath(path.join(stateRoot,'runtime'));
|
|
27
30
|
const result={};
|
|
28
31
|
for(const [plane,field] of Object.entries(FIELDS)){
|
|
@@ -49,11 +52,31 @@ export async function observeAuthorityEvidence({stateRoot,policyPaths,policySha2
|
|
|
49
52
|
const grantAbsent=grantInfo===undefined;
|
|
50
53
|
if(grantInfo&&(!grantInfo.isFile()||grantInfo.isSymbolicLink()))throw new Error(`${plane} grant file type invalid`);
|
|
51
54
|
const validEntry=entry&&entry.configured===true&&typeof entry.armed==='boolean';
|
|
52
|
-
const
|
|
53
|
-
|
|
55
|
+
const grantBytes=grantInfo?await readRegularPinned(checkedPath,`${plane} grant`):null;
|
|
56
|
+
const grantSha=grantBytes?sha(grantBytes):null;
|
|
57
|
+
let transactionRevoked=false;
|
|
58
|
+
if(validEntry&&!entry.armed&&entry.reason==='epoch-revoked'&&grantBytes){
|
|
59
|
+
let grant;
|
|
60
|
+
try{grant=JSON.parse(grantBytes.toString('utf8').replace(/^\uFEFF/,''));}catch{}
|
|
61
|
+
const nonce=grant?.instance_nonce;
|
|
62
|
+
if(typeof nonce==='string'&&/^[0-9a-f]{64}$/.test(nonce)){
|
|
63
|
+
const store=epochStoreFactory({runtimeDir:parent,policyBytes});
|
|
64
|
+
const [audit,head,verification]=await Promise.all([
|
|
65
|
+
store.auditHistory({plane}),store.readHead({plane}),
|
|
66
|
+
store.verifyGrant({plane,grantBytes,grantInstanceNonce:nonce,policyBytes})
|
|
67
|
+
]);
|
|
68
|
+
transactionRevoked=audit?.status==='PASS'&&Number.isSafeInteger(audit.verified_events)&&audit.verified_events>0&&
|
|
69
|
+
head?.action==='transaction_revoke'&&Number.isSafeInteger(head.seq)&&head.seq>0&&
|
|
70
|
+
/^[0-9a-f]{64}$/.test(String(head.event_sha256??''))&&
|
|
71
|
+
head.policy_sha256===expectedHash&&head.grant_sha256===grantSha&&head.grant_instance_nonce===nonce&&
|
|
72
|
+
/^r65-[0-9a-f]{32}$/.test(String(head.update_id??''))&&verification?.trusted===false&&
|
|
73
|
+
verification?.reason==='epoch-revoked'&&verification?.event_sha256===head.event_sha256;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const validDisarmed=validEntry&&!entry.armed&&(
|
|
77
|
+
(grantAbsent&&(entry.reason==='disarmed'||(plane==='autonomous'&&entry.reason==='coding-disarmed')))||transactionRevoked);
|
|
54
78
|
const validArmed=validEntry&&entry.armed&&!grantAbsent&&entry.reason==='standing-grant'&&
|
|
55
79
|
Number.isSafeInteger(entry.epoch_seq)&&entry.epoch_seq>0&&/^[0-9a-f]{64}$/.test(entry.epoch_sha256??'');
|
|
56
|
-
const grantSha=grantInfo?sha(await readRegularPinned(checkedPath,`${plane} grant`)):null;
|
|
57
80
|
let grantFinal;
|
|
58
81
|
try{grantFinal=await lstat(checkedPath);}
|
|
59
82
|
catch(error){if(error?.code!=='ENOENT')throw error;}
|
|
@@ -61,6 +84,7 @@ export async function observeAuthorityEvidence({stateRoot,policyPaths,policySha2
|
|
|
61
84
|
throw new Error(`${plane} grant identity changed during observation`);
|
|
62
85
|
result[plane]=Object.freeze({state:validDisarmed?'VERIFIED_DISARMED':validArmed?'VERIFIED_ARMED':'UNVERIFIED',
|
|
63
86
|
policy_sha256:expectedHash,grant_absent:grantAbsent,
|
|
87
|
+
...(transactionRevoked?{transaction_revoked:true}:{}),
|
|
64
88
|
...(grantSha?{grant_sha256:grantSha}:{})});
|
|
65
89
|
}
|
|
66
90
|
return Object.freeze(result);
|
|
@@ -63,7 +63,8 @@ export function classifyActivationPreflight({pointer,expectedParent,candidate,ex
|
|
|
63
63
|
return Object.freeze({state:'AUTHORITY_UNVERIFIED',safe_to_activate:false,reason:`${plane} authority proof missing`,...bound});
|
|
64
64
|
if(proof&&(proof.policy_sha256!==observation?.policy_sha256?.[plane]||
|
|
65
65
|
proof.state!==(authority[plane]?'VERIFIED_ARMED':'VERIFIED_DISARMED')||
|
|
66
|
-
(!authority[plane]&&proof.grant_absent!==true
|
|
66
|
+
(!authority[plane]&&proof.grant_absent!==true&&
|
|
67
|
+
!(entry?.reason==='epoch-revoked'&&proof.transaction_revoked===true))))
|
|
67
68
|
return Object.freeze({state:'AUTHORITY_UNVERIFIED',safe_to_activate:false,reason:`${plane} authority proof unverified`,...bound});
|
|
68
69
|
}
|
|
69
70
|
if(PLANES.some(plane=>!HEX64.test(String(observation?.policy_sha256?.[plane]))))
|
package/src/version.mjs
CHANGED
|
@@ -7,18 +7,18 @@ import {DEADBYTE_VERSION} from '../src/version.mjs';
|
|
|
7
7
|
|
|
8
8
|
const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
|
|
9
9
|
const read=async file=>JSON.parse(await readFile(path.join(root,file),'utf8'));
|
|
10
|
-
test('current successor retains the R130 security baseline with truthful
|
|
10
|
+
test('current successor retains the R130 security baseline with truthful R173 identity',async()=>{
|
|
11
11
|
const [pkg,release,provenance,bom,lock,matrix]=await Promise.all([
|
|
12
12
|
read('package.json'),read('RELEASE.json'),read('PROVENANCE.json'),
|
|
13
13
|
read('SBOM.cdx.json'),read('package-lock.json'),read('TEST-MATRIX.json')]);
|
|
14
14
|
assert.equal(pkg.name,'deadbyte-mcp');
|
|
15
15
|
for(const actual of [pkg.version,release.version,provenance.version,matrix.version,bom.metadata.component.version,lock.version,lock.packages[''].version,DEADBYTE_VERSION])
|
|
16
|
-
assert.equal(actual,'0.15.
|
|
17
|
-
assert.equal(release.train,'
|
|
18
|
-
assert.equal(matrix.train,'
|
|
19
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
20
|
-
assert.equal(release.source_predecessor.train,'
|
|
21
|
-
assert.match(release.source_predecessor.source_path,/0\.15\.
|
|
16
|
+
assert.equal(actual,'0.15.68');
|
|
17
|
+
assert.equal(release.train,'R173');
|
|
18
|
+
assert.equal(matrix.train,'R173');
|
|
19
|
+
assert.equal(release.source_predecessor.version,'0.15.67');
|
|
20
|
+
assert.equal(release.source_predecessor.train,'R172');
|
|
21
|
+
assert.match(release.source_predecessor.source_path,/0\.15\.67-r172-final-remote-recovery/i);
|
|
22
22
|
assert.equal(release.source_predecessor.manifest_status,'VERIFIED_FINAL_BYTES');
|
|
23
23
|
assert.equal(release.runtime_predecessor.version,'0.15.61');
|
|
24
24
|
assert.equal(provenance.r160.source_predecessor_manifest_status,'STALE_REJECTED');
|
|
@@ -8,23 +8,23 @@ import {DEADBYTE_VERSION} from '../src/version.mjs';
|
|
|
8
8
|
const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
|
|
9
9
|
const read=async rel=>JSON.parse(await readFile(path.join(root,rel),'utf8'));
|
|
10
10
|
|
|
11
|
-
test('
|
|
11
|
+
test('R173 package identity preserves R132 evidence and published R172 source predecessor',async()=>{
|
|
12
12
|
const [pkg,lock,release,prov,bom,matrix]=await Promise.all([
|
|
13
13
|
read('package.json'),read('package-lock.json'),read('RELEASE.json'),
|
|
14
14
|
read('PROVENANCE.json'),read('SBOM.cdx.json'),read('TEST-MATRIX.json')]);
|
|
15
15
|
for(const value of [pkg.version,lock.version,lock.packages[''].version,release.version,prov.version,bom.metadata.component.version,matrix.version,DEADBYTE_VERSION]){
|
|
16
16
|
assert.equal(value,pkg.version);
|
|
17
17
|
}
|
|
18
|
-
assert.equal(release.train,'
|
|
19
|
-
assert.equal(matrix.train,'
|
|
20
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
21
|
-
assert.equal(release.source_predecessor.train,'
|
|
22
|
-
assert.match(release.source_predecessor.source_path,/0\.15\.
|
|
18
|
+
assert.equal(release.train,'R173');
|
|
19
|
+
assert.equal(matrix.train,'R173');
|
|
20
|
+
assert.equal(release.source_predecessor.version,'0.15.67');
|
|
21
|
+
assert.equal(release.source_predecessor.train,'R172');
|
|
22
|
+
assert.match(release.source_predecessor.source_path,/0\.15\.67-r172-final-remote-recovery/i);
|
|
23
23
|
assert.equal(prov.r160.source_predecessor_manifest_status,'STALE_REJECTED');
|
|
24
24
|
assert.equal(release.r165.published_source_manifest_sha256,'4adf7d94682fbb71c4a91eb3147ecc48076bbc5d79cb67fcb875cde6a1bb4805');
|
|
25
25
|
assert.equal(release.r165.published_source_tarball_sha256,'812e97609b7c51353ed25f2202129737e43bb4fbe0778c3adec43ec065352641');
|
|
26
|
-
assert.equal(release.source_predecessor.tarball_sha256,'
|
|
27
|
-
assert.equal(release.
|
|
26
|
+
assert.equal(release.source_predecessor.tarball_sha256,'0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d');
|
|
27
|
+
assert.equal(release.r173.source_predecessor_tarball_sha256,release.source_predecessor.tarball_sha256);
|
|
28
28
|
assert.equal(release.runtime_predecessor.version,'0.15.61');
|
|
29
29
|
assert.equal(prov.runtime_predecessor.release_id,release.runtime_predecessor.release_id);
|
|
30
30
|
assert.equal(prov.runtime_predecessor.manifest_sha256,release.runtime_predecessor.manifest_sha256);
|
|
@@ -26,7 +26,7 @@ test('R153 historical verifier refuses current successor package identity',async
|
|
|
26
26
|
const state={pkg:JSON.parse(await readFile(path.join(root,'package.json'),'utf8')),
|
|
27
27
|
release:JSON.parse(await readFile(path.join(root,'RELEASE.json'),'utf8')),
|
|
28
28
|
bridge:JSON.parse(await readFile(path.join(root,'bridge/package.json'),'utf8'))};
|
|
29
|
-
assert.equal(state.pkg.version,'0.15.
|
|
29
|
+
assert.equal(state.pkg.version,'0.15.68');
|
|
30
30
|
assert.throws(()=>verifyR153Lineage(state),/package version/);
|
|
31
31
|
await assert.rejects(verifyR153IdentityTree(root),/package version/);
|
|
32
32
|
});
|
|
@@ -8,7 +8,7 @@ import {fileURLToPath} from 'node:url';
|
|
|
8
8
|
import {atomicWriteActivePointer,materializeReleaseSlot,parseActivePointer,parseManifest,renderStableLauncherPs1,verifyManifestTreeExact} from '../src/release-slot.mjs';
|
|
9
9
|
|
|
10
10
|
const candidate=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
11
|
-
const version='0.15.
|
|
11
|
+
const version='0.15.68';
|
|
12
12
|
const parent=path.join(os.homedir(),'.deadbyte-mcp','releases','v0.15.61-055d1ff0aa99e60b');
|
|
13
13
|
const parentDigest='055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf';
|
|
14
14
|
const sha=bytes=>createHash('sha256').update(bytes).digest('hex');
|
|
@@ -21,7 +21,7 @@ async function generation(state,label){
|
|
|
21
21
|
await writeFile(path.join(root,'GENERATION.SHA256'),manifest,{flag:'wx'});
|
|
22
22
|
return {root,manifest_sha256:sha(manifest),config_path:path.join(root,'controller-config.psd1')};
|
|
23
23
|
}
|
|
24
|
-
test('
|
|
24
|
+
test('R173 isolated immutable slot activates, rolls back, and restores 0.15.68 without authority or production mutation',async()=>{
|
|
25
25
|
const stateBase=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r163-isolated-'));
|
|
26
26
|
const state=path.join(stateBase,'state');
|
|
27
27
|
try{
|
|
@@ -17,7 +17,7 @@ const hashMarker=c=>c.repeat(64);
|
|
|
17
17
|
async function fixture(t,kind){
|
|
18
18
|
assert.equal(typeof envRoot,'string'); assert.ok(path.isAbsolute(envRoot));
|
|
19
19
|
assert.match(sha(await readFile(path.join(envRoot,'MANIFEST.SHA256'))),/^[0-9a-f]{64}$/);
|
|
20
|
-
assert.equal(JSON.parse(await readFile(path.join(envRoot,'package.json'),'utf8')).version,'0.15.
|
|
20
|
+
assert.equal(JSON.parse(await readFile(path.join(envRoot,'package.json'),'utf8')).version,'0.15.68');
|
|
21
21
|
const dir=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r164-skew-e2e-'));
|
|
22
22
|
t.after(async()=>{await rm(dir,{recursive:true,force:true,maxRetries:10,retryDelay:150});});
|
|
23
23
|
const state=path.join(dir,'state'),bin=path.join(state,'bin');
|
|
@@ -68,7 +68,7 @@ async function run(fx){
|
|
|
68
68
|
gate('R168 executable CLI blocks npm-cache activation on version skew before touching R159 history',async t=>{
|
|
69
69
|
const fx=await fixture(t,'completed');
|
|
70
70
|
const r=await run(fx);
|
|
71
|
-
assert.match(r.output,/R168 version skew.*0\.15\.61.*0\.15\.
|
|
71
|
+
assert.match(r.output,/R168 version skew.*0\.15\.61.*0\.15\.68/i,r.output);
|
|
72
72
|
assert.doesNotMatch(r.output,/R159 ambiguous multiple completed/i);
|
|
73
73
|
assert.equal(r.trace,'');
|
|
74
74
|
assert.doesNotMatch(r.trace,/disarmdesktop/);
|
|
@@ -8,11 +8,11 @@ import {DEADBYTE_VERSION} from '../src/version.mjs';
|
|
|
8
8
|
const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
|
|
9
9
|
const read=async rel=>JSON.parse(await readFile(path.join(root,rel),'utf8'));
|
|
10
10
|
const readOptional=async rel=>{try{return await read(rel);}catch(error){if(error?.code==='ENOENT')return null;throw error;}};
|
|
11
|
-
const VERSION='0.15.
|
|
11
|
+
const VERSION='0.15.68';
|
|
12
12
|
const R166_MANIFEST='ad3c091fbbe2bac6d234548724008b67305fd483ad6542f92d5aeb1aa84f5849';
|
|
13
13
|
const R166_TARBALL='3d22412c3cebabd66bfa92ca4dbaaf3ef49acba7f92436a16485d7e4cb18c653';
|
|
14
14
|
|
|
15
|
-
test('
|
|
15
|
+
test('R173 package identity binds published R172 source separately from active R153 runtime',async()=>{
|
|
16
16
|
const [pkg,lock,bridge,release,provenance,matrix,bom]=await Promise.all([
|
|
17
17
|
read('package.json'),readOptional('package-lock.json'),read('bridge/package.json'),read('RELEASE.json'),
|
|
18
18
|
read('PROVENANCE.json'),read('TEST-MATRIX.json'),read('SBOM.cdx.json')]);
|
|
@@ -20,19 +20,19 @@ test('R172 package identity binds published R168 source separately from active R
|
|
|
20
20
|
provenance.version,matrix.version,bom.metadata.component.version,DEADBYTE_VERSION];
|
|
21
21
|
if(lock)versions.push(lock.version,lock.packages[''].version);
|
|
22
22
|
for(const version of versions)assert.equal(version,VERSION);
|
|
23
|
-
assert.equal(release.train,'
|
|
24
|
-
assert.equal(matrix.train,'
|
|
25
|
-
assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:
|
|
23
|
+
assert.equal(release.train,'R173');
|
|
24
|
+
assert.equal(matrix.train,'R173');
|
|
25
|
+
assert.equal(bom.serialNumber,'urn:cdx:deadbyte-mcp:r173:0.15.68');
|
|
26
26
|
assert.deepEqual(release.runtime_predecessor,{
|
|
27
27
|
version:'0.15.61',release_id:'v0.15.61-055d1ff0aa99e60b',
|
|
28
28
|
manifest_sha256:'055d1ff0aa99e60bbf9e9f136b02ebd4fffb8391712560f7607cff30af94dcdf',
|
|
29
29
|
generation_manifest_sha256:'f940e794daac2dda097a66301c4b85c4b29a2df7c669e549503c05a2a55ff6c4'
|
|
30
30
|
});
|
|
31
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
32
|
-
assert.equal(release.source_predecessor.train,'
|
|
33
|
-
assert.equal(release.source_predecessor.tarball_sha256,'
|
|
31
|
+
assert.equal(release.source_predecessor.version,'0.15.67');
|
|
32
|
+
assert.equal(release.source_predecessor.train,'R172');
|
|
33
|
+
assert.equal(release.source_predecessor.tarball_sha256,'0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d');
|
|
34
34
|
assert.equal(release.r167.source_predecessor_manifest_sha256,R166_MANIFEST);
|
|
35
|
-
assert.equal(provenance.source_predecessor_manifest_file_sha256,'
|
|
35
|
+
assert.equal(provenance.source_predecessor_manifest_file_sha256,'4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8');
|
|
36
36
|
assert.equal(release.r172.source_predecessor_manifest_sha256,'962e227dace247d59aa860211388fbde461c5f9c8a7e8a878e34a14a27d355f8');
|
|
37
37
|
assert.equal(release.r172.source_predecessor_tarball_sha256,'31b194a4fbff7dbdb9f4f275b4ea49c5115f7b0bb2241c0c72d72ef690311a5d');
|
|
38
38
|
assert.equal(release.r167.public_tool_delta,0);
|
|
@@ -6,7 +6,7 @@ import {fileURLToPath} from 'node:url';
|
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
|
|
8
8
|
const root=fileURLToPath(new URL('..',import.meta.url));
|
|
9
|
-
const script=path.join(root,'scripts','
|
|
9
|
+
const script=path.join(root,'scripts','r173-protected-preflight.mjs');
|
|
10
10
|
const protectedRoot='C:\\Program Files';
|
|
11
11
|
const relative=path.win32.relative(protectedRoot,root);
|
|
12
12
|
const isProtected=process.platform==='win32'&&relative!==''&&relative!=='..'&&!relative.startsWith('..'+path.win32.sep)&&!path.win32.isAbsolute(relative);
|
|
@@ -14,17 +14,17 @@ function launch(file,...args){return spawnSync(process.execPath,[file,...args],{
|
|
|
14
14
|
encoding:'utf8',windowsHide:true,shell:false,timeout:15000,maxBuffer:65536
|
|
15
15
|
});}
|
|
16
16
|
|
|
17
|
-
test('
|
|
17
|
+
test('R173 installed preflight respects R89 protected-vs-writable execution context',()=>{
|
|
18
18
|
const result=launch(script);
|
|
19
19
|
if(isProtected){
|
|
20
20
|
assert.equal(result.status,0,result.stderr);
|
|
21
|
-
assert.match(result.stdout,/
|
|
21
|
+
assert.match(result.stdout,/R173_PROTECTED_PREFLIGHT_READONLY_PASS/);
|
|
22
22
|
assert.match(result.stdout,/"terminalization_authorized":false/);
|
|
23
23
|
assert.match(result.stdout,/"activation_authorized":false/);
|
|
24
24
|
}else{
|
|
25
25
|
assert.notEqual(result.status,0);
|
|
26
|
-
assert.match(result.stderr,/
|
|
27
|
-
assert.match(result.stderr,/
|
|
26
|
+
assert.match(result.stderr,/R173_PROTECTED_PREFLIGHT=BLOCKED/);
|
|
27
|
+
assert.match(result.stderr,/R173_.*_(UNPROTECTED|VERSION_DRIFT)/);
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
30
|
|
|
@@ -32,20 +32,20 @@ test('R172 writable development copy remains blocked when protected fixture exis
|
|
|
32
32
|
const source=path.resolve(process.env.DEADBYTE_EXPECTED_DEVELOPMENT_ROOT||root);
|
|
33
33
|
if(path.win32.relative(protectedRoot,source).toLowerCase()===path.win32.relative(protectedRoot,root).toLowerCase()&&isProtected)
|
|
34
34
|
return test.skip('no separate development source configured');
|
|
35
|
-
const result=launch(path.join(source,'scripts','
|
|
35
|
+
const result=launch(path.join(source,'scripts','r173-protected-preflight.mjs'));
|
|
36
36
|
assert.notEqual(result.status,0);
|
|
37
|
-
assert.match(result.stderr,/
|
|
38
|
-
assert.match(result.stderr,/
|
|
37
|
+
assert.match(result.stderr,/R173_PROTECTED_PREFLIGHT=BLOCKED/);
|
|
38
|
+
assert.match(result.stderr,/R173_.*_UNPROTECTED/);
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
test('R172 entrypoint does not accept flags to skip manifest, R89 or root checks',()=>{
|
|
42
42
|
const result=launch(script,'--skip-trust');
|
|
43
43
|
assert.notEqual(result.status,0);
|
|
44
|
-
assert.match(result.stderr,/
|
|
44
|
+
assert.match(result.stderr,/R173_PROTECTED_PREFLIGHT=BLOCKED/);
|
|
45
45
|
assert.match(result.stderr,/UNKNOWN_OPTION/);
|
|
46
46
|
});
|
|
47
47
|
|
|
48
|
-
test('
|
|
48
|
+
test('R173 protected preflight source is read-only and calls exact manifest and OS ACL verification',async()=>{
|
|
49
49
|
const src=await readFile(script,'utf8');
|
|
50
50
|
assert.match(src,/verifyManifestTreeExact\(/);
|
|
51
51
|
assert.match(src,/inspectTrustedInstallation\(/);
|
|
@@ -9,20 +9,20 @@ const root=path.resolve(fileURLToPath(new URL('..',import.meta.url)));
|
|
|
9
9
|
const read=async rel=>JSON.parse(await readFile(path.join(root,rel),'utf8'));
|
|
10
10
|
const readOptional=async rel=>{try{return await read(rel);}catch(error){if(error?.code==='ENOENT')return null;throw error;}};
|
|
11
11
|
|
|
12
|
-
test('
|
|
12
|
+
test('R173 binds the published source predecessor separately from the active runtime predecessor',async()=>{
|
|
13
13
|
const [pkg,lock,bridge,release,provenance,matrix,bom]=await Promise.all([
|
|
14
14
|
read('package.json'),readOptional('package-lock.json'),read('bridge/package.json'),read('RELEASE.json'),
|
|
15
15
|
read('PROVENANCE.json'),read('TEST-MATRIX.json'),read('SBOM.cdx.json')]);
|
|
16
16
|
const versions=[pkg.version,bridge.version,release.version,provenance.version,matrix.version,
|
|
17
17
|
bom.metadata.component.version,DEADBYTE_VERSION];
|
|
18
18
|
if(lock)versions.push(lock.version,lock.packages[''].version);
|
|
19
|
-
for(const value of versions)assert.equal(value,'0.15.
|
|
20
|
-
assert.equal(release.train,'
|
|
21
|
-
assert.equal(release.source_predecessor.version,'0.15.
|
|
22
|
-
assert.equal(release.source_predecessor.manifest_sha256,'
|
|
23
|
-
assert.equal(release.source_predecessor.tarball_sha256,'
|
|
19
|
+
for(const value of versions)assert.equal(value,'0.15.68');
|
|
20
|
+
assert.equal(release.train,'R173'); assert.equal(matrix.train,'R173');
|
|
21
|
+
assert.equal(release.source_predecessor.version,'0.15.67');
|
|
22
|
+
assert.equal(release.source_predecessor.manifest_sha256,'4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8');
|
|
23
|
+
assert.equal(release.source_predecessor.tarball_sha256,'0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d');
|
|
24
24
|
assert.equal(release.runtime_predecessor.release_id,'v0.15.61-055d1ff0aa99e60b');
|
|
25
|
-
assert.equal(release.
|
|
25
|
+
assert.equal(release.r173.public_tool_delta,0); assert.equal(release.r173.authority_scope_delta,0);
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
test('R172 recovery remains fail closed until final protected and publication gates pass',async()=>{
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import {readFile} from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import {fileURLToPath} from 'node:url';
|
|
6
|
+
|
|
7
|
+
const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),'..');
|
|
8
|
+
const json=async file=>JSON.parse(await readFile(path.join(root,file),'utf8'));
|
|
9
|
+
|
|
10
|
+
test('R173 package identity binds the exact published R172 source and live runtime predecessor',async()=>{
|
|
11
|
+
const [pkg,lock,bridge,release,provenance,matrix,sbom]=await Promise.all([
|
|
12
|
+
json('package.json'),json('package-lock.json'),json('bridge/package.json'),json('RELEASE.json'),
|
|
13
|
+
json('PROVENANCE.json'),json('TEST-MATRIX.json'),json('SBOM.cdx.json')
|
|
14
|
+
]);
|
|
15
|
+
assert.equal(pkg.version,'0.15.68');
|
|
16
|
+
assert.equal(lock.version,'0.15.68');
|
|
17
|
+
assert.equal(lock.packages[''].version,'0.15.68');
|
|
18
|
+
assert.equal(bridge.version,'0.15.68');
|
|
19
|
+
assert.equal(release.version,'0.15.68');
|
|
20
|
+
assert.equal(release.train,'R173');
|
|
21
|
+
assert.equal(matrix.version,'0.15.68');
|
|
22
|
+
assert.equal(matrix.train,'R173');
|
|
23
|
+
assert.equal(sbom.metadata.component.version,'0.15.68');
|
|
24
|
+
assert.equal(release.source_predecessor.version,'0.15.67');
|
|
25
|
+
assert.equal(release.source_predecessor.train,'R172');
|
|
26
|
+
assert.equal(release.source_predecessor.manifest_sha256,'4fd7bfc76b1de6401c142b607cc84e847434b28c888bc99ceb09c9e8e5adc8f8');
|
|
27
|
+
assert.equal(release.source_predecessor.tarball_sha256,'0fe761f035f38730a4717448da4217f55464c38cd1616126b5850ff44411cd6d');
|
|
28
|
+
assert.equal(release.runtime_predecessor.version,'0.15.61');
|
|
29
|
+
assert.equal(provenance.version,'0.15.68');
|
|
30
|
+
assert.equal(provenance.parent_tarball_sha256,release.source_predecessor.tarball_sha256);
|
|
31
|
+
assert.equal(provenance.source_predecessor_manifest_file_sha256,release.source_predecessor.manifest_sha256);
|
|
32
|
+
});
|
|
@@ -83,7 +83,7 @@ test('R72 compact baseline permits only R64 read offset and authorized coding-on
|
|
|
83
83
|
assert.deepEqual(diff.added,[]);
|
|
84
84
|
assert.deepEqual(diff.removed,[]);
|
|
85
85
|
const packageVersion=JSON.parse(await readFile(path.join(repoRoot,'package.json'),'utf8')).version;
|
|
86
|
-
if(['0.15.41','0.15.42','0.15.43','0.15.44','0.15.45','0.15.46','0.15.47','0.15.48','0.15.49','0.15.50','0.15.51','0.15.52','0.15.53','0.15.54','0.15.55','0.15.56','0.15.57','0.15.58','0.15.59','0.15.60','0.15.61','0.15.62','0.15.63','0.15.64','0.15.65','0.15.66','0.15.67'].includes(packageVersion)){
|
|
86
|
+
if(['0.15.41','0.15.42','0.15.43','0.15.44','0.15.45','0.15.46','0.15.47','0.15.48','0.15.49','0.15.50','0.15.51','0.15.52','0.15.53','0.15.54','0.15.55','0.15.56','0.15.57','0.15.58','0.15.59','0.15.60','0.15.61','0.15.62','0.15.63','0.15.64','0.15.65','0.15.66','0.15.67','0.15.68'].includes(packageVersion)){
|
|
87
87
|
assert.deepEqual([...diff.schema_changed].sort(),['machine_fs','native_diff_preview']);
|
|
88
88
|
assert.equal(diff.unchanged.length,41);
|
|
89
89
|
const prior=baseline.tools.find(tool=>tool.name==='machine_fs');
|
|
@@ -49,6 +49,38 @@ test('a present grant with controller armed=false is unverified, not clean',asyn
|
|
|
49
49
|
}finally{await f.cleanup();}
|
|
50
50
|
});
|
|
51
51
|
|
|
52
|
+
test('a signed transaction revoke proves epoch-revoked disarmed while captured grant bytes remain',async()=>{
|
|
53
|
+
const stateRoot=await mkdtemp(path.join(os.tmpdir(),'deadbyte-r173-epoch-proof-'));
|
|
54
|
+
try{
|
|
55
|
+
const runtime=path.join(stateRoot,'runtime'),policies=path.join(stateRoot,'policies');
|
|
56
|
+
await mkdir(runtime);await mkdir(policies);
|
|
57
|
+
const policyPaths={},policySha256={},authority={};
|
|
58
|
+
let codingGrant=null,codingPolicyBytes=null;
|
|
59
|
+
for(const plane of planes){
|
|
60
|
+
const grant=path.join(runtime,`${plane}-grant.json`),policyPath=path.join(policies,`${plane}.json`);
|
|
61
|
+
const bytes=Buffer.from(JSON.stringify({schema:`deadbyte.${plane}-policy.v${plane==='host'?2:1}`,enabled:true,
|
|
62
|
+
[grantField[plane]]:grant,...(plane==='coding'?{roots:{project:{path:path.join(stateRoot,'project')}}}:{})}));
|
|
63
|
+
await writeFile(policyPath,bytes);policyPaths[plane]=policyPath;policySha256[plane]=sha(bytes);
|
|
64
|
+
authority[plane]={configured:true,armed:false,reason:plane==='coding'?'epoch-revoked':'disarmed'};
|
|
65
|
+
if(plane==='coding'){codingGrant=grant;codingPolicyBytes=bytes;}
|
|
66
|
+
}
|
|
67
|
+
const nonce='7'.repeat(64),grantBytes=Buffer.from(JSON.stringify({schema:'deadbyte.coding-grant.v2',
|
|
68
|
+
policy_sha256:sha(codingPolicyBytes),instance_nonce:nonce,root_ids:['project'],granted_at_utc:new Date().toISOString()}));
|
|
69
|
+
await writeFile(codingGrant,grantBytes);
|
|
70
|
+
const grantSha=sha(grantBytes),eventSha='8'.repeat(64);
|
|
71
|
+
const proof=await observeAuthorityEvidence({stateRoot,policyPaths,policySha256,authority,
|
|
72
|
+
epochStoreFactory:()=>({
|
|
73
|
+
auditHistory:async()=>({status:'PASS',verified_events:2}),
|
|
74
|
+
readHead:async()=>({action:'transaction_revoke',seq:2,event_sha256:eventSha,policy_sha256:sha(codingPolicyBytes),
|
|
75
|
+
grant_sha256:grantSha,grant_instance_nonce:nonce,update_id:'r65-'+'8'.repeat(32)}),
|
|
76
|
+
verifyGrant:async()=>({trusted:false,reason:'epoch-revoked',event_sha256:eventSha})
|
|
77
|
+
})});
|
|
78
|
+
assert.equal(proof.coding.state,'VERIFIED_DISARMED');
|
|
79
|
+
assert.equal(proof.coding.grant_absent,false);
|
|
80
|
+
assert.equal(proof.coding.transaction_revoked,true);
|
|
81
|
+
}finally{await rm(stateRoot,{recursive:true,force:true});}
|
|
82
|
+
});
|
|
83
|
+
|
|
52
84
|
test('malformed policy cannot provide disarmed proof',async()=>{
|
|
53
85
|
const f=await fixture();
|
|
54
86
|
try{
|