@junghanacs/entwurf 0.36.1 → 0.37.1

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.
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "$comment": "SSOT for the herdr binary this repository has MEASURED against. Nothing else may carry a version or a digest: the CI installer, the sandbox gate's boundary check and the launch-rail document all read or cite this file. Re-measuring a new herdr means measuring it FIRST — fetched by digest and verified before it is made executable, then run against a private sandbox server (at least version, status-client protocol and integration rows) — then editing this file and repairing the measured sentences in docs/herdr-launch-rail.md in the same commit; miss one and the gate fails on version mismatch, which is the point. A private baseline is not the full gate: check-herdr-sandbox at a new pin is certified by its exact-SHA CI run unless it was also run locally, and an asset is recorded `executed` only with a receipt bound to this version and its full digest (check-herdr-supply HSUP-EXECUTION-RECEIPT-BOUND).",
3
- "version": "0.9.4",
4
- "tag": "v0.9.4",
5
- "tagCommit": "7e26bad94044eba205033111a0ce8033ede7e24f",
3
+ "version": "0.9.5",
4
+ "tag": "v0.9.5",
5
+ "tagCommit": "2ecf19a92fc3a7fff75b6ce3655ef04f4625ec01",
6
6
  "socketProtocol": 22,
7
- "measuredOn": "2026-10-14",
7
+ "measuredOn": "2026-10-15",
8
8
  "measuredArch": "aarch64",
9
9
  "releaseUrlPrefix": "https://github.com/herdrdev/herdr/releases/download",
10
10
  "integrity": {
@@ -15,16 +15,17 @@
15
15
  "assets": {
16
16
  "x86_64": {
17
17
  "name": "herdr-linux-x86_64",
18
- "sha256": "493304fbefb0ed0ea0455f373b47f48d24e8774bc7974f4c916ad2e937675b23",
19
- "executed": false,
20
- "executedNote": "not yet executed at this pin: the digest is pinned and named by GitHub's release attestation for pkg:github/herdrdev/herdr@v0.9.4, and the first CI check job at a SHA carrying this pin will be its first run. The previous pin's x86_64 asset (v0.9.3, sha256 18a8dc65…) did run there — CI run 38456259822, check-herdr-sandbox 12 assertions — which is dated history of that asset, not evidence for this one"
18
+ "sha256": "14d9e8bc8b4a9e0118d77c32266f76d461f09b40342eb23752960bd89f59929d",
19
+ "executed": true,
20
+ "executedReceipt": "herdr 0.9.5 linux-x86_64 sha256 14d9e8bc8b4a9e0118d77c32266f76d461f09b40342eb23752960bd89f59929d — 2026-10-15, GitHub Actions check job (x86_64), CI run 38667564413 at d8cd8f3, read from that run's check-job log: `install-herdr-ci` verified this digest before execution, and check-herdr-sandbox passed 12 assertions on private herdr 0.9.5, HS-VERSION-BOUNDARY included",
21
+ "executedNote": "the receipt is the full sandbox gate at the SHA that introduced this pin; it is not a claim for any later SHA. The previous pin's x86_64 asset (v0.9.4, sha256 493304fb…) ran in CI run 38479767989 at 9f33dd1, check-herdr-sandbox 12 assertions — dated history of that asset, not evidence for this one"
21
22
  },
22
23
  "aarch64": {
23
24
  "name": "herdr-linux-aarch64",
24
- "sha256": "9511cb70982c1ef115f232058e7ed7cf9640aa5a2c0ca78934cefda3aeb093fd",
25
+ "sha256": "17d7536f2da50859523680ef279dffcac8e4a235f4e46fe8da6c2ec44141897c",
25
26
  "executed": true,
26
- "executedReceipt": "herdr 0.9.4 linux-aarch64 sha256 9511cb70982c1ef115f232058e7ed7cf9640aa5a2c0ca78934cefda3aeb093fd — 2026-10-14, oracle aarch64, Phase A private CLI baseline (docs/herdr-launch-rail.md, 재측정 2026-10-14): `herdr --version` 0.9.4; `status client` protocol 22, endpoint_protocol_generation 1; `integration status` 18 rows, zero diff against 0.9.3; pi (v9) and claude (v10) integrations seeded by 0.9.3 read `current` and a 0.9.4 reinstall leaves their three files byte-identical; `server stop` leaves no socket and no process",
27
- "executedNote": "the receipt is a private CLI baseline only. check-herdr-sandbox has NOT run on this architecture at this pin — its operator-untouched cell reads the operator's own panes — so the full gate's first run at this pin is the CI check job, on the x86_64 asset — not this one. The operator host still runs 0.9.3 and was not touched. The 0.9.3 receipt (2026-10-03, #126) stays dated in docs/herdr-launch-rail.md"
27
+ "executedReceipt": "herdr 0.9.5 linux-aarch64 sha256 17d7536f2da50859523680ef279dffcac8e4a235f4e46fe8da6c2ec44141897c — 2026-10-15, oracle aarch64, Phase A private CLI baseline (docs/herdr-launch-rail.md, 재측정 2026-10-15): `herdr --version` 0.9.5; `status client` protocol 22, endpoint_protocol_generation 1; `integration status` 18 rows, zero diff against 0.9.4 in a fresh sandbox; over integrations seeded by 0.9.4, pi reads `current (v9)` and claude reads `outdated (v10 < v11)`; a 0.9.5 reinstall leaves the pi extension and claude settings.json byte-identical, changes the claude hook only in its `HERDR_INTEGRATION_VERSION` line (10 → 11), and then reads `current (v11)`; `server stop` leaves no socket and no process",
28
+ "executedNote": "the receipt is a private CLI baseline only. check-herdr-sandbox has NOT run on this architecture at this pin — its operator-untouched cell reads the operator's own panes — so the full gate's first run at this pin was the CI check job on the x86_64 asset (CI run 38667564413) — not this one. The operator host was not touched. The 0.9.4 receipt (2026-10-14) stays dated in docs/herdr-launch-rail.md"
28
29
  }
29
30
  }
30
31
  }
