Skip to content

korvid v0.2.0

Choose a tag to compare

@github-actions github-actions released this 15 Aug 10:35
· 17 commits to main since this release
795fd52

korvid v0.2.0

Operational context, without surrendering control. This release adds a
navigable Kubernetes relationship graph, a bounded session timeline,
read-only Prometheus/Loki investigation, MCP 2.0 support, Homebrew
distribution, and substantial large-cluster performance work.

Install or upgrade

uv tool install 'korvid[all]==0.2.0'
# or
pipx install --force 'korvid[all]==0.2.0'

For a new install:

uv tool install 'korvid[all]==0.2.0'
korvid

After the generated tap pull request is merged, Homebrew installs the TUI and
agent stack on macOS or Linux without relying on the system Python:

brew install hellices/korvid/korvid

The Homebrew formula deliberately excludes the MCP HTTP server. Install
korvid[mcp] or korvid[all] from PyPI when MCP is required.

install adds
korvid==0.2.0 base TUI
korvid[agent]==0.2.0 embedded agent
korvid[mcp]==0.2.0 MCP server
korvid[agent,observability]==0.2.0 agent with Prometheus/Loki tools
korvid[mcp,observability]==0.2.0 MCP with Prometheus/Loki tools
korvid[all]==0.2.0 agent, MCP, and observability
korvid[all,entra]==0.2.0 all features plus Entra ID auth

Python 3.11–3.13 is supported on Linux, macOS, and Windows.

Relationship graph

Press g on a resource to open a bounded operational graph assembled from
Kubernetes facts rather than model inference. It connects:

  • owners and owned resources;
  • workloads, selectors, Pods, Services, and EndpointSlices;
  • Ingress and Gateway API backends;
  • volumes and PVCs;
  • ConfigMap and Secret references without reading Secret values;
  • PDB selectors and node placement.

Every edge records its evidence and whether it is declared, observed, or
inferred. Missing APIs, missing RBAC, unresolved references, cycles, and
traversal caps remain visible, so an incomplete graph never masquerades as
proof that no dependency exists.

Bounded session timeline

Press T to inspect what happened during this process:

  • accepted watch ADDED, MODIFIED, and DELETED deltas;
  • projected and redacted Kubernetes Warning Events;
  • context-switch start, completion, and failure;
  • write intent and outcome after the matching durable audit append succeeds.

The timeline is bounded by entry count and encoded bytes, partitioned by
context epoch, and filterable by epoch, source, and selected resource. Old
context rows may be inspected but cannot navigate into a same-named resource
in the current cluster. Cluster-authored text is bounded and rendered
literally.

Read-only observability

The optional observability extra adds bounded query_metrics and
search_logs tools for Prometheus and Loki to the agent or MCP surface; it has
no standalone base-TUI panel. They use a closed metric catalogue and escaped
Kubernetes scope rather than arbitrary model-authored PromQL or LogQL.
Credentials are resolved at call time, results are capped and masked, and the
tools are absent when no backend is configured.

See
docs/observability.md.

MCP 2.0

The MCP adapter now uses the 2.x SDK and explicitly threads request context
through handler dispatch. Tool failures remain in-band and the write approval
gate is verified through a real Streamable HTTP round trip. Existing
korvid --mcp usage remains the same; environments that pin korvid's transitive
MCP dependency should recreate or upgrade the tool environment.

Performance

The 1,000-Pod update path now:

  • memoizes stable rendered rows;
  • avoids re-seating an unchanged cursor;
  • batches visible cell refreshes;
  • keeps bucket order stable until the key set changes;
  • caches AGE strings for their validity window.

The corrected performance report includes the full round-robin 2×2 comparison
and clearly separates table-update passes, row rebuilds, and display refreshes.
See
docs/performance.md.

Supply chain and release hardening

  • Pre-commit and CI guards reject private mirror hosts in uv.lock and
    resolution-redirecting uv configuration.
  • A dedicated Relock workflow can produce a PyPI-only lock when a local
    machine cannot reach PyPI directly.
  • Release build requirements are exactly pinned and hash constrained.
  • The Homebrew formula is generated from the verified PyPI-only lock.
  • Wheel, sdist, checksums, SBOM, offline bundles, and Sigstore provenance are
    produced from one reviewed build.

Safety invariants

This release does not relax the write boundary:

  • every write still requires a fresh user confirmation;
  • RBAC, UID preconditions, context checks, and server dry-run remain in place;
  • audit logging remains fail-closed;
  • inferred graph edges and timeline entries are advisory and never approve or
    block a write by themselves;
  • Secret values are never read to construct graph edges.

Verify

set -eu
gh release download v0.2.0 --dir dist/v0.2.0
gh attestation verify dist/v0.2.0/korvid-0.2.0-py3-none-any.whl \
  --repo hellices/korvid
gh attestation verify dist/v0.2.0/SHA256SUMS --repo hellices/korvid
(cd dist/v0.2.0 && shasum --algorithm 256 --check SHA256SUMS)

An SBOM for the full dependency set ships with the release.

Known limits

  • The graph is intentionally incomplete when APIs or permissions are missing;
    it is not a causal or outage-prediction engine.
  • The timeline exists only for the current process and is not persistent
    multi-user history.
  • Homebrew excludes MCP; use the PyPI extras for the HTTP server.
  • Uninstalling korvid leaves configuration, audit records, cached logs, and
    keyring credentials in place. Cleanup is explicit in the
    release runbook.

Report vulnerabilities privately through
SECURITY.md, not a
public issue.