feat(hook): AskUserQuestion→Hub-brug — vraag naar iOS, antwoord native terug #179
No reviewers
Labels
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/Scrum4Me!179
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "claude/askuserquestion-ios-approval-c76040"
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?
Brengt Claude Code's ingebouwde
AskUserQuestionnaar de iOS-hub: een PreToolUse-hook duwt een enkelvoudige, niet-multiSelect vraag door de bestaandeCUSTOM-intake (M34) en geeft het antwoord van de telefoon native terug viapermissionDecision: "allow"+updatedInput.answers. JP's vrije toelichting uit het detailscherm komt mee alsadditionalContext. Elk ander pad — timeout, expiry, ongeldige handtekening, gefilterde vorm, payload-gate — is fail-open: geen stdout, exit 0, de terminal-UI verschijnt gewoon.Wijzigingsoppervlak
scripts/hooks/hub-askuserquestion-hook.mjs(zero-dep), twee testbestanden,docs/runbooks/hub-askuserquestion-hook.mdexportopnumberedBody(lib/hub/notification-deliverer-server.ts:23) zodat de drift-test de echte bouwer kan aanroepenscripts/hooks/hub-permission-hook.mjsblijft byte-voor-byte onaangeraakt (lopende refactor).Waarom de payload-gate een spiegel is
fitPayloadstript knoppen stil boven 3800 bytes: de melding komt dan aan zonder de opties die de gebruiker moet kiezen. Een raw-byte- of UTF-16-budget sneuvelde twee reviewronden op JSON-escaping en op eenheden (Zod telt UTF-16-eenheden,truncateCodePointstelt code points). De hook meet daarom exact wat APNs meet —Buffer.byteLength(JSON.stringify(candidate)) <= 3800— op een nagebouwde payload die beide deliverer-takken volgt (≤4 labels →HUB_CHOICE_nmetoptions; 5–8 →APPROVAL_INFO). Een node-environment drift-test vergelijkt die spiegel byte-voor-byte met de echteapns-server-bouwer over een 7-gevallenmatrix; loopt de server weg, dan faalt de test.Reviewsporen
docs/superpowers/specs/2026-08-19-askuserquestion-hub-brug-design.md— dubbel-GO in ronde 4 (mac:claude + mac:codex).docs/superpowers/plans/2026-08-19-askuserquestion-hub-brug.md— dubbel-GO in ronde 2. 5 TDD-taken, per taaknpm run verify.AskUserQuestionniet beantwoorden" was fout — de hooks-reference documenteertanswers-injectie viaupdatedInput. De hele deny-met-reden-opzet is weggegooid.mac:codexweigerde op zijn security-hardstop (NO-GO, geen inhoudelijk oordeel).mac:claude: GO — 0 BLOCKER / 0 MAJOR / 4 MINOR, alle vier nagetrokken tegen de boom en verwerkt inf7c8a7c: de note kan het citaat niet meer sluiten (»→>>),projectOptionsbegrenst dedescriptionmét zichtbare afkapmarkering, en het runbook documenteert nu de volledige datastroom (Apple krijgt de titel inclusief hostnaam; de hub-DB daarbovenopcwd,session_id, de volledige vraag en de descriptions) plus dat knop-antwoorden label-only is.Verificatie
npm run verifygroen — 2092 tests.npm run docsgroen (INDEX geregenereerd, alle links geldig).allow+answers+additionalContext,previewgestript uit de intake-context; alle fail-open-paden exit 0 zonder stdout. Beide security-fixes opnieuw als proces bewezen naf7c8a7c.Wat hierna nog moet (niet in deze PR)
allow+updatedInput-vorm is versie-afhankelijk gedrag van Claude Code; faalt hij, dan blijftHUB_ASK_WAIT_SECONDS=0staan.Drie securitypunten bewust NIET in deze PR (ter beslissing)
userNoteReasoninhub-permission-hook.mjsheeft dezelfde citaat-eigenschap — dat bestand moest onaangeraakt blijven.contextin het intake-Zod-schema (app/api/hub/approvals/intake/route.ts:14) zou óók toekomstige intake-bronnen dekken, maar raakt bestaande server-code.isSecureHubUrlstaat plainhttpop loopback toe — bestaande vlootafspraak, wordt pas scherp op een host met meerdere gebruikers.Verdict: APPROVED
Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
Geen blokkerende of niet-blokkerende findings.
Beoordeling
De nieuwe
scripts/hooks/hub-askuserquestion-hook.mjsvolgt de bestaande hub-hook patronen: ontbrekende/onveilige configuratie faalt stil naar terminal-fallback, het hub-besluit wordt pas gebruikt na HMAC-verificatie, en de APNs-payload wordt vooraf byte-begroot met drift-tests tegen de serverbouwer. De kleine export vannumberedBodyis beperkt en testgericht. Tests dekken vormfiltering, truncatie/budgettering, answer-output, signed/unsigned hub-responses, context-projectie en payload-spiegeling. De nieuwe runbook documenteert registratie, env, rooktest, dataflow en scopegrenzen.