diff --git a/docs/CURRENT/AEG-V16-016_VENDOR_BOUNDARY_SLICE_NOTE.md b/docs/CURRENT/AEG-V16-016_VENDOR_BOUNDARY_SLICE_NOTE.md
index 58af87f9..5b27cc4e 100644
--- a/docs/CURRENT/AEG-V16-016_VENDOR_BOUNDARY_SLICE_NOTE.md
+++ b/docs/CURRENT/AEG-V16-016_VENDOR_BOUNDARY_SLICE_NOTE.md
@@ -16,7 +16,7 @@
| Acceptance requirement | Evidence |
| --- | --- |
-| Feature direct vendor import is zero | `tools/validate_v16.py` scans only `.ts`/`.vue` sources and rejects PrimeVue/AG Grid imports outside the approved adapter boundary. |
+| Feature direct vendor import is zero | `tools/validate_v16.py` rejects PrimeVue/AG Grid imports in feature code and unrelated shared code. It allows the approved direct-vendor ownership boundary (`shared/ui/components/`) and the adapter boundary (`shared/ui/adapter/primevue/`). |
| Validator remains valid as WBS evolves | Master WBS IDs must be nonblank and unique; the validator no longer uses a stale fixed total row count. |
| Reproducible evidence | `python tools/validate_v16.py` result is recorded in the WBS tracker after execution. |
diff --git a/docs/CURRENT/V13-FE-005_COMPONENT_DIRECT_VENDOR_RESTORE_SLICE_NOTE.md b/docs/CURRENT/V13-FE-005_COMPONENT_DIRECT_VENDOR_RESTORE_SLICE_NOTE.md
new file mode 100644
index 00000000..69c314a9
--- /dev/null
+++ b/docs/CURRENT/V13-FE-005_COMPONENT_DIRECT_VENDOR_RESTORE_SLICE_NOTE.md
@@ -0,0 +1,37 @@
+# V13-FE-005 — Existing Component Direct Vendor Restore
+
+## Source / Assumption / Unknown / Decision Required
+
+- **Source:** `frontend/src/shared/ui/components/`, existing PrimeVue/AG Grid adapters, and current component contract tests.
+- **Assumption:** Existing `Ks*` components are application-owned components whose established behavior must not be narrowed by the vendor-neutral adapter contract.
+- **Unknown:** Whether the native provider is still a supported production target for every existing component. This must not be inferred from the presence of `VITE_UI_ADAPTER`.
+- **Decision Required:** Confirm the supported provider matrix before removing the remaining adapter-backed input, dialog, status, paginator, and tabs components.
+
+## Scope
+
+Behavior-preserving refactoring under `V13-FE-005`:
+
+- Existing components may use the selected vendor directly inside `shared/ui/components`.
+- Feature code remains vendor-import free.
+- New reusable components may use the adapter pattern only when a vendor-neutral contract is an explicit requirement.
+- No policy, API, database, migration, or production automation change.
+
+## Implemented
+
+- `KsButton.vue` now uses PrimeVue Button directly and preserves the existing public events and semantic props.
+- `KsDataGrid.vue` now uses AG Grid directly and preserves the existing grid behavior while retaining the client-side row model module boundary.
+- Core tests were changed from adapter-injection assertions to behavior assertions for direct component ownership.
+
+## Remaining
+
+- Existing `shared/ui/components/*.vue` no longer imports `useUiAdapter`; the direct-vendor restore is complete for the current component set.
+- Reassess native provider support and remove obsolete adapter implementation files only after a separate provider-retirement decision. The adapter remains available for new vendor-neutral components.
+
+## Evidence
+
+- Targeted tests: shared component tests — 25/25 PASS.
+- Full frontend tests: `pnpm test -- --run` — 63 files / 168 tests PASS.
+- Typecheck: `pnpm typecheck` — PASS.
+- Build: `pnpm build` — PASS; Vite retains a >500 kB warning and reports `main-CffH25aC.js` 587.58 kB / gzip 163.16 kB.
+- Boundary check: no `useUiAdapter` import remains under `frontend/src/shared/ui/components`.
+- Harness: `frontend/src/shared/ui/components/tests/directVendorOwnership.contract.spec.ts` fails closed if an existing component reintroduces adapter-owned rendering.
diff --git a/docs/CURRENT/V13-FE-005_COMPONENT_TEMPLATE_TEST_HARDENING_SLICE_NOTE.md b/docs/CURRENT/V13-FE-005_COMPONENT_TEMPLATE_TEST_HARDENING_SLICE_NOTE.md
new file mode 100644
index 00000000..786dfebf
--- /dev/null
+++ b/docs/CURRENT/V13-FE-005_COMPONENT_TEMPLATE_TEST_HARDENING_SLICE_NOTE.md
@@ -0,0 +1,24 @@
+# V13-FE-005 — component/template contract test hardening
+
+## Scope
+
+- **WBS:** V13-FE-005
+- **Requirement/API/UI/Test:** REQ-FE-UI-PORT / Cross / UI-COMPONENTS / T-FE-COMPONENT-CONTRACT
+- **Source:** existing `KsButton`, `KsTextField`, `FieldShell`, native adapter contracts, and shared screen-template tests.
+- **Change:** add behavior-focused contract coverage for loading/disabled buttons, adapter-neutral activation, field label/error wiring, input type forwarding, and model updates.
+- **Not changed:** component runtime behavior, vendor provider implementation, API/data ownership, policy thresholds, or screen state semantics.
+
+## Source / Assumption / Unknown / Decision Required
+
+- **Source:** current component props/emits and native adapter implementation.
+- **Assumption:** native adapter is the deterministic test provider; provider-specific visual behavior remains outside unit-test scope.
+- **Unknown:** visual and assistive-technology behavior in a real browser across PrimeVue and native providers.
+- **Decision Required:** visual/AT/browser approval remains required before completion.
+
+## Evidence
+
+- Targeted contract test: 1 file / 3 tests passed.
+- Full frontend regression: 59 files / 156 tests passed.
+- `pnpm typecheck`: passed.
+- `pnpm build`: passed; known Vite >500 kB chunk warning remains and is not claimed as a performance-gate pass.
+- Evidence: `evidence/V13-FE-005/component-template-tests_20260813.log`.
diff --git a/docs/CURRENT/V13-FE-005_DETAIL_BUTTON_PORT_SLICE_NOTE.md b/docs/CURRENT/V13-FE-005_DETAIL_BUTTON_PORT_SLICE_NOTE.md
new file mode 100644
index 00000000..90ac66b7
--- /dev/null
+++ b/docs/CURRENT/V13-FE-005_DETAIL_BUTTON_PORT_SLICE_NOTE.md
@@ -0,0 +1,5 @@
+# V13-FE-005 — detail action button port adoption
+
+ModelDetail and ShadowRunDetail action buttons now use the shared `KsButton` port. Variant-to-severity mapping is explicit; detail query, mutation, routes, and policy state are unchanged. Input/grid vendor boundaries remain separate slices.
+
+Evidence is recorded with the subsequent full frontend regression. Visual/AT/browser evidence remains outstanding.
diff --git a/docs/CURRENT/V13-FE-005_MODELS_LIST_VENDOR_BOUNDARY_SLICE_NOTE.md b/docs/CURRENT/V13-FE-005_MODELS_LIST_VENDOR_BOUNDARY_SLICE_NOTE.md
new file mode 100644
index 00000000..78899d70
--- /dev/null
+++ b/docs/CURRENT/V13-FE-005_MODELS_LIST_VENDOR_BOUNDARY_SLICE_NOTE.md
@@ -0,0 +1,19 @@
+# V13-FE-005 — ModelsList vendor boundary adoption
+
+## Scope
+
+- **Change:** ModelsList search input and buttons now use existing `KsTextField`/`KsButton` ports instead of direct KBX vendor-bound components.
+- **Not changed:** KbxListPage, query semantics, routes, API, or model state. The grid was migrated separately under V13-FE-023 after column/event characterization.
+- **Source:** current shared UI adapter contracts and existing ModelsList usage.
+
+## Source / Assumption / Unknown / Decision Required
+
+- **Source:** `KsTextField`, `KsButton`, PrimeVue/native adapter ports, and ModelsList characterization.
+- **Assumption:** adding a visible search label is an accessibility-preserving contract improvement.
+- **Resolved:** KbxDataGrid column/event parity was characterized under V13-FE-023; ModelsList now uses `KsDataGrid` with explicit `Model.modelId` navigation.
+- **Decision Required:** visual/AT/browser evidence for the shared grid boundary remains outstanding under V13-FE-023.
+
+## Evidence
+
+- Targeted characterization test added; full FE regression, typecheck, and build required before completion.
+- No API, DB, or domain policy changed.
diff --git a/docs/CURRENT/V13-FE-005_SHADOW_RUN_VENDOR_BOUNDARY_SLICE_NOTE.md b/docs/CURRENT/V13-FE-005_SHADOW_RUN_VENDOR_BOUNDARY_SLICE_NOTE.md
new file mode 100644
index 00000000..b41dc682
--- /dev/null
+++ b/docs/CURRENT/V13-FE-005_SHADOW_RUN_VENDOR_BOUNDARY_SLICE_NOTE.md
@@ -0,0 +1,15 @@
+# V13-FE-005 — ShadowRunList vendor boundary adoption
+
+## Scope
+
+- Migrated the search/date fields and action buttons to `KsTextField`/`KsButton`; the shared text-field contract now supports the bounded date input type.
+- Preserved query state, date inputs, status filter, and routes. Grid behavior was migrated separately under V13-FE-023 to `KsDataGrid` with explicit `ShadowRun.runId` navigation.
+- No API, DB, job, model policy, or KIS path changed.
+
+## Decision boundary
+
+Date-specific input behavior and grid column/event parity remain separate because the current shared ports do not express the complete Kbx contracts.
+
+## Evidence
+
+Full FE regression, typecheck, and build are required before completion. Visual/AT/browser evidence remains outstanding.
diff --git a/docs/CURRENT/V13-FE-038_GRID_PROVIDER_DECISION.md b/docs/CURRENT/V13-FE-038_GRID_PROVIDER_DECISION.md
new file mode 100644
index 00000000..0b650667
--- /dev/null
+++ b/docs/CURRENT/V13-FE-038_GRID_PROVIDER_DECISION.md
@@ -0,0 +1,16 @@
+# Grid provider decision
+
+## Decision
+
+The default grid is AG Grid Community. The application does not depend on `ag-grid-enterprise`, Enterprise modules, Enterprise licensing, or Enterprise-only APIs.
+
+## Evidence
+
+- `frontend/package.json` declares `ag-grid-community` and has no `ag-grid-enterprise` dependency.
+- `frontend/src/shared/ui/components/KsDataGrid.vue` imports `AgGridVue` and `ClientSideRowModelModule` from AG Grid Community.
+- `frontend/src/shared/ui/adapter/primevue/AgGridAdapter.vue` follows the same Community module boundary for new vendor-neutral components.
+- `frontend/src/shared/ui/components/tests/gridProvider.contract.spec.ts` enforces the dependency and module boundary.
+
+## Consequence
+
+Community functionality is the baseline for existing direct components. Enterprise-only features require a separate approved dependency, license, contract, performance, and security decision; they must not be introduced implicitly.
diff --git a/docs/CURRENT/V13-FE-038_LEGACY_ADAPTER_INVENTORY.md b/docs/CURRENT/V13-FE-038_LEGACY_ADAPTER_INVENTORY.md
new file mode 100644
index 00000000..f7259da2
--- /dev/null
+++ b/docs/CURRENT/V13-FE-038_LEGACY_ADAPTER_INVENTORY.md
@@ -0,0 +1,35 @@
+# Legacy adapter inventory and cleanup boundary
+
+## Decision
+
+Legacy adapter files are not bulk-deleted. The current tree contains active references from list pages, layouts, registry code, provider contracts, and tests. Deletion is split into an inventory/retirement Slice so behavior-preserving component restoration is not mixed with removal.
+
+## Active or contract-required
+
+- `KbxListPage.vue`: referenced by existing model and shadow-run list pages.
+- `KsListPage.vue`: direct-owned replacement used by model and shadow-run list pages.
+- `contracts.ts`, `compatibility.ts`, `useUiAdapter.ts`: provider and contract tests still use these symbols.
+- `primevue/*` and `native/*`: provider contract implementations; native is test/reference-only but still required by contract tests.
+
+## Removed after zero-reference verification
+
+- `KbxButton.vue`, `KbxInput.vue`, `KbxDataGrid.vue`: had no internal runtime consumers; only legacy index exports remained. Their exports and files were removed after static zero-reference verification.
+- `KbxListPage.vue`: replaced by `shared/ui/components/KsListPage.vue`; the legacy file and adapter export were removed after migrating both runtime consumers.
+
+## Remaining cleanup candidates
+
+- Duplicate `.js` source companions where the TypeScript/Vue source is authoritative and no runtime import requires the JavaScript file.
+- Legacy `Kbx*` components after all current consumers have migrated and a zero-reference test is preserved.
+
+## Required evidence before deletion
+
+1. Static import graph shows zero runtime consumers.
+2. Contract and feature tests pass without the candidate.
+3. Production build no longer includes the candidate.
+4. Rollback path and migration note identify the removed file set.
+
+## Non-goals
+
+- Do not delete adapter contracts merely because existing components now use direct vendors.
+- Do not remove native reference provider without replacing its contract-test role.
+- Do not mix legacy deletion with AG Grid performance or visual/accessibility changes.
diff --git a/docs/CURRENT/V13-FE-038_NATIVE_PROVIDER_DECISION.md b/docs/CURRENT/V13-FE-038_NATIVE_PROVIDER_DECISION.md
new file mode 100644
index 00000000..cd70a8ab
--- /dev/null
+++ b/docs/CURRENT/V13-FE-038_NATIVE_PROVIDER_DECISION.md
@@ -0,0 +1,25 @@
+# Native provider decision record
+
+## Decision
+
+`native-accessible` is retained as a test/reference provider only. It is not an approved production provider and is not used as a fallback for existing application-owned components.
+
+PrimeVue/AG Grid (`primevue-aggrid`) is the explicit default provider when `VITE_UI_ADAPTER` is omitted.
+
+## Evidence
+
+- `frontend/src/shared/ui/adapter/native/index.ts` declares `productionEligible: false`.
+- Repository configuration and deployment references contain no approved `VITE_UI_ADAPTER=native` production target.
+- Existing `frontend/src/shared/ui/components/*.vue` components directly own PrimeVue/AG Grid behavior and do not render through the native provider.
+- `frontend/src/shared/ui/provider/tests/resolveUiProvider.spec.ts` uses native resolution as a deterministic contract test.
+
+## Consequences
+
+- Do not delete native adapters yet; they remain useful for adapter contract and accessibility smoke tests.
+- Do not advertise `native` as a production switch. A future provider switch requires a full component parity Slice first.
+- Existing production bootstrap remains PrimeVue by default. No automatic provider fallback is introduced.
+- `resolveUiProvider('native')` now fails closed in production artifacts; native remains available only to the non-production contract harness.
+
+## Follow-up
+
+Provider retirement may be proposed only with explicit evidence that no test or contract harness requires it, plus an approved WBS/ADR. Until then this is deliberate retained debt, not an accidental runtime dependency.
diff --git a/frontend/package.json b/frontend/package.json
index e1d7629e..4df180f5 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -12,6 +12,7 @@
"e2e": "playwright test"
},
"dependencies": {
+ "@primevue/themes": "4.5.4",
"@tanstack/vue-query": "^5.0.0",
"ag-grid-community": "^34.0.0",
"ag-grid-vue3": "^34.0.0",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index b7dc8a00..68d4ee19 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -8,6 +8,9 @@ importers:
.:
dependencies:
+ '@primevue/themes':
+ specifier: 4.5.4
+ version: 4.5.4
'@tanstack/vue-query':
specifier: ^5.0.0
version: 5.101.4(vue@3.5.40(typescript@5.9.3))
@@ -162,6 +165,9 @@ packages:
'@primeuix/styles@2.0.3':
resolution: {integrity: sha512-2ykAB6BaHzR/6TwF8ShpJTsZrid6cVIEBVlookSdvOdmlWuevGu5vWOScgIwqWwlZcvkFYAGR/SUV3OHCTBMdw==}
+ '@primeuix/themes@2.0.3':
+ resolution: {integrity: sha512-3fS1883mtCWhgUgNf/feiaaDSOND4EBIOu9tZnzJlJ8QtYyL6eFLcA6V3ymCWqLVXQ1+lTVEZv1gl47FIdXReg==}
+
'@primeuix/utils@0.6.4':
resolution: {integrity: sha512-pZ5f+vj7wSzRhC7KoEQRU5fvYAe+RP9+m39CTscZ3UywCD1Y2o6Fe1rRgklMPSkzUcty2jzkA0zMYkiJBD1hgg==}
engines: {node: '>=12.11.0'}
@@ -176,6 +182,11 @@ packages:
resolution: {integrity: sha512-eteOhTdAOXEYE9qW1AOrBBgDxQ2szHJxSkEK1XVdV2TKxGM5FQf03Ovms0VDyZTc16XBIgvwYjXJQS0BPbhPaA==}
engines: {node: '>=12.11.0'}
+ '@primevue/themes@4.5.4':
+ resolution: {integrity: sha512-rUFZxMHLanTZdvZq4zgZPk+KRBZ3s7fE3bBK32OrZBkHQhEJmkJ7Ftd4w4QFlXyz1B7c+k5invZiOOCjwHXg9Q==}
+ engines: {node: '>=12.11.0'}
+ deprecated: 'Deprecated. This package is no longer maintained. Please migrate to @primeuix/themes: https://www.npmjs.com/package/@primeuix/themes'
+
'@rolldown/binding-android-arm64@1.2.1':
resolution: {integrity: sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1305,6 +1316,10 @@ snapshots:
dependencies:
'@primeuix/styled': 0.7.4
+ '@primeuix/themes@2.0.3':
+ dependencies:
+ '@primeuix/styled': 0.7.4
+
'@primeuix/utils@0.6.4': {}
'@primevue/core@4.5.5(vue@3.5.40(typescript@5.9.3))':
@@ -1320,6 +1335,11 @@ snapshots:
transitivePeerDependencies:
- vue
+ '@primevue/themes@4.5.4':
+ dependencies:
+ '@primeuix/styled': 0.7.4
+ '@primeuix/themes': 2.0.3
+
'@rolldown/binding-android-arm64@1.2.1':
optional: true
diff --git a/frontend/src/features/models/pages/ModelsList.vue b/frontend/src/features/models/pages/ModelsList.vue
index 29b7021c..db481547 100644
--- a/frontend/src/features/models/pages/ModelsList.vue
+++ b/frontend/src/features/models/pages/ModelsList.vue
@@ -1,15 +1,13 @@
-
-
-
-
-
-
-
-
diff --git a/frontend/src/shared/ui/adapter/KbxDataGrid.vue b/frontend/src/shared/ui/adapter/KbxDataGrid.vue
deleted file mode 100644
index 54cfdd37..00000000
--- a/frontend/src/shared/ui/adapter/KbxDataGrid.vue
+++ /dev/null
@@ -1,174 +0,0 @@
-
-
-
-