feat(hub): keuzelijsten voor de inboxfilters (IDEA-182) #176
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!176
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/inbox-filter-keuzelijsten"
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?
Filteren in de hub-inbox vereiste vrije invoer die exact de juiste schrijfwijze moest raken —
task,pending,DEPLOY. Eén tikfout gaf stil nul resultaten. En de enige picker die er was, voor deelnemer, werd gevuld uit de geladen items (de eerste pagina van 50), met daaronder een tekstveld dat aan dezelfde waarde bond. Die dubbele binding is waarom een gekozen deelnemer niet bleef staan.Gevonden tijdens de M33-e2e-gate, samen met het 401-defect dat als IDEA-183 apart is opgelost.
Wat erin zit
GET /api/hub/inbox/facets?source=queue|job&archived=…levert per veld de waarden die wérkelijk voorkomen, met label en aantal. Dezelfde scoping en hetzelfde archief-predicaat als de lijst, anders bied je opties aan voor data die de lijst nooit teruggeeft.COUNT(DISTINCT id). Een bericht vanmac:claudeaan zichzelf staat aan beide kanten; los tellen telt het dubbel. Gemeten: 91 self-messages, naïef 404 waar het er 313 zijn.scrum4us-job:<uuid>— ondoorzichtige job-id's die met elke job aangroeien en op een telefoon onbruikbaar zijn.scrum4me-server→154), zodat de aliaslijst één keer naast de data staat en niet in een app die opnieuw uitgerold moet worden. De app toontlabelen verstuurtvalue.knownParticipantsis weg.Waar de aandacht naartoe ging
Concurrency.
FacetsStorepubliceert alleen als zijn sleutel nog de huidige is, en deelt éénTaskper sleutel. Dat laatste is geen optimalisatie: SwiftUI annuleert de.taskvan een sheet bij sluiten, en met een "loopt al, doe niets"-vorm zou meteen heropenen een leeg scherm zonder retry opleveren. Een losseTaskerft die annulering niet.De eindreview heeft dat niet aangenomen maar getoetst met twee mutanten:
guard huidige == keyweghalen maakt precies één test rood, en de gedeeldeTaskvervangen door een "doe niets"-set maakt precies één andere test rood.Eén bevinding uit die review was een echt defect in het ontwerp: filters overleven een sleutelwissel, dus een deelnemerfilter dat je op de actieve queue zet en daarna met de archieftoggle meeneemt, kon actief blijven terwijl het veld "geen waarden" toonde — onzichtbaar én niet te wissen. Een gekozen waarde die niet in de lijst staat houdt nu zijn eigen regel. Spec §5 is meegecorrigeerd.
Verificatie
e91e0bb:npm ci && npm run verify && npm run build && git diff --exit-code.npm run verify: 270 bestanden, 2149 tests.npm run ios:test: 71/71.mac:codex) vóór er code was; elke taak apart gereviewd; daarna een brede eindreview over de hele branch.Nog te doen na merge
Geen lockstep nodig. Het endpoint is nieuw, dus een oudere app raakt het nooit; de server mag vooruit zonder dat de TestFlight-build meteen mee moet.
🤖 Generated with Claude Code
Verdict: APPROVED
Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Findings
Reviewnotities
De nieuwe
/api/hub/inbox/facetsroute volgt de Hub device-signing route-helper, valideert de query met Zod en gebruikt de device-user voor job-scoping. De queue-facetquery houdt rekening metarchived_at,COUNT(DISTINCT id)voor participant-tellingen en sluit descrum4us-jobnamespace uit, conform de gewijzigde Hub-filterdocumentatie.De iOS-wijziging cachet facetten per bron/archiefstand, voorkomt dat trage loads nieuwere selectie overschrijven, en houdt
labelenvaluegescheiden zodat labels niet terug naar de API gaan. De toegevoegde Vitest- en XCTest-dekking raakt de relevante regressierisico's: scoping, archiefscheiding, ontbrekende velden, cache/race-gedrag en waarde-vs-label verzending.Docs zijn bijgewerkt met runbook/spec/plan-context en de E2E-gate is terecht heropend voor de nieuwe filterkeuzelijsten.