On this page

Reality map

Implementation status and evidence ledger

A source-audited maturity ledger for every Shoal subsystem, host surface, security boundary, platform promise, and historical design claim.

Status
Audit snapshot: 2026-07-16
For
Maintainers, reviewers, and release owners
On this page
  1. Status vocabulary
  2. Evidence hierarchy
  3. Executive dashboard
  4. Host-surface parity
  5. Crate-by-crate maturity ledger
  6. Language implementation matrix
    1. Syntax and dispatch
    2. Values and methods
    3. Namespaces and commands
  7. Execution and concurrency matrix
  8. Security and authority status
    1. Authentication and session identity
    2. Effects, policy, and enforcement
  9. Protocol and agent surface status
    1. Kernel router
    2. MCP facade
    3. Refs and elision
  10. Configuration status
  11. Prompt, editor, and LSP status
  12. Reef and adapter status
    1. Reef
    2. Adapters
  13. Persistence status
  14. Platform matrix
  15. Quality and test evidence
    1. Current evidence
    2. Known quality gaps
  16. Historical-document reconciliation
    1. Historical wave disposition
  17. Release claim checklist
  18. Highest-impact open findings
  19. Audit maintenance protocol

This page answers one deliberately narrow question: what is real in the current tree, through which host, and with what evidence? It is not a release announcement and it is not a substitute for executable tests. It reconciles historical design documents with the source so that an old “done” label cannot quietly become an architecture guarantee.

Read the system map first for ownership, the change map before editing a boundary, and the roadmap for ordered future work. The status vocabulary below is the same vocabulary future audits should use.

Status vocabulary🔗

LabelMeaningRequired evidence
ImplementedThe behavior is reachable through at least one real composition root.Runtime source plus a focused or integration test.
Implemented, host-limitedThe behavior works, but not through every surface implied by broad product prose.Host matrix names the supported and missing routes.
PartialA useful path exists, but an important semantic, authority, lifecycle, or portability requirement is absent.The missing requirement is stated explicitly.
ScaffoldedTypes, config, protocol, or a leaf implementation exist without an end-to-end caller.The last real caller and missing edge are named.
AspirationalThe idea exists only in design prose or an intentionally deferred contract.No current user-facing claim is made.
DriftedTwo executable or serialized descriptions disagree.Both sides and the intended authority are named.

“Implemented” never means “finished forever.” It means the audited claim is reachable and tested at the stated scope. A unit-tested leaf with no host caller remains scaffolded. A UI that returns an honest unavailable error is a correctly implemented error boundary around an incomplete feature.

Evidence hierarchy🔗

The audit uses this order when sources disagree:

  1. public types and reachable runtime branches;
  2. integration tests and the normative language corpus;
  3. focused unit tests;
  4. generated schemas and protocol fixtures;
  5. current internal documentation;
  6. historical root documents, comments, wiki prose, and remembered demonstrations.

The snapshot inspected the workspace manifests, all composition roots, the 77 conformance suites, the kernel router and handlers, MCP mappings, configuration consumers, Reef resolution, prompt producers, journal schema, and CI definitions. It does not certify every OS backend on every kernel version, every third-party adapter executable, or performance targets on release hardware.

Executive dashboard🔗

