test(queue): pariteitsgate tussen tool-schema's en het gedeelde vocabulaire #108
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/queue-vocab-parity"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
T-129: de gate die er niet was. Sluit ST-038 en daarmee het gat dat deze hele sprint veroorzaakt heeft.
Waarom dit nodig was. Bij fase 2 hadden vier tools het modelvocabulaire overgetypt. Geen test koppelde ze aan de gedeelde lijst, en omdat
src/queue/types.tsalleen het type importeerde bleef ook de typecheck groen. Dat kwam pas aan het licht toenkimiwerd toegevoegd enas: 'kimi'stil geweigerd bleek te worden — door Zod, vóórdat identity-code ooit draaide.De gate leest wat de client krijgt, niet een Zod-intern veld.
__tests__/queue-vocab-parity.test.tsregistreert viaregisterQueueTools()— dus een nieuwe queue-tool valt er automatisch onder — vangt de meta uitregisterToolen zet hetinputSchemaom metz.toJSONSchema(..., { target:'draft-7', io:'input' }). Dat is exact wat de SDK zelf doet bijtools/list, geverifieerd tegenserver/mcp.jsenzod-json-schema-compat.js.Drift wordt in beide richtingen gevangen: verzamelingsvergelijking, dus zowel een ontbrekende als een extra waarde is rood. Onafhankelijk nagemeten door een
'gemini'aan één enum toe te voegen — drie lagen vallen om.De interessantste vondst zat in mutatie 2, en die weerlegde mijn eigen verwachting. Ik had voorgeschreven: zet de
type-enum terug naar['task','info','review_request']en verwacht rood. Maar die literal is letterlijkQUEUE_REQUEST_TYPES— een gate die waarden vergelijkt kán daar niet op afgaan; hij zou pas afgaan zodra de gedeelde lijst beweegt, dus ná de schade. In plaats van dat glad te strijken is er een vierde, bronniveau-laag bijgebouwd: het argument vanz.enum(...)moet de gedeelde constante-identifier zijn, geen literal, en die constante moet uit@shared/queue-identity.jskomen. Die laag verbiedt de praktijk in plaats van alleen de uitkomst. Vindt de regex het veld niet meer, dan faalt hij — nooit stilzwijgend groen.Plus een dekkings-sweep: élk enum-veld van élke queue-tool moet óf gebonden zijn aan een gedeelde lijst, óf expliciet als tool-eigen aangemerkt (
queue_list.directionis dat — MCP-presentatievocabulaire, staat niet in de gedeelde module). Een nieuwe overtypende tool valt er dus niet buiten.Twee stukken drift opgeruimd.
queue-push.tsleidt zijntype-enum nu af uitQUEUE_REQUEST_TYPES. Enqueue-list.ts:40had een handgeschreven "niet-terminaal"-lijst['pending','claimed']; die is nu het complement vanQUEUE_TERMINAL_STATUSES. Vandaag exact dezelfde twee waarden, maar een zesde niet-terminale status valt er nu niet meer stil buiten — met een eigen test, want de pariteitsgate leest inputSchema's en kan dit niet zien.Verificatie. 1362 passed (was 1339), 29 skipped, typecheck exit 0. Integratie: 29 passed over 3 bestanden tegen
scrum4me_test. Alle drie de mutaties uitgevoerd en exact teruggedraaid.Hiermee werkt
as: 'kimi'end-to-end op de MCP-kant, en is de klasse fout die dit veroorzaakte voortaan rood in plaats van stil.🤖 Generated with Claude Code