ducoterra
4dbac1660a
Build and Push Containers / build-and-push-app (push) Successful in 1m49s
Build and Push Containers / build-and-push-db (push) Successful in 13s
phase: 101_tokens_page_overhaul
All gates verified green — no defects found, nothing to fix. Final report:
## Phase 101 — final verification pass (all tasks already complete; verified, not re-implemented)
**Verified against the working tree** (task files 01–04 present in `complete/`):
- Active/revoked table split (Status column gone, section hidden while 0 revoked, per-table search with query state surviving re-renders) in `frontend/index.html` + `tokens.js`
- `generateToken()` refuses blank/whitespace names (`Give the token a name first.`, no request); `|| "token"` fallback deleted
- Atomic rotation: `regenerate_token` service + `POST /api/tokens/{id}/regenerate` (201 new-plaintext-once / 404 / 409 / router-wide 403) + `TokenListItem.revoked_at` (D5)
- Regenerate two-step confirm UI + CSS (`.token-regenerate`, neutral hover, no new hue); A4 pins intact
**Test / lint / coverage results:**
- `uv run pytest` → **2065 passed**
- `uv run pytest --cov=app --cov-report=term-missing` → **TOTAL 99%** (>90% ✓)
- `uv run ruff check . && uv run pyright` → clean (0 errors)
- `uv run pytest tests/e2e/test_tokens_page.py -v --no-cov` → **4 passed** (isolation, DB up)
- Regression, each in isolation: `test_api_tokens.py` **9 passed**, `test_admin_auth.py` **6 passed**, `test_shared_header.py` **6 passed**, `test_theme_semantic_completion.py` **8 passed** (its revoked-pill pin was correctly re-scoped to the revoked table in this phase)
**Completion criteria:** 1 ✓ split+search (E2E 1–2) · 2 ✓ required name (E2E 3 + source pin) · 3 ✓ rotation end-to-end, old token refused at gate (E2E 4 + API 404/409 pinned) · 4 ✓ A4 holds (list carries no plaintext/hashes) · 5 ✓ suite/coverage/lint green · 6 ✓ E2E + regressions green in isolation · 7 commit left to the harness per executor rules (all changes uncommitted in the working tree)
**Deviations:** none. Next pending phase: `98_sync_summary_visibility`.
2026-09-12 15:16:02 -04:00
..
2026-09-07 23:54:41 -04:00
2026-09-11 03:42:51 -04:00
2026-09-07 12:39:01 -04:00
2026-08-28 15:57:59 -04:00
2026-09-07 12:39:01 -04:00
2026-09-10 00:23:08 -04:00
2026-09-08 10:03:10 -04:00
2026-09-10 00:23:08 -04:00
2026-09-07 12:39:01 -04:00
2026-09-07 12:39:01 -04:00
2026-09-10 00:23:08 -04:00
2026-08-28 07:02:24 -04:00
2026-09-11 03:42:51 -04:00
2026-08-21 13:42:21 -04:00
2026-08-21 13:42:21 -04:00
2026-09-12 13:37:19 -04:00
2026-09-01 03:52:03 -04:00
2026-09-07 12:39:01 -04:00
2026-09-08 01:11:45 -04:00
2026-09-11 22:48:02 -04:00
2026-09-09 17:22:24 -04:00
2026-09-10 00:23:08 -04:00
2026-09-08 09:37:33 -04:00
2026-09-12 15:16:02 -04:00
2026-08-29 18:32:15 -04:00
2026-09-11 22:48:02 -04:00
2026-09-03 11:17:47 -04:00
2026-09-08 01:56:37 -04:00
2026-08-27 01:04:16 -04:00
2026-09-01 03:52:03 -04:00
2026-09-08 22:31:45 -04:00
2026-09-08 22:31:45 -04:00
2026-09-06 06:31:31 -04:00
2026-09-06 06:31:31 -04:00
2026-09-05 16:04:40 -04:00
2026-09-09 01:45:42 -04:00
2026-09-09 01:45:42 -04:00
2026-09-11 22:48:02 -04:00
2026-09-11 22:48:02 -04:00
2026-09-11 13:16:20 -04:00
2026-08-26 22:39:14 -04:00
2026-09-03 11:17:47 -04:00
2026-08-25 22:42:10 -04:00
2026-09-12 13:37:19 -04:00
2026-09-08 22:31:45 -04:00
2026-09-11 00:59:35 -04:00
2026-09-10 16:43:08 -04:00
2026-08-25 20:22:51 -04:00
2026-09-10 16:43:08 -04:00
2026-09-12 13:37:19 -04:00
2026-09-11 03:42:51 -04:00
2026-09-07 23:08:46 -04:00
2026-09-11 03:42:51 -04:00
2026-09-12 13:37:19 -04:00
2026-09-05 10:26:39 -04:00
2026-09-09 17:22:24 -04:00
2026-09-10 00:23:08 -04:00
2026-09-03 13:39:15 -04:00
2026-09-11 03:42:51 -04:00
2026-09-09 17:22:24 -04:00
2026-09-08 22:31:45 -04:00
2026-09-12 13:37:19 -04:00
2026-09-12 13:37:19 -04:00
2026-09-02 15:55:33 -04:00
2026-08-30 23:39:15 -04:00
2026-08-29 18:32:15 -04:00
2026-09-03 11:17:47 -04:00
2026-09-06 06:31:31 -04:00
2026-08-22 16:44:42 -04:00
2026-09-06 06:31:31 -04:00
2026-08-25 13:46:32 -04:00
2026-09-01 04:20:26 -04:00
2026-08-25 17:48:37 -04:00
2026-08-31 23:52:22 -04:00
2026-09-11 22:48:02 -04:00
2026-08-27 23:44:35 -04:00
2026-09-08 02:38:45 -04:00
2026-09-10 16:43:08 -04:00
2026-09-10 16:43:08 -04:00
2026-08-28 17:10:02 -04:00
2026-09-07 12:39:01 -04:00
2026-09-12 15:16:02 -04:00
2026-09-10 16:43:08 -04:00
2026-09-12 13:37:19 -04:00