AreaStatusStrongest current evidenceMaterial qualification
lexical grammar and parserImplementedparser tests, format round trips, conformance corpushost parse context differs for some statement heads
AST and source spansImplementedtyped AST, parser fixtures, wire span testsoptional outcome spans survive normal and elided wire paths; producers may honestly omit them
evaluator and structured valuesImplementedevaluator tests and 1,310 corpus casesfunction type checking and method metadata have holes
builtins and namespacesImplementedcanonical builtin identity registry and corpusbroader command resolution remains distributed
process captureImplementedreal process-group and dual-pipe testshash preflight has an exec-time TOCTOU window
interactive PTY executionImplemented, host-limitedUnix PTY integration and REPL testsWindows/ConPTY is deferred; kernel PTYs are poll-based
streams and channelsImplemented, host-limitedevaluator stream tests and live kernel bridgestream-to-stdin and wire item pulling are absent
effects and plansPartial authoritystatic derivation, policy tests, plan/apply handlerscap.request is unattached; plan refs collide for equal effect shapes
Leash filesystem sandboxImplemented, host-limitedLinux/macOS backend tests and enforcement reportingnetwork enforcement is unavailable; local malformed-policy mode is permissive
task lifecyclePartialevaluator jobs and kernel async task testskernel suspend/resume returns TASK_CONTROL_UNAVAILABLE
modules and script runnersImplemented, host-limitedmodule/corpus tests and .shl executionnon-.shl bare path heads require explicit run
Reef environmentsImplementedresolver/provider/lock/view tests and evaluator integrationdiscovery/cache/persistence fail-soft edges remain
adaptersImplementedschema fixtures, bundled catalog, evaluator bindingsexternal tools and output dialects remain inherently environment-dependent
configurationImplemented, host-limitedtyped loader tests and CLI wiring integrationaccepted kernel, journal, render.width, and leash.policy fields are inert
promptImplemented, host-limitedpure renderer snapshots and CLI producerseveral context fields are hardcoded or never produced
journal and CASImplementedSQLite/CAS/undo/GC testsdual row granularity and permanent spill pins complicate lifecycle
kernel JSON-RPCImplemented with authority defectsrouter/handler tests and daemon testsunattached approval/journal calls, named-session ownership, frame allocation
MCP facadeImplementedlive-kernel integrationunsubscribe does not terminate the subscription worker
LSPPartialprotocol tests and shared builtin namesdeclarations/completion remain mostly lexical, not evaluator-semantic
secretsImplemented, host-limitedsecret value redaction and port testsstorage backend and host coverage are narrow by design
WASMScaffoldedisolated Wasmtime limit testsno evaluator invocation path or wall-clock deadline
WindowsAspirationalexplicit deferred branchesUnix sockets, job control, PTY, sandbox, and path rules need a separate port

Host-surface parity🔗

The same syntax crate does not imply the same runtime environment. “Local” below means the interactive shoal REPL or shoal -c; “kernel” means direct newline-delimited JSON-RPC; “MCP” means the stdio facade; “LSP” is editor analysis only.

CapabilityLocal shell.shl / -cKernelMCPLSP
parse full languageyesyesyesvia toolyes
binding-aware statement-head parseyesevaluator-dependentnoinherits kernelno
evaluate structured valuesyesyesyesshoal_execno
persistent evaluator variablesREPL lifetimeprocess lifetimenamed-session lifetimenamed-session lifetimeno
layered core configyesyesnonono
init scriptsyesyesnonono
rich promptyesn/anonono
bundled adaptersyesyesnot assembled by session builderinherits kernelnames only
user/project Reefyesyesincomplete host assemblyinherits kernelno
journal per statementyesyesyesinherits kernelno
coarse exec journal rownonoyesinherits kernelno
effect planningyesyesyestool/resourceno
approval workflowlocal policy pathlocal policy pathstored plan + applytoolsno
long-lived PTY refforeground job modellimitedyesresource/tool surfaceno
live event subscriptionlanguage channellanguage channelyesyesno
completionReedlinen/acontext-free endpointtool routeprotocol completion
diagnostics with spansterminalterminalstructured RPCstructured tool errordiagnostics

The most important parity gap is composition, not parsing: the CLI installs config, aliases, environment, init scripts, adapters, prompt state, journal/frecency, and Reef scopes independently; the kernel session constructor installs a smaller subset. A shared evaluator builder is therefore a prerequisite for claiming one language environment across human and agent surfaces.

flowchart TB
accTitle: Host-surface parity
accDescr: Shows the components and relationships described in Host-surface parity.
  Core["AST + syntax + evaluator"] --> Local["local host builder"]
  Core --> Kernel["kernel Session::new"]
  Local --> LC["config + init + adapters + Reef + prompt + journal"]
  Kernel --> KC["journal + event forwarding + session state"]
  MCP["MCP"] --> Kernel
  Gap["parity gap"] -.-> LC
  Gap -.-> KC

Crate-by-crate maturity ledger🔗

