Skip to main content

Laconic

Carry less context. Keep every byte.

Laconic sits at your agent's tool boundary and replaces bulky tool results with a structural outline plus the lines that were actually asked for — while keeping the exact original bytes on disk, addressable, until you say otherwise.

PyPI Python CI License

Product showcase · Frozen self-use evidence · Methodology and limitations

Source release: v0.13.0 (Beta). Ordinary-use evidence collection continues; generic MCP runtime support remains on HOLD under its frozen evidence gate.

uv tool install laconic
laconic setup

Done. No provider configuration, no proxy, no API key, no account.

See it work

Your agent reads a 745-line file and wants the Record class. Here is what actually lands in its context — real output from Laconic's own codec on its own ledger module:

[laconic 01a0f3c2-.../F1 | full: laconic_expand({"reference":"01a0f3c2-.../F1"})]
src/laconic/ledger.py  745 lines
  outline: UnknownHandleError:150-159  __str__:153-159  InvalidSpanError:162-163
    _select_lines:166-179  ObservationKind:182-189  Record:193-212
    raw_chars:207-208  encoded_chars:211-212  [+30 more]
  span 193-212:
    class Record:
        """One observation, stored whole, surfaced partially."""

        handle: str
        kind: ObservationKind
        subject: str
        content_sha: str
        raw: str
        encoded: str
        created_at: float
        turn: int
        resident: bool

        @property
        def raw_chars(self) -> int:
            return len(self.raw)

29,186 characters in, 810 out — 97% fewer characters at the tool boundary. The agent still sees the shape of the whole file, gets the exact lines it asked for verbatim, and can pull any other part back by itself, mid-task, without asking you. The handle is right there on the first line.

With no requested span, the complete recovery-bearing envelope is 313 characters and contains only the structural outline.

How it works

Laconic is closer to a claim ticket than a trash compactor. The model carries a short handle and the useful part of a result; the complete original stays in a private local ledger.

flowchart TB
    RESULT["Successful text tool result"] --> ADAPTER["Host adapter"]
    ADAPTER --> RUNTIME["Canonical Python runtime"]
    RUNTIME --> CODEC["Tool-shaped encoder"]
    CODEC --> LEDGER[("Private session ledger")]
    LEDGER --> CHECK{"Exact recovery succeeds and the full envelope is smaller"}
    CHECK -->|"yes"| ENVELOPE["Model sees the envelope and handle"]
    CHECK -->|"no"| ORIGINAL["Model sees the original result"]
    ENVELOPE --> EXPAND["Agent expands exact full text or a line span"]
  1. The host adapter intercepts an eligible successful text result. Tool errors, mixed content, unsupported tools and malformed responses remain unchanged.
  2. The shared runtime selects a file, command or search encoder. File results retain structure and requested lines; command and search results retain boundaries and salient errors.
  3. The encoder commits the exact raw result to the session ledger before returning a candidate.
  4. The runtime immediately expands the reference and compares the complete envelope with the original. Recovery mismatch or no size win means pass-through.
  5. The model receives either the smaller envelope or the untouched original. Any omitted content remains available through the handle.

OMP and Claude Code use different host adapters but share this decision path. Compression policy, reference minting, recovery and storage are not reimplemented per host.

What you get

Nothing is ever lost

The raw result commits to a local ledger before a replacement is allowed to exist. Every reference expands exactly — byte for byte, including code points a strict encoder would reject.

laconic expand '<session>/X1'          # the whole thing, exactly
laconic expand '<session>/X1:40-90'    # just those lines

This is why reducing a file read is safe here at all. Headroom's default coding profile, for instance, deliberately protects reads from compression — its own source explains that an agent needs exact bytes to patch a file. Laconic stores those exact bytes first and then reduces what the model carries, which is a different answer to the same constraint rather than a claim to be the only one. docs/headroom-comparison.md sets out where each fits.

Structure, not truncation

File reads come back as a tree-sitter outline plus the span that was requested, so the agent sees the file's shape rather than a guillotined prefix.

Command and search output take the other route — head and tail are kept, the middle is elided, and lines that look like errors are lifted out of the elided region and preserved, because a traceback buried in the middle of ten thousand lines of build log is the last thing you want silently dropped.

It only fires when it wins

