How to use: Log every bug you hit while testing here. Copy the Bug entry template into the Open section, give it the next
BUG-NNNid, and fill what you know — a half-filled entry beats an un-logged one. When a bug is fixed, flip its Status, add the PR/commit, and move it to Resolved. Keep the Summary counts and the Index row in sync.Companion to TRACKER.md (build status). This file is testing findings, not roadmap.
| Severity | Open | In progress | Resolved | Total |
|---|---|---|---|---|
| 🔴 Critical | 0 | 0 | 0 | 0 |
| 🟠 High | 2 | 0 | 1 | 3 |
| 🟡 Medium | 1 | 0 | 3 | 4 |
| 🟢 Low | 0 | 0 | 3 | 3 |
| All | 3 | 0 | 7 | 10 |
This session: BUG-002, BUG-003, BUG-004, BUG-007, BUG-008, BUG-009 fixed + verified (code + tests + browser). BUG-005 / BUG-006 investigated → structural backend changes, deferred with root cause below. BUG-010 environmental (couldn't reproduce). The two High "Open" are BUG-005 (audit) and BUG-010 (availability, can't-reproduce).
| ID | Title | Severity | Status | Area | Found |
|---|---|---|---|---|---|
| BUG-001 | New corpus does not persist (vanishes on reload) | 🟠 High | ✅ Resolved | admin-ui | 2026-06-11 |
| BUG-002 | Edit corpus menu item does nothing | 🟡 Medium | ✅ Resolved | admin-ui | 2026-06-11 |
| BUG-003 | Edit webhook subscription menu item does nothing | 🟡 Medium | ✅ Resolved | admin-ui + gateway | 2026-06-11 |
| BUG-004 | Live Status shows seed/demo data as "Live" with no demo badge | 🟡 Medium | ✅ Resolved | admin-ui | 2026-06-11 |
| BUG-005 | Immutable audit log returns 0 events for real governance actions | 🟠 High | 🔵 Open | gateway | 2026-06-11 |
| BUG-006 | Ingest reports success but corpus document_count stays 0 | 🟡 Medium | 🔵 Open | gateway | 2026-06-11 |
| BUG-007 | Metrics "Captured" timestamp triggers a React hydration mismatch | 🟢 Low | ✅ Resolved | admin-ui | 2026-06-11 |
| BUG-008 | "Lands with Phase 6" preview copy is stale (project is GA) | 🟢 Low | ✅ Resolved | admin-ui | 2026-06-11 |
| BUG-009 | Query Playground shows "Demo data" badge before the first run | 🟢 Low | ✅ Resolved | admin-ui | 2026-06-11 |
| BUG-010 | Gateway process exited mid-session (availability) | 🟠 High | 🔁 Can't reproduce | gateway | 2026-06-11 |
- Severity: 🟡 Medium
- Status: ✅ Resolved
- Area: admin-ui (Corpora page) — the update ("U" of CRUD) path is unimplemented across UI + gateway + store
- Found: 2026-06-11 · Version/commit:
main@ 6cbab40 + uncommitted step-3.10 work onbuild/phase-3/step-3.10-corpus-admin-crud - Environment: admin-ui console (Next.js), demo or live mode.
Steps to reproduce
- Open Corpora → on any existing row, open the ⋯ row-actions menu.
- Click Edit.
Expected: An edit dialog opens to change the display name / description (or other mutable fields), then saves and persists.
Actual: Nothing happens — the menu closes, no dialog, no request.
Evidence / root cause: The Edit menu item is rendered with no onClick — unlike its siblings "View details" (onClick={() => setSelected(c)}) and "Delete" (onClick={() => setDeleting(c)}) (corpora/page.tsx:130). The entire update path is missing:
- UI: no
editingstate, noEditCorpusDialog— Edit is a placeholder item (corpora/page.tsx:130). - Client: no
updateCorpusinlib/api.ts— onlyfetchCorpora/createCorpus/deleteCorpus. - Gateway: no
PUT/PATCH /v1/corpora/{id}— the router hasGETlist +POST+GET {id}+DELETEonly (corpora.py). NoCorpusStore.updateon the SPI.
Notes / suspected cause: The BUG-001 fix implemented Create + Delete but skipped Update, leaving Edit as a dead menu item. This is in scope for the current step-3.10-corpus-admin-crud branch. Full fix spans: gateway PATCH /v1/corpora/{id} + CorpusStore.update (noop + pg) → updateCorpus in api.ts → an edit dialog + onClick in the page. Partial workaround: delete + recreate (loses the corpus id and any ingested docs).
Fix: Implemented the full update path — gateway PATCH /v1/corpora/{id} + CorpusStore.update (SPI + noop + pg, tenant-scoped, embedding model/dim immutable) + updateCorpus in api.ts + an Edit dialog wired to the row menu. Contract + gateway-route tests added; OpenAPI re-exported; verified live (edit → save → persists to gateway).
- Severity: 🟡 Medium · Status: ✅ Resolved
- Area: admin-ui (Webhooks page) + gateway — update ("U") path unimplemented, mirroring BUG-002
- Found: 2026-06-11 · Version/commit:
build/phase-3/step-3.10-corpus-admin-crud@ 6e0c2c4
Steps to reproduce
- Open Webhooks → create a subscription (or use an existing row).
- Open the ⋯ row-actions menu → click Edit.
Expected: An edit dialog opens to change URL / event types / description, then saves.
Actual: Nothing happens — menu closes, no dialog, no request. (Verified twice in isolation.)
Evidence / root cause: The webhook row Edit item has no working handler; there is no updateWebhook in lib/api.ts and no PATCH /v1/webhooks/subscriptions/{id} on the gateway. Same class of defect as BUG-002, for webhooks.
Fix: Mirrored the BUG-002 fix for webhooks — gateway PATCH /v1/webhooks/subscriptions/{id} (signing secret stays masked) + SubscriptionStore.update (SPI + noop) + updateWebhook in api.ts + an Edit dialog; the row's active toggle now also persists in live mode. Gateway-route tests added; OpenAPI re-exported; verified live (edit → save → persists).
- Severity: 🟡 Medium · Status: ✅ Resolved
- Area: admin-ui (Live Status page)
- Found: 2026-06-11 · Environment: live mode, gateway with no breakers/quotas/etc. registered.
Steps to reproduce
- Run the gateway with noop backends (no circuit breakers / quota data).
- Open Live Status.
Expected: Sub-sections that fall back to seed data are visibly marked (a demo badge), as Playground/Audit/API-Keys do.
Actual: Header shows "Live"; the Circuit breakers / Quotas / Cost / Drift / Experiments cards render realistic seed numbers (e.g. quotas "4,120,000 / 5,000,000 tokens", "$96.40 / $250.00") with no demo indicator — yet /v1/status/breakers returns {"breakers":[],"total":0}. Fabricated numbers read as live telemetry.
Evidence: per-section useLive(... source) exists in status/page.tsx (breakers L128, quotas L221, drift L325) but source !== "live" isn't surfaced. Genuinely-live data (overall health, components, API-surface telemetry) is correct.
Fix: Each seed-fallback card (breakers / quotas / drift / feedback / cost / experiments) now renders a SourceBadge driven by its own useLive source — "Demo data" when the gateway has no data for it, "Live" when it does. The page header stays "Live" for the genuinely-live health stream, so live telemetry and seed numbers are no longer conflated. Verified live (header "Live", all six cards "Demo data"). (status/page.tsx)
- Severity: 🟠 High · Status: 🔵 Open (needs gateway triage — may be noop-store limitation)
- Area: gateway (audit) / admin-ui (Audit Log falls back to demo)
- Found: 2026-06-11 · Environment: live mode, noop AuditStore.
Steps to reproduce
- Against a fresh gateway, create + delete a corpus, create + delete a webhook, ingest a document (all via the UI).
curl -H "X-Tenant-Id: acme" "http://127.0.0.1:8000/v1/audit?limit=200".
Expected: Governance-relevant actions appear in the immutable audit log.
Actual: {"total":0}. The Audit Log page therefore shows demo data (honestly badged). The structured logs (/v1/status/logs) DID capture corpus.created/corpus.deleted, so the events occur — but the audit store/endpoint surfaces nothing.
Notes: Investigated (this session) — root cause confirmed: /v1/audit reads the same store the AuditWriter writes to (app.state.audit_store = audit_writer.store), but the corpus / webhook handlers only emit structured logs (_log.info("corpus.created")) and never call AuditWriter.write — so governance actions are logged but never audited. Deferred (not fixed this session): wiring AuditWriter consistently across every governance handler (corpus / webhook / ingest / …) with correct AuditEvent shapes is a governance design task + product decision (which actions are auditable), not a one-line fix.
Fix: TBD — deferred, see Notes (structural)
- Severity: 🟡 Medium · Status: 🔵 Open (needs gateway triage — may be noop-store limitation)
- Area: gateway (ingest → corpus store)
- Found: 2026-06-11 · Environment: live mode, noop stores.
Steps to reproduce
- Create a corpus; ingest a document into it via Ingest (
POST /v1/ingest/document→ 200, "1 chunk / 1 embedding"). - Reload Corpora (or
GET /v1/corpora).
Expected: Corpus document_count reflects ingested document(s).
Actual: document_count stays 0, so the UI shows "ingested" yet "0 documents" — confusing in a demo.
Notes: Investigated (this session) — root cause confirmed: no document_count increment exists anywhere in the gateway; the ingest pipeline indexes chunks/embeddings but never touches the corpus counter (the create handler's "maintained by the ingest path" comment is aspirational). Deferred (not fixed this session): a correct fix needs a new CorpusStore surface (e.g. increment_document_count / recompute) wired from the ingest path — feature work, not a one-line fix.
Fix: TBD — deferred, see Notes (structural)
- Severity: 🟢 Low · Status: ✅ Resolved
- Area: admin-ui (Metrics page)
- Found: 2026-06-11 · Environment: full page load / refresh of
/metrics(dev shows console errors; prod silently re-renders).
Steps to reproduce
- Hard-load
/metrics(full SSR, not client nav).
Expected: No hydration warnings.
Actual: 8× Text content did not match. Server: "7:05:28 PM" Client: "19:05:29" — a 12h/24h locale mismatch.
Evidence / root cause: metrics/page.tsx:170 new Date(metrics.captured_at).toLocaleTimeString() is locale/timezone-dependent → SSR (server locale) ≠ client. Fires only on full load, not client-side nav.
Fix: Added suppressHydrationWarning to the Proc value node (metrics/page.tsx:170) — the React-sanctioned escape hatch for locale/timezone-dependent timestamps. Verified: tsc + all admin-ui unit tests green.
- Severity: 🟢 Low · Status: ✅ Resolved
- Area: admin-ui (API Keys, Tenants — copy)
- Found: 2026-06-11
Actual: API Keys (api-keys/page.tsx:55) and Tenants (tenants/page.tsx:53) banners say management "lands with Phase 6 governance" — but the platform is at v1.0.0 GA (Phase 6 long complete). Misleading copy.
Fix: Reworded both preview banners to drop the stale "lands with Phase 6 governance" claim → "the data shown here is local and not yet backed by the gateway." (api-keys/page.tsx, tenants/page.tsx)
- Severity: 🟢 Low · Status: ✅ Resolved
- Area: admin-ui (Query Playground)
- Found: 2026-06-11
Actual: With a live gateway configured, the Playground header shows a "Demo data" badge on initial load (result source defaults to "mock"); it clears after the first live query. Slightly misleading even though the corpus selector is already live. (playground/page.tsx:183,355)
Fix: Gated the badge on phase !== "idle" so "Demo data" only appears after a run that actually used mock data, not on initial load of a live-configured page. (playground/page.tsx)
- Severity: 🟠 High · Status: 🔁 Can't reproduce (needs info)
- Area: gateway (availability)
- Found: 2026-06-11 · Environment: local
uvicorngateway on :8000.
Actual: During UI testing the gateway process (PID 35523) vanished — POST /v1/corpora returned ERR_CONNECTION_REFUSED seconds after a successful GET. No 5xx (which a request-triggered crash would produce), so most likely stopped externally (parallel terminal/session). Restarted under preview control; could not attribute to a UI action.
Notes: If reproducible, capture gateway stderr at exit. Likely environmental, not a code defect.
Fix: n/a (environmental) — logged for visibility.
Nothing being worked on yet.
- Severity: 🟠 High · Status: ✅ Resolved
- Area: admin-ui (Corpora page) — root cause spanned gateway + backend
- Found / Resolved: 2026-06-11 / 2026-06-11 · Where: working tree on
build/phase-3/step-3.10-corpus-admin-crud(uncommitted at time of fix)
Symptom: Create corpus showed a "Corpus created" toast but the row vanished on reload — the UI never called a backend, and /v1/corpora was read-only (no create endpoint; default store in-memory).
Fix: Built the corpus write path end-to-end — POST /v1/corpora + DELETE /v1/corpora/{id} on the gateway, persistent CorpusStore create/delete (noop + pg_corpus_store), createCorpus/deleteCorpus in lib/api.ts, and the Corpora page now calls them when live (corpora/page.tsx:195, :246); demo mode still simulates locally.
Copy this block, paste it under Open, bump the id, and fill it in. Leave a field blank (or delete the line) if it doesn't apply — don't let a missing detail stop you from logging.
### BUG-NNN — <one-line title>
- **Severity:** 🔴 Critical | 🟠 High | 🟡 Medium | 🟢 Low
- **Status:** 🔵 Open
- **Area:** <gateway / admin-ui / ragctl / ingest / retrieval / query / policy / backends / docs / …>
- **Found:** <YYYY-MM-DD> · **Version/commit:** <v1.0.1 / git sha>
- **Environment:** <OS · how it was running — docker compose / local `uv run` / deployed>
**Steps to reproduce**
1.
2.
3.
**Expected:** <what should happen>
**Actual:** <what actually happened>
**Evidence:** <error text, log lines, screenshot path, request id / trace id>
**Notes / suspected cause:** <optional — leave for triage>
**Fix:** <PR link / commit once resolved>| Meaning | |
|---|---|
| 🔴 Critical | Data loss, security/tenant-isolation breach, or the platform is unusable. Drop everything. |
| 🟠 High | A core surface is broken (query/ingest/retrieve fails, wrong results). No safe workaround. |
| 🟡 Medium | Real bug with a workaround, or an edge case off the happy path. |
| 🟢 Low | Cosmetic, copy, or minor polish. |
| Meaning | |
|---|---|
| 🔵 Open | Logged, not yet being worked. |
| 🟣 In progress | Someone is actively fixing it. |
| ✅ Resolved | Fixed and verified — has a PR/commit. |
| ⚪ Won't fix | Intentional, out of scope, or by design — say why. |
| 🔁 Can't reproduce | Couldn't reproduce; needs more detail to reopen. |