# IPZ Card lifecycle

- **ID:** IPZ-CARD-LIFECYCLE-2026-08-15
- **Status:** IDLE
- **Task:** Delivery 5 Card lifecycle slice
- **Source request:** Assess the canonical Card primitive from current `origin/master` and implement the smallest complete Delivery 5 lifecycle convergence directly, without delegation, external models, or skills. A subsequent independent review found the collapsible header mouse-only and requires an accessible toggle contract: keyboard focusability, semantic control behavior, synchronized `aria-expanded`, Enter/Space activation, and listener cleanup through update, destroy, and remount.

## Outcome and acceptance criteria

`Card` retains all public factories, generated DOM structure, classes, collapse behavior, DOM identity, and accessibility. Its lifecycle classification truthfully reflects its actual collapsible state. Collapsible cards expose a keyboard-focusable button control with synchronized `aria-expanded`; click, Enter, and Space toggle it, while `update(next)`, `destroy()`, and remount preserve that contract and release all owned listeners. Focused tests cover actual behavior and compatibility. Generated inventory/report records are current. Focused tests, the full admin suite, lint, production build, inventory/gate, and the full dependency-ready factory gate pass. The result is committed locally only and is not landed.

## Constraints

- Begin at current `origin/master`; preserve existing unrelated work.
- Do not modify unrelated components or page behavior.
- Do not delegate, invoke skills, or use external models.
- Preserve public behavior, DOM identity, and accessibility.

## Execution steps

1. Read the Delivery 5 lifecycle contract, current Card implementation, registry/report, relevant landed lifecycle components, and focused test conventions.
2. Classify Card truthfully and make only the lifecycle change the contract requires.
3. Add focused behavior and compatibility coverage; regenerate generated records.
4. Run every requested verification gate with dependencies installed.
5. Commit a terse local message and do not land.

## Current receipt

`origin/master` and HEAD both resolved to `1da22ef8a1e91d579ea067e5debfb36f3554a137` at start. Card was correctly reclassified as stateful because collapsible cards own collapsed state in their root class. The independent accessibility finding is repaired: collapsible headers are focusable controls with `role="button"`, `tabindex="0"`, and synchronized `aria-expanded`; click, Enter, and Space toggle the same state. Disabling collapsibility removes the control semantics and both listeners; destroy removes them and remount restores them. Focused coverage passed (3 tests), including keyboard activation, ARIA synchronization, and listener cleanup. Inventory reports were regenerated. The full admin suite, JavaScript lint, production build, inventory check, UI gate, and `COMPOSER_PROCESS_TIMEOUT=1200 bash tools/factory-gate.sh all` all passed. The dependency installers only reported optional package funding notices; these are informational. The repository-root pre-commit hook’s root-manifest and unavailable-Trivy notices are scope/environment notices; plugin-local JavaScript, PHP, Composer, and factory checks completed successfully. Guarded landing then found stale tracked generated chunk `456.104997a9.js`. Locked admin dependencies and a production build confirmed runtime references `456.20a9a9be.js`; the orphaned chunk was removed and committed. A second production build made no changes, and `COMPOSER_PROCESS_TIMEOUT=1200 bash tools/factory-gate.sh all` passed again. The worktree is clean. Do not land.

## Next executable action

No worker is active. Retain the local commits without landing them unless a later request changes scope.