A replacement is emitted only when the complete envelope — handle, header and all — is strictly smaller than the original. In qualification it passed 90 of 162 eligible observations straight through untouched. Small results stay small. Nothing is compressed to look busy.

It fails open, in every direction

Engine missing, spawn failure, crash, malformed response, deadline breach, storage error — you get your original tool result. There is a 250 ms steady-state deadline and a three-consecutive-failure circuit breaker. A crash costs compression, never correctness.

Fast enough to forget about

p50 2.16 ms. p95 19.87 ms.

Entirely yours

No telemetry. No hosted service. No beacon. Raw observations never leave your machine, and exactly one command in the whole tool touches the network — laconic pricing update — only when you type it.

Reports are content-free by construction and re-checked by an independent privacy gate before anything is written: a new field that cannot be certified fails loudly rather than shipping.

You stay in control

laconic status                 # decisions, counts, storage, recovery ledger
/laconic pause                 # mid-session, from inside your agent
/laconic resume
laconic uninstall omp          # restore native behaviour; keeps your ledgers
laconic purge --older-than 30d # deleting data is a separate, deliberate act

Works with your agent

laconic setup

setup detects what you actually have, installs what each host supports, and then tells you whether the codec has recorded a real decision — because installing a file is not proof anything ran.

Host Codec Diagnostics Covers
OMP yes yes Native extension over read, bash, grep, glob
Claude Code yes yes Transforming PostToolUse hook over Bash and Read
Codex — — No adapter ships, and Laconic tells you so

Both adapters are thin. They drive the same Python engine, so the strictly-smaller rule, the ledger, reference minting and exact recovery are shared — not reimplemented per host.

laconic setup --verify-only    # did it actually run?

Know what your context costs

laconic savings

The command reads your local session billing metadata and reports:

  • spend composition across uncached input, cache reads, cache writes and output;
  • codec decisions joined to the sessions that carry priced turns;
  • the modelled total for those same sessions; and
  • a modelled avoided-cost band when the underlying pricing coverage is sufficient.

The result changes as your local session history grows, so this README does not freeze a sample dollar amount. laconic savings writes the complete assumptions and current figures to .laconic/spend/ as canonical JSON, Markdown, and self-contained HTML.

Offline evidence dashboard

laconic savings writes the same validated evidence as canonical JSON, Markdown, and a self-contained HTML dashboard. The HTML contains inline CSS and SVG only: no script, font, CDN, network request, telemetry, or server.

Synthetic Laconic evidence ledger preview

The preview and linked dashboard are a synthetic fixture, not production evidence. They are generated from docs/demo/fixtures/evidence-ledger.json, carry the canonical JSON digest, and keep the modelled band adjacent to its modelled_not_measured basis and single-arm limitation. See docs/demo/README.md for regeneration and verification.

The avoided-cost result is deliberately a band and deliberately labelled. It is modelled from token counters, never billed by a provider, and every assumption remains attached to the report. When more than a quarter of the underlying cost comes from models with no published price, Laconic withholds the dollar figures and leads with the percentage instead. We would rather show you less than show you something we cannot stand behind.

Commands

Command What it does
laconic setup Detect hosts, install what each supports, verify the codec ran
laconic status Content-free health: decisions, storage, expansions, last cost band
laconic savings Spend composition plus the modelled avoided-cost band
laconic expand REF[:A-B] Recover an elided observation exactly, whole or by line span
laconic pricing show | update Inspect or refresh model list prices
laconic install | uninstall HOST Manage a single host adapter
laconic purge Delete recovery ledgers, explicitly
laconic research ... Offline measurement, replay, evaluation
laconic diagnostics observe ... Content-free local diagnostics

Documentation

Document What's in it
docs/omp-runtime.md OMP install, interception boundary, recovery, controls, uninstall, purge
docs/claude-code-codec.md The Claude Code hook, its shape-fidelity constraint, measured limits
docs/system-design.md Architecture: engine, ledger, codec, price registry, protocol boundaries
docs/grounding.md What Laconic is, what it deliberately is not, and its invariants
docs/headroom-comparison.md Version-pinned comparison with Headroom, including where Headroom fits better
docs/overview.md The measurement behind the design, and the positioning it forces
docs/research-disposition.md How Laconic got here: evidence, shipped tranches, and what stays unproven
docs/results/mcp-opportunity-disposition.json Binding aggregate-only HOLD disposition for generic MCP runtime support
docs/observe-cli.md laconic diagnostics observe: content-free local diagnostics
docs/runtime-beta-report.md The qualification campaign's generated report, committed verbatim

