Implements docs/superpowers/specs/2026-10-24-house-encyclopedia-design.md following docs/superpowers/plans/2026-10-24-house-encyclopedia.md. This branch contains the docs commits of #16, so #16 can be closed once this merges.
What it does
Generation, nightly at 06:00 Europe/Berlin, after a sync. The AI first plans the article set, giving notable subjects their own article and folding the rest into a parent article's section. It then writes each article in German.
Leak protection: a deterministic scanner checks for this house's IPs, IP prefixes, FQDNs, renner.uno names, MACs, HA entity IDs and paths. An LLM leak check follows. Every image is private. Titles and slugs are checked too.
Translation: English is translated unit by unit, with public and private units sent in separate requests. The English text is then scanned and leak-checked again.
Saving: all changes go to konairius/notes in one commit under articles/<lang>/.
Cost control: attempt memory in articles/_state.json means a failure is never paid for twice on the same input. A run stops cleanly on a spend limit or overload and keeps what it already wrote. The run can never stop the host.
Pages at /house (static SSR, [AllowAnonymous], Wikipedia-like layout): a properties panel that doesn't overlap diagrams, a linked table of contents, Mermaid (vendored, securityLevel: 'strict') and a de/en switch.
For anonymous readers, private sections are removed server-side. A Markdig AST guard locks the whole body on anything unexpected.
Links to articles a reader can't see are dropped along with their text.
Link URLs are allowlisted (http, https, mailto, #, /house/…).
An anonymous request for a private article gets the same 404 as a missing one.
Off by default:Wiki:Encyclopedia:Enabled=false. The homelab PR turns it on in planning-only mode (MaxArticles=0).
Review
Each of the 11 tasks was built by a fresh subagent and reviewed by a fresh reviewer. Ten tasks needed fix rounds. Task 2 (redaction) needed three, and Task 10 (rendering) two.
A final whole-branch review on Fable led to one more fix wave, which a scoped re-review then approved.
Frontmatter.Unquote now unescapes \" and \\ inside double-quoted values, for all notes. This is correct YAML. DepositFactUseCase now escapes \ as well.
MessagesTransport throws ModelUnavailableException (mapped to 502) for 429/529 after retries, overload and rate-limit stream errors, and spend-limit 400s. Other errors throw HttpRequestException with its StatusCode set. A stalled SSE stream fails after 90 s. The Facts page handles the new exception.
MapStaticAssets().AllowAnonymous(): static assets are readable without login. Nothing sensitive is in wwwroot.
Known, deferred
Images: distilled notes rarely carry attachments, so the first articles will mostly have no photos. Photos are private anyway.
A rare layout (a fenced code block on a list-item line, followed by an infobox with a private row) locks the article for anonymous readers. This affects availability only; nothing leaks.
The leak scanner errs toward private, for example on version strings that also appear as IPs in the sources.
An anonymous error page renders in the MainLayout shell. Cosmetic only; no data is shown.
Implements `docs/superpowers/specs/2026-10-24-house-encyclopedia-design.md` following `docs/superpowers/plans/2026-10-24-house-encyclopedia.md`. This branch contains the docs commits of #16, so #16 can be closed once this merges.
## What it does
- **Generation, nightly at 06:00 Europe/Berlin, after a sync.** The AI first plans the article set, giving notable subjects their own article and folding the rest into a parent article's section. It then writes each article in German.
- Leak protection: a deterministic scanner checks for this house's IPs, IP prefixes, FQDNs, `renner.uno` names, MACs, HA entity IDs and paths. An LLM leak check follows. Every image is private. Titles and slugs are checked too.
- Translation: English is translated unit by unit, with public and private units sent in separate requests. The English text is then scanned and leak-checked again.
- Saving: all changes go to `konairius/notes` in one commit under `articles/<lang>/`.
- Cost control: attempt memory in `articles/_state.json` means a failure is never paid for twice on the same input. A run stops cleanly on a spend limit or overload and keeps what it already wrote. The run can never stop the host.
- **Pages at `/house`** (static SSR, `[AllowAnonymous]`, Wikipedia-like layout): a properties panel that doesn't overlap diagrams, a linked table of contents, Mermaid (vendored, `securityLevel: 'strict'`) and a de/en switch.
- For anonymous readers, private sections are removed server-side. A Markdig AST guard locks the whole body on anything unexpected.
- Links to articles a reader can't see are dropped along with their text.
- Link URLs are allowlisted (http, https, mailto, #, /house/…).
- An anonymous request for a private article gets the same 404 as a missing one.
- Pages send `noindex` and `no-store`. Everything outside `/house` stays behind login.
- **Off by default:** `Wiki:Encyclopedia:Enabled=false`. The homelab PR turns it on in planning-only mode (`MaxArticles=0`).
## Review
- Each of the 11 tasks was built by a fresh subagent and reviewed by a fresh reviewer. Ten tasks needed fix rounds. Task 2 (redaction) needed three, and Task 10 (rendering) two.
- A final whole-branch review on Fable led to one more fix wave, which a scoped re-review then approved.
- Tests: `dotnet test Wiki.slnx -c Release` passes 542 tests (Core 174, Contracts 83, Application 144, Host 141).
## Behaviour changes outside the feature
- `Frontmatter.Unquote` now unescapes `\"` and `\\` inside double-quoted values, for all notes. This is correct YAML. `DepositFactUseCase` now escapes `\` as well.
- `MessagesTransport` throws `ModelUnavailableException` (mapped to 502) for 429/529 after retries, overload and rate-limit stream errors, and spend-limit 400s. Other errors throw `HttpRequestException` with its `StatusCode` set. A stalled SSE stream fails after 90 s. The Facts page handles the new exception.
- `MapStaticAssets().AllowAnonymous()`: static assets are readable without login. Nothing sensitive is in `wwwroot`.
## Known, deferred
- Images: distilled notes rarely carry `attachments`, so the first articles will mostly have no photos. Photos are private anyway.
- A rare layout (a fenced code block on a list-item line, followed by an infobox with a private row) locks the article for anonymous readers. This affects availability only; nothing leaks.
- The leak scanner errs toward private, for example on version strings that also appear as IPs in the sources.
- An anonymous error page renders in the MainLayout shell. Cosmetic only; no data is shown.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Wikipedia-style, bilingual (de/en) articles generated from the wiki,
with public/private split via Authentik group, LAN/NetBird only.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
wiki.renner.uno has been plain Traefik with in-app OIDC since homelab
2026-10-19; the gate-based two-hostname split no longer applies.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The wiki Ingress carries neither dns.renner.uno/public nor
netbird.renner.uno/public; either publishes the host via
netbird-service-sync.
The deterministic leak filter only counts this house's identifiers:
values found in the article's source notes, names under renner.uno, and
credentials. Reserved example values (RFC 5737, RFC 3849, RFC 2606)
never count. Writer and leak-check prompts keep generic examples public.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Credentials in the wiki are an upstream failure, not a case the
encyclopedia handles: no credential scanner rule, no writer instruction.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nightly schedule (RunAt 06:00, after the 04:30 distill) instead of a
run after every sync. Reconciler never stops the host; catalog
freshness gate; failure memory in articles/_state.json; a missing or
shrunken plan never deletes; translation unit by unit with structure
reassembled by the service; links and listings to private articles
dropped for anonymous readers; media paths validated; in-page 404;
PilotSlugs; Cache-Control no-store; mermaid strict.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A scanner hit in the slug or titles, or the German leak check flagging them, makes the article private in both languages. The plan prompt forbids concrete identifiers in titles and slugs and keeps existing titles; prompt version 5.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Implements
docs/superpowers/specs/2026-10-24-house-encyclopedia-design.mdfollowingdocs/superpowers/plans/2026-10-24-house-encyclopedia.md. This branch contains the docs commits of #16, so #16 can be closed once this merges.What it does
renner.unonames, MACs, HA entity IDs and paths. An LLM leak check follows. Every image is private. Titles and slugs are checked too.konairius/notesin one commit underarticles/<lang>/.articles/_state.jsonmeans a failure is never paid for twice on the same input. A run stops cleanly on a spend limit or overload and keeps what it already wrote. The run can never stop the host./house(static SSR,[AllowAnonymous], Wikipedia-like layout): a properties panel that doesn't overlap diagrams, a linked table of contents, Mermaid (vendored,securityLevel: 'strict') and a de/en switch.noindexandno-store. Everything outside/housestays behind login.Wiki:Encyclopedia:Enabled=false. The homelab PR turns it on in planning-only mode (MaxArticles=0).Review
dotnet test Wiki.slnx -c Releasepasses 542 tests (Core 174, Contracts 83, Application 144, Host 141).Behaviour changes outside the feature
Frontmatter.Unquotenow unescapes\"and\\inside double-quoted values, for all notes. This is correct YAML.DepositFactUseCasenow escapes\as well.MessagesTransportthrowsModelUnavailableException(mapped to 502) for 429/529 after retries, overload and rate-limit stream errors, and spend-limit 400s. Other errors throwHttpRequestExceptionwith itsStatusCodeset. A stalled SSE stream fails after 90 s. The Facts page handles the new exception.MapStaticAssets().AllowAnonymous(): static assets are readable without login. Nothing sensitive is inwwwroot.Known, deferred
attachments, so the first articles will mostly have no photos. Photos are private anyway.🤖 Generated with Claude Code