@junghanacs/entwurf 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/AGENTS.md +52 -17
  2. package/BASELINE.md +60 -206
  3. package/CHANGELOG.md +64 -0
  4. package/CONTRIBUTING.md +14 -10
  5. package/DELIVERY.md +118 -261
  6. package/README.md +91 -431
  7. package/VERIFY.md +74 -95
  8. package/demo/README.md +1 -1
  9. package/demo/demo-baseline.sh +1 -3
  10. package/demo/demo.sh +2 -5
  11. package/docs/acp-backend-rail.md +236 -0
  12. package/docs/external-mcp-host.md +131 -0
  13. package/docs/fresh-cut-policy.md +99 -0
  14. package/docs/setup-clean-host.md +124 -328
  15. package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +160 -67
  16. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/acp-client.js +12 -0
  17. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/backend-adapter.js +11 -10
  18. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/config.js +1 -1
  19. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/engraving.js +42 -1
  20. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/models.js +4 -4
  21. package/mcp/entwurf-bridge/dist/pi-extensions/lib/acp/overlay.js +11 -9
  22. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-control-rpc.js +7 -5
  23. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-core.js +13 -14
  24. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-resume-args.js +45 -40
  25. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +117 -95
  26. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-decider.js +23 -57
  27. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-lock.js +16 -7
  28. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-production.js +5 -53
  29. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-release.js +21 -36
  30. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-runner.js +3 -15
  31. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-send-fallback.js +12 -11
  32. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-send.js +2 -7
  33. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +30 -67
  34. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +256 -0
  35. package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +91 -5
  36. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +258 -0
  37. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-launch.js +202 -0
  38. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-placement.js +289 -0
  39. package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +170 -0
  40. package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +136 -0
  41. package/mcp/entwurf-bridge/dist/pi-extensions/lib/session-id.js +8 -5
  42. package/mcp/entwurf-bridge/dist/pi-extensions/lib/socket-discovery.js +3 -3
  43. package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +51 -0
  44. package/mcp/entwurf-bridge/dist/scripts/new-session-id.js +9 -4
  45. package/mcp/entwurf-bridge/src/index.ts +176 -67
  46. package/mcp/entwurf-bridge/start.sh +2 -2
  47. package/mcp/entwurf-bridge/test.sh +23 -9
  48. package/mcp/entwurf-bridge/tsconfig.build.json +11 -2
  49. package/package.json +25 -11
  50. package/pi-extensions/entwurf-control.ts +220 -71
  51. package/pi-extensions/lib/acp/acp-client.ts +22 -0
  52. package/pi-extensions/lib/acp/augment.ts +42 -3
  53. package/pi-extensions/lib/acp/backend-adapter.ts +12 -11
  54. package/pi-extensions/lib/acp/backend.ts +366 -38
  55. package/pi-extensions/lib/acp/config.ts +1 -1
  56. package/pi-extensions/lib/acp/engraving.ts +43 -1
  57. package/pi-extensions/lib/acp/event-mapper.ts +16 -13
  58. package/pi-extensions/lib/acp/models.ts +4 -4
  59. package/pi-extensions/lib/acp/overlay.ts +11 -9
  60. package/pi-extensions/lib/entwurf-control-rpc.ts +7 -5
  61. package/pi-extensions/lib/entwurf-core.ts +15 -15
  62. package/pi-extensions/lib/entwurf-resume-args.ts +41 -52
  63. package/pi-extensions/lib/entwurf-v2-contract-schema.ts +1 -1
  64. package/pi-extensions/lib/entwurf-v2-contract.ts +120 -99
  65. package/pi-extensions/lib/entwurf-v2-decider.ts +30 -91
  66. package/pi-extensions/lib/entwurf-v2-lock.ts +16 -7
  67. package/pi-extensions/lib/entwurf-v2-production.ts +4 -78
  68. package/pi-extensions/lib/entwurf-v2-release.ts +25 -49
  69. package/pi-extensions/lib/entwurf-v2-runner.ts +6 -21
  70. package/pi-extensions/lib/entwurf-v2-send-fallback.ts +12 -11
  71. package/pi-extensions/lib/entwurf-v2-send.ts +2 -7
  72. package/pi-extensions/lib/entwurf-v2-surface.ts +36 -76
  73. package/pi-extensions/lib/entwurf-v2-visible-resume.ts +370 -0
  74. package/pi-extensions/lib/meta-session.ts +93 -5
  75. package/pi-extensions/lib/mux-fresh-call.ts +328 -0
  76. package/pi-extensions/lib/mux-launch.ts +267 -0
  77. package/pi-extensions/lib/mux-placement.ts +387 -0
  78. package/pi-extensions/lib/mux-resume-call.ts +221 -0
  79. package/pi-extensions/lib/resume-launch-identity.ts +162 -0
  80. package/pi-extensions/lib/session-id.js +8 -5
  81. package/pi-extensions/lib/socket-discovery.ts +3 -3
  82. package/prompts/engraving.md +13 -5
  83. package/run.sh +688 -282
  84. package/scripts/agy-bridge-config.py +5 -1
  85. package/scripts/check-acp-backend-preflight.ts +1 -1
  86. package/scripts/check-acp-carrier-augment.ts +246 -10
  87. package/scripts/check-acp-cortex.ts +5 -5
  88. package/scripts/check-acp-overlay.ts +13 -3
  89. package/scripts/check-acp-prompt-lifecycle.ts +565 -0
  90. package/scripts/check-acp-stop-reason.ts +342 -0
  91. package/scripts/check-acp-stream-hooks.ts +504 -0
  92. package/scripts/check-elapsed.sh +25 -0
  93. package/scripts/check-entwurf-bridge-boot.ts +51 -4
  94. package/scripts/check-entwurf-bridge-pi-free.ts +6 -5
  95. package/scripts/check-entwurf-control-rpc.ts +4 -3
  96. package/scripts/check-entwurf-resume-args.ts +72 -70
  97. package/scripts/check-entwurf-session-identity.ts +14 -10
  98. package/scripts/check-entwurf-v2-contract.ts +34 -59
  99. package/scripts/check-entwurf-v2-decider.ts +17 -177
  100. package/scripts/check-entwurf-v2-lock.ts +5 -2
  101. package/scripts/check-entwurf-v2-matrix.ts +3 -53
  102. package/scripts/check-entwurf-v2-production.ts +2 -91
  103. package/scripts/check-entwurf-v2-release.ts +10 -105
  104. package/scripts/check-entwurf-v2-runner.ts +4 -85
  105. package/scripts/check-entwurf-v2-send-fallback.ts +5 -6
  106. package/scripts/check-entwurf-v2-send.ts +0 -28
  107. package/scripts/check-entwurf-v2-surface.ts +198 -128
  108. package/scripts/check-entwurf-v2-visible-resume.ts +445 -0
  109. package/scripts/check-fresh-cut-gate.sh +1 -1
  110. package/scripts/check-gate-qualification.ts +101 -7
  111. package/scripts/check-install-container.sh +10 -2
  112. package/scripts/check-install-surface.ts +1 -1
  113. package/scripts/check-keyset-overlap.py +1 -1
  114. package/scripts/check-meta-facts.ts +249 -0
  115. package/scripts/check-meta-identity-consumers.ts +1 -1
  116. package/scripts/check-meta-session.ts +169 -0
  117. package/scripts/check-mux-launch-tmux.ts +316 -0
  118. package/scripts/check-mux-launch.ts +288 -0
  119. package/scripts/check-mux-launcher-fence.ts +264 -0
  120. package/scripts/check-mux-parent-artifact.ts +195 -0
  121. package/scripts/check-mux-placement-tmux.ts +322 -0
  122. package/scripts/check-mux-placement.ts +323 -0
  123. package/scripts/check-mux-resume-call.ts +282 -0
  124. package/scripts/check-probe-cli-shim.ts +25 -22
  125. package/scripts/check-probe-ordering.ts +121 -81
  126. package/scripts/check-release-gate-outcomes.ts +452 -0
  127. package/scripts/check-resume-launch-identity.ts +244 -0
  128. package/scripts/check-socket-discovery.ts +1 -1
  129. package/scripts/fixtures/mux-parent-transcript.scrubbed.jsonl +3 -0
  130. package/scripts/inventory-verification-surface.ts +349 -0
  131. package/scripts/lib/claude-launcher-fence.ts +322 -0
  132. package/scripts/lib/live-skip.ts +33 -0
  133. package/scripts/lib/mutation-qualify.ts +109 -3
  134. package/scripts/lib/probe-acp-turn.ts +33 -12
  135. package/scripts/lib/step-outcome.sh +88 -0
  136. package/scripts/meta-bridge-doctor.sh +6 -8
  137. package/scripts/meta-facts.ts +60 -0
  138. package/scripts/mutants/acp-augment.json +106 -0
  139. package/scripts/mutants/acp-cortex.json +2 -2
  140. package/scripts/mutants/acp-overlay.json +17 -0
  141. package/scripts/mutants/acp-prompt-lifecycle.json +100 -0
  142. package/scripts/mutants/acp-stop-reason.json +80 -0
  143. package/scripts/mutants/acp-stream-hooks.json +158 -0
  144. package/scripts/mutants/bridge-boot-resume.json +45 -0
  145. package/scripts/mutants/meta-facts.json +50 -0
  146. package/scripts/mutants/meta-identity.json +36 -0
  147. package/scripts/mutants/mux-boundary.json +196 -0
  148. package/scripts/mutants/mux-fresh-call.json +185 -0
  149. package/scripts/mutants/mux-launcher-fence.json +123 -0
  150. package/scripts/mutants/mux-parent-artifact.json +39 -0
  151. package/scripts/mutants/mux-resume-call.json +148 -0
  152. package/scripts/mutants/probe-ordering.json +6 -1021
  153. package/scripts/mutants/release-gate.json +140 -0
  154. package/scripts/mutants/resume-args.json +76 -0
  155. package/scripts/mutants/resume-launch-identity.json +96 -0
  156. package/scripts/mutants/v2-surface.json +74 -23
  157. package/scripts/mutants/v2-visible-resume.json +215 -0
  158. package/scripts/new-session-id.ts +9 -4
  159. package/scripts/smoke-acp-bundled-mcp-live.ts +4 -3
  160. package/scripts/smoke-acp-carrier-augment-live.ts +2 -2
  161. package/scripts/smoke-acp-cortex-live.ts +8 -14
  162. package/scripts/smoke-acp-long-turn-live.ts +185 -0
  163. package/scripts/smoke-acp-mcp-live.ts +2 -2
  164. package/scripts/smoke-acp-memory-containment-live.ts +2 -2
  165. package/scripts/smoke-acp-ordering-probe-live.ts +2 -2
  166. package/scripts/smoke-acp-overlay-live.ts +2 -2
  167. package/scripts/smoke-acp-provider-live.ts +2 -2
  168. package/scripts/smoke-acp-raw-turn-live.ts +3 -3
  169. package/scripts/smoke-acp-session-reuse-live.ts +2 -2
  170. package/scripts/smoke-acp-skill-live.ts +2 -2
  171. package/scripts/smoke-acp-socket-citizen-live.ts +4 -3
  172. package/scripts/smoke-acp-v2-send-live.ts +4 -3
  173. package/scripts/smoke-agy-native-push-live.ts +10 -20
  174. package/scripts/smoke-claude-native-resume-live.sh +13 -3
  175. package/scripts/smoke-entwurf-chain-live.ts +352 -0
  176. package/scripts/smoke-entwurf-v2-matrix-live.ts +3 -3
  177. package/scripts/smoke-meta-honesty.sh +1 -1
  178. package/scripts/smoke-meta-install-state.sh +4 -0
  179. package/scripts/smoke-mux-fresh-call-live.ts +365 -0
  180. package/scripts/smoke-mux-lifecycle-live.ts +1136 -0
  181. package/scripts/smoke-pi-attach.ts +1 -1
  182. package/scripts/smoke-user-scope-citizen.sh +1 -1
  183. package/scripts/tsconfig.json +1 -0
  184. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-preflight.js +0 -160
  185. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-spawn-production.js +0 -273
  186. package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-spawn.js +0 -216
  187. package/pi-extensions/lib/entwurf-v2-spawn-production.ts +0 -373
  188. package/pi-extensions/lib/entwurf-v2-spawn.ts +0 -323
  189. package/scripts/check-acp-sdk-surface.ts +0 -236
  190. package/scripts/check-entwurf-v2-spawn-production.ts +0 -551
  191. package/scripts/check-entwurf-v2-spawn.ts +0 -399
  192. package/scripts/smoke-entwurf-v2-spawn-live.ts +0 -188
  193. package/scripts/smoke-entwurf-v2-spawn-resume-live.ts +0 -469
