feat(engine): manifest set — two grammars, never mixed#508
Merged
Conversation
This was referenced Jul 22, 2026
Merged
Merged
leeovery
force-pushed
the
feat/batch-task-map
branch
from
July 23, 2026 11:04
ea00805 to
9d4cedd
Compare
leeovery
force-pushed
the
feat/set-grammar-uniform
branch
from
July 23, 2026 11:04
014be35 to
49f3fb9
Compare
leeovery
force-pushed
the
feat/batch-task-map
branch
from
July 23, 2026 12:29
9d4cedd to
b70a64a
Compare
leeovery
force-pushed
the
feat/set-grammar-uniform
branch
from
July 23, 2026 12:29
49f3fb9 to
5da39dc
Compare
leeovery
force-pushed
the
feat/batch-task-map
branch
from
July 23, 2026 12:30
b70a64a to
85501f5
Compare
leeovery
force-pushed
the
feat/set-grammar-uniform
branch
from
July 23, 2026 12:30
5da39dc to
1d3e4df
Compare
The batch grammar was born asymmetric: a positional first pair, then field=value extras — a compatibility artifact from bolting batching onto the original three-arg verb. A model emitting a batch had to remember pair 1 is space-separated and pairs 2+ are assigned; getting it backwards sets a field literally named "task_map.x=y" or feeds a field name as a value. Now: the three-arg positional form is the single-field shorthand; a batch is uniform <field>=<value> pairs (routed on "=" in the first field argument — field names never carry one); mixing them is refused loudly, naming both grammars. Project set is single-form only (no caller ever batched it). Swept every caller in the same change — nine prose sites, the legacy-split apply script, and the two test suites; the engine and prose ship together, so the mixed form dies with no compat window. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
leeovery
force-pushed
the
feat/set-grammar-uniform
branch
from
July 23, 2026 12:31
1d3e4df to
7d3919b
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stage 4 of the batching programme (design log: #504; base: #507). Lee's review catch on #507: the batch form's positional-first-pair-then-assigned-extras asymmetry.
Why
The mixed grammar was a compatibility artifact from bolting batching onto the original three-arg
set. It reads wrong, and it's a misfire surface: a model must remember pair 1 is positional and pairs 2+ are assigned — backwards, it sets a field literally namedtask_map.x=yor feeds a field name as a value. No CLI convention mixes like this; uniformkey=valueis the standard multi-assign shape.What
set <path> <field> <value>— unchanged, everywhere.set <path> <field>=<value> [<field>=<value> …]— every pair identical, split on the first=, routed on=in the first field argument (field names never carry one, values with=still work in both forms).Every caller swept in the same change (engine and prose ship together — no compat window): nine prose sites (initialize-plan, both session-setups, plan-construction, define-phases, author-tasks, process-review-findings, write-tasks, initialize-specification), the legacy-split
apply.cjs(caught by its own suite going red — the one programmatic caller), both test suites, USAGE/commands.md/CLAUDE.md.Test plan
=; mixed refused with nothing written; project extras refused.npm test1556/1556,test:cligreen, conventions lint 27/27, typecheck clean.🤖 Generated with Claude Code
Stack