@@ -105,7 +105,7 @@ Consequences, applied to today's code:
105105| :--- | :--- |
106106| The five grammar renderers G1–G5 | which grammar each event group uses, and the word tables filling it |
107107| Ordered-fallback field extraction machinery, ` tool_input_of ` (` contract.py:139-150 ` ) | the per-vendor key chains (e.g. path = ` file_path→absolute_path→path ` ` gemini_cli.py:79 ` ; content gated to write tools ` gemini_cli.py:71-73 ` ; output = ` last_assistant_message ` ` junie.py:65 ` ) |
108- | ` degrade() ` semantics (` dispatch.py:26-38 ` ) and its generated-runtime twin (` bundler_templates.py:26-40 ` ) | per-gate capability flags (` honours_ask ` , ` honours_rewrite ` , ` honours_block ` ) and the degradation-note strings, verbatim from today's adapters so wire output stays byte-identical |
108+ | ` degrade() ` semantics (` dispatch.py:26-38 ` ) and its generated-runtime twin (` bundler_templates.py:26-40 ` ) | per-gate capability flags (` honours_escalate ` , ` honours_transform ` , ` honours_block ` ) and the degradation-note strings, verbatim from today's adapters so wire output stays byte-identical |
109109| Shape-inference ` claims ` /event-naming for cursor, windsurf, antigravity (` cursor.py:96-98 ` , ` windsurf.py:27-32 ` , ` antigravity.py:25-31 ` ) | marker-based ` claims ` : required markers, foreign markers, client_type allowlists (` junie.py:45-48 ` , ` tabnine.py:52-55 ` , ` gemini_cli.py:57-64 ` , ` codex_cli.py:43-52 ` ) |
110110| vscode_copilot's memory-tool argument scheme (` vscode_copilot.py:77-83,103-107 ` ) | ` MEMORY_TOOLS ` / ` WRITE_TOOLS ` / ` SHELL_TOOLS ` name lists |
111111| kimi's TOML emitter (` kimi_code.py:155-164 ` ) — one renderer, selected by ` config_format ` | ` config_path ` , ` config_format ` , hook-entry wrapper style and extra entry fields (` commandWindows ` ` codex_cli.py:137 ` , ` name ` ` tabnine.py:113 ` , ` failClosed ` +` version ` ` cursor.py:225-228 ` , group nesting ` antigravity.py:117-127 ` , no-wrapper ` devin.py:121-132 ` , extra ` pre_mcp_tool_use ` wiring ` windsurf.py:106-107 ` ) |
@@ -152,13 +152,13 @@ Consequences, applied to today's code:
152152 " bare_allow" : " inert" , // allow_semantics.py:70-77 key, cross-checked
153153 " answer_events" : [" BeforeTool" , " AfterTool" , " BeforeAgent" , " AfterAgent" ],
154154 " gates" : { // gemini_cli.py:104-121
155- " BeforeTool" : { " grammar" : " G1" , " honours_ask " : true , " honours_rewrite " : true },
156- " AfterTool" : { " grammar" : " G1" , " honours_ask " : false },
157- " BeforeAgent" : { " grammar" : " G1" , " honours_ask " : false },
158- " AfterAgent" : { " grammar" : " G1" , " honours_ask " : false }
155+ " BeforeTool" : { " grammar" : " G1" , " honours_escalate " : true , " honours_transform " : true },
156+ " AfterTool" : { " grammar" : " G1" , " honours_escalate " : false },
157+ " BeforeAgent" : { " grammar" : " G1" , " honours_escalate " : false },
158+ " AfterAgent" : { " grammar" : " G1" , " honours_escalate " : false }
159159 },
160160 " words" : { " allow" : " allow" , " deny" : " deny" , " ask" : " ask" , " block" : " deny" },
161- " rewrite_grammar " : " hook_specific_tool_input" , // gemini_cli.py:119-120
161+ " transform_grammar " : " hook_specific_tool_input" , // gemini_cli.py:119-120
162162 " degrade_notes" : { // verbatim today's strings, gemini_cli.py:109-117
163163 " ask_unhonoured" : " %s (confirmation required; %s cannot prompt from a hook)"
164164 }
@@ -167,7 +167,15 @@ Consequences, applied to today's code:
167167}
168168```
169169
170- Where the degradation lives (the brief's codex question): ` honours_ask: false ` on the
170+ Field names above (` honours_escalate ` , ` honours_transform ` , ` transform_grammar ` ) follow the
171+ post-W35 ACS vocabulary (` contract.py ` : ` escalate ` /` transform ` ), not the pre-ACS ` ask ` /
172+ ` rewrite ` this section was drafted with at W31, before ACS alignment was sequenced ahead of
173+ D2 (org-plan ` plan/agentseam-project.md ` : "D2 schema (written in ACS words)"). Vendor
174+ wire-word * data* is untouched by that rename: ` vocabulary ` /` words ` above are correct as
175+ written, because that is the literal word gemini_cli's own dialect speaks on the wire, not
176+ agentseam's name for the concept.
177+
178+ Where the degradation lives (the brief's codex question): ` honours_escalate: false ` on the
171179gate + the vendor's note string. codex_cli's ask→deny with * "Codex CLI does not support
172180ask; asking would fail open"* (` codex_cli.py:121-124 ` ) is a flag plus a string — no
173181conditional survives in config. The engine's degrade step already exists twice
@@ -269,7 +277,7 @@ instructions/capture suites (untouched paths).
269277** Must be written:**
270278
2712791 . Config schema validation: every ` data/vendors/*.json ` validates; unknown keys are
272- an error (a typo'd ` honours_ask ` must fail loud, not fail open).
280+ an error (a typo'd ` honours_escalate ` must fail loud, not fail open).
2732812 . Config completeness: every ` ADAPTERS ` name is config-backed; every config gate maps
274282 to a matrix block-capable event; ` config_path ` /` bare_allow ` agree with
275283 ` MATRIX ` /` ALLOW_SEMANTICS ` .
@@ -307,12 +315,19 @@ first, D3/D4 swap cleanly — they share only D1+D2.
307315
308316- ** [ h] ** Bundle size estimates in §4 are composition arithmetic, not measurements;
309317 D3 should publish real numbers next to them.
310- - ** [ h ] ** The ` reject_probes: ["looks_like_claude_code"] ` device (named engine
318+ - ** [ v ] ** (was [ h ] ) The ` reject_probes: ["looks_like_claude_code"] ` device (named engine
311319 predicates referenced from config) is the narrowest crack in the code/config line;
312320 if D2 finds more than ~ 3 named probes are needed, that is evidence the line is drawn
313- wrong, and the design should be revisited rather than the list grown.
321+ wrong, and the design should be revisited rather than the list grown. ** Answered by D2** :
322+ exactly one named probe (` looks_like_claude_code ` ), used by ` gemini_cli ` and ` devin ` --
323+ well inside the budget (`tests/test_vendor_config.py::
324+ test_reject_probes_stay_under_the_three_probe_budget`). The design stands as written.
314325- ** [ h] ** vscode_copilot's dual-casing may be cleaner as two config entries sharing a
315326 family than one entry with paired key chains; decide in D3 with the fixtures open.
316- - ** [ h] ** PR #89 's loader restores every JSON array as a tuple; ` fields ` chains here
317- are order-sensitive lists and unaffected, but D2 must confirm the loader's
318- tuple-restore doesn't collide with schema types.
327+ - ** [ v] ** (was [ h] ) PR #89 's loader restores every JSON array as a tuple; ` fields ` chains
328+ here are order-sensitive lists and unaffected, but D2 must confirm the loader's
329+ tuple-restore doesn't collide with schema types. ** Answered by D2** : a tuple preserves
330+ the exact sequence its JSON array was written in, so the restore is order-safe; nothing
331+ in ` vendor_config.py ` or its tests ever compares one of these tuples against a list
332+ literal with ` == ` (`tests/test_vendor_config.py::
333+ test_loader_tuple_restore_preserves_field_chain_order`).
0 commit comments