@junghanacs/entwurf 0.20.1 → 0.21.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.
- package/AGENTS.md +85 -190
- package/BASELINE.md +4 -3
- package/CHANGELOG.md +195 -14
- package/CONTRIBUTING.md +1 -1
- package/DELIVERY.md +202 -60
- package/README.md +49 -22
- package/VERIFY.md +37 -7
- package/docs/acp-backend-rail.md +0 -1
- package/docs/external-mcp-host.md +54 -33
- package/docs/setup-clean-host.md +110 -17
- package/mcp/entwurf-bridge/dist/mcp/entwurf-bridge/src/index.js +101 -109
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/codex-fresh-preflight.js +326 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-fact-provider.js +22 -2
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-peers-render.js +3 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-contract.js +6 -7
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-native-push.js +30 -17
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-production.js +7 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/entwurf-v2-surface.js +7 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-mailbox-body.js +20 -11
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/meta-sender-identity.js +227 -1
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/mux-fresh-call.js +50 -15
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/native-push/adapter.js +10 -7
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/native-push/codex-ws-client.js +403 -0
- package/mcp/entwurf-bridge/dist/pi-extensions/lib/native-push/register.js +4 -4
- package/mcp/entwurf-bridge/dist/pi-extensions/meta-bridge-hook-codex.js +325 -0
- package/mcp/entwurf-bridge/dist/scripts/meta-bridge-fresh-cut.js +6 -1
- package/mcp/entwurf-bridge/src/index.ts +115 -111
- package/mcp/entwurf-bridge/tsconfig.build.json +1 -0
- package/package.json +13 -4
- package/pi-extensions/entwurf-control.ts +71 -19
- package/pi-extensions/lib/codex-fresh-preflight.ts +363 -0
- package/pi-extensions/lib/compaction-send-guard.ts +80 -0
- package/pi-extensions/lib/entwurf-fact-provider.ts +29 -3
- package/pi-extensions/lib/entwurf-peers-render.ts +4 -1
- package/pi-extensions/lib/entwurf-v2-contract.ts +6 -7
- package/pi-extensions/lib/entwurf-v2-native-push.ts +35 -18
- package/pi-extensions/lib/entwurf-v2-production.ts +10 -3
- package/pi-extensions/lib/entwurf-v2-surface.ts +7 -4
- package/pi-extensions/lib/meta-mailbox-body.ts +22 -13
- package/pi-extensions/lib/meta-sender-identity.ts +305 -0
- package/pi-extensions/lib/mux-fresh-call.ts +64 -19
- package/pi-extensions/lib/native-push/adapter.ts +21 -24
- package/pi-extensions/lib/native-push/codex-ws-client.ts +506 -0
- package/pi-extensions/lib/native-push/register.ts +7 -9
- package/pi-extensions/meta-bridge-hook-codex.ts +371 -0
- package/run.sh +218 -28
- package/scripts/check-agy-sender-identity.ts +1 -1
- package/scripts/check-codex-birth-hook.ts +264 -0
- package/scripts/check-codex-bridge-identity.ts +179 -0
- package/scripts/check-codex-native-push.ts +386 -0
- package/scripts/check-codex-sender-identity.ts +495 -0
- package/scripts/check-compaction-send-guard.ts +130 -0
- package/scripts/check-copilot-receive-arm.ts +4 -1
- package/scripts/check-entwurf-fact-provider.ts +38 -0
- package/scripts/check-entwurf-peers-surface.ts +13 -1
- package/scripts/check-entwurf-self-address.ts +15 -16
- package/scripts/check-entwurf-v2-contract.ts +4 -3
- package/scripts/check-entwurf-v2-decider.ts +7 -5
- package/scripts/check-entwurf-v2-native-push.ts +35 -7
- package/scripts/check-entwurf-v2-production.ts +203 -11
- package/scripts/check-entwurf-v2-runner.ts +1 -1
- package/scripts/check-entwurf-v2-surface.ts +1 -1
- package/scripts/check-gate-qualification.ts +6 -3
- package/scripts/check-harness-admission-parity.ts +0 -1
- package/scripts/check-mux-launch-tmux.ts +47 -2
- package/scripts/check-native-push-adapter.ts +20 -16
- package/scripts/check-native-push-register.ts +5 -1
- package/scripts/check-release-gate-outcomes.ts +47 -1
- package/scripts/check-setup-qualification.sh +3 -1
- package/scripts/codex-birth-doctor.sh +276 -0
- package/scripts/codex-birth-install.sh +414 -0
- package/scripts/codex-birth-uninstall.sh +170 -0
- package/scripts/codex-mcp-config.py +435 -0
- package/scripts/codex-statusline-config.py +434 -0
- package/scripts/codex_toml_io.py +532 -0
- package/scripts/lib/codex-fresh-live-protocol.ts +113 -0
- package/scripts/lib/codex-fresh-source-receipts.ts +399 -0
- package/scripts/lib/launch-receipt-windows.ts +46 -0
- package/scripts/lib/tmux-coordinate-row.ts +58 -0
- package/scripts/meta-bridge-fresh-cut.ts +6 -1
- package/scripts/mutants/codex-native.json +838 -0
- package/scripts/mutants/compaction-send-guard.json +103 -0
- package/scripts/mutants/entwurf-peers.json +19 -0
- package/scripts/mutants/mux-fresh-call.json +19 -8
- package/scripts/mutants/omp-fresh.json +6 -4
- package/scripts/mutants/release-gate.json +13 -0
- package/scripts/mutants/v2-surface.json +53 -1
- package/scripts/raw-async-delivery/README.md +2 -1
- package/scripts/raw-codex-measure/README.md +114 -46
- package/scripts/smoke-agy-native-push-live.ts +3 -1
- package/scripts/smoke-codex-birth.sh +347 -0
- package/scripts/smoke-codex-config-state.sh +511 -0
- package/scripts/smoke-codex-fresh-live.ts +1186 -0
- package/scripts/smoke-codex-native-push-live.ts +75 -0
- package/scripts/smoke-setup-verdict.sh +123 -10
- package/scripts/tsconfig.json +1 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "compaction-send-guard",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "COMPACT-SEND-NO-MODE",
|
|
7
|
+
"title": "the predicate grows a mode argument so steer could be admitted while follow_up is refused",
|
|
8
|
+
"subject": "pi-extensions/lib/compaction-send-guard.ts",
|
|
9
|
+
"find": [
|
|
10
|
+
"export function compactionSendReject(guard: CompactionGuard, facts: CompactionSendFacts): CompactionSendReject | null {"
|
|
11
|
+
],
|
|
12
|
+
"replace": [
|
|
13
|
+
"export function compactionSendReject(guard: CompactionGuard, facts: CompactionSendFacts, mode?: string): CompactionSendReject | null {"
|
|
14
|
+
],
|
|
15
|
+
"gate": ["bash", "run.sh", "check-compaction-send-guard"],
|
|
16
|
+
"timeoutSeconds": 60,
|
|
17
|
+
"signature": "[QK:COMPACT-SEND-NO-MODE]",
|
|
18
|
+
"signatureSource": "scripts/check-compaction-send-guard.ts"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"claim": "COMPACT-SEND-REJECT-ARMED",
|
|
22
|
+
"title": "armed compacting-during-stream is treated as an ordinary turn, so auto-compact still gets sendMessage",
|
|
23
|
+
"subject": "pi-extensions/lib/compaction-send-guard.ts",
|
|
24
|
+
"find": ["\tif (guard.armed) return COMPACTION_SEND_REJECT;"],
|
|
25
|
+
"replace": ["\t// armed compacting-during-stream no longer rejects"],
|
|
26
|
+
"gate": ["bash", "run.sh", "check-compaction-send-guard"],
|
|
27
|
+
"timeoutSeconds": 60,
|
|
28
|
+
"signature": "[QK:COMPACT-SEND-REJECT-ARMED]",
|
|
29
|
+
"signatureSource": "scripts/check-compaction-send-guard.ts"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"claim": "COMPACT-SEND-REJECT-QUIET",
|
|
33
|
+
"title": "quiet unknown non-idle is admitted, so sendMessage runs in the manual-compact start race",
|
|
34
|
+
"subject": "pi-extensions/lib/compaction-send-guard.ts",
|
|
35
|
+
"find": ["\tif (!facts.hasAgentSignal) return BUSY_SEND_REJECT;"],
|
|
36
|
+
"replace": ["\t// quiet unknown no longer rejects"],
|
|
37
|
+
"gate": ["bash", "run.sh", "check-compaction-send-guard"],
|
|
38
|
+
"timeoutSeconds": 60,
|
|
39
|
+
"signature": "[QK:COMPACT-SEND-REJECT-QUIET]",
|
|
40
|
+
"signatureSource": "scripts/check-compaction-send-guard.ts"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"claim": "COMPACT-SEND-ADMIT-IDLE",
|
|
44
|
+
"title": "idle no longer recovers a missed session_compact, so a later stream stays falsely refused",
|
|
45
|
+
"subject": "pi-extensions/lib/compaction-send-guard.ts",
|
|
46
|
+
"find": [
|
|
47
|
+
"\tif (facts.idle) {",
|
|
48
|
+
"\t\t// Idle means Pi is neither in an agent run nor compacting. Also recovers a",
|
|
49
|
+
"\t\t// missed `session_compact` so a later ordinary stream is not stuck refused.",
|
|
50
|
+
"\t\tguard.armed = false;",
|
|
51
|
+
"\t\treturn null;",
|
|
52
|
+
"\t}"
|
|
53
|
+
],
|
|
54
|
+
"replace": ["\t// idle no longer admits or disarms"],
|
|
55
|
+
"gate": ["bash", "run.sh", "check-compaction-send-guard"],
|
|
56
|
+
"timeoutSeconds": 60,
|
|
57
|
+
"signature": "[QK:COMPACT-SEND-ADMIT-IDLE]",
|
|
58
|
+
"signatureSource": "scripts/check-compaction-send-guard.ts"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"claim": "COMPACT-SEND-ADMIT-STREAM",
|
|
62
|
+
"title": "a live agent run is refused, so idle/일반 streaming steer/followUp is no longer preserved",
|
|
63
|
+
"subject": "pi-extensions/lib/compaction-send-guard.ts",
|
|
64
|
+
"find": ["\treturn null; // live agent run — steer/followUp unchanged"],
|
|
65
|
+
"replace": ["\treturn COMPACTION_SEND_REJECT; // live agent run no longer admitted"],
|
|
66
|
+
"gate": ["bash", "run.sh", "check-compaction-send-guard"],
|
|
67
|
+
"timeoutSeconds": 60,
|
|
68
|
+
"signature": "[QK:COMPACT-SEND-ADMIT-STREAM]",
|
|
69
|
+
"signatureSource": "scripts/check-compaction-send-guard.ts"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"claim": "COMPACT-SEND-WIRE",
|
|
73
|
+
"title": "the send path skips the leaf and still calls pi.sendMessage during compaction",
|
|
74
|
+
"subject": "pi-extensions/entwurf-control.ts",
|
|
75
|
+
"find": [
|
|
76
|
+
"\t\tconst compactionReject = compactionSendReject(state.compaction, {",
|
|
77
|
+
"\t\t\tidle: ctx.isIdle(),",
|
|
78
|
+
"\t\t\thasAgentSignal: ctx.signal !== undefined,",
|
|
79
|
+
"\t\t});",
|
|
80
|
+
"\t\tif (compactionReject) {",
|
|
81
|
+
"\t\t\trespond(false, \"send\", undefined, compactionReject);",
|
|
82
|
+
"\t\t\treturn;",
|
|
83
|
+
"\t\t}"
|
|
84
|
+
],
|
|
85
|
+
"replace": ["\t\t// compaction send guard removed"],
|
|
86
|
+
"gate": ["bash", "run.sh", "check-compaction-send-guard"],
|
|
87
|
+
"timeoutSeconds": 60,
|
|
88
|
+
"signature": "[QK:COMPACT-SEND-WIRE]",
|
|
89
|
+
"signatureSource": "scripts/check-compaction-send-guard.ts"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"claim": "COMPACT-SEND-EVENTS",
|
|
93
|
+
"title": "session_before_compact no longer arms the resident guard",
|
|
94
|
+
"subject": "pi-extensions/entwurf-control.ts",
|
|
95
|
+
"find": ["\tpi.on(\"session_before_compact\", () => {", "\t\tnoteCompactionBefore(state.compaction);", "\t});"],
|
|
96
|
+
"replace": ["\t// session_before_compact no longer arms"],
|
|
97
|
+
"gate": ["bash", "run.sh", "check-compaction-send-guard"],
|
|
98
|
+
"timeoutSeconds": 60,
|
|
99
|
+
"signature": "[QK:COMPACT-SEND-EVENTS]",
|
|
100
|
+
"signatureSource": "scripts/check-compaction-send-guard.ts"
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "entwurf-peers",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "PEERS-OBSERVATION-BUDGET",
|
|
7
|
+
"title": "the peers presentation limit is accepted but the full historical store is still observed",
|
|
8
|
+
"subject": "pi-extensions/lib/entwurf-fact-provider.ts",
|
|
9
|
+
"find": [
|
|
10
|
+
"\t\tselectedObserve = (identity) => (observedGardenIds.has(identity.gardenId) ? observe(identity) : UNOBSERVED_PEER);"
|
|
11
|
+
],
|
|
12
|
+
"replace": ["\t\tselectedObserve = observe;"],
|
|
13
|
+
"gate": ["bash", "run.sh", "check-entwurf-fact-provider"],
|
|
14
|
+
"timeoutSeconds": 60,
|
|
15
|
+
"signature": "[QK:PEERS-OBSERVATION-BUDGET]",
|
|
16
|
+
"signatureSource": "scripts/check-entwurf-fact-provider.ts"
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -147,7 +147,7 @@
|
|
|
147
147
|
"title": "native pi drops the required model field from fresh-call while the composition still expects one",
|
|
148
148
|
"subject": "pi-extensions/entwurf-control.ts",
|
|
149
149
|
"find": [
|
|
150
|
-
"\t\t\tmodel: Type.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: 200,\n\t\t\t\tpattern: \"^[A-Za-z0-9][A-Za-z0-9._/:\\\\[\\\\]-]*$\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Required runtime model: canonical provider/model for pi, a Claude Code model id/alias, or a Copilot model name
|
|
150
|
+
"\t\t\tmodel: Type.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: 200,\n\t\t\t\tpattern: \"^[A-Za-z0-9][A-Za-z0-9._/:\\\\[\\\\]-]*$\",\n\t\t\t\tdescription:\n\t\t\t\t\t\"Required runtime model: canonical provider/model for pi, a Claude Code model id/alias, or a Copilot/OMP/Codex model name.\",\n\t\t\t}),\n"
|
|
151
151
|
],
|
|
152
152
|
"replace": [""],
|
|
153
153
|
"gate": ["bash", "run.sh", "check-mux-fresh-call"],
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
"title": "the MCP bridge reads the caller garden id straight out of env instead of its authoritative self envelope",
|
|
161
161
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
162
162
|
"find": [
|
|
163
|
-
"\t\t\tconst self = await buildAuthoritativeSelfEnvelope();\n\t\t\tcallerGardenId = self.envelope.sessionId;"
|
|
163
|
+
"\t\t\tconst self = await buildAuthoritativeSelfEnvelope({ requestMeta: extra._meta });\n\t\t\tcallerGardenId = self.envelope.sessionId;"
|
|
164
164
|
],
|
|
165
165
|
"replace": ["\t\t\tcallerGardenId = process.env.PI_SESSION_ID ?? null;"],
|
|
166
166
|
"gate": ["bash", "run.sh", "check-mux-fresh-call"],
|
|
@@ -173,7 +173,7 @@
|
|
|
173
173
|
"title": "MCP drops the required model field from fresh-call while the composition still expects one",
|
|
174
174
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
175
175
|
"find": [
|
|
176
|
-
"\t\tmodel: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.max(200)\n\t\t\t// The `\\[` below is USELESS TO JS AND LOAD-BEARING TO THE HOST. zod emits this source\n\t\t\t// text verbatim as the JSON Schema `pattern`, and the host's tool-schema validator is a\n\t\t\t// Rust regex engine that rejects an unescaped `[` inside a character class as \"unclosed\n\t\t\t// character class\" — a 400 on tools/list that stops EVERY Claude session from opening\n\t\t\t// (7-M-fix). Biome's safe fix removes it; do not accept that fix. The suppression must\n\t\t\t// stay on the line DIRECTLY above the expression, or it attaches to nothing and reads\n\t\t\t// as an unused suppression while the escape goes back to being fixable.\n\t\t\t// biome-ignore lint/complexity/noUselessEscapeInRegex: emitted to a Rust regex validator, see above\n\t\t\t.regex(/^[A-Za-z0-9][A-Za-z0-9._/:\\[\\]-]*$/)\n\t\t\t.describe(\n\t\t\t\t\"Required runtime model: canonical provider/model for pi, a Claude Code model id/alias, or a Copilot model name
|
|
176
|
+
"\t\tmodel: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.max(200)\n\t\t\t// The `\\[` below is USELESS TO JS AND LOAD-BEARING TO THE HOST. zod emits this source\n\t\t\t// text verbatim as the JSON Schema `pattern`, and the host's tool-schema validator is a\n\t\t\t// Rust regex engine that rejects an unescaped `[` inside a character class as \"unclosed\n\t\t\t// character class\" — a 400 on tools/list that stops EVERY Claude session from opening\n\t\t\t// (7-M-fix). Biome's safe fix removes it; do not accept that fix. The suppression must\n\t\t\t// stay on the line DIRECTLY above the expression, or it attaches to nothing and reads\n\t\t\t// as an unused suppression while the escape goes back to being fixable.\n\t\t\t// biome-ignore lint/complexity/noUselessEscapeInRegex: emitted to a Rust regex validator, see above\n\t\t\t.regex(/^[A-Za-z0-9][A-Za-z0-9._/:\\[\\]-]*$/)\n\t\t\t.describe(\n\t\t\t\t\"Required runtime model: canonical provider/model for pi, a Claude Code model id/alias, or a Copilot/OMP/Codex model name.\",\n\t\t\t),\n"
|
|
177
177
|
],
|
|
178
178
|
"replace": [""],
|
|
179
179
|
"gate": ["bash", "run.sh", "check-mux-fresh-call"],
|
|
@@ -312,8 +312,8 @@
|
|
|
312
312
|
"claim": "FRESHCALL-BACKEND-SET-SURFACE-PARITY",
|
|
313
313
|
"title": "a backend the composition can open is missing from the MCP surface enum — the capability exists and no external host can reach it",
|
|
314
314
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
315
|
-
"find": ["\t\t\t.enum([\"pi\", \"claude-code\", \"copilot\", \"omp\"])"],
|
|
316
|
-
"replace": ["\t\t\t.enum([\"pi\", \"claude-code\", \"copilot\"])"],
|
|
315
|
+
"find": ["\t\t\t.enum([\"pi\", \"claude-code\", \"copilot\", \"omp\", \"codex\"])"],
|
|
316
|
+
"replace": ["\t\t\t.enum([\"pi\", \"claude-code\", \"copilot\", \"omp\"])"],
|
|
317
317
|
"gate": ["bash", "run.sh", "check-mux-fresh-call"],
|
|
318
318
|
"timeoutSeconds": 180,
|
|
319
319
|
"signature": "[QK:FRESHCALL-BACKEND-SET-SURFACE-PARITY]",
|
|
@@ -432,13 +432,24 @@
|
|
|
432
432
|
"claim": "FRESHCALL-BACKEND-SET-SURFACE-PARITY-PI",
|
|
433
433
|
"title": "a backend the composition can open is missing from the native pi surface enum — an in-process pi session cannot name a capability the module already opens",
|
|
434
434
|
"subject": "pi-extensions/entwurf-control.ts",
|
|
435
|
-
"find": ["\t\t\tbackend: StringEnum([\"pi\", \"claude-code\", \"copilot\", \"omp\"], {"],
|
|
436
|
-
"replace": ["\t\t\tbackend: StringEnum([\"pi\", \"claude-code\", \"copilot\"], {"],
|
|
435
|
+
"find": ["\t\t\tbackend: StringEnum([\"pi\", \"claude-code\", \"copilot\", \"omp\", \"codex\"], {"],
|
|
436
|
+
"replace": ["\t\t\tbackend: StringEnum([\"pi\", \"claude-code\", \"copilot\", \"omp\"], {"],
|
|
437
437
|
"gate": ["bash", "run.sh", "check-mux-fresh-call"],
|
|
438
438
|
"timeoutSeconds": 180,
|
|
439
439
|
"signature": "[QK:FRESHCALL-BACKEND-SET-SURFACE-PARITY-PI]",
|
|
440
440
|
"signatureSource": "test/fresh-call-surfaces.contract.test.ts"
|
|
441
441
|
},
|
|
442
|
+
{
|
|
443
|
+
"claim": "FRESHCALL-CODEX-HOME-DEFAULT",
|
|
444
|
+
"title": "an omitted Codex seat falls back to the caller's session instead of the one supported `codex` home topology",
|
|
445
|
+
"subject": "pi-extensions/lib/mux-fresh-call.ts",
|
|
446
|
+
"find": ["\tif (backend === \"codex\") return { tmuxSession: CODEX_HOME_TMUX_SESSION, source: \"codex-home\" };"],
|
|
447
|
+
"replace": ["\tif (backend === \"pi\") return { tmuxSession: CODEX_HOME_TMUX_SESSION, source: \"codex-home\" };"],
|
|
448
|
+
"gate": ["bash", "run.sh", "check-mux-fresh-call"],
|
|
449
|
+
"timeoutSeconds": 180,
|
|
450
|
+
"signature": "[QK:FRESHCALL-CODEX-HOME-DEFAULT]",
|
|
451
|
+
"signatureSource": "test/mux-fresh-call.test.ts"
|
|
452
|
+
},
|
|
442
453
|
{
|
|
443
454
|
"claim": "TMUXSESSION-LOOKUP-ENGINE",
|
|
444
455
|
"title": "the seat lookup goes back to the `-f` filter engine, which was measured to match EVERY session when the name contains a '}' — a fresh sibling then opens in whichever session tmux listed first",
|
|
@@ -512,7 +523,7 @@
|
|
|
512
523
|
"title": "one surface drops the optional seat from its schema, so opening a sibling in the operator's project session works from pi and silently cannot exist from the MCP bridge",
|
|
513
524
|
"subject": "mcp/entwurf-bridge/src/index.ts",
|
|
514
525
|
"find": [
|
|
515
|
-
"\t\tplacement: z\n\t\t\t.object({\n\t\t\t\ttmuxSession: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"EXACT name of an EXISTING session on this agent's own tmux server. Nothing is created: an absent session is refused as tmux-session-missing, and a name outside [A-Za-z0-9][A-Za-z0-9_-]* as tmux-session-name-invalid.\",\n\t\t\t\t\t),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Optional
|
|
526
|
+
"\t\tplacement: z\n\t\t\t.object({\n\t\t\t\ttmuxSession: z\n\t\t\t\t\t.string()\n\t\t\t\t\t.describe(\n\t\t\t\t\t\t\"EXACT name of an EXISTING session on this agent's own tmux server. Nothing is created: an absent session is refused as tmux-session-missing, and a name outside [A-Za-z0-9][A-Za-z0-9_-]* as tmux-session-name-invalid.\",\n\t\t\t\t\t),\n\t\t\t})\n\t\t\t.optional()\n\t\t\t.describe(\n\t\t\t\t\"Optional expert seat override: open the sibling in ONE EXISTING tmux session of this agent's own server. When omitted, Codex selects the exact existing `codex` home session; other backends use the caller's session. Nothing is ever created. Independent of cwd; neither is inferred from the other. The receipt reports the selected name, its source, and resolved target session id.\",\n\t\t\t),\n"
|
|
516
527
|
],
|
|
517
528
|
"replace": [""],
|
|
518
529
|
"gate": ["bash", "run.sh", "check-mux-fresh-call"],
|
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
"claim": "ADMISSION-FRESH-PARITY",
|
|
7
7
|
"title": "a post-#82 harness admitted as a full D6 citizen while entwurf_fresh_call cannot open it — the exact state the Bundle A+B candidate shipped in, where every gate was green and only prose said the backend was unsupported. This is the defect the whole gate exists for: without it, an `unsupported` note reads as a partial-release permit",
|
|
8
8
|
"subject": "pi-extensions/lib/mux-fresh-call.ts",
|
|
9
|
-
"find": [
|
|
10
|
-
|
|
9
|
+
"find": [
|
|
10
|
+
"export const FRESH_CALL_BACKENDS = [\"pi\", \"claude-code\", \"copilot\", \"omp\", \"codex\"] as const;"
|
|
11
|
+
],
|
|
12
|
+
"replace": ["export const FRESH_CALL_BACKENDS = [\"pi\", \"claude-code\", \"copilot\", \"codex\"] as const;"],
|
|
11
13
|
"gate": ["bash", "run.sh", "check-harness-admission-parity"],
|
|
12
14
|
"timeoutSeconds": 300,
|
|
13
15
|
"signature": "[QK:ADMISSION-FRESH-PARITY]",
|
|
@@ -117,8 +119,8 @@
|
|
|
117
119
|
"claim": "FRESHCALL-BACKEND-SET-SURFACE-PARITY-SKILL",
|
|
118
120
|
"title": "a backend added to the composition and both schema surfaces but not to the operator skill — the third public surface step 9 names, and the one that had no gate at all. The skill is what an operator reads to decide what can be opened, so a stale list makes the backend unreachable in practice exactly the way a missing enum value makes it unreachable in schema",
|
|
119
121
|
"subject": ".claude/skills/entwurf-dev/SKILL.md",
|
|
120
|
-
"find": ["backend는 정확히 `pi | claude-code | copilot | omp`이고"],
|
|
121
|
-
"replace": ["backend는 정확히 `pi | claude-code | copilot`이고"],
|
|
122
|
+
"find": ["backend는 정확히 `pi | claude-code | copilot | omp | codex`이고"],
|
|
123
|
+
"replace": ["backend는 정확히 `pi | claude-code | copilot | omp`이고"],
|
|
122
124
|
"gate": ["bash", "run.sh", "check-mux-fresh-call"],
|
|
123
125
|
"timeoutSeconds": 300,
|
|
124
126
|
"signature": "[QK:FRESHCALL-BACKEND-SET-SURFACE-PARITY-SKILL]",
|
|
@@ -214,6 +214,19 @@
|
|
|
214
214
|
"timeoutSeconds": 180,
|
|
215
215
|
"signature": "[QK:PI-DOCTOR-IS-RELEASE-MUST]",
|
|
216
216
|
"signatureSource": "scripts/check-release-gate-outcomes.ts"
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"claim": "CODEX-FIRST-ADMISSION-IS-RELEASE-MUST",
|
|
220
|
+
"title": "the Codex first-admission smoke stays listed but bypasses run_live_step, so a missing LIVE prerequisite returns SKIP into a branch that never classifies it and the cut reads green",
|
|
221
|
+
"subject": "run.sh",
|
|
222
|
+
"find": [
|
|
223
|
+
" run_live_step \"smoke-codex-fresh-live (#95: visible Pi -> visible Codex/callback/addressed v2 -> visible Pi/callback)\" gate bash \"$self\" smoke-codex-fresh-live"
|
|
224
|
+
],
|
|
225
|
+
"replace": [" bash \"$self\" smoke-codex-fresh-live"],
|
|
226
|
+
"gate": ["bash", "run.sh", "check-release-gate-outcomes"],
|
|
227
|
+
"timeoutSeconds": 180,
|
|
228
|
+
"signature": "[QK:CODEX-FIRST-ADMISSION-IS-RELEASE-MUST]",
|
|
229
|
+
"signatureSource": "scripts/check-release-gate-outcomes.ts"
|
|
217
230
|
}
|
|
218
231
|
]
|
|
219
232
|
}
|
|
@@ -127,12 +127,64 @@
|
|
|
127
127
|
"\t\"CANONICAL DELIVERY SURFACE for garden ids: message, reply, or hand off to whoever an id names. The id \" +"
|
|
128
128
|
],
|
|
129
129
|
"replace": [
|
|
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 \" +"
|
|
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 \" +\n\t\t\"PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING PADDING \" +"
|
|
131
131
|
],
|
|
132
132
|
"gate": ["bash", "run.sh", "check-entwurf-v2-surface"],
|
|
133
133
|
"timeoutSeconds": 60,
|
|
134
134
|
"signature": "[QK:V2SURF-DESC-FITS-HOST-CAP]",
|
|
135
135
|
"signatureSource": "scripts/check-entwurf-v2-surface.ts"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"claim": "NATIVE-PUSH-SENDER-ENVELOPE",
|
|
139
|
+
"title": "native-push direct injection reverts to the raw plan message, so a directly-injected citizen receives a body with no sender envelope and cannot name who called it",
|
|
140
|
+
"subject": "pi-extensions/lib/entwurf-v2-native-push.ts",
|
|
141
|
+
"find": [
|
|
142
|
+
"\t\tconst content = sender ? formatMetaMailboxBody(sender, plan.message, plan.wantsReply) : plan.message;"
|
|
143
|
+
],
|
|
144
|
+
"replace": ["\t\tconst content = plan.message;"],
|
|
145
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-production"],
|
|
146
|
+
"timeoutSeconds": 120,
|
|
147
|
+
"signature": "[QK:NATIVE-PUSH-SENDER-ENVELOPE]",
|
|
148
|
+
"signatureSource": "scripts/check-entwurf-v2-production.ts"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"claim": "NATIVE-PUSH-SENDER-PROVIDER-WIRING",
|
|
152
|
+
"title": "the production factory stops handing its one senderProvider to the native-push hand, so the render is reachable but never fed and every direct injection silently falls back to raw",
|
|
153
|
+
"subject": "pi-extensions/lib/entwurf-v2-production.ts",
|
|
154
|
+
"find": [
|
|
155
|
+
"\t\tsendNativePush: makeNativePushSend({\n\t\t\tresolveAdapter: io.resolveNativePushAdapter,\n\t\t\tsenderProvider: opts.senderProvider,\n\t\t}),"
|
|
156
|
+
],
|
|
157
|
+
"replace": ["\t\tsendNativePush: makeNativePushSend({ resolveAdapter: io.resolveNativePushAdapter }),"],
|
|
158
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-production"],
|
|
159
|
+
"timeoutSeconds": 120,
|
|
160
|
+
"signature": "[QK:NATIVE-PUSH-SENDER-PROVIDER-WIRING]",
|
|
161
|
+
"signatureSource": "scripts/check-entwurf-v2-production.ts"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"claim": "NATIVE-PUSH-SENDER-BEFORE-ADAPTER",
|
|
165
|
+
"title": "the send hand resolves the native-push adapter before the sender envelope, so a failing envelope source fails with the target's adapter already in hand instead of before anything was touched",
|
|
166
|
+
"subject": "pi-extensions/lib/entwurf-v2-native-push.ts",
|
|
167
|
+
"find": [
|
|
168
|
+
"\t\tconst sender = senderProvider?.();\n\t\tconst content = sender ? formatMetaMailboxBody(sender, plan.message, plan.wantsReply) : plan.message;\n\t\tconst adapter = resolveAdapter(plan.backend);"
|
|
169
|
+
],
|
|
170
|
+
"replace": [
|
|
171
|
+
"\t\tconst adapter = resolveAdapter(plan.backend);\n\t\tconst sender = senderProvider?.();\n\t\tconst content = sender ? formatMetaMailboxBody(sender, plan.message, plan.wantsReply) : plan.message;"
|
|
172
|
+
],
|
|
173
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-production"],
|
|
174
|
+
"timeoutSeconds": 120,
|
|
175
|
+
"signature": "[QK:NATIVE-PUSH-SENDER-BEFORE-ADAPTER]",
|
|
176
|
+
"signatureSource": "scripts/check-entwurf-v2-production.ts"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"claim": "NATIVE-PUSH-RETRY-BYTE-IDENTITY",
|
|
180
|
+
"title": "the one permitted retry decorates the replayed body, so the second attempt delivers bytes that disagree with the first attempt the target may already have accepted",
|
|
181
|
+
"subject": "pi-extensions/lib/entwurf-v2-native-push.ts",
|
|
182
|
+
"find": ["\t\tawait adapter.send(reprobe.route, nativeSessionId, content);"],
|
|
183
|
+
"replace": ["\t\tawait adapter.send(reprobe.route, nativeSessionId, `${content} (retry)`);"],
|
|
184
|
+
"gate": ["bash", "run.sh", "check-entwurf-v2-native-push"],
|
|
185
|
+
"timeoutSeconds": 120,
|
|
186
|
+
"signature": "[QK:NATIVE-PUSH-RETRY-BYTE-IDENTITY]",
|
|
187
|
+
"signatureSource": "scripts/check-entwurf-v2-native-push.ts"
|
|
136
188
|
}
|
|
137
189
|
]
|
|
138
190
|
}
|
|
@@ -551,7 +551,8 @@ send-message-v2` spins a fresh thread, not the live one.
|
|
|
551
551
|
|
|
552
552
|
Copilot is a GitHub **harness** (issues, PR, CI, model `auto`, mode `autopilot`,
|
|
553
553
|
remote/delegate), not a second GPT provider next to pi. This makes a native lane
|
|
554
|
-
product-distinct from
|
|
554
|
+
product-distinct from Codex's separate native-push lane (#95, unreleased candidate):
|
|
555
|
+
Copilot can own GitHub work while
|
|
555
556
|
implementation checkpoints arrive from another garden id. That split is operator
|
|
556
557
|
etiquette plus dispatch, not a substrate role system.
|
|
557
558
|
|
|
@@ -4,10 +4,10 @@ Lane: `docs/adding-a-harness.md` step 1 (six measurements) + §3.5 citizen scope
|
|
|
4
4
|
tool-name dialect + step 6's join. The oracle is the vendor artifact or the vendor process,
|
|
5
5
|
never our assembler.
|
|
6
6
|
|
|
7
|
-
This file is a MEASUREMENT-ONLY ledger
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
This file is a MEASUREMENT-ONLY ledger of the **2026-09-08 step-1 state**. At that
|
|
8
|
+
measurement date, nothing here had been written by an Entwurf Codex installer, no
|
|
9
|
+
Codex meta-record had been minted, and no operator config had been edited. Later #95
|
|
10
|
+
candidate work exists; this dated ledger is evidence for it, not current product status.
|
|
11
11
|
|
|
12
12
|
Evidence-state vocabulary: **[source]** = read at `file:line` in the vendor checkout;
|
|
13
13
|
**[host]** = measured on this host (`oracle`, 2026-09-08 KST) with the receipt named;
|
|
@@ -207,11 +207,11 @@ it carried is what S1b-B was run to settle.)*
|
|
|
207
207
|
(`thread/queue/add|start|list|…`) that did not exist at 0.136. No hook or extension wake
|
|
208
208
|
surface was added (see M1). The measured route is unchanged and green: **M-B** below.
|
|
209
209
|
|
|
210
|
-
## M5 — Parent process topology (
|
|
210
|
+
## M5 — Parent process topology (measured refutation of a universal join)
|
|
211
211
|
|
|
212
|
-
The
|
|
213
|
-
|
|
214
|
-
that
|
|
212
|
+
The then-current `docs/adding-a-harness.md` step 6 asked whether
|
|
213
|
+
`hook.ppid == mcp.ppid == harness host pid`. The measurement below preserves the
|
|
214
|
+
answer and explains why that equality is not a universal sender-identity contract.
|
|
215
215
|
|
|
216
216
|
**Embedded mode** (a standalone `codex` TUI with its own `CODEX_HOME`, no app-server):
|
|
217
217
|
|
|
@@ -240,23 +240,20 @@ pid=1733 (entwurf-bridge) ppid=1393 # 1393 = codex app-server --listen
|
|
|
240
240
|
pid=1616 # = the plain codex TUI. Not the parent.
|
|
241
241
|
```
|
|
242
242
|
|
|
243
|
-
|
|
244
|
-
|
|
243
|
+
In the delivery-capable mode, `hook.ppid == mcp.ppid`, but both resolve to the
|
|
244
|
+
app-server rather than to an attached TUI.
|
|
245
245
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
one is not a measurement. Independent audit (terra, 2026-09-08) caught the missing label.
|
|
251
|
-
**It has since been measured directly — see S1b-C below — and the answer is the one the
|
|
252
|
-
inference guessed:** two live threads on one app-server, two separate visible TUIs, and every
|
|
253
|
-
hook and every MCP child of BOTH threads reports the same `ppid`.
|
|
246
|
+
The first draft inferred that this app-server was shared across citizens. Independent
|
|
247
|
+
audit caught the missing evidence label; **S1b-C** then measured it directly: two live
|
|
248
|
+
threads, two visible TUIs, and every hook/MCP child of both threads reported the same
|
|
249
|
+
parent pid.
|
|
254
250
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
251
|
+
That is the result: a parent-pid marker would be one marker for N Codex citizens. The
|
|
252
|
+
topology is useful negative evidence, not the Codex join. **S1b-D** found the
|
|
253
|
+
vendor-authoritative alternative on each MCP request, and the current candidate strictly
|
|
254
|
+
joins that request metadata to `record.nativeSessionId`. Other measured harnesses still
|
|
255
|
+
use pid/start-key markers where their vendor topology makes that carrier authoritative;
|
|
256
|
+
the general doctrine is the vendor-authoritative record join.
|
|
260
257
|
|
|
261
258
|
**[host]** A second consequence, measured on the same two runs: the hook's environment is the
|
|
262
259
|
HOST process's snapshot, so it changes with the mode.
|
|
@@ -646,11 +643,11 @@ identifier**, and `record.nativeSessionId = threadId` needs no mapping layer. Th
|
|
|
646
643
|
`nativeIdLabel: "threadId"` in `pi/entwurf-capabilities.json` is, on this axis, correct — which
|
|
647
644
|
is worth saying precisely, because its `deliveryLevel: "D6"` on the same row still is not.
|
|
648
645
|
|
|
649
|
-
**What this
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
646
|
+
**What this changed on 2026-09-08.** The step-6 question did not need a parent-pid
|
|
647
|
+
marker on Codex: every call named the thread. At that measurement date the bridge only
|
|
648
|
+
read a complete pi env pair or a native pid marker, so consuming `_meta` still required
|
|
649
|
+
new code. The later #95 candidate implements a strict request-metadata join; that later
|
|
650
|
+
implementation is not evidence supplied by this ledger.
|
|
654
651
|
|
|
655
652
|
One vendor fact this run also surfaced, recorded because it belongs to step 9 clause 2: the
|
|
656
653
|
first `tools/call` raised an interactive approval prompt —
|
|
@@ -660,24 +657,95 @@ beside the model-facing `mcp__entwurf_bridge__entwurf_peers`. Copilot's "one too
|
|
|
660
657
|
lesson repeats here. `entwurf_peers` itself answered from that session, which is the plain
|
|
661
658
|
external-MCP-host row of `docs/external-mcp-host.md` behaving as designed.
|
|
662
659
|
|
|
663
|
-
##
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
660
|
+
## S1c — vendor queue and visible-fresh argv (2026-09-10)
|
|
661
|
+
|
|
662
|
+
Codex 0.153.4 has the narrow delivery primitive this lane was missing:
|
|
663
|
+
|
|
664
|
+
```sh
|
|
665
|
+
codex queue \
|
|
666
|
+
--remote unix://$SOCKET \
|
|
667
|
+
--thread 01a08bb0-999a-71b2-be36-357eedc26542 \
|
|
668
|
+
--message 'Reply exactly CODEX-QUEUE-Q1'
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
The command exited 0 and printed one explicit acceptance receipt:
|
|
672
|
+
|
|
673
|
+
```text
|
|
674
|
+
Queued message 01a08bb2-c70f-75f3-88c6-48cdffa4d64d for thread 01a08bb0-999a-71b2-be36-357eedc26542.
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
The attached TUI produced `CODEX-QUEUE-Q1`. A second run queued a turn that executed
|
|
678
|
+
`sleep 12`; a third message was queued immediately while that turn was active. The CLI returned
|
|
679
|
+
two different message ids, and the TUI completed `CODEX-QUEUE-Q2` before
|
|
680
|
+
`CODEX-QUEUE-Q3`. **The vendor owns queue serialization and message identity.** Entwurf should
|
|
681
|
+
exec this command once and validate its receipt; it should not recreate `turn/start`, a second
|
|
682
|
+
queue, or an idempotency ledger. A nonexistent thread exited 1 with
|
|
683
|
+
`thread/queue/add failed: failed to read thread: invalid thread-store request: no rollout found`
|
|
684
|
+
and no acceptance receipt.
|
|
685
|
+
|
|
686
|
+
The ordinary pnpm-installed binary also owns the usable app-server shape:
|
|
687
|
+
|
|
688
|
+
```sh
|
|
689
|
+
codex app-server --listen unix://$SOCKET
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
It created a mode-0600 UDS and served WebSocket JSON-RPC. By contrast,
|
|
693
|
+
`codex app-server daemon start` refused this installation because its managed-daemon path
|
|
694
|
+
requires `~/.codex/packages/standalone/current/codex`. Entwurf must not install that separate
|
|
695
|
+
vendor runtime or hide this distinction behind a wrapper: the lightweight contract is to
|
|
696
|
+
detect one already-running ordinary app-server at the fixed vendor socket.
|
|
697
|
+
|
|
698
|
+
The complete fresh argv was then exercised against that app-server:
|
|
699
|
+
|
|
700
|
+
```sh
|
|
701
|
+
codex \
|
|
702
|
+
--remote unix://$SOCKET \
|
|
703
|
+
--model gpt-5.6-sol \
|
|
704
|
+
--dangerously-bypass-approvals-and-sandbox \
|
|
705
|
+
--no-alt-screen \
|
|
706
|
+
'Call mcp__entwurf_bridge__entwurf_peers as your first action …'
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
The visible TUI reported `gpt-5.6-sol high` and `YOLO`; MCP startup completed; the first turn
|
|
710
|
+
called `entwurf-bridge.entwurf_peers` successfully. `--no-alt-screen` was only an observation
|
|
711
|
+
aid and is not part of the launch contract. The fixed launch facts are `--remote`, explicit
|
|
712
|
+
`--model`, the explicit task-wide permission token, and one positional first prompt. Unlike the
|
|
713
|
+
OMP race, the Codex MCP tool was callable on that first turn.
|
|
714
|
+
|
|
715
|
+
The same socket accepted
|
|
716
|
+
`thread/name/set {threadId,name:"20260910T235959-codex"}` with `{}` and the attached TUI
|
|
717
|
+
immediately rendered `Session renamed to 20260910T235959-codex`; a second call restored the
|
|
718
|
+
captured preimage `Entwirf raw queue probe Q1`. This closes the naming primitive only. The
|
|
719
|
+
current footer did not include `thread-title`, so the separate user-config atom remains necessary
|
|
720
|
+
before a garden id is continuously visible.
|
|
721
|
+
|
|
722
|
+
One lifecycle caveat is now bounded rather than hidden. Closing a TUI client does not
|
|
723
|
+
immediately remove its thread from `thread/loaded/list`; the vendor keeps a loaded thread after
|
|
724
|
+
the last subscriber disconnects and unloads it after 30 minutes without subscribers or thread
|
|
725
|
+
activity (`app-server/README.md`, `thread/unsubscribe`). During that vendor-owned loaded lifetime
|
|
726
|
+
`codex queue` remains the acceptance boundary. This is not a pane/process liveness claim and must
|
|
727
|
+
not be re-described as one.
|
|
728
|
+
|
|
729
|
+
These observations make 0.153.4 the first measured coordinate, **not a hard product floor**.
|
|
730
|
+
No silent older-version failure has been measured, so Entwurf should report drift and fail a
|
|
731
|
+
missing capability, not invent a lower-bound promise.
|
|
732
|
+
|
|
733
|
+
## What this dated measurement did NOT establish
|
|
734
|
+
|
|
735
|
+
- The source layer was independently audited on 2026-09-08 (terra, commit `87ac7ad`):
|
|
736
|
+
**20/20 quotations CONFIRMED**. The later S1b sections had no second reader then.
|
|
737
|
+
- Evidence was L4 at best: one Linux host (`oracle`, aarch64, NixOS), Codex 0.153.4,
|
|
738
|
+
one run per claim except M-B.
|
|
739
|
+
- **As of the 2026-09-08 measurement**, no Entwurf Codex unit had been built or
|
|
740
|
+
installed, no product record/doctor existed, and steps 3–10 were untouched by that
|
|
741
|
+
lane. These are historical scope statements, not claims about the later candidate.
|
|
742
|
+
- Step 2 was already present but unearned at that date: registry/capability rows named
|
|
743
|
+
Codex before a production channel existed. Later #95 code supplies the candidate
|
|
744
|
+
record/native-push/fresh path; its parser, env-boundary, setup, preflight, and clause-7
|
|
745
|
+
amendments plus deep/installed-host acceptance are outside this raw ledger.
|
|
746
|
+
- The hook-trust and visible-name questions were closed by S1b-A/B. The remaining
|
|
747
|
+
release evidence is owned by the current candidate's gates and actual host, not by
|
|
748
|
+
reinterpreting these measurements.
|
|
681
749
|
- *(Two entries lived here until 2026-09-08 and are now **closed by measurement**, not moved:
|
|
682
750
|
"clause 4 has no working candidate" was retired by **S1b-B**, and "the hook trust gate has no
|
|
683
751
|
measured non-interactive path" by **S1b-A**. What each one costs is stated in its section.)*
|
|
@@ -128,9 +128,11 @@ async function main(): Promise<void> {
|
|
|
128
128
|
try {
|
|
129
129
|
// ── 1. probe the REAL conversation directly (route diagnostics; proves the live host) ──
|
|
130
130
|
const probe = await antigravityAdapter.probe(conversationId);
|
|
131
|
-
if (probe.status === "alive") {
|
|
131
|
+
if (probe.status === "alive" && probe.route.backend === "antigravity") {
|
|
132
132
|
artifacts["route"] = probe.route.lsAddress;
|
|
133
133
|
console.log(` .. probe: alive via ${probe.route.lsAddress}`);
|
|
134
|
+
} else if (probe.status === "alive") {
|
|
135
|
+
artifacts["probe"] = `alive with unexpected ${probe.route.backend} route`;
|
|
134
136
|
} else {
|
|
135
137
|
artifacts["probe"] = `${probe.status}: ${probe.reason}`;
|
|
136
138
|
}
|