docs(wiki): proposal for a local wiki web interface and agent API #939

Merged
k.renner merged 7 commits from docs/proposal-wiki-web-api into master 2026-09-24 10:26:18 +00:00
Member

Plan for a web interface to the Notes wiki that runs entirely in the cluster, plus an HTTP API for agents to ask typed questions, get answers and deposit facts, as one C# solution (net10.0, MudBlazor, shelly-manager conventions) in a new repository k.renner/wiki. kubernetes/PROPOSAL-wiki-web-api.md.

Ports and adapters: Wiki.Core holds the domain and the port interfaces and references nothing; use cases in Wiki.Application; one adapter project per external thing (Gitea note store and fact sink, llama-server embeddings, TypeSafe judge, file vector index, Anthropic answer model); Wiki.Host is the composition root with the API and the MudBlazor UI. Every port has a contract test suite that runs against every adapter, adapters are selected by configuration and can be registered several at once, each embedding model gets its own index namespace. Next adapters (a database note store, other embedding models, a locally hosted Jev, pgvector, OpenAI-compatible answer models incl. the local llama-server) are a project and a config line.

Roles: the judge port returns typed judgements with probabilities, never prose. POST /questions answers in process: rank, judge, then one answer-model call over the selected paragraphs, streamed, seconds not minutes, a few cents on Sonnet; below the covered gate it returns the gap. The service makes single model calls inside a request and never runs a tool loop or edits the vault; distill, consolidate and multi-question synthesis stay Claude agents in CI or a session, which are clients of this API. Secrets via ExternalSecret into env, no OpenBao access from the pod. Health: liveness, readiness (first sync and index loaded), status with per-adapter checks that never gate readiness.

Seven phases, one PR each with verification, the Python wiki-index retired after parity is proven. Grounding: ~/Notes/output/2026-09-24-wiki-web-api-groundwork.md and 2026-09-24-wiki-dotnet-groundwork.md.

🤖 Generated with Claude Code

Plan for a web interface to the Notes wiki that runs entirely in the cluster, plus an HTTP API for agents to ask typed questions, get answers and deposit facts, as one C# solution (net10.0, MudBlazor, shelly-manager conventions) in a new repository `k.renner/wiki`. `kubernetes/PROPOSAL-wiki-web-api.md`. Ports and adapters: `Wiki.Core` holds the domain and the port interfaces and references nothing; use cases in `Wiki.Application`; one adapter project per external thing (Gitea note store and fact sink, llama-server embeddings, TypeSafe judge, file vector index, Anthropic answer model); `Wiki.Host` is the composition root with the API and the MudBlazor UI. Every port has a contract test suite that runs against every adapter, adapters are selected by configuration and can be registered several at once, each embedding model gets its own index namespace. Next adapters (a database note store, other embedding models, a locally hosted Jev, pgvector, OpenAI-compatible answer models incl. the local llama-server) are a project and a config line. Roles: the judge port returns typed judgements with probabilities, never prose. `POST /questions` answers in process: rank, judge, then one answer-model call over the selected paragraphs, streamed, seconds not minutes, a few cents on Sonnet; below the covered gate it returns the gap. The service makes single model calls inside a request and never runs a tool loop or edits the vault; distill, consolidate and multi-question synthesis stay Claude agents in CI or a session, which are clients of this API. Secrets via ExternalSecret into env, no OpenBao access from the pod. Health: liveness, readiness (first sync and index loaded), status with per-adapter checks that never gate readiness. Seven phases, one PR each with verification, the Python wiki-index retired after parity is proven. Grounding: `~/Notes/output/2026-09-24-wiki-web-api-groundwork.md` and `2026-09-24-wiki-dotnet-groundwork.md`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-bot added 1 commit 2026-09-24 08:40:14 +00:00
docs(wiki): proposal for a local wiki web interface and agent API
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
80a0ee5b19
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
review-bot left a comment
Member

🤖 Automated review — model claude-haiku-4-5-20251001 (complexity: trivial), commit 80a0ee5b1903437a82ae459f4ff362c74a106888.

Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.


