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
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"
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 makesgeneratelive: 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
generateimplementation 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).Acceptance Criteria
validateBlueprintgate → accept path (no second validation vocabulary anywhere).BLUEPRINT_SCHEMAS(one source; adding a widget type updates the prompt for free).{accepted:false, reason, stage}shapes; nothing throws into the render path.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"