@@ -0,0 +1,140 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "lane": "release-gate",
4
+ "mutants": [
5
+ {
6
+ "claim": "SKIP-EXIT-ONE-PROTOCOL",
7
+ "title": "the shell and TS halves name different skip codes — every honest skip silently reclassifies, and the summary says nothing",
8
+ "subject": "scripts/lib/step-outcome.sh",
9
+ "find": ["ENTWURF_STEP_SKIP_EXIT=97"],
10
+ "replace": ["ENTWURF_STEP_SKIP_EXIT=96"],
11
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
12
+ "timeoutSeconds": 180,
13
+ "signature": "[QK:SKIP-EXIT-ONE-PROTOCOL]",
14
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
15
+ },
16
+ {
17
+ "claim": "STEP-OUTCOME-SKIP-NOT-PASS",
18
+ "title": "the classifier rounds a skip up to PASS — the pre-P1 defect restored at its source: a step that declined is reported as acceptance",
19
+ "subject": "scripts/lib/step-outcome.sh",
20
+ "find": ["\t\t\"$ENTWURF_STEP_SKIP_EXIT\") printf 'SKIP\\n' ;;"],
21
+ "replace": ["\t\t\"$ENTWURF_STEP_SKIP_EXIT\") printf 'PASS\\n' ;;"],
22
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
23
+ "timeoutSeconds": 180,
24
+ "signature": "[QK:STEP-OUTCOME-SKIP-NOT-PASS]",
25
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
26
+ },
27
+ {
28
+ "claim": "CUT-REFUSES-SKIP",
29
+ "title": "--cut stops refusing a MUST SKIP — the release procedure goes back to prose and a 14-SKIP run can be quoted as acceptance",
30
+ "subject": "scripts/lib/step-outcome.sh",
31
+ "find": ["\tif [ \"$cut\" = \"1\" ] && [ \"$skipc\" -gt 0 ]; then"],
32
+ "replace": ["\tif [ \"$cut\" = \"1\" ] && [ \"$skipc\" -lt 0 ]; then"],
33
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
34
+ "timeoutSeconds": 180,
35
+ "signature": "[QK:CUT-REFUSES-SKIP]",
36
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
37
+ },
38
+ {
39
+ "claim": "NO-SMOKE-SKIPS-WITH-ZERO",
40
+ "title": "one LIVE smoke goes back to exiting 0 on its skip — the hole re-opens for that lane alone, which is how it survived unnoticed",
41
+ "subject": "scripts/smoke-acp-mcp-live.ts",
42
+ "find": ["\tskipLive(\"smoke-acp-mcp-live\", \"set LIVE=1 to run the real pi provider turn.\");"],
43
+ "replace": [
44
+ "\tconsole.error(\"[smoke-acp-mcp-live] skipped — set LIVE=1 to run the real pi provider turn.\");",
45
+ "\tprocess.exit(0);"
46
+ ],
47
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
48
+ "timeoutSeconds": 180,
49
+ "signature": "[QK:NO-SMOKE-SKIPS-WITH-ZERO]",
50
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
51
+ },
52
+ {
53
+ "claim": "LIVE-SKIP-IS-PROTOCOL-EXIT",
54
+ "title": "skipLive exits 0 — every smoke still LOOKS converted (imports, no old shape) while the aggregate reads all of them as PASS",
55
+ "subject": "scripts/lib/live-skip.ts",
56
+ "find": ["\tprocess.exit(LIVE_SKIP_EXIT);"],
57
+ "replace": ["\tprocess.exit(0);"],
58
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
59
+ "timeoutSeconds": 180,
60
+ "signature": "[QK:LIVE-SKIP-IS-PROTOCOL-EXIT]",
61
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
62
+ },
63
+ {
64
+ "claim": "WRAPPER-SKIP-IS-PROTOCOL-EXIT",
65
+ "title": "a run.sh smoke wrapper returns 0 on a missing prerequisite — the second skip surface, where cortex/matrix/spawn decline before their .ts is ever reached",
66
+ "subject": "run.sh",
67
+ "find": [
68
+ " echo \"[entwurf:skip] smoke-acp-cortex-live — set LIVE=1 (+ ENTWURF_ACP_CORTEX_CONNECTION) to run.\"",
69
+ " return \"$ENTWURF_STEP_SKIP_EXIT\""
70
+ ],
71
+ "replace": [
72
+ " echo \"[entwurf:skip] smoke-acp-cortex-live — set LIVE=1 (+ ENTWURF_ACP_CORTEX_CONNECTION) to run.\"",
73
+ " return 0"
74
+ ],
75
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
76
+ "timeoutSeconds": 180,
77
+ "signature": "[QK:WRAPPER-SKIP-IS-PROTOCOL-EXIT]",
78
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
79
+ },
80
+ {
81
+ "claim": "CUT-VERDICT-NAMES-CAUSE",
82
+ "title": "a cut blocked only by SKIP reports itself as a FAIL block — the record can no longer tell a broken call from an absent prerequisite",
83
+ "subject": "scripts/lib/step-outcome.sh",
84
+ "find": ["\t\tprintf 'cut: BLOCKED (MUST SKIP)\\n'"],
85
+ "replace": ["\t\tprintf 'cut: BLOCKED (MUST FAIL)\\n'"],
86
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
87
+ "timeoutSeconds": 180,
88
+ "signature": "[QK:CUT-VERDICT-NAMES-CAUSE]",
89
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
90
+ },
91
+ {
92
+ "claim": "NO-SILENT-AGGREGATE-OMISSION",
93
+ "title": "the cross-harness delivery chain drops out of the aggregate — a green cut goes back to saying nothing about multi-harness delivery, with no doc stating the exclusion",
94
+ "subject": "run.sh",
95
+ "find": [
96
+ " run_live_step \"smoke-entwurf-chain-live (P3: Claude Code -> pi GPT -> pi ACP Sonnet -> mailbox, identity + receipt)\" gate bash \"$self\" smoke-entwurf-chain-live"
97
+ ],
98
+ "replace": [" : # the chain quietly dropped from the aggregate"],
99
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
100
+ "timeoutSeconds": 180,
101
+ "signature": "[QK:NO-SILENT-AGGREGATE-OMISSION]",
102
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
103
+ },
104
+ {
105
+ "claim": "QUALIFICATION-SCHEDULING-REACHABLE",
106
+ "title": "release_gate stops invoking check-gate-qualification — the discriminating-power step moved out of the default chain silently vanishes from the cut while VERIFY still promises it",
107
+ "subject": "run.sh",
108
+ "find": [" if (cd \"$REPO_DIR\" && bash \"$self\" check-gate-qualification); then"],
109
+ "replace": [" if (cd \"$REPO_DIR\" && true); then"],
110
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
111
+ "timeoutSeconds": 180,
112
+ "signature": "[QK:QUALIFICATION-SCHEDULING-REACHABLE]",
113
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
114
+ },
115
+ {
116
+ "claim": "CI-FULL-FLOOR-QUALIFIED",
117
+ "title": "the CI check job is downgraded from the full deterministic floor back to the ≤60s everyday core — the #70 tier rename regression, where qualification still runs once on every push but now certifies kill-power over a floor no candidate ships on, and the hermetic/package tiers reach machine time nowhere",
118
+ "subject": ".github/workflows/ci.yml",
119
+ "find": [" - run: pnpm run check:full"],
120
+ "replace": [" - run: pnpm check"],
121
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
122
+ "timeoutSeconds": 180,
123
+ "signature": "[QK:CI-FULL-FLOOR-QUALIFIED]",
124
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
125
+ },
126
+ {
127
+ "claim": "MUX-LIFECYCLE-IS-RELEASE-MUST",
128
+ "title": "the integrated mux lifecycle stays listed but bypasses run_live_step, so a missing prerequisite returns SKIP into a branch that never classifies it and the cut reads green",
129
+ "subject": "run.sh",
130
+ "find": [
131
+ " run_live_step \"smoke-mux-lifecycle-live (mux public-harness lifecycle: fresh -> send -> dormant -> same-id visible resume -> recall)\" gate bash \"$self\" smoke-mux-lifecycle-live"
132
+ ],
133
+ "replace": [" bash \"$self\" smoke-mux-lifecycle-live"],
134
+ "gate": ["bash", "run.sh", "check-release-gate-outcomes"],
135
+ "timeoutSeconds": 180,
136
+ "signature": "[QK:MUX-LIFECYCLE-IS-RELEASE-MUST]",
137
+ "signatureSource": "scripts/check-release-gate-outcomes.ts"
138
+ }
139
+ ]
140
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "lane": "resume-args",
4
+ "mutants": [
5
+ {
6
+ "claim": "RESUMEARGS-NO-HEADLESS",
7
+ "title": "the headless prefix comes back — the shape that puts a JSON stream in the operator's window instead of a session",
8
+ "subject": "pi-extensions/lib/entwurf-resume-args.ts",
9
+ "find": ["\tconst args: string[] = [\"--entwurf-control\"];"],
10
+ "replace": ["\tconst args: string[] = [\"--mode\", \"json\", \"-p\", \"--entwurf-control\"];"],
11
+ "gate": ["bash", "run.sh", "check-entwurf-resume-args"],
12
+ "timeoutSeconds": 60,
13
+ "signature": "[QK:RESUMEARGS-NO-HEADLESS]",
14
+ "signatureSource": "scripts/check-entwurf-resume-args.ts"
15
+ },
16
+ {
17
+ "claim": "RESUMEARGS-CONTROL-FIRST",
18
+ "title": "the control flag stops leading the argv, so the resumed session's socket posture depends on argv order",
19
+ "subject": "pi-extensions/lib/entwurf-resume-args.ts",
20
+ "find": ["\tconst args: string[] = [\"--entwurf-control\"];\n\targs.push(...input.explicitExtensionArgs);"],
21
+ "replace": [
22
+ "\tconst args: string[] = [];\n\targs.push(...input.explicitExtensionArgs);\n\targs.push(\"--entwurf-control\");"
23
+ ],
24
+ "gate": ["bash", "run.sh", "check-entwurf-resume-args"],
25
+ "timeoutSeconds": 60,
26
+ "signature": "[QK:RESUMEARGS-CONTROL-FIRST]",
27
+ "signatureSource": "scripts/check-entwurf-resume-args.ts"
28
+ },
29
+ {
30
+ "claim": "RESUMEARGS-EXT-ONCE-BEFORE-SESSION",
31
+ "title": "the bridge args are emitted twice — a different broken argv than dropping them, and just as invisible",
32
+ "subject": "pi-extensions/lib/entwurf-resume-args.ts",
33
+ "find": ["\targs.push(...input.explicitExtensionArgs);\n\targs.push(\"--session\", input.sessionFile);"],
34
+ "replace": [
35
+ "\targs.push(...input.explicitExtensionArgs);\n\targs.push(...input.explicitExtensionArgs);\n\targs.push(\"--session\", input.sessionFile);"
36
+ ],
37
+ "gate": ["bash", "run.sh", "check-entwurf-resume-args"],
38
+ "timeoutSeconds": 60,
39
+ "signature": "[QK:RESUMEARGS-EXT-ONCE-BEFORE-SESSION]",
40
+ "signatureSource": "scripts/check-entwurf-resume-args.ts"
41
+ },
42
+ {
43
+ "claim": "RESUMEARGS-SESSION-IS-FILE",
44
+ "title": "--session-id returns, which CREATES the id when missing and mints an empty session instead of resuming one",
45
+ "subject": "pi-extensions/lib/entwurf-resume-args.ts",
46
+ "find": ["\targs.push(\"--session\", input.sessionFile);"],
47
+ "replace": ["\targs.push(\"--session-id\", input.sessionFile);"],
48
+ "gate": ["bash", "run.sh", "check-entwurf-resume-args"],
49
+ "timeoutSeconds": 60,
50
+ "signature": "[QK:RESUMEARGS-SESSION-IS-FILE]",
51
+ "signatureSource": "scripts/check-entwurf-resume-args.ts"
52
+ },
53
+ {
54
+ "claim": "RESUMEARGS-PROVIDER-OPTIONAL",
55
+ "title": "an absent provider is emitted as an empty flag value instead of no flag",
56
+ "subject": "pi-extensions/lib/entwurf-resume-args.ts",
57
+ "find": ["\tif (input.provider) args.push(\"--provider\", input.provider);"],
58
+ "replace": ["\targs.push(\"--provider\", input.provider ?? \"\");"],
59
+ "gate": ["bash", "run.sh", "check-entwurf-resume-args"],
60
+ "timeoutSeconds": 60,
61
+ "signature": "[QK:RESUMEARGS-PROVIDER-OPTIONAL]",
62
+ "signatureSource": "scripts/check-entwurf-resume-args.ts"
63
+ },
64
+ {
65
+ "claim": "RESUMEARGS-NO-PROMPT-TAIL",
66
+ "title": "a positional rides after the model again — a resume that runs a turn instead of just reopening the window",
67
+ "subject": "pi-extensions/lib/entwurf-resume-args.ts",
68
+ "find": ["\targs.push(\"--model\", input.model);"],
69
+ "replace": ["\targs.push(\"--model\", input.model, \"continue\");"],
70
+ "gate": ["bash", "run.sh", "check-entwurf-resume-args"],
71
+ "timeoutSeconds": 60,
72
+ "signature": "[QK:RESUMEARGS-NO-PROMPT-TAIL]",
73
+ "signatureSource": "scripts/check-entwurf-resume-args.ts"
74
+ }
75
+ ]
76
+ }
@@ -0,0 +1,96 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "lane": "resume-launch-identity",
4
+ "mutants": [
5
+ {
6
+ "claim": "RESUME-ID-HEADER-INTEGRITY",
7
+ "title": "the C3 integrity check is dropped, so a stale or foreign transcriptPath resumes another being's session",
8
+ "subject": "pi-extensions/lib/resume-launch-identity.ts",
9
+ "find": [
10
+ "\tif (identity.sessionId !== record.nativeSessionId) {",
11
+ "\t\tthrow new Error(",
12
+ "\t\t\t`resume-launch-identity: ${gardenId} transcript header id \"${identity.sessionId ?? \"(none)\"}\" ` +",
13
+ "\t\t\t\t`does not match the record's nativeSessionId \"${record.nativeSessionId}\" — the recorded transcriptPath ` +",
14
+ "\t\t\t\t`is stale or points at a foreign session file; refusing to resume another being's transcript.`,",
15
+ "\t\t);",
16
+ "\t}"
17
+ ],
18
+ "replace": ["\t// integrity check removed"],
19
+ "gate": ["bash", "run.sh", "check-resume-launch-identity"],
20
+ "timeoutSeconds": 60,
21
+ "signature": "[QK:RESUME-ID-HEADER-INTEGRITY]",
22
+ "signatureSource": "scripts/check-resume-launch-identity.ts"
23
+ },
24
+ {
25
+ "claim": "RESUME-ID-ADDRESSABLE-READ",
26
+ "title": "the leaf is \"simplified\" back to the plain targeted read, so two records sharing one native session both resolve and resume one transcript under two locks (#52)",
27
+ "subject": "pi-extensions/lib/resume-launch-identity.ts",
28
+ "find": ["import { readAddressableMetaIdentity } from \"./meta-session.ts\";"],
29
+ "replace": ["import { readMetaIdentityByGardenId as readAddressableMetaIdentity } from \"./meta-session.ts\";"],
30
+ "gate": ["bash", "run.sh", "check-resume-launch-identity"],
31
+ "timeoutSeconds": 60,
32
+ "signature": "[QK:RESUME-ID-ADDRESSABLE-READ]",
33
+ "signatureSource": "scripts/check-resume-launch-identity.ts"
34
+ },
35
+ {
36
+ "claim": "RESUME-ID-MISSING-TRANSCRIPT-CAUSE",
37
+ "title": "the transcript existence guard is removed, so a deleted transcript falls through readSessionIdentity's ENOENT swallow and is reported as \"no recorded model\" (F7)",
38
+ "subject": "pi-extensions/lib/resume-launch-identity.ts",
39
+ "find": [
40
+ "\tif (!existsSync(sessionFile)) {",
41
+ "\t\tthrow new Error(",
42
+ "\t\t\t`resume-launch-identity: ${gardenId} recorded transcriptPath \"${sessionFile}\" ` +",
43
+ "\t\t\t\t`does not exist on disk — the transcript was deleted, or the record carries a phantom ` +",
44
+ "\t\t\t\t`path from a pre-guard birth; nothing to resume.`,",
45
+ "\t\t);",
46
+ "\t}"
47
+ ],
48
+ "replace": ["\t// existence guard removed"],
49
+ "gate": ["bash", "run.sh", "check-resume-launch-identity"],
50
+ "timeoutSeconds": 60,
51
+ "signature": "[QK:RESUME-ID-MISSING-TRANSCRIPT-CAUSE]",
52
+ "signatureSource": "scripts/check-resume-launch-identity.ts"
53
+ },
54
+ {
55
+ "claim": "RESUME-ID-GATE-SSOT",
56
+ "title": "the preserved leaf's header stops naming the gate that certifies it, so a consumer-zero identity module ships on prose again",
57
+ "subject": "pi-extensions/lib/resume-launch-identity.ts",
58
+ "find": [
59
+ " * So this leaf is preserved deliberately, with no consumer in the shipped tree today.",
60
+ " * `check-resume-launch-identity` holds its contract so the record-integrity rules below —"
61
+ ],
62
+ "replace": [
63
+ " * So this leaf is preserved deliberately for the later visible lane.",
64
+ " * The record-integrity rules below —"
65
+ ],
66
+ "gate": ["bash", "run.sh", "check-resume-launch-identity"],
67
+ "timeoutSeconds": 60,
68
+ "signature": "[QK:RESUME-ID-GATE-SSOT]",
69
+ "signatureSource": "scripts/check-resume-launch-identity.ts"
70
+ },
71
+ {
72
+ "claim": "RESUME-ID-BACKEND-TYPED-REFUSAL",
73
+ "title": "the backend miss degrades to a bare Error, so callers must parse a sentence or read the record twice to learn it was a capability boundary",
74
+ "subject": "pi-extensions/lib/resume-launch-identity.ts",
75
+ "find": ["\t\tthrow new ResumeBackendUnsupportedError(gardenId, record.backend);"],
76
+ "replace": [
77
+ "\t\tthrow new Error(`resume-launch-identity: ${gardenId} is a ${record.backend} citizen — resume is pi-only.`);"
78
+ ],
79
+ "gate": ["bash", "run.sh", "check-resume-launch-identity"],
80
+ "timeoutSeconds": 60,
81
+ "signature": "[QK:RESUME-ID-BACKEND-TYPED-REFUSAL]",
82
+ "signatureSource": "scripts/check-resume-launch-identity.ts"
83
+ },
84
+ {
85
+ "claim": "RESUME-ID-SESSION-ABSOLUTE",
86
+ "title": "a relative recorded transcriptPath is accepted, so --session resolves inside the window's own cwd and a different transcript is reopened under a correct-looking receipt",
87
+ "subject": "pi-extensions/lib/resume-launch-identity.ts",
88
+ "find": ["\tif (!path.isAbsolute(sessionFile)) {"],
89
+ "replace": ["\tif (path.isAbsolute(sessionFile) && false) {"],
90
+ "gate": ["bash", "run.sh", "check-resume-launch-identity"],
91
+ "timeoutSeconds": 60,
92
+ "signature": "[QK:RESUME-ID-SESSION-ABSOLUTE]",
93
+ "signatureSource": "scripts/check-resume-launch-identity.ts"
94
+ }
95
+ ]
96
+ }
@@ -7,17 +7,10 @@
7
7
  "title": "MCP long description reverts to the false \"socket paths take a per-target lock\" claim",
8
8
  "subject": "mcp/entwurf-bridge/src/index.ts",
9
9
  "find": [
10
- "\t\t\"(delivered / rejected / lock-retained / delivered-but-lock-dirty). LOCK POLICY (do not \" +",
11
- "\t\t\"over-generalize it): the per-target lock is taken for a control-socket-DOMAIN dispatch, which is \" +",
12
- "\t\t\"both the live send AND the dormant cell's spawn-bg resume — spawn-bg is a separate relaunch \" +",
13
- "\t\t\"transport yet it still runs under that domain's lock. The mailbox and native-push rails are \" +",
14
- "\t\t\"lock-free: the mailbox is guarded instead by active-receiver deliverability, and native-push by \" +",
15
- "\t\t\"its adapter probe. The decider — not the \" +"
16
- ],
17
- "replace": [
18
- "\t\t\"(delivered / rejected / lock-retained / delivered-but-lock-dirty). LOCK POLICY: socket paths \" +",
19
- "\t\t\"take a per-target lock; the mailbox path does not. The decider — not the \" +"
10
+ "\t\t\"LOCK: taken for a control-socket-DOMAIN dispatch. The \" +",
11
+ "\t\t\"mailbox and native-push rails are lock-free deliverability and the adapter probe guard them. mode \" +"
20
12
  ],
