Testing artifacts · 2026-08-21 · brain-brand-voice CT-BVOICE-11/12 · post-fix re-verify (PR #3821)

Brand Voice — post-fix regression re-verify: one fixed, one still broken

Real browser against https://platform.mystflo.com/brain, signed in as Peyton WP (peytonworkprojects@gmail.com). Re-runs CT-BVOICE-11 and CT-BVOICE-12 against PR #3821 (merged e075b579, confirmed deployed), which claimed to fix both #3781 (Branding row stale after Save) and #3813 (typed sample lost on sheet close). CT-BVOICE-12 ran first (no cost); CT-BVOICE-11 ran second with Peyton's explicit per-sitting sign-off for the real $5 charge.

Verdict

ScenarioIssueResultWhy
CT-BVOICE-11#3781 — Branding row stale after SavePASSRow summary line updated in-session AND survived a hard reload — the exact condition that was broken before.
CT-BVOICE-12#3813 — typed sample lost on sheet closeFAILRegression reproduced identically to the original repro — zero localStorage writes observed, sample lost on both soft reopen and hard reload. Reopened with new evidence.

1. CT-BVOICE-12 — typed sample, still lost (ran first, no cost)

Opened the Branding row's "How you sound" → "Add a real reply you wrote" composer (ShareInline). Note: this account already has a live voice, so this door opens into the REFINE view, not the pre-voice GATHER view CT-BVOICE-09 originally tested — but it's the same underlying component the fix's own file citations named.

Composer with typed sample text visible
CT-BVOICE-12 — sample typed into the composer, distinct from placeholder
Composer reopened, empty, placeholder showing
CT-BVOICE-12 — same composer reopened after closing the sheet: EMPTY, placeholder back — regression proof for #3813

Reproducible, confirmed twice with two different sample texts. Checked localStorage directly via the JS console (Object.keys(localStorage)) while the text sat live in the field, before closing anything — no matching keys, no write occurred even transiently. Closed via ✕ without submitting, reopened (soft reopen, no reload) — textarea empty. Hard-reloaded and reopened again — still empty. No ai_usage row, no brand_voice_v2 write expected or observed (input/persistence-only scenario).

Likely root cause: the fix's persistence layer (brandVoiceSampleStage.ts + initialSampleText/onSampleTextChange threading) is not reaching this render path. Most likely explanation: the "Add a real reply you wrote" fold on the REFINE (live-voice) view is a separate/differently-wired ShareInline instance than the one the fix's prop-threading actually reached (e.g. only the GATHER-mode composer inside BrandVoiceGenerateInputs.tsx got wired). Reopened as issue #3813 with this evidence.

2. CT-BVOICE-11 — Branding row, now fixed (real $5 charge, Peyton sign-off)

Pre-run Branding row summary line: "Words to use: happy to help, walk you through it, no small print, tops." Wallet: $239.85. Opened "How you sound" → Regenerate ($5.00), typed a neutral re-check note, submitted.

How you sound sheet showing new live content after save
"How you sound" sheet — "Your voice — live" ✓, new generated "How you write" content visible after Save
Branding row summary line showing new content after hard reload
Branding row outer summary line, captured after a hard reload: "...tops, good question, here's exactly how it works, both work, real time." — new content, survives reload. This exact line was stale in the original #3781 repro.

Wallet debited $239.85 → $234.56 (~$5.29, matches the $5.00 price plus markup). Landed on the "PREVIEW · READY" three-door review sheet (Save to playbook / Regenerates / Discard — 2.9p architecture, never an immediate "Make it live"). New content correctly absorbed and extended the account's existing signature phrases ("Happy to help", "Good question", "no small print", "two minutes, tops").

Brain overview page after the run, wallet and playbook percentage visible
/brain overview after the run — wallet $234.56, "Your playbook 88% of required", "The Offline Club ® | Bali"

Clicked Save to playbook — the sheet itself updated immediately (already known-working per #3781's original repro). Closed the sheet, returned to /brain in the same session: the Branding row's outer summary line HAD updated — the exact opposite of the original bug. Hard-reloaded (cmd+r) and re-checked: row still showed the new content, not the pre-run text — this is the exact condition #3781 reported as broken (stale text surviving even a hard reload), now fixed. Re-verified again minutes later on a fresh tab/navigation — consistent.

Did NOT Discard — kept the new voice live per the "Save to playbook" test script, permanently changing the account's live voice (unlike CT-BVOICE-10, which Discarded).

3. Known pre-existing gap, out of scope for this fix

"You, in one line" inside the sheet stayed "friendly" (the old value) after Save — this is the separately-tracked voicePreviewOneLiner() gap (src/lib/pendingPreview.ts looks for fields the generation schema never populates). Needs an EF schema change, not part of PR #3821's scope. Noted for completeness, not filed as a new finding.

Backend side-effect assertion

Not independently verified via a raw DB read — querying brain_profile is outside the main session's allowed non-customer read list, and background/sub-agents never query prod per the binding prod-DB-read policy. The PASS verdict for CT-BVOICE-11 rests on frontend evidence: the row updated in-session AND survived a hard reload, which rules out a client-side cache artifact since a hard reload re-fetches from the server. Flagged as inferred from frontend evidence, not independently DB-verified.

What was not verified