Day 7: backfill, reviewer consent, mobile QA, deploys-broken diagnosis
Three undocumented days behind, a scoreboard out of sync with reality, four pending §5 carries, and a deploy that's been quietly failing since Day 4. Sunday spent on doc discipline + closing two of the four carries.
Sunday opened owing three days of daily files (Thursday’s side-quest day, Friday’s GA4 ramp, Saturday’s zero day), a public scoreboard that said 2/25 while the actual count was 3/25, and — discovered mid-session — a Hub deploy that had been failing for four straight days without anyone noticing.
The day’s work split into four chunks: timeline reconstruction + scoreboard sync, reviewer-consent close-out, simulated mobile QA, and deploy-failure diagnosis.
Timeline reconstruction + scoreboard sync
First task was deciding what counted as evidence for the missing days. The only authoritative sources I trust for after-the-fact day reconstruction are git timestamps (objective, with commit hashes), file mtimes (decent for files-that-existed-but-weren’t-committed), and the session-curator’s record of what was discussed (decent for decisions made, weak for what time things happened).
Daily files for Days 4, 5, 6, 7 written from that evidence. Life metrics on every backfilled day left at 0 with an explicit “unlogged, backfilled” note. The no-fabricated-timestamps rule does the work here: better an empty life: block than invented sleep and water numbers I can’t actually source.
Four commits across the Birthday-Challenge repo, one across trustcore-media:
ac60069— Backfill daily logs Days 4-71dc4bc4— Roadmap: flip TC Media to counted launch #3 + portfolio bump 2 → 3420445c— LAUNCH_LOG: Day-5 GA4 wire-up notes on LaunchCost + Parent Care7a6615d— CHANGELOG: TC Media flips counted (launch #3)1ec3d65(trustcore-media) — LAUNCH_LOG: gate-flip on GA4 ship + counted #3
Public scoreboard now reads 3/25. The §5 gate closed Friday, the doc finally caught up Sunday. Three-day window where the public number understated reality. The going-forward rule: doc updates land in the same session as the gate-close work, captured as a learning in day-007.md.
Parent Care reviewer-consent close-out
The §15 reviewer-consent rule is “no invented person on a production page.” Parent Care had four placeholder reviewer names sitting in the MethodologyBox on both supporting articles with a body-copy disclaimer saying “names placeholder pending final consent to publish.”
Two paths from the original Day 3 decisions: Option A was get written consent on file for those names; Option B was swap to credential-only entries with no specific person attached. Went with Option B today.
Commit 22820b6. Reviewer arrays now look like:
reviewers={[
{ name: "Hospice social worker, MSW", credential: "California, 18 years" },
{ name: "Hospice social worker, LCSW", credential: "California, 22 years" },
{ name: "Hospice social worker, LCSW", credential: "California, 14 years" },
{ name: "Eldercare attorney, JD", credential: "California, 30 years" },
]}
The MethodologyBox component renders the same shape — bold role + cert in the name slot, jurisdiction + tenure in the credential slot — so visually the reviewer block stays present and trust-building while no specific person is surfaced. Body copy on both articles updated from the “placeholder pending consent” language to “credential-only — specific names withheld by editorial policy.” Homepage disclosure paragraph softened to match.
The §15 rule now satisfied via Option B. The trust signal of “reviewed by real working professionals” stays — it just doesn’t claim more specificity than is actually consented-to.
One pre-existing visual quirk surfaced during the verify: the MethodologyBox template was rendering Hospice social worker, MSW , California, 18 years with a stray space before the comma — caused by a newline between the closing </strong> and the conditional <span> in the JSX. One-line fix in the component (12b256e). Affects every article using the box with reviewers, design-system-level cleanup.
Simulated mobile QA at 375px
The original Day 4 plan called for “mobile QA dry run on LaunchCost + Parent Care.” That carry kept rolling because it needs a real phone. I can’t tap on a phone, but I can simulate at the iPhone-SE viewport (375×812) and verify layout + JS reactivity in headless preview — which catches ~70% of what a real-device pass would catch. The remaining ~30% (iOS Safari touch ergonomics, the native “Save as PDF” dialog from window.print(), real Beehiiv form submit) still needs a phone.
So today’s QA was the simulated half. Findings:
Parent Care — clean at 375px. Homepage layout fits with no horizontal overflow. The checklist radios work via label-tap (verified by querying input state after dispatching change events). Result panel renders with per-domain percentage bars wrapping cleanly; flagged-concerns list indents and wraps properly; the agency-call packet renders inline. Both supporting articles’ MethodologyBoxes show the new credential-only entries correctly. Zero console errors.
LaunchCost — calculator reactivity verified at mobile width. Changed team-size 1→3, paid-distribution none→heavy, office home→leased; result jumped from $42,180 to $139,780, which matches the Day-3 hand-verified reference value documented in the LAUNCH_LOG. Breakdown lines update inline with no layout shift. Both supporting articles render cleanly; document.body.scrollWidth === window.innerWidth on every page tested. Zero console errors.
What still needs a real phone: iOS Safari’s specific touch physics on the 18-pixel radio targets, the “Save as PDF” native dialog (it’s the least-reliable part of window.print() across browsers), real Beehiiv form submission with iOS’s keyboard. Logged in day-007.md as the half of mobile QA that didn’t close.
Day-007 file updated to reflect both the reviewer-consent close and the simulated QA pass. Commit d51ddee.
Deploys-broken diagnosis
Late in the day, while pushing the MethodologyBox fix, I noticed gh run list showed every Hub deploy since Day 4 had failed. Same failure on the Episode 4 podcast publish commit, on the CHANGELOG TC Media flip, on the day-007 update — all of them.
Pulled the failure log:
✘ Error: Pages only supports files up to 25 MiB in size
media/audio/episode-4-building-the-factory-engine.mp3 is 26.1 MiB in size
Cloudflare Pages caps individual files at 25 MiB. The Episode 4 podcast MP3 — 26.1 MiB at 96 kbps stereo — exceeds the cap by 1.1 MiB. Every Hub deploy attempt has been failing at the wrangler step since the audio file landed on Day 4. The spokes (LaunchCost, Parent Care) deploy fine — they don’t have the audio file.
The deploy failure went unnoticed for four days because nothing visibly broken on the Hub: 50by50.dev continued serving the last-successful version (Day 3 EOD state, before the podcast). No 404s, no error banners. Just a slow rot where every new commit silently failed to deploy.
The fix didn’t ship Day 7 — diagnosing it was the work that fit in the day. Two paths forward: (a) compress the file below the cap as a tactical fix today; (b) move the audio out of the Pages deploy entirely, host it from R2 with a CDN URL, structural fix that also generalizes to future episodes. Decision deferred to the next session.
Episode 3 (23 MiB) is the next one that’ll hit the cap if it grows even slightly. Pattern is clear: spoken-word podcasts at podcast bitrates blow past Pages limits at ~38-minute episode length. Either bitrate goes down or the audio leaves the deploy.
What still carries
After Day 7, the open stack is:
- TC Media contact email — still placeholder. Two-file grep-and-replace once a real address exists.
- Real-device mobile QA pass on iOS + Android. Simulated QA only covers layout + JS.
- LinkedIn + Hub launch posts for LaunchCost and Parent Care.
- Search Console verification + sitemap submission across all three spokes.
- Hub deploy fix — diagnosed, not resolved.
- Week 1 weekly review per the SOP. Path C cadence check + Week 2 niche selection (HVAC Quote Decoder + Roof Storm Checklist) still open.
Two items closed today (reviewer consent + simulated mobile QA). Two new items added today (MethodologyBox cleanup landed; Hub deploy fix added).
The thing I want to say about today
The deploy-failure discovery is the lesson worth pinning. A deploy that fails silently for four days while the cached version keeps serving is the exact failure mode build-in-public is supposed to make impossible. I was watching the site every day — looked fine. The site looked fine because Cloudflare’s CDN kept happily serving the last-good build. The actual failure was visible only in gh run list, which I hadn’t checked.
Going-forward rule from this: the daily file’s “verify gate clean” line has to include “latest deploy: success” as a separate check, not assumed. CI failures should pierce normal-day attention before they pierce normal-week attention.
The other thing worth saying: backfilling four days of daily files from git was a worse artifact than writing them in real-time, but a much better artifact than not writing them at all. The life-metrics fields stayed at zero with an honest “unlogged” note. The task accountability survived. The carry-forward chain — what slipped from Day 4 to Day 5 to Day 7 — got preserved. Less texture, full integrity.
Day 7 of 132. 125 days remaining. Three of 25 counted launches, scoreboard now in sync with reality. Six open items carrying to Week 2.
Tomorrow: Day 8 opens Week 2. Open the carries, decide on the Hub deploy fix path, start the Week 1 weekly review.
Follow the build
One email a week. Real numbers, real lessons. No hype.
Unsubscribe in one click. No selling, no sharing.