13
+ "replace": ["\t\t\"LOCK POLICY: socket paths take a per-target lock; the mailbox path does not. mode \" +"],
21
14
  "gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
22
15
  "timeoutSeconds": 60,
23
16
  "signature": "[QK:V2SURF-MCP-LOCK-DOMAIN]",
@@ -28,12 +21,10 @@
28
21
  "title": "pi-native mode param reverts to \"Delivery mode for a live send\" (false for native-push)",
29
22
  "subject": "pi-extensions/entwurf-control.ts",
30
23
  "find": [
31
- "\t\t\t\tdescription:",
32
24
  "\t\t\t\t\t\"Injection style for a CONTROL-SOCKET send only: steer (immediate) or follow_up (after task). \" +",
33
- "\t\t\t\t\t\"The mailbox, native-push, and spawn-bg plans carry no mode, so it has no effect on those rails.\","
25
+ "\t\t\t\t\t\"The mailbox and native-push plans carry no mode, so it has no effect on those rails.\","
34
26
  ],
35
27
  "replace": [
36
- "\t\t\t\tdescription:",
37
28
  "\t\t\t\t\t\"Delivery mode for a live send: steer (immediate, interrupt the current turn) or follow_up \" +",
38
29
  "\t\t\t\t\t\"(queued after the current task finishes running to completion).\","
39
30
  ],
