Demo 2 — effective context (recall at scale)
What it measures: does pxpipe stay sharp in a context big enough to overload
the plain column? This is the capability story, not cost — and it's the one that
matters, because the cost A/B (../cost-ab/) came out
~break-even.
The idea: a context too large for the plain column to track reliably (a "dumb
zone"). pxpipe images the bulky filler (compressing it) but keeps the small
needle as text — so it reads the needle perfectly while carrying a much
smaller active context. The plain column carries everything as text and may lose
the needle in the noise. setup.sh floods ≈200k tokens of inert logs around a
needle.txt with a deterministic integer answer.
Run it — 3 scripts, 3 terminals
# Terminal 1 — set up: generates the context, builds, starts BOTH proxies, seeds
# two read-only copies, and PRINTS the ground-truth answer.
bash demo/effective-context/setup.sh # Fable only (Opus off); 'setup.sh opus' to enable Opus
# Terminal 2 — LEFT = normal (interactive Claude — may drown and answer wrong)
bash demo/effective-context/a.sh # defaults to Fable; `a.sh opus` to use Opus
# Terminal 3 — RIGHT = pxpipe (interactive Claude — should answer correctly)
bash demo/effective-context/b.sh # use the SAME model as a.sh
a.sh / b.sh launch a real interactive Claude session with the needle prompt
already submitted — you watch the CLI read the files. They run from isolated /tmp
copies inside a subshell, so your terminal stays in the repo afterward. claude is
usually a shell alias; the scripts resolve the real binary, or set
CLAUDE_BIN=/path/to/claude. To redo, re-run setup.sh.
Model: everything defaults to Fable 5 — Opus is off by default, matching
production. To run on another model, pass it to all three: setup.sh opus
(adds Opus to the :47824 proxy's compress scope), then a.sh opus / b.sh opus
(also sonnet, haiku, or a full claude-… id), same model on both columns.
setup.sh is what enables compression for that model; you can also toggle it live
on the dashboard "compress models" chips.
See the result — compare the two integers
setup.sh prints the ground-truth answer. Each column replies with one integer:
| column | expectation |
|---|---|
RIGHT — pxpipe (b.sh) |
matches the ground truth (needle stays text) |
LEFT — plain (a.sh) |
may be wrong at this size (drowns in filler) |
pxpipe correct + plain wrong = the effective-context win. Each proxy also serves
a live dashboard (:47824 pxpipe, :47823
plain) showing the context/token reduction — the same number /context reports.
Read it honestly
- The premise is UNVALIDATED. "Plain drowns at this size and answers wrong" is an assumption — modern Claude has strong long-context retrieval, so plain may also get it right. If it does, this demo shows no pxpipe advantage. Run it and report both integers; don't assume the outcome.
- The needle stays text on purpose. pxpipe is lossy on imaged content (it misreads exact strings), so this demo only works because the needle is small enough to stay text. It does not show pxpipe recalling imaged exact values.
What IS already validated (from the cost A/B)
In the Rust-rewrite run, both columns ported the whole pricing library to Rust and
both passed all 5 tests with the exact expected integers (2468 / 8316 / 216 / 9975 / 45181) preserved — pxpipe through imaged spec + source. So "compression
doesn't corrupt precision work" is supported. This demo tests the complementary
claim: "compression keeps you sharp where raw context overloads."
The other demo
This is the capability demo. The cost demo ("does pxpipe cost less on a real
task?", ~break-even) is in ../cost-ab/.