Summary

This proposal outlines a thoughtful plan to move the wiki from a workstation-bound Python script to a cluster-resident service with a web UI and HTTP API. The architecture is well-structured, builds on existing patterns (Authentik gates, ExternalSecret, OpenBao tokens), and honestly discusses trade-offs. The phased implementation with per-phase verification is sound. No blocking issues, but several design details need clarification during implementation.

🟡 Suggestions

  1. Memory budget — line 74: The proposal claims the 512 Mi limit "still fits" as the index grows from ~60 MB to ~80 MB. This seems optimistic if the service now holds the full text of wiki/, raw/, and output/ in memory (not just vectors and metadata). The current Deployment already has 256 Mi requests and 512 Mi limits (kubernetes/apps/wiki-index/deployment.yaml:89-95). No measurement is offered for the additional overhead of caching note bodies and the link graph. Recommend: estimate memory footprint including application overhead before finalizing Phase 1, or document the assumption that lazy-loading will keep steady-state significantly below the limit.

  2. Phase 5 is unspecified — line 215: "Maintenance and browse views" has no detail, just a title. This is a shipping phase where users rely on the feature. Recommend: expand this to at least cover the same level of detail as earlier phases — which views, what endpoints they consume, verification criteria.

  3. Slug collision handling in /facts — line 119: The proposal states "New files cannot conflict, so no branch or PR is needed" but doesn't explain how same-day filename collisions are prevented. If two agents deposit facts with the same slug within seconds, both will generate raw/<date>-<slug>.md; the second write will overwrite the first if the Gitea API is called sequentially, or conflict if attempted in parallel. Recommend: clarify the slug collision strategy (e.g., UUID suffix, rejection on collision, check-before-write via Gitea API).

  4. HTTP status codes and error response format for /facts — lines 117–121: The proposal lists rejection criteria (missing source, wrong kind, etc.) but doesn't specify HTTP status codes or response schema. Is a missing source a 400 or 422? What does the error response body look like? Recommend: document the error response contract (status codes, JSON schema) so clients can handle rejections uniformly.

  5. Rate limiting on /ask — line 89: The proposal mentions /ask calls TypeSafe at ~1 cent per call, but includes no rate limiting, per-user quotas, or safeguards against accidental overages. The web UI could allow a user to spam questions and rack up charges. Recommend: decide on rate limiting strategy (per-token, per-user, global cap) and document it, even if Phase 4 is where the UI gets built.

  6. Bearer token security details — line 157: The proposal mentions comparing tokens constant-time and recording identity, but doesn't discuss token rotation, expiration, compromise scenarios, or how many tokens will be active (currently one per client identity in OpenBao). Recommend: document the token lifecycle (TTL, rotation schedule, revocation) when defining the ExternalSecret in Phase 2.

  7. Link graph consistency with /facts writes ��� line 65: The proposal describes keeping an "inbound references" link graph derived from [[links]] and related: frontmatter, but doesn't guarantee how quickly the graph updates after a new fact is deposited via POST /facts. If the next /rank or /ask call consumes stale link metadata, search results and context ranking could miss newly added notes. Recommend: clarify the link graph update cadence (immediate, next sync, half-hourly) and whether /ask waits for a fresh graph.

🟢 Nits

  • Line 21: "the index is in the cluster" — the index service (wiki-index) is; clarify that the vault itself stays on the workstation / in the git repo.
  • Line 88: /api/v1/rank is kept for backward compatibility, but no sunset plan is mentioned. Consider documenting when/whether scripts will be required to migrate to the new API.
  • Line 161: "no dns.renner.uno/public label" — this is an implementation detail; move to Phase 4 (Web UI and gate) if detailed.

Tests

The proposal's phase-by-phase verification is appropriate for infrastructure. Phase 1 and 2 verification criteria are concrete and testable (body matching, commit authorship, distill processing). Phase 3 includes automated test coverage (test_wiki_ask.py unchanged) and production validation (recall eval), which is solid. Phase 4 and 5 lack test specifics — recommend at least covering the happy path of the UI (search, note view, login redirect) with a simple smoke test in Phase 4.

