LearnNewsExamplesServices
Frontmatter
id14763
titleKeeper mutation grammar: follow-up intents ("make THE GRID bigger") through resolveTarget + the merge-then-validate path
stateClosed
labels
enhancementai
assigneesneo-gpt
createdAtJul 4, 2026, 3:13 PM
updatedAt5:37 AM
githubUrlhttps://github.com/neomjs/neo/issues/14763
authorneo-fable
commentsCount1
parentIssue13349
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[x] 14767 Retire the first-widget childapp''s v1 grammar onto the create-module spine (one vocabulary, zero forks)
closedAt5:37 AM

Keeper mutation grammar: follow-up intents ("make THE GRID bigger") through resolveTarget + the merge-then-validate path

Closed Backlog/active-chunk-4 enhancementai
neo-fable
neo-fable commented on Jul 4, 2026, 3:13 PM

Context

T2.12 of the harness pillar (#13349). The pipeline's mutation half is fully built and PROVEN but has no intake: resolveTarget (registry: by-id / by-title / latest-live), validateMutation (merge-then-validate — mutation-valid ⇔ merged-result-creation-valid), and mutateInstance (batched set() apply + registry markMutated) all merged. This leaf is the intake: a follow-up natural-language intent becomes {target selector, mutation partial}.

The Fix

  • AMENDED (operator product-ruling on PR #14821 + spec-owner correction — the original clause below inverted the product): the mutation intake is the SAME injected model boundary as creation: {request, currentBlueprint, generate} → the model reasons over the request AND the target's CURRENT blueprint (plus the schema's allowlist vocabulary, derived from the registry never duplicated) → returns a mutation partial → validateMutation merge-then-validates as the sole gate. NL is the product surface — a frontier model can express any mutation the validator can gate; a keyword→constant menu is the Tailwind-class anti-pattern (a fixed token vocabulary impersonating an expressive medium). A deterministic grammar may exist ONLY as the unshippable test seam (the wedge's deterministicBlueprintFallback pattern) and, if present, must be RELATIVE to current state (factors), never absolute constants — 'taller' on a 700px grid must never shrink it. Original clause (superseded): a parse step generalizing the childapp grammar with bounded intent classes → allowlisted partials. The childapp grammar is the contamination source, not the precedent — #14767's retirement direction reverses accordingly (retire INTO the model boundary).
  • Target resolution phrases → resolveTarget selectors: an explicit title match ("the sales grid") → {title}, otherwise latest-live (the "THE GRID" case). Ambiguity (two live matches by title) = a bounded refusal naming both candidates, never a guess.
  • The wedge controller wires it behind the same submit affordance when the flow state is materialized (the SSOT's follow-up affordance): intent → parse → resolve → mutateInstance → the provider's flow events. Refusals render with reasons, per the SSOT's always-a-reason bar.

Acceptance Criteria

  • The three v1 intent classes parse to allowlist-shaped partials; anything else refuses bounded (never a silent no-op).
  • Target resolution: explicit-title, latest-live fallback, and the ambiguity refusal (unit-pinned).
  • End-to-end unit: "make it taller" against a live registry double → mutateInstance applies the merged blueprint → registry snapshot updated (consuming the validator's returned merged blueprint — no hand-merging, the recorded rule).
  • The childapp keeps working unchanged (its v1 grammar retires in its own follow-up leaf).

Out of Scope

Dispose intents (the chrome affordance covers dispose) · streaming previews. NL-model parsing is NO LONGER out of scope — it IS the scope (the amendment above); the deterministic seam ships only as a test double.

Related

Parent #13349 (T2.12) · the registry + accept path (merged) · the wedge (PR #14727) · the childapp grammar (the precedent) · #14644 §4 (mutations under the same contract).

Claimable — non-Fable implementable; the pipe exists end to end, this is the intake parse + wiring.

Origin Session ID: b9b95ac6-42f5-47a3-b58f-6071f79657e8 Retrieval Hint: "keeper mutation grammar follow-up intent resolveTarget make grid bigger parse edit request"