Proto — the workbench
LoomProto

Your repo as a table of features you can prove

Proto measures every feature over its own globs and plays one onto a terminal.

Absent data draws nothing. No 0 where nobody looked.

4,842 tests, 111 files, 13.49 s.

Scan this project

One digest. One model call.

PROTO_SCAN_MAX_FEATURES = 48

.loom/proto/index.json
or Open the workbench
Loom — session
The queue

One feature onto one of six terminals

A brief dropped into a pane that is mid-question becomes the answer to it. So play is a queue.

Measured on demand, never stored:
  • LOC
  • Files
  • Churn
  • Tests
  • Kill rate
  • Staleness
The unit

A row is a feature, not a file

A sloppy glob makes a dishonest row.

Column
Min px
What it draws
#
28
library position
Feature
180
name, then the module path
Tier
96
coremajorsupportexperimental
Tests
108
passfailmixedunknownnone
Churn
96
+added −removed, from numstat

Columns drop right-to-left by container width, never a media query.

Ink drawing of a parts tray with one empty compartment
The honesty rule

Absent data draws nothing

No 0 where nothing was measured. No spinner standing in for a value nobody had.

the slot stays,
the number does not

Call
Answer
ProtoStats.tokens
always null — usage is keyed by slot, never by path
ProtoStats.files
null (never walked) is not 0 (walked, matched nothing)
shaStaleness(null, head)
"unknown", never "fresh"
edgeLabel, nothing fell
null, never "0 left"
Ink drawing on orange: an empty dashed slot, a tipped-over measuring beaker pouring nothing, and a pencil
The pipeline

Run is not proven

Each node is a predicate over a real measurement.

pipelineModel()lib/pipeline.ts
the drop between Run and Proven is the point
The cheat guard

Green tests that catch nothing

An unbounded repair loop converges on deleting the assertion.

Mutation kill ratekilled ÷ measured, 10 mutants
Ink drawing of a hammer striking a test part on an anvil

18 operators, ordered by how actionable a survivor is.

The sandbox

Corrupt the source, keep the tree

Injected by a Vite load() hook. No file is opened for writing.

prepareSandbox — worktree + load overlaymeasured on a 4,019-file repo
Ink drawing of two identical workbenches, the throwaway copy inside a dashed boundary
1.17 sgit worktree add --detach
0.15 sgit apply, 142 files
0.716 s166 tests, vs 0.794 s without
byte-identicalboth copies, after a killed 180-mutant campaign
Dispatch

Four rules, each one a debugging session

A press that runs something, against one that runs nothing.

Ink drawing of six CRT monitors on a rack, one lit orange
Rule
Or else
lane: "pty"
the work goes to an invisible child
pickableSlots()
the brief lands in a pane mid-question
observeSlotComplete
an unpinned waiter eats every completion
read the taskId back
a guessed id never matches
What it cost

The scan that always failed

The budget was 45 s. Five runs took:

Scan wall clock2026-08-03
Ink drawing of a dial gauge with the needle past the middle

Tighten it again and you cut the answer, not the wait.

Honest gaps

What is built, and what is not

State
What that covers
Built and wired
index, scan, measurement, table, funnel, flow graph, queue, test engine, sandbox
Not wired
the browser lane's cartographer, imported by nothing
Permanently null
ProtoStats.tokens
Still moving
247 files: 192 tracked, 55 untracked, 23 modified
Ink drawing of a magnifying glass over a grid with one cell filled

Put something on the bench

Six Claude sessions, one operator.

4,808test cases declared
178,681lines in the module
247files
Ink drawing on orange: a finished part clamped in a bench vise, tools on a pegboard, bunting above