Recommendation

Looks reasonable — no blocking issues; comments above are clarifications and detail work for implementation phases.

🤖 **Automated review** — model `claude-haiku-4-5-20251001` (complexity: trivial), commit `80a0ee5b1903437a82ae459f4ff362c74a106888`. > Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review. --- ## Summary This proposal outlines a thoughtful plan to move the wiki from a workstation-bound Python script to a cluster-resident service with a web UI and HTTP API. The architecture is well-structured, builds on existing patterns (Authentik gates, ExternalSecret, OpenBao tokens), and honestly discusses trade-offs. The phased implementation with per-phase verification is sound. No blocking issues, but several design details need clarification during implementation. ## 🟡 Suggestions 1. **Memory budget — line 74:** The proposal claims the 512 Mi limit "still fits" as the index grows from ~60 MB to ~80 MB. This seems optimistic if the service now holds the full text of `wiki/`, `raw/`, and `output/` in memory (not just vectors and metadata). The current Deployment already has 256 Mi requests and 512 Mi limits (kubernetes/apps/wiki-index/deployment.yaml:89-95). No measurement is offered for the additional overhead of caching note bodies and the link graph. Recommend: estimate memory footprint including application overhead before finalizing Phase 1, or document the assumption that lazy-loading will keep steady-state significantly below the limit. 2. **Phase 5 is unspecified — line 215:** "Maintenance and browse views" has no detail, just a title. This is a shipping phase where users rely on the feature. Recommend: expand this to at least cover the same level of detail as earlier phases — which views, what endpoints they consume, verification criteria. 3. **Slug collision handling in `/facts` — line 119:** The proposal states "New files cannot conflict, so no branch or PR is needed" but doesn't explain how same-day filename collisions are prevented. If two agents deposit facts with the same slug within seconds, both will generate `raw/<date>-<slug>.md`; the second write will overwrite the first if the Gitea API is called sequentially, or conflict if attempted in parallel. Recommend: clarify the slug collision strategy (e.g., UUID suffix, rejection on collision, check-before-write via Gitea API). 4. **HTTP status codes and error response format for `/facts` — lines 117–121:** The proposal lists rejection criteria (missing `source`, wrong `kind`, etc.) but doesn't specify HTTP status codes or response schema. Is a missing `source` a 400 or 422? What does the error response body look like? Recommend: document the error response contract (status codes, JSON schema) so clients can handle rejections uniformly. 5. **Rate limiting on `/ask` — line 89:** The proposal mentions `/ask` calls TypeSafe at ~1 cent per call, but includes no rate limiting, per-user quotas, or safeguards against accidental overages. The web UI could allow a user to spam questions and rack up charges. Recommend: decide on rate limiting strategy (per-token, per-user, global cap) and document it, even if Phase 4 is where the UI gets built. 6. **Bearer token security details — line 157:** The proposal mentions comparing tokens constant-time and recording identity, but doesn't discuss token rotation, expiration, compromise scenarios, or how many tokens will be active (currently one per client identity in OpenBao). Recommend: document the token lifecycle (TTL, rotation schedule, revocation) when defining the ExternalSecret in Phase 2. 7. **Link graph consistency with `/facts` writes ��� line 65:** The proposal describes keeping an "inbound references" link graph derived from `[[links]]` and `related:` frontmatter, but doesn't guarantee how quickly the graph updates after a new fact is deposited via `POST /facts`. If the next `/rank` or `/ask` call consumes stale link metadata, search results and context ranking could miss newly added notes. Recommend: clarify the link graph update cadence (immediate, next sync, half-hourly) and whether `/ask` waits for a fresh graph. ## 🟢 Nits - Line 21: "the index is in the cluster" — the index service (wiki-index) is; clarify that the vault itself stays on the workstation / in the git repo. - Line 88: `/api/v1/rank` is kept for backward compatibility, but no sunset plan is mentioned. Consider documenting when/whether scripts will be required to migrate to the new API. - Line 161: "no `dns.renner.uno/public` label" — this is an implementation detail; move to Phase 4 (Web UI and gate) if detailed. ## Tests The proposal's phase-by-phase verification is appropriate for infrastructure. Phase 1 and 2 verification criteria are concrete and testable (body matching, commit authorship, distill processing). Phase 3 includes automated test coverage (`test_wiki_ask.py` unchanged) and production validation (recall eval), which is solid. Phase 4 and 5 lack test specifics — recommend at least covering the happy path of the UI (search, note view, login redirect) with a simple smoke test in Phase 4. ## Recommendation Looks reasonable — no blocking issues; comments above are clarifications and detail work for implementation phases. <!-- pr-review:sha=80a0ee5b1903437a82ae459f4ff362c74a106888 -->
claude-bot added 1 commit 2026-09-24 08:43:54 +00:00
docs(wiki): /ask returns typed judgements, not prose; summarize is a separate local step
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was canceled
ee5f3acbaa
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude-bot added 1 commit 2026-09-24 08:45:17 +00:00
docs(wiki): TypeSafe is a component for agents and code; answers in words come from Claude via wiki-synth
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
2bb2704b88
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude-bot added 1 commit 2026-09-24 08:54:18 +00:00
docs(wiki): rewrite as a modular .NET solution with MudBlazor, ports and adapters
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
b4de51b412
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude-bot added 1 commit 2026-09-24 08:58:28 +00:00
docs(wiki): health endpoints for the cluster deployment; secrets via ExternalSecret, no OpenBao access from the pod
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
b3dc3f6b4c
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
review-bot left a comment
Member

