Exhibit nine · the same yardstick, before and after
The move.
Published 2026-08-14 · measured 2026-08-12 (laptop era) and 2026-08-13 (VPS era) · exhibit nine The bench Workshop notes
Since this workshop opened its doors around May of 2026, the apps it serves to the public have run from a gaming laptop on a home network. On August 13th, 2026, they moved to a real server — and because this hub’s whole premise is that claims carry receipts, we measured the move three ways: the same frozen serving bench that examined the laptop era on August 12th ran again against the new era on August 13th, byte-identical asks under a sha-pinned instrument; the app’s own debug ledger — which has been quietly recording every answer’s timing splits since July 9th — provides five weeks of as-served receipts on one side of the cut and a growing pile on the other; and the story of the hardware itself, told honestly, because the machine that just retired from serving is the same one this hub’s first voice experiments were fought on. The short version: the retrieval leg of a live question is about three times faster on the app’s own ledger, a cold visitor’s cited answer went from 13.8 seconds to under seven on the re-run bench (two cold asks per era), and nothing about the local-first posture changed — generation still happens on our own GPU, one tunnel away.
The machine it was
The retiring server is a gaming laptop with a mobile RTX 4070 — 8 GB of video memory on the box, and closer to 6 GB usable once the operating system and display took their cut. That gap is not a footnote; it is the plot of this hub’s earliest chapter. The voice trials’ era-one table — nine models auditioned on “the 8G VRAM rig” — was fought on this machine, in the era when a “7 GB” model fit the card on paper and spilled into system RAM in practice, and every spillover paid its rent in tokens per second. That rig was never meant to be a server. It became one the way these things happen: Postgres was already running on it, it was already on the network, it was already the dev box — and one day it was also the production box, serving three apps: RuleSage and amble answering the public, and RealKeep serving playtests of our game world, for humans and agents alike. It did that job all summer, on a home connection, next to a water bottle.
What moved, and what deliberately did not
The move put the database, the search index, and the reranker on a server-class VPS — real cores, local NVMe under the retrieval path, a datacenter connection. What did not move is the part we consider the point: generation stays on our own GPU box, which the VPS reaches over a private tunnel. A visitor’s question now travels: server-local retrieval and rerank, one hop to our hardware for the model’s answer, and back. No third-party AI service enters the chain in either era — the move changed where the wires run, not whose machines think.
The flip itself took about ninety seconds of public downtime (operator-recorded; the cutover log stamps the outage start at 14:47:07 UTC and the era cut at 14:48 UTC), behind a maintenance page, after a rehearsed window with automatic fallback. Three honest operational notes ride with it, because this page would be poorer without them: the first scheduled window aborted at its own preflight when the laptop was mid-reboot — the fail-safe design did exactly its job and nobody noticed anything; the second attempt stopped four seconds in, again at preflight, on a file-permission check that could never have passed — a latent bug in a rehearsed script, fixed on the spot and recorded here because rehearsals only prove the paths they walk; and our post-flip smoke test initially reported failure against a page that was actually healthy, because the new build streams its answers and the test read the first frame of a page still composing. The instrument below was never fooled — it always measured to the finished ruling — but our quick check was, and we record that because a receipt that only records the clean parts is an advertisement.
Instrument one · the bench, re-run
The chair trials’ serving-probes leg — the drip of ten asks at ten-second cadence, the game-night burst, the concurrent pair, the cold visitor — ran against the laptop era on August 12th and was published with that exhibit. On August 13th the identical instrument ran against the new era: the same sha-pinned golden asks, the same cadences, the same public hostname, the same client machine, the frozen runner executed in place and unmodified. Every probe is a moment from the apps’ actual life, not a load-testing textbook: the steady back-and-forth of someone reading rules mid-game, the burst when a whole table asks at once on game night, two questions arriving together, a first-time visitor hitting a cold app. The bench asks what real tables ask. One registration note, disclosed rather than buried: the window moved from a matched quiet evening to a quiet weekday afternoon before any scored call, under the house’s new scheduling law — our users arrive in the evenings and on weekends, so an afternoon bench is both a quieter measurement and kinder to them.
the drip (10 asks, 10 s cadence)laptop median wall s18.68 sVPS median wall s6.81 slaptop ÷ VPS ratio2.74×completionall asks served
- laptop median wall s
- 18.68 s n=10 asks · min 16.314 s · max 23.85 s
- VPS median wall s
- 6.81 s n=10 asks · min 5.447 s · max 11.828 s
- laptop ÷ VPS ratio
- 2.74×
- completion
- all asks served
drip warm-up baselinelaptop median wall s18.12 sVPS median wall s7.96 slaptop ÷ VPS ratio2.28×completionall asks served
- laptop median wall s
- 18.12 s n=3 asks · min 18.092 s · max 18.207 s
- VPS median wall s
- 7.96 s n=3 asks · min 5.533 s · max 11.745 s
- laptop ÷ VPS ratio
- 2.28×
- completion
- all asks served
the game-night burstlaptop median wall s21.95 sVPS median wall s11.63 slaptop ÷ VPS ratio1.89×completionall asks served
- laptop median wall s
- 21.95 s n=5 asks · min 9.598 s · max 34.433 s
- VPS median wall s
- 11.63 s n=5 asks · min 6.761 s · max 18.967 s
- laptop ÷ VPS ratio
- 1.89×
- completion
- all asks served
the concurrent pairlaptop median wall s13.32 sVPS median wall s8.61 slaptop ÷ VPS ratio1.55×completionall asks served
- laptop median wall s
- 13.32 s n=6 asks · min 6.295 s · max 20.492 s
- VPS median wall s
- 8.61 s n=6 asks · min 6.763 s · max 12.844 s
- laptop ÷ VPS ratio
- 1.55×
- completion
- all asks served
the cold visitorlaptop median wall s13.8 sVPS median wall s6.82 slaptop ÷ VPS ratio2.02×completionall asks served
- laptop median wall s
- 13.8 s n=2 asks · min 12.23 s · max 15.367 s
- VPS median wall s
- 6.82 s n=2 asks · min 5.579 s · max 8.053 s
- laptop ÷ VPS ratio
- 2.02×
- completion
- all asks served
Reading this record set. Each record is one probe of the serving bench; wall seconds run from the instant the ask left the client to the finished cited ruling in hand, in both eras. Open a record for each era’s ask count and min–max (laptop era = the 2026-08-12 run; VPS era = the 2026-08-13 run; the drip warm-up baseline is the instrument’s own three warm-up asks, published as its own probe). Registered tie language: median differences under 15% read TIED — no probe here is within it. Every ask completed in both eras; completion is the binding result, the ratios are honest description. Full per-ask records: data/c6-vps-rerun.json and the chair trials’ published serving kit (CC BY 4.0).
Every one of the twenty-six asks completed with a cited ruling in both eras — completion is what binds, and it held twice. The medians tell the move’s story: the drip — a visitor asking questions at a human pace — went from an 18.7-second median wall to 6.8 seconds, a 2.7× ratio; the cold visitor from 13.8 to 6.8 seconds; the burst from 22.0 to 11.6. Under the registered tie language, differences under 15% read TIED — nothing here is close to a tie. And the worst case matters as much as the middle: the slowest single drip ask of the laptop era took 23.9 seconds; the new era’s slowest took 11.8.
Instrument two · the receipts
Every answer the app serves prints its own timing strip — search, queue wait, generation, total, in milliseconds — and has recorded that strip to a debug ledger since July 9th, because a house rule here says every derived number keeps its provenance. Nobody planned for those receipts to measure a migration. They do anyway: 2,878 rulings landed on the laptop side of the cut, and the new era’s pile grows daily. These are as-served numbers — different questions, different days, different loads — so they ride beside the controlled re-run, never inside it.
laptop erarulings recorded2878search ms — median242.0 mstotal ms — median8332.5 ms
- rulings recorded
- 2878
- search ms — median
- 242.0 ms p10 203.0 ms · p90 371.3 ms · n=2766 rulings · 112 null rows excluded
- queue wait ms — median
- 0.0 ms p10 0.0 ms · p90 137673.0 ms · n=2863 rulings · 15 null rows excluded
- generation ms — median
- 7447.0 ms p10 3090.9 ms · p90 13796.2 ms · n=2878 rulings
- total ms — median
- 8332.5 ms p10 3373.7 ms · p90 139825.8 ms · n=2878 rulings
- recorded over
- 2026-07-09 through 2026-08-13 14:48 UTC
VPS erarulings recorded50search ms — median77.5 mstotal ms — median5085.0 ms
- rulings recorded
- 50
- search ms — median
- 77.5 ms p10 66.1 ms · p90 99.8 ms · n=50 rulings
- queue wait ms — median
- 0.0 ms p10 0.0 ms · p90 5825.8 ms · n=50 rulings
- generation ms — median
- 4901.5 ms p10 2631.4 ms · p90 8283.9 ms · n=50 rulings
- total ms — median
- 5085.0 ms p10 2796.2 ms · p90 11194.3 ms · n=50 rulings
- recorded over
- since 2026-08-13 14:48 UTC
Reading this record set. One record per era, from the app’s own debug ledger, extracted read-only. All figures are milliseconds; medians with p10–p90 beside them in each fold (laptop era = through 2026-08-13 14:48 UTC; VPS era = after; percentiles by the type-6 Weibull rule, the statistics library’s quantiles default); null rows are excluded from that column’s statistics and counted where they occur. These are as-served receipts — different questions, days, and loads per era — description beside the controlled bench, never inside it. Both extracts, sha’d: data/receipts-era-stats.json (CC BY 4.0).
The retrieval leg is the cleanest comparison, because it is the leg the move actually touched and the one no model change can confound: a median search of 242 ms across five weeks of laptop-era answers, against 77.5 ms in the new era — and the laptop era’s 90th percentile sat at 371 ms, where the new era’s sits at 99.8 ms. A reader can check this against any live answer: the strip prints at the bottom of every ruling, e.g. “search 66 ms · ask 1356 ms · total 1424 ms” — search is the time to find and rank the rulebook pages, ask is the model composing the cited answer, total is the whole trip — a grounded, cited answer in under a second and a half, end to end, receipt attached.
One column earns a sentence of its own: queue wait. In both eras the median wait is zero — most questions walk straight in — but the tails tell the single-box story. The laptop era’s 90th-percentile queue wait was 137,673 ms, about 2.3 minutes; the new era’s is 5,826 ms, under six seconds. When a machine that was also the dev box and the database got busy, questions stacked up behind it minutes deep. The new era’s worst waits are seconds.
What it cost
A modest VPS the workshop already rented for other duties, one afternoon of attended cutover, and zero new AI infrastructure — the GPU box was already there, and the tunnel was already how the walking-tour guide reached it. The expensive-sounding part of this story — “we migrated our production stack and benchmarked it before and after” — was an afternoon, because the bench already existed, frozen, from the week’s earlier work. Reproducible instruments are cheap the second time. That is most of the argument for building them.
And the reason to care about seconds at all is not the benchmark — it is the table. RuleSage exists so a rules argument dies in one cited answer and the game goes on; amble exists so a stranger in a new city gets a walking tour without an account or an app store. Shaving a cold visitor’s answer from fourteen seconds to under seven is the difference between a tool the table waits on and a tool the table forgets is there. That is what we think this technology is for: quietly informing the people in the room, making the good parts easier, and getting out of the way.
Limits, stated plainly
The two bench runs sit one day apart on different serving stacks measured under different co-resident load; the ratios are honest medians of completed asks, not a controlled isolation of any single cause. The receipts are as-served and uncontrolled, and the new era’s pile is young — fifty rulings against two thousand eight hundred seventy-eight at authoring time, with the count stated because it will grow. The application build changed between eras (the new one streams its answer pages); the bench instrument is indifferent to that by construction, measuring to the finished ruling in both eras, and the search-arm receipts are jar-independent, but total-time comparisons between eras inherit it and say so. And the laptop’s numbers were recorded while it also ran a full model-trials week — its own exhibit discloses that cohabitation in both directions.
Provenance
- Registered before running — the re-run’s pre-registration, pinned in a sha index before any scored call, with its one window amendment disclosed and dated
- The frozen instrument — the chair trials’ own serving-probe runner, executed in place and unmodified, its sha printed in the registration
- The golden asks — byte-identical to the published set, sha equality asserted before the run
- The receipts — extracted read-only from the production ledger, twice: the registered extract, sha-pinned in the registration index before the run, and the authoring-time extract that the statistics above read
- Machine-readable — the era comparison, the per-era receipt statistics, and the run’s full per-ask records, under data/ (CC BY 4.0; published 2026-08-14)
- Authorship — benched, drafted, and audited by the workshop’s own agents under a human operator’s rulings, then revised with that operator — often across many rounds; nothing releases until they have read it and signed off. The same division of labor this whole hub practices — told in full here
- Limits — stated above, plainly
- Raw rows on request — drop a line.
Licence: CC BY 4.0 — the whole page, not only the kit. The prose, the tables, the folds and the data are yours to quote, re-plot, translate and argue with, including commercially. What we ask back is the one thing the licence already requires: name the source and link to it — strata→signal research, research.strata2signal.com — so a reader of your version can reach ours and check it against the files. Something like — strata→signal research, “The move”, research.strata2signal.com/the-move/, CC BY 4.0. And if you quote a figure, name the era it was measured in: every figure here carries one, the two eras are different machines, and an arrow on this page reads before → after rather than better → worse.