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:
- 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.shinstallsuvif missing, cloneskinra-ai/kin-textual,uv syncs, installskinviauv 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 onPATH, a resolvable model provider (and which source supplies it), and the endpoint's reachability (--offlineskips the last check). Exit0/1. See Install § Verify the install.kin --version— printskin <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 companionoutpost-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
sipsbefore attaching, to fit the vision-model edge budget. ctrl+vcaptures 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(orpaste_file_mentions = falseinsettings.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## titleheading + 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/.xlsmvariants 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_TURNSenv /max_turnssettings key /--max-turnsheadless flag —0= unlimited (the default). A non-zero value caps the model↔tool round-trips in one user turn (done reasonturn_cap, headless exit1). Mirrors the existingtoken_budgetresolution chain.- Subagent caps raised: default
max-turns20 → 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_turnsis an operator leash (deliberately not model-writable), just like the per-runtoken_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.pyconstants (POLISH-r1 audit-fail for any drift site; zero diffs). - r2 —
#transcript { margin-bottom: 1 }always-on transcript↔StatusBar gap; the old.-turn-endre-tagging machinery deleted; the docked Footer replaced with the placeholder'sF1 helphint. - r3 —
UserMessageis a rounded titled box with ayouborder-title (auto-width hugs short prompts, wraps long ones). - r4 — connector vocabulary:
G_RUNNINGflipped to•, carets onCollapsible,╰ tailelbow for the live tail of a running tool,border-leftrails on Contents. - r5 —
Reasoningtitle two-tone (thinking…→thought · 4s), body italic dim, left rail$accent 35%. - r6 — new
shimmer.pyprimitive (cosine-swept raised-cosine sweep, 2.0s period, 5.0-char band) + StatusBar phase-word state machine (thinking/mulling/tracing/sifting/weaving/kindling/distillingrotation). - r7 — subagent dedup (single
set_activity(f"agent working ({profile})…")on the bg path) +task · <profile>agent-mode title. - r8 —
tool_call_draftend-to-end (newChunk("tool_draft", …)on both wires — name + chars only, NO argument content; loop-side ≤250ms throttle;ForwardingEmitdrops it from subagent children; StatusBar showsdrafting <name>… N charswith char-count tiers). - r9 — WorkflowCard shimmer + tooltips + HelpModal audit
(cursor-mode + expand-all +
ctrl+padded; scrollable body fixed-height+1fr-scroll). - r10 — snapshot baselines regen + docs sync (
docs/reference/events.mdgottool_call_draft;docs/getting-started/first-run.mdmentions the shimmer + phase-word state machine +TEXTUAL_ANIMATIONS=nonefallback;REFERENCE.md § UI widgets & themegot 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 indocs/guide/models-and-providers.md+ the banner mock-ups indocs/BANNER_SPEC.md+ the example inresearch/README.md— fleet is now Qwen3.6-35B-A3B on vLLM 0.23.0 (was 27B-FP8). src/kin/tui/CLAUDE.mdsynced with POLISH r1-r10 — newshimmer.pyrow in the UI map, new "POLISH r1-r10 invariants" subsection under Theme & visual identity.TRACKERline 16 (the former TRACKER backlog) stale wording fixed ("NOT yet pushed, NOT on main" → "PROMOTED tomain2026-07-03, clean FF to6e32d6b"); the §23-31 STRATEGY closure block collapsed to a 5-line recap pointing atresearch/2026-07-02-strategy.mdand the 2026-07-03 review (nowdocs/decisions/0009+0010).- Verify-suite count reconciled:
task verifyruns eleven wired-in suites (was "ten");verify-memoryandverify-workflowadded 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 ofsrc/kin/harness/CLAUDE.md's tool-author guide, plus walkthroughs for adding a permission kind and a subagent profile. docs/concepts/architecture.mdextended — "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_URLheuristic anchor made explicit (#the-kin_base_url-heuristic) ondocs/guide/models-and-providers.md;docs/getting-started/first-run.mduses the explicit anchor.- The former
HARNESS_PLANplanning doc's "Dynamic workflows DESIGN" section collapsed (~279 lines → ~62 lines pointer + recap). docs/kin-console.mddeleted (76-line placeholder predating the Outpost; superseded bydocs/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-1 —
browsertool (Playwright chromium, text-only, action-enum, scheme allowlist, two-layer SSRF guard). - 3c Agent-memory floor —
memorytool (Anthropic'smemory_20250818command set 1:1) + FTS5 recall index + session-end consolidation side-call + Outpost Memory card. - 3d Multi-agent artifact store —
publish/refverbs +agent()opt-in{ref, summary}handle + ride-alongs/revise+/research. - 3e Code-interpreter —
run_codestateful per-Session kernel under the OS sandbox (kind=perm.SHELLreuses 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 egress —
sshtool (kind=MCP, outside the sandbox, honors~/.ssh/config, opt-in globalssh_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 tool —
read_settingsREAD +propose_settingsMETA with an explicitMODEL_WRITABLE_KEYSallowlist.
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). default → strict, accept-edits → auto, plan →
strict 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.