prism0x2A · scan excerpt

prism0x2A · scan excerpt · frozen, not a live run

Three lenses, one file, every line cited.

A real excerpt from a real scan — not a mock-up and not the whole report. BLUE reads the shape, AMBER reads what the code does, GREEN reads whether it still adds up. Each answer names the file and the line it came from, and the sentences that could not be backed are shown struck out rather than quietly dropped.

Repository · pixel-peloton (our own)
Scanned · 13 Aug 2026 · tier skeleton
Files read · 659
Statements · 941 across 51 capabilities

Why our own repository.The critical view runs on code we own, so nothing here is a verdict on anyone else’s work — and the one contradiction prism found is about a page we shipped.

Blue · the shape of it

What is this file, and what leans on it?

BLUE never opens the prose. It reads the import graph and the syntax tree, and every figure keeps the file it was counted from.

lib/supabase/useEntitlement.ts · category: hook · 149 LOC

19depend on it
7it depends on
22complexity
11.2heat
0duplication
Ask BLUEWhat could break here?

Nineteen modules resolve through this hook at runtime and it resolves seven itself, so a change to what it returns is felt in nineteen places, not one. It is a hook, not a component — nothing renders from it, which is why the blast radius is import-shaped rather than visual. Its complexity of 22 is mid-range for this repository; the heat of 11.2 comes from that dependency count, not from size.

from import graph · 659 files · lib/supabase/useEntitlement.ts

Every figure in this answer is in the panel above and can be recounted from the graph.

Across the repository · 659 files

21nothing imports
3 719lines in those
57clone groups
862repeated lines
0import cycles
The 21 files nothing imports
components/TrackPicker.tsx894 LOC
lib/storyMechanics.ts575 LOC
scripts/storyRework.ts488 LOC
lib/critLapBench.ts334 LOC
lib/outrunGenerator.ts234 LOC
lib/terrainSeat.ts196 LOC
…and 15 more998 LOC

None of these is a grade. prism says nothing imports those twenty-one files. It does not say they are waste — a module loaded by name at runtime, a plugin entry, a script a manifest calls, all look exactly like an orphan from the import graph, and prism cannot tell which is which. You can. So it hands over the list and stops. Likewise a repeated block may be the right amount of repetition, and zero cycles is a measurement, not an achievement.

Amber · what it does

The same file, read for behaviour

AMBER makes one narrow statement at a time and attaches the lines it read. Here is one from that file, opened all the way up.

Reads from pp_entitlements through select.

lib/supabase/useEntitlement.ts · line 61 · capability peloton.cloud.sign-in-and-access

  58   if (!user) { setEntitlement(FREE); setCreatedAtMs(null); setTrialEndsAt(null); … }
  59   setCreatedAtMs(user.created_at ? new Date(user.created_at).getTime() : null);
  60   const { data } = await supabase
  61 >     .from("pp_entitlements")  62     .select("status, premium_until, tier, trial_ends_at, strava_enabled, …")
  63     .eq("user_id", user.id)
  64     .maybeSingle();
1 · staticpassed
2 · semanticskipped
3 · contradictionnone
4 · counter-evidencenone
verified→ printed in the report

Check 1 does the work. It does not ask whether the sentence sounds right — it re-opens the file and requires the quoted text at the cited line, character for character. A citation that drifted by one line fails it. Check 2 says skipped because this excerpt ran with no language model; that is why anything needing judgement caps at inferredhere, and why nothing on this page rests on a model’s confidence.

Ask AMBERWhat does this file do?

It reads the rider’s entitlement row: from pp_entitlements, through a select lib/supabase/useEntitlement.ts:61–62, where the selected columns are status, premium_until, tier, trial_ends_at, strava_enabled and the three premium-minutes fields.

That is the only statement in front of me that cites the file you asked about. The capability it belongs to also reads pp_admins through a select (lib/supabase/useIsAdmin.ts:25) — but I have been shown 2 of its 12 statements, so I cannot tell you what else this file does. Nothing in front of me says it writes.

2 statements· useEntitlement.ts:61–62 · useIsAdmin.ts:25 — both re-checked against their lines

A real answer, from the context the product builds — capability metadata plus the verified statements and their lines. Written without an API key, the way the Claude Code path works; every citation above was then put back through runStaticProofCheck, the check the verifier itself runs. 2 of 2 hold.

Green · does it still add up

Where the account does not close

GREEN reads across the layers rather than down a file: which capabilities carry statements that did not survive, and what that says about the gap between claim and code.

CapabilityVerifiedWithheldWhy
peloton.admin.operator-console581a claim the code cannot back
peloton.trainer.control-and-drivetrain241evidence sits in code marked parked
The other 49 capabilities: nothing withheld.
Ask GREENWhich capabilities have drift?

Two of fifty-one, and they drift in two different directions. The operator console holds 58 statements that verified and one that did not — a page describes itself as working offline and the two artefacts that would make that true are absent. The other is the opposite problem: the evidence exists but sits under a comment marking the area as parked, so prism withholds rather than guesses whether the marker or the code is stale.

from 941 statements · 51 capabilities · 2 with anything withheld

A gap here is not a defect report. It is the difference between what the repository says about itself and what its code can show — which is the one thing a reader cannot check by reading either alone.

The admin console works offline.

counter-evidence check · looked for a service worker or a PWA manifest

rejected→ withheldneither artefact exists in this repository

A numeric constant of 20 is defined in the context of “MIN_TRUSTED_CADENCE_RPM”.

lib/gearing.ts · lines 111–117

 103  *  On a real trainer it does not (virtual-shift-as-resistance is parked), so the
 104  *  panel read 142 rpm while the rider's own cranks turned at 72.
     114 > export const MIN_TRUSTED_CADENCE_RPM = 20;
unknown→ withheldthe surrounding comment marks this area as parked

One of the two is a false alarm we know about. The comment says a different thing is parked and the statement beside it got caught in the net. We would rather withhold one true sentence than print one false one — but the number is one, not zero, and it belongs here rather than in a footnote.

The ladder · printed or not

The verdict decides whether the sentence exists

It is not a confidence percentage. It is the gate between a statement and your report.

VerdictCountIn the reportMeans
verified876yesSurvived all four checks.
inferred63yes, markedHeld, but one check could not run without a model.
unknown1noEvidence exists, but sits in code marked parked.
rejected1noThe evidence did not support the statement.
contradicted0noThe code says the opposite.

Where it stops

What this scan cannot tell you

  • No model ran in the scan. The semantic check is skipped throughout, which caps anything needing judgement at inferred. The one model-written passage on this page is the Ask answer above, and it is marked as such — nothing it says was allowed past the same check.
  • One known false alarm in the parked-code filter, shown above rather than quietly dropped.
  • TypeScript and JavaScript are complete; other languages are partial. A repository prism cannot read properly is refused, not half-measured.
  • This is an excerpt, frozen at the date above — not a live run, and not the whole report.
$ npx prism0x2a

Runs on your machine, against your files. Nothing is uploaded in order to score it — which is also why we can only show you our repository here, not yours.

Interactive

Ask your own question.

The same three lenses, but you pick the repository and the question, and forge turns the answer into something shippable. Five questions and three generations per address — a magic link, no password.

Open the sandbox →