@@ -57,7 +57,12 @@ export function buildCodexInstruction(input: CodexInstructionInput): string {
57
57
  "2. Stop and wait for the Pi callback delivered into this Codex thread. Accept only a callback whose body " +
58
58
  "repeats the exact nonce from your LAUNCH receipt and whose sender envelope carries a garden id on its `session:` line.\n" +
59
59
  `3. Only after that match, call public mcp__entwurf_bridge__entwurf_v2 once with target ${input.callerGid}, ` +
60
- "intent fire-and-forget, wants_reply false, and message:\n" +
60
+ // [LIVE 2026-10-16, 0.37.1 r2] a Codex sibling sent PI_SESSION_ID=485 / PI_WINDOW_ID=1130 for
61
+ // `$485` / `@1130`: the sigils lived only inside the placeholder names below. The exact-argument
62
+ // check stays; the instruction now says the prefixes are part of the ids.
63
+ "intent fire-and-forget, wants_reply false, and message (copy PI_SESSION_ID and PI_WINDOW_ID byte for byte " +
64
+ "from the LAUNCH receipt's `window:` line: the session id keeps its leading `$` and the window id keeps its " +
65
+ "leading `@`; never drop either prefix):\n" +
61
66
  `${input.finalToken}\nPI_LAUNCH_NONCE=<exact launch nonce>\nPI_CALLBACK_NONCE=<same exact nonce>\n` +
62
67
  "PI_CALLBACK_FROM=<the garden id on the callback envelope's `session:` line — NOT the model name on its `from:` line>\nPI_SESSION_ID=<exact $session id from the LAUNCH receipt>\n" +
63
68
  "PI_WINDOW_ID=<exact @window id from the LAUNCH receipt>\nDo not claim completion in prose."
@@ -302,8 +302,8 @@ const STATES: GroupState[] = ["MEASURED", "CARRIED", "INHERITED-UNVERIFIED", "UN
302
302
  * (qualification-oracle-core → composeRelease) passes none: its declared input list is each
303
303
  * collection's own `attempted[].sha256` (checkCollectionData) under the GitHub artifact
304
304
  * digest (admitArtifact), and an ancestor run it was not given leaves its groups UNRUN, a
305
- * release-mode blocker. It is not the release oracle: verify-exact-ci.sh stays the strict
306
- * exact-SHA full-body gate until #124 P3.
305
+ * release-mode blocker. It is not the release oracle: verify-exact-ci.sh reads the push
306
+ * run's four required jobs and no qualification body (#144).
307
307
  */
308
308
  export function composeLedger(
309
309
  loaded: LoadedReceipt[],
@@ -8,7 +8,7 @@
8
8
  "subject": "scripts/check-herdr-sandbox.ts",
9
9
  "find": ["const SUPPLY_MANIFEST = \"scripts/fixtures/herdr-supply.json\";"],
10
10
  "replace": [
11
- "const SUPPLY_MANIFEST = \"scripts/fixtures/herdr-supply.json\";\nconst PINNED_FALLBACK = \"0.9.4\";\nvoid PINNED_FALLBACK;"
11
+ "const SUPPLY_MANIFEST = \"scripts/fixtures/herdr-supply.json\";\nconst PINNED_FALLBACK = \"0.9.5\";\nvoid PINNED_FALLBACK;"
12
12
  ],
13
13
  "gate": ["bash", "run.sh", "check-herdr-supply"],
14
14
  "timeoutSeconds": 120,
@@ -19,8 +19,8 @@
19
19
  "claim": "HSUP-DIGEST-SHAPE",
20
20
  "title": "a pinned digest is truncated, so the check that is supposed to catch a swapped binary can no longer fail",
21
21
  "subject": "scripts/fixtures/herdr-supply.json",
22
- "find": ["\"sha256\": \"493304fbefb0ed0ea0455f373b47f48d24e8774bc7974f4c916ad2e937675b23\""],
23
- "replace": ["\"sha256\": \"493304fbefb0ed0ea0455f373b47\""],
22
+ "find": ["\"sha256\": \"14d9e8bc8b4a9e0118d77c32266f76d461f09b40342eb23752960bd89f59929d\""],
23
+ "replace": ["\"sha256\": \"14d9e8bc8b4a9e0118d77c32266f\""],
24
24
  "gate": ["bash", "run.sh", "check-herdr-supply"],
25
25
  "timeoutSeconds": 120,
26
26
  "signature": "[QK:HSUP-DIGEST-SHAPE]",
@@ -122,8 +122,8 @@
122
122
  "claim": "HSUP-EXECUTION-RECEIPT-BOUND",
123
123
  "title": "the x86_64 asset is recorded as executed with no receipt bound to this pin's version and its own full digest",
124
124
  "subject": "scripts/fixtures/herdr-supply.json",
125
- "find": ["\"executed\": false"],
126
- "replace": ["\"executed\": true"],
125
+ "find": ["\"executedReceipt\": \"herdr 0.9.5 linux-x86_64"],
126
+ "replace": ["\"unboundReceipt\": \"herdr 0.9.5 linux-x86_64"],
127
127
  "gate": ["bash", "run.sh", "check-herdr-supply"],
128
128
  "timeoutSeconds": 120,
129
129
  "signature": "[QK:HSUP-EXECUTION-RECEIPT-BOUND]",
@@ -400,7 +400,7 @@
400
400
  "subject": "pi/pi-durable/carrier-relocation.mjs",
401
401
  "find": ["return `./${name}`;"],
402
402
  "replace": ["return spec;"],
403
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
403
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
404
404
  "timeoutSeconds": 300,
405
405
  "signature": "[QK:PI-DURABLE-CARRIER-RELOCATION-TWO-RULES]",
406
406
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -412,7 +412,7 @@
412
412
  "subject": "pi/pi-durable/carrier-relocation.mjs",
413
413
  "find": ["if (begun !== statements) {"],
414
414
  "replace": ["if (false) {"],
415
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
415
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
416
416
  "timeoutSeconds": 300,
417
417
  "signature": "[QK:PI-DURABLE-CARRIER-RELOCATION-REFUSES]",
418
418
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -424,7 +424,7 @@
424
424
  "subject": "pi/pi-durable/carrier-relocation.mjs",
425
425
  "find": ["return pathToFileURL(file).href;"],
426
426
  "replace": ["return pathToFileURL(path.join(dist(), \"..\", target)).href;"],
427
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
427
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
428
428
  "timeoutSeconds": 300,
429
429
  "signature": "[QK:PI-DURABLE-CARRIER-RESOLVE-DECLARED]",
430
430
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -436,7 +436,7 @@
436
436
  "subject": "pi/pi-durable/carrier-relocation.mjs",
437
437
  "find": ["if (!files.includes(parent)) {"],
438
438
  "replace": ["if (parent === \"\") {"],
439
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
439
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
440
440
  "timeoutSeconds": 300,
441
441
  "signature": "[QK:PI-DURABLE-CARRIER-RESOLVE-REFUSES]",
442
442
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -448,7 +448,7 @@
448
448
  "subject": "pi/pi-durable/carrier-relocation.mjs",
449
449
  "find": ["if (name !== CODING_AGENT) {"],
450
450
  "replace": ["if (false) {"],
451
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
451
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
452
452
  "timeoutSeconds": 300,
453
453
  "signature": "[QK:PI-DURABLE-CARRIER-HOST-ROOT]",
454
454
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -458,9 +458,9 @@
458
458
  "claim": "PI-DURABLE-CARRIER-PIN-MATCHES",
459
459
  "title": "the pin records a digest the committed carrier file does not carry, so a carrier edited after emission would still be the declared one",
460
460
  "subject": "pi/pi-durable/overlay/upstream-pin.json",
461
- "find": ["\"sha256\": \"60c2965eadbdbbe78fce1b7eeb89d97eb3104a30b7d58ebca87009d2e9118403\""],
461
+ "find": ["\"sha256\": \"725757156580ad2a2d170c790440763371bb8035052a0c6caae6af5159d4718f\""],
462
462
  "replace": ["\"sha256\": \"0000000000000000000000000000000000000000000000000000000000000000\""],
463
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
463
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
464
464
  "timeoutSeconds": 300,
465
465
  "signature": "[QK:PI-DURABLE-CARRIER-PIN-MATCHES]",
466
466
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -472,7 +472,7 @@
472
472
  "subject": "pi/pi-durable/carrier-relocation.mjs",
473
473
  "find": ["if (!names?.every(plain) || names.length === 0"],
474
474
  "replace": ["if (!names || names.length === 0"],
475
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
475
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
476
476
  "timeoutSeconds": 300,
477
477
  "signature": "[QK:PI-DURABLE-CARRIER-PIN-MALFORMED]",
478
478
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -484,7 +484,7 @@
484
484
  "subject": "scripts/emit-pi-durable-carrier.ts",
485
485
  "find": ["return [\"--no-replace-objects\", \"-C\", source, ...args];"],
486
486
  "replace": ["return [\"-C\", source, ...args];"],
487
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
487
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
488
488
  "timeoutSeconds": 300,
489
489
  "signature": "[QK:PI-DURABLE-CARRIER-EMIT-NO-REPLACE]",
490
490
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -701,9 +701,9 @@
701
701
  "claim": "PI-DURABLE-MODULE-ABSENT-UNCHANGED",
702
702
  "title": "the module phase runs without a --native-module, so a launch that names no module still tries to import one",
703
703
  "subject": "pi/pi-durable/bootstrap.mjs",
704
- "find": ["\tconst { nativeModules = [], ...args } = parseArgs(argv);"],
705
- "replace": ["\tconst { nativeModules = [undefined], ...args } = parseArgs(argv);"],
706
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
704
+ "find": ["\tconst { nativeModules = [], resume = false, ...args } = parseArgs(argv);"],
705
+ "replace": ["\tconst { nativeModules = [undefined], resume = false, ...args } = parseArgs(argv);"],
706
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
707
707
  "timeoutSeconds": 300,
708
708
  "signature": "[QK:PI-DURABLE-MODULE-ABSENT-UNCHANGED]",
709
709
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -718,7 +718,7 @@
718
718
  "subject": "pi/pi-durable/bootstrap.mjs",
719
719
  "find": ["\tif (!isAbsolute(value))"],
720
720
  "replace": ["\tif (false)"],
721
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
721
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
722
722
  "timeoutSeconds": 300,
723
723
  "signature": "[QK:PI-DURABLE-MODULE-PATH-REFUSED]",
724
724
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -735,15 +735,15 @@
735
735
  "\tconst extensions = await loadNativeModules(nativeModules);",
736
736
  "\t// Loaded before anything opens, as upstream main.ts imports it statically: a TUI that cannot",
737
737
  "\t// load opens no session, mints no citizen and leaves nothing to clean up.",
738
- "\tconst { runDurableTui } = await loadTui();"
738
+ "\tconst tui = await loadTui();"
739
739
  ],
740
740
  "replace": [
741
741
  "\t// Loaded before anything opens, as upstream main.ts imports it statically: a TUI that cannot",
742
742
  "\t// load opens no session, mints no citizen and leaves nothing to clean up.",
743
- "\tconst { runDurableTui } = await loadTui();",
743
+ "\tconst tui = await loadTui();",
744
744
  "\tconst extensions = await loadNativeModules(nativeModules);"
745
745
  ],
746
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
746
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
747
747
  "timeoutSeconds": 300,
748
748
  "signature": "[QK:PI-DURABLE-MODULE-INIT-BEFORE-RUNTIME]",
749
749
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -763,7 +763,7 @@
763
763
  "\t\tthrow Object.assign(",
764
764
  "\t\t\trefuse(\"native-module-import-failed\","
765
765
  ],
766
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
766
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
767
767
  "timeoutSeconds": 300,
768
768
  "signature": "[QK:PI-DURABLE-MODULE-IMPORT-FAILED]",
769
769
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -778,7 +778,7 @@
778
778
  "subject": "pi/pi-durable/bootstrap.mjs",
779
779
  "find": ["\tconst changed = identityChanges(before, identitySnapshot());"],
780
780
  "replace": ["\tconst changed = identityChanges(identitySnapshot(), identitySnapshot());"],
781
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
781
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
782
782
  "timeoutSeconds": 300,
783
783
  "signature": "[QK:PI-DURABLE-MODULE-IDENTITY-GUARD]",
784
784
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -791,9 +791,9 @@
791
791
  "claim": "PI-DURABLE-MODULE-CWD-PINNED",
792
792
  "title": "the app is opened wherever the process is at open time, not in the caller's directory fixed before the module ran",
793
793
  "subject": "pi/pi-durable/bootstrap.mjs",
794
- "find": ["\tconst citizen = await openDurableCitizen({ ...args, cwd, extensions, bridgeEntry, open, contact });"],
795
- "replace": ["\tconst citizen = await openDurableCitizen({ ...args, extensions, bridgeEntry, open, contact });"],
796
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
794
+ "find": ["\t\t...(session === undefined ? {} : { session }),\n\t\tcwd,\n\t\textensions,\n\t\tbridgeEntry,"],
795
+ "replace": ["\t\t...(session === undefined ? {} : { session }),\n\t\textensions,\n\t\tbridgeEntry,"],
796
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
797
797
  "timeoutSeconds": 300,
798
798
  "signature": "[QK:PI-DURABLE-MODULE-CWD-PINNED]",
799
799
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -808,7 +808,7 @@
808
808
  "subject": "pi/pi-durable/bootstrap.mjs",
809
809
  "find": ["\tif (RESERVED_EXTENSION_NAMES.includes(extension.name)) {"],
810
810
  "replace": ["\tif (false) {"],
811
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
811
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
812
812
  "timeoutSeconds": 300,
813
813
  "signature": "[QK:PI-DURABLE-MODULE-EXPORT-NAME]",
814
814
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -823,7 +823,7 @@
823
823
  "subject": "pi/pi-durable/bootstrap.mjs",
824
824
  "find": ["\t\t\textensions: [contact.extension, ...extensions],"],
825
825
  "replace": ["\t\t\textensions: [...extensions, contact.extension],"],
826
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
826
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
827
827
  "timeoutSeconds": 300,
828
828
  "signature": "[QK:PI-DURABLE-MODULE-EXTENSION-ORDER]",
829
829
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -838,7 +838,7 @@
838
838
  "subject": "pi/pi-durable/src/experimental/durable/tui.ts",
839
839
  "find": ["\t\tconst forms = [...detailed, tasks, `⏳ ${n}`, `⏳${n}`, `*${n}`, \"*+\", \"*\"];"],
840
840
  "replace": ["\t\tconst forms = [...detailed, tasks, `⏳ ${n}`, `⏳${n}`, `*${n}`, \"*\"];"],
841
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
841
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
842
842
  "timeoutSeconds": 300,
843
843
  "signature": "[QK:PI-DURABLE-CARRIER-EMIT-SOURCE-EQUAL]",
844
844
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -850,7 +850,7 @@
850
850
  "subject": "scripts/emit-pi-durable-carrier.ts",
851
851
  "find": ["\tif (pinned !== running) {"],
852
852
  "replace": ["\tif (false) {"],
853
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
853
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
854
854
  "timeoutSeconds": 300,
855
855
  "signature": "[QK:PI-DURABLE-CARRIER-EMIT-NODE-EXACT]",
856
856
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -862,7 +862,7 @@
862
862
  "subject": "pi/pi-durable/tsconfig.json",
863
863
  "find": ["\t\"exclude\": []"],
864
864
  "replace": ["\t\"files\": []"],
865
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
865
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
866
866
  "timeoutSeconds": 300,
867
867
  "signature": "[QK:PI-DURABLE-SOURCE-FENCE-RESOLVES]",
868
868
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -876,7 +876,7 @@
876
876
  "replace": [
877
877
  "\t\t\ttoggleTasks: () => command(async () => update({ tasksPanel: !state.tasksPanel, tasks: state.tasksPanel ? undefined : state.tasks })),"
878
878
  ],
879
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
879
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
880
880
  "timeoutSeconds": 300,
881
881
  "signature": "[QK:PI-DURABLE-FOOTER-GRAPH-LIFETIME]",
882
882
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -891,7 +891,7 @@
891
891
  "subject": "pi/pi-durable/carrier/tui.js",
892
892
  "find": ["\t\tconst nodes = Object.values(graph?.tasks ?? {}).filter((node) => node.background);"],
893
893
  "replace": ["\t\tconst nodes = Object.values(graph?.tasks ?? {});"],
894
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
894
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
895
895
  "timeoutSeconds": 300,
896
896
  "signature": "[QK:PI-DURABLE-FOOTER-BADGE-COUNT]",
897
897
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -906,7 +906,7 @@
906
906
  "subject": "pi/pi-durable/carrier/tui.js",
907
907
  "find": ["\t\tconst forms = [...detailed, tasks, `⏳ ${n}`, `⏳${n}`, `*${n}`, \"*+\", \"*\"];"],
908
908
  "replace": ["\t\tconst forms = [...detailed, tasks, `⏳ ${n}`, `⏳${n}`, \"*\"];"],
909
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
909
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
910
910
  "timeoutSeconds": 300,
911
911
  "signature": "[QK:PI-DURABLE-FOOTER-BADGE-WIDTH]",
912
912
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -921,7 +921,7 @@
921
921
  "subject": "pi/pi-durable/carrier/tui.js",
922
922
  "find": ["\t\t\tcomponent: new VStack([{ component: badge, shrink: 0 }, ...dock]),"],
923
923
  "replace": ["\t\t\tcomponent: new VStack([...dock, { component: badge, shrink: 0 }]),"],
924
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
924
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
925
925
  "timeoutSeconds": 300,
926
926
  "signature": "[QK:PI-DURABLE-FOOTER-BADGE-PROTECTED]",
927
927
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -936,7 +936,7 @@
936
936
  "subject": "pi/pi-durable/carrier/tui.js",
937
937
  "find": ["\t\t\tvisible: (viewport) => badge.count === 0 || viewport.height > 1,"],
938
938
  "replace": ["\t\t\tvisible: (viewport) => viewport.height > 1,"],
939
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
939
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
940
940
  "timeoutSeconds": 300,
941
941
  "signature": "[QK:PI-DURABLE-FOOTER-ZERO-UPSTREAM]",
942
942
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -951,7 +951,7 @@
951
951
  "subject": "pi/pi-durable/bootstrap.mjs",
952
952
  "find": ["const MODULE_ENTRY = /^[^.].*\\.extension\\.mjs$/;"],
953
953
  "replace": ["const MODULE_ENTRY = /\\.extension\\.mjs$/;"],
954
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
954
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
955
955
  "timeoutSeconds": 300,
956
956
  "signature": "[QK:PI-DURABLE-MODULE-DIR-TOPLEVEL-FILTER]",
957
957
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -966,7 +966,7 @@
966
966
  "subject": "pi/pi-durable/bootstrap.mjs",
967
967
  "find": ["\t\t.sort((a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b)));"],
968
968
  "replace": ["\t\t.sort((a, b) => a.localeCompare(b));"],
969
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
969
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
970
970
  "timeoutSeconds": 300,
971
971
  "signature": "[QK:PI-DURABLE-MODULE-DIR-ORDER-BYTEWISE]",
972
972
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -981,7 +981,7 @@
981
981
  "subject": "pi/pi-durable/bootstrap.mjs",
982
982
  "find": ["\tif (names.length === 0) {"],
983
983
  "replace": ["\tif (false) {"],
984
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
984
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
985
985
  "timeoutSeconds": 300,
986
986
  "signature": "[QK:PI-DURABLE-MODULE-DIR-REFUSED]",
987
987
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -996,7 +996,7 @@
996
996
  "subject": "pi/pi-durable/bootstrap.mjs",
997
997
  "find": ["\tif (moduleArg !== undefined && dirArg !== undefined) {"],
998
998
  "replace": ["\tif (false) {"],
999
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
999
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
1000
1000
  "timeoutSeconds": 300,
1001
1001
  "signature": "[QK:PI-DURABLE-MODULE-DIR-EXCLUSIVE]",
1002
1002
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -1011,7 +1011,7 @@
1011
1011
  "subject": "pi/pi-durable/bootstrap.mjs",
1012
1012
  "find": ["\t\t\tif (owners.has(name)) {"],
1013
1013
  "replace": ["\t\t\tif (false) {"],
1014
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
1014
+ "gate": ["bash", "run.sh", "check-pi-durable-native-module"],
1015
1015
  "timeoutSeconds": 300,
1016
1016
  "signature": "[QK:PI-DURABLE-MODULE-DIR-NAME-DUPLICATE]",
1017
1017
  "signatureSource": "pi-extensions/lib/pi-durable-native-module.test.ts",
@@ -1026,7 +1026,7 @@
1026
1026
  "subject": "package.json",
1027
1027
  "find": ["\t\t\"pi/pi-durable/carrier/\",\n"],
1028
1028
  "replace": ["\t\t\"pi/pi-durable/carrier/\",\n\t\t\"pi/pi-durable/src/\",\n"],
1029
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
1029
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1030
1030
  "timeoutSeconds": 300,
1031
1031
  "signature": "[QK:PI-DURABLE-SOURCE-NOT-SHIPPED]",
1032
1032
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -1060,7 +1060,7 @@
1060
1060
  "subject": "pi/pi-durable/carrier/subagent.js",
1061
1061
  "find": ["\t\t\t\t\toutput: [{ type: \"text\", text }],"],
1062
1062
  "replace": ["\t\t\t\t\tcontent: [{ type: \"text\", text }],"],
1063
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
1063
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1064
1064
  "timeoutSeconds": 300,
1065
1065
  "signature": "[QK:PI-DURABLE-SUBAGENT-OUTPUT-MODEL-VISIBLE]",
1066
1066
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -1084,7 +1084,7 @@
1084
1084
  "subject": "pi/pi-durable/carrier/runtime.js",
1085
1085
  "find": ["\t\t\tupdate({ failure: {} });"],
1086
1086
  "replace": ["\t\t\t// the failure is not recorded"],
1087
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
1087
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1088
1088
  "timeoutSeconds": 300,
1089
1089
  "signature": "[QK:PI-DURABLE-FATAL-SESSION-VIEW]",
1090
1090
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -1096,7 +1096,7 @@
1096
1096
  "subject": "pi/pi-durable/carrier/tui.js",
1097
1097
  "find": ["\tif (view.failure !== undefined) {"],
1098
1098
  "replace": ["\tif (view.failure === null) {"],
1099
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
1099
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1100
1100
  "timeoutSeconds": 300,
1101
1101
  "signature": "[QK:PI-DURABLE-FATAL-SESSION-SHOWN]",
1102
1102
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -1108,7 +1108,7 @@
1108
1108
  "subject": "pi/pi-durable/carrier/runtime.js",
1109
1109
  "find": ["\t\t\t\t\tif (state.failure !== undefined) {"],
1110
1110
  "replace": ["\t\t\t\t\tif (state.failure === null) {"],
1111
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
1111
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1112
1112
  "timeoutSeconds": 300,
1113
1113
  "signature": "[QK:PI-DURABLE-FATAL-SUBMIT-REFUSED]",
1114
1114
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -1120,7 +1120,7 @@
1120
1120
  "subject": "pi-extensions/meta-bridge-pi-durable.ts",
1121
1121
  "find": ["const problems = retire(\"session-failed\", \"the durable session failed and closed itself\");"],
1122
1122
  "replace": ["const problems: string[] = [];"],
1123
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
1123
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1124
1124
  "timeoutSeconds": 300,
1125
1125
  "signature": "[QK:PI-DURABLE-RECEIVER-RETIRE-ON-FATAL]",
1126
1126
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -1134,7 +1134,7 @@
1134
1134
  "\t\t\t\t\t// First: the Session runs its close listeners inside its own close call.\n\t\t\t\t\tunsubscribeClose();"
1135
1135
  ],