The “proof surface” column names the kind of executable evidence, not an immutable test count. Test counts should be generated by CI rather than copied into prose.

CrateResponsibilityStatusProof surfaceKnown boundary
shoal-astsource spans and syntax-independent ASTImplementedsyntax and formatter tests consume itserialized AST changes require wire version review
shoal-syntaxlexing, two-mode parsing, formatting, builtin identityImplementedunit/integration tests and corpus parsingParseCtx availability differs by host
shoal-valuevalues, rendering, methods, streams, capability portsImplementedmethod/value/stream tests and corpusdirect host filesystem calls remain beside Fs
shoal-evalscopes, calls, commands, builtins, effects, modules, ReefImplementedlargest corpus and integration surfacechild creation and command resolution are duplicated
shoal-execcapture, process groups, cancellation, PTY, sandbox launchImplemented on Unixreal subprocess and PTY testsConPTY/Windows absent; pin check remains pre-exec
shoal-leasheffects, plans, policy, enforcement reporting/backendsImplemented, platform-limitedpolicy unit tests and backend integrationno network containment backend
shoal-journalentry lifecycle, CAS, undo, pins, GC, transcript payloadsImplementedschema, CAS, undo, GC testsschema v1 has no row-kind/parent relation
shoal-reefmanifests, constraints, providers, locks, views, runnersImplementedprovider/resolver/temp-tree testspermissive discovery can hide malformed scopes
shoal-adaptersdeclarative command schemas and structured parsersImplementedfixture and bundled-spec loading testscorrectness depends on third-party output versions
shoal-configtyped config discovery, merge, env overrides, validationImplementedloader/validation testsmultiple accepted fields have no consumer
shoal-promptpure prompt model, style, module renderingImplementedsnapshots and renderer benchmarkCLI producer omits or hardcodes model fields
shoal-secretredacted secret value and storage abstractionImplemented, narrowfocused value/store testsnot every execution path is capability-injected
shoal-pickerstructured interactive selectionImplemented locallyevaluator/terminal teststerminal-only and not an agent protocol
shoal-protoJSON-RPC shapes, refs, wire values, numeric errorsImplemented with driftserialization testsDateTime producer violates its RFC3339 comment
shoal-authtoken persistence and validationPartial lifecycletoken tests and kernel attach pathkernel snapshots store at startup; create/revoke require restart; profile/caps are metadata only
shoal-kernelsessions, RPC, refs, plans, tasks, PTYs, eventsImplemented with hardening debtunit, daemon, restart, and live MCP testsmemory-only live state, coarse/fine rows, pre-cap frame allocation
shoal-mcpMCP tools/resources over kernel socketImplementedunit and live-kernel testssubscription cancellation ownership is missing
shoal-lspeditor diagnostics, completion, symbolsPartialprotocol/unit testslexical index cannot model evaluator/module scope fully
shoal-historyjournal inspection CLIImplementedCLI behavior through journal APIby-ID lookup scans a broad query; state root differs
shoal-doctorinstallation and environment diagnosticsImplemented, platform-limitedfocused checksUnix socket check is explicitly unsupported elsewhere
shoallocal CLI, REPL, prompt producer, composition rootImplementedCLI/config/interactive testscomposition duplicates kernel setup
shoal-wasmisolated Wasmtime runtime limitsScaffoldedleaf testsno evaluator, value, effect, or host ABI integration

Language implementation matrix🔗

Syntax and dispatch🔗

ContractStatusEvidenceQualification
CMD/EXPR two-mode grammarImplementedparser plus corpuscontextual bindings matter at statement head
byte spansImplementedtokens, AST, errorsexternal protocols may convert to UTF-16 or drop them
comments, strings, interpolationImplementedparser/formatter/corpusformatter is the canonical re-emission path
pipelines and redirectionImplementedAST/evaluator/corpusvalues stay structured only on Shoal-aware edges
match and patternsImplementedevaluator/corpuspattern expansion belongs to eval, not parser
functions and closuresPartialcall/corpus testsscalar annotations and return annotations are not uniformly enforced
modules and exportsImplementedmodule integration testsmodule cache and child context need coordinated invalidation/inheritance
interpreter blocksImplementedparser and adapter fixturesparser names and adapter class are two authorities
formatter round tripImplementedsyntax testssemantic comments/trivia behavior remains part of the contract

