Roadmap
Kora is being built in small, runnable steps. This page separates the features implemented in the current codebase from the work that remains.
Working now
The current codebase includes:
- Python-like syntax, a conservative static checker, modules, imports, and
source diagnostics. The checker covers local declared assignments and
returns, calls, constructors, fields, loop control, and direct classified
flow into
analyze; dynamic integrations remain runtime-checked. kora run,kora test, and the debugger run the checker before starting effects. An invalidkora.tomlor corrupt durable journal stops execution instead of selecting defaults or starting a run again.kora run,check,test,audit,trace, and durable run commands.- Typed
analyzecalls with OpenAI and Ollama providers, including images and per-call model selection. - Record and replay cassettes for deterministic tests without model costs.
- Agents, parallel work, lexical budgets, human pauses, and resumable runs.
- Durable pipelines:
fs.write,fs.append, andsql.executeare journaled effects, so a killed run resumes without writing any row twice, and reads are digest-checked so a resume against changed input stops rather than mixing two inputs into one run. The journal is append-only, one line per effect, and a run is locked to one process while it is open. - Concise workflow composition:
streamfor a prose answer,else (why, kind)for flat outcome handling with a recorded status, andcase A(x) | B(x)for shared branches. - Crash-safe streaming inside a durable run. A stream killed after part of its
answer was written is never sent to the provider again and never writes those
pieces twice: the resume returns
Failedfor the program to match on. One killed before it wrote anything is sent again like ordinary unfinished work. - One effect lifecycle across model calls, tools, and writes. An effect that cannot be repeated safely leaves a mark before it is sent, so a resume can tell “never started” from “outcome unknown” — and an interrupted tool-using call stops the run naming what is in doubt instead of silently running every tool a second time.
- Classified data, scoped
declassify, sink policies, and audit output. - Safe terminal output:
printandwriteredact classified leaves using a project-configurable marker. - Native
json,yaml,xml,csv,fs,http,sql,time,re,env,notes, andpdfmodules, withfs.imageandfs.globfor working over a folder of files.pdfreads a document’s text and keeps its page boundaries, and says whether there is a text layer at all, so a scan is never mistaken for an empty document. - Package helpers: a package may declare one separate program it carries
heavy work out to, for what cannot be written in Kora. Kora links no native
code itself, so a crash or a hang in a helper is a value the program
matches rather than a dead run. A fetched helper is pinned by
sha256, fetched only for the platform and only for a package the program imports, and recorded inkora.sums. - Confined helpers:
[package.helper] needsis empty by default, and the operating system enforces it — a seccomp filter on Linux, a sandbox profile on macOS. A confined helper cannot open a socket, write a file, or read the memory of thekoraprocess that started it, andneeds = ["net"]is refused unless the importing program holdsnetitself. Windows has no mechanism available to an unprivileged process, and the runtime says so rather than implying a sandbox that is not there. - Stopping work that stopped being worth doing.
breakinside aparallel forends the fan-out — no further item is started, and the branches already running are let go of at their next statement — andbreak <value>carries what the branch that stopped it found, so a search ends as soon as it has an answer. Abudget(max_seconds = N)deadline now reaches work already sent: model calls, HTTP requests, MCP tool calls, and helper calls all take the smaller of their own timeout and what the scope has left. - Python sidecar and MCP tool integrations through project configuration,
with a deadline on every MCP request. A tool server that does not answer
comes back as
Failed(reason)instead of ending the run, and tool calls are never retried, because a timeout is exactly when whether the effect ran is unknown. - VS Code syntax highlighting, file icons, language-server features, and run and test commands.
- Lexical
with context(...)policies that bound model input independently of spend budgets, retaining newest whole tool exchanges and failing rather than silently truncating base prompt or data.
Coming next
Prove the product wedge
The product thesis is now deliberately narrow: policy-safe, replayable AI workflows over sensitive claims, invoices, compliance records, and internal documents. The next release gate is evidence, not more syntax:
- work with three design partners on one repeated document workflow;
- publish one end-to-end case study with correctness, cost, and replay data;
- benchmark that workflow against an established Python or TypeScript stack;
- publish a conformance suite for checking, label flow, and journal recovery;
- commission an independent security review before any production claim.
If teams do not keep using the workflow after a 90-day trial, Kora should shrink into a DSL or library instead of expanding as a general-purpose language.
Finish cancellation
parallel for ... first has shipped: a candidate answer stops later work from
starting while lower input indexes already in flight are allowed to finish.
The earliest successful input wins, and that result is journaled so a resumed
run keeps the live run’s decision rather than racing again.
What remains is the half that is genuinely hard — interrupting a branch already running. Today no further work is started, but a request already sent runs to its own transport timeout. That is the same “did it happen” problem that makes a tool call unretryable, and it will be solved once, deliberately, rather than approximated.
Stabilize streaming and workflows
Streaming prose works for a single str call, including inside a durable run,
and is metered and retried on the same terms as a blocking one. The remaining
work is streaming alongside tools and parallel for, exact in-flight token
enforcement, and a general event-stream API.
Sharpen what confinement claims
A helper’s sandbox is a denylist: the network and filesystem writes are withheld, and the claim stops there. An allowlist is stronger and is what a WASM component will eventually give, which is why WASM remains the end state rather than a second sandbox to maintain. Windows confinement is the other open piece.
Fill the deliberate standard-library gaps
yaml has shipped: config is where a program is one step from doing
something consequential, so it refuses a duplicate key, reads the YAML 1.2
core schema (no Norway problem), and meters alias expansion against a node
budget so a “billion laughs” file is a value rather than an out-of-memory
kill.
xml has shipped alongside it, on the same terms: a DOCTYPE is refused
outright, so the XXE and billion-laughs attack class has nowhere to start;
namespaces are kept as data rather than glued to the tag; character data is
whole; and children is a list at every length, so a program’s shape does
not change with the size of its input.
A dedicated network module remains unbuilt. The existing http module
stays the network boundary until a narrower, safer API is ready.
PDF rendering is not a stdlib gap any more, and deliberately not a stdlib
feature: it lives in the pdf_render package, which carries PDFium in a
helper process. A program that never renders a PDF downloads nothing and pays
nothing for it.
Complete the package ecosystem when there is demand
A hosted checksum log begins when third parties routinely fetch Kora packages. WASM components begin when a package cannot be expressed in Kora, MCP, or the Python sidecar. Native shared libraries remain deliberately unsupported.
Durable write throughput
Done. Every journaled write still costs two synced appends, but the syncs of
workers running beside each other are now coalesced into one: 400 rows from a
parallel for went from 4.79s to 0.82s, 5.8x, doing 131 syncs where it used
to do 800. Nothing was weakened to get it — every record still reaches the
disk before the program acts on it.
A sequential loop is unchanged, and deliberately so: one thread has nobody to batch with. What remains under durable execution is retention and compaction of old runs.
Improve distribution and editor workflows
The next product work includes crates.io and Open VSX distribution, CLI polish, and richer project-aware editor and debugging workflows.
A note on status
Kora is still pre-alpha. A feature listed as working is implemented in the current repository and release checks. A feature listed as coming next is a real direction, but its APIs may still change.