🤖 Automated review — model CLI default (complexity: unknown), commit b3dc3f6b4c9b94b3057e2628c502cfffe16683a9.

Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.


Summary

Docs-only PR adding kubernetes/PROPOSAL-wiki-web-api.md, a design proposal for a ports-and-adapters .NET service (new repo k.renner/wiki) replacing the Python wiki-index/wiki_ask.py stack. No code or manifests change. I cross-checked the proposal's factual claims against the current wiki-index/wiki-embed/shelly-manager manifests already in this repo (deployment, ingress, OpenBao policy, ai-ns.yaml CNPs, shelly-manager gate/CNP/image-automation) and they match: LAN-only BasicAuth setup, ai namespace CNP shape, ak-outpost-<app>-gate:9000 Ingress backend pattern, build.<unix-ts> image tag convention, and the ExternalSecret/no-direct-OpenBao pattern are all accurately described. No blocking issues — this is a plan, not an implementation.

🟡 Suggestions

  • "Where we are" vs. Phase 5 tension on wiki-synth (kubernetes/PROPOSAL-wiki-web-api.md:29 vs. :278). The doc first states "The wiki-synth agent composes answers from those judgements" as if wiki-synth already exists and runs today, but Phase 5 later describes building "a wiki-synth pipeline taking the question as input" as new work, and the config example (:154) treats AgentRunner.Pipeline: wiki-synth as a Woodpecker pipeline to be added. I could not find wiki-synth anywhere in this repo (only wiki-distill/wiki-consolidate exist under ci/agents/wiki-maintenance/ and .woodpecker/wiki-maintenance.yml), so it's presumably a workstation-side/manual process today, not a CI pipeline. Worth a one-line clarification that "wiki-synth" currently means an ad hoc/manual composition step and Phase 5 is what turns it into an actual Woodpecker pipeline — otherwise a reader will look for an existing pipeline that isn't there.
  • Other proposal docs in this repo carry a Status/Scope header (see kubernetes/apps/home-assistant/PROPOSAL-mosquitto-credential-rotation.md:1-4 and kubernetes/PROPOSAL-cilium-single-owner.md). This proposal skips that convention; adding a short "Status: proposal, nothing implemented" line at the top would match house style, though it's a minor omission for a doc-only change.
  • IAgentRunner's Woodpecker adapter mechanics are unspecified (kubernetes/PROPOSAL-wiki-web-api.md:87 and the API table row for POST /api/v1/questions, :203). The doc says questions get "queued" and "returns the run id" but doesn't say how the question text is threaded into a Woodpecker pipeline trigger (pipeline variables via the CLI/API, a webhook payload field, etc.) or how the run id maps back to a Woodpecker pipeline number for polling GET /api/v1/questions/{id}. Not a blocker for a phase-0 skeleton proposal, but worth nailing down before Phase 5 since it's the one adapter with no existing precedent in this repo (unlike Gitea/LlamaCpp/TypeSafe, which mirror wiki-index/wiki-maintenance today).

