Added three new documents with nine Mermaid diagrams to make the strangler fig strategy visible: - README: container topology diagram at the start, with the proxy entry point and three seams labelled - docs/architecture.md: five diagrams tracing the exact implementation: - The four seams and who holds authority at each boundary - How by-id read goes through the resolver, but list-read bypasses it - Case lifecycle state machine (the strategy in one picture) - Take-ownership sequence with failure windows annotated - Write-through error round-trip showing zero validation logic crossed - docs/playbook.md: how to apply this to a production system: - Write-path decision tree (five read/write patterns) - Cutover ordering diagram (side-effects-free first, least recoverable last) - Seven transferable rules with pointers to the files that demonstrate them - Scope diagram of what's proven vs. left as your decisions Resolved all 13 dangling § citations (to an absent spec doc) by linking to the actual files or dropping them. Replaced portal-frontend/README.md boilerplate with accurate content. All diagrams parse and link-check clean. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
21 lines
881 B
Markdown
21 lines
881 B
Markdown
# portal-frontend
|
|
|
|
Session 2's Angular portal — the real UI over the new backend, reachable at
|
|
**http://localhost:8080/portal** once the stack is up (`docker compose up -d`
|
|
from the repo root). It is served by its own nginx container behind the shared
|
|
proxy, *not* by `ng serve`.
|
|
|
|
The whole app is driven off the API's `actions` and `seams` blocks: it renders
|
|
whatever write path each case advertises (`writeThrough`, `redirect`, `owned`,
|
|
`transition`, `query`) and never builds an endpoint URL from an id. That is
|
|
what makes the same screens work unchanged for a legacy-owned case and an
|
|
adopted one — see [`docs/architecture.md`](../docs/architecture.md).
|
|
|
|
```
|
|
npm test # unit tests (vitest, via ng test)
|
|
npm run build # production build
|
|
```
|
|
|
|
This app is **zoneless**: state written from a `subscribe` callback must land
|
|
in a signal, or the DOM will not update.
|