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.
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.
An ordinary agent
re-reads everything, every step
The same task with Rote
keeps notes, reads only what changed
docs/01 · the problem
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
+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
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.
The field evicts old pages, then re-renders the current one in full. Rote sends the diff — built and measured.
The field ships unverified replay. Rote adds the trust gate. (P2)
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
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.
kills the dominant quadratic term
Prior observations leave the window; the action ledger stays. Growth drops from ~172 to ~37 tokens per step.
~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%.
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.
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
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
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
the sacred invariant suite
Non-negotiable, never “just this once.” Every one is enforced by the sacred invariant suite that touches every executor exit path.
| № | Invariant | The rule | Enforced by |
|---|---|---|---|
| I | Never silently wrong | No 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. |
| II | Never worse than baseline | Fallback 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. |
| III | Never cross environments | A playbook learned on staging can never fire on prod. | The structural fingerprint is a hard gate before any fuzzy matching. |
| IV | Everything versioned | Store mutations are append-only — no in-place edits of playbooks or patches, ever. | Auditable, diffable, exportable as human-readable YAML. |
| V | Every model call tagged | All 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
No number, no launch — and the next number is G2's.
One phase at a time.
Recorder, verified replay, the sacred invariant suite.
shipped
“The first browser agent with a managed context window.”
2026 Q3
“Your 50th task on a site costs a fraction of your 1st.”
2026 Q4
“Warm flows bounded by think-time only.”
2027 Q1
“10K tasks a day, audited, lowest $ per task.”
2027 Q2–Q3
“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.