prism0x2A · scan excerpt · frozen, not a live run
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.
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
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
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
Across the repository · 659 files
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
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();
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.
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
Green · does it still add up
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.
| Capability | Verified | Withheld | Why |
|---|---|---|---|
| peloton.admin.operator-console | 58 | 1 | a claim the code cannot back |
| peloton.trainer.control-and-drivetrain | 24 | 1 | evidence sits in code marked parked |
| The other 49 capabilities: nothing withheld. | |||
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
The admin console works offline.
counter-evidence check · looked for a service worker or a PWA manifest
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;
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
It is not a confidence percentage. It is the gate between a statement and your report.
| Verdict | Count | In the report | Means |
|---|---|---|---|
| verified | 876 | yes | Survived all four checks. |
| inferred | 63 | yes, marked | Held, but one check could not run without a model. |
| unknown | 1 | no | Evidence exists, but sits in code marked parked. |
| rejected | 1 | no | The evidence did not support the statement. |
| contradicted | 0 | no | The code says the opposite. |
Where it stops
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.
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.