🟢 Nits

  • kubernetes/PROPOSAL-wiki-web-api.md:150 — the jev-local judge entry is explicitly commented as "illustration" in the sample config; fine as-is, just flagging that it reads briefly as if a jev.ai.svc endpoint already exists (it doesn't, per the doc's own "no locally hosted Jev today" at :86).

Tests

N/A — this is a planning document, not code. The proposal itself specifies a contract-test strategy (test/Wiki.Contracts, one suite per port run against every adapter) and per-phase verification steps, which is an appropriate and specific enough test plan for a doc at this stage.

Recommendation

Looks reasonable — no blocking issues; comments above are optional.

🤖 **Automated review** — model `CLI default` (complexity: unknown), commit `b3dc3f6b4c9b94b3057e2628c502cfffe16683a9`. > Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review. --- ## Summary Docs-only PR adding `kubernetes/PROPOSAL-wiki-web-api.md`, a design proposal for a ports-and-adapters .NET service (new repo `k.renner/wiki`) replacing the Python `wiki-index`/`wiki_ask.py` stack. No code or manifests change. I cross-checked the proposal's factual claims against the current `wiki-index`/`wiki-embed`/`shelly-manager` manifests already in this repo (deployment, ingress, OpenBao policy, `ai-ns.yaml` CNPs, `shelly-manager` gate/CNP/image-automation) and they match: LAN-only BasicAuth setup, `ai` namespace CNP shape, `ak-outpost-<app>-gate:9000` Ingress backend pattern, `build.<unix-ts>` image tag convention, and the ExternalSecret/no-direct-OpenBao pattern are all accurately described. No blocking issues — this is a plan, not an implementation. ## 🟡 Suggestions - **"Where we are" vs. Phase 5 tension on `wiki-synth`** (`kubernetes/PROPOSAL-wiki-web-api.md:29` vs. `:278`). The doc first states "The wiki-synth agent composes answers from those judgements" as if `wiki-synth` already exists and runs today, but Phase 5 later describes building "a `wiki-synth` pipeline taking the question as input" as new work, and the config example (`:154`) treats `AgentRunner.Pipeline: wiki-synth` as a Woodpecker pipeline to be added. I could not find `wiki-synth` anywhere in this repo (only `wiki-distill`/`wiki-consolidate` exist under `ci/agents/wiki-maintenance/` and `.woodpecker/wiki-maintenance.yml`), so it's presumably a workstation-side/manual process today, not a CI pipeline. Worth a one-line clarification that "wiki-synth" currently means an ad hoc/manual composition step and Phase 5 is what turns it into an actual Woodpecker pipeline — otherwise a reader will look for an existing pipeline that isn't there. - **Other proposal docs in this repo carry a `Status`/`Scope` header** (see `kubernetes/apps/home-assistant/PROPOSAL-mosquitto-credential-rotation.md:1-4` and `kubernetes/PROPOSAL-cilium-single-owner.md`). This proposal skips that convention; adding a short "Status: proposal, nothing implemented" line at the top would match house style, though it's a minor omission for a doc-only change. - **`IAgentRunner`'s Woodpecker adapter mechanics are unspecified** (`kubernetes/PROPOSAL-wiki-web-api.md:87` and the API table row for `POST /api/v1/questions`, `:203`). The doc says questions get "queued" and "returns the run id" but doesn't say how the question text is threaded into a Woodpecker pipeline trigger (pipeline variables via the CLI/API, a webhook payload field, etc.) or how the run id maps back to a Woodpecker pipeline number for polling `GET /api/v1/questions/{id}`. Not a blocker for a phase-0 skeleton proposal, but worth nailing down before Phase 5 since it's the one adapter with no existing precedent in this repo (unlike Gitea/LlamaCpp/TypeSafe, which mirror `wiki-index`/`wiki-maintenance` today). ## 🟢 Nits - `kubernetes/PROPOSAL-wiki-web-api.md:150` — the `jev-local` judge entry is explicitly commented as "illustration" in the sample config; fine as-is, just flagging that it reads briefly as if a `jev.ai.svc` endpoint already exists (it doesn't, per the doc's own "no locally hosted Jev today" at `:86`). ## Tests N/A — this is a planning document, not code. The proposal itself specifies a contract-test strategy (`test/Wiki.Contracts`, one suite per port run against every adapter) and per-phase verification steps, which is an appropriate and specific enough test plan for a doc at this stage. ## Recommendation Looks reasonable — no blocking issues; comments above are optional. <!-- pr-review:sha=b3dc3f6b4c9b94b3057e2628c502cfffe16683a9 -->
claude-bot added 1 commit 2026-09-24 09:04:22 +00:00
docs(wiki): the service never runs or triggers agents; drop the agent-runner port and Woodpecker
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
12e1a6e6f0
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
review-bot left a comment
Member

