# Tasks: Inventory Coverage Interactive Table

**Input**: Design documents from `/specs/124-inventory-coverage-table/`
**Prerequisites**: plan.md (required), spec.md (required for user stories), research.md, data-model.md, contracts/

**Tests**: Tests are REQUIRED for this runtime behavior change. Pest feature/component coverage must verify table rendering, search, filtering, and regression-sensitive presentation.
**Operations**: No `OperationRun` work is required because this feature is read-only and does not introduce long-running, remote, queued, or scheduled behavior.
**RBAC**: No new authorization behavior is introduced. Existing tenant membership and tenant-view capability checks on the page remain the enforcement path.
**Filament UI Action Surfaces**: This feature modifies a Filament page and keeps the explicit inspection-affordance exemption documented in the spec because coverage rows are runtime-derived metadata, not first-class records.
**Filament UI UX-001**: This feature must deliver a native Filament table, an explicit zero-results empty state with exactly one reset CTA, and dark-mode-safe presentation.
**Badges**: Badge semantics must stay centralized through the existing badge catalogs; no ad-hoc mappings are allowed.

**Organization**: Tasks are grouped by user story to enable independent implementation and testing of each story.

## Phase 1: Setup (Shared Alignment)

**Purpose**: Confirm implementation boundaries and target files before refactoring the page

- [X] T001 Reconcile the explicit table-surface exemption and page contract in `specs/124-inventory-coverage-table/spec.md` and `specs/124-inventory-coverage-table/contracts/inventory-coverage-page.openapi.yaml` against the final target files `app/Filament/Pages/InventoryCoverage.php` and `resources/views/filament/pages/inventory-coverage.blade.php`
- [X] T002 [P] Review existing coverage page and regression-test touchpoints in `app/Filament/Pages/InventoryCoverage.php`, `resources/views/filament/pages/inventory-coverage.blade.php`, and `tests/Feature/Filament/InventoryPagesTest.php`

---

## Phase 2: Foundational (Blocking Prerequisites)

**Purpose**: Introduce the shared table infrastructure that all user stories build on

**⚠️ CRITICAL**: No user story work can begin until this phase is complete

- [X] T003 Refactor `app/Filament/Pages/InventoryCoverage.php` to implement `HasTable` / `InteractsWithTable` and build a unified runtime coverage dataset from supported policy types and foundation types
- [X] T004 Update `resources/views/filament/pages/inventory-coverage.blade.php` to replace duplicated raw HTML tables with a Filament page shell that renders the native table surface

**Checkpoint**: Foundation ready - search, filters, and polish can now be added to the shared table surface

---

## Phase 3: User Story 1 - Find Supported Policy Types Quickly (Priority: P1) 🎯 MVP

**Goal**: Deliver an interactive coverage table that supports first-class rendering, type-name search, and primary-column sorting

**Independent Test**: Load the Inventory Coverage page as a Livewire table, verify rows render, search by type or label narrows the table correctly, and sorting reorders the main column deterministically

### Tests for User Story 1 ⚠️

- [X] T005 [P] [US1] Create table-rendering, search, and sort tests in `tests/Feature/Filament/InventoryCoverageTableTest.php`
- [X] T006 [P] [US1] Update tenant coverage page-load assertions for the interactive table surface in `tests/Feature/Filament/InventoryPagesTest.php`

### Implementation for User Story 1

- [X] T007 [US1] Implement searchable and sortable primary columns, default ordering, and custom-data pagination in `app/Filament/Pages/InventoryCoverage.php`
- [X] T008 [P] [US1] Add first-load table framing and search-oriented summary copy in `resources/views/filament/pages/inventory-coverage.blade.php`

**Checkpoint**: User Story 1 should now provide a credible searchable coverage table that can be demoed independently

---

## Phase 4: User Story 2 - Filter Coverage by Meaningful Dimensions (Priority: P2)

**Goal**: Add category filtering and conditional restore-mode filtering without changing the current coverage data model

**Independent Test**: Apply a category filter and verify only matching rows remain; when restore metadata exists, apply a restore filter and verify the filtered result set updates correctly; when restore metadata is absent, verify the restore filter is not exposed

### Tests for User Story 2 ⚠️

- [X] T009 [US2] Extend `tests/Feature/Filament/InventoryCoverageTableTest.php` with category-filter assertions plus deterministic restore-mode-present and restore-mode-absent coverage branches

### Implementation for User Story 2

- [X] T010 [US2] Implement source-driven category filter options and conditional restore-mode filter registration in `app/Filament/Pages/InventoryCoverage.php`
- [X] T011 [P] [US2] Add explicit zero-results empty-state copy and a single reset CTA in `resources/views/filament/pages/inventory-coverage.blade.php`

**Checkpoint**: User Story 2 should now let users narrow coverage by the dimensions called out in the spec without weakening existing semantics

---

## Phase 5: User Story 3 - Present Coverage as a Product-Grade Surface (Priority: P3)

**Goal**: Preserve badge semantics and upgrade the page presentation so it reads like a finished Filament product surface in light and dark mode

**Independent Test**: Verify badge labels, colors, icons, and dependency indicators still render from shared semantics; verify the page loads with polished table framing and no dark-mode readability regressions

### Tests for User Story 3 ⚠️

- [X] T012 [P] [US3] Extend `tests/Feature/Filament/InventoryCoverageTableTest.php` with badge and dependency-indicator regression assertions
- [X] T013 [P] [US3] Add interactive-surface regression coverage in `tests/Feature/Filament/InventoryPagesTest.php` for polished page framing and dark-mode-safe markup expectations