@@ -64,23 +55,83 @@
64
55
  "signatureSource": "scripts/check-entwurf-v2-surface.ts"
65
56
  },
66
57
  {
67
- "claim": "V2SURF-MERGED-REJECT",
68
- "title": "MCP long description merges the two owned rejects back under backend-liveness-unsupported",
58
+ "claim": "V2SURF-DORMANT-HONESTY",
59
+ "title": "MCP long description advertises owned-outcome as a selectable dormant verb again and drops the reason a dormant target actually returns",
60
+ "subject": "mcp/entwurf-bridge/src/index.ts",
61
+ "find": [
62
+ "\t\t\"DORMANT IS UNREACHABLE: a socket-domain citizen that is not running gets dormant-fire-forget-unsupported \" +",
63
+ "\t\t\"— same receiver rule as the mailbox, no active drainer means no delivery. \" +",
64
+ "\t\t\"The intent that used to answer there, owned-outcome, resumed it by launching a hidden background child \" +",
65
+ "\t\t\"and was withdrawn under the visible-first rule — re-open the session yourself, then dispatch again. \" +"
66
+ ],
67
+ "replace": [
68
+ "\t\t\"owned-outcome wakes a DORMANT socket-domain citizen by spawn-bg resume ONLY and is never auto-converted. \" +"
69
+ ],
70
+ "gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
71
+ "timeoutSeconds": 60,
72
+ "signature": "[QK:V2SURF-DORMANT-HONESTY]",
73
+ "signatureSource": "scripts/check-entwurf-v2-surface.ts"
74
+ },
75
+ {
76
+ "claim": "V2SURF-INDETERMINATE-NO-START",
77
+ "title": "the indeterminate hint reverts to a socket that \"answered\" and drops the no-start facts — overclaiming a reply that a permission-refused or timed-out probe never got",
78
+ "subject": "pi-extensions/lib/entwurf-v2-surface.ts",
79
+ "find": [
80
+ "\t\tcase \"indeterminate-no-spawn\":",
81
+ "\t\t\t// The socket probe did not settle, so liveness is UNKNOWN — an unestablished probe",
82
+ "\t\t\t// is not a measured death, and dispatching into it could double-deliver. Say",
83
+ "\t\t\t// \"the PROBE was inconclusive\", never \"the socket answered inconclusively\":",
84
+ "\t\t\t// `indeterminate` also covers a probe that got no answer at all, was refused by",
85
+ "\t\t\t// permissions, or timed out, and \"answered\" claims a reply that may never have",
86
+ "\t\t\t// existed. The wire id is FROZEN and still spells \"-no-spawn\"; it names the rule",
87
+ "\t\t\t// (never dispatch into an indeterminate target), not a capability that still",
88
+ "\t\t\t// exists. So the hint's job is to say plainly what did NOT happen: nothing",
89
+ "\t\t\t// delivered, nothing started.",
90
+ "\t\t\treturn (",
91
+ "\t\t\t\t\"the control-socket probe was inconclusive, so the target's liveness is UNKNOWN — this is not a \" +",
92
+ "\t\t\t\t\"measured death. NOTHING was delivered and NO process was started (the reason id keeps its frozen \" +",
93
+ "\t\t\t\t\"'-no-spawn' wire spelling from an era when one could be; entwurf_v2 starts nothing on any rail). \" +",
94
+ "\t\t\t\t\"Re-run entwurf_peers to re-probe; if it stays indeterminate, check for a stale socket file left at \" +",
95
+ "\t\t\t\t\"that garden id by a session that died without cleaning up.\"",
96
+ "\t\t\t);"
97
+ ],
98
+ "replace": [
99
+ "\t\tcase \"indeterminate-no-spawn\":",
100
+ "\t\t\treturn \"the target's control socket answered inconclusively; retry.\";"
101
+ ],
102
+ "gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
103
+ "timeoutSeconds": 60,
104
+ "signature": "[QK:V2SURF-INDETERMINATE-NO-START]",
105
+ "signatureSource": "scripts/check-entwurf-v2-surface.ts"
106
+ },
107
+ {
108
+ "claim": "V2SURF-PEERS-DEAD-ROW",
109
+ "title": "entwurf_peers drops the dead-row sentence, so a dormant citizen is listed with nothing saying it is unreachable",
110
+ "subject": "mcp/entwurf-bridge/src/index.ts",
111
+ "find": [
112
+ "\t\t\"row. A `dead` row is a REPORTED FACT and nothing more: that citizen is dormant and is \" +",
113
+ "\t\t\"currently unreachable by any verb, so listing it grants no action — appearing here is not \" +",
114
+ "\t\t\"an invitation to dispatch. In particular `unsupported` does NOT mean mailbox: it means this backend has no \" +"
115
+ ],
116
+ "replace": ["\t\t\"row. In particular `unsupported` does NOT mean mailbox: it means this backend has no \" +"],
117
+ "gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
118
+ "timeoutSeconds": 60,
119
+ "signature": "[QK:V2SURF-PEERS-DEAD-ROW]",
120
+ "signatureSource": "scripts/check-entwurf-v2-surface.ts"
121
+ },
122
+ {
123
+ "claim": "V2SURF-DESC-FITS-HOST-CAP",
124
+ "title": "the v2 tool description grows back past the host's 2048-char cap — the INTENT contract is silently cut off before the model that must choose an intent ever reads it",
69
125
  "subject": "mcp/entwurf-bridge/src/index.ts",
70
126
  "find": [
71
- "\t\t\"owned-outcome is ONLY for waking a DORMANT socket-domain citizen (spawn-bg resume, currently \" +",
72
- "\t\t\"backend pi); on a live target it is rejected as owned-live-no-autosend. Neither self-fetch nor \" +",
73
- "\t\t\"native-push has resume authority, but they reject under DIFFERENT reasons — self-fetch as \" +",
74
- "\t\t\"backend-liveness-unsupported, native-push as native-push-no-resume-authority. \" +"
127
+ "\t\"CANONICAL DELIVERY SURFACE for garden ids: message, reply, or hand off to whoever an id names. The id \" +"
75
128
  ],
76
129
  "replace": [
77
- "\t\t\"owned-outcome is ONLY for waking a DORMANT socket-domain citizen (spawn-bg resume, currently \" +",
78
- "\t\t\"backend pi); on a live target it is rejected as owned-live-no-autosend, and on self-fetch and \" +",
79
- "\t\t\"native-push alike it is rejected as backend-liveness-unsupported. \" +"
130
+ "\t\"CANONICAL DELIVERY SURFACE for garden ids: message, reply, or hand off to whoever an id names. The id \" +\n\t\t\"PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING \" +\n\t\t\"PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING \" +"
80
131
  ],
81
132
  "gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
82
133
  "timeoutSeconds": 60,
83
- "signature": "[QK:V2SURF-MERGED-REJECT]",
134
+ "signature": "[QK:V2SURF-DESC-FITS-HOST-CAP]",
84
135
  "signatureSource": "scripts/check-entwurf-v2-surface.ts"
85
136
  }
86
137
  ]