The canonical behavioral inventory is the language conformance contract. At this audit the corpus contains 1,310 cases across 77 suites. The observed harness result was 1,306 passed, 0 failed, 4 skipped; skips are host-dependent and are not counted as proof of the skipped behavior. Never copy the older 1,218/74 figure from the retired roadmap back into current docs.

Values and methods🔗

Value familyConstruction/evaluationmethods/renderwireImportant caveat
null/bool/int/floatyesyesinlinebool dispatch accepts .str/.display, metadata omits them
string/bytesyesyesbounded/elidedtext and bytes must not be conflated at OS boundaries
pathyesyeslossless path formnon-UTF-8 preservation must survive every new conversion
list/record/table/rangeyesyesrecursive with budgetsequence metadata advertises .get for receivers dispatch rejects
duration/datetime/sizeyesyestyped variantskernel DateTime currently emits Unix seconds as a string
outcome/erroryesyesrefs/elisionoptional outcome spans are preserved; reconstructed/builtin values can have no anchor
stream/channelyesyeslabel/ref onlyno wire pull protocol for stream items
task/plan/secretyesyesscoped refs/redactionrestart cannot reconstruct live identity-bearing values

Method metadata and executable dispatch are currently drifted in two exact ways:

  • SEQ_METHODS advertises .get for table and range receivers while runtime dispatch accepts only list-plus-integer and record-plus-string;
  • bool runtime dispatch supports .str and .display, while bool metadata omits them.

Completion/docs generation must not treat metadata as proven executable truth until a bidirectional fixture asserts that every advertised receiver/method pair dispatches and every dispatched pair is advertised. See value method dispatch.

Namespaces and commands🔗

The builtin identity registry is centralized in the syntax crate and consumed by evaluation, completion, highlighting, and LSP. That portion of the old R4 roadmap is implemented. The actual resolution sequence for functions, aliases, adapters, Reef tools, interpreter runners, and ambient PATH remains distributed across evaluator modules. It is working behavior, but its precedence is harder to audit and easier to diverge than one typed resolver result.

Structured namespaces for JSON, YAML, TOML, CSV, math, HTTP, OS, and config are reachable. External HTTP effects are represented, but Leash has no OS network-enforcement backend; an effect can be planned/denied without a claim that allowed traffic is network-confined.

Execution and concurrency matrix🔗

PathStatusCancellationBackpressure/boundsAuthority notes
captured external commandImplementedprocess-group escalationstdout/stderr drained concurrently; capture limits applyspawn gate and sandbox path are reachable
interactive foreground PTYImplemented on Unixprocess group / terminal controlterminal streaming, host-ownedlocal shell path differs from captured execution
kernel long-lived PTYImplementedclose/drop terminatesread is polling over vt100 screenscoped to session ID; no change subscription
evaluator background taskImplementedtoken and job controloutput representation is bounded by normal capturesuspend/resume available for owned process
kernel async taskPartialcancel existsresult stored behind refsuspend/resume explicitly unavailable
list/table stream sourceImplementedconsumer lifecyclefinitesingle-consumption semantics
watch/tail/everyImplementedsink-to-source propagationbounded/coalescing source queuesfilesystem watch still touches host APIs directly
language channelImplementedstream consumer lifecyclereplay/live modeluser.* bridge prevents spoofing kernel channels
kernel EventBusImplemented with scale limitsunsubscribe/disconnect closes queue1,024 replay ring; 256-event subscriber queues with coalesced gap summariesone dedicated writer thread per subscription
language EventBusPartialstream drop prunes sender1,024 replay ring; live mpsc subscriber queues are unboundedclones/sends while holding the channel-map mutex
stream to command stdinAspirationalreturns type_error: not implemented
stream over wireScaffolded labelno pull cancellationno cursor/item budgetWireValue::Stream is descriptive only
WASM invocationScaffoldedfuel only in leafmemory/table/instance limitsno evaluator caller or wall deadline

