Run git status. Expect: fatal: not a git repository (or any of the parent directories): — byte-identical, no partial
.git.git anywhere above this directory.
krtv
Derived from: no git commit — ~/Projects/krtv is not a git repository (git status →
Flows
check each step and final checkGround truth: krtv is a stub, not a codebase
Proves the packet's own honesty caveats and the Observify board's backlog card are both accurate — before trusting anything else in this packet, confirm there is nothing else here.
Persona / precondition: anyone about to act on this project for the first time (Wolf, or the next Codex executor), terminal open at ~/Projects/krtv, nothing unzipped yet.
Run ls -la ~/Projects/krtv. Expect: the only product artifact at top level isfiles.zip; everything else present (AGENTS.md, CLAUDE.md, _handoff/, .claude/,think-like-fable/) is kit scaffolding, not krtv code — no src/, apps/, package.json,
or node_modules anywhere.
Run find ~/Projects/krtv -maxdepth 1 -iname "readme*". Expect: no output — no README
exists at the project root.
Final check: curl -s "http://127.0.0.1:8787/api/kanban?project=krtv" — krtv's only card in
the backlog column reads no root README found, and every other column (in_progress,running, in_development, testing, done, deployed) is empty for this project. The board
and the disk agree: nothing has been built.
Zip manifest integrity
Proves the design packet is intact and matches its own described contents before anyone builds on it.
Persona / precondition: same as F1; files.zip still unopened.
Run stat -f "%z bytes" ~/Projects/krtv/files.zip. Expect: 20830 bytes.
Run unzip -l ~/Projects/krtv/files.zip. Expect: exactly 5 entries —PACKET.md (17755 bytes), WIREFRAMES.html (17126 bytes), NOTES.md (2635 bytes),krtv-prod-ready-plan.md (10874 bytes), plan-queue.md (369 bytes) — totaling 48759.
Unzip to a scratch directory — never overwrite files.zip itself:unzip ~/Projects/krtv/files.zip -d /tmp/krtv-check. Expect: all 5 files extract without a
CRC/error, and none is 0 bytes.
Final check: head -c 40 /tmp/krtv-check/PACKET.md shows the packet actually opens and
reads as text (# KRTV Studios — Design Packet…), not a corrupted binary.
Hi-fi wireframes render, self-contained, all 10 screens
Proves the one visual deliverable actually opens cold, with no hidden network dependency, and covers the screen count the packet claims.
Persona / precondition: F2's extracted /tmp/krtv-check/WIREFRAMES.html, opened directly in a browser via file:// (no dev server).
Open WIREFRAMES.html. Expect: browser tab title KRTV Studios — Hi-Fi Wireframes and
page heading KRTV STUDIOS — WIREFRAMES.
Scroll the full page. Expect: exactly 10 frames, headed in order: 1a · Landing — doors,
closed1b · 2 · Rates (doors open), 3 · Boarding Times, 4 · Checkout,5 · Confirmation — MetroCard, 6 · Contact, 7 · Location, 8 · Sign in / Register,9 · My Bookings, 10 · Admin — Schedule board — matching the 10-screen inventory inPACKET.md §2.2.
Open devtools → Network tab, then reload. Expect: zero outbound requests — the file is
fully self-contained (verified by source inspection: no http://, https://, or externalsrc=/href= anywhere in the HTML).
Click the doorbay graphic on the Landing frame. Expect: it toggles open/closed — this is
the one scripted interaction in the file (doorbay click listener toggling doors-open).
On the Rates frame, click the WITHOUT ENGINEER tab. Expect: nothing happens — the tab
has no click handler. This is the correct behavior for a hi-fi mockup, not a bug: only the
doors are wired up; the WITH/WITHOUT toggle is presentation only until real code exists.
Final check: inspect the CSS variable --font-ticker — it resolves to "Courier New",, with an inline comment
ui-monospace, monospace/* stand-in for SubwayTicker.ttf */ — matchingNOTES.md's own caveat that the display font is a placeholder, not the production asset.
Price-digit badge colors match the stated MTA mapping
Proves the one piece of the design language that's actually executable today — the price-badge color-coding — matches what §2.1 says it should be, digit for digit.
Persona / precondition: F3's open WIREFRAMES.html, Rates frame in view.
Read PACKET.md §2.1's digit-color mapping. Expect: 1→purple, 2/3→brown, 5→blue,.
6→green, 0→yellow/orange, $→green, FOR→red
On the Rates frame's three rows, read the badge classes in the HTML source (view-source:).
Expect: row 1 ($150 · 3 HOURS) is b-green b-purple b-blue b-yellow; row 2
($200 · 5 HOURS) is b-green b-brown b-yellow b-orange; row 3 ($350 · 10 HOURS) isb-green b-brown b-blue b-orange — every digit's color matches §2.1's mapping exactly.
Check the FOR badge's CSS rule (.for{background:var(--line-red)...}). Expect:var(--line-red) — confirming FOR→red is implemented, not just claimed.
Final check: the three WITH-ENGINEER prices rendered ($150, $200, $350) matchPACKET.md's own stated legacy prices for 3/5/10-hour sessions with an engineer, word for word.
WITHOUT-ENGINEER pricing bug is honestly flagged, not silently ported
Proves the packet does not quietly ship a known pricing bug — it must surface the ambiguity loudly enough that Day 0 cannot skip past it.
Persona / precondition: PACKET.md and NOTES.md open side by side. ⚠ The legacy apps/client source this bug originates from is not present on this disk — confirmed via find ~/Projects/krtv -ipath "*apps/client*" (no output) — so this flow checks the packet's self-consistency, not the legacy code itself.
Read PACKET.md's "Honesty caveat block". Expect: it states the without-engineer prices
as $60/3h, $100/5h, $350/10h and explicitly flags note the legacy $350 appears in BOTH.
columns; likely a bug ⚠ — confirm the without-engineer 10-h price
Read NOTES.md's open-question #3. Expect: the same ambiguity is restated as a named,
numbered blocker: Without-engineer 10-hour price — legacy shows $350 in BOTH columns,.
almost certainly a copy-paste bug. What's the real price? (blocks rate seed, Gate 3)
Check WIREFRAMES.html's Rates frame for the WITHOUT-ENGINEER row values. Expect: they
are not rendered — only the WITH-ENGINEER tab is populated (its tab has class tab on;WITHOUT ENGINEER has no row markup at all in the source) — so the ambiguous price was never
drawn into a screen where someone could mistake it for a resolved value.
Final check: attempt to independently verify the real without-engineer 10-hour price against
the legacy source. This cannot be verified — the legacy apps/client codebase is not on this
disk (per _handoff/krtv.md); the correct price remains genuinely unknown until Day 0 asks the
human.
G4 token-lock guard: the shipped CI gate does not cover every named token (defect)
Proves the concrete CI command the roadmap tells Codex to wire on Day 1 actually enforces the invariant PACKET.md defines for it — G4 exists specifically to stop hardcoded color duplicates.
Persona / precondition: the Day-1 executor about to wire the G4 token-lock CI gate, reading PACKET.md §2.1/§1.6 and krtv-prod-ready-plan.md's Day 1 → AI3 side by side.
Read PACKET.md §2.1's full token list. Expect: 12 named hex values — amber #fdd894;
flicker chain #ffec9e, #ffbb70, #ff992b; 8 MTA line colors #EE352E, #00933C,#6CBE45, #0039A6, #FF6319, #FCCC0A, #B933AD, #996633; gray #A7A9AC; door gray#808183; MetroCard gold #EFBB01.
Read krtv-prod-ready-plan.md Day 1 → AI3 and extract its literal G4 grep pattern. Expect
(quoted verbatim): -E '#fdd894|#EE352E|#0039A6|#FF6319|#FCCC0A|#B933AD|#996633|#6CBE45|#00933C'
— 9 of the 12 tokens named in step 1.
Run that exact pattern against the 3 tokens it omits:printf '#A7A9AC #808183 #EFBB01\n' | grep -E '#fdd894|#EE352E|#0039A6|#FF6319|#FCCC0A|#B933AD|#996633|#6CBE45|#00933C'.
Per G4's own stated invariant in PACKET.md §1.6 (any occurrence of #fdd894, MTA line hexes,), the correct
or font-family: *Subway outside tokens.css/tailwind.config fails CI
behavior is that this command matches and exits 0, flagging the hardcoded duplicates.
Currently fails: it prints nothing and exits 1 — gray, door-gray, and MetroCard-gold
duplicates would silently pass CI. DEFECT — record as fail.
Final check: confirm this isn't a misreading — grep -n "A7A9AC\|808183\|EFBB01" PACKET.md
returns the same §2.1 token line for all three, proving they are genuinely declared tokens the
guard is supposed to protect, just missing from its own reference implementation.
"G" labels collide across the two planning documents (defect)
Proves the guard IDs a reader relies on (G1…G5) mean one specific thing in PACKET.md and a completely different thing in krtv-prod-ready-plan.md's own summary — a real ambiguity risk for whoever executes gate-by-gate.
Persona / precondition: both documents open; searching for every G<n> mention in each.
Run grep -oE '\bG[0-9]+\b' PACKET.md | sort -u. Expect: G1 through G5 only, each
defined once in the §1.6 table as a domain/CI invariant (G1 no-double-booking,G2 no-unpaid-confirmations, G3 price-integrity, G4 token-lock, G5 contract-drift).
Run grep -n "Gates index" -A2 krtv-prod-ready-plan.md. Expect: a second, independentG0–G10 scheme, one per roadmap Day, where the label text for G4 readsG4 payments guards — not token-lock.
Compare PACKET.md's G1 no-double-booking against the roadmap's Gates index label forG1. Expect them to mean the same thing; they do not. The roadmap's G1 readsG1 CI+token guard proven — i.e. the roadmap's "G1" is actually testing PACKET.md's G4.
Two documents in the same packet use the identical short label G1 (and G4) for two
unrelated concepts. DEFECT — record as fail; a gate-by-gate executor citing "G1" or "G4"
without naming which document could confirm the wrong invariant.
Final check: PACKET.md's own "Gated build steps" summary (bottom of the file) has exactly8 numbered steps
(sed -n '/^# Gated build steps/,/^# Honesty caveat block/p' PACKET.md | grep -cE '^[0-9]+\.'
→ 8), while krtv-prod-ready-plan.md has 11 Day headers (Day 0–Day 10,grep -c '^### Day' krtv-prod-ready-plan.md → 11). Step 8 of the packet's summary
("Hardening: reduced-motion, Lighthouse≥90, throttling, backups, deploy") silently folds
three of the roadmap's distinct gated days — Day 8 (testing/observability), Day 9
(deploy/ops, including the restore drill), Day 10 (docs/launch) — into one bullet with no
restore-drill or docs deliverable named. Confirming decisions off the packet's 8-step summary
alone is not the same as confirming the full 11-day roadmap.
Kickoff-prompt paths point at directories that don't exist here (defect)
Proves the exact prompts this packet tells a future executor to paste actually resolve to real paths on this machine — a re-planning session that pastes either verbatim will look in the wrong place.
Persona / precondition: a fresh window about to re-open this project, following the packet's own pointers rather than this file.
Read plan-queue.md's re-planning kickoff prompt. Expect (quoted verbatim): Load Run
/mnt/user-data/outputs/krtv/PACKET.md, NOTES.md, WIREFRAMES.html, and
krtv-prod-ready-plan.md.ls /mnt/user-data/outputs/krtv/PACKET.md on this Mac.
Currently: ls: /mnt/user-data/outputs/krtv/PACKET.md: No such file or directory — the
prompt bakes in a Claude.ai sandbox output path that has never existed on this machine.
DEFECT — record as fail.
Read krtv-prod-ready-plan.md's own header line. Expect (quoted verbatim): companion
files named as krtv/PACKET.md, krtv/WIREFRAMES.html, krtv/NOTES.md — implying a nestedkrtv/ subdirectory. Run ls ~/Projects/krtv/krtv/PACKET.md (the path its own header
literally implies, relative to a project root). Currently:ls: /Users/wolf/Projects/krtv/krtv/PACKET.md: No such file or directory — the roadmap
assumes its own companions sit one directory deeper than where they will actually land once
unzipped. DEFECT — record as fail.
Final check: the one path that actually works is the flat one —ls ~/Projects/krtv/PACKET.md (after unzip) succeeds and lists the file. Neither cross-reference
inside the packet states this correct path; a future executor must know to ignore both and use
the flat layout.
NOTES.md counts are self-consistent, and Day 0 genuinely hasn't happened
Proves the packet's own tallies are accurate and that no one has quietly fast-forwarded past the decision-lock gate this whole roadmap depends on.
Persona / precondition: NOTES.md open; PACKET.md's "Decisions block" in view.
Count NOTES.md's "Named deferred list". Expect: exactly 10 numbered items (the
handoff and PACKET.md both describe it as a "10-item deferred list").
Count NOTES.md's "Open questions" list. Expect: exactly 12 numbered items (matching
every reference elsewhere in the packet to "the 12 open questions").
Search PACKET.md for any resolved-decision changelog (the roadmap's GATE 0 requiresuser confirmations pasted verbatim into PACKET.md changelog). Expect: no such changelog
section exists yet — decisions D1–D6 in the "Decisions block" still carry their △/⚑/⚠
flags, none replaced with a resolved value.
Final check: cross-check against the Observify board — krtv has zero cards in in_progress,testing, done, or deployed. The board, the disk, and the packet's own unresolved flags all
agree on the same fact: Day 0 (decision lock) has not been run.
Not covered and why
- Any part of the actual application (rates/booking/payment/admin API, the Prisma schema, the
Stripe integration, the 10 real screens, guards G1–G3/G5 as running code): none of it exists —
Days 1–10 of the roadmap are entirely ahead. This document tests the plan, not a product,
because there is no product yet.
- The WITHOUT-ENGINEER 10-hour price (F5): cannot be resolved without either the missing
legacy apps/client source or a human answer to NOTES.md open question #3.
- The other 11 open questions in
NOTES.md: deliberately left unresolved — answering them is
Day 0's job, not a test plan's. Re-run this document's spirit (a claims audit) after Day 0 lands
to confirm the changelog was actually written back into PACKET.md.
- Mobile responsiveness, Lighthouse ≥90,
prefers-reduced-motion(§1.7, §2.4): described in
prose only; WIREFRAMES.html is a fixed hi-fi mockup, not a responsive build — nothing to
resize-test yet.
- Legacy-app comparison (design-language fidelity, the specific bugs
PACKET.mdsays not to
repeat): apps/client is not present on this disk; only the packet's own description of it was
checkable.
Results
| Flow | Verdict | Failures → tickets |
|---|---|---|
| F1 ground truth | ||
| F2 zip manifest | ||
| F3 wireframes render | ||
| F4 price-badge colors | ||
| F5 pricing-bug honesty | ||
| F6 G4 token-lock gate | ||
| F7 G-label collision | ||
| F8 kickoff-prompt paths | ||
| F9 counts + Day-0 status |