deadbyte-mcp 0.15.33 → 0.15.34
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 +15 -11
- package/PROVENANCE.json +27 -25
- package/README.txt +18 -14
- package/RELEASE.json +28 -25
- package/SBOM.cdx.json +3 -3
- package/TEST-MATRIX.json +44 -33
- package/controller/deadbyte-process-policy.json +4 -4
- package/package.json +4 -3
- package/scripts/gate-windows-r57.ps1 +27 -0
- package/scripts/windows-gate-evidence-r57.mjs +81 -0
- package/src/runtime-update.mjs +32 -1
- package/src/version.mjs +1 -1
- package/test/r49-windows-gate.test.mjs +14 -10
- package/test/r56-release-contract.test.mjs +5 -3
- package/test/r57-core-startup-race.test.mjs +85 -0
- package/test/r57-release-contract.test.mjs +65 -0
package/MANIFEST.SHA256
CHANGED
|
@@ -49,7 +49,7 @@ ad9821d027ac70612820617ed3c197d465c98e42a9e2a5bbb40f571fb2314894 controller/dea
|
|
|
49
49
|
8c70a873fd77e5b1579512ec218220182c2bddba63dc50c56ec70a7b449c52d9 controller/deadbyte-desktop-policy.json
|
|
50
50
|
5e8ef223b0dbc52173aaf044a075837eef8964ff0e7e16f83a595e0d17695625 controller/deadbyte-host-policy.json.example
|
|
51
51
|
6f0cc469f51444dd18211fa3346c826abeea4d2ec7a8945f0200dc5c622031ef controller/DEADBYTE-MCP.cmd
|
|
52
|
-
|
|
52
|
+
e21738fc6d3a34e5cf247fcb9442755235f76cedbbfe6602a2f40c0d5cf6297f controller/deadbyte-process-policy.json
|
|
53
53
|
d274b099a298c1033fea8f1e8849751693bbc0448778d619400acb82d4f53a3b controller/deadbyte-semantic-lsp-config.json
|
|
54
54
|
3023d2985f5b6e5cc7c0d08cb8b342b362c93dce7ebd4224635362194be40cf2 controller/README.TXT
|
|
55
55
|
101e613518c73c6aa31c725fe1b5f9a24c995dc9876b7b28e1f3e97ac9f8d362 DEADBYTE-MCP-R27-FINAL/R27-ADMIN-CLOSURE.json
|
|
@@ -1343,7 +1343,7 @@ db605a698f917c4006462596e6526fe6a9c6eff9b8409e8472fe545d4b70027c node_modules/z
|
|
|
1343
1343
|
f67a25ded944912bd4621b68df17c7c70a52aae117278c076c0aabbc32a3abba node_modules/zod/v4/mini/schemas.d.ts
|
|
1344
1344
|
51b3a7869df2d3a1bd98acb9d5b6a61bbccc7653d7a3d8fca7f0e0db7e84e284 node_modules/zod/v4/mini/schemas.js
|
|
1345
1345
|
3e3125b5a537a24c3632c1c5c09640ce7bcb3935901b127ad8ae3c37a27f133f node_modules/zod/v4/package.json
|
|
1346
|
-
|
|
1346
|
+
c0b2d5a8506490c3c6d3c22ff962c1df372db840ff1067f9e0661ce2edc9f0e6 package.json
|
|
1347
1347
|
872947dffd89755b03558b217129f009dc9f4fd1ce55e93c602fc6ea97ba8b48 proof/commander-closure-20260927/CONTINUATION.json
|
|
1348
1348
|
2959980d295814aaa0df71fdb358d2cbfd01c1357ee36ef6b10c149875bdb262 proof/commander-closure-20260927/RESULT.json
|
|
1349
1349
|
2c2866309ca3a6fc8de5b03d445f1dcf0778474fa25cefb822b2ab729bc91c62 proof/commander-closure-20260927/SEARCH-CONTINUATION.json
|
|
@@ -1408,7 +1408,7 @@ d433aaea5cccd1e184775ac4d915f34e0b39c6c99916dddd009731ad5fd6443f proof/V073-WIN
|
|
|
1408
1408
|
bd0773a9e02e8ab11475c9cc5a7db29a8313233b7eab7f837922737e75ec5938 proof/VERIFY.txt
|
|
1409
1409
|
2c821808d4596965c577f40191daee224d3aea81989778c4af97f53a83b487db proof/WINDOWS-CONTAINED-STATUS.txt
|
|
1410
1410
|
f8bc839c7b4fcb0ea7b7e7ad9448847c3beae6f95f2eb4d407d1b284aaa4ff68 proof/WINDOWS-CONTAINMENT-STATUS.txt
|
|
1411
|
-
|
|
1411
|
+
c368736d93f975dde4bd82f2eb9b2431f39f5da15bf1fc4c005c44a0e00b4c1d PROVENANCE.json
|
|
1412
1412
|
27ca0f3c9ee3a1b6374a9c8dd98008decdd0c7659c7a569c70ad7b9734c74655 R34-BASELINE.json
|
|
1413
1413
|
0b7ec5ee347ddfa6cca59740fc7a8fe3fc5d51406265bb12189e82fa106319d2 R41-PARENT.json
|
|
1414
1414
|
bd2a789b0aab5663f0d208af2ca8e4ec98179bc8c7b57e70a962d4e06a3dcfc4 R42-PARENT.json
|
|
@@ -1417,9 +1417,9 @@ f932ef78b7a72b1bb0d7aedb5fe42fbb9951c2492eb528b72442f46ddff81a6c R44-DONORS.jso
|
|
|
1417
1417
|
731b4c559fc0d25dea701e4474f02400b27e8e3f4cac9f230d5214497d4490a9 R44-PARENT.json
|
|
1418
1418
|
d33ec5d167dd44800ba4e68372b08db43deb8d01df2ef71dd435ff004ac66c8b R45-PARENT.json
|
|
1419
1419
|
3dc607603fea511e2f428e9546a875ab7e38b6a0bbd5e803e4510de082f30804 R49-PARENT.json
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1420
|
+
06a5346bcbf3b502af395352ed058d7f2bc75654f05ad3061d26c4fb3a434304 README.txt
|
|
1421
|
+
25df904fdc459aef8b2e0abb80ba11e3d11665985baac576b0b8e0107d1c3e22 RELEASE.json
|
|
1422
|
+
81bbe107d12ffde7049bd434156c86888111f8ffd3dbce77d516afa71b67f991 SBOM.cdx.json
|
|
1423
1423
|
7c86062c4f69db3179a129d65945ccfab1b1c1c5bcc29b91383eac097d50f2aa scripts/activate-skill-creator-1.1.1.mjs
|
|
1424
1424
|
bd138fe5a64088e8e1a7a5bf6104c5b17317bdc8cf3ad8191ea00ed82ace7d9b scripts/agent-eval-r42.mjs
|
|
1425
1425
|
8d90256a6863f3bbbff02e95cb12389fc6f9e8dbcb77bf1c20c902de371425e8 scripts/archive-source-zips.mjs
|
|
@@ -1518,6 +1518,7 @@ a62d69eea0c9db8778cd1551185ff6721ee6390d91afcb6863aecb75f9f422d1 scripts/gate-w
|
|
|
1518
1518
|
89f930eb3d3b9d8972d777a327f16bcfebcf12576a6ada48e53f64d1142adb2d scripts/gate-windows-r54.ps1
|
|
1519
1519
|
7dddf9b547f59b4b36ab4a7e7576d598ecd3f9e0ec24807608b2c52b0b6e6963 scripts/gate-windows-r55.ps1
|
|
1520
1520
|
078066f300debe5cbb4a7dc5565a193e78d247e68089da96d220a91ef14b05c9 scripts/gate-windows-r56.ps1
|
|
1521
|
+
ab45a76d4faa6e33d6c4b68e0d4ebe3b7b30bb8f03f8f9d71ed7b62e9412f8b7 scripts/gate-windows-r57.ps1
|
|
1521
1522
|
9a085b34b9e54023eb0efadcea1e74a1bef44b984105d064768d66910999173e scripts/gate-windows.ps1
|
|
1522
1523
|
9e625bdc701298c05eb2a63c208d023a487a1baf306c05940eb29c19fb1d6544 scripts/init-desktop-policy-r40.ps1
|
|
1523
1524
|
01451045bff624a157e7eea79afd7edfa8cb8212ea0256c8ec744fe1e1b269ff scripts/init-host-policy.ps1
|
|
@@ -1612,6 +1613,7 @@ f344639080f68b7da5cda765b518e0fb91bc8818229b6f460e82b173018ad30c scripts/window
|
|
|
1612
1613
|
127497b8ac8701da6a1211efb9f311aab3a67c4995430588617210d681139cf2 scripts/windows-gate-evidence-r54.mjs
|
|
1613
1614
|
93021201c4f37191545502a411886eafef8df031675b716c5d7eb4b50d5e30df scripts/windows-gate-evidence-r55.mjs
|
|
1614
1615
|
be332ed7cef04abaec8679198e379d7f42fc67e0833be9f42e25103c88cb5b26 scripts/windows-gate-evidence-r56.mjs
|
|
1616
|
+
44f368cd0e7c38ddebbf62204e0f3e41f61207b1ceb08b01aeee56282ce6b779 scripts/windows-gate-evidence-r57.mjs
|
|
1615
1617
|
2255b8eb78ca61267df54448560a671357f04893b6bb1df27b8b9fc8a944d255 scripts/windows-gate-evidence.mjs
|
|
1616
1618
|
105a5c6dcd54e4fabb416df9eaac093654f3ea39c4233a56e0bc6d53371b2128 scripts/workload-contract-regression-r47.mjs
|
|
1617
1619
|
c32cb9054a1b9641ae071c00622c0054272bdb0b519ea22c4ff926a1600a2b46 scripts/workload-stream-regression.mjs
|
|
@@ -1776,7 +1778,7 @@ fafeb0ec6e31762f14de46a5f021582b9a54de8af4c73c3ecc92ac71020cc8b7 src/remote-ses
|
|
|
1776
1778
|
45fcd7e9447545785e851fbeec439551c10a85c93f60a19437729870222c697c src/runtime-catalog-expectation.mjs
|
|
1777
1779
|
066c97427989298ff3d7db06e40572f4d634269ea7dfd5836575ea98c52d92bc src/runtime-coherence.mjs
|
|
1778
1780
|
ce2223bf6075e96cc02505c1439acce18bb1f204c5e86cf9152bb7194daf3cd2 src/runtime-identity.mjs
|
|
1779
|
-
|
|
1781
|
+
6ce4232fc309270ad2add0cf01f20216ab507c9a0dd4bff66338407a3d0677ac src/runtime-update.mjs
|
|
1780
1782
|
c61335adb38bfc415fe1cdabfe2c0a87e61579dfd1e52cce91c44d6993479457 src/search-cursor.mjs
|
|
1781
1783
|
fc5407ef8338ebeeede16225b3249166dc4d45e903d873eb46c15c3df07dc9ad src/semantic-backend-registry.mjs
|
|
1782
1784
|
686e9b55b9f4352b941579f186a9b9d348d86af53d052cbd5da953e7d15470ff src/semantic-code.mjs
|
|
@@ -1796,12 +1798,12 @@ c99c2402fb0df4f68634fa906eb198c551c55dad9f0921a7b8ed6e33d503884e src/tunnel-std
|
|
|
1796
1798
|
aa765e9a28c69ff58a5b5a0d29b49ea181af4db9076633b102dbca25861e708e src/tunnel-stdio-compat.mjs
|
|
1797
1799
|
642cb67d1854850e336ee73fbd71b329056bdcbdab35cea19c1a995a155ff5d9 src/verifier-cli.mjs
|
|
1798
1800
|
8f818a4852ce3be3a380cd4736c3073a7a3e0e45cd7c7ca90588a6b843d3d022 src/verifier.mjs
|
|
1799
|
-
|
|
1801
|
+
e4b97e04cf6377f8006b68e1cfb02c0c74ea258ea04a4166c4348c9f82a8b34e src/version.mjs
|
|
1800
1802
|
7e09c57a97289360aabfaf3d531208e54872efbfb3182f3c18203d2cb88c46b5 src/worker-registry.mjs
|
|
1801
1803
|
76361d5ae9a710273cf64a7525082197b692236bf23689875e5fd1ef4aa96d2b src/worker-scheduler.mjs
|
|
1802
1804
|
4da1b32f5198bb089bc68b7eb6de21ea296678b5020018a73742bf0df57d62fa src/workload-substrate.mjs
|
|
1803
1805
|
1bd637e7634ca0259791c5108fcf324554f70b1db49e5eac3505287c04bbc3be STABILIZATION-PROGRESS.md
|
|
1804
|
-
|
|
1806
|
+
9d5e5c08d52ed006b27729535bd255c62754de0c359723f9cb6bb9ff29aa1e6a TEST-MATRIX.json
|
|
1805
1807
|
e4f1fb97545f23772ddff28ad3f9954a4714f9854062fca62e0e12c1cb2ec4ae test/agent-backend-r44.test.mjs
|
|
1806
1808
|
2a78c818058b25efdc143a3a97c832da231ccd6ff9d90c7796d681a0251b85c4 test/agent-crash-child.mjs
|
|
1807
1809
|
d9461ab7c118ee75d37a2d6f5e637d7e43505af6a9ad8c7ddafffc8ace185a5b test/agent-crash-worker.mjs
|
|
@@ -2046,7 +2048,7 @@ eaaf2547cf06fad4c16db72413ea137143c280a9bc641b3230ee2d85a0b65b5a test/r44-final
|
|
|
2046
2048
|
25a21ccffcf566b020b8f3c6c0a5a3b7ff06b243fff84e405207e458640ba487 test/r47-release-contract.test.mjs
|
|
2047
2049
|
2871a825520cca851a10f65f42a6033c4c17d7446c1930d7a64316a76aacf681 test/r48-release-contract.test.mjs
|
|
2048
2050
|
ec6fc253774c318b048dc943c83b496f942d8dd034f6db9439a99a46ae3a6158 test/r49-remote-control-donors.test.mjs
|
|
2049
|
-
|
|
2051
|
+
830b8942dcf557b8c162bc00a2de9bd4c0df1203cb69ac5fc0bcbd6f8a3c8385 test/r49-windows-gate.test.mjs
|
|
2050
2052
|
c3f0a8b6ced2c15ed8580fcb261ad65bf3b885e6593d70de7394be63aba8dd1c test/r51-live-log-polling.test.mjs
|
|
2051
2053
|
3821085180a09707110e4c1a10e711343e9fb2fcf871c7c1e34149a77c7fba50 test/r51-release-contract.test.mjs
|
|
2052
2054
|
cc1ca8fe9514ca047ace52cd688f3f4fa5b7680a280d7a31cc2196ce915b91c9 test/r51-runtime-coherence.test.mjs
|
|
@@ -2058,8 +2060,10 @@ b0a9cca4f2c5dcf1a24d6e7675b42c72e88339b29ddc9220aa679316ae1467f5 test/r53-relea
|
|
|
2058
2060
|
4148924e4edc935398e20a763cb27d903095b978898e8140b695b5642b63fe8c test/r54-release-contract.test.mjs
|
|
2059
2061
|
4847402324bff518df66c9b7dbd1091bf8c0f5c5547e70c1a042c963b770bd28 test/r55-offline-predecessor-guardian-family.test.mjs
|
|
2060
2062
|
b1e6b35cf8a20214e1797cc1051c5e9c733f8d0f69b564b4ef73edc60132b252 test/r55-release-contract.test.mjs
|
|
2061
|
-
|
|
2063
|
+
68512426d0319cb47a479a43b75234aa0a1eaeffc3904ef27f311f8a790d8631 test/r56-release-contract.test.mjs
|
|
2062
2064
|
74c25d78ddebb04fad40576b284639eabbfb4487b4ec090fb1dcf6874cef878c test/r56-rollback-launcher-restore.test.mjs
|
|
2065
|
+
facda6e4625e492464052af88b1b13e7626ac43c1e27dc18585f4a5327698af4 test/r57-core-startup-race.test.mjs
|
|
2066
|
+
4a1816ce60102b787e262b2ee05d57d0692f58e86c993ed6c9471370872e7ad0 test/r57-release-contract.test.mjs
|
|
2063
2067
|
e45a6cd299d8d65bdeb9bc0117ce1eb2b47fdebad89a02413ee979c9d0ae3a5c test/release-activation-gate.test.mjs
|
|
2064
2068
|
85f6dc2059fd19d03452309ffe67bed5b87da8e6f0ce3a85cab58cba8b197ceb test/release-generation.test.mjs
|
|
2065
2069
|
bb58887a2c393cd5aac3fa3bb3a04de2704bd2a30dd2083ea638543485fa7e60 test/release-manifest-windows.test.mjs
|
package/PROVENANCE.json
CHANGED
|
@@ -1,36 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "deadbyte.provenance.v1",
|
|
3
|
-
"version": "0.15.
|
|
4
|
-
"builder": "deadbyte-
|
|
5
|
-
"source_model": "exact published and active 0.15.
|
|
3
|
+
"version": "0.15.34",
|
|
4
|
+
"builder": "deadbyte-r57-bounded-core-startup-discovery-hotfix",
|
|
5
|
+
"source_model": "exact published and active 0.15.33 artifact -> explicit signed rollback reached exact 0.15.32 pointer and restored signed predecessor launcher -> predecessor restart verification raced downstream core process visibility after ONLINE -> rollback recovery restored exact 0.15.33 without errors -> parent regression RED -> bounded retry only for zero-child core visibility, ambiguous topology remains fail-closed -> focused/full regression -> package verification -> registry round-trip -> activation/rollback/restore",
|
|
6
6
|
"signing": "ed25519",
|
|
7
|
-
"parent_release_id": "v0.15.
|
|
8
|
-
"parent_manifest_sha256": "
|
|
9
|
-
"parent_generation_manifest_sha256": "
|
|
10
|
-
"parent_tarball_sha256": "
|
|
11
|
-
"parent_activation_status": "
|
|
7
|
+
"parent_release_id": "v0.15.33-776a51cb916e28dd",
|
|
8
|
+
"parent_manifest_sha256": "776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c",
|
|
9
|
+
"parent_generation_manifest_sha256": "20ccc5e4bbf8470b61e0a6d2ad181dad5e8533da980ceba7749e1d6f48d9dbd3",
|
|
10
|
+
"parent_tarball_sha256": "d84a6df0a972a43c50d5e31242d9217f59858b2d73c4284af296da76d2048e5f",
|
|
11
|
+
"parent_activation_status": "ACTIVATED_ROLLBACK_CORE_DISCOVERY_RACE_OBSERVED",
|
|
12
12
|
"runtime_predecessor": {
|
|
13
|
-
"release_id": "v0.15.
|
|
14
|
-
"manifest_sha256": "
|
|
15
|
-
"generation_manifest_sha256": "
|
|
13
|
+
"release_id": "v0.15.33-776a51cb916e28dd",
|
|
14
|
+
"manifest_sha256": "776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c",
|
|
15
|
+
"generation_manifest_sha256": "20ccc5e4bbf8470b61e0a6d2ad181dad5e8533da980ceba7749e1d6f48d9dbd3"
|
|
16
16
|
},
|
|
17
|
-
"source_predecessor_version": "0.15.
|
|
18
|
-
"source_predecessor_tarball_sha256": "
|
|
19
|
-
"source_predecessor_manifest_file_sha256": "
|
|
20
|
-
"
|
|
21
|
-
"defect": "
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
17
|
+
"source_predecessor_version": "0.15.33",
|
|
18
|
+
"source_predecessor_tarball_sha256": "d84a6df0a972a43c50d5e31242d9217f59858b2d73c4284af296da76d2048e5f",
|
|
19
|
+
"source_predecessor_manifest_file_sha256": "776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c",
|
|
20
|
+
"r57_hotfix": {
|
|
21
|
+
"defect": "runtime restart verification samples downstream core once immediately after ONLINE and can race process visibility",
|
|
22
|
+
"bounded_core_discovery_after_online": true,
|
|
23
|
+
"retry_only_missing_core": true,
|
|
24
|
+
"ambiguous_core_fail_closed": true,
|
|
25
|
+
"timeout_fail_closed": true,
|
|
26
|
+
"parent_rollback_reached_exact_0_15_32": true,
|
|
27
|
+
"parent_recovery_restored_exact_0_15_33": true,
|
|
28
|
+
"exact_parent_activation_receipt_sha256": "5da29c0c6e7858d518f1ece5e3509ac9ac9e2079f4117a83827a0d432018a4d0",
|
|
29
|
+
"observed_parent_rollback_state_sha256": "e4ffcdb92a997bb49f936dfc338701b81601ad0ded97284f5d615f4276786608",
|
|
30
|
+
"red_parent_0_15_33": "FAIL_5_OF_5",
|
|
31
|
+
"green_r57_candidate": "PASS_5_OF_5",
|
|
30
32
|
"full_regression": "PASS",
|
|
31
33
|
"stable_final_claim": false
|
|
32
34
|
},
|
|
33
|
-
"reproducibility": "0.15.
|
|
35
|
+
"reproducibility": "0.15.33 remains immutable and active while R57 is built. After controller ONLINE/local-ready, R57 waits a bounded 10 seconds for exactly one downstream core only when the verified bridge has zero children. Any ambiguous or multiple-child topology still fails immediately. Timeout remains fail-closed. Signed rollback launcher and pointer ordering from R56 is preserved.",
|
|
34
36
|
"operator_override": {
|
|
35
37
|
"four_hour_soak": "NOT_COMPLETED",
|
|
36
38
|
"reason": "owner explicitly directed deploy before the 4-hour hard soak completed",
|
package/README.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
DEADBYTE MCP V0.15.
|
|
1
|
+
DEADBYTE MCP V0.15.34 / R57 BOUNDED CORE STARTUP DISCOVERY HOTFIX
|
|
2
2
|
=========================
|
|
3
3
|
|
|
4
4
|
AUTHENTICATED MACHINE TRUTH + DURABLE AGENT + CODING + AUTONOMOUS PRODUCTION ENGINE
|
|
@@ -7,12 +7,12 @@ NPX PRIMARY OPERATOR UX
|
|
|
7
7
|
------------------------
|
|
8
8
|
Use the npm CLI entry point instead of the legacy CMD convenience wrapper:
|
|
9
9
|
|
|
10
|
-
npx -y deadbyte-mcp@0.15.
|
|
11
|
-
npx -y deadbyte-mcp@0.15.
|
|
12
|
-
npx -y deadbyte-mcp@0.15.
|
|
13
|
-
npx -y deadbyte-mcp@0.15.
|
|
14
|
-
npx -y deadbyte-mcp@0.15.
|
|
15
|
-
npx -y deadbyte-mcp@0.15.
|
|
10
|
+
npx -y deadbyte-mcp@0.15.34 mcp
|
|
11
|
+
npx -y deadbyte-mcp@0.15.34 remote
|
|
12
|
+
npx -y deadbyte-mcp@0.15.34 remote status
|
|
13
|
+
npx -y deadbyte-mcp@0.15.34 remote restart
|
|
14
|
+
npx -y deadbyte-mcp@0.15.34 audit status
|
|
15
|
+
npx -y deadbyte-mcp@0.15.34 audit verify
|
|
16
16
|
|
|
17
17
|
The `mcp` command is the quiet stdio server entry for local MCP clients; stdout is reserved for MCP.
|
|
18
18
|
The remote CLI invokes the stable active-release PowerShell launcher directly with shell=false.
|
|
@@ -29,6 +29,10 @@ and a random 256-bit session nonce, prevents concurrent foreground sessions, and
|
|
|
29
29
|
recover only a dead, unguarded stale owner. Explicit subcommands such as `remote status` remain
|
|
30
30
|
one-shot controller operations.
|
|
31
31
|
|
|
32
|
+
R57 BOUNDED CORE STARTUP DISCOVERY HOTFIX
|
|
33
|
+
------------------------------------------
|
|
34
|
+
0.15.34 fixes the restart-verification race observed during the signed 0.15.33 -> 0.15.32 rollback acceptance. After the controller reported ONLINE and local-ready, the verifier sampled the verified bridge's downstream core process exactly once; on the failing run the bridge existed but its mcp-server child had not yet appeared in the process snapshot. R57 adds a bounded 10-second discovery wait that retries only the exact zero-child condition. Ambiguous or multiple-child topologies still fail immediately, timeout remains fail-closed, and the signed launcher/pointer rollback ordering from R56 is preserved. 0.15.33 remains immutable and published.
|
|
35
|
+
|
|
32
36
|
R56 SIGNED ROLLBACK LAUNCHER RESTORE HOTFIX
|
|
33
37
|
------------------------------------------------
|
|
34
38
|
0.15.33 fixes the explicit rollback defect observed after the successful 0.15.32 production activation. The prior immutable release and generation are now verified without incorrectly comparing them to the currently active successor launcher. Rollback then loads the signature-verified activation handoff, requires its prior/new pointers to match the signed activation receipt, restores the signed predecessor launcher snapshot before committing the predecessor pointer, and verifies the complete predecessor installation before restart. If rollback recovery is required, the signed successor launcher bytes are reinstalled before the successor pointer is restored. 0.15.32 remains immutable and published.
|
|
@@ -284,7 +288,7 @@ CONTROLLER
|
|
|
284
288
|
----------
|
|
285
289
|
Primary operator entry point:
|
|
286
290
|
|
|
287
|
-
npx -y deadbyte-mcp@0.15.
|
|
291
|
+
npx -y deadbyte-mcp@0.15.34 remote
|
|
288
292
|
|
|
289
293
|
The legacy CMD entry remains compatibility-only for R33 rollback safety.
|
|
290
294
|
|
|
@@ -345,7 +349,7 @@ MCP CLIENT CONFIGURATION
|
|
|
345
349
|
------------------------
|
|
346
350
|
The local stdio entry point is quiet and suitable for MCP hosts:
|
|
347
351
|
|
|
348
|
-
npx -y deadbyte-mcp@0.15.
|
|
352
|
+
npx -y deadbyte-mcp@0.15.34 mcp
|
|
349
353
|
|
|
350
354
|
CLAUDE DESKTOP
|
|
351
355
|
Use the standard local-server entry in claude_desktop_config.json:
|
|
@@ -354,7 +358,7 @@ Use the standard local-server entry in claude_desktop_config.json:
|
|
|
354
358
|
"mcpServers": {
|
|
355
359
|
"deadbyte": {
|
|
356
360
|
"command": "npx",
|
|
357
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
361
|
+
"args": ["-y", "deadbyte-mcp@0.15.34", "mcp"]
|
|
358
362
|
}
|
|
359
363
|
}
|
|
360
364
|
}
|
|
@@ -367,7 +371,7 @@ Create .cursor/mcp.json:
|
|
|
367
371
|
"deadbyte": {
|
|
368
372
|
"type": "stdio",
|
|
369
373
|
"command": "npx",
|
|
370
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
374
|
+
"args": ["-y", "deadbyte-mcp@0.15.34", "mcp"]
|
|
371
375
|
}
|
|
372
376
|
}
|
|
373
377
|
}
|
|
@@ -380,7 +384,7 @@ Create .vscode/mcp.json:
|
|
|
380
384
|
"deadbyte": {
|
|
381
385
|
"type": "stdio",
|
|
382
386
|
"command": "npx",
|
|
383
|
-
"args": ["-y", "deadbyte-mcp@0.15.
|
|
387
|
+
"args": ["-y", "deadbyte-mcp@0.15.34", "mcp"]
|
|
384
388
|
}
|
|
385
389
|
}
|
|
386
390
|
}
|
|
@@ -390,9 +394,9 @@ Add this to ~/.codex/config.toml:
|
|
|
390
394
|
|
|
391
395
|
[mcp_servers.deadbyte]
|
|
392
396
|
command = "npx"
|
|
393
|
-
args = ["-y", "deadbyte-mcp@0.15.
|
|
397
|
+
args = ["-y", "deadbyte-mcp@0.15.34", "mcp"]
|
|
394
398
|
|
|
395
|
-
The remote device path remains `npx -y deadbyte-mcp@0.15.
|
|
399
|
+
The remote device path remains `npx -y deadbyte-mcp@0.15.34 remote`. Remote public MCP uses the
|
|
396
400
|
verified HTTPS named-tunnel URL selected by the active generation; do not commit a private device
|
|
397
401
|
URL or tunnel token into a repository.
|
|
398
402
|
|
package/RELEASE.json
CHANGED
|
@@ -1,38 +1,40 @@
|
|
|
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.34",
|
|
5
|
+
"train": "R57",
|
|
6
|
+
"label": "BOUNDED CORE STARTUP DISCOVERY HOTFIX",
|
|
7
7
|
"protocol_revision": "2026-07-28",
|
|
8
8
|
"parent": {
|
|
9
|
-
"version": "0.15.
|
|
10
|
-
"release_id": "v0.15.
|
|
11
|
-
"manifest_sha256": "
|
|
12
|
-
"generation_manifest_sha256": "
|
|
13
|
-
"tarball_sha256": "
|
|
14
|
-
"activation_status": "
|
|
9
|
+
"version": "0.15.33",
|
|
10
|
+
"release_id": "v0.15.33-776a51cb916e28dd",
|
|
11
|
+
"manifest_sha256": "776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c",
|
|
12
|
+
"generation_manifest_sha256": "20ccc5e4bbf8470b61e0a6d2ad181dad5e8533da980ceba7749e1d6f48d9dbd3",
|
|
13
|
+
"tarball_sha256": "d84a6df0a972a43c50d5e31242d9217f59858b2d73c4284af296da76d2048e5f",
|
|
14
|
+
"activation_status": "ACTIVATED_ROLLBACK_CORE_DISCOVERY_RACE_OBSERVED"
|
|
15
15
|
},
|
|
16
16
|
"runtime_predecessor": {
|
|
17
|
-
"release_id": "v0.15.
|
|
18
|
-
"manifest_sha256": "
|
|
19
|
-
"generation_manifest_sha256": "
|
|
17
|
+
"release_id": "v0.15.33-776a51cb916e28dd",
|
|
18
|
+
"manifest_sha256": "776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c",
|
|
19
|
+
"generation_manifest_sha256": "20ccc5e4bbf8470b61e0a6d2ad181dad5e8533da980ceba7749e1d6f48d9dbd3"
|
|
20
20
|
},
|
|
21
21
|
"source_predecessor": {
|
|
22
|
-
"version": "0.15.
|
|
23
|
-
"tarball_sha256": "
|
|
24
|
-
"manifest_file_sha256": "
|
|
22
|
+
"version": "0.15.33",
|
|
23
|
+
"tarball_sha256": "d84a6df0a972a43c50d5e31242d9217f59858b2d73c4284af296da76d2048e5f",
|
|
24
|
+
"manifest_file_sha256": "776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c"
|
|
25
25
|
},
|
|
26
26
|
"hotfix": {
|
|
27
|
-
"defect": "
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
27
|
+
"defect": "runtime restart verification samples downstream core once immediately after ONLINE and can race process visibility",
|
|
28
|
+
"bounded_core_discovery_after_online": true,
|
|
29
|
+
"retry_only_missing_core": true,
|
|
30
|
+
"ambiguous_core_fail_closed": true,
|
|
31
|
+
"timeout_fail_closed": true,
|
|
32
|
+
"parent_rollback_reached_exact_0_15_32": true,
|
|
33
|
+
"parent_recovery_restored_exact_0_15_33": true,
|
|
34
|
+
"exact_parent_activation_receipt_sha256": "5da29c0c6e7858d518f1ece5e3509ac9ac9e2079f4117a83827a0d432018a4d0",
|
|
35
|
+
"observed_parent_rollback_state_sha256": "e4ffcdb92a997bb49f936dfc338701b81601ad0ded97284f5d615f4276786608",
|
|
36
|
+
"red_parent_0_15_33": "FAIL_5_OF_5",
|
|
37
|
+
"green_r57_candidate": "PASS_5_OF_5",
|
|
36
38
|
"full_regression": "PASS",
|
|
37
39
|
"stable_final_claim": false
|
|
38
40
|
},
|
|
@@ -142,6 +144,7 @@
|
|
|
142
144
|
"offline_predecessor_host_revoke_before_capture": true,
|
|
143
145
|
"offline_recovery_self_process_exclusion": true,
|
|
144
146
|
"offline_recovery_foreground_guardian_family_exclusion": true,
|
|
145
|
-
"signed_rollback_launcher_snapshot_restore": true
|
|
147
|
+
"signed_rollback_launcher_snapshot_restore": true,
|
|
148
|
+
"bounded_core_startup_discovery": true
|
|
146
149
|
}
|
|
147
150
|
}
|
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:r57:0.15.34",
|
|
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.34"
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
13
|
"components": [
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
{
|
|
35
35
|
"type": "file",
|
|
36
36
|
"name": "deadbyte-hardware-observer-r45.exe",
|
|
37
|
-
"version": "0.15.
|
|
37
|
+
"version": "0.15.34",
|
|
38
38
|
"hashes": [
|
|
39
39
|
{
|
|
40
40
|
"alg": "SHA-256",
|
package/TEST-MATRIX.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "deadbyte.test-matrix.v1",
|
|
3
|
-
"version": "0.15.
|
|
4
|
-
"train": "
|
|
3
|
+
"version": "0.15.34",
|
|
4
|
+
"train": "R57",
|
|
5
5
|
"primary_platform": "win32-x64",
|
|
6
6
|
"reference": {
|
|
7
7
|
"package": "@wonderwhy-er/desktop-commander",
|
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
},
|
|
12
12
|
"required": [
|
|
13
13
|
{
|
|
14
|
-
"id": "
|
|
15
|
-
"command": "npm run
|
|
16
|
-
"expected": "PASS
|
|
14
|
+
"id": "r57-focused",
|
|
15
|
+
"command": "npm run r57:focused:test",
|
|
16
|
+
"expected": "PASS bounded core startup discovery, timeout and ambiguity negative controls, signed rollback regressions, runtime update/slot contracts"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"id": "full-regression",
|
|
20
20
|
"command": "npm run r48:full:test",
|
|
21
|
-
"expected": "PASS current
|
|
21
|
+
"expected": "PASS current R57 successor"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"id": "package-boundary",
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
{
|
|
29
29
|
"id": "windows-gate",
|
|
30
30
|
"command": "npm run gate:windows",
|
|
31
|
-
"expected": "PASS
|
|
31
|
+
"expected": "PASS R57 focused + recorded full regression + manifest/doctor evidence"
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
34
|
"id": "package-verify",
|
|
@@ -37,62 +37,67 @@
|
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
"id": "activation",
|
|
40
|
-
"command": "npx --yes deadbyte-mcp@0.15.
|
|
41
|
-
"expected": "activate exact
|
|
40
|
+
"command": "npx --yes deadbyte-mcp@0.15.34 remote",
|
|
41
|
+
"expected": "activate exact R57 from exact active 0.15.33"
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
"id": "rollback",
|
|
45
|
-
"command": "runtime-update --rollback-receipt <signed
|
|
46
|
-
"expected": "restore exact signed 0.15.
|
|
45
|
+
"command": "runtime-update --rollback-receipt <signed R57 activation receipt>",
|
|
46
|
+
"expected": "restore exact signed 0.15.33 pointer/runtime, ONLINE, all authority DISARMED despite transient zero-child startup window"
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
"id": "restore",
|
|
50
|
-
"command": "npx --yes deadbyte-mcp@0.15.
|
|
51
|
-
"expected": "restore same exact
|
|
50
|
+
"command": "npx --yes deadbyte-mcp@0.15.34 remote",
|
|
51
|
+
"expected": "restore same exact R57 release/generation and foreground authority contract"
|
|
52
52
|
}
|
|
53
53
|
],
|
|
54
54
|
"observed_pre_release_evidence": {
|
|
55
|
-
"
|
|
55
|
+
"red_parent_0_15_33": {
|
|
56
56
|
"status": "FAIL_EXPECTED",
|
|
57
57
|
"tests": 5,
|
|
58
58
|
"failed": 5,
|
|
59
|
-
"receipt_id": "
|
|
60
|
-
"receipt_sha256": "
|
|
59
|
+
"receipt_id": "5ab72278a1c91a03bd7223a5",
|
|
60
|
+
"receipt_sha256": "f12a8ea7593aa0754da45c074e613d7d3c530e8e95d83a9e8b669cfbc61d0306"
|
|
61
61
|
},
|
|
62
|
-
"
|
|
62
|
+
"green_r57_candidate": {
|
|
63
63
|
"status": "PASS",
|
|
64
64
|
"tests": 5,
|
|
65
65
|
"failed": 0,
|
|
66
|
-
"receipt_id": "
|
|
67
|
-
"receipt_sha256": "
|
|
66
|
+
"receipt_id": "bcfdb0757b905154960eaea9",
|
|
67
|
+
"receipt_sha256": "9b62291a4312df128e88749f1a0c88d3884d82fb651d7d389db4e14556a5f39f"
|
|
68
68
|
},
|
|
69
69
|
"parent_activation": {
|
|
70
70
|
"status": "PASS",
|
|
71
|
-
"release_id": "v0.15.
|
|
72
|
-
"manifest_sha256": "
|
|
73
|
-
"generation_manifest_sha256": "
|
|
74
|
-
"activation_receipt_sha256": "
|
|
71
|
+
"release_id": "v0.15.33-776a51cb916e28dd",
|
|
72
|
+
"manifest_sha256": "776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c",
|
|
73
|
+
"generation_manifest_sha256": "20ccc5e4bbf8470b61e0a6d2ad181dad5e8533da980ceba7749e1d6f48d9dbd3",
|
|
74
|
+
"activation_receipt_sha256": "5da29c0c6e7858d518f1ece5e3509ac9ac9e2079f4117a83827a0d432018a4d0"
|
|
75
75
|
},
|
|
76
76
|
"parent_rollback": {
|
|
77
77
|
"status": "FAIL_EXPECTED",
|
|
78
|
-
"error": "
|
|
79
|
-
"
|
|
78
|
+
"error": "expected one unambiguous downstream core for bridge 20396, found children=0 visible_matches=0",
|
|
79
|
+
"state_path": "C:\\Users\\DEADBYTE\\.deadbyte-mcp\\evidence\\updates\\r31-rollback-5da29c0c6e7858d5-muou98lb-1163ac55\\state.json",
|
|
80
|
+
"state_sha256": "e4ffcdb92a997bb49f936dfc338701b81601ad0ded97284f5d615f4276786608",
|
|
81
|
+
"predecessor_pointer_reached": true,
|
|
82
|
+
"recovery_successor_pointer_restored": true,
|
|
83
|
+
"recovery_successor_runtime_restarted": true,
|
|
84
|
+
"recovery_errors": []
|
|
80
85
|
},
|
|
81
86
|
"full_regression": {
|
|
82
87
|
"status": "PASS",
|
|
83
|
-
"files":
|
|
88
|
+
"files": 235,
|
|
84
89
|
"batches": 8,
|
|
85
|
-
"elapsed_ms":
|
|
86
|
-
"receipt_id": "
|
|
87
|
-
"receipt_sha256": "
|
|
88
|
-
"request_sha256": "
|
|
90
|
+
"elapsed_ms": 239011.708,
|
|
91
|
+
"receipt_id": "9d95b63da942fc18a74c98a3",
|
|
92
|
+
"receipt_sha256": "66e6e9ed02e8aa6e8e3644f44561983f3051893b890b964d33c3364402ced17f",
|
|
93
|
+
"request_sha256": "f8de9082c0d30ee075607727cdb9af031b3f400cada8ea56c3debc12f353b65e"
|
|
89
94
|
}
|
|
90
95
|
},
|
|
91
96
|
"inherited_parent_evidence": {
|
|
92
|
-
"version": "0.15.
|
|
97
|
+
"version": "0.15.33",
|
|
93
98
|
"parent_full_regression": "PASS",
|
|
94
|
-
"parent_manifest_sha256": "
|
|
95
|
-
"parent_tarball_sha256": "
|
|
99
|
+
"parent_manifest_sha256": "776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c",
|
|
100
|
+
"parent_tarball_sha256": "d84a6df0a972a43c50d5e31242d9217f59858b2d73c4284af296da76d2048e5f",
|
|
96
101
|
"parent_registry_identity": "PASS",
|
|
97
102
|
"four_hour_soak": "NOT_COMPLETED_OPERATOR_BYPASS"
|
|
98
103
|
},
|
|
@@ -131,6 +136,12 @@
|
|
|
131
136
|
"signed_handoff_launcher_snapshot_required": true,
|
|
132
137
|
"predecessor_launcher_restored_before_pointer_commit": true,
|
|
133
138
|
"successor_launcher_restored_before_recovery_pointer": true
|
|
139
|
+
},
|
|
140
|
+
"r57": {
|
|
141
|
+
"core_startup_wait_timeout_ms": 10000,
|
|
142
|
+
"core_startup_poll_ms": 100,
|
|
143
|
+
"retry_only_zero_child": true,
|
|
144
|
+
"ambiguous_topology_fail_closed": true
|
|
134
145
|
}
|
|
135
146
|
},
|
|
136
147
|
"non_win32": {
|
|
@@ -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.34-r57\\controller\\runtime\\process-grant.json",
|
|
5
|
+
"state_dir": "D:\\Projects\\deadbyte-mcp\\development\\deadbyte-mcp-0.15.34-r57\\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.34-r57\\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.34-r57",
|
|
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.34",
|
|
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.",
|
|
@@ -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-r57.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",
|
|
@@ -78,7 +78,8 @@
|
|
|
78
78
|
"r53:focused:test": "node --test --test-concurrency=1 test/r53-release-contract.test.mjs test/stabilization-update-child-root.test.mjs test/stabilization-state-root.test.mjs test/stabilization-guardian.test.mjs test/stabilization-semver.test.mjs test/stabilization-powershell.test.mjs test/release-slot.test.mjs test/runtime-self-update.test.mjs test/r51-runtime-coherence.test.mjs test/remote-session-cli.test.mjs test/r52-offline-predecessor-recovery.test.mjs test/r52-host-revocation.test.mjs",
|
|
79
79
|
"r54:focused:test": "node --test --test-concurrency=1 test/r54-release-contract.test.mjs test/r54-offline-predecessor-self-exclusion.test.mjs test/r52-offline-predecessor-recovery.test.mjs test/runtime-self-update.test.mjs test/r51-runtime-coherence.test.mjs test/remote-session-cli.test.mjs",
|
|
80
80
|
"r55:focused:test": "node --test --test-concurrency=1 test/r55-release-contract.test.mjs test/r55-offline-predecessor-guardian-family.test.mjs test/r54-offline-predecessor-self-exclusion.test.mjs test/r52-offline-predecessor-recovery.test.mjs test/runtime-self-update.test.mjs test/r51-runtime-coherence.test.mjs test/remote-session-cli.test.mjs",
|
|
81
|
-
"r56:focused:test": "node --test --test-concurrency=1 test/r56-release-contract.test.mjs test/r56-rollback-launcher-restore.test.mjs test/r55-offline-predecessor-guardian-family.test.mjs test/r54-offline-predecessor-self-exclusion.test.mjs test/runtime-self-update.test.mjs test/release-slot.test.mjs test/r51-runtime-coherence.test.mjs"
|
|
81
|
+
"r56:focused:test": "node --test --test-concurrency=1 test/r56-release-contract.test.mjs test/r56-rollback-launcher-restore.test.mjs test/r55-offline-predecessor-guardian-family.test.mjs test/r54-offline-predecessor-self-exclusion.test.mjs test/runtime-self-update.test.mjs test/release-slot.test.mjs test/r51-runtime-coherence.test.mjs",
|
|
82
|
+
"r57:focused:test": "node --test --test-concurrency=1 test/r57-release-contract.test.mjs test/r57-core-startup-race.test.mjs test/r56-rollback-launcher-restore.test.mjs test/r55-offline-predecessor-guardian-family.test.mjs test/r54-offline-predecessor-self-exclusion.test.mjs test/runtime-self-update.test.mjs test/release-slot.test.mjs test/r51-runtime-coherence.test.mjs test/remote-session-cli.test.mjs"
|
|
82
83
|
},
|
|
83
84
|
"bundleDependencies": [
|
|
84
85
|
"@modelcontextprotocol/server",
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
$ErrorActionPreference = 'Stop'
|
|
2
|
+
Set-StrictMode -Version 3.0
|
|
3
|
+
|
|
4
|
+
function Invoke-GateStep {
|
|
5
|
+
param([Parameter(Mandatory)][string]$Name,[Parameter(Mandatory)][string[]]$NpmArgs)
|
|
6
|
+
Write-Host "==== $Name ===="
|
|
7
|
+
& npm.cmd @NpmArgs
|
|
8
|
+
if ($LASTEXITCODE -ne 0) { throw "DEADBYTE 0.15.34 / R57 gate failed at $Name with exit code $LASTEXITCODE" }
|
|
9
|
+
}
|
|
10
|
+
function Invoke-NodeTest {
|
|
11
|
+
param([Parameter(Mandatory)][string]$Name,[Parameter(Mandatory)][string[]]$TestFiles)
|
|
12
|
+
Write-Host "==== $Name ===="
|
|
13
|
+
& node.exe --test --test-concurrency=1 @TestFiles
|
|
14
|
+
if ($LASTEXITCODE -ne 0) { throw "DEADBYTE 0.15.34 / R57 gate failed at $Name with exit code $LASTEXITCODE" }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
Invoke-NodeTest 'r57-package-boundary' @('test/package-boundary.test.mjs')
|
|
18
|
+
Invoke-GateStep 'r57-focused-contracts' @('run','r57:focused:test')
|
|
19
|
+
Write-Host '==== full-regression-evidence ===='
|
|
20
|
+
$matrix=Get-Content -LiteralPath (Join-Path (Split-Path $PSScriptRoot -Parent) 'TEST-MATRIX.json') -Raw | ConvertFrom-Json
|
|
21
|
+
if($matrix.observed_pre_release_evidence.full_regression.status -ne 'PASS'){ throw 'R57 full regression evidence is not PASS' }
|
|
22
|
+
Invoke-GateStep 'manifest-write' @('run','manifest:write')
|
|
23
|
+
Invoke-GateStep 'manifest-verify' @('run','manifest:verify')
|
|
24
|
+
Invoke-GateStep 'doctor' @('run','doctor')
|
|
25
|
+
& node.exe (Join-Path $PSScriptRoot 'windows-gate-evidence-r57.mjs')
|
|
26
|
+
if ($LASTEXITCODE -ne 0) { throw "R57 evidence writer failed with exit code $LASTEXITCODE" }
|
|
27
|
+
Write-Host '==== DEADBYTE 0.15.34 / R57 WINDOWS GATE: PASS ===='
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { mkdir, open, readFile } from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { doctor } from '../src/doctor-r45.mjs';
|
|
7
|
+
|
|
8
|
+
const root=path.resolve(path.dirname(fileURLToPath(import.meta.url)),'..');
|
|
9
|
+
const stateRoot=path.resolve(process.env.DEADBYTE_STATE_ROOT||path.join(os.homedir(),'.deadbyte-mcp'));
|
|
10
|
+
const sha256=bytes=>createHash('sha256').update(bytes).digest('hex');
|
|
11
|
+
const insist=(ok,message)=>{if(!ok)throw new Error(message);};
|
|
12
|
+
const pkg=JSON.parse(await readFile(path.join(root,'package.json'),'utf8'));
|
|
13
|
+
const release=JSON.parse(await readFile(path.join(root,'RELEASE.json'),'utf8'));
|
|
14
|
+
const provenance=JSON.parse(await readFile(path.join(root,'PROVENANCE.json'),'utf8'));
|
|
15
|
+
const matrix=JSON.parse(await readFile(path.join(root,'TEST-MATRIX.json'),'utf8'));
|
|
16
|
+
const active=JSON.parse(await readFile(path.join(stateRoot,'active-release.json'),'utf8'));
|
|
17
|
+
const manifestSha256=sha256(await readFile(path.join(root,'MANIFEST.SHA256')));
|
|
18
|
+
|
|
19
|
+
insist(pkg.version==='0.15.34'&&release.version===pkg.version&&release.train==='R57','R57 candidate identity mismatch');
|
|
20
|
+
insist(release.parent.version==='0.15.33','R57 parent mismatch');
|
|
21
|
+
insist(release.parent.manifest_sha256==='776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c','R57 parent manifest mismatch');
|
|
22
|
+
insist(release.parent.generation_manifest_sha256==='20ccc5e4bbf8470b61e0a6d2ad181dad5e8533da980ceba7749e1d6f48d9dbd3','R57 parent generation mismatch');
|
|
23
|
+
insist(release.parent.tarball_sha256==='d84a6df0a972a43c50d5e31242d9217f59858b2d73c4284af296da76d2048e5f','R57 parent tarball mismatch');
|
|
24
|
+
insist(
|
|
25
|
+
active.release_id===release.runtime_predecessor.release_id&&
|
|
26
|
+
active.manifest_sha256===release.runtime_predecessor.manifest_sha256&&
|
|
27
|
+
active.generation_manifest_sha256===release.runtime_predecessor.generation_manifest_sha256,
|
|
28
|
+
'active runtime is not exact sealed 0.15.33 predecessor'
|
|
29
|
+
);
|
|
30
|
+
insist(release.hotfix?.bounded_core_discovery_after_online===true,'R57 bounded core discovery missing');
|
|
31
|
+
insist(release.hotfix?.retry_only_missing_core===true,'R57 zero-child-only retry contract missing');
|
|
32
|
+
insist(release.hotfix?.ambiguous_core_fail_closed===true,'R57 ambiguous-core fail-closed contract missing');
|
|
33
|
+
insist(release.hotfix?.timeout_fail_closed===true,'R57 timeout fail-closed contract missing');
|
|
34
|
+
insist(release.hotfix?.full_regression==='PASS','R57 full regression metadata is not PASS');
|
|
35
|
+
insist(matrix.observed_pre_release_evidence?.full_regression?.status==='PASS','R57 full regression evidence is not PASS');
|
|
36
|
+
insist(provenance.operator_override?.stable_final_claim===false,'R57 must not claim stable/final');
|
|
37
|
+
insist(matrix.operator_override?.four_hour_soak==='NOT_COMPLETED','R57 matrix must preserve soak bypass');
|
|
38
|
+
|
|
39
|
+
const health=await doctor();
|
|
40
|
+
insist(health.status==='ok'&&health.package_version===pkg.version&&health.manifest?.verified===true,'R57 doctor evidence invalid');
|
|
41
|
+
|
|
42
|
+
const evidenceBody={
|
|
43
|
+
schema:'deadbyte.r57-windows-gate.v1',
|
|
44
|
+
status:'passed',
|
|
45
|
+
exit_code:0,
|
|
46
|
+
version:pkg.version,
|
|
47
|
+
train:'R57',
|
|
48
|
+
completed_at_utc:new Date().toISOString(),
|
|
49
|
+
manifest_sha256:manifestSha256,
|
|
50
|
+
parent:release.parent,
|
|
51
|
+
runtime_predecessor:release.runtime_predecessor,
|
|
52
|
+
hotfix:release.hotfix,
|
|
53
|
+
operator_override:provenance.operator_override,
|
|
54
|
+
active_predecessor:{
|
|
55
|
+
release_id:active.release_id,
|
|
56
|
+
version:active.version,
|
|
57
|
+
manifest_sha256:active.manifest_sha256,
|
|
58
|
+
generation_manifest_sha256:active.generation_manifest_sha256
|
|
59
|
+
},
|
|
60
|
+
doctor:{verified_entries:health.manifest.verified_entries},
|
|
61
|
+
gates:{
|
|
62
|
+
r57_focused:true,
|
|
63
|
+
package_boundary:true,
|
|
64
|
+
full_regression:true,
|
|
65
|
+
manifest_final_verify:true,
|
|
66
|
+
four_hour_soak_completed:false
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const bytes=Buffer.from(JSON.stringify(evidenceBody,null,2)+'\n');
|
|
70
|
+
const dir=path.join(stateRoot,'evidence','release');
|
|
71
|
+
await mkdir(dir,{recursive:true});
|
|
72
|
+
const target=path.join(dir,`r57-windows-gate-${manifestSha256.slice(0,16)}.json`);
|
|
73
|
+
try{
|
|
74
|
+
const handle=await open(target,'wx',0o600);
|
|
75
|
+
try{await handle.writeFile(bytes);await handle.sync();}finally{await handle.close();}
|
|
76
|
+
}catch(error){
|
|
77
|
+
if(error?.code!=='EEXIST')throw error;
|
|
78
|
+
const prior=JSON.parse(await readFile(target,'utf8'));
|
|
79
|
+
insist(prior.schema===evidenceBody.schema&&prior.status==='passed'&&prior.version===evidenceBody.version&&prior.manifest_sha256===manifestSha256,'conflicting R57 gate evidence identity');
|
|
80
|
+
}
|
|
81
|
+
console.log(JSON.stringify({status:'passed',path:target,sha256:sha256(bytes),manifest_sha256:manifestSha256}));
|
package/src/runtime-update.mjs
CHANGED
|
@@ -743,6 +743,37 @@ export function selectCoreProcess(processes,coreRoot,bridgePid,verifiedBridge=nu
|
|
|
743
743
|
function coreProcess(coreRoot,bridge){
|
|
744
744
|
return selectCoreProcess(nodeProcesses(),coreRoot,bridge.pid,bridge);
|
|
745
745
|
}
|
|
746
|
+
export async function waitForCoreProcess(coreRoot,bridge,{
|
|
747
|
+
timeoutMs=10000,
|
|
748
|
+
pollMs=100,
|
|
749
|
+
processProvider=nodeProcesses,
|
|
750
|
+
sleepFn=sleep,
|
|
751
|
+
nowFn=Date.now
|
|
752
|
+
}={}){
|
|
753
|
+
const bridgePid=Number(bridge?.pid);
|
|
754
|
+
if(!Number.isInteger(bridgePid)||bridgePid<1) throw new Error('downstream core wait requires verified bridge PID');
|
|
755
|
+
if(!Number.isFinite(timeoutMs)||timeoutMs<0) throw new Error('downstream core wait timeout invalid');
|
|
756
|
+
if(!Number.isFinite(pollMs)||pollMs<1) throw new Error('downstream core wait poll invalid');
|
|
757
|
+
if(typeof processProvider!=='function'||typeof sleepFn!=='function'||typeof nowFn!=='function') throw new Error('downstream core wait hooks invalid');
|
|
758
|
+
const started=Number(nowFn());
|
|
759
|
+
let lastError=null;
|
|
760
|
+
while(true){
|
|
761
|
+
try {
|
|
762
|
+
const processes=await processProvider();
|
|
763
|
+
return selectCoreProcess(processes,coreRoot,bridgePid,bridge);
|
|
764
|
+
} catch(error){
|
|
765
|
+
const message=String(error?.message??error);
|
|
766
|
+
const transient=`expected one unambiguous downstream core for bridge ${bridgePid}, found children=0 visible_matches=0`;
|
|
767
|
+
if(message!==transient) throw error;
|
|
768
|
+
lastError=error;
|
|
769
|
+
}
|
|
770
|
+
const elapsed=Math.max(0,Number(nowFn())-started);
|
|
771
|
+
if(elapsed>=timeoutMs){
|
|
772
|
+
throw new Error(`downstream core did not appear for bridge ${bridgePid} within ${timeoutMs}ms: ${String(lastError?.message??lastError)}`);
|
|
773
|
+
}
|
|
774
|
+
await sleepFn(Math.min(pollMs,Math.max(1,timeoutMs-elapsed)));
|
|
775
|
+
}
|
|
776
|
+
}
|
|
746
777
|
async function captureRuntime(ctx){
|
|
747
778
|
const statusText=controllerCaptured(ctx,'status',15000); const status=parseControllerStatus(statusText);
|
|
748
779
|
if(!status.online||!status.bridge_pid||!status.cloud_pid||!status.local_ready) throw new Error(`slot update requires ONLINE runtime: ${statusText}`);
|
|
@@ -826,7 +857,7 @@ async function startAndVerify(ctx,oldRuntime){
|
|
|
826
857
|
catch {} await sleep(500);
|
|
827
858
|
}
|
|
828
859
|
if(!status?.online||!status.bridge_pid||!status.cloud_pid||!status.local_ready) throw new Error(`new runtime failed ONLINE gate: ${statusText}`);
|
|
829
|
-
const bridge=await readLedger(ctx,'bridge'); const cloud=await readLedger(ctx,'cloud'); const core=
|
|
860
|
+
const bridge=await readLedger(ctx,'bridge'); const cloud=await readLedger(ctx,'cloud'); const core=await waitForCoreProcess(ctx.core_root,bridge);
|
|
830
861
|
if(oldRuntime?.bridge&&sameGeneration(oldRuntime.bridge,bridge)) throw new Error('fresh bridge generation gate failed');
|
|
831
862
|
if(oldRuntime?.cloud&&sameGeneration(oldRuntime.cloud,cloud)) throw new Error('fresh cloud generation gate failed');
|
|
832
863
|
if(oldRuntime?.core&&oldRuntime.core.pid===core.pid&&oldRuntime.core.creation_date===core.creation_date) throw new Error('fresh downstream core generation gate failed');
|
package/src/version.mjs
CHANGED
|
@@ -4,9 +4,11 @@ import test from 'node:test';
|
|
|
4
4
|
|
|
5
5
|
const read=path=>readFile(new URL(`../${path}`,import.meta.url),'utf8');
|
|
6
6
|
|
|
7
|
-
test('
|
|
8
|
-
const [pkgText,gate,evidence,historicalR55,historicalEvidenceR55,historicalR54,historicalEvidenceR54,historicalR53,historicalEvidenceR53,historicalR52,historicalEvidenceR52,historicalR51,historicalEvidenceR51,historicalR50,historicalR49,deferred]=await Promise.all([
|
|
7
|
+
test('R57 canonical Windows gate is successor-bound and preserves R56/R55/R54/R53/R52/R51/R50/R49 historical gates',async()=>{
|
|
8
|
+
const [pkgText,gate,evidence,historicalR56,historicalEvidenceR56,historicalR55,historicalEvidenceR55,historicalR54,historicalEvidenceR54,historicalR53,historicalEvidenceR53,historicalR52,historicalEvidenceR52,historicalR51,historicalEvidenceR51,historicalR50,historicalR49,deferred]=await Promise.all([
|
|
9
9
|
read('package.json'),
|
|
10
|
+
read('scripts/gate-windows-r57.ps1'),
|
|
11
|
+
read('scripts/windows-gate-evidence-r57.mjs'),
|
|
10
12
|
read('scripts/gate-windows-r56.ps1'),
|
|
11
13
|
read('scripts/windows-gate-evidence-r56.mjs'),
|
|
12
14
|
read('scripts/gate-windows-r55.ps1'),
|
|
@@ -24,18 +26,20 @@ test('R56 canonical Windows gate is successor-bound and preserves R55/R54/R53/R5
|
|
|
24
26
|
read('scripts/deferred-slot-operation-r46.mjs')
|
|
25
27
|
]);
|
|
26
28
|
const pkg=JSON.parse(pkgText);
|
|
27
|
-
assert.match(pkg.scripts['gate:windows'],/gate-windows-
|
|
28
|
-
assert.match(gate,/DEADBYTE 0\.15\.
|
|
29
|
-
assert.match(gate,/
|
|
30
|
-
assert.match(gate,/
|
|
29
|
+
assert.match(pkg.scripts['gate:windows'],/gate-windows-r57\.ps1$/);
|
|
30
|
+
assert.match(gate,/DEADBYTE 0\.15\.34 \/ R57 WINDOWS GATE: PASS/);
|
|
31
|
+
assert.match(gate,/r57-package-boundary/);
|
|
32
|
+
assert.match(gate,/r57-focused-contracts/);
|
|
31
33
|
assert.match(gate,/full-regression-evidence/);
|
|
32
34
|
assert.match(gate,/manifest-verify/);
|
|
33
35
|
assert.match(gate,/doctor/);
|
|
34
|
-
assert.match(evidence,/deadbyte\.
|
|
35
|
-
assert.match(evidence,/pkg\.version==='0\.15\.
|
|
36
|
-
assert.match(evidence,/release\.train==='
|
|
37
|
-
assert.match(evidence,/release\.parent\.version==='0\.15\.
|
|
36
|
+
assert.match(evidence,/deadbyte\.r57-windows-gate\.v1/);
|
|
37
|
+
assert.match(evidence,/pkg\.version==='0\.15\.34'/);
|
|
38
|
+
assert.match(evidence,/release\.train==='R57'/);
|
|
39
|
+
assert.match(evidence,/release\.parent\.version==='0\.15\.33'/);
|
|
38
40
|
assert.match(evidence,/four_hour_soak_completed:false/);
|
|
41
|
+
assert.match(historicalR56,/DEADBYTE 0\.15\.33 \/ R56 WINDOWS GATE: PASS/);
|
|
42
|
+
assert.match(historicalEvidenceR56,/deadbyte\.r56-windows-gate\.v1/);
|
|
39
43
|
assert.match(historicalR55,/DEADBYTE 0\.15\.32 \/ R55 WINDOWS GATE: PASS/);
|
|
40
44
|
assert.match(historicalEvidenceR55,/deadbyte\.r55-windows-gate\.v1/);
|
|
41
45
|
assert.match(historicalR54,/DEADBYTE 0\.15\.31 \/ R54 WINDOWS GATE: PASS/);
|
|
@@ -5,8 +5,10 @@ import { readFile } from 'node:fs/promises';
|
|
|
5
5
|
const root=new URL('../',import.meta.url);
|
|
6
6
|
const read=rel=>readFile(new URL(rel,root),'utf8');
|
|
7
7
|
const json=rel=>read(rel).then(JSON.parse);
|
|
8
|
+
const currentPackage=await json('package.json');
|
|
9
|
+
const r56test=currentPackage.version==='0.15.33'?test:test.skip;
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
r56test('R56 release identity is coherent across package lock source metadata SBOM and gate',async()=>{
|
|
10
12
|
const [pkg,lock,release,provenance,matrix,sbom,versionSource]=await Promise.all([
|
|
11
13
|
json('package.json'),json('package-lock.json'),json('RELEASE.json'),json('PROVENANCE.json'),json('TEST-MATRIX.json'),json('SBOM.cdx.json'),read('src/version.mjs')
|
|
12
14
|
]);
|
|
@@ -25,7 +27,7 @@ test('R56 release identity is coherent across package lock source metadata SBOM
|
|
|
25
27
|
assert.match(pkg.scripts['r56:focused:test'],/r56-rollback-launcher-restore\.test\.mjs/);
|
|
26
28
|
});
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
r56test('R56 source and runtime predecessor are exact active published 0.15.32',async()=>{
|
|
29
31
|
const [release,provenance]=await Promise.all([json('RELEASE.json'),json('PROVENANCE.json')]);
|
|
30
32
|
assert.equal(release.parent.version,'0.15.32');
|
|
31
33
|
assert.equal(release.parent.release_id,'v0.15.32-e7223f467777f5df');
|
|
@@ -44,7 +46,7 @@ test('R56 source and runtime predecessor are exact active published 0.15.32',asy
|
|
|
44
46
|
assert.deepEqual(provenance.runtime_predecessor,release.runtime_predecessor);
|
|
45
47
|
});
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
r56test('R56 records signed rollback launcher ordering RED to GREEN and preserves non-final claim',async()=>{
|
|
48
50
|
const [release,provenance,matrix]=await Promise.all([json('RELEASE.json'),json('PROVENANCE.json'),json('TEST-MATRIX.json')]);
|
|
49
51
|
assert.equal(release.hotfix.signed_handoff_launcher_snapshot_required,true);
|
|
50
52
|
assert.equal(release.hotfix.stored_predecessor_verified_without_live_launcher,true);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { pathToFileURL } from 'node:url';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
|
|
7
|
+
const target=process.env.R57_RUNTIME_UPDATE_PATH
|
|
8
|
+
? path.resolve(process.env.R57_RUNTIME_UPDATE_PATH)
|
|
9
|
+
: path.resolve(new URL('../src/runtime-update.mjs',import.meta.url).pathname.replace(/^\/(?:[A-Za-z]:)/,m=>m.slice(1)));
|
|
10
|
+
const runtimeUpdate=await import(pathToFileURL(target).href+'?r57='+Date.now());
|
|
11
|
+
const coreRoot='C:\\slot\\core';
|
|
12
|
+
const bridge={pid:20396,component:'bridge',script_path:'C:\\slot\\bridge\\src\\bridge.mjs',script_sha256:'a'.repeat(64)};
|
|
13
|
+
|
|
14
|
+
function core(pid=13456,parentPid=bridge.pid){
|
|
15
|
+
return {
|
|
16
|
+
ProcessId:pid,
|
|
17
|
+
ParentProcessId:parentPid,
|
|
18
|
+
CreationDate:'20261001011147.227000+000',
|
|
19
|
+
ExecutablePath:'C:\\Program Files\\nodejs\\node.exe',
|
|
20
|
+
CommandLine:`"C:\\Program Files\\nodejs\\node.exe" ${coreRoot}\\src\\mcp-server.mjs`
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
test('R57 exports bounded downstream core discovery',()=>{
|
|
25
|
+
assert.equal(typeof runtimeUpdate.waitForCoreProcess,'function');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('R57 tolerates the observed ONLINE-to-core visibility race and returns the later exact child',async()=>{
|
|
29
|
+
const snapshots=[[],[],[core()]];
|
|
30
|
+
let calls=0;
|
|
31
|
+
let clock=0;
|
|
32
|
+
const found=await runtimeUpdate.waitForCoreProcess(coreRoot,bridge,{
|
|
33
|
+
timeoutMs:1000,
|
|
34
|
+
pollMs:100,
|
|
35
|
+
processProvider:()=>{ calls++; return snapshots.shift()??[core()]; },
|
|
36
|
+
sleepFn:async ms=>{ clock+=ms; },
|
|
37
|
+
nowFn:()=>clock
|
|
38
|
+
});
|
|
39
|
+
assert.equal(found.pid,13456);
|
|
40
|
+
assert.equal(found.parent_pid,bridge.pid);
|
|
41
|
+
assert.equal(found.identity_basis,'command_line');
|
|
42
|
+
assert.equal(calls,3);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('R57 times out fail-closed when the core never appears',async()=>{
|
|
46
|
+
let calls=0;
|
|
47
|
+
let clock=0;
|
|
48
|
+
await assert.rejects(
|
|
49
|
+
runtimeUpdate.waitForCoreProcess(coreRoot,bridge,{
|
|
50
|
+
timeoutMs:250,
|
|
51
|
+
pollMs:100,
|
|
52
|
+
processProvider:()=>{ calls++; return []; },
|
|
53
|
+
sleepFn:async ms=>{ clock+=ms; },
|
|
54
|
+
nowFn:()=>clock
|
|
55
|
+
}),
|
|
56
|
+
/downstream core did not appear.*bridge 20396.*250ms/i
|
|
57
|
+
);
|
|
58
|
+
assert.ok(calls>=3);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('R57 does not retry an ambiguous downstream core topology',async()=>{
|
|
62
|
+
let calls=0;
|
|
63
|
+
let clock=0;
|
|
64
|
+
await assert.rejects(
|
|
65
|
+
runtimeUpdate.waitForCoreProcess(coreRoot,bridge,{
|
|
66
|
+
timeoutMs:1000,
|
|
67
|
+
pollMs:100,
|
|
68
|
+
processProvider:()=>{ calls++; return [core(14001),core(14002)]; },
|
|
69
|
+
sleepFn:async ms=>{ clock+=ms; },
|
|
70
|
+
nowFn:()=>clock
|
|
71
|
+
}),
|
|
72
|
+
/expected one unambiguous downstream core.*children=2.*visible_matches=2/i
|
|
73
|
+
);
|
|
74
|
+
assert.equal(calls,1);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test('R57 startAndVerify uses bounded core discovery after the ONLINE gate',async()=>{
|
|
78
|
+
const source=await readFile(target,'utf8');
|
|
79
|
+
const start=source.indexOf('async function startAndVerify');
|
|
80
|
+
const end=source.indexOf('async function stabilizeRuntime',start);
|
|
81
|
+
assert.ok(start>=0&&end>start);
|
|
82
|
+
const body=source.slice(start,end);
|
|
83
|
+
assert.match(body,/const core=await waitForCoreProcess\(ctx\.core_root,bridge\)/);
|
|
84
|
+
assert.doesNotMatch(body,/const core=coreProcess\(ctx\.core_root,bridge\)/);
|
|
85
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
|
|
5
|
+
const root=new URL('../',import.meta.url);
|
|
6
|
+
const read=rel=>readFile(new URL(rel,root),'utf8');
|
|
7
|
+
const json=rel=>read(rel).then(JSON.parse);
|
|
8
|
+
|
|
9
|
+
test('R57 release identity is coherent across package lock source metadata SBOM and gate',async()=>{
|
|
10
|
+
const [pkg,lock,release,provenance,matrix,sbom,versionSource]=await Promise.all([
|
|
11
|
+
json('package.json'),json('package-lock.json'),json('RELEASE.json'),json('PROVENANCE.json'),json('TEST-MATRIX.json'),json('SBOM.cdx.json'),read('src/version.mjs')
|
|
12
|
+
]);
|
|
13
|
+
assert.equal(pkg.version,'0.15.34');
|
|
14
|
+
assert.equal(lock.version,pkg.version);
|
|
15
|
+
assert.equal(lock.packages[''].version,pkg.version);
|
|
16
|
+
assert.match(versionSource,/DEADBYTE_VERSION = '0\.15\.34'/);
|
|
17
|
+
assert.equal(release.version,pkg.version);
|
|
18
|
+
assert.equal(release.train,'R57');
|
|
19
|
+
assert.equal(provenance.version,pkg.version);
|
|
20
|
+
assert.equal(matrix.version,pkg.version);
|
|
21
|
+
assert.equal(matrix.train,'R57');
|
|
22
|
+
assert.equal(sbom.metadata.component.version,pkg.version);
|
|
23
|
+
assert.equal(sbom.serialNumber,'urn:cdx:deadbyte-mcp:r57:0.15.34');
|
|
24
|
+
assert.match(pkg.scripts['gate:windows'],/gate-windows-r57\.ps1/);
|
|
25
|
+
assert.match(pkg.scripts['r57:focused:test'],/r57-core-startup-race\.test\.mjs/);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('R57 source and runtime predecessor are exact active published 0.15.33',async()=>{
|
|
29
|
+
const [release,provenance]=await Promise.all([json('RELEASE.json'),json('PROVENANCE.json')]);
|
|
30
|
+
assert.equal(release.parent.version,'0.15.33');
|
|
31
|
+
assert.equal(release.parent.release_id,'v0.15.33-776a51cb916e28dd');
|
|
32
|
+
assert.equal(release.parent.manifest_sha256,'776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c');
|
|
33
|
+
assert.equal(release.parent.generation_manifest_sha256,'20ccc5e4bbf8470b61e0a6d2ad181dad5e8533da980ceba7749e1d6f48d9dbd3');
|
|
34
|
+
assert.equal(release.parent.tarball_sha256,'d84a6df0a972a43c50d5e31242d9217f59858b2d73c4284af296da76d2048e5f');
|
|
35
|
+
assert.equal(release.parent.activation_status,'ACTIVATED_ROLLBACK_CORE_DISCOVERY_RACE_OBSERVED');
|
|
36
|
+
assert.equal(release.source_predecessor.version,'0.15.33');
|
|
37
|
+
assert.deepEqual(release.runtime_predecessor,{
|
|
38
|
+
release_id:'v0.15.33-776a51cb916e28dd',
|
|
39
|
+
manifest_sha256:'776a51cb916e28ddc3cbb2ecd3857151a0e73e0aaf83d4e6308e6674125dd01c',
|
|
40
|
+
generation_manifest_sha256:'20ccc5e4bbf8470b61e0a6d2ad181dad5e8533da980ceba7749e1d6f48d9dbd3'
|
|
41
|
+
});
|
|
42
|
+
assert.equal(provenance.parent_manifest_sha256,release.parent.manifest_sha256);
|
|
43
|
+
assert.equal(provenance.parent_generation_manifest_sha256,release.parent.generation_manifest_sha256);
|
|
44
|
+
assert.deepEqual(provenance.runtime_predecessor,release.runtime_predecessor);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('R57 records bounded zero-child retry RED to GREEN and preserves fail-closed controls',async()=>{
|
|
48
|
+
const [release,provenance,matrix]=await Promise.all([json('RELEASE.json'),json('PROVENANCE.json'),json('TEST-MATRIX.json')]);
|
|
49
|
+
assert.equal(release.hotfix.bounded_core_discovery_after_online,true);
|
|
50
|
+
assert.equal(release.hotfix.retry_only_missing_core,true);
|
|
51
|
+
assert.equal(release.hotfix.ambiguous_core_fail_closed,true);
|
|
52
|
+
assert.equal(release.hotfix.timeout_fail_closed,true);
|
|
53
|
+
assert.equal(release.hotfix.parent_rollback_reached_exact_0_15_32,true);
|
|
54
|
+
assert.equal(release.hotfix.parent_recovery_restored_exact_0_15_33,true);
|
|
55
|
+
assert.equal(release.hotfix.exact_parent_activation_receipt_sha256,'5da29c0c6e7858d518f1ece5e3509ac9ac9e2079f4117a83827a0d432018a4d0');
|
|
56
|
+
assert.equal(release.hotfix.observed_parent_rollback_state_sha256,'e4ffcdb92a997bb49f936dfc338701b81601ad0ded97284f5d615f4276786608');
|
|
57
|
+
assert.equal(release.hotfix.red_parent_0_15_33,'FAIL_5_OF_5');
|
|
58
|
+
assert.equal(release.hotfix.green_r57_candidate,'PASS_5_OF_5');
|
|
59
|
+
assert.equal(matrix.observed_pre_release_evidence.red_parent_0_15_33.receipt_sha256,'f12a8ea7593aa0754da45c074e613d7d3c530e8e95d83a9e8b669cfbc61d0306');
|
|
60
|
+
assert.equal(matrix.observed_pre_release_evidence.green_r57_candidate.receipt_sha256,'9b62291a4312df128e88749f1a0c88d3884d82fb651d7d389db4e14556a5f39f');
|
|
61
|
+
assert.equal(provenance.operator_override.four_hour_soak,'NOT_COMPLETED');
|
|
62
|
+
assert.equal(release.hotfix.stable_final_claim,false);
|
|
63
|
+
assert.equal(provenance.operator_override.stable_final_claim,false);
|
|
64
|
+
assert.equal(matrix.operator_override.stable_final_claim,false);
|
|
65
|
+
});
|