The most severe execution-context defect is not a missing convenience feature: child evaluators created by spawn, parallel, on, and .shl paths do not consistently inherit the parent Leash, Reef state, and config capability. A restricted parent can therefore construct a less-restricted child. Treat this as a security correctness issue, not ordinary composition cleanup.

Security and authority status🔗

Authentication and session identity🔗

ControlStatusReality
kernel socket permissionsImplementedbound socket is set to mode 0600 on Unix
persisted bearer tokensPartial lifecycleTokenStore::validate gates attach, but the kernel never reloads external create/revoke writes
token profile/cap stringsInformationalreturned in attach metadata; no Leash/handler authorization consumes them
named-session ownershipUnsafe partialthe principal is used when a session name is first created; later principals can receive the same session
task/PTY ref scopingImplemented within session modelhandlers compare session identity; inherited session ownership weakness still matters
live state after restartintentionally absentsessions, plans, approvals, tasks, PTYs, refs, and subscriptions are memory-only

Session identity must be fixed before treating names as tenant boundaries. Either key sessions by authenticated owner plus name or persist an explicit ACL and reject unauthorized attach. A journal principal column does not repair access control after a shared evaluator has already been returned.

Token administration also needs an honest serving-state contract. shoal-token atomically rewrites disk state, while the kernel retains the TokenStore it opened at startup. A newly created token is unusable and a newly revoked token can remain usable until kernel restart; only expiry is checked against current time on each validation. profile/--cap values are echoed, not enforced.

Effects, policy, and enforcement🔗

LayerStatusHonest interpretation
effect derivationImplemented for modeled operationsopaque/raw paths remain explicitly opaque
plan hashing/storagePartialapply checks stored source/session/principal, but the ref hashes effects/reversibility/estimates only and equal-shape plans overwrite one map entry
capability approval callerUnsafe partialcap.request is routed without attachment and mutates approved without authenticating an approver
journal query callerUnsafe partialjournal.query is routed without attachment and returns the shared journal without a caller-scope check
allow/ask/deny policyImplementedverdict is not itself OS containment
filesystem sandboxImplemented on supported Linux/macOS pathsenforcement tier reports actual backend result
process hash gateImplemented preflightcontent is checked before exec; TOCTOU remains
network sandboxNot implementednetwork grants are planning/policy only
malformed local policy handlingRisky partialconvenience loader can fall back to permissive
child authority inheritanceUnsafe partialseveral child evaluator constructors omit parent Leash/capabilities
secret renderingImplementedgeneric render is redacted; review every new serialization/stdin path
cap-request honestyImplementedresponse uses the same enforcement truth as attach

No documentation should collapse these layers into the sentence “Leash sandboxes commands.” State the effect coverage, policy verdict, backend dimensions, and unsupported dimensions separately.

Protocol and agent surface status🔗

Kernel router🔗

The router exposes session, parse/complete, exec, value, task, PTY, plan, capability, journal, event, blob, and explain method families. Attachment and parameter requirements are documented in the kernel protocol. The route is real and extensively tested, but the following contract defects remain:

  • cap.request does not require an attachment or authenticate an approving principal before setting a stored plan’s approved bit;
  • journal.query does not require an attachment and does not restrict results to a caller principal;
  • a plan ref is the first 16 hex characters of a hash over effects, reversibility, and estimates—not source/session/principal—so equal-shape plans overwrite one HashMap slot;
  • the 16 MiB frame limit is applied after read_line has already accumulated a newline-free frame;
  • value.get with format = "raw" can return full raw_base64 without the ordinary 64 KiB clamp;
  • MCP does not special-case that raw payload, so the bypass crosses the facade;
  • DateTime wire values are documented as RFC3339 but produced as Unix-second decimal strings;
  • outcome spans now travel when OutcomeVal carries one, including through elision, and are omitted honestly when the producer has no source anchor;
  • task.suspend and task.resume return TASK_CONTROL_UNAVAILABLE;
  • kernel live events use bounded 256-event subscriber queues and coalesced gap summaries, but the separate in-language EventBus still uses unbounded subscriber channels;
  • journal and transcript cursors survive restart through durable indexes, while most other state does not.

