Skip to content

feat(engine): manifest set — two grammars, never mixed#508

Merged
leeovery merged 1 commit into
mainfrom
feat/set-grammar-uniform
Jul 23, 2026
Merged

feat(engine): manifest set — two grammars, never mixed#508
leeovery merged 1 commit into
mainfrom
feat/set-grammar-uniform

Conversation

@leeovery

@leeovery leeovery commented Jul 22, 2026

Copy link
Copy Markdown
Owner

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 named task_map.x=y or feeds a field name as a value. No CLI convention mixes like this; uniform key=value is the standard multi-assign shape.

What

  • Single field: set <path> <field> <value> — unchanged, everywhere.
  • Batch: 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).
  • Mixed: refused loudly, naming both grammars, nothing written.
  • Project set: single-form only — no caller ever batched it.

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

  • New grammar suite: uniform batch happy path; positional single incl. a value containing =; mixed refused with nothing written; project extras refused.
  • Full sweep validated by the suites that broke and re-greened: npm test 1556/1556, test:cli green, conventions lint 27/27, typecheck clean.

🤖 Generated with Claude Code

Stack

  1. feat(engine): discovery-map add-batch — the harvest persists in one call (D7) #505
  2. feat(engine): manifest apply — batched set/delete across one work unit (D7) #506
  3. refactor(prose): task-map family folds onto existing batch forms (D7, stage 3) #507
  4. feat(engine): manifest set — two grammars, never mixed #508 👈 current
  5. refactor(prose): dump/read folds — subtree gets replace per-topic loops (D7, stage 5) #509
  6. feat(engine): commit --plan — plan storage stages from recorded state (D7, stage 6) #510
  7. fix: batching-stack review round — re-resolve rewired, guards symmetric, hardening pinned #512
  8. fix: deep-dive round 2 — backbone rule flipped, pre-upgrade paths routed, flow bugs closed #513
  9. fix(review-r3): engine hardening + crash-resume seams #514
  10. feat(scoping): promotion routes through first-phase choice + bridge #515
  11. fix(spec): pin the bugfix source name to the topic #516
  12. fix(skills): gate-skip sentence accurate in gate-less phases #517
  13. fix(review-entry): name the real upstream — specification and plan #518
  14. fix(shared): strip triage-landing's unreachable superseded-research arm #519
  15. feat(engine): refuse work-unit-level fields that shadow the phases tree #520
  16. fix(discovery): first-written briefs join the full brief lifecycle #521
  17. test(sim): pipeline simulation — engine driven end-to-end as a black box #522
  18. fix(round-4): review findings — backfill keying, ratchet evasion, pull guard #523

@leeovery
leeovery force-pushed the feat/batch-task-map branch from ea00805 to 9d4cedd Compare July 23, 2026 11:04
@leeovery
leeovery force-pushed the feat/set-grammar-uniform branch from 014be35 to 49f3fb9 Compare July 23, 2026 11:04
@leeovery
leeovery force-pushed the feat/batch-task-map branch from 9d4cedd to b70a64a Compare July 23, 2026 12:29
@leeovery
leeovery force-pushed the feat/set-grammar-uniform branch from 49f3fb9 to 5da39dc Compare July 23, 2026 12:29
@leeovery
leeovery force-pushed the feat/batch-task-map branch from b70a64a to 85501f5 Compare July 23, 2026 12:30
@leeovery
leeovery force-pushed the feat/set-grammar-uniform branch from 5da39dc to 1d3e4df Compare July 23, 2026 12:30
@leeovery
leeovery changed the base branch from feat/batch-task-map to main July 23, 2026 12:31
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
leeovery force-pushed the feat/set-grammar-uniform branch from 1d3e4df to 7d3919b Compare July 23, 2026 12:31
@leeovery
leeovery merged commit 7500ea8 into main Jul 23, 2026
@leeovery
leeovery deleted the feat/set-grammar-uniform branch July 23, 2026 12:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant