diff --git a/docs/superpowers/specs/2026-11-12-cms-legal-epi-platform-design.md b/docs/superpowers/specs/2026-11-12-cms-legal-epi-platform-design.md index d6ef42e..ce4af8c 100644 --- a/docs/superpowers/specs/2026-11-12-cms-legal-epi-platform-design.md +++ b/docs/superpowers/specs/2026-11-12-cms-legal-epi-platform-design.md @@ -264,7 +264,7 @@ They are the "mapping study" layer of legal epidemiology. - **S0, now.** Plan A continues: Tasks 7–13 (data, stakes, payment table, assembly and citecheck), 15 (chat) and 16 (golden test). **Task 14's standalone page is folded into S1**, so there is one page rather than two. - **S1. App shell, Contents, Dossier and Sources (read-only).** - - Covers HOME-VISITS, with URL state, behind SSO, in the existing llm service. + - Covers HOME-VISITS, with URL state, behind SSO, served in Gitea at `git./dossier`, with its API from the llm service. - Acceptance is Plan A's golden home-visit dossier rendered in the app. - **S2. Review queue, analyst store, job worker and corrections.** Sources management: add source, notes, qualitative codes. This is the Zotero abstraction. - **S3. Surveillance grid and codebook.** A legal-variable extractor (rules first, local model second), `pfs.code_exposure` generalized to any coded variable, CSV and codebook export. @@ -320,11 +320,17 @@ All existing repo rules apply: - NLM/UMLS data never published; - GPU budget shared with tagging and chat; extraction stays resumable. -### Tech (my call) +### Tech -- **Where it is served:** the existing llm FastAPI service at `/ui/app`. -- **Front end:** one HTML file plus vanilla ES modules and vendored libraries only, with no build step, matching `/ui/search` and `/ui/pdf`. -- **API:** a JSON API under `/api/policy/…` that reads the DuckDB replica (read-only), bib and the analyst store, plus a small write API for analyst actions. +**Where it lives (user decision, 2026-11-12): inside Gitea, as the stack's front door. No Gitea fork.** + +- Gitea stays upstream with the fhirworx theme compiled in (`infra/gitea/README.md`: no source changes). Custom templates can only override existing pages, and they cannot read the dossier data, so the app is not a Go template page. +- **The page:** static files in Gitea's bind-mounted custom directory, `infra/gitea/custom/public/assets/dossier/`. That is one `index.html` plus vanilla ES modules and vendored libraries, with no build step. + - It is styled with the compiled fhirworx theme and the HTI-5 tokens that the homelab landing (`templates/homelab/landing.tmpl`) uses, so it looks native. + - It is linked from the Gitea navbar (`custom/extra_links.tmpl`) and from a tile on the homelab landing. +- **The URL:** `git./dossier`. A Traefik router on the git host (priority 1000, the same pattern as `git-projects-filter` and `reach-releases`) applies `git-sso` and rewrites the path to `/assets/dossier/index.html`, which Gitea serves. A second router keeps `/assets/dossier/*` behind `git-sso` too. State lives in the URL fragment (`git./dossier#/family/HOME-VISITS/timeline`). +- **The API:** same origin, so there is no CORS and the SSO cookie applies. A third Traefik router sends `git./dossier/api/…` through `git-sso` and a strip-prefix middleware to the llm FastAPI service. The service exposes a JSON API under `/api/policy/…` that reads the DuckDB replica (read-only), bib and the analyst store, plus a small write API for analyst actions. +- **Caching:** Gitea caches `/assets/` for 6 h. The page loads its modules with a version query string, so a deploy reaches the browser at once. ## Left to the builder