The raw-fetch path is not automatically wrong—agents sometimes need exact bytes—but it needs its own explicit offset/length budget or blob/ref resource contract. “Raw” must not mean “unbounded.”

MCP facade🔗

Tools and resources map to real kernel methods and have live-kernel integration coverage. MCP does not embed the evaluator, which keeps one source of runtime truth. However, resource unsubscribe currently acknowledges without owning and terminating the dedicated subscription connection/thread. Repeated subscribe/unsubscribe therefore has a lifecycle leak until the facade stores cancellation handles.

Refs and elision🔗

Inline value encoding, recursive budgets, CAS blobs, and scoped dynamic refs are implemented. The wire must preserve these distinctions:

flowchart TB
accTitle: Refs and elision
accDescr: Shows the components and relationships described in Refs and elision.
  Value --> Small{"within recursive budget?"}
  Small -->|yes| Inline["typed inline WireValue"]
  Small -->|no| Ref["summary + scoped ref"]
  Bytes --> Blob["CAS blob + shoal://blob URI"]
  Dynamic["task / PTY / stream / plan"] --> Live["session-owned live ref"]
  Restart -. "invalidates" .-> Live
  Restart -. "does not invalidate" .-> Blob

Configuration status🔗

The typed loader, precedence rules, environment overrides, validation, aliases, environment, init, adapter paths, completion settings, history fields, prompt basics, and Reef user scope are real. The exact schema and consumers live in the configuration reference.

Accepted-but-inert fields are a contract problem:

Field familyParsed/validatedHost consumerStatus
prompt.* basic fieldsyespartialrich prompt separately rereads legacy/template inputs
history.*yeslocal hostimplemented
editor.*yesReedline hostimplemented
completion.*yeslocal hostimplemented
aliases, env, inityeslocal builderimplemented locally
adapters.*yeslocal builderimplemented locally
reef.*yeslocal builder/resolverimplemented locally
render.widthyesnone foundinert
kernel.*yesnone foundinert
journal.*yesnone foundinert
leash.policyyesnone foundinert

Core config selects one nearest ancestor project file, while rich prompt loading checks a different project path rule. Preserve compatibility for legacy prompt.template, but converge discovery and typed ownership rather than keeping two independent parsers.

Prompt, editor, and LSP status🔗

The prompt crate is correctly pure: a PromptContext snapshot enters and rendered lines/styles leave. This is a strong boundary. The local producer does not yet populate the entire model:

  • editing mode is hardcoded to Emacs;
  • multiline is hardcoded false;
  • output mode is hardcoded Human;
  • stash count is zero;
  • battery and custom module data are not gathered;
  • git status is gathered synchronously rather than from a deferred/event-driven cache.

Reedline completion, highlighting, history, menu/picker, and keybinding paths are implemented. They share builtin names but duplicate context heuristics. LSP diagnostics and completion work, while declaration/reference understanding is based on token-level indexing rather than the evaluator’s module, export, closure, and dynamic command-resolution semantics. The full audit is in prompt, editor, and LSP.

Reef and adapter status🔗

Reef🔗

Manifest parsing, ancestor discovery, semver constraints, provider queries, lock records, content hashing, view construction, runner selection, evaluator resolution, and which reporting are real. Important qualifications:

  • a manifest with an empty tools table can be dropped even when runner/hermetic-only options should arguably define a scope;
  • normal discovery skips malformed or unreadable manifests rather than surfacing a diagnostic;
  • evaluator scope caching is keyed too coarsely around cwd and lacks a robust ChainKey/mtime invalidation model;
  • an unknown tool constrained to latest does not imply exhaustive remote probing;
  • lock persistence errors can be swallowed;
  • version probes may execute before Leash policy evaluation;
  • view identity hashes names/paths rather than executable contents.

See the Reef resolution reference for the exact pipeline.

Adapters🔗

