{
  "repo": "",
  "generated_at": "2026-10-25T17:27:01Z",
  "pages": [
    {
      "slug": "korvus-overview",
      "title": "Korvus Overview",
      "passed": false,
      "citations": 45,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: sessions are stateless with respect to the model"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The database pool is opened and proved reachable"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The JSON contract the model is asked for — summary, key signals, blast radius, ordered hypotheses, next steps, audit summary"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `Registry` aggregates the tools of all connected servers, routes calls to the server that owns them, and refuses a duplicate tool name because tool names are the model-facing namespace and must be unambiguous"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Korvus ships three MCP servers that expose the observability backends an investigation actually queries"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Installs the process-wide JSON `slog` handler"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Builds the pgx pool and proves the database is reachable before startup continues"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: safe for concurrent `Run` calls"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The agent's only external I/O surface, satisfied by `*mcp.Registry`"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The manager's view of the agent, satisfied by `*agent.Agent`"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Serves until the context is cancelled, then drains in-flight requests"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The JSON shape the model's finalization step must produce"
        }
      ]
    },
    {
      "slug": "korvus-cli-and-process-wiring",
      "title": "korvus CLI and Process Wiring",
      "passed": true,
      "citations": 78
    },
    {
      "slug": "configuration-loading-and-validation",
      "title": "Configuration Loading and Validation",
      "passed": false,
      "citations": 45,
      "issues": [
        {
          "kind": "citation-symbol",
          "detail": "[envPattern](src/internal/config/config.go#L299): symbol \"envPattern\" not found in cited lines 299-301"
        }
      ]
    },
    {
      "slug": "storage-domain-model-and-store-interfaces",
      "title": "Storage Domain Model and Store Interfaces",
      "passed": false,
      "citations": 41,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `DocChunk` is one embedded slice of workspace documentation, keyed by the git commit the workspace was synced from. The embedding is a pgvector column whose dimension is fixed at 1536 by migration 001, and the vector text encoding/decoding lives in [internal/store/vector.go](src/internal/store/vector.go) — written by hand rather than pulling in a pgvector dependency."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `Store`](src/internal/store/store.go#L350-L357) is the composition of all five, and its own documentation is a warning rather than an endorsement: consumers should depend on the narrowest embedded interface they actually need — or on their own narrower interface declared in the consuming package — rather than on `Store` [Store](src/internal/store/store.go#L350-L357)."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The incident manager declares a five-method view that is exactly the incident half of `store.Store` [incident manager store view](src/internal/incident/manager.go#L29-L36)"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `SessionContextRef`](src/internal/store/store.go#L246-L252) is one entry in a session's explicitly enumerated inherited context: this session was given that artifact, in that role. Its `IncidentID` is denormalised for one reason only — so that the two composite foreign keys `(session_id, incident_id) → sessions(id, incident_id)` and `(artifact_id, incident_id) → artifacts(id, incident_id)` can both be declared, which makes a cross-incident reference structurally impossible rather than merely forbidden by application code [SessionContextRef](src/internal/store/store.go#L246-L252)."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `Artifact`](src/internal/store/store.go#L221-L233) is any file a session produced or was handed — report, agent output, attachment or workspace archive."
        }
      ]
    },
    {
      "slug": "postgresql-persistence-migrations-and-vector-search",
      "title": "PostgreSQL Persistence, Migrations and Vector Search",
      "passed": false,
      "citations": 41,
      "issues": [
        {
          "kind": "mermaid-reference",
          "detail": "mermaid symbol \"store.NewQueryTracer\" not found in the code index"
        }
      ]
    },
    {
      "slug": "session-manager-and-lifecycle",
      "title": "Session Manager and Lifecycle",
      "passed": false,
      "citations": 65,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Its legitimacy check never consults the registry: the registry is a per-process cache, and a session running in another replica is simply absent from it."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The incident check duplicates what the store's composite foreign keys enforce on insert; the duplication is deliberate, because the database's refusal arrives only after the session row exists and only as a constraint name"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The order against the store matters, because runs are detached from the request that started them and nothing else cancels them when the server stops — closing the connection pool first would fail every terminal write and strand those rows at `running`"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `Live` and `Count` answer per-incident fan-out queries without a database round trip"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Two of the exit reasons on the row are the manager's own rather than the agent's, because they describe conditions the agent cannot report: one happens instead of the agent returning (`panicked`), the other after it already has (`report_persist_failed`, `report_upload_failed`, `context_refs_failed`)."
        }
      ]
    },
    {
      "slug": "session-persistence-reopen-and-scratch-seeding",
      "title": "Session Persistence, Reopen and Scratch Seeding",
      "passed": false,
      "citations": 38,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Once it proceeds, it runs on a detached, two-minute-bounded context, because the files a cancelled session produced are exactly the ones worth keeping"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: When the walk finds more than 64 files, `capCandidates` trims the set"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Seeding itself is a one-method interface, `Seeder`, satisfied by `*workspace.Syncer`"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The docs client comes from the `DocsSearch` interface, satisfied by `*docs.Indexer`"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: the live turn stream's finished-session latch is lifted through the `StreamReopener` interface, satisfied by `*agent.TurnBroadcaster`"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The transition itself is a single conditional statement in the store, `ReopenSession`, which is what serialises two racing reopens: the loser gets `ErrNotFinished` and nothing is saved"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: otherwise the row lands with an empty `markdown_key` and the failure is recorded in `exit_reason` rather than by dropping the report"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Inherited files are materialised read-only under `context/\u003cn\u003e-\u003cname\u003e`, at exactly the paths the first user message's manifest names, using `agent.ContextPath`"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: its row is `ArtifactKindWorkspaceArchive` with the path `workspace.tar.gz` — a name that cannot collide with a harvested file"
        }
      ]
    },
    {
      "slug": "agent-run-loop-tool-execution-and-provider-calls",
      "title": "Agent Run Loop, Tool Execution and Provider Calls",
      "passed": false,
      "citations": 59,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: which `*mcp.Registry` satisfies"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The database enforces the same invariant with composite foreign keys, but the agent re-checks it because by the time a mismatched artifact has been described to the model the leak has already happened."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The `Agent` itself is small and safe for concurrent use — all mutable state lives in the per-incident `Session` [Agent](src/internal/agent/agent.go#L116-L123)."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `callModel` is the only place model-call errors are retried and the only code that knows more than one provider exists [Agent::callModel](src/internal/agent/caller.go#L28-L147)."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: detects no-progress loops by hashing both the call (name plus canonicalized arguments) and the result"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Refusing the collision instead, the way the MCP registry does, would break every session of a deployment whose remote server happens to export a `workspace_*` name."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `Run` returns an error only for turn persistence and a malformed request"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Turn persistence uses a context with its own 10-second timeout, detached from the session's cancellation, because the database is the source of truth and a cancelled incident must not lose its transcript"
        }
      ]
    },
    {
      "slug": "agent-prompts-report-authoring-and-finalization",
      "title": "Agent Prompts, Report Authoring and Finalization",
      "passed": false,
      "citations": 28,
      "issues": [
        {
          "kind": "citation-symbol",
          "detail": "[the line-breaking check](src/internal/agent/prompt.go#L241): symbol \"the line-breaking check\" not found in cited lines 241-244"
        }
      ]
    },
    {
      "slug": "agent-session-state-resume-and-event-broadcasting",
      "title": "Agent Session State, Resume and Event Broadcasting",
      "passed": false,
      "citations": 30,
      "issues": [
        {
          "kind": "mermaid-reference",
          "detail": "mermaid file \"session.go\" not found in repository"
        },
        {
          "kind": "mermaid-reference",
          "detail": "mermaid file \"resume.go\" not found in repository"
        },
        {
          "kind": "mermaid-reference",
          "detail": "mermaid file \"broadcast.go\" not found in repository"
        }
      ]
    },
    {
      "slug": "model-providers-embeddings-and-error-kinds",
      "title": "Model Providers, Embeddings and Error Kinds",
      "passed": false,
      "citations": 49,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: the five different ways an upstream can say \"your context is too long\""
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: caching it cuts input-token cost several-fold"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: ProviderError --\u003e Usage"
        }
      ]
    },
    {
      "slug": "mcp-client-registry-and-server-connection",
      "title": "MCP Client, Registry and Server Connection",
      "passed": false,
      "citations": 52,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `Call` is the routing path. It looks up the tool, finds the client of the server that owns it, and delegates. An unknown tool is an error; so is a tool whose owning server has no client, and that second branch is a deliberate defensive guard — the comment explains that a nil-interface call there \"panics in the agent's tool-dispatch path — taking down the whole run rather than surfacing as an error-flagged tool result\" [Call](src/internal/mcp/registry.go#L113-L138)."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Reference table row: `Call` | method | Routes a tool call to the owning server's client | src/internal/mcp/registry.go#L114-L138"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Reference table row: `ToolCall` | struct | Tool invocation with already-parsed arguments | src/internal/mcp/types.go#L23-L27"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Reference table row: `ToolCall` | struct | Model-side tool invocation, arguments kept as raw JSON | src/internal/model/provider.go#L54-L58"
        }
      ]
    },
    {
      "slug": "workspace-sandbox-client-and-built-in-tools",
      "title": "Workspace Sandbox Client and Built-in Tools",
      "passed": false,
      "citations": 96,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `listHandler` opens the target through the root handle and walks it either one level or recursively, rendering each entry through `describeEntry`, which flags a symlink rather than silently omitting it [handlers.go](src/internal/workspace/handlers.go#L119-L181)"
        }
      ]
    },
    {
      "slug": "workspace-sync-checkout-and-materialization",
      "title": "Workspace Sync, Checkout and Materialization",
      "passed": false,
      "citations": 47,
      "issues": [
        {
          "kind": "citation-range",
          "detail": "[Run](src/internal/workspace/run.go#L25): lines 25-49 out of bounds (47 lines in file)"
        },
        {
          "kind": "citation-symbol",
          "detail": "[Materialize](src/internal/workspace/materialize.go#L41): symbol \"Materialize\" not found in cited lines 41-47"
        },
        {
          "kind": "citation-symbol",
          "detail": "[Sync](src/internal/workspace/sync.go#L201): symbol \"Sync\" not found in cited lines 201-206"
        }
      ]
    },
    {
      "slug": "documentation-chunking-indexing-and-search",
      "title": "Documentation Chunking, Indexing and Search",
      "passed": false,
      "citations": 59,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: An empty or missing query, an out-of-range or fractional `top_k`, an embedding failure, a store failure and an empty index all come back as an error-flagged result whose text tells the model what to do next ([search.go](src/internal/docs/search.go#L78-L100), [search.go](src/internal/docs/search.go#L120-L125))."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: and a `model.Embedder`, the narrow embedding interface that lets a deployment use one provider for completion and another for retrieval ([embedder.go](src/internal/model/embedder.go#L17-L26))"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: a session registers its own pinned docs client under the same server name, shadowing the deployment-wide one that reads whatever revision is current ([scratch.go](src/internal/session/scratch.go#L110-L139))"
        }
      ]
    },
    {
      "slug": "skill-catalog-and-frontmatter-parsing",
      "title": "Skill Catalog and Frontmatter Parsing",
      "passed": false,
      "citations": 42,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The header is unmarshalled with `gopkg.in/yaml.v3` into a `Frontmatter` value, and a YAML error is wrapped and returned"
        }
      ]
    },
    {
      "slug": "incident-manager-open-list-update-close",
      "title": "Incident Manager: Open, List, Update, Close",
      "passed": false,
      "citations": 28,
      "issues": [
        {
          "kind": "citation-symbol",
          "detail": "[UpdateRequest](src/internal/incident/manager.go#L183): symbol \"UpdateRequest\" not found in cited lines 183-186"
        },
        {
          "kind": "citation-range",
          "detail": "[incidentError](src/internal/transport/incident.go#L246): lines 246-272 out of bounds (269 lines in file)"
        }
      ]
    },
    {
      "slug": "alert-ingestion-fingerprinting-and-debounce",
      "title": "Alert Ingestion, Fingerprinting and Debounce",
      "passed": false,
      "citations": 53,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Its severity comes from the `severity` label, defaulting when absent"
        }
      ]
    },
    {
      "slug": "connect-api-server-and-service-handlers",
      "title": "Connect API Server and Service Handlers",
      "passed": false,
      "citations": 52,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `errNoIncidentManager` — \"this process was started without an incident manager; no incident RPC is served\" (the cited excerpt at incident.go:28-29 shows only the `connect.NewError(connect.CodeUnimplemented,` line; the message text is not visible)"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Both are `codes.Unimplemented`; only the second names a ticket."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: the database ping is bounded at two seconds"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Zero timeouts on `ServerOptions` fall back to 10 seconds for the read header and 30 seconds for shutdown"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: incidentService --\u003e AlertIngestor (the mermaid edge; `incidentService` is constructed with only `manager: opts.Incidents` and has no AlertIngestor dependency)"
        }
      ]
    },
    {
      "slug": "watch-streams-read-apis-webhooks-and-proto-conversion",
      "title": "Watch Streams, Read APIs, Webhooks and Proto Conversion",
      "passed": false,
      "citations": 64,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The handler validates the request first: `session_id` is required, `after_seq` must not be negative, and the session must exist or the RPC is `NotFound`."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: A terminal session never subscribes: the database is already the complete transcript, so the handler sends a snapshot and closes."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: For a live session, the handler subscribes to the broadcaster **before** it drains the database."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: A turn is persisted before it is published, so a turn that lands during the drain is either read from the database or delivered on the channel — possibly both, never neither."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The snapshot itself is built by the `snapshot` helper, which lists the turns after `after_seq` and the session's context refs, and returns the highest sequence number it carries as a de-duplication watermark. That watermark starts at `after_seq` rather than zero, so a client resuming from seq 12 does not get turn 12 re-sent if it arrives late on the channel."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The live loop then selects over three things: the request context, the broadcaster channel, and a 15-second heartbeat ticker."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The heartbeat exists because a tool call can block for a minute and idle proxies drop connections well before that, so the stream must emit *something* even when the session produces nothing."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Tool-start events carry no sequence number and are always forwarded."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: When the agent closes the session's channels, the run is over — but the report and the terminal status may not exist yet, because the agent closes before the manager persists. So `finishLive` waits for the manager's settle signal first, then re-reads the row and, if it is terminal, emits the status change followed by the report."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The wait itself runs on its own goroutine so that every `Send` stays on the handler goroutine — a Connect `ServerStream` is not safe for concurrent sends — and it keeps the heartbeat going on the *same* ticker, so the 15-second count is not restarted at the agent's close."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: A row that is still not terminal after the wait gets no status event at all: the stream reports what the row says, never a transition that did not happen."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The settle capability is optional. `SessionSettler` is a one-method interface that `*session.Manager` satisfies, but a test fake or a process wired without a manager may not, in which case the stream simply ends on the broadcaster's close as it always did."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `reads.go` holds the plain request/response half of `SessionService`: `GetSession`, `ListSessions`, `ListTurns`, `GetReport`, `ListReportRevisions`, `ListArtifacts` and `GetArtifactDownload`."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Two of these reads carry an extra defensive step. `ListTurns` and `ListReportRevisions` read the session row first, so an unknown session id is `NotFound` rather than an empty list."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `ListSessions` deliberately does the opposite: it answers an empty list for an incident with no sessions *and* for one that does not exist, because distinguishing the two would need an incident read the session service does not otherwise make, and an empty list is a true answer to both."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `ListArtifacts` accepts exactly one of `session_id` or `incident_id`, and rejects a `revision` filter combined with `incident_id` — an incident listing holds the incident's own artifacts, which no revision produced, so the filter would have no meaning."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `GetArtifactDownload` is the one read that leaves the database entirely. It resolves the artifact first, so an unknown id is `NotFound` on every deployment, and only then asks whether this deployment can serve bytes at all."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The URL's lifetime is bounded at 15 minutes by `downloadURLTTL`, long enough for a browser to start a download after a page render and short enough that a URL pasted into a ticket stops working before it matters, since there is no authentication anywhere else to fall back on."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The webhook is a plain `net/http` handler mounted on the same mux as the Connect services, not a Connect RPC."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Unknown fields — `groupKey`, `externalURL`, `truncatedAlerts`, the per-alert fingerprint — are ignored rather than rejected, because Alertmanager adds fields between releases."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: A payload that can never succeed is a 400; a store failure or a process shutting down is a 5xx so the delivery is retried against the next process."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The body is bounded at 1 MiB by `maxWebhookBody`, since Alertmanager's own `max_alerts` defaults to unlimited and the bound has to be ours."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Ingestion is deliberately detached from the request: once it starts it must finish, or a sender that hangs up mid-write leaves alerts recorded but never attached to the incident they open. That is why the handler passes `context.WithoutCancel(r.Context())` into `Ingest`."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Alertmanager's zero `endsAt` — sent for a firing alert instead of omitting the field — is mapped to `nil`, which is what the alerts table means by \"not ended\"."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The store carries statuses like `\"open\"` and `\"running\"` as plain strings; the proto carries `INCIDENT_STATUS_OPEN` and `SESSION_STATUS_RUNNING`."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The conversions are exhaustive switches whose default arm is `UNSPECIFIED` rather than a panic, because the database is the older half of a rolling deployment and may hold a value this binary predates."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `Fingerprint`, `StartedAt` and `ClosedAt` are nullable in the row but proto3 has no nullable scalar, so `NULL` collapses to the empty string on the wire — the reverse mapping must turn `\"\"` back into `nil`, never into a pointer to `\"\"`."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `incidentStatusFromProto` maps `UNSPECIFIED` — and any enum value this binary does not know — to the empty string, which every caller reads as \"the client did not say\": an unfiltered list, an unchanged status, the default terminal status."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `sessionKindFromProto` does the same, and the empty string is what `session.Manager` reads as \"decide from the incident's existing sessions\"."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `contextRefRoleFromProto` follows the pattern, with `\"\"` meaning \"derive the role from the artifact's kind\"."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: A turn's stored tool-call JSON that will not parse drops the tool-call list rather than failing the turn — the content is what the investigation is about, and the same detail is on the span."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The same applies to a report's structured `Data` blob and to a tool call's arguments, which are advisory display data: a value that will not round-trip through `structpb` must not cost the client the notice that the call started."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: | Missing `session_id`, negative `after_seq` | `WatchSession` | `InvalidArgument` ([watch.go](src/internal/transport/watch.go#L78)) |"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: | Unknown session | any session read | `NotFound` via `sessionError` ([lifecycle.go](src/internal/transport/lifecycle.go#L165)) |"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: | Payload that can never succeed | webhook | `400` ([webhook.go](src/internal/transport/webhook.go#L68)) |"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: | Store failure during ingest | webhook | `500` so Alertmanager retries ([webhook.go](src/internal/transport/webhook.go#L79)) |"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: | Body over 1 MiB | webhook | `413` ([webhook.go](src/internal/transport/webhook.go#L61)) |"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The mermaid diagram's dependencies, in particular `dl --\u003e blob[blob.Presigner]` and the optional `SessionSettler` edge from `SessionLifecycle`, are not shown in the cited excerpts."
        }
      ]
    },
    {
      "slug": "opentelemetry-setup-and-genai-semantic-attributes",
      "title": "OpenTelemetry Setup and GenAI Semantic Attributes",
      "passed": false,
      "citations": 42,
      "issues": [
        {
          "kind": "citation-symbol",
          "detail": "[the tracer is resolved in `agent.New`](src/internal/agent/agent.go#L116): symbol \"the tracer is resolved in `agent.New`\" not found in cited lines 116-116"
        },
        {
          "kind": "citation-symbol",
          "detail": "[the disabled branch](src/internal/telemetry/telemetry.go#L47): symbol \"the disabled branch\" not found in cited lines 47-50"
        },
        {
          "kind": "citation-range",
          "detail": "[the cardinality test](src/internal/telemetry/genai_test.go#L70): lines 70-76 out of bounds (72 lines in file)"
        }
      ]
    },
    {
      "slug": "blob-storage-backend-and-key-rules",
      "title": "Blob Storage Backend and Key Rules",
      "passed": false,
      "citations": 30,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: \"It lives on a separate interface, `Presigner`, that consumers reach through a type assertion and fall back to streaming through the API when the assertion fails\" — the cited excerpt shows only the interface declaration; no type-assertion usage or streaming fallback appears in the excerpts."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: \"At most 1024 bytes | S3's hard key limit\" — the cited excerpt for keys.go:45-48 only contains the comment describing `maxKeyLength` as S3's hard limit; the constant's value (1024) is not shown."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: \"When the kernel refuses a path it does so with an unexported sentinel wrapped in a `*PathError`, which would make `errors.Is(err, ErrInvalidKey)` false\" — no such sentinel or `*PathError` behavior is visible in any cited excerpt."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: \"A root that is itself a symlink is followed and accepted — the root is the boundary, so where an operator puts it is their business — but a symlink *inside* the root that leads out of it is refused\" — the cited `NewFS` excerpt shows no symlink-handling behavior of the root path itself."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: \"The accepted alphabet is `[A-Za-z0-9._-]`, which covers every UUID v7 the system generates\" — the alphabet is supported, but the claim about UUID v7 generation is not visible in any cited excerpt."
        }
      ]
    },
    {
      "slug": "incident-report-schema",
      "title": "Incident Report Schema",
      "passed": true,
      "citations": 27
    },
    {
      "slug": "generated-korvus-v1-protobuf-and-connect-api",
      "title": "Generated Korvus v1 Protobuf and Connect API",
      "passed": false,
      "citations": 43,
      "issues": [
        {
          "kind": "citation-range",
          "detail": "[buf.gen.yaml](src/buf.gen.yaml#L24): lines 24-36 out of bounds (34 lines in file)"
        }
      ]
    },
    {
      "slug": "generated-typescript-client-types",
      "title": "Generated TypeScript Client Types",
      "passed": false,
      "citations": 43,
      "issues": [
        {
          "kind": "mermaid-reference",
          "detail": "mermaid symbol \"file_korvus_v1_incident\" not found in the code index"
        },
        {
          "kind": "mermaid-reference",
          "detail": "mermaid symbol \"IncidentService\" not found in the code index"
        },
        {
          "kind": "mermaid-reference",
          "detail": "mermaid symbol \"file_korvus_v1_session\" not found in the code index"
        },
        {
          "kind": "mermaid-reference",
          "detail": "mermaid symbol \"SessionService\" not found in the code index"
        },
        {
          "kind": "mermaid-reference",
          "detail": "mermaid symbol \"file_korvus_v1_system\" not found in the code index"
        },
        {
          "kind": "mermaid-reference",
          "detail": "mermaid symbol \"SystemService\" not found in the code index"
        }
      ]
    },
    {
      "slug": "checkout-demo-service-and-telemetry",
      "title": "Checkout Demo Service and Telemetry",
      "passed": false,
      "citations": 46,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The service registers five families [New](src/demo/checkout/internal/shop/shop.go#L141-L178)"
        }
      ]
    },
    {
      "slug": "bundled-mcp-servers-overview",
      "title": "Bundled MCP Servers Overview",
      "passed": false,
      "citations": 49,
      "issues": [
        {
          "kind": "citation-range",
          "detail": "[loki/go.mod](src/mcp-servers/loki/go.mod#L1): lines 1-16 out of bounds (15 lines in file)"
        },
        {
          "kind": "citation-path",
          "detail": "[prometheus/tools.go](src/mcp-servers/prometheus/internal/prom/tools/tools.go#L74): file not found: mcp-servers/prometheus/internal/prom/tools/tools.go"
        },
        {
          "kind": "citation-path",
          "detail": "[tempo/tools.go](src/mcp-servers/tempo/internal/tempo/tools.go#L45): file not found: mcp-servers/tempo/internal/tempo/tools.go"
        },
        {
          "kind": "citation-path",
          "detail": "[tempo/tools.go](src/mcp-servers/tempo/internal/tempo/tools.go#L22): file not found: mcp-servers/tempo/internal/tempo/tools.go"
        }
      ]
    },
    {
      "slug": "loki-mcp-server",
      "title": "Loki MCP Server",
      "passed": false,
      "citations": 76,
      "issues": [
        {
          "kind": "citation-symbol",
          "detail": "[main](src/mcp-servers/loki/cmd/mcp-loki/main.go#L46): symbol \"main\" not found in cited lines 46-115"
        },
        {
          "kind": "citation-symbol",
          "detail": "[main](src/mcp-servers/loki/cmd/mcp-loki/main.go#L80): symbol \"main\" not found in cited lines 80-95"
        },
        {
          "kind": "citation-symbol",
          "detail": "[main](src/mcp-servers/loki/cmd/mcp-loki/main.go#L46): symbol \"main\" not found in cited lines 46-58"
        }
      ]
    },
    {
      "slug": "prometheus-mcp-server",
      "title": "Prometheus MCP Server",
      "passed": true,
      "citations": 56
    },
    {
      "slug": "tempo-mcp-server",
      "title": "Tempo MCP Server",
      "passed": false,
      "citations": 61,
      "issues": [
        {
          "kind": "citation-symbol",
          "detail": "[the error kinds](src/mcp-servers/tempo/internal/tempo/client.go#L57): symbol \"the error kinds\" not found in cited lines 57-74"
        },
        {
          "kind": "citation-symbol",
          "detail": "[main](src/mcp-servers/tempo/cmd/mcp-tempo/main.go#L46): symbol \"main\" not found in cited lines 46-115"
        },
        {
          "kind": "citation-symbol",
          "detail": "[main](src/mcp-servers/tempo/cmd/mcp-tempo/main.go#L46): symbol \"main\" not found in cited lines 46-115"
        },
        {
          "kind": "citation-symbol",
          "detail": "[main](src/mcp-servers/tempo/cmd/mcp-tempo/main.go#L25): symbol \"main\" not found in cited lines 25-33"
        }
      ]
    },
    {
      "slug": "deployment-stack-and-example-configuration",
      "title": "Deployment Stack and Example Configuration",
      "passed": false,
      "citations": 35,
      "issues": [
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The ports in `mcp.servers`, the `otlp_endpoint` and the database DSN all point at services the compose file starts."
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: credentials are `korvus/korvus/korvus`"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: Postgres is the `pgvector/pgvector` image rather than stock `postgres` on purpose: migration 001 runs `CREATE EXTENSION vector` and declares `docs_chunks.embedding` as `vector(1536)`, so a stock image fails at migration time"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The store, with the pgvector extension the embeddings column needs"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: the image `pgvector/pgvector:pg17` for the `postgres` service"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: the image `prom/prometheus:latest` for the `prometheus` service"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: the image `grafana/loki:3.5.1` for the `loki` service"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: The ruler points at an Alertmanager that the dev stack does not run"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `providers` | Completion models, with optional `fallback` | `openai_compatible` or `anthropic`"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `workspace` | The git repo of skills, docs and templates | Synced with go-git, never the git binary"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `session` | Scratch root and default template"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: `skills` | Dev-only skill directory override | Only used when `workspace.url` is empty"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: an unreachable server degrades the skill catalog and is reported through the system status service"
        },
        {
          "kind": "unsupported-claim",
          "detail": "review flagged unsupported claim: CI mirrors this rather than consuming the dev stack. The root integration job declares its own `pgvector/pgvector:pg17` service and points `KORVUS_TEST_DATABASE_URL` at it, and its rules deliberately exclude `deploy/compose/docker-compose.yml` on the grounds that nothing in CI consumes it, so a change there cannot affect any job's result."
        }
      ]
    }
  ]
}