1136
1136
  "replace": ["\t\t\t\t\t// First: the Session runs its close listeners inside its own close call."],
1137
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
1137
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1138
1138
  "timeoutSeconds": 300,
1139
1139
  "signature": "[QK:PI-DURABLE-SELF-CLOSE-NOT-FAILURE]",
1140
1140
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
@@ -1142,15 +1142,87 @@
1142
1142
  },
1143
1143
  {
1144
1144
  "claim": "PI-DURABLE-COMPACTION-FAILURE-SHOWN",
1145
- "title": "the TUI drops the conversation's retained compaction failure: a failed background compaction vanishes from the screen once its status is removed",
1145
+ "title": "the TUI drops the conversation's retained compaction failure: a failed threshold compaction vanishes from the screen once its status is removed",
1146
1146
  "subject": "pi/pi-durable/carrier/tui.js",
1147
1147
  "find": ["\tif (compaction !== undefined) {\n\t\tlines.push"],
1148
1148
  "replace": ["\tif (compaction === null) {\n\t\tlines.push"],
1149
- "gate": ["bash", "run.sh", "check-pi-durable-beside"],
1149
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1150
1150
  "timeoutSeconds": 300,
1151
1151
  "signature": "[QK:PI-DURABLE-COMPACTION-FAILURE-SHOWN]",
1152
1152
  "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
1153
1153
  "build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
1154
+ },
1155
+ {
1156
+ "claim": "PI-DURABLE-STREAM-TRANSPORT-WIRE",
1157
+ "title": "the Harness settings stop carrying the transport: the provider never continues a response, so every request of a long session resends the whole conversation",
1158
+ "subject": "pi/pi-durable/carrier/harness-setup.js",
1159
+ "find": ["\t\t\t\ttransport: settingsManager.getTransport(),"],
1160
+ "replace": ["\t\t\t\t// transport is not forwarded"],
1161
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1162
+ "timeoutSeconds": 300,
1163
+ "signature": "[QK:PI-DURABLE-STREAM-TRANSPORT-WIRE]",
1164
+ "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
1165
+ "build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
1166
+ },
1167
+ {
1168
+ "claim": "PI-DURABLE-STREAM-TRANSPORT-FORWARDED",
1169
+ "title": "the Harness settings fix the transport instead of reading the operator's: a chosen sse or plain websocket is silently replaced by auto",
1170
+ "subject": "pi/pi-durable/carrier/harness-setup.js",
1171
+ "find": ["\t\t\t\ttransport: settingsManager.getTransport(),"],
1172
+ "replace": ["\t\t\t\ttransport: \"auto\","],
1173
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1174
+ "timeoutSeconds": 300,
1175
+ "signature": "[QK:PI-DURABLE-STREAM-TRANSPORT-FORWARDED]",
1176
+ "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
1177
+ "build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
1178
+ },
1179
+ {
1180
+ "claim": "PI-DURABLE-COMPACTION-WAITS",
1181
+ "title": "the Harness settings hand the SDK pi's compaction settings alone: its default background policy summarizes beside a running turn instead of the turn waiting",
1182
+ "subject": "pi/pi-durable/carrier/harness-setup.js",
1183
+ "find": ["\t\t\treturn { ...settingsManager.getCompactionSettings(), backgroundTokens: 0 };"],
1184
+ "replace": ["\t\t\treturn settingsManager.getCompactionSettings();"],
1185
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1186
+ "timeoutSeconds": 300,
1187
+ "signature": "[QK:PI-DURABLE-COMPACTION-WAITS]",
1188
+ "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
1189
+ "build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
1190
+ },
1191
+ {
1192
+ "claim": "PI-DURABLE-PROMPT-SKILL-SCOPE-BASE",
1193
+ "title": "the prompt hands the skills setting over as written: a relative project entry is read against the conversation's directory and its skills are silently not listed",
1194
+ "subject": "pi/pi-durable/carrier/prompt.js",
1195
+ "find": ["\t\t\t\t\tskillPaths: scopedSkillPaths(settings, agentDir, fallbackCwd),"],
1196
+ "replace": ["\t\t\t\t\tskillPaths: settings.getSkillPaths(),"],
1197
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1198
+ "timeoutSeconds": 300,
1199
+ "signature": "[QK:PI-DURABLE-PROMPT-SKILL-SCOPE-BASE]",
1200
+ "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
1201
+ "build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
1202
+ },
1203
+ {
1204
+ "claim": "PI-DURABLE-RESUME-OPENS-CHOSEN",
1205
+ "title": "the runtime drops the chosen session id: --resume opens a new session instead of the conversation the operator picked",
1206
+ "subject": "pi/pi-durable/carrier/runtime.js",
1207
+ "find": ["\t\toptions.continueSession ?? false,\n\t\toptions.session,\n\t);"],
1208
+ "replace": ["\t\toptions.continueSession ?? false,\n\t);"],
1209
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1210
+ "timeoutSeconds": 300,
1211
+ "signature": "[QK:PI-DURABLE-RESUME-OPENS-CHOSEN]",
1212
+ "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
1213
+ "build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
1214
+ },
1215
+ {
1216
+ "claim": "PI-DURABLE-RESUME-CANCEL-OPENS-NOTHING",
1217
+ "title": "a cancelled --resume falls back to the newest session: the operator said no and a conversation opens anyway",
1218
+ "subject": "pi/pi-durable/bootstrap.mjs",
1219
+ "find": ["\t\t\tprocess.stderr.write(\"[pi-durable] resume-cancelled: nothing was opened\\n\");\n\t\t\treturn;"],
1220
+ "replace": ["\t\t\targs.continueSession = true;"],
1221
+ "gate": ["bash", "run.sh", "check-pi-durable-carrier"],
1222
+ "timeoutSeconds": 300,
1223
+ "signature": "[QK:PI-DURABLE-RESUME-CANCEL-OPENS-NOTHING]",
1224
+ "signatureSource": "pi-extensions/lib/pi-durable-carrier.test.ts",
1225
+ "build": { "argv": ["bash", "scripts/build-bridge.sh"], "output": "mcp/entwurf-bridge/dist" }
1154
1226
  }
1155
1227
  ]
1156
1228
  }