rote

Every harness has memory.
None of them manages it.

the memory manager for browser agents

Browser agents treat the context window as a garbage dump — append, and hope. Rote treats it as a managed resource: a budget, an eviction policy, a layout contract, and a trust gate on the way back in.

37.2%
slower token growth
75/75
verified successes
99.6%
smaller observations

An ordinary agent

re-reads everything, every step

pages re-read so far0

The same task with Rote

keeps notes, reads only what changed

pages read so far0
Same task, same result — step 0 of 9.45 page-reads vs 9. That gap grows with every step — measured at 37.2% below.

docs/01 · the problem

The window nobody manages

The naive loop re-sends its whole history every step — 1 + 2 + … + n prompt-units, O(n²) in task length. The field's fix is to evict old observations, and the major harnesses now do. But every one of them still re-renders the current page in full, every step. No major harness sends the diff.

fixture B2 · input tokens per call · frozen pages

step 1
637
step 2
677
step 3
716
step 4
759
step 5
800
step 6
839
step 7
876
step 8
917
step 9
953

+38% per-call growth over ten steps — and 21% of the run's input bill is re-reading text it already sent, on a page that distills to ten nodes.

The context window is RAM. Observations are pages, dropping them is eviction, diffing is delta encoding, the prompt cache is L2, compaction is GC. Every one of those has a manager in an OS. None of them has one in a browser agent.

Rote's tier-0 policy is one sentence: keep what you did, not what you saw. The action ledger survives — ~37 tokens per step. Stale observations leave the window, and the current page arrives as a diff against the last grounded bootstrap.

The name is the thesis: rote — doing something from memory, by repetition, without re-deriving it. Memoization applied to agent trajectories, invalidated by assertion rather than TTL.

docs/02 · the memory spine

Three amnesias, three tiers

Browser agents forget at three timescales and pay again at every one. Each tier is a memory Rote manages — and every tier is assertion-gated on the way back in, because memory that might be wrong is worse than no memory.

TIER 0P1 · now

Working memory

scope
within one run
what it forgets
what it already sent this run
the bill
cost is O(n²) in task length

The field evicts old pages, then re-renders the current one in full. Rote sends the diff — built and measured.

TIER 1designed

Episodic memory

scope
across runs of a task
what it forgets
the procedure that worked yesterday
the bill
run #50 costs what run #1 cost

The field ships unverified replay. Rote adds the trust gate. (P2)

TIER 2designed

Semantic memory

scope
across tasks on a site
what it forgets
how the site behaves at all
the bill
every task re-learns the portal

Nobody. Site memory is designed, not built. (P2)

trust gateNot a fourth tier — the precondition for all three. Reuse without verification is a machine for repeating a mistake at volume.

docs/05 · tier 0

Four levers on the curve

The field ships eviction alone; Rote manages the whole window. Three of the four levers are live; the honest ledger says so about the fourth.

A11Built

Observation eviction

kills the dominant quadratic term

Prior observations leave the window; the action ledger stays. Growth drops from ~172 to ~37 tokens per step.

A4Built · measured

Diff observations

~90% off the constant

After a grounded bootstrap, each step sends a diff. In G1: 849 diffs, median 24 chars, median render-size reduction 99.6%.

B3Built · qualified on OpenAI

Cache-layout discipline

discounted billing on the surviving prefix

Nothing above the stable line may ever mutate. The immutable prefix routes through prompt_cache_key — a 20.5% cost cut at WP-N25.

B4Not built

History compaction

turns the curve from quadratic to linear

Summarize the far tail of the action ledger under budget. The one tier-0 lever still on the bench — deliberately deferred to P2.

T10 · exit gate G1 · PASS

The curve, measured

Cumulative logical input — uncached input + cache reads + cache writes, so provider caching cannot masquerade as memory reduction. gpt-4.1-mini, 15 matched repetitions per cell, 75/75 verified successes per harness, 95% seeded-bootstrap CIs.

37.2% slower growth [95% CI 35.6–38.8] vs a 30% launch floor

Cumulative logical input per task, by task length

Browser Use 0.13.6 Rote
030K60K90K120K913172125verified steps per task (WP-N09 → WP-N25)Browser UseRote

the honest ledger

In this frozen matrix Rote was not cheaper: 5.4% more expensive at WP-N25 with 6.4% higher p50 latency, because Browser Use received more discounted cache reads. That gap is what the run below was made to close — and on the shortest cell, WP-N09, Rote still loses on billed cost. A long-task win, not a universal one. Every claim carries its receipt in the run reports.

16.0% cheaper than Browser Use at WP-N25

T11 · mean billed cost per task, before → after cache-key routing

Rote, before cache key Rote, after Browser Use
$0.010$0.015$0.020$0.025$0.030WP-N09$0.0168WP-N13$0.0121WP-N17$0.0201WP-N21$0.0236WP-N25$0.0246

the sacred invariant suite

Five invariants, encoded in tests

Non-negotiable, never “just this once.” Every one is enforced by the sacred invariant suite that touches every executor exit path.

InvariantThe ruleEnforced by
INever silently wrongNo code path may report success when a verify or expect check failed — success is decided by page state, never by the absence of an exception.The sacred invariant suite touches every executor exit path.
IINever worse than baselineFallback to the plain agent is always reachable and clean; a Rote miss costs one cheap match call.Fallback paths log why they fired — classification, not just that.
IIINever cross environmentsA playbook learned on staging can never fire on prod.The structural fingerprint is a hard gate before any fuzzy matching.
IVEverything versionedStore mutations are append-only — no in-place edits of playbooks or patches, ever.Auditable, diffable, exportable as human-readable YAML.
VEvery model call taggedAll usage flows through one client wrapper with a source tag — planner, matcher, slot, repair, verify, distill.Direct SDK calls outside the wrapper fail lint.

docs/05 · roadmap

From a managed window to a substrate

No number, no launch — and the next number is G2's.

One phase at a time.

Each behind a gate with a number on it.

Full roadmap →
P0done

Foundations

Recorder, verified replay, the sacred invariant suite.

shipped

P1← we are here

Working memory

“The first browser agent with a managed context window.”

2026 Q3

G1 · the curve✓ 37.2%
G2 · the levelpending
P2planned

The harness that learns

“Your 50th task on a site costs a fraction of your 1st.”

2026 Q4

P3planned

Speculation

“Warm flows bounded by think-time only.”

2027 Q1

P4planned

Fleet & enterprise

“10K tasks a day, audited, lowest $ per task.”

2027 Q2–Q3

P5planned

Platform

“The efficiency substrate other agents build on.”

2027 Q4+

The wedge is the cost curve. The precondition is auditable determinism.

The compounding asset is the accumulated, verified memory itself.