@junghanacs/entwurf 0.40.0 → 0.41.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.
- package/AGENTS.md +4 -2
- package/BASELINE.md +55 -2
- package/CHANGELOG.md +562 -0
- package/CONTRIBUTING.md +1 -1
- package/DELIVERY.md +18 -2
- package/FAQ.md +8 -4
- package/README.md +60 -45
- package/VERIFY.md +14 -11
- package/demo/README.md +1 -1
- package/docs/acp-backend-rail.md +6 -2
- package/docs/external-mcp-host.md +8 -6
- package/docs/fresh-cut-policy.md +9 -1
- package/docs/setup-clean-host.md +76 -20
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +81 -19
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/cc-retire-pidfd.py +236 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/cc-retire-request.js +473 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/control-retire.js +125 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-retire-production.js +149 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-retire.js +158 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +2 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-visible-resume.js +283 -20
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-composition.js +7 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/fresh-call-dispatch.js +47 -3
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/herdr-fresh-call.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-session.js +96 -16
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +5 -29
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-launch.js +28 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-resume-call.js +26 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/pi-retire-request.js +76 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/resume-launch-identity.js +67 -17
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/retirement-event.js +211 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-hook.js +124 -10
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-pi-durable.js +53 -2
- package/mcp/entwurf-bridge/dist/scripts/meta-facts.js +1 -1
- package/mcp/entwurf-bridge/dist/scripts/probe-bridge-command.js +1 -0
- package/mcp/entwurf-bridge/src/index.ts +93 -19
- package/mcp/entwurf-bridge/test.sh +2 -2
- package/mcp/entwurf-bridge/tsconfig.build.json +10 -1
- package/package.json +15 -14
- package/pi/meta-bridge/entwurf-meta-receive/scripts/hook-launch.sh +3 -3
- package/pi/pi-durable/carrier/tui.js +18 -3
- package/pi/pi-durable/overlay/upstream-pin.json +12 -12
- package/pi-extensions/entwurf-control.ts +55 -20
- package/pi-extensions/lib/acp/backend-adapter.ts +5 -3
- package/pi-extensions/lib/acp/backend.ts +12 -9
- package/pi-extensions/lib/cc-retire-pidfd.py +236 -0
- package/pi-extensions/lib/cc-retire-request.ts +553 -0
- package/pi-extensions/lib/control-retire.ts +195 -0
- package/pi-extensions/lib/entwurf-control-rpc.ts +17 -1
- package/pi-extensions/lib/entwurf-v2-retire-production.ts +227 -0
- package/pi-extensions/lib/entwurf-v2-retire.ts +269 -0
- package/pi-extensions/lib/entwurf-v2-surface.ts +2 -1
- package/pi-extensions/lib/entwurf-v2-visible-resume.ts +390 -36
- package/pi-extensions/lib/fresh-call-composition.ts +15 -0
- package/pi-extensions/lib/fresh-call-dispatch.ts +45 -4
- package/pi-extensions/lib/herdr-fresh-call.ts +5 -0
- package/pi-extensions/lib/meta-session.ts +140 -16
- package/pi-extensions/lib/mux-fresh-call.ts +7 -27
- package/pi-extensions/lib/mux-launch.ts +29 -0
- package/pi-extensions/lib/mux-resume-call.ts +33 -12
- package/pi-extensions/lib/pi-retire-request.ts +111 -0
- package/pi-extensions/lib/resume-launch-identity.ts +104 -18
- package/pi-extensions/lib/retirement-event.ts +253 -0
- package/pi-extensions/meta-bridge-hook.ts +142 -13
- package/pi-extensions/meta-bridge-pi-durable.ts +57 -3
- package/run.sh +123 -34
- package/scripts/agy-bridge-config.py +4 -1
- package/scripts/build-bridge.sh +14 -0
- package/scripts/check-capability-bundle-reach.ts +135 -2
- package/scripts/check-entwurf-bridge-boot.ts +2 -1
- package/scripts/check-entwurf-fact-provider.ts +1 -0
- package/scripts/check-entwurf-v2-production.ts +2 -0
- package/scripts/check-entwurf-v2-surface.ts +7 -0
- package/scripts/check-gate-qualification.ts +14 -8
- package/scripts/check-herdr-activation.ts +2 -2
- package/scripts/check-herdr-placement.ts +1 -0
- package/scripts/check-hook-launch-topology.ts +6 -15
- package/scripts/check-install-container.sh +2 -2
- package/scripts/check-meta-doctor-oracle.sh +27 -1
- package/scripts/check-meta-facts.ts +8 -3
- package/scripts/check-meta-hook-session-switch.ts +230 -13
- package/scripts/check-meta-identity-consumers.ts +1 -0
- package/scripts/check-meta-listing.ts +1 -0
- package/scripts/check-meta-manifest-schema.py +1 -1
- package/scripts/check-meta-session.ts +31 -0
- package/scripts/check-meta-v3-record.ts +55 -1
- package/scripts/check-mux-resume-call.ts +35 -9
- package/scripts/check-peer-facts.ts +1 -0
- package/scripts/check-pi-durable-contact.ts +3 -1
- package/scripts/check-pi-durable-send.ts +4 -2
- package/scripts/check-pi-mcp-bridge.ts +1 -0
- package/scripts/check-resume-launch-identity.ts +62 -23
- package/scripts/lib/codex-fresh-live-protocol.ts +3 -2
- package/scripts/lib/meta-hook-bundle.ts +72 -0
- package/scripts/meta-bridge-claude-floor.sh +13 -9
- package/scripts/meta-bridge-doctor.sh +17 -0
- package/scripts/meta-bridge-install.sh +6 -0
- package/scripts/meta-facts.ts +1 -1
- package/scripts/mutants/bridge-boot-resume.json +5 -2
- package/scripts/mutants/cc-retire-pidfd.json +129 -0
- package/scripts/mutants/cc-retire-request.json +171 -0
- package/scripts/mutants/control-retire.json +105 -0
- package/scripts/mutants/control-send-receipt.json +1 -1
- package/scripts/mutants/copilot-receive.json +2 -6
- package/scripts/mutants/entwurf-v2-retire.json +476 -0
- package/scripts/mutants/fresh-call-dispatch.json +37 -0
- package/scripts/mutants/meta-hook-session-switch.json +88 -0
- package/scripts/mutants/meta-identity.json +57 -0
- package/scripts/mutants/mux-fresh-call.json +1 -1
- package/scripts/mutants/mux-resume-call.json +40 -4
- package/scripts/mutants/pack-install.json +4 -4
- package/scripts/mutants/pi-durable.json +139 -0
- package/scripts/mutants/pi-floor.json +5 -5
- package/scripts/mutants/pi-retire-request.json +72 -0
- package/scripts/mutants/resume-launch-identity.json +35 -8
- package/scripts/mutants/retirement-event.json +195 -0
- package/scripts/mutants/v2-surface.json +16 -0
- package/scripts/mutants/v2-visible-resume.json +283 -13
- package/scripts/probe-bridge-command.ts +1 -0
- package/scripts/smoke-agy-install-state.sh +2 -2
- package/scripts/smoke-codex-fresh-live.ts +2 -1
- package/scripts/smoke-copilot-mcp-state.sh +1 -1
- package/scripts/smoke-herdr-raw-install-live.sh +15 -7
- package/scripts/smoke-meta-install-state.sh +4 -4
- package/scripts/smoke-mux-lifecycle-live.ts +10 -10
- package/scripts/smoke-omp-mcp-state.sh +1 -1
- package/scripts/smoke-pi-durable-fresh-live.ts +5 -3
- package/scripts/smoke-pi-provider-state.sh +3 -3
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "retirement-event",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "RETIRE-EVENT-FD-KIND",
|
|
7
|
+
"title": "an opened non-regular inode passes admission and reaches write",
|
|
8
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
9
|
+
"find": ["\t\tif (!st.isFile()) throw new RetirementEventError(`${path.basename(file)} is not a regular file`);"],
|
|
10
|
+
"replace": ["\t\t// MUTANT: opened inode kind is not checked."],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
12
|
+
"timeoutSeconds": 120,
|
|
13
|
+
"signature": "[QK:RETIRE-EVENT-FD-KIND]",
|
|
14
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "RETIRE-EVENT-CLOSED-KEYS",
|
|
18
|
+
"title": "serialized event grows an undeclared field",
|
|
19
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
20
|
+
"find": ["\tconst base = { v, kind, eventId, at, actorGardenId, targetGardenId, targetBackend };"],
|
|
21
|
+
"replace": [
|
|
22
|
+
"\tconst base = { v, kind, eventId, at, actorGardenId, targetGardenId, targetBackend, extra: true };"
|
|
23
|
+
],
|
|
24
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
25
|
+
"timeoutSeconds": 120,
|
|
26
|
+
"signature": "[QK:RETIRE-EVENT-CLOSED-KEYS]",
|
|
27
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"claim": "RETIRE-EVENT-FORBIDDEN",
|
|
31
|
+
"title": "free text is admitted as a retirement reason",
|
|
32
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
33
|
+
"find": ["\tif (reason !== null && (typeof reason !== \"string\" || !REASON_RE.test(reason))) {"],
|
|
34
|
+
"replace": ["\tif (false) {"],
|
|
35
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
36
|
+
"timeoutSeconds": 120,
|
|
37
|
+
"signature": "[QK:RETIRE-EVENT-FORBIDDEN]",
|
|
38
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"claim": "RETIRE-EVENT-INSTANT",
|
|
42
|
+
"title": "calendar rollover is accepted as an ISO instant",
|
|
43
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
44
|
+
"find": ["\treturn !Number.isNaN(ms) && new Date(ms).toISOString() === value;"],
|
|
45
|
+
"replace": ["\treturn !Number.isNaN(ms);"],
|
|
46
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
47
|
+
"timeoutSeconds": 120,
|
|
48
|
+
"signature": "[QK:RETIRE-EVENT-INSTANT]",
|
|
49
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"claim": "RETIRE-EVENT-BACKEND-DOMAIN",
|
|
53
|
+
"title": "one backend records the other backend's outcome as its own",
|
|
54
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
55
|
+
"find": ["\tconst allowed: readonly unknown[] = RETIREMENT_OUTCOME_STATUSES_BY_BACKEND[targetBackend];"],
|
|
56
|
+
"replace": [
|
|
57
|
+
"\tconst allowed: readonly unknown[] = [\"shutdown-requested\", \"exited\", \"refused\", \"not-signalled\", \"unknown\"];"
|
|
58
|
+
],
|
|
59
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
60
|
+
"timeoutSeconds": 120,
|
|
61
|
+
"signature": "[QK:RETIRE-EVENT-BACKEND-DOMAIN]",
|
|
62
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"claim": "RETIRE-EVENT-SNAPSHOT",
|
|
66
|
+
"title": "foreign prototypes stop being refused at the snapshot boundary",
|
|
67
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
68
|
+
"find": [
|
|
69
|
+
"\tif (proto !== Object.prototype && proto !== null) throw new RetirementEventError(`${what} must be a plain object`);"
|
|
70
|
+
],
|
|
71
|
+
"replace": ["\t// MUTANT: foreign prototype admitted."],
|
|
72
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
73
|
+
"timeoutSeconds": 120,
|
|
74
|
+
"signature": "[QK:RETIRE-EVENT-SNAPSHOT]",
|
|
75
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"claim": "RETIRE-EVENT-ONE-SNAPSHOT",
|
|
79
|
+
"title": "filename re-reads the original object after validating a different target snapshot",
|
|
80
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
81
|
+
"find": ["\tconst file = retirementEventFile(retirementsDir, targetGardenId);"],
|
|
82
|
+
"replace": ["\tconst file = retirementEventFile(retirementsDir, event.targetGardenId);"],
|
|
83
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
84
|
+
"timeoutSeconds": 120,
|
|
85
|
+
"signature": "[QK:RETIRE-EVENT-ONE-SNAPSHOT]",
|
|
86
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"claim": "RETIRE-EVENT-APPEND",
|
|
90
|
+
"title": "an append opens at offset zero and overwrites the preserved prefix",
|
|
91
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
92
|
+
"find": ["\tconst fd = fs.openSync(file, O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW | O_NONBLOCK, 0o600);"],
|
|
93
|
+
"replace": ["\tconst fd = fs.openSync(file, O_WRONLY | O_CREAT | O_NOFOLLOW | O_NONBLOCK, 0o600);"],
|
|
94
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
95
|
+
"timeoutSeconds": 120,
|
|
96
|
+
"signature": "[QK:RETIRE-EVENT-APPEND]",
|
|
97
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"claim": "RETIRE-EVENT-CREATE",
|
|
101
|
+
"title": "new event files abandon the literal target-gid JSONL filename contract",
|
|
102
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
103
|
+
"find": ["export const RETIREMENT_EVENT_SUFFIX = \".jsonl\";"],
|
|
104
|
+
"replace": ["export const RETIREMENT_EVENT_SUFFIX = \".log\";"],
|
|
105
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
106
|
+
"timeoutSeconds": 120,
|
|
107
|
+
"signature": "[QK:RETIRE-EVENT-CREATE]",
|
|
108
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"claim": "RETIRE-EVENT-NOFOLLOW",
|
|
112
|
+
"title": "a final symlink is followed and its victim is appended to",
|
|
113
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
114
|
+
"find": ["\tconst fd = fs.openSync(file, O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW | O_NONBLOCK, 0o600);"],
|
|
115
|
+
"replace": ["\tconst fd = fs.openSync(file, O_WRONLY | O_APPEND | O_CREAT | O_NONBLOCK, 0o600);"],
|
|
116
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
117
|
+
"timeoutSeconds": 120,
|
|
118
|
+
"signature": "[QK:RETIRE-EVENT-NOFOLLOW]",
|
|
119
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"claim": "RETIRE-EVENT-NONREGULAR",
|
|
123
|
+
"title": "a multiply linked event inode can be appended to",
|
|
124
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
125
|
+
"find": [
|
|
126
|
+
"\t\tif (st.nlink !== 1) throw new RetirementEventError(`${path.basename(file)} has ${st.nlink} links; refusing`);"
|
|
127
|
+
],
|
|
128
|
+
"replace": ["\t\t// MUTANT: hardlink guard omitted."],
|
|
129
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
130
|
+
"timeoutSeconds": 120,
|
|
131
|
+
"signature": "[QK:RETIRE-EVENT-NONREGULAR]",
|
|
132
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"claim": "RETIRE-EVENT-DIR",
|
|
136
|
+
"title": "a symlinked retirement directory is admitted",
|
|
137
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
138
|
+
"find": ["\tif (st.isSymbolicLink() || !st.isDirectory()) {"],
|
|
139
|
+
"replace": ["\tif (false) {"],
|
|
140
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
141
|
+
"timeoutSeconds": 120,
|
|
142
|
+
"signature": "[QK:RETIRE-EVENT-DIR]",
|
|
143
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"claim": "RETIRE-EVENT-PATH",
|
|
147
|
+
"title": "a relative sessions directory becomes an ambient-CWD-dependent path",
|
|
148
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
149
|
+
"find": [
|
|
150
|
+
"\tif (!path.isAbsolute(sessionsDir)) throw new RetirementEventError(\"sessionsDir must be an absolute path\");"
|
|
151
|
+
],
|
|
152
|
+
"replace": ["\t// MUTANT: relative sessions directory admitted."],
|
|
153
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
154
|
+
"timeoutSeconds": 120,
|
|
155
|
+
"signature": "[QK:RETIRE-EVENT-PATH]",
|
|
156
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"claim": "RETIRE-EVENT-NO-AMBIENT",
|
|
160
|
+
"title": "the append leaf begins reading ambient environment",
|
|
161
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
162
|
+
"find": ["export function retirementsDirBesideSessions(sessionsDir: string): string {"],
|
|
163
|
+
"replace": [
|
|
164
|
+
"export function retirementsDirBesideSessions(sessionsDir: string): string {",
|
|
165
|
+
"\tvoid process.env.HOME;"
|
|
166
|
+
],
|
|
167
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
168
|
+
"timeoutSeconds": 120,
|
|
169
|
+
"signature": "[QK:RETIRE-EVENT-NO-AMBIENT]",
|
|
170
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"claim": "RETIRE-EVENT-PRIMITIVES",
|
|
174
|
+
"title": "FIFO admission loses NONBLOCK without a semantic open-flag assertion",
|
|
175
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
176
|
+
"find": ["\tconst fd = fs.openSync(file, O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW | O_NONBLOCK, 0o600);"],
|
|
177
|
+
"replace": ["\tconst fd = fs.openSync(file, O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW, 0o600);"],
|
|
178
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
179
|
+
"timeoutSeconds": 120,
|
|
180
|
+
"signature": "[QK:RETIRE-EVENT-PRIMITIVES]",
|
|
181
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"claim": "RETIRE-EVENT-FAILURE-MATRIX",
|
|
185
|
+
"title": "the file flush disappears so a flush failure cannot be reported",
|
|
186
|
+
"subject": "pi-extensions/lib/retirement-event.ts",
|
|
187
|
+
"find": ["\t\tfs.fsyncSync(fd);"],
|
|
188
|
+
"replace": ["\t\t// MUTANT: file flush omitted."],
|
|
189
|
+
"gate": ["bash", "run.sh", "check-retirement-event"],
|
|
190
|
+
"timeoutSeconds": 120,
|
|
191
|
+
"signature": "[QK:RETIRE-EVENT-FAILURE-MATRIX]",
|
|
192
|
+
"signatureSource": "pi-extensions/lib/retirement-event.test.ts"
|
|
193
|
+
}
|
|
194
|
+
]
|
|
195
|
+
}
|
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"lane": "v2-surface",
|
|
4
4
|
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "V2SURF-RESUME-HINT-SCOPE",
|
|
7
|
+
"title": "the dormant capability hint returns to a Pi-only automatic-resume invitation",
|
|
8
|
+
"subject": "pi-extensions/lib/entwurf-v2-surface.ts",
|
|
9
|
+
"find": [
|
|
10
|
+
"\t\t\t\t\"Only on an explicit operator request, use entwurf_resume_call {target} for Pi or Claude Code; \" +",
|
|
11
|
+
"\t\t\t\t\"it submits no prompt. This capability hint is not permission to resume automatically.\""
|
|
12
|
+
],
|
|
13
|
+
"replace": [
|
|
14
|
+
"\t\t\t\t\"Reopen the citizen with entwurf_resume_call {target} (pi targets only; it runs no turn), then dispatch again.\""
|
|
15
|
+
],
|
|
16
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
|
|
17
|
+
"timeoutSeconds": 60,
|
|
18
|
+
"signature": "[QK:V2SURF-RESUME-HINT-SCOPE]",
|
|
19
|
+
"signatureSource": "scripts/check-entwurf-v2-surface.ts"
|
|
20
|
+
},
|
|
5
21
|
{
|
|
6
22
|
"claim": "V2SURF-MCP-LOCK-DOMAIN",
|
|
7
23
|
"title": "MCP long description reverts to the false \"socket paths take a per-target lock\" claim",
|
|
@@ -73,8 +73,16 @@
|
|
|
73
73
|
"claim": "V2RESUME-OBSERVE-IS-BOUNDED-WAIT",
|
|
74
74
|
"title": "the observation becomes a single immediate probe, which reports every real resume as unobserved (the socket answers ~2-4s later)",
|
|
75
75
|
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
76
|
-
"find": [
|
|
77
|
-
|
|
76
|
+
"find": [
|
|
77
|
+
"\t\t\treturn { kind: \"resume-unobserved\", socketPath, waitedMs: deps.now() - started };",
|
|
78
|
+
"\t\t}",
|
|
79
|
+
"\t\tawait deps.sleep(intervalMs);"
|
|
80
|
+
],
|
|
81
|
+
"replace": [
|
|
82
|
+
"\t\t\treturn { kind: \"resume-unobserved\", socketPath, waitedMs: deps.now() - started };",
|
|
83
|
+
"\t\t}",
|
|
84
|
+
"\t\treturn { kind: \"resume-unobserved\", socketPath, waitedMs: deps.now() - started };"
|
|
85
|
+
],
|
|
78
86
|
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
79
87
|
"timeoutSeconds": 60,
|
|
80
88
|
"signature": "[QK:V2RESUME-OBSERVE-IS-BOUNDED-WAIT]",
|
|
@@ -106,8 +114,8 @@
|
|
|
106
114
|
"claim": "V2RESUME-ARGV-FROM-RECORD",
|
|
107
115
|
"title": "the launcher is handed the caller's own directory instead of the record's, so the citizen returns in the wrong project",
|
|
108
116
|
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
109
|
-
"find": ["\t\tconst launched = deps.launch({ cwd: identity.cwd, runtimeArgs });"],
|
|
110
|
-
"replace": ["\t\tconst launched = deps.launch({ cwd: process.cwd(), runtimeArgs });"],
|
|
117
|
+
"find": ["\t\tconst launched = deps.launch({ backend: \"pi\", cwd: identity.cwd, runtimeArgs });"],
|
|
118
|
+
"replace": ["\t\tconst launched = deps.launch({ backend: \"pi\", cwd: process.cwd(), runtimeArgs });"],
|
|
111
119
|
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
112
120
|
"timeoutSeconds": 60,
|
|
113
121
|
"signature": "[QK:V2RESUME-ARGV-FROM-RECORD]",
|
|
@@ -117,9 +125,11 @@
|
|
|
117
125
|
"claim": "V2RESUME-RECEIPTS-SEPARATE",
|
|
118
126
|
"title": "the launch receipt absorbs the observation, so 'a window opened' and 'the citizen is back' become one claim",
|
|
119
127
|
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
120
|
-
"find": [
|
|
128
|
+
"find": [
|
|
129
|
+
"\t\t\tlaunch: { backend: \"pi\", targetGardenId, sessionFile: identity.sessionFile, handle: launched.handle },"
|
|
130
|
+
],
|
|
121
131
|
"replace": [
|
|
122
|
-
"\t\t\tlaunch: { targetGardenId, sessionFile: identity.sessionFile, handle: launched.handle, kind: observation.kind } as ResumeLaunchReceipt,"
|
|
132
|
+
"\t\t\tlaunch: { backend: \"pi\", targetGardenId, sessionFile: identity.sessionFile, handle: launched.handle, kind: observation.kind } as ResumeLaunchReceipt,"
|
|
123
133
|
],
|
|
124
134
|
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
125
135
|
"timeoutSeconds": 60,
|
|
@@ -156,7 +166,8 @@
|
|
|
156
166
|
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
157
167
|
"find": ["\t\t\treturn { kind: \"resume-unobserved\", socketPath, waitedMs: deps.now() - started };"],
|
|
158
168
|
"replace": [
|
|
159
|
-
"\t\t\t(deps as VisibleResumeDeps).launch({
|
|
169
|
+
"\t\t\t(deps as VisibleResumeDeps).launch({ backend: \"pi\", cwd: \"/tmp\", runtimeArgs: [] });",
|
|
170
|
+
"\t\t\treturn { kind: \"resume-unobserved\", socketPath, waitedMs: deps.now() - started };"
|
|
160
171
|
],
|
|
161
172
|
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
162
173
|
"timeoutSeconds": 60,
|
|
@@ -175,29 +186,29 @@
|
|
|
175
186
|
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
176
187
|
},
|
|
177
188
|
{
|
|
178
|
-
"claim": "V2RESUME-
|
|
189
|
+
"claim": "V2RESUME-BACKEND-UNSUPPORTED-REFUSED",
|
|
179
190
|
"title": "an out-of-domain backend is reported as an error instead of a named refusal, so a fine record reads as a broken one",
|
|
180
191
|
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
181
192
|
"find": ["\t\t\tif (err instanceof ResumeBackendUnsupportedError) {"],
|
|
182
193
|
"replace": ["\t\t\tif (false && err instanceof ResumeBackendUnsupportedError) {"],
|
|
183
194
|
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
184
195
|
"timeoutSeconds": 60,
|
|
185
|
-
"signature": "[QK:V2RESUME-
|
|
196
|
+
"signature": "[QK:V2RESUME-BACKEND-UNSUPPORTED-REFUSED]",
|
|
186
197
|
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
187
198
|
},
|
|
188
199
|
{
|
|
189
|
-
"claim": "V2RESUME-
|
|
200
|
+
"claim": "V2RESUME-BACKEND-UNSUPPORTED-BY-FIELD",
|
|
190
201
|
"title": "the backend is re-derived instead of taken from the typed error, which is the second read this rail refuses",
|
|
191
202
|
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
192
203
|
"find": [
|
|
193
|
-
"\t\t\t\t\t\t`${targetGardenId} is a ${err.backend} citizen; only pi
|
|
204
|
+
"\t\t\t\t\t\t`${targetGardenId} is a ${err.backend} citizen; only pi and Claude Code citizens can be reopened ` +"
|
|
194
205
|
],
|
|
195
206
|
"replace": [
|
|
196
|
-
"\t\t\t\t\t\t`${targetGardenId} is a citizen of another backend; only pi
|
|
207
|
+
"\t\t\t\t\t\t`${targetGardenId} is a citizen of another backend; only pi and Claude Code citizens can be reopened ` +"
|
|
197
208
|
],
|
|
198
209
|
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
199
210
|
"timeoutSeconds": 60,
|
|
200
|
-
"signature": "[QK:V2RESUME-
|
|
211
|
+
"signature": "[QK:V2RESUME-BACKEND-UNSUPPORTED-BY-FIELD]",
|
|
201
212
|
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
202
213
|
},
|
|
203
214
|
{
|
|
@@ -221,6 +232,265 @@
|
|
|
221
232
|
"timeoutSeconds": 60,
|
|
222
233
|
"signature": "[QK:V2RESUME-ACP-MODEL-REFUSED]",
|
|
223
234
|
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"claim": "V2RESUME-CC-DEAD-OWNER-LAUNCHES",
|
|
238
|
+
"title": "a Claude Code resume is launched as `claude --continue`, which reopens whichever session the vendor picks rather than the one the record names",
|
|
239
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
240
|
+
"find": ["\t\truntimeArgs: [\"--resume\", current.nativeSessionId],"],
|
|
241
|
+
"replace": ["\t\truntimeArgs: [\"--continue\"],"],
|
|
242
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
243
|
+
"timeoutSeconds": 60,
|
|
244
|
+
"signature": "[QK:V2RESUME-CC-DEAD-OWNER-LAUNCHES]",
|
|
245
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"claim": "V2RESUME-CC-LIVE-REFUSED",
|
|
249
|
+
"title": "a live Claude Code owner stops being refused as live, so the caller is told to wait on an inconclusive probe instead of sending to the running session",
|
|
250
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
251
|
+
"find": ["\tif (before.owner === \"live\") {"],
|
|
252
|
+
"replace": ["\tif (before.owner === (\"never\" as string)) {"],
|
|
253
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
254
|
+
"timeoutSeconds": 60,
|
|
255
|
+
"signature": "[QK:V2RESUME-CC-LIVE-REFUSED]",
|
|
256
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"claim": "V2RESUME-CC-UNCERTAIN-REFUSED",
|
|
260
|
+
"title": "an owner the shared rule cannot judge is treated as dormant, which can open a second process on a session that is still running",
|
|
261
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
262
|
+
"find": ["\tif (before.owner !== \"dead\") {"],
|
|
263
|
+
"replace": ["\tif (before.owner === (\"never\" as string)) {"],
|
|
264
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
265
|
+
"timeoutSeconds": 60,
|
|
266
|
+
"signature": "[QK:V2RESUME-CC-UNCERTAIN-REFUSED]",
|
|
267
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"claim": "V2RESUME-CC-ABSENT-REFUSED",
|
|
271
|
+
"title": "a Claude Code citizen with no receiver marker is not refused by name, so a session nothing proves dormant falls through the dormancy proof",
|
|
272
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
273
|
+
"find": ["\tif (before.kind === \"absent\") {"],
|
|
274
|
+
"replace": ["\tif (before.kind === (\"never\" as string)) {"],
|
|
275
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
276
|
+
"timeoutSeconds": 60,
|
|
277
|
+
"signature": "[QK:V2RESUME-CC-ABSENT-REFUSED]",
|
|
278
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"claim": "V2RESUME-CC-CORRUPT-REFUSED",
|
|
282
|
+
"title": "an unreadable receiver marker is not refused by name, so a marker whose owner cannot be judged falls through the dormancy proof",
|
|
283
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
284
|
+
"find": ["\tif (before.kind === \"corrupt\") {"],
|
|
285
|
+
"replace": ["\tif (before.kind === (\"never\" as string)) {"],
|
|
286
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
287
|
+
"timeoutSeconds": 60,
|
|
288
|
+
"signature": "[QK:V2RESUME-CC-CORRUPT-REFUSED]",
|
|
289
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"claim": "V2RESUME-CC-MISMATCH-REFUSED",
|
|
293
|
+
"title": "a dead marker for ANOTHER native session is accepted as this session's dormancy proof",
|
|
294
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
295
|
+
"find": ["\t\tmarker.backend !== \"claude-code\" ||", "\t\tmarker.nativeSessionId !== identity.nativeSessionId"],
|
|
296
|
+
"replace": ["\t\tmarker.backend !== \"claude-code\" ||", "\t\tfalse"],
|
|
297
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
298
|
+
"timeoutSeconds": 60,
|
|
299
|
+
"signature": "[QK:V2RESUME-CC-MISMATCH-REFUSED]",
|
|
300
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"claim": "V2RESUME-CC-OBSERVES-NEW-OWNER",
|
|
304
|
+
"title": "the observation accepts the previous owner's marker as the resumed session coming back",
|
|
305
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
306
|
+
"find": [
|
|
307
|
+
"\t\t\t(seen.marker.ownerPid !== previous.ownerPid || seen.marker.ownerStartKey !== previous.ownerStartKey) &&"
|
|
308
|
+
],
|
|
309
|
+
"replace": ["\t\t\ttrue &&"],
|
|
310
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
311
|
+
"timeoutSeconds": 60,
|
|
312
|
+
"signature": "[QK:V2RESUME-CC-OBSERVES-NEW-OWNER]",
|
|
313
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"claim": "V2RESUME-CC-RECORD-DRIFT-UNOBSERVED",
|
|
317
|
+
"title": "the observation stops checking that the record still names the same session with the same createdAt",
|
|
318
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
319
|
+
"find": ["\t\t\t\tcurrent.createdAt === identity.createdAt &&"],
|
|
320
|
+
"replace": ["\t\t\t\ttrue &&"],
|
|
321
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
322
|
+
"timeoutSeconds": 60,
|
|
323
|
+
"signature": "[QK:V2RESUME-CC-RECORD-DRIFT-UNOBSERVED]",
|
|
324
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"claim": "V2RESUME-CC-MARKER-READ-RAW",
|
|
328
|
+
"title": "the receiver marker is read through a path that follows symlinks instead of the no-follow fd reader, so a link to another citizen's marker answers for this one",
|
|
329
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
330
|
+
"find": ["\t\tbytes = readStoreRecordFile(markerPath);"],
|
|
331
|
+
"replace": ["\t\tbytes = process.getBuiltinModule(\"node:fs\").readFileSync(markerPath, \"utf8\");"],
|
|
332
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
333
|
+
"timeoutSeconds": 60,
|
|
334
|
+
"signature": "[QK:V2RESUME-CC-MARKER-READ-RAW]",
|
|
335
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
"claim": "V2RESUME-PI-NEVER-READS-RECEIVER",
|
|
339
|
+
"title": "the pi path consults a Claude Code receiver marker, mixing the two backends' dormancy proofs",
|
|
340
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
341
|
+
"find": ["\t\tconst launched = deps.launch({ backend: \"pi\", cwd: identity.cwd, runtimeArgs });"],
|
|
342
|
+
"replace": [
|
|
343
|
+
"\t\tdeps.inspectReceiver(targetGardenId);",
|
|
344
|
+
"\t\tconst launched = deps.launch({ backend: \"pi\", cwd: identity.cwd, runtimeArgs });"
|
|
345
|
+
],
|
|
346
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
347
|
+
"timeoutSeconds": 60,
|
|
348
|
+
"signature": "[QK:V2RESUME-PI-NEVER-READS-RECEIVER]",
|
|
349
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
"claim": "V2RESUME-CC-RENDER",
|
|
353
|
+
"title": "the Claude Code launch receipt stops saying it asked for claude --resume, so a reader cannot tell which session the window was asked to open",
|
|
354
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
355
|
+
"find": [
|
|
356
|
+
"\t\t\t\t`LAUNCH receipt: tmux created that window and was asked to start claude --resume on the session above.\\n` +"
|
|
357
|
+
],
|
|
358
|
+
"replace": ["\t\t\t\t`LAUNCH receipt: tmux created that window.\\n` +"],
|
|
359
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
360
|
+
"timeoutSeconds": 60,
|
|
361
|
+
"signature": "[QK:V2RESUME-CC-RENDER]",
|
|
362
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"claim": "V2RESUME-CC-OBSERVE-HELPER-BOUNDED",
|
|
366
|
+
"title": "the Claude Code observation's deadline reports the previous owner as re-armed instead of unobserved",
|
|
367
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
368
|
+
"find": ["\t\t\treturn { kind: \"resume-unobserved\", waitedMs: deps.now() - started };"],
|
|
369
|
+
"replace": [
|
|
370
|
+
"\t\t\treturn { kind: \"receiver-armed\", ownerPid: previous.ownerPid, waitedMs: deps.now() - started };"
|
|
371
|
+
],
|
|
372
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
373
|
+
"timeoutSeconds": 60,
|
|
374
|
+
"signature": "[QK:V2RESUME-CC-OBSERVE-HELPER-BOUNDED]",
|
|
375
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
"claim": "V2RESUME-CC-BINDING-REREAD",
|
|
379
|
+
"title": "the binding is compared against the FIRST record read, so an arm committed between that read and the dead verdict is bound by a stale value",
|
|
380
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
381
|
+
"find": ["\tconst current = deps.resolveIdentity(targetGardenId);"],
|
|
382
|
+
"replace": ["\tconst current = identity;"],
|
|
383
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
384
|
+
"timeoutSeconds": 60,
|
|
385
|
+
"signature": "[QK:V2RESUME-CC-BINDING-REREAD]",
|
|
386
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"claim": "V2RESUME-CC-UNBOUND-LEGACY",
|
|
390
|
+
"title": "a record or marker with no binding (null) passes the binding check, so null == null reads as a match",
|
|
391
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
392
|
+
"find": ["\tif (current.attachIncarnation === null || marker.attachIncarnation === null) {"],
|
|
393
|
+
"replace": ["\tif (false) {"],
|
|
394
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
395
|
+
"timeoutSeconds": 60,
|
|
396
|
+
"signature": "[QK:V2RESUME-CC-UNBOUND-LEGACY]",
|
|
397
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"claim": "V2RESUME-CC-UNBOUND-STALE",
|
|
401
|
+
"title": "a dead marker whose binding is older than the record's still authorises a launch",
|
|
402
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
403
|
+
"find": ["\tif (current.attachIncarnation !== marker.attachIncarnation) {"],
|
|
404
|
+
"replace": ["\tif (false) {"],
|
|
405
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
406
|
+
"timeoutSeconds": 60,
|
|
407
|
+
"signature": "[QK:V2RESUME-CC-UNBOUND-STALE]",
|
|
408
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"claim": "V2RESUME-CC-UNBOUND-RECORD-MOVED",
|
|
412
|
+
"title": "a record whose createdAt changed between the two reads is still bound",
|
|
413
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
414
|
+
"find": ["\t\tcurrent.createdAt !== identity.createdAt"],
|
|
415
|
+
"replace": ["\t\tfalse"],
|
|
416
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
417
|
+
"timeoutSeconds": 60,
|
|
418
|
+
"signature": "[QK:V2RESUME-CC-UNBOUND-RECORD-MOVED]",
|
|
419
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
"claim": "V2RESUME-CC-OBSERVE-PANE-JOIN",
|
|
423
|
+
"title": "the observation accepts a live owner anywhere, not only the pane this call opened",
|
|
424
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
425
|
+
"find": ["\t\t\tString(seen.marker.ownerPid) === panePid &&"],
|
|
426
|
+
"replace": [""],
|
|
427
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
428
|
+
"timeoutSeconds": 60,
|
|
429
|
+
"signature": "[QK:V2RESUME-CC-OBSERVE-PANE-JOIN]",
|
|
430
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
"claim": "V2RESUME-CC-OBSERVE-BACKEND",
|
|
434
|
+
"title": "the observation accepts a live receiver marker of another backend",
|
|
435
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
436
|
+
"find": ["\t\t\tseen.marker.backend === \"claude-code\" &&"],
|
|
437
|
+
"replace": [""],
|
|
438
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
439
|
+
"timeoutSeconds": 60,
|
|
440
|
+
"signature": "[QK:V2RESUME-CC-OBSERVE-BACKEND]",
|
|
441
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"claim": "V2RESUME-CC-OBSERVE-FRESH-BINDING",
|
|
445
|
+
"title": "the observation accepts a new owner still showing the binding the dormancy proof bound",
|
|
446
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
447
|
+
"find": ["\t\t\tseen.marker.attachIncarnation !== previous.attachIncarnation"],
|
|
448
|
+
"replace": ["\t\t\ttrue"],
|
|
449
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
450
|
+
"timeoutSeconds": 60,
|
|
451
|
+
"signature": "[QK:V2RESUME-CC-OBSERVE-FRESH-BINDING]",
|
|
452
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
"claim": "V2RESUME-CC-OBSERVE-RECORD-BINDING",
|
|
456
|
+
"title": "the observation stops requiring the current record to carry the marker's binding",
|
|
457
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
458
|
+
"find": ["\t\t\t\tcurrent.attachIncarnation === seen.marker.attachIncarnation"],
|
|
459
|
+
"replace": ["\t\t\t\ttrue"],
|
|
460
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
461
|
+
"timeoutSeconds": 60,
|
|
462
|
+
"signature": "[QK:V2RESUME-CC-OBSERVE-RECORD-BINDING]",
|
|
463
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
"claim": "V2RESUME-CC-OBSERVE-RECORD-UNREADABLE",
|
|
467
|
+
"title": "a record defect during the observation is swallowed into the bounded wait instead of stopping it as record-unreadable",
|
|
468
|
+
"subject": "pi-extensions/lib/entwurf-v2-visible-resume.ts",
|
|
469
|
+
"find": [
|
|
470
|
+
"\t\t\t\treturn {",
|
|
471
|
+
"\t\t\t\t\tkind: \"record-unreadable\",",
|
|
472
|
+
"\t\t\t\t\tcause: err instanceof Error ? err.message : String(err),",
|
|
473
|
+
"\t\t\t\t\twaitedMs: deps.now() - started,",
|
|
474
|
+
"\t\t\t\t};"
|
|
475
|
+
],
|
|
476
|
+
"replace": ["\t\t\t\tcurrent = identity;"],
|
|
477
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
478
|
+
"timeoutSeconds": 60,
|
|
479
|
+
"signature": "[QK:V2RESUME-CC-OBSERVE-RECORD-UNREADABLE]",
|
|
480
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
"claim": "V2RESUME-CC-MARKER-BINDING-READ",
|
|
484
|
+
"title": "the receiver-marker validator drops the marker's binding, so every marker reads as unbound",
|
|
485
|
+
"subject": "pi-extensions/lib/meta-session.ts",
|
|
486
|
+
"find": [
|
|
487
|
+
"\t\tattachIncarnation: requireAttachIncarnation(raw.attachIncarnation === undefined ? null : raw.attachIncarnation),"
|
|
488
|
+
],
|
|
489
|
+
"replace": ["\t\tattachIncarnation: null,"],
|
|
490
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-visible-resume"],
|
|
491
|
+
"timeoutSeconds": 60,
|
|
492
|
+
"signature": "[QK:V2RESUME-CC-MARKER-BINDING-READ]",
|
|
493
|
+
"signatureSource": "pi-extensions/lib/entwurf-v2-visible-resume.test.ts"
|
|
224
494
|
}
|
|
225
495
|
]
|
|
226
496
|
}
|
|
@@ -67,7 +67,7 @@ write_mcp_fake() { # $1 = path
|
|
|
67
67
|
while IFS= read -r line; do
|
|
68
68
|
case "$line" in
|
|
69
69
|
*'"id":1'*) printf '%s\n' '{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","capabilities":{},"serverInfo":{"name":"fake-entwurf-bridge","version":"0"}}}' ;;
|
|
70
|
-
*'"id":2'*) printf '%s\n' '{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"entwurf_v2"},{"name":"entwurf_self"},{"name":"entwurf_peers"},{"name":"entwurf_inbox_read"},{"name":"entwurf_register_native"},{"name":"entwurf_fresh_call"},{"name":"entwurf_resume_call"},{"name":"entwurf_callback"}]}}' ;;
|
|
70
|
+
*'"id":2'*) printf '%s\n' '{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"entwurf_v2"},{"name":"entwurf_self"},{"name":"entwurf_peers"},{"name":"entwurf_inbox_read"},{"name":"entwurf_register_native"},{"name":"entwurf_fresh_call"},{"name":"entwurf_resume_call"},{"name":"entwurf_retire_call"},{"name":"entwurf_callback"}]}}' ;;
|
|
71
71
|
esac
|
|
72
72
|
done
|
|
73
73
|
FAKE
|
|
@@ -89,7 +89,7 @@ if [ "${REVIEW_ENV:-}" = "fail" ]; then echo configured-env-failure >&2; exit 24
|
|
|
89
89
|
while IFS= read -r line; do
|
|
90
90
|
case "$line" in
|
|
91
91
|
*'"id":1'*) printf '%s\n' '{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","capabilities":{},"serverInfo":{"name":"fake-entwurf-bridge","version":"0"}}}' ;;
|
|
92
|
-
*'"id":2'*) printf '%s\n' '{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"entwurf_v2"},{"name":"entwurf_self"},{"name":"entwurf_peers"},{"name":"entwurf_inbox_read"},{"name":"entwurf_register_native"},{"name":"entwurf_fresh_call"},{"name":"entwurf_resume_call"},{"name":"entwurf_callback"}]}}' ;;
|
|
92
|
+
*'"id":2'*) printf '%s\n' '{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"entwurf_v2"},{"name":"entwurf_self"},{"name":"entwurf_peers"},{"name":"entwurf_inbox_read"},{"name":"entwurf_register_native"},{"name":"entwurf_fresh_call"},{"name":"entwurf_resume_call"},{"name":"entwurf_retire_call"},{"name":"entwurf_callback"}]}}' ;;
|
|
93
93
|
esac
|
|
94
94
|
done
|
|
95
95
|
FAKE
|
|
@@ -1082,7 +1082,8 @@ async function run(): Promise<void> {
|
|
|
1082
1082
|
const codexWaitToken = `CODEX-WAIT-${Math.random().toString(36).slice(2, 10).toUpperCase()}`;
|
|
1083
1083
|
const finalToken = `CODEX-PI-FINAL-${Math.random().toString(36).slice(2, 10).toUpperCase()}`;
|
|
1084
1084
|
expectedReportTokens.push(finalToken);
|
|
1085
|
-
const outboundPiTask =
|
|
1085
|
+
const outboundPiTask =
|
|
1086
|
+
"Your automatic callback is the whole task and there is no result to send. After it succeeds, end the turn: no message, no report, no further tool call. Do not open another sibling.";
|
|
1086
1087
|
const codexTask =
|
|
1087
1088
|
`After your required callback receipt, end the turn and wait passively for the addressed instruction containing ${codexWaitToken}. ` +
|
|
1088
1089
|
"Do not call shell, sleep, terminal, or any tool to wait.";
|
|
@@ -26,7 +26,7 @@ write_mcp_fake() {
|
|
|
26
26
|
while IFS= read -r line; do
|
|
27
27
|
case "$line" in
|
|
28
28
|
*'"id":1'*) printf '%s\n' '{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","capabilities":{},"serverInfo":{"name":"fake-entwurf-bridge","version":"0"}}}' ;;
|
|
29
|
-
*'"id":2'*) printf '%s\n' '{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"entwurf_v2"},{"name":"entwurf_self"},{"name":"entwurf_peers"},{"name":"entwurf_inbox_read"},{"name":"entwurf_register_native"},{"name":"entwurf_fresh_call"},{"name":"entwurf_resume_call"},{"name":"entwurf_callback"}]}}' ;;
|
|
29
|
+
*'"id":2'*) printf '%s\n' '{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"entwurf_v2"},{"name":"entwurf_self"},{"name":"entwurf_peers"},{"name":"entwurf_inbox_read"},{"name":"entwurf_register_native"},{"name":"entwurf_fresh_call"},{"name":"entwurf_resume_call"},{"name":"entwurf_retire_call"},{"name":"entwurf_callback"}]}}' ;;
|
|
30
30
|
esac
|
|
31
31
|
done
|
|
32
32
|
FAKE
|