diff --git a/PROJECT_STATE.md b/PROJECT_STATE.md index d01250f1..be947785 100644 --- a/PROJECT_STATE.md +++ b/PROJECT_STATE.md @@ -14,6 +14,14 @@ requirements as mandatory; do not replace the running server stack in place. ## Current product shape +Gitea #28–#31 follow-up is implemented in this checkout: Workspace's four tabs, +Database list-first entry without the preparation footer, full-height Pi instructions +with installation-host OS selection, and short Admin navigation labels. Core and +session behavior are retained. These follow-up changes are **not yet rebuilt into +local Docker**; see `docs/reports/2026-09-12-admin-issues-28-31.md` for test/review results. +The host CLI must regenerate its Compose projection on the destination installation +to identify the physical host OS correctly when the backend runs in Docker. + The latest context-shelf A and five Administration pages are implemented locally. At the owner's request, local Docker project `thothii-18998cca7b0a` was rebuilt and its core/frontend recreated on 2026-09-12. The real UI at `http://127.0.0.1:8080` diff --git a/docs/adr/0020-unify-administration-pages-and-use-namespaced-routes.md b/docs/adr/0020-unify-administration-pages-and-use-namespaced-routes.md index 0efd7b8f..b2939076 100644 --- a/docs/adr/0020-unify-administration-pages-and-use-namespaced-routes.md +++ b/docs/adr/0020-unify-administration-pages-and-use-namespaced-routes.md @@ -17,4 +17,11 @@ same-document integration boundary while leaving room for a future path adapter. The accepted visual direction is A / Workbench for all five surfaces; B and C remain recoverable prototypes. Workspace owns readiness and preprocessing, consuming the Database catalog as a prerequisite. Database owns connection/binding, schema synchronization, descriptions and sensitivity; -its page links to the related Workspace's preparation rather than duplicating the preprocessing action. +the preprocessing action remains exclusively in Workspace preparation. + +On 2026-09-12, the owner refined this direction in +[Gitea #29](https://git.tylconsulting.it/mptyl/ThothII/issues/29): Database opens at its +catalog list, with its original table space and margins, and no Workspace preparation footer. +This supersedes the earlier requirement for a preparation link in that page. Workspace +remains reachable through the shared Administration navigation; its Preparation tab still +links to Database configuration and schema when catalog work is needed. diff --git a/docs/reports/2026-09-12-admin-issues-28-31.md b/docs/reports/2026-09-12-admin-issues-28-31.md index 035cb3e9..36fd1128 100644 --- a/docs/reports/2026-09-12-admin-issues-28-31.md +++ b/docs/reports/2026-09-12-admin-issues-28-31.md @@ -38,5 +38,40 @@ the existing public Pi service and host projection contracts cover OS transport. Red tests were observed before adding tabs, restoring list entry, selecting OS tabs, projecting the host platform, and shortening navigation labels. -Verification results and independent Standards/Spec reviews are recorded below when complete. +- Frontend full Vitest run: 82 files, 677 tests passed. +- Backend full Vitest run: 108 files passed, one skipped; 1,380 tests passed, 40 existing + optional tests skipped. Backend typecheck passed. +- After review fixes: all five affected frontend suites passed (163 tests, including + two new production-mode persisted-navigation regressions); frontend typecheck and + production build passed. The existing large-chunk advisory remains. +- The complete host CLI suite (`go test ./...`) passed across all 21 packages, including + the OS model-projection assertion. +- Strict documentation build passed. +- Read-only browser QA of actual React pages at 1280, 768 and 390 CSS pixels checked + Workspace tabs, Database table space, and Pi height/overflow. Pi's long instructions + initially exposed horizontal page overflow at 390 pixels; constrained grid children + and narrow definition lists corrected it. Database QA used an empty synthetic catalog; + the unit suites exercise populated tables, columns, edits and operation guards. +- Docker and real-stack Playwright acceptance were not run for this follow-up. + The preview is synthetic and read-only, not a deployment or provider smoke test. + +## Standards + +Initial independent review: one documented ADR conflict and one maintainability +judgement call. ADR 0020 now records the owner's superseding #29 footer decision. +Workspace and Pi now share keyboard tab navigation rather than duplicate its switch. +The independent follow-up review confirmed both findings resolved, with no new regressions. + +## Spec + +Initial independent review: two P2 findings. Fresh Database entry could still restore +Tables/Relationships from local storage, and a real-stack test retained the old Admin +button-label regex. Both were corrected; fresh entry is list-first while in-memory +navigation is retained when moving between already mounted app surfaces. +The independent follow-up review confirmed both findings resolved, with no new regressions. + +Review summary: Standards 2 findings resolved, 0 outstanding; Spec 2 findings resolved, +0 outstanding. Both reviews were read-only, relative to the user-approved baseline. + Docker has not been rebuilt for this follow-up; the read-only QA preview uses the changed source. +No Gitea issue state or remote branch was changed. diff --git a/frontend/e2e/memory-real.spec.ts b/frontend/e2e/memory-real.spec.ts index 324f981a..bb68aebd 100644 --- a/frontend/e2e/memory-real.spec.ts +++ b/frontend/e2e/memory-real.spec.ts @@ -108,9 +108,9 @@ LocalEvidenceArchive(root).initialize() async function openMemory() { await page.getByRole("button", { name: "Administration", exact: true }).click(); expect((await page.getByRole("button", { - name: /^(Database management|Memory management|Evidence management)$/, + name: /^(Database|Memory|Evidence)$/, }).allTextContents()).map(text => text.trim())).toEqual([ - "Database management", "Memory management", "Evidence management", + "Database", "Memory", "Evidence", ]); await page.getByRole("button", { name: "Memory", exact: true }).click(); await page.screenshot({ path: "/private/tmp/thothii-m1-memory-opening.png", fullPage: true }); diff --git a/frontend/src/components/ui/tab-navigation.ts b/frontend/src/components/ui/tab-navigation.ts new file mode 100644 index 00000000..9014b20f --- /dev/null +++ b/frontend/src/components/ui/tab-navigation.ts @@ -0,0 +1,11 @@ +/** Horizontal tab lists activate and focus the same item when navigating by keyboard. */ +export function nextTabIndex(key: string, current: number, count: number): number | undefined { + if (count === 0) return undefined; + switch (key) { + case "ArrowRight": return (current + 1) % count; + case "ArrowLeft": return (current + count - 1) % count; + case "Home": return 0; + case "End": return count - 1; + default: return undefined; + } +} diff --git a/frontend/src/shell/AppShell.tsx b/frontend/src/shell/AppShell.tsx index 5a96c559..748228b6 100644 --- a/frontend/src/shell/AppShell.tsx +++ b/frontend/src/shell/AppShell.tsx @@ -806,7 +806,6 @@ export function AppShell({ canLogout }: AppShellProps) {