Skip to content

Changelog

A curated, user-facing summary of what landed recently. The authoritative per-batch journal — every commit + every link — lives on STATUS.md (the agent-curated status board); the immutable per-commit journal-of-record is git log. This page is the friendlier surface: what's new, what changed, what to know.

2026-07-10 — get.kinra.ai installer + kin doctor + this site goes public

One pasted command now takes a fresh Linux/macOS machine to a running kin:

bash <(curl -fsSL https://get.kinra.ai/install.sh)
  • get.kinra.ai is a single static page (no framework) with per-OS prereq notes (Fedora / Ubuntu·Debian / macOS / Windows-via-WSL2) and the one-liner above. install.sh installs uv if missing, clones kinra-ai/kin-textual, uv syncs, installs kin via uv tool install --editable, and writes a starter ~/.kin/settings.toml — idempotent, no sudo, never edits shell rc files. Needs an SSH key with repo access (private repo).
  • No SSH key? uv tool install kin --index https://get.kinra.ai/simple/ installs the latest built wheel from a static index instead — read-only, no checkout, no dev loop.
  • kin doctor — a new subcommand that verifies any install: tools on PATH, a resolvable model provider (and which source supplies it), and the endpoint's reachability (--offline skips the last check). Exit 0/1. See Install § Verify the install.
  • kin --version — prints kin <version> and exits before any TUI import; the installer's success gate.
  • This site is now public at docs.kinra.ai, overriding the earlier "docs hosting LOCAL-ONLY" decision. A companion outpost-install.sh (also from get.kinra.ai) brings up the Outpost on a fresh server the same way.

2026-07-10 — Composer drag-drop + paste attach files by reference

Dropping files onto the composer, or pasting a Finder multi-file selection or an absolute path, now attaches them as @-mentions instead of dumping raw path text into the prompt — the same untrusted-content framing and secret-file guard an @-mention typed by hand already gets.

  • Whole-paste file detection — when the entire paste is one or more absolute, existing file paths (Finder's newline-joined drop, Ghostty's backslash-escaped spaced path, iTerm's newline join), each becomes an @-mention at the caret in one toast; a prose paste that merely mentions a path is left untouched.
  • Oversize images (over 5MB) auto-downscale via macOS's sips before attaching, to fit the vision-model edge budget.
  • ctrl+v captures a clipboard image directly — no intermediate file needed.
  • More than 10 files in one drop warns and inserts the paste verbatim instead of silently attaching a partial set.
  • Opt out with KIN_PASTE_MENTIONS=0 (or paste_file_mentions = false in settings.toml) to get the old verbatim-paste behavior back.

2026-07-10 — read_file learns Word + Excel (.docx/.xlsx)

read_file classified files by extension — image / PDF / SVG / text — and everything else fell through to the text reader, which opens a file with errors="replace". A .docx or .xlsx (zip containers of XML, not UTF-8 text) therefore came back as silent mojibake — a wall of replacement characters the model would hallucinate against. That fallthrough is now dead.

  • Word (.docx, .docm) → clean text: paragraphs plus tables rendered as Markdown rows, in document order.
  • Excel (.xlsx, .xlsm) → each sheet as a ## title heading + a Markdown table (cached values, not formulas), capped at 10 sheets × 100 rows × 30 columns with a truncation footer, then the same 50 KB char cap as PDF. @-mentioning an Office file works too.
  • Macros are never read. The .docm/.xlsm variants are handled, but the VBA blob is not a paragraph or a worksheet — it's structurally unreachable.
  • Two security guards, verified engaged (not just installed): a zip-bomb cap that rejects an archive whose declared decompressed size exceeds 50 MB (checked before any parse), and the XML entity-expansion guard (defusedxml, openpyxl's billion-laughs defense). A four-pin test battery proves both fire.
  • No silent garbage, ever: a corrupt or non-Office file with one of these extensions returns an explicit error: — never a mojibake decode.

2026-07-04 — Unlimited main-session turns (KIN_MAX_TURNS)

The main session's per-turn round cap was hardcoded at 40 model↔tool round-trips — fine for typical interactive turns, but it cut short the long agentic runs a large model can sustain for hours. The cap is now unlimited by default, configurable end-to-end, and the subagent caps are raised to match.

  • KIN_MAX_TURNS env / max_turns settings key / --max-turns headless flag — 0 = unlimited (the default). A non-zero value caps the model↔tool round-trips in one user turn (done reason turn_cap, headless exit 1). Mirrors the existing token_budget resolution chain.
  • Subagent caps raised: default max-turns 20 → 100, hard cap 100 → 1000 (a subagent profile's frontmatter).
  • The doom-loop guard (3× identical call+result) remains the real no-progress backstop, so an unbounded cap is safe — a stuck loop still trips it. max_turns is an operator leash (deliberately not model-writable), just like the per-run token_budget.

2026-07-04 — TUI polish pass + docs audit

A 10-commit TUI polish pass (POLISH r1-r10) landed on dev (the 746535b fix commit followed), then a separate docs-audit pass cleaned up drift in the user-facing docs.

POLISH r1-r10 + 746535b (the visual identity series):

  • r1 — every functional glyph consolidated into theme.py constants (POLISH-r1 audit-fail for any drift site; zero diffs).
  • r2#transcript { margin-bottom: 1 } always-on transcript↔StatusBar gap; the old .-turn-end re-tagging machinery deleted; the docked Footer replaced with the placeholder's F1 help hint.
  • r3UserMessage is a rounded titled box with a you border-title (auto-width hugs short prompts, wraps long ones).
  • r4 — connector vocabulary: G_RUNNING flipped to , carets on Collapsible, ╰ tail elbow for the live tail of a running tool, border-left rails on Contents.
  • r5Reasoning title two-tone (thinking…thought · 4s), body italic dim, left rail $accent 35%.
  • r6 — new shimmer.py primitive (cosine-swept raised-cosine sweep, 2.0s period, 5.0-char band) + StatusBar phase-word state machine (thinking / mulling / tracing / sifting / weaving / kindling / distilling rotation).
  • r7 — subagent dedup (single set_activity(f"agent working ({profile})…") on the bg path) + task · <profile> agent-mode title.
  • r8tool_call_draft end-to-end (new Chunk("tool_draft", …) on both wires — name + chars only, NO argument content; loop-side ≤250ms throttle; ForwardingEmit drops it from subagent children; StatusBar shows drafting <name>… N chars with char-count tiers).
  • r9 — WorkflowCard shimmer + tooltips + HelpModal audit (cursor-mode + expand-all + ctrl+p added; scrollable body fixed-height+1fr-scroll).
  • r10 — snapshot baselines regen + docs sync (docs/reference/events.md got tool_call_draft; docs/getting-started/first-run.md mentions the shimmer + phase-word state machine + TEXTUAL_ANIMATIONS=none fallback; REFERENCE.md § UI widgets & theme got the four invariants).
  • 746535b — fix pass for the adversarial-review findings from the polish series.

Docs audit (this pass):

  • vLLM example model id refreshed across README.md + the vLLM recipe in docs/guide/models-and-providers.md + the banner mock-ups in docs/BANNER_SPEC.md + the example in research/README.md — fleet is now Qwen3.6-35B-A3B on vLLM 0.23.0 (was 27B-FP8).
  • src/kin/tui/CLAUDE.md synced with POLISH r1-r10 — new shimmer.py row in the UI map, new "POLISH r1-r10 invariants" subsection under Theme & visual identity.
  • TRACKER line 16 (the former TRACKER backlog) stale wording fixed ("NOT yet pushed, NOT on main" → "PROMOTED to main 2026-07-03, clean FF to 6e32d6b"); the §23-31 STRATEGY closure block collapsed to a 5-line recap pointing at research/2026-07-02-strategy.md and the 2026-07-03 review (now docs/decisions/0009 + 0010).
  • Verify-suite count reconciled: task verify runs eleven wired-in suites (was "ten"); verify-memory and verify-workflow added to README's verify command list.
  • MCP servers added to CLAUDE.md's operator-tour block.
  • New docs/internals/extending-tools.md — the user-facing mirror of src/kin/harness/CLAUDE.md's tool-author guide, plus walkthroughs for adding a permission kind and a subagent profile.
  • docs/concepts/architecture.md extended — "Compared to other agent harnesses" table (kin in-process vs Claude Code / Gemini / Codex subprocess vs Aider/Continue LSP vs OpenHands/Devin remote), Mermaid turn-flow diagram.
  • New docs/getting-started/first-session.md — 10-exercise TUI tutorial (welcome banner, slash history, cursor mode, planning freeze, sessions).
  • KIN_BASE_URL heuristic anchor made explicit (#the-kin_base_url-heuristic) on docs/guide/models-and-providers.md; docs/getting-started/first-run.md uses the explicit anchor.
  • The former HARNESS_PLAN planning doc's "Dynamic workflows DESIGN" section collapsed (~279 lines → ~62 lines pointer + recap).
  • docs/kin-console.md deleted (76-line placeholder predating the Outpost; superseded by docs/guide/outpost.md).
  • Duplicate trailing line removed from docs/guide/sessions.md.
  • docs/404.md (this 404 page) + docs/changelog.md (this page) added.

2026-07-03 — STRATEGY build PROMOTED to main

All 11 rocks landed (Tier 0 + Tier 1 + Tier 2 + ALL of Tier 3: 3a/3b/3c/3d/3e), verified, and PROMOTED to main (clean FF to 6e32d6b, 2026-07-03 ~21:00). Outpost was redeployed with all three riders (2a scheduler / 3b chromium / 3c Memory card). Verify baseline: 2500/0 across 11 suites.

Tier 3 (the maturation tier):

  • 3a MCP maturation — hardening + elicitation + resources + OAuth (auth-code+PKCE, NOT device flow: research overturned the hunch).
  • 3b Computer-use Tier-1browser tool (Playwright chromium, text-only, action-enum, scheme allowlist, two-layer SSRF guard).
  • 3c Agent-memory floormemory tool (Anthropic's memory_20250818 command set 1:1) + FTS5 recall index + session-end consolidation side-call + Outpost Memory card.
  • 3d Multi-agent artifact storepublish/ref verbs + agent() opt-in {ref, summary} handle + ride-alongs /revise + /research.
  • 3e Code-interpreterrun_code stateful per-Session kernel under the OS sandbox (kind=perm.SHELL reuses the shell decision path; zero permission-plumbing edits).

Half-rock gap (still open): Tier 2b "GPU governor" landed a per-run token leash, NOT the cross-run GPU-fairness gate STRATEGY asked for. Live session + scheduled job still race one GPU. See the 2026-07-03 review (now docs/decisions/0009 + 0010) Tier-2b section.

2026-07-02 — Headless run mode

kin -p <prompt> (the Tier 0 keystone from the STRATEGY research) — one turn, no UI, real Backend, collecting emit sink, exit 0/1/2 contract. The Outpost scheduled-jobs centerpiece (2a) consumes this via kin -p SUBPROCESSES. Closes the gate for scheduling / evals / cron work. See the Headless guide for the full surface.

2026-07-01 — Live reasoning-effort controls

/effort slash command + per-serve picker (low / medium / high / xhigh / max for Anthropic; low / medium / high for OpenAI-compat; auto / on / off for Qwen). The KIN_REASONING_EFFORT env var overrides per session.

2026-06-30 — Git network tools

git-push / git-pull / git-fetch modeled on ssh.py (structured args only, argv assembled element-by-element, runs OUTSIDE the OS sandbox). push / pull reuse kind=perm.MCP (ASK both modes); fetch gets the new kind=perm.NETWORK (ALLOW auto / ASK strict / freeze-DENY). force only ever emits --force-with-lease (no raw --force).

2026-06-28 — v3 §4-7 batch

  • §4 ssh egressssh tool (kind=MCP, outside the sandbox, honors ~/.ssh/config, opt-in global ssh_hosts, host-scoped approvals).
  • §5 bundled exemplar skills — 9 SKILL.md exemplars (deep-research / brainstorm / code-review / simplify / debug / commit-message / plan / skill-creator / pr-description).
  • §6 search_workspace Tier 1 — stdlib FTS5 build/search, secret
  • gitignore exclusion, off by default (KIN_SEARCH=1). Tier 2 (vector / embed / rerank) DEFERRED.
  • §7 settings toolread_settings READ + propose_settings META with an explicit MODEL_WRITABLE_KEYS allowlist.

2026-06-27 — auto-first two-mode collapse + plan lifecycle

The two-mode core (auto + strict, the CYCLE for shift+tab) plus the planning freeze (a transient read-only overlay, not a mode). defaultstrict, accept-editsauto, planstrict legacy aliases. /plan enters the freeze; present_plan presents the tracked plan file (3-option modal: keep / clear & re-inject / hand to critic).

2026-06-26 — Dynamic workflows ("ultracode") MVP

The seven primitives (agent / parallel / pipeline / phase / log / publish / ref) + the workflow tool + the TUI WorkflowCard + the /workflows modal. Closed namespace (capability by absence, NOT a sandbox) + AST filter + SIGALRM busy-loop watchdog. See the Workflows guide for the user-facing walkthrough.

2026-06-26 — Background subagents + Ctrl+O panel

The task tool spawns a bg subagent and returns an agent id immediately; the model sees a metadata-only <system-reminder> on the next depth-0 turn (never subagent prose). MAX_BG_SUBAGENTS = 3 is the runaway guard. Ctrl+O opens the panel (shells / agents / tasks panes, Tab cycles).

2026-06-26 — Tasks DAG + --agent CLI

The tasks tool with action enum (add / update / complete / remove / list / blocked), cycle-checked, auto-unblock on complete. Sidecar at <KIN_SESSION_DIR>/<session_id>.tasks.json. kin --agent <name> runs the main session as a profile (TTY-only).

2026-06-25 — kin CLI packaging

The installable kin uv CLI (src layout, hatchling). macOS Ghostty "Open in kin" Finder Quick Action in extras/macos/.

2026-06-24 — File-extraction refactor + security fixes

The read_file tool gained PDF (via pypdf) + image (PNG / JPEG / GIF / WebP as image blocks; SVG as text) support, with a 50k char cap and a coerce_int discipline for numeric args.

2026-06-23 — Spine landed, verified, live-tested + hardened

The kin-textual → native Python harness pivot. In-process harness (src/kin/harness/) + Textual UI (src/kin/tui/) + the event vocabulary seam (src/kin/harness/events.py). No subprocess, no NDJSON, no wire between the two. The Go ../kin/ repo became the design reference only.