Adapters are data-driven command descriptions and output parsers, not magic wrappers around all versions of a tool. The current tree contains substantially more definitions and command tables than the older “42 adapters” roadmap count. Catalog size is best generated during the site build or release process; prose should describe coverage classes and validation rather than freeze a number.

Interpreter-class adapters are real. Their relationship with parser-recognized interpreter blocks still needs a single discoverable registry or a generated parity test.

Persistence status🔗

SQLite WAL, version stamping, unfinished rows, zstd-compressed blake3 CAS, output metadata, typed undo inverses, pins, garbage collection, query filters, and durable transcript payloads are implemented. The journal storage reference records the schema and lifecycle.

Four current limitations deserve release-note visibility:

  1. kernel execution writes a coarse whole-submission row while the embedded evaluator writes fine per-statement rows into the same schema, without a row-kind or parent-exec column;
  2. journaling call sites often swallow storage failures to preserve command execution, so durability is best effort unless the host surfaces a health event;
  3. evaluator spill adoption pins blobs without an automatic owner/release lifecycle;
  4. shoal-history and doctor derive a different default XDG root than evaluator/kernel state.

Crash persistence is intentionally asymmetric: an appended row with NULL completion columns survives; live task/PTY/ref/session objects do not.

Platform matrix🔗

ConcernLinuxmacOSWindowsPortability note
parser/evaluator/value semanticsprimarysupportedlargely portable leaf codeOS/path/process tests still required
captured subprocessesyesyesno supported contractprocess groups/signals are Unix-shaped
interactive PTYyesyesdeferredConPTY needs a distinct backend
Unix kernel socketyesyesunsupportednamed pipe or TCP/auth design required
filesystem sandboxLandlock/seccomp pathSeatbelt pathabsentenforcement dimensions differ
network sandboxabsentabsentabsentpolicy-only everywhere
symlink-safe undosupported pathcwd-under-symlink edge openunreviewedpath identity rules differ
filesystem watchsupported backendsupported backenduncommittedcancellation and overflow need platform tests
non-UTF-8 path contractUnix raw bytesUnix raw bytesdifferent wide-string modelcannot blindly copy Unix encoding
CIUbuntumacOSnoneWindows remains an explicit project, not a checkbox

“Runs on Rust” is not evidence for Windows support. The kernel transport, PTY, job control, signals, sandbox, executable resolution, path encoding, and undo safety rules all require coherent Windows design and integration tests.

Quality and test evidence🔗

Current evidence🔗

  • the conformance corpus is the normative language behavior suite;
  • crate unit tests cover leaf invariants and many error paths;
  • integration tests exercise interactive CLI, config wiring, process/PTY behavior, daemon restart, and a live MCP-to-kernel route;
  • CI runs formatting, Clippy, tests, and release builds on Ubuntu and macOS;
  • fuzz targets exist, but their CI build is non-blocking and coverage is shallow;
  • Criterion commands exist for parser, evaluator, prompt, and wire benchmarks.

The benchmark thresholds in historical BENCHMARKS.md are review budgets, not evidence that the current commit meets them on a standardized machine. The site’s tooling and quality page preserves exact commands and separates measured results from desired ceilings.

Known quality gaps🔗

  • workspace lint tables exist, but member manifests do not inherit them;
  • stronger lint candidates have live violations and must not be enabled as decorative policy;
  • two corpus harnesses duplicate fixture/schema behavior;
  • NO_COLOR=1 in the ambient environment makes ANSI-expecting highlighter tests fail; the same 13 tests pass when that variable is unset;
  • test presence is uneven across crates, with significant inline unit coverage that directory counts do not reveal;
  • protocol bounds, slow-consumer behavior, principal isolation, and child-capability inheritance need dedicated adversarial tests.

Historical-document reconciliation🔗

These root documents were valuable design inputs. Their durable material has been absorbed into the internal atlas; their counts and status language are not current authority.

