## Summary - add baseline compare evidence gap detail modeling and a dedicated Livewire table surface - extend baseline compare landing and operation run detail surfaces to expose evidence gap details and stats - add spec artifacts for feature 162 and expand feature coverage with focused Filament and baseline tests ## Notes - branch: `162-baseline-gap-details` - commit: `a92dd812` - working tree was clean after push ## Validation - tests were not run in this step Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #192
14 KiB
Tasks: Enterprise Evidence Gap Details for Baseline Compare
Input: Design documents from /specs/162-baseline-gap-details/
Prerequisites: plan.md, spec.md, research.md, data-model.md, contracts/baseline-gap-details.openapi.yaml, quickstart.md
Tests: Runtime behavior changes in this repo require Pest coverage. Each user story below includes the minimum focused tests needed to prove the slice works independently. Organization: Tasks are grouped by user story so each story can be implemented and validated independently.
Phase 1: Setup (Shared Infrastructure)
Purpose: Confirm the feature slice, target files, and verification entrypoints before implementation changes start.
- T001 Confirm the feature scope, affected files, and verification commands in
specs/162-baseline-gap-details/plan.md,specs/162-baseline-gap-details/quickstart.md, andspecs/162-baseline-gap-details/contracts/baseline-gap-details.openapi.yaml - T002 Map the current baseline compare detail flow in
app/Jobs/CompareBaselineToTenantJob.php,app/Services/Baselines/BaselineContentCapturePhase.php,app/Filament/Resources/OperationRunResource.php, andapp/Filament/Pages/BaselineCompareLanding.php
Phase 2: Foundational (Blocking Prerequisites)
Purpose: Establish the shared evidence-gap read model and rendering helpers required by all user stories.
⚠️ CRITICAL: No user story work should start until this phase is complete.
- T003 Define the shared evidence-gap read-model contract and state mapping in
app/Filament/Resources/OperationRunResource.phpto matchspecs/162-baseline-gap-details/data-model.md - T004 [P] Normalize canonical run-detail reason-bucket extraction helpers for
baseline_compare.evidence_gaps.subjectsinapp/Filament/Resources/OperationRunResource.php - T005 [P] Normalize tenant-landing evidence-gap summary/detail extraction in
app/Support/Baselines/BaselineCompareStats.php - T006 Establish the tenant-landing integration points for evidence-gap summary, detail, and diagnostics sections in
app/Filament/Pages/BaselineCompareLanding.phpandresources/views/filament/pages/baseline-compare-landing.blade.php
Checkpoint: Shared read model and page integration points are clear; user-story implementation can proceed.
Phase 3: User Story 1 - Inspect concrete evidence gaps quickly (Priority: P1) 🎯 MVP
Goal: Persist and render grouped concrete evidence-gap subjects so an operator can inspect affected policies without opening raw JSON.
Independent Test: Create a baseline compare run with evidence gaps and verify the canonical run detail shows grouped concrete subjects aligned with the aggregate reason buckets.
Tests for User Story 1
- T007 [P] [US1] Extend compare persistence coverage for reason-grouped subject details in
tests/Feature/Baselines/BaselineCompareAmbiguousMatchGapTest.php - T008 [P] [US1] Extend capture-phase subject persistence coverage in
tests/Feature/Baselines/BaselineCompareResumeTokenTest.php - T009 [P] [US1] Add or update canonical run-detail rendering coverage for grouped evidence-gap rows in
tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php - T010 [P] [US1] Add canonical run-detail render-safety coverage with
bindFailHardGraphClient()intests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php
Implementation for User Story 1
- T011 [US1] Persist bounded subject-level evidence-gap buckets for new compare runs in
app/Jobs/CompareBaselineToTenantJob.php - T012 [US1] Persist capture-phase
gap_subjectsalongside aggregate gaps inapp/Services/Baselines/BaselineContentCapturePhase.php - T013 [US1] Render grouped evidence-gap detail sections from the shared read model in
app/Filament/Resources/OperationRunResource.php - T014 [US1] Create or refine the grouped read-only evidence-gap detail view in
resources/views/filament/infolists/entries/evidence-gap-subjects.blade.php - T015 [US1] Keep raw JSON diagnostics secondary and aligned with the new evidence-gap detail contract in
app/Filament/Resources/OperationRunResource.php
Checkpoint: Operators can inspect concrete evidence-gap subjects on the canonical run detail page without using raw JSON.
Phase 4: User Story 2 - Filter large gap sets without scanning raw diagnostics (Priority: P2)
Goal: Let operators narrow evidence-gap detail by reason, policy type, or subject key directly on the page.
Independent Test: Open a run with multiple gap reasons and many subject rows, enter a partial search token, and confirm only the relevant grouped rows remain visible.
Tests for User Story 2
- T016 [P] [US2] Add filtering-affordance assertions for the canonical run detail in
tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php - T017 [P] [US2] Add tenant-landing parity and filtering visibility coverage in
tests/Feature/Filament/BaselineCompareLandingAdminTenantParityTest.php - T018 [P] [US2] Add tenant-landing render-safety coverage with
bindFailHardGraphClient()intests/Feature/Filament/BaselineCompareLandingAdminTenantParityTest.php - T019 [P] [US2] Add unchanged compare-start surface and mutation-scope messaging coverage in
tests/Feature/Filament/BaselineCompareLandingStartSurfaceTest.php - T020 [P] [US2] Add unchanged baseline-compare audit semantics coverage in
tests/Feature/Baselines/BaselineCompareAuditEventsTest.php
Implementation for User Story 2
- T021 [US2] Implement local filtering across reason, policy type, and subject key in
resources/views/filament/infolists/entries/evidence-gap-subjects.blade.php - T022 [US2] Render the tenant-landing evidence-gap detail block and search affordances in
app/Filament/Pages/BaselineCompareLanding.phpandresources/views/filament/pages/baseline-compare-landing.blade.php - T023 [US2] Align
BaselineCompareStatsreason-group payloads with the canonical run-detail bucket contract inapp/Support/Baselines/BaselineCompareStats.php,app/Filament/Pages/BaselineCompareLanding.php, andapp/Filament/Resources/OperationRunResource.php - T024 [US2] Keep tenant-landing raw diagnostics explicitly secondary to summary and evidence-gap detail in
app/Filament/Pages/BaselineCompareLanding.phpandresources/views/filament/pages/baseline-compare-landing.blade.php
Checkpoint: Operators can isolate relevant evidence-gap rows on both affected surfaces without leaving the page.
Phase 5: User Story 3 - Distinguish missing detail from no gaps (Priority: P3)
Goal: Preserve operator trust by clearly distinguishing legacy or partially recorded runs from runs that truly have no evidence gaps.
Independent Test: Open one run with aggregate evidence-gap counts but no recorded subject details and another run with no evidence gaps, then verify the UI communicates the difference clearly.
Tests for User Story 3
- T025 [P] [US3] Add legacy-run fallback coverage to
tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php - T026 [P] [US3] Add tenant-landing fallback coverage for missing-detail versus no-gap states in
tests/Feature/Filament/BaselineCompareLandingWhyNoFindingsTest.php - T027 [P] [US3] Add explicit tenant-safety regression coverage for canonical and tenant surfaces in
tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.phpandtests/Feature/Filament/BaselineCompareLandingAdminTenantParityTest.php
Implementation for User Story 3
- T028 [US3] Implement canonical run-detail fallback messaging for
details_not_recordedversusno_gapsinapp/Filament/Resources/OperationRunResource.phpandresources/views/filament/infolists/entries/evidence-gap-subjects.blade.php - T029 [US3] Implement tenant-landing fallback messaging for legacy and partial-detail compare runs in
app/Filament/Pages/BaselineCompareLanding.phpandresources/views/filament/pages/baseline-compare-landing.blade.php - T030 [US3] Ensure partial reason coverage does not imply zero affected subjects for missing buckets in
app/Filament/Resources/OperationRunResource.phpandapp/Support/Baselines/BaselineCompareStats.php
Checkpoint: Legacy and partial-detail runs remain readable and trustworthy without being mistaken for healthy no-gap runs.
Phase 6: Polish & Cross-Cutting Concerns
Purpose: Final consistency, regression validation, and release readiness across all user stories.
- T031 [P] Update feature artifacts for any final contract or wording changes in
specs/162-baseline-gap-details/spec.md,specs/162-baseline-gap-details/plan.md,specs/162-baseline-gap-details/quickstart.md, andspecs/162-baseline-gap-details/contracts/baseline-gap-details.openapi.yaml - T032 Run focused formatting on touched PHP files with
vendor/bin/sail bin pint --dirty --format agent - T033 Run the focused canonical verification pack from
specs/162-baseline-gap-details/quickstart.mdwithvendor/bin/sail artisan test --compact tests/Feature/Baselines/BaselineCompareAmbiguousMatchGapTest.php tests/Feature/Baselines/BaselineCompareResumeTokenTest.php tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php - T034 [P] Run the tenant-landing evidence-gap verification tests with
vendor/bin/sail artisan test --compact tests/Feature/Filament/BaselineCompareLandingAdminTenantParityTest.php tests/Feature/Filament/BaselineCompareLandingWhyNoFindingsTest.php tests/Feature/Filament/BaselineCompareLandingStartSurfaceTest.php tests/Feature/Baselines/BaselineCompareAuditEventsTest.php - T035 Execute the manual run-review checks in
specs/162-baseline-gap-details/quickstart.mdagainst/admin/operations/{run}and/admin/t/{tenant}/baseline-compare-landing
Dependencies & Execution Order
Phase Dependencies
- Phase 1: Setup: No dependencies.
- Phase 2: Foundational: Depends on Phase 1 and blocks all user stories.
- Phase 3: US1: Starts after Phase 2 and delivers the MVP.
- Phase 4: US2: Starts after Phase 2; depends functionally on the US1 detail structure being present.
- Phase 5: US3: Starts after Phase 2; depends functionally on the shared read model and both surface integrations.
- Phase 6: Polish: Starts after the desired user stories are complete.
User Story Dependencies
- US1 (P1): No dependency on other user stories once the foundational phase is complete.
- US2 (P2): Depends on US1 detail rendering because filtering operates on the rendered evidence-gap rows.
- US3 (P3): Depends on US1 read-model/rendering and should also align with US2 surface semantics where filtering is visible.
Within Each User Story
- Tests should be written or updated before implementation and fail for the missing behavior.
- Persistence work precedes rendering work.
- Rendering work precedes parity and fallback polish.
- Each story should be independently runnable through the focused tests listed above.
Parallel Opportunities
T004andT005can run in parallel afterT003.T007,T008,T009, andT010can run in parallel within US1.T016,T017,T018,T019, andT020can run in parallel within US2.T025,T026, andT027can run in parallel within US3.T031andT034can run in parallel during Polish.
Parallel Example: User Story 1
# Parallelize the US1 regression updates first
Task: T007 tests/Feature/Baselines/BaselineCompareAmbiguousMatchGapTest.php
Task: T008 tests/Feature/Baselines/BaselineCompareResumeTokenTest.php
Task: T009 tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php
Task: T010 tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php
# Then implement the persistence and render paths
Task: T011 app/Jobs/CompareBaselineToTenantJob.php
Task: T012 app/Services/Baselines/BaselineContentCapturePhase.php
Task: T013 app/Filament/Resources/OperationRunResource.php
Task: T014 resources/views/filament/infolists/entries/evidence-gap-subjects.blade.php
Parallel Example: User Story 2
# Parallelize test scaffolding for both surfaces
Task: T016 tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php
Task: T017 tests/Feature/Filament/BaselineCompareLandingAdminTenantParityTest.php
Task: T018 tests/Feature/Filament/BaselineCompareLandingAdminTenantParityTest.php
Task: T019 tests/Feature/Filament/BaselineCompareLandingStartSurfaceTest.php
Task: T020 tests/Feature/Baselines/BaselineCompareAuditEventsTest.php
# Then implement filtering and surface parity
Task: T021 resources/views/filament/infolists/entries/evidence-gap-subjects.blade.php
Task: T022 app/Filament/Pages/BaselineCompareLanding.php
Task: T023 app/Support/Baselines/BaselineCompareStats.php
Task: T024 resources/views/filament/pages/baseline-compare-landing.blade.php
Parallel Example: User Story 3
# Parallelize legacy-state tests
Task: T025 tests/Feature/Filament/OperationRunEnterpriseDetailPageTest.php
Task: T026 tests/Feature/Filament/BaselineCompareLandingWhyNoFindingsTest.php
Task: T027 tests/Feature/Filament/BaselineCompareLandingAdminTenantParityTest.php
# Then implement fallback states on both surfaces
Task: T028 app/Filament/Resources/OperationRunResource.php
Task: T029 resources/views/filament/pages/baseline-compare-landing.blade.php
Task: T030 app/Support/Baselines/BaselineCompareStats.php
Implementation Strategy
MVP First
Deliver Phase 3 first. That yields the core value: subject-level persistence plus canonical run-detail visibility for evidence-gap details.
Incremental Delivery
- Complete Setup and Foundational phases.
- Deliver US1 as the MVP for operator visibility.
- Add US2 for enterprise-scale filtering and landing-page parity.
- Add US3 for legacy-run trust and fallback clarity.
- Finish with formatting, focused regression runs, and manual validation.