## Summary - add the new admin findings intake queue at `/admin/findings/intake` with fixed `Unassigned` and `Needs triage` views, tenant-safe filtering, claim flow, and continuity into tenant finding detail and `My Findings` - add Spec 222 artifacts (`spec`, `plan`, `tasks`, `research`, `data model`, `quickstart`, contract, checklist) and register the new admin page - fix follow-up regressions uncovered during full-suite validation around findings action-surface declarations, findings list default columns, provider-blocked run messaging, operation catalog aliases, and workspace overview query volume ## Validation - `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent` - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/Findings/FindingsIntakeQueueTest.php tests/Feature/Authorization/FindingsIntakeAuthorizationTest.php tests/Feature/Findings/FindingsClaimHandoffTest.php` - `cd apps/platform && ./vendor/bin/sail artisan test --compact` ## Notes - Filament remains on v5 with Livewire v4-compatible patterns - provider registration remains unchanged in `apps/platform/bootstrap/providers.php` - no new assets or schema changes are introduced Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #260
5.7 KiB
Quickstart: Findings Intake & Team Queue V1
Goal
Validate that /admin/findings/intake gives the current user one trustworthy shared queue for visible unassigned findings, that Needs triage remains the strict new and reopened subset, and that Claim finding moves eligible work into /admin/findings/my-work through a lightweight preview and explicit confirmation without silent overwrite.
Prerequisites
- Start Sail if it is not already running.
- Use a test user who is a member of one workspace and at least two tenants inside that workspace.
- Seed or create findings for these cases:
- unassigned
newfinding in tenant A - unassigned
reopenedfinding in tenant B - unassigned
triagedfinding in tenant A - unassigned
in_progressfinding in tenant B - unassigned finding with owner set but no assignee
- already-assigned open finding
acknowledgedfinding with no assignee- terminal finding
- unassigned finding in a hidden tenant
- unassigned finding in a tenant where the acting user can view findings but a second acting user lacks assign capability
- one claim-race fixture where another operator can successfully claim after the first queue render
- unassigned
- Ensure
/admin/findings/my-workalready works for the acting workspace user.
Focused Automated Verification
Run formatting first:
cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent
Then run the focused proving set:
cd apps/platform && ./vendor/bin/sail artisan test --compact \
tests/Feature/Findings/FindingsIntakeQueueTest.php \
tests/Feature/Authorization/FindingsIntakeAuthorizationTest.php
cd apps/platform && ./vendor/bin/sail artisan test --compact \
tests/Feature/Findings/FindingsClaimHandoffTest.php
Manual Validation Pass
1. Canonical intake route
Open /admin/findings/intake.
Confirm that:
- the page title and copy use findings-intake vocabulary,
- rows show tenant, finding summary, severity, lifecycle, due urgency, owner when present, and queue reason,
- the page is clearly fixed to shared unassigned work,
- a workspace member with no currently viewable findings scope receives
403instead of a pseudo-empty queue, - and already-assigned,
acknowledged, terminal, hidden-tenant, and capability-blocked rows do not appear.
2. Fixed queue views
On the same page:
Confirm that:
Unassignedshows all visible unassigned open findings,Needs triageshows only visiblenewandreopenedfindings,triagedandin_progressfindings disappear fromNeeds triage,- and already-assigned
reopenedfindings never re-enter intake.
3. Active tenant prefilter
Set an active tenant context before opening the intake queue.
Confirm that:
- the queue defaults to that tenant,
- the fixed intake scope and selected queue view remain intact,
- a
Clear tenant filteraffordance is available, - summary state stays consistent with the visible rows,
- and clearing the tenant filter returns the queue to all visible tenants without widening beyond intake truth.
4. Ordering and urgency
With overdue, reopened, new, and undated unassigned findings:
Confirm that:
- overdue rows appear first,
- reopened rows appear ahead of new rows,
- new rows appear ahead of the remaining triaged or in-progress unassigned backlog,
- rows with due dates sort ahead of rows without due dates inside the same bucket,
- and tie breaks remain deterministic.
5. Claim happy path
Claim an eligible row as a user with assign capability.
Confirm that:
- the preview clearly summarizes the tenant, finding, and assignee change before execution,
- the claim succeeds only after explicit confirmation,
- assignee becomes the current user,
- owner and workflow status stay unchanged,
- the row disappears from intake immediately,
- and the success path points clearly into
Open my findingswhile row-open detail remains available for deeper context.
6. Claim forbidden path
Use a workspace member who can inspect findings but lacks assign capability.
Confirm that:
- intake rows remain inspectable,
- claim is not successfully executable,
- the server rejects direct claim attempts with
403, - and the queue remains honest after the failed attempt.
7. Stale-row conflict path
Load intake as operator A, then claim the same finding as operator B before operator A clicks Claim finding.
Confirm that:
- operator A does not overwrite operator B,
- the system reports the conflict honestly,
- the queue refreshes so the stale row disappears,
- and the audit trail reflects only the successful claim.
8. Detail continuity
Open a row from intake.
Confirm that:
- the destination is the existing tenant finding detail route,
- tenant scope is correct,
- and the page offers
Back to findings intakecontinuity.
9. Empty-state behavior
Validate two empty states:
- no visible intake work anywhere
- no rows only because the active tenant prefilter narrows the queue
Confirm that:
- the zero-visible-work branch stays calm and offers
Open my findings, - the tenant-prefilter branch explains the narrowing honestly instead of claiming the intake queue is globally empty,
- the tenant-prefilter branch offers only
Clear tenant filter, - and neither branch leaks hidden tenant information.
Final Verification Notes
- The queue remains the shared pre-assignment surface; deeper workflow mutations stay on tenant finding detail and tenant findings list.
- Claim is not destructive, but it still uses a lightweight preview/confirmation step because write/change flows in this repo require explicit confirmation.
- If a reviewer can infer hidden tenant work, or if stale claim attempts can overwrite another operator's success, treat that as a release blocker.