Historical documentDurable intentCurrent canonical homeClaim that needed correction
docs/VISION.mdtyped values, explicit effects, shared agent/human semanticssystem map, value/effect pagesone kernel/three surfaces is a direction; local REPL does not execute through kernel
docs/ROADMAP.mdwave rationale and original acceptance criteriathis page and roadmap“done” waves concealed host/security/lifecycle qualifications; counts were stale
docs/TDD.mdgrammar, semantics, errors, edge rulingslanguage conformance contractold corpus count and some later feature statuses drifted
docs/STREAMS.mdone stream model, explicit consumption/backpressurestreams and channelsstream-to-stdin and wire pulling are still absent
docs/IO.mdtyped stdin, interpreter blocks, runner UXprocess execution, calls/modules, Reefbare path auto-run remains .shl-only
docs/REEF.mdreproducible scope/lock/provider/view modelReef resolutionfail-soft discovery/cache/probe details need stronger caveats
docs/CONFIG.mdtyped layered configurationconfiguration referenceseveral documented keys parse but do nothing
docs/AGENT-SURFACE.mdrefs, elision, events, tools, PTYskernel protocol and agent/MCPraw fetch bypass, unsubscribe lifetime, and restart limits needed correction
docs/CONTRACTS.mdpublic APIs and dependency directionintercrate protocol contractssome pinned prose lagged current types and wire behavior
docs/BENCHMARKS.mdperformance budgets and commandstooling and qualitytargets were not continuously measured assertions

Historical wave disposition🔗

Old waveHonest current disposition
R0 interactive ergonomicsImplemented on the local shell; host-specific exit/render behavior remains deliberately owned there.
R1 streams/channelsCore language path implemented; stream stdin, wire pulling, and some live backpressure remain open.
R2 namespaces/builtinsImplemented; security meaning of network effects remains policy-only.
R3 modules/tasks/plan/undoMostly implemented; kernel task control and cross-child authority inheritance are incomplete.
R4 ports/modularizationStructural split and several ports implemented; direct host calls and resolution duplication remain.
R5 corpus/docs/polishCorpus target exceeded; this Zola atlas replaces duplicated wiki/root status prose; polish is continuous.

Release claim checklist🔗

Before calling a subsystem “done,” answer all of these with links to executable evidence:

  1. Which composition roots can reach it?
  2. Which configuration or capability state reaches those roots?
  3. Which values, errors, and spans survive local, kernel, and MCP boundaries?
  4. Which queues, frames, collections, and outputs have hard bounds?
  5. What happens on cancellation, disconnect, crash, and restart?
  6. Which principal owns each session, ref, plan, blob, task, and PTY?
  7. Which effect is derived and which OS backend enforces it?
  8. What is advisory, unavailable, or platform-specific?
  9. Which focused invariant test and which live-boundary test prove it?
  10. Which diagrams, public docs, protocol fixtures, and migration notes changed?

Highest-impact open findings🔗

This is a status list, not the work order; ordering and exit criteria live in the roadmap.

  1. cap.request can approve a stored plan without an authenticated attachment, and journal.query exposes shared journal rows without caller scoping;
  2. token create/revoke changes are invisible to a running kernel and token cap/profile fields are descriptive rather than enforced;
  3. child evaluators can lose the parent’s Leash and related capabilities;
  4. named kernel sessions are not durably owned by the authenticated principal;
  5. local and kernel evaluator composition roots diverge materially;
  6. raw value fetch and newline-free frame accumulation bypass intended wire bounds;
  7. MCP does not own facade-side subscription lifetimes, and the separate language EventBus remains unbounded even though the kernel EventBus is bounded;
  8. plan refs collide across equal effect shapes and journal coarse/fine rows lack an explicit relationship;
  9. accepted configuration fields overstate host behavior;
  10. Reef discovery, caching, probe authority, and lock persistence favor silent continuation;
  11. stream stdin/wire transport and kernel task control are incomplete;
  12. WASM remains a leaf scaffold, and Windows remains a separate architecture project.

Audit maintenance protocol🔗

Update this ledger in the same change that changes reachability or removes a qualification. Do not replace an explicit caveat with “fixed” unless the new proof includes the lowest invariant and the real composition boundary. If a feature becomes intentionally unsupported, documenting and testing the error is better than preserving an unreachable status claim.

Type to search every guide navigate open esc close
Diagram