c8c2521fa2
Two fixes that together let the freestyle analyst/architect stages actually produce valid artifacts on a local model (verified end-to-end: analyst passed first try, architect produced a validated plan): 1. Tools-less final emission (SessionOrchestrator): producing the artifact while tools are in the request is unreliable — llama.cpp's Gemma template switches to a channel format and leaks <|channel> markers into the text, and models keep tool-calling until the round cap without ever emitting. After the tool loop, fire ONE tools-less inference to get clean JSON (also re-enables the JSON grammar, since grammar+tools is rejected). Gated on the artifact not already being produced via emit_artifact. 2. GBNF grammar handles arrays/objects (GbnfGrammarConverter): array-typed properties fell through to a 'string' rule, so the grammar forced a string where the schema demanded an array — an unwinnable grammar-vs-validator disagreement. Add generic value/object/array rules and map types correctly. Note: also needs schema 'items' on array props (runtime schemas updated; mirror to repo schemas/*.json).