Phase 22.6 — The Final Walk-through
05 JUL AT 08:39 PM

Phase 22.6 — The Final Walk-through

0 LOVES 0 VIEWS
The close-out re-audit (DoD).

UTS Phase 22.6 close-out — measured parity re-audit (the DoD re-run)

The Definition-of-Done re-run of the Phase-22 parity catalog against current master (all 22.x work shipped). Method — operator-chosen "plain agents, supervised": (1) live computed-style extraction inline (headed uts-smoke Chrome, dev server, admin with full real progress, 7 captures: post-body, cook lightbox open, learn overview / lesson / completion / review hydrated, the new W12 pills; 500px viewport), (2) 11 read-only surface agents (one per surface, each with its capture + CSS/JS/template sources + the accepted-divergence ledger), (3) one adversarial completeness critic (sampled 18/78 divergence rows against source: 17 correct, 1 false positive → ~6% FP).

Measured result

Surface Facets Match Diverge Accepted Clean+acc
step-block (standalone) 157 131 21 5 87%
step-collection 52 44 8 0 85%
materials + gallery 47 41 5 1 89%
cook-lightbox (FP-corrected) 44 35 6 3 86%
learn-overview 52 42 9 1 83%
learn-lesson 30 23 6 1 80%
learn-completion 38 34 4 0 89%
learn-review 44 34 10 0 77%
learn-footer 44 39 3 2 93%
guide-picker 32 25 1 6 97%
me-guides (g-* conformance) 22 16 4 2 82%
TOTAL 562 464 77 21 86.3%

Confidence, computed: 562 facets enumerated and measured (deeper than the original ~308-facet audit — this pass added line-heights and per-state spacing); critic-sampled verification 17/18 → measured-now = 86% clean-or-accepted; after the identified fixes land, a clean re-check of the fixed facets projects ~97%; residual = the gaps listed below (chiefly the desktop breakpoint).

The 77 divergences, bucketed

⚖️ Operator decisions (2) — RESOLVED 2026-07-04

  1. Standalone disc coloring → RATIFIED as a Flutter lead. Web never colors a standalone step-block's disc on answer/reveal (--done/--wrong rules are dead; the compiler gates every state class on collection items); Flutter's green/red (step_block.dart:118-124) is kept as better feedback, consistent with collection items. → Flagged to the web team (W12-style): their dead --done/--wrong CSS rules are ready — just emit the classes. The 2 medium rows move to ACCEPTED (562-facet table: step-block accepted 5→7, diverge 21→19).
  2. BUG-F1 → FIXED (16a15fba). The reset-all optimistic clear is now scoped to the resettable block ids threaded from the dispatcher; assessment blocks keep their interactions + revealed correctOptions, matching the server. Regression bloc test added; 335 green.

🔧 Medium fixes (2)

  • Review media: renders full inline MediaBlock; web (and the Flutter lesson page) use the 48px MaterialThumb → shared viewer. guide_lightbox_review.dart:112-120.
  • (BUG-F1 above, if "fix" is chosen.)

