{"id":"7facaafe-a569-4fca-9d2d-b0a0b5fa37e5","org_id":"5b607c7a-3ba2-4077-b038-cdccd0ce7c34","project_id":"b18679c0-fffb-4308-82b6-9e91be23582f","parent_id":null,"identifier":"BEB-9274","number":9274,"title":"DESCRIBE OR IT DID NOT SHIP — every generated worker serves /describe with typed methods[]; 240+ complete/auto-contract refusals in 24h are all this one gap","description":"Repo: alexrollin/abilifi-apps (codegen template + widget scaffold)\nClass: CODE\nLane: BUILD\nFEATURE NAME: **DESCRIBE OR IT DID NOT SHIP**\nETA 2026-09-06\nBudget: estimate 180 / ceiling 360\n\n## WHAT WAS MEASURED (get_state reds, 2026-09-04T08:02)\n- alexrollin/abilifi-apps failing at **complete 205x in 24h** — LATEST 09-03T14:31: DESCRIBE_REFUTED (BEB-9236 verify), BEB-1780 at https://widgets.abilifi.net/...\n- alexrollin/abilifi-apps failing at **auto-contract 142x in 24h** — LATEST 09-03T14:31: GET /describe -> HTTP 200 but no methods[]\n- n/a failing at **complete 33x in 24h** — BEB-8956, same DESCRIBE_REFUTED\n- BEB-2909 failing at auto-contract and complete, same signature: GET /describe -> HTTP 404 but no methods[]\n- Manual lane_run of BEB-9271 (2026-09-04T08:0x) claimed, built, deployed, and was rejected at complete with the same line: describe: GET /describe -> HTTP 404 but no methods[]\n\nTwo distinct shapes in one class: 404 (route absent entirely) and 200-without-methods (route present, contract empty). Both refute.\n\n## READING\nThe validator (BEB-9236) is doing its job. The generator is not: nothing in the codegen template makes a worker declare itself, so every artefact the loop produces dies at the last hop, after codegen, build and deploy have already been paid for. This is the largest single burn in the estate right now — the loop is not idle, it is completing work that is then correctly refused.\n\n## WHY THIS AND NOT THE ALTERNATIVES (options considered, and why rejected)\n1. **Relax the validator to accept a missing /describe.** Rejected — the declaration is the product (BEB-9236, BEB-9226 final shape = the declared thing). Removing the check hides the fault and makes every artefact unverifiable.\n2. **Patch each failing ticket individually.** Rejected — 240+ failures across at least 6 named tickets and two repos in one day; it is one template, not many bugs.\n3. **Have the validator synthesise methods[] by probing routes.** Rejected — a probe infers surface, it does not prove intent; a method that exists but was never declared is exactly the fault we are trying to catch.\n4. **Wait for BEB-9271 (LOOP IS AN OBJECT) to land the declaration model.** Rejected as the near-term path — 9271 itself is refuted by this same gap, so this ticket unblocks 9271 rather than the other way round.\n\n## DELIVERABLE\n1. The codegen template emits a GET /describe handler in every generated worker and every generated widget, unconditionally.\n2. /describe returns typed methods[]: for each method, its name, HTTP method, path, input shape and output shape, taken from the spec the ticket carried, not invented at runtime.\n3. Every declared method answers on its declared verb and path and returns its declared shape — a declaration that does not answer is worse than none.\n4. A pre-deploy check refuses the artefact when /describe is absent or methods[] is empty, so the failure lands at build time with the ticket in hand, not 200ms after deploy at complete.\n5. Backfill: BEB-1780, BEB-8956, BEB-2909, BEB-9271 rebuilt on the fixed template.\n\n## ACCEPTANCE\n1. A freshly generated worker answers GET /describe with a non-empty typed methods[] — contract_run per-element verdict.\n2. Each declared method probed live returns its declared shape — VERIFIED per element.\n3. The DESCRIBE_REFUTED count at complete over 24h falls to zero; measured from get_state reds before and after, both numbers recorded on this ticket.\n4. contract_run verdict plus the recording delivered into BB Docs. Alex loads nothing and records nothing.\n\n## NOT VERIFIED (stated as unknown)\n- Whether the widget scaffold and the worker scaffold share one template or two; if two, both need the change and only the worker path has been read.\n- Whether the 200-without-methods shape comes from a partial template already present or from a route the router answers generically.\n- Whether the spec carried to codegen always contains enough typed detail to fill methods[]; if it does not, that is a spec_author gap and gets its own ticket rather than a runtime guess.\n\nRefs: BEB-9236 (THE VALIDATOR / verify(url)), BEB-9226 (final shape = the declared thing), BEB-9271, BEB-2909, BEB-1780, BEB-8956.","status":"todo","priority":0,"assignee_id":null,"created_at":1788509109646,"updated_at":1788509109646,"completed_at":null,"due_date":null,"claimed_by":null,"claimed_until":null,"required_capabilities":null,"estimate":null,"cost_ceiling":null,"cancelled_at":null,"last_actor":"unverified:shared"}