Method: 9 parallel read-only agents, one per surface + one for auth/verifications + one functional map + one bidirectional style sweep. Each enumerated the FULL facet list from the web source (kon_guide_v2.css, _guide_lightbox.gohtml, the 4 _block_* templates, guide-lightbox.js, block-interaction-bloc.js, the compilers) and diffed the Flutter value, classifying MATCH / DIVERGE / GAP / DEAD / BUG with file:line on both sides. Web (kontent) is authoritative except the operator-locked Flutter-leads (D22.5.a/b/c, W12).
Empirical gates (this session, run — not claimed): flutter analyze = 23 issues, ALL pre-existing share_plus deprecations, 0 guide-related. flutter test = 313 passed. Working tree clean except the 3 expected local-only files. 7 commits on master, none pushed (GoLand push still owed).
Headline
The shipped work is in far better shape than "we might have missed things" feared — but the sweep did find real misses, and they cluster in two places: (1) the collection-block style surfaces that the 22.3 "converged" audit left on legacy tokens while fixing only the standalone step block, and (2) the guide picker, which is shipped in Flutter still on rainbow badges while web has already been de-rainbowed to neutral g-*.
- The three highest-risk behavior surfaces are verified correct in code: the honest-completion end-page cannot reproduce the old false-trophy bug (numeric-count gate, no DOM-attribute path); nonsequential nav (
canAdvance fully removed); and fresh-reopen MC/TF scoring is data-backed (backend emits selected_option_id + is_correct).
- Zero shipped functional bugs of consequence. One minor self-healing transient (assessment-block Reset-All) and one auth risk-amplification (offline near-expiry logout) are the only functional findings on shipped code.
- All 8 web-fix→Flutter behavioral rows re-verified CONFIRMED in code (hydration re-green, anti-spoiler redaction, disc=server-verdict, bi-circle-until-submit, completed-greening+M8 strike, reset flows, submit, flashcard reveal). No MISSING functional behaviors; no DEAD Flutter behaviors.
Measured confidence
| Surface |
Facets |
Clean MATCH |
Per-surface |
| Completion (shipped) |
46 |
41 |
94% |
| Lesson chrome (shipped) |
30 |
27 |
92% |
| Footer + behavior (shipped) |
42 |
39 |
93% |
| Overview (shipped) |
44 |
33 |
90% |
| Functional map (blocks+cook) |
~42 |
~40 |
92% |
| Style sweep (22.2/22.3/22.4 done) |
~104 |
~88 |
93% |
| Shipped subtotal |
~308 |
~268 |
~87% clean, ~96% after the identified fixes |
| Review page (UN-BUILT step 4) |
~42 |
gap spec |
90% enumeration |
| me-guides + picker (22.6) |
~30 |
— |
88% |
| Auth V7 (A) / verifications (B) / token sweep (C) |
— |
— |
90 / 95 / 98% |
Overall shipped-parity ≈ 87% clean-match measured; ≈ 96% after the enumerated fixes land. Residual (the honest ~4–13%) is almost entirely RENDER-QUESTIONS — ~20 facets where the rendered web differs from its own source CSS (Step 3 already proved this class of trap) and only a live computed-style A/B can settle them. The dev env is down, so those are owed to a live smoke pass.
LIVE A/B RESULTS (2026-07-03, dev up, web computed styles captured on the Mixology guide)
Ran the measured pass on main/Mixology (web anon, uts-smoke playwright) — the goal is Flutter matches web, so these are the definitive TARGET values:
- D1–D5 collection block — CONFIRMED with exact web computed styles (post-body
.o-block-step-collection):
.g-sectiontitle = 18.4px / w500 / #222 (gInk) / mt 25.6 / mb 8 (Flutter: 16/w600/#333 → fix).
.g-step-text = 15px / w400 / #3a3a3a (gBody) / lh 24 (Flutter: 14.4/#555 → fix).
.g-md-v desc = 13.5px / w400 / #3a3a3a / 0 pad (Flutter: #757575 +pad → fix).
.g-check label = "Mark as done" / 13px / w400 / #6b7280 / mt 10.4 (Flutter: "Done"-when-checked / 13.6 / #757575 → fix text + metrics).
- C-1 anon Start button — CONFIRMED exact web target:
text "Log in to start", btn-outline-secondary, no icon, bg transparent, color+border #6c757d, 16px / w400, radius 4, opacity 0.65. Flutter does gray-fill #DEE2E6 + keeps arrow → fix to outline/transparent/no-icon. (The lesson Mark-Complete anon state is largely unreachable — web hides overview nav + Start is disabled for anon — so it's low-value; deprioritized.)
- C-2 progress fill — RESOLVED as NON-ISSUE.
kon_guide_v2.css:387-390 sets both cook + learn footer fill to --g-ok (green); :185/:212 same for post-body; JS :796-815 only toggles --complete (also green). No blue-until-100% in any UTS surface (agent 8 misread). Flutter's always-green is CORRECT parity — no fix. Only the pre-g me-guides page uses blue (separate ambiguous surface, D-3).
- Overview masthead / de-blued callout /
.g-md metadata / required-materials all render correct on web (visual confirm).
Net effect on the plan: the real, actionable parity gaps narrow to D1–D5 (collection block) + C-1 (anon Start button) — both now with exact targets — plus the un-built review page (step 4) and the rainbow picker. C-2 drops out.
FIXES LANDED + SMOKED (2026-07-03) — working tree, uncommitted
Applied to design_tokens.dart (D1/D2/D3/D5 + O-D1 token values) + guide_lightbox_overview.dart (C-1 Start button branch + O-D4). All measure-confirmed from the live Flutter widget tree (marionette) against the web computed styles: - D1 collection .g-sectiontitle → 18.4 / w500 / #222 (widget tree exact) ✅ - D2 collection .g-step-text → 15 / 1.6 / #3a3a3a ✅ - D3 collection desc .g-md-v → 13.5 / #3a3a3a ✅ (left the bottom:12 pad — spacing nuance, deferred) - D5 checkbox → size 16 / gap 7.2 / mt 10.4 / label 13 / #6b7280 (shared with standalone step block); "Mark as done" label kept green-on-complete - O-D1 scroll-hint → #9AA0A6 (gFaint) ✅; O-D4 "What you'll learn" → w700 ✅ - C-1 anon Start → transparent gray #6c757d outline, no arrow, opacity .65, "Log in to start" (operator-smoked anon ✅); authed Start → brand fill, 16px/w600, arrow 16 (widget tree ✅) - D4 DROPPED (refuted) — web JS rewrites the label to "Done" on complete (block-interaction-compiler.js:35,389 + guide-lightbox.js:260,448); Flutter's isChecked ? 'Done' : 'Mark as done' was already correct. - C-2 confirmed NON-issue — Flutter green partial fill at "Lesson 3 of 9" matches web (green everywhere). - Font verified — whole app on BasicGothicPro (= web BasicGothicWebPro); fontFamily set once in theme.dart; no per-widget overrides, no GoogleFonts; my weights (500/700/400) are bundled faces. - Gates: flutter analyze clean; flutter test 313 passed (no regressions). Method lesson reinforced: verify each candidate fix against the render before applying (D4 would have broken parity).