### Implementation for User Story 3

- [X] T014 [US3] Move type, category, restore, risk, dependency, and segment presentation into Filament table columns in `app/Filament/Pages/InventoryCoverage.php` using the shared badge catalogs and existing dependency semantics
- [X] T015 [P] [US3] Polish `resources/views/filament/pages/inventory-coverage.blade.php` for enterprise-grade section framing, scannable explanatory copy, and dark-mode-safe spacing around the Filament table

**Checkpoint**: All user stories should now be independently functional, and the page should read as a finished product surface instead of a raw implementation table

---

## Phase 6: Polish & Cross-Cutting Concerns

**Purpose**: Validate the complete feature and finish cross-story verification

- [X] T016 [P] Run focused verification from `specs/124-inventory-coverage-table/quickstart.md` with `vendor/bin/sail artisan test --compact tests/Feature/Filament/InventoryCoverageTableTest.php` and `vendor/bin/sail artisan test --compact tests/Feature/Filament/InventoryPagesTest.php`
- [X] T017 Run `vendor/bin/sail bin pint --dirty --format agent` after the page and test changes affecting `app/Filament/Pages/InventoryCoverage.php`, `resources/views/filament/pages/inventory-coverage.blade.php`, and `tests/Feature/Filament/`
- [ ] T018 [P] Complete manual dark-mode QA and badge-regression review using `specs/124-inventory-coverage-table/quickstart.md` and record any follow-up fixes before merge

---

## Dependencies & Execution Order

### Phase Dependencies

- **Setup (Phase 1)**: No dependencies - can start immediately
- **Foundational (Phase 2)**: Depends on Setup completion - blocks all user stories
- **User Stories (Phases 3-5)**: Depend on Foundational completion
- **Polish (Phase 6)**: Depends on all desired user stories being complete

### User Story Dependencies

- **User Story 1 (P1)**: Starts immediately after Foundational and is the MVP slice
- **User Story 2 (P2)**: Starts after Foundational and reuses the shared table infrastructure from Phase 2
- **User Story 3 (P3)**: Starts after Foundational and layers presentation polish on the same table surface

### Within Each User Story

- Tests must be written and fail before implementation changes are considered complete
- `app/Filament/Pages/InventoryCoverage.php` changes land before final view polish when a story spans both files
- Existing regression coverage in `tests/Feature/Filament/InventoryPagesTest.php` stays green while new story-specific assertions are added

### Parallel Opportunities

- `T001` and `T002` can run in parallel once the branch is ready
- `T005` and `T006` can run in parallel because they touch different test files
- `T007` and `T008` can run in parallel after Phase 2 because they touch different files
- `T010` and `T011` can run in parallel after `T009`
- `T012` and `T013` can run in parallel because they touch different test files
- `T014` and `T015` can run in parallel after the test expectations for US3 are established
- `T016` and `T018` can run in parallel once implementation is complete

---

## Parallel Example: User Story 1

```bash
# Launch both regression updates for the MVP slice together:
Task: "T005 [US1] Create table-rendering, search, and sort tests in tests/Feature/Filament/InventoryCoverageTableTest.php"
Task: "T006 [US1] Update tenant coverage page-load assertions in tests/Feature/Filament/InventoryPagesTest.php"

# After the foundation is in place, split code changes across page class and view:
Task: "T007 [US1] Implement searchable and sortable primary columns in app/Filament/Pages/InventoryCoverage.php"
Task: "T008 [US1] Add first-load table framing and search-oriented summary copy in resources/views/filament/pages/inventory-coverage.blade.php"
```

## Parallel Example: User Story 2

```bash
# After filter tests are defined, split page logic and empty-state polish:
Task: "T010 [US2] Implement source-driven category and restore filters in app/Filament/Pages/InventoryCoverage.php"
Task: "T011 [US2] Add zero-results empty-state reset CTA in resources/views/filament/pages/inventory-coverage.blade.php"
```

## Parallel Example: User Story 3

```bash
# Split regression coverage and final polish work across test and UI files:
Task: "T012 [US3] Extend badge and dependency regression assertions in tests/Feature/Filament/InventoryCoverageTableTest.php"
Task: "T013 [US3] Add polished-surface regression coverage in tests/Feature/Filament/InventoryPagesTest.php"
Task: "T014 [US3] Move badge and dependency presentation into Filament table columns in app/Filament/Pages/InventoryCoverage.php"
Task: "T015 [US3] Polish section framing and dark-mode-safe copy in resources/views/filament/pages/inventory-coverage.blade.php"
```

---

## Implementation Strategy

### MVP First (User Story 1 Only)

1. Complete Phase 1: Setup
2. Complete Phase 2: Foundational
3. Complete Phase 3: User Story 1
4. Validate table rendering, search, and sort independently
5. Demo the searchable Filament-native coverage table before adding filters and polish

### Incremental Delivery

1. Finish Setup + Foundational to establish the native table surface
2. Add User Story 1 and validate the searchable MVP
3. Add User Story 2 and validate filter behavior independently
4. Add User Story 3 and validate badge semantics and polish independently
5. Finish with focused automated verification, formatting, and manual QA

### Suggested MVP Scope

- Deliver through **Phase 3 / User Story 1** for the first merge candidate
- Defer advanced filtering and final polish until the searchable table foundation is accepted

---

## Notes

- All tasks follow the required checklist format: checkbox, task ID, optional `[P]`, required story label for story phases, and exact file paths
- No database, API, queue, or Graph work is included because the feature is read-only and runtime-derived
- The explicit Filament inspection-affordance exemption stays documented in the spec because coverage rows do not map to navigable records