🤖 Automated review — model CLI default (complexity: unknown), commit 12e1a6e6f077ac126171a1b84637c1b2b0541860.

Advisory review by the review-bot pipeline. It never approves; a human merges. Push new commits to get a fresh review.


Summary

This is a docs-only PR: it adds kubernetes/PROPOSAL-wiki-web-api.md, a design proposal for a .NET/Blazor replacement of the Python wiki-index service plus a new agent-facing HTTP API. No code or manifests change. I checked the proposal's factual claims against what's actually in this repo (the wiki-index/wiki-embed manifests, the ai namespace CiliumNetworkPolicy, the OpenBao policy/ExternalSecret pattern, the Authentik outpost/gate-egress pattern used by shelly-manager, and the Flux image-automation tagging scheme) and everything it asserts about current state matches the checked-out repo. No blocking issues.

🟡 Suggestions

  • Phase 0 readiness semantics are underspecified (kubernetes/PROPOSAL-wiki-web-api.md:254-258 vs. 239-241). Phase 0 ships Wiki.Host serving /health, /ready and /api/v1/status with only the skeleton (Wiki.Core + contract suites, no adapters yet — Gitea/LlamaCpp/FileIndex land in Phase 1, line 259). But the Health Endpoints section defines /ready as "the active note store has synced at least once and the active index is loaded" (line 240), which isn't meaningful until Phase 1's adapters exist. Worth a sentence on what /ready returns in Phase 0 (e.g. always-ready stub) so the Phase 0 verification step ("the pod Ready", line 258) doesn't quietly become a no-op check.
  • Egress list omits DNS (kubernetes/PROPOSAL-wiki-web-api.md:228-230). "Egress from the pod: Gitea, wiki-embed, api.typesafe.ai:443" reads as the enumeration that "every further adapter... gets its own CNP line" builds on. The existing ai namespace CNP (kubernetes/infrastructure/network-policies/ai-ns.yaml:92-99) also grants kube-dns egress on :53, which any pod resolving hostnames needs; whoever implements the CNP for this service in Phase 0/1 will need that too even though it isn't itemized here.
  • Minor naming inconsistency between the config example and the ports table. The Embeddings config example uses "Adapter": "Ollama" for e5-large (line 142), but the IEmbeddingModel port row's list of future adapters names "the qwen3 embedding variants... ONNX in-process; any OpenAI-compatible endpoint" (line 83) without naming Ollama specifically — it only appears by name in the architecture diagram's parenthetical (line 59). Not a factual error (Ollama does speak an OpenAI-compatible API), just worth aligning the wording so a reader doesn't wonder whether Ollama is its own adapter or falls under "OpenAI-compatible endpoint."

Tests

