LearnNewsExamplesServices
Frontmatter
id14762
titleKeeper NL wiring: the live agent boundary replaces the deterministic fallback behind the ONE injected seam
stateClosed
labels
enhancementai
assignees[]
createdAtJul 4, 2026, 3:12 PM
updatedAt3:11 PM
githubUrlhttps://github.com/neomjs/neo/issues/14762
authorneo-fable
commentsCount1
parentIssue13349
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 5, 2026, 5:37 AM

Keeper NL wiring: the live agent boundary replaces the deterministic fallback behind the ONE injected seam

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

Context

T2.11 of the harness pillar (#13349). The create spine deliberately left ONE seam open: routeCreationRequest({request, generate}) takes the agent boundary as a parameter, and the wedge surface falls back to a deterministic blueprint generator. This leaf makes generate live: a natural-language creation request reaches a real model call and returns a candidate blueprint — with the route's fail-closed validation unchanged as the safety net (the emit-side of the recorded safety contract; nothing executable can transit regardless of what the model returns).

The Fix

  • A provider-backed generate implementation in the create module (view/create/util/ per convention): prompt = the request + the registered schema vocabulary (from the blueprint schema registry — never a hand-written duplicate of the allowlists); response parsed to a candidate blueprint object; EVERYTHING else stays the route's job (validation, refusal shaping, staging).
  • Config-driven model/provider selection (the AiConfig SSOT — read ADR-0019 before authoring; the §3 catalog applies).
  • The wedge controller's injectable seam consumes it when configured, keeping the deterministic fallback for unit tests and offline mode (the fallback is a FEATURE — never delete it).
  • Prompt-injection posture: the model's output is a CANDIDATE, the shared validator is the gate; a response that isn't a valid blueprint shape lands the standard staged refusal. No streaming in v1.

Acceptance Criteria

  • Typed intent → live model call → candidate blueprint → the SAME validateBlueprint gate → accept path (no second validation vocabulary anywhere).
  • Schema vocabulary in the prompt derives from BLUEPRINT_SCHEMAS (one source; adding a widget type updates the prompt for free).
  • Provider/model via AiConfig leaves (ADR-0019-clean; no env reads, no threading).
  • Refusal parity: model-garbage, model-timeout, and validation-refusal all land the bounded {accepted:false, reason, stage} shapes; nothing throws into the render path.
  • Unit spec with a doubled provider (happy, garbage, timeout); the live-call proof rides the #14734 e2e.

Out of Scope

Streaming/token-by-token preview · mutation intents (#T2.12 sibling) · multi-schema prompt tuning.

Related

Parent #13349 (T2.11) · the route/validator (merged) · the wedge surface (PR #14727) · #14644 (the contract) · ADR-0019 (config discipline) · #14734 (the e2e that proves it live).

Claimable — non-Fable implementable; the seam and contract are fully specified.

Origin Session ID: b9b95ac6-42f5-47a3-b58f-6071f79657e8 Retrieval Hint: "keeper NL wiring live agent boundary generate seam blueprint candidate prompt schema vocabulary"