{"id":"9cbc85bd-4437-4337-a4cc-701fa999bed2","org_id":"5b607c7a-3ba2-4077-b038-cdccd0ce7c34","project_id":"b18679c0-fffb-4308-82b6-9e91be23582f","parent_id":null,"identifier":"BEB-3615","number":3615,"title":"MODEL ROUTING — one 32B coder is running every lane with no override; restore per-lane selection and retry the identity-gated tickets","description":"Repo: alexrollin/abilifi-apps (mastra codegen, live/index.js)\nClass: CODE\nLane: BUILD\nFEATURE NAME: **MODEL ROUTING**\nETA: 2026-08-19 (today)\nBudget: estimate 150 / ceiling 300\n\nMEASURED 2026-08-19 (CC, read from the deployed live/index.js, m53093): **@cf/qwen/qwen2.5-coder-32b-instruct on ALL lanes — BUILD, part, and the spec writer — 3 call sites, NO per-lane override.**\n\nThe standing doctrine is: Kimi K2.5 for bulk/chat, GLM-4.7-Flash for trivial, GLM-5.1/K2.6 for hard tickets. The deployed config matches none of it. Every ticket in the estate, trivial or hard, UI or machinery, is being answered by one 32B coder.\n\n## Why this is the root, not a tuning nicety\nA 32B coder handed a UI template and a ticket emits the template UNADAPTED. That is the exact failure the identity gate keeps catching:\n- BEB-3597: ~40 deploys since 13:48Z, every one downgraded BYTE-IDENTICAL to BEB-2947's page.\n- BEB-3596: same, byte-identical to BEB-2256's.\nThe gate is working. The emitter is the problem, and the emitter is under-modelled for the work it is being given.\n\n## Deliverable\n1. PER-LANE MODEL SELECTION at all 3 call sites — config, not hardcode; readable back from the deployed worker.\n2. Route per doctrine: hard tickets (UI adaptation, machinery, anything with a contract) to the hard model; bulk to K2.5; trivial to Flash. A lane with no explicit mapping fails loudly rather than silently falling through to one default — the silent fallthrough is how this happened.\n3. The chosen model is RECORDED PER ATTEMPT on the ticket, so a failure can be read against the model that produced it. Today that is unknowable after the fact.\n4. Report the deployed value back after the change — read from live config, the same way the defect was found.\n\n## Acceptance\n1. Deployed config shows a per-lane mapping; the value is read back and posted, not asserted.\n2. A hard-lane attempt records its model on the ticket.\n3. An unmapped lane raises a named error instead of defaulting.\n4. **RETRY BEB-3597 on the corrected routing** — it either produces a page that is NOT byte-identical to 2947's, or the failure is a different one with a different name. Same for one other identity-gated ticket. That retry is the proof this fixed anything.\n5. Attempt counts before and after reported.\n\nRefs: BEB-2114 (deliverable class), BEB-2348 (identity gate — catching the symptom), BEB-3597 / BEB-3596 (the two burning on it), model-routing doctrine.","status":"todo","priority":0,"assignee_id":null,"created_at":1787153939945,"updated_at":1788444319008,"completed_at":null,"due_date":"2026-08-19","claimed_by":null,"claimed_until":null,"required_capabilities":null,"estimate":150,"cost_ceiling":300,"cancelled_at":null,"last_actor":"unverified:shared"}