🔧 Moderate fixes (4) — step-collection rhythm + overview gap

  • Item separators missing (1px gLine border-bottom, last none) — step_collection_block.dart:403/216.
  • Item padding rhythm 13.6 V (web) vs bottom-16 only — same lines.
  • Flashcard tip suppressed (web renders .g-tip for flashcards too — content lost) — :485/:258.
  • Overview materials double-gap 48 vs 24 (guide_lightbox_overview.dart:96 SizedBox — deleting it also fixes O-BUG1's empty-collection orphan).

🧹 Low/cosmetic (~66) — three systematic decisions cover most

  • Line-heights (~14 rows across 5 surfaces): web inherits body 1.5/1.6; Flutter leaves height: unset (≈1.17-1.43 ambient). ONE sweep: set height: per web value on the listed styles.
  • Margin-stack vs CSS-collapse (~12 rows): double-pads (title→desc 16 vs 8, completion partial 30.4 vs 22.4, flashcard +12, submit +8…) — the known Flutter-stacks /CSS-collapses class; each fix is a one-liner listed in the raw results.
  • me-1 icon gaps (+4px) & px nits (~15 rows): icon gaps, gCalloutPadH 11→11.2, W12 nits (ls .44, pill 13px, icon gap 7.2), submit in-lightbox 8/19.2, g-check metrics.
  • Rest: me-guides tokenization (4, consistency-only), picker empty-meta edge (1), footer label alignment/Exit-Review skin (2), misc.

🌐 Web-side flags (hand to the web/Go team; Flutter is correct or leads)

  1. Web bug: review page paints a revealed flashcard's disc red (data-step-correct never set for flashcards); Flutter's green is the right semantics.
  2. Web bug (same family): collection flashcard LIVE reveal never greens the circle until reload (reveal handler adds no class; only hydration does).
  3. Flashcard revealed answer in review inherits 16px (un-designed; every styled review text is 13-14) — suggest 13.5.
  4. Review indent hygiene: body 39.6 vs answer/explain 40 (legacy calc split).
  5. ~24 dead CSS selectors in kon_guide_v2.css emitted by nothing (.g-rating*, .g-callout*, .g-meta*, .g-badge*, .g-progress-fill--brand, .g-lightbox*, .g-media*) — bidirectional-audit DoD: retire. EXCEPTION: .g-step-num--done/--wrong are no longer dead-to-retire — they're the ready-made hooks for adopting the ratified standalone-disc coloring (item 6).
  6. Adopt standalone disc coloring (operator-ratified Flutter lead 2026-07-04): emit --done/--wrong on standalone step-block discs on answer/reveal — the CSS already exists; the compiler just never adds the classes outside collections.

✅ Notable clean verifications

W12 fully landed on web and byte-matches Flutter (pills #e9f5ee/#0f5132 + #fbe9eb/#842029, label 11/600/uppercase/gFaint, --revealed now var(--g-muted), completion note gated) · D20.1–D20.6 behavior contract incl. live "Review Results" CTA · gBrandInk lerp numerically exact vs color(srgb …) · duration humanizers byte-for-byte · picker 97% · lifecycle parity (fresh-bloc-per-open ≡ web reset-on-open/close) · multi-guide trigger 1→direct/2+→picker · me-guides zero hex/rainbow remnants.

Residual gaps (disclosed, not measured)

  • Tablet/desktop ≥768px never live-captured (all captures at 500px) — Flutter's isMobile:false branches certified against source CSS only. MEDIUM.
  • Safe-area on notched devices (browser env()=0) — carried render-Q. LOW-MED.
  • Reset-confirm modal chrome depth; error-path snackbar styling; overflow/nowrap/RTL; scroll-hint animation. LOW.
  • macOS-counts-as-on-device per operator decision 2026-07-03 (device pass deferred to the app-store build cycle).

Verdict — CLOSED 2026-07-05

The measured re-run is done; disposition complete: - Decisions: disc coloring RATIFIED (→ web adoption item 6); BUG-F1 FIXED (16a15fba). - The 5 real (user-visible) fixes SHIPPED (502590d6) and SMOKED: review media → MaterialThumb (live: item 9 renders the 48px thumb); step-collection separators + 13.6 rhythm (live: hairlines between items); flashcard tip un-suppressed (code-verified — NO dev flashcard has a tip, the branch cannot render with current data); overview double-gap removed → single 24px (live; O-BUG1 dead). 335 tests green. - The ~66 lows are EXPLICITLY ACCEPTED as within tolerance (operator, 2026-07-05): 1-4px spacing and line-height deltas below human perception. They stay catalogued in phase-22.6-close-audit-raw.md should anyone ever want the sweep; they are NOT open work items. - Incidental finding while smoking: an overnight keychain lock made the refresh scheduler throw an unhandled PlatformException(-25308) and the UI froze — logged as BUG-RISK-A1 evidence (treat secure-storage exceptions as transient).

With this, Phase 22 (and the UTS program: web Phases 1-21 + Flutter 22.1-22.6) is functionally and visually complete to within explicitly-accepted tolerances. Remaining threads live outside the phase: the web-side flags above, FT1/FT2 quality-tail, BUG-RISK-A1. Raw per-surface tables: phase-22.6-close-audit-raw.md.


22.6 close-audit — raw agent results

materials+gallery

FACETS: 47 checked, 41 match, 5 diverge, 1 accepted DIVERGENCES: | facet | web | flutter | flutter file:line | severity | fix | |---|---|---|---|---|---| | D10 gallery strip padding (NOT fixed) | strip pad-top 6.4 + pad-bottom 4 (h=74.4) | bare SizedBox(64), no padding | guide_gallery_disclosure.dart:98-110 | minor | wrap _strip in Padding(top:6.4, bottom:4) | | last-row border when gallery follows | .g-mat:last-child keys off DOM; trailing .g-gal keeps the row's border | isLast index-only → border dropped when disclosure follows | material_collection_block.dart:101 + material_item_block.dart:20 via material_row.dart:44-50 | minor | isLast = isLastIndex && !hasGallery | | collection title→next gap | 8px | 8 pad + extra SizedBox(8) = 16 | material_collection_block.dart:51 | minor | delete extra SizedBox | | description→first group gap | 0 | Padding(bottom:12) | material_collection_block.dart:57 | minor | drop 12px | | OPTIONAL badge lead gap | 6px | Wrap spacing 4 + badge marginLeft 6 = 10 | material_type_badge.dart:32 (+material_row.dart:67) | cosmetic | zero one of the two | ACCEPTED: D9 audio glyph. NOTES: sub-pixel roundings counted as match; .g-grouphdr belongs to lightbox surface; agent self-scores ≈97% after fixes.

learn-completion

FACETS: 38 checked, 34 match, 4 diverge, 0 accepted | score→note gap | 6px (collapse) | 4.8 | guide_lightbox_completion.dart:152-154 | minor | use 6 | | partial title→actions gap | 22.4 (collapse) | 30.4 (both SizedBoxes render) | :75-85 | minor | gate title-bottom SizedBox(8) on complete | | action icon gap | 4 (me-1) | 6 | :204 | minor | 4 | | action icon size | 13 (inherits btn) | 14 hardcoded | :203 | minor | 13 | KEY: W12(c) note LANDED on web (_guide_lightbox.gohtml:180) — text/12px/gFaint/gating all MATCH Flutter. gBrandInk lerp numerically exact.

guide-picker

FACETS: 32 checked, 25 match, 1 diverge, 6 accepted | empty meta line | omitted when no parts | unconditional Text + 2.4 SizedBox (empty line, edge-unreachable) | guide_picker.dart:167-176 | low | gate on isNotEmpty | ACCEPTED: modal centering idiom, hover→ripple, backdrop .5 vs .54, esc→back, empty-badge stricter, inline shadow values.

me-guides (g-* conformance)

FACETS: 22 checked, 16 match, 4 diverge, 2 accepted | chevron size 14 hardcoded | :249-253 | low | tokenize | | 9 micro-gap magic numbers | :75,85,177,194,205,222,248,296,298 | low | tokenize or annotate | | empty-state sizes magic | :114-144 | low | tokenize or annotate | | error state un-g-styled bare Text | :59-61 | low | gMuted | Hex/rainbow sweep clean (zero Color literals).

step-collection

FACETS: 52 checked, 44 match, 8 diverge, 0 accepted | item separator 1px gLine border-bottom (last none) | NONE — isLast unused | step_collection_block.dart:403-404,216-217 | MODERATE | add border | | item padding 13.6 top+bottom | only bottom:16 | same lines | MODERATE | 13.6 V | | flashcard tip renders on web | Flutter suppresses tip when isFlashcard — content lost | :485-486,258-259 | MODERATE | drop !isFlashcard | | progress label 11/gFaint uniform, whole label greens at 100% | 12/#6C757D + bold count, count-only green | :301-320 + tokens:809-814 | minor | align | | title→desc gap 8 | 16 (extra SizedBox) | :100-113,166-179 | minor | remove SizedBox | | disc↔body gap 13.6 | 12 | :413,226 | minor | 13.6 | | desc line-height 1.5 | default | :120-126,184-191 | minor | height 1.5 | | done-label stays w400 | w500 bump | :672-674 | minor | keep w400 |

learn-overview

FACETS: 52 checked, 42 match, 9 diverge, 1 accepted | O-BUG1 empty-collection orphan SizedBox STILL PRESENT | guide_lightbox_overview.dart:60+:96 | minor | delete :96 SizedBox | | gap above REQUIRED MATERIALS 24 web vs 48 flutter (double-pad) | :96 + materials:39 | MODERATE | remove :96 SizedBox (fixes O-BUG1 too) | | band→ABOUT gap 24 vs 17.6 | :82 | minor | +6.4 | | section-title icon gap 12/16 vs 8/12 (me-1 missed) | :134,:200; materials:56 | trivial | +4 | | materials→CTA gap 40 vs 24 | :103 | minor | +16 | | authed CTA padding 12/6 vs M3 default | :273 | minor | set padding | | md row baseline align vs top | guide_metadata_grid.dart:31 | trivial | baseline | | scroll-hint chevron 12.8 vs 16 | :390 | trivial | 12.8 | NOTE: capture was missing objective/CTA/g-md keys → those measured from source CSS (flagged). D20.4 CTA fully verified incl. live fact.

FACETS: 44 checked, 39 match, 3-4 diverge, 2 accepted | learn progress-label alignment start (web) vs centered (flutter) | footer.dart:180-192 | minor | start-align | | progress→Next spacing 32 (gap+margin) vs 16 symmetric | :178-179 | cosmetic | right:32 | | footer bottom padding mobile: cook 8 / learn 12 vs 10 both | :48-51 + tokens:844 | cosmetic | per-mode | | Exit Review button skin: Bootstrap outline-secondary (gray 14px r4) vs M3 default (brand stadium) | :218-228 | minor | style gMuted/gLine2/r4-6 | Behavior contract D20.1 fully verified + test-pinned. Review footer row = source-derived (not in captures).

cook-lightbox

FACETS: 44 checked, 34 match, 7 diverge, 3 accepted | D6/L2 submit padding in-lightbox 8/19.2 vs 7.2/16 | guide_lightbox_step.dart:316-318 | minor | override values | | D12 section-title icon gap 12 vs 8 | materials.dart:56; cook_mode.dart:117 | minor | 12 | | bottom scroll pad 48 vs 32 | cook_mode.dart:57 | micro | 48 | | footer mobile bottom 8 vs 10 | footer.dart:48-51 | micro | 8 | | g-check gap 7.2/input16 vs 8/box20 | guide_lightbox_step.dart:234-251 | micro | align | | md grid baseline vs top | guide_metadata_grid.dart:31 | micro | baseline | | medallion fallback dn→email vs dn→firstName→email | guide_band.dart:133-141 | micro | flag/drop hop | ACCEPTED: W2, V3, V5. NOTE2: anon local flashcard reveal doesn't advance footer progress on Flutter (web does) — fold into V5 family or fix.

learn-review

FACETS: 44 checked, 34 match, 10 diverge, 0 accepted (the #555-vs-gMuted item RESOLVED AS MATCH — W12 changed web to var(--g-muted)) | review media = 48px MaterialThumb→viewer on web vs full inline MediaBlock | guide_lightbox_review.dart:112-120 | MEDIUM | use MaterialThumb+primaryMediaTap like lesson page | | row padding: inter-row 32 (24 container + 16v rows) vs 48 (all(24) per row) | :60 | low | symmetric(16,24) | | last-row border should be none | :61-65 | low | skip when last | | header→body 5.6 vs 8 | :95 | low | 5.6 | | flashcard disc: web renders RED (web bug — no correctness data) vs Flutter green | :158-168 | low(WEB-BUG) | keep green; flag web | | label ls .44 vs .4 | :234 | W12-nit | .44 | | pill icon gap 7.2 vs 6 | :261 | W12-nit | 7.2 | | pill font 13 vs 13.5 | :266 | W12-nit | 13 | | flashcard revealed answer 16px web (un-designed) vs 13.5 | :185 | W12-nit | flag web to 13.5 | | line-heights 1.5 on title/label/pill/flash/explain | :86-90,230-236,263-271,182-189 + explanation_box.dart:36-41 | low | height 1.5 | NOTE: W12 fully landed (css:492-501,595-597; js populateReviewAnswer:1290-1348); core pill facets exact match. Web hygiene: indent split 39.6 vs 40.

learn-lesson

FACETS: 30 checked, 23 match, 6 diverge, 1 accepted | answers gap after media 8.8 vs 12 | lesson_page.dart:241 | low | conditional 8.8 | | Submit padding 8/19.2 vs 7.2/16 | :282-285 | low | lightbox override | | Submit in-flight grey flash vs stays-brand | :274-296 | low | disabledBackground brand | | tip+explain line-height 1.6 missing | tip_box.dart:34-40, explanation_box.dart:36-42 | low-med | height 1.6 (+padH 11.2) | | flashcard top margin +12 extra | flashcard_panel.dart:80-81 | low | zero in lesson context | | anon Mark Complete: web brand no-op vs Flutter grey disabled | :408-411 | low(anon) | flag/align | ACCEPTED: F1. Lifecycle parity CONFIRMED (fresh-bloc-per-open ≡ web reset-on-open/close).

step-block (standalone)

FACETS: 157 checked, 131 match, 21 diverge, 5 accepted KEY MEDIUMS (operator-decision class): standalone answered MC/TF disc + revealed flashcard disc — web NEVER colors standalone discs (compiler applies no class; --done/--wrong unused there); Flutter colors green/red per the 22.3 plan whose cited evidence was collection-circle-only. Fix Flutter OR ratify deviation. LOWS: flashcard top pad 12→0; submit margin-top 8→0; q-prompt margins 1.6/9.6 (token gStepPromptMarginBottom unused!); gCalloutPadH 11→11.2; flash-reveal gap 10.4/icon 13; step-head runSpacing 4→8; Done label w500→w400; try-again mt 12→11.2; height:1.5 on 8 single-line labels. ACCEPTED: F1, F2, W2, BUG-F1, MINOR-F2.

← Back to Under the Tuscan Sun