portallisted
Install: claude install-skill stevehansen/eidet
# Portal — priming
**Canonical spec:** `docs/domains/portal.md` — read it for the section rules, all invariants, key files,
and gotchas. Terms of record: `UBIQUITOUS_LANGUAGE.md` § Canon (for the Canon/Portal distinction).
A read-only projection of live memories into cited HTML sections: "what has this agent actually learned
here?", auditable by a human. Human surface only — no MCP tool, on purpose.
## Core invariants (get these right)
- **Every claim is a citation** — render through `PortalMarkup.Cite` (anchor to `#memory/<id>` with
`data-mid`). A section must never state something it can't hyperlink.
- **Escape everything** via `PortalMarkup.Esc`; memory content is agent-written and unescaped.
- **Selection rules are deterministic and total** — first-match precedence, ties broken on id, so two
renders of the same corpus agree.
- **Sections read only `PortalContext`** — the renderer pre-fetches once; a section issuing its own query
breaks that contract.
- **v1 renders live and caches nothing**; `augment` is hardcoded `"off"` (the field exists so the API
shape survives augmentation landing).
- **Normalize the repo id once at the top** — `BrowseAsync` normalizes internally, `GetCountsByTypeAsync`
doesn't.
## Key files / reuse
- `src/Eidet.Core/Portal/PortalRenderer.cs` — the facade + the default section list.
- `src/Eidet.Core/Portal/IPortalSection.cs` — implement this (it's `internal`) to add a section.
- `src/Eidet.Core/Portal/PortalMarkup.cs` — escaping, cit