N/A — this is a design proposal with no code. The document itself specifies a testing strategy (a contract-test suite per port run against every adapter, test/Wiki.Core.Tests, Wiki.Application.Tests, Wiki.Host.Tests) which is appropriate for the architecture described and mirrors the phased verification steps at the end of the doc.

Recommendation

Looks reasonable — no blocking issues; comments above are optional.

🤖 **Automated review** — model `CLI default` (complexity: unknown), commit `12e1a6e6f077ac126171a1b84637c1b2b0541860`. > Advisory review by the `review-bot` pipeline. It never approves; a human merges. Push new commits to get a fresh review. --- ## Summary This is a docs-only PR: it adds `kubernetes/PROPOSAL-wiki-web-api.md`, a design proposal for a .NET/Blazor replacement of the Python `wiki-index` service plus a new agent-facing HTTP API. No code or manifests change. I checked the proposal's factual claims against what's actually in this repo (the `wiki-index`/`wiki-embed` manifests, the `ai` namespace CiliumNetworkPolicy, the OpenBao policy/ExternalSecret pattern, the Authentik outpost/gate-egress pattern used by `shelly-manager`, and the Flux image-automation tagging scheme) and everything it asserts about current state matches the checked-out repo. No blocking issues. ## 🟡 Suggestions - **Phase 0 readiness semantics are underspecified** (`kubernetes/PROPOSAL-wiki-web-api.md:254-258` vs. `239-241`). Phase 0 ships `Wiki.Host` serving `/health`, `/ready` and `/api/v1/status` with only the skeleton (`Wiki.Core` + contract suites, no adapters yet — Gitea/LlamaCpp/FileIndex land in Phase 1, line 259). But the Health Endpoints section defines `/ready` as "the active note store has synced at least once and the active index is loaded" (line 240), which isn't meaningful until Phase 1's adapters exist. Worth a sentence on what `/ready` returns in Phase 0 (e.g. always-ready stub) so the Phase 0 verification step ("the pod Ready", line 258) doesn't quietly become a no-op check. - **Egress list omits DNS** (`kubernetes/PROPOSAL-wiki-web-api.md:228-230`). "Egress from the pod: Gitea, wiki-embed, `api.typesafe.ai:443`" reads as the enumeration that "every further adapter... gets its own CNP line" builds on. The existing `ai` namespace CNP (`kubernetes/infrastructure/network-policies/ai-ns.yaml:92-99`) also grants `kube-dns` egress on :53, which any pod resolving hostnames needs; whoever implements the CNP for this service in Phase 0/1 will need that too even though it isn't itemized here. - **Minor naming inconsistency between the config example and the ports table.** The `Embeddings` config example uses `"Adapter": "Ollama"` for `e5-large` (line 142), but the `IEmbeddingModel` port row's list of future adapters names "the qwen3 embedding variants... ONNX in-process; any OpenAI-compatible endpoint" (line 83) without naming Ollama specifically — it only appears by name in the architecture diagram's parenthetical (line 59). Not a factual error (Ollama does speak an OpenAI-compatible API), just worth aligning the wording so a reader doesn't wonder whether Ollama is its own adapter or falls under "OpenAI-compatible endpoint." ## Tests N/A — this is a design proposal with no code. The document itself specifies a testing strategy (a contract-test suite per port run against every adapter, `test/Wiki.Core.Tests`, `Wiki.Application.Tests`, `Wiki.Host.Tests`) which is appropriate for the architecture described and mirrors the phased verification steps at the end of the doc. ## Recommendation Looks reasonable — no blocking issues; comments above are optional. <!-- pr-review:sha=12e1a6e6f077ac126171a1b84637c1b2b0541860 -->
claude-bot added 1 commit 2026-09-24 09:11:26 +00:00
docs(wiki): in-process questions endpoint with an answer-model port; Anthropic adapter first
ci/woodpecker/pr/ci-scripts-test Pipeline was successful
ci/woodpecker/pr/ci-manifests-test Pipeline was successful
ci/woodpecker/pr/pr-review Pipeline was successful
abb4096c67
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
k.renner merged commit 50c62da2f4 into master 2026-09-24 10:26:18 +00:00
Sign in to join this conversation.