Upgrading from 0.8.0 or earlier? Offline research commands moved under an explicit namespace: laconic measure and laconic gates are now laconic research measure and laconic research gates.

What we don't claim

Laconic reduces characters at the tool boundary, and that is what it reports. It does not claim a general token, cost, cache, or behaviour saving, because the conversion from characters to tokens to money is lossy and workload-dependent and we do not have the paired evidence that would license it. Every session Laconic has recorded ran with the codec on, so there is no counterfactual to subtract.

What is measured is in docs/runtime-beta-report.md, generated and committed verbatim: ten sessions, three repositories, 162 eligible observations, all 26 required failure and lifecycle scenarios exercised, every safety counter at zero, and 51.77% character reduction on that workload.

Contributing

Read docs/grounding.md first. It defines the product boundary and the invariants every change must preserve.

Repository map

Boundary Responsibility Start here
CLI and setup Detect hosts, install adapters, expose status, expansion and purge src/laconic/cli.py, src/laconic/setup.py
Host adapters Normalize supported tool results and fail open to native host behavior src/laconic/runtime/omp/laconic.ts, src/laconic/runtime/claude_code.py
Runtime decision Enforce tool eligibility, exact recovery and the strictly-smaller rule src/laconic/runtime/engine.py, src/laconic/runtime/protocol.py
Observation codecs Dispatch by tool shape and build file, command or search presentations src/laconic/codec/observe.py, src/laconic/codec/encoders/
Recovery storage Store exact raw observations, mint handles and expand full or ranged references src/laconic/ledger.py, src/laconic/runtime/storage.py
Local reporting Join content-free runtime decisions with usage and offline model prices src/laconic/spend/, src/laconic/pricing/

Keep host adapters thin. A decision that changes what reaches the model belongs in the canonical Python runtime or codec, not in a second host-specific implementation.

The repository also contains qualification and research infrastructure under src/laconic/beta/, src/laconic/gates/, src/laconic/replay/ and src/laconic/study/. These packages measure or validate the product; they are not alternate runtime paths.

Prove behavior at the consumer boundary

Trace changes through the layer that consumes them. For example, extending error-line recognition starts in src/laconic/codec/encoders/_elision.py, requires positive and negative classifier cases, and finishes with a consumer-visible elide_middle test proving that a matching line survives from the omitted middle. A regex-only assertion does not prove the user-visible contract.

Run the local gate

uv sync --locked
bun install --frozen-lockfile
bun run typecheck
bun test
uv run ruff check .
uv run ruff format --check .
uv run mypy --strict src
uv run pytest -q
uv run laconic --help
uv run laconic --version

Development requires Python 3.12+, uv and Bun. CI also evaluates the committed recorded-response research fixtures; those checks make no live provider calls.

License

Apache License 2.0 — see LICENSE.

Metadata

Release files for laconic 0.13.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for laconic 0.13.0
File Size Uploaded
laconic-0.13.0.tar.gz 554.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for laconic 0.13.0
File Interpreter ABI Platform
laconic-0.13.0-py3-none-any.whl Python 3 none any Details

Total release size: 933.7 kB

Release files / laconic-0.13.0.tar.gz

Download URL laconic-0.13.0.tar.gz
Size 554.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a3cbb3fb1b889c915e4ebb1c4941642b779a06e2d3fc8aba99a72e9bac16f24f
BLAKE2b-256 checksum
How to use checksums
90335ee65b29304677e855e0b43aaf640e468996b27dd1923405cd1219e3331c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.6.14

Release files / laconic-0.13.0-py3-none-any.whl

Download URL laconic-0.13.0-py3-none-any.whl
Size 379.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6965212ed6a284a65132df844f6a32d2b55a42375008279b0dc428d7fa07a23f
BLAKE2b-256 checksum
How to use checksums
cea059867c55bf17b69adc4bddfc4ef481f200424fcd4247b51eef0ddb7cbeb2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.6.14

Release history Release notifications | RSS feed

0.14.0

2 release files

This release

0.13.0 This release

2 release files

0.12.0

2 release files

0.11.1

2 release files

0.11.0

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page