TIER-2 READ conductor/code_styleguides/error_handling.md end-to-end before Phase 13.
Final state:
- All 13 phases completed (checksha recorded)
- All verification flags = true (audit_strict_exits_0,
site_inventory_has_42_rows, drain_plane_render_functions_exist,
silent_swallow_count_zero, rethrow_count_zero, unclear_count_zero,
broad_catch_count_zero)
- batched_suite_11_of_11_pass = false (Tier 3 has 1 known issue:
test_gui2_performance.py measures FPS 28.46 vs 30 threshold; documented
in TRACK_COMPLETION report as a known issue for user review)
- tracks.md updated: sub-track 4 row -> 'shipped 2026-06-20'
Track shipped on the success path. All 42 migration-target sites in
src/gui_2.py resolved.
Adds 2 invariant tests:
- test_phase_9_invariant_helper_utility_count_dropped: pins the count
to exactly 0 (post-Phase-9 baseline; no Phase 9 sites, count should
remain 0 after Phases 7-8 dropped it).
- test_phase_9_invariant_zero_sites_in_phase_9: documents that no
Phase 9 site tests exist (machine-checkable: future agent adding a
Phase 9 site will see this test fail at the count assertion).
Per PHASE1_SITE_INVENTORY.md, the one Phase 9 site (L1398 _close_vscode_diff)
is INTERNAL_SILENT_SWALLOW (the bare-except classification) and will be
handled in Phase 10 (logging NOT a drain per the convention).
Updates state.toml: phase_9 status = completed.
Adds 2 invariant tests:
- test_phase_8_invariant_property_setter_count_dropped: pins the count
to exactly 0 (post-Phase-8 baseline; all 22 INTERNAL_BROAD_CATCH sites
in src/gui_2.py migrated across Phases 3-8).
- test_phase_8_invariant_all_2_migration_sites_have_tests: verifies the
2 migrated sites (L591, L897) have both success and failure tests.
Updates state.toml: phase_8 status = completed.
Adds 2 invariant tests:
- test_phase_7_invariant_batch_d_count_dropped: pins the count to <=2
(post-Phase-7 baseline, down from 3 pre-Phase-7).
- test_phase_7_invariant_all_1_migration_sites_have_tests: verifies the
1 migrated site (L4321 worker) has both success and failure tests.
Updates state.toml: phase_7 status = completed.
Per PHASE1_SITE_INVENTORY.md, Phase 6 (signal-handler category) has 0
INTERNAL_BROAD_CATCH sites in src/gui_2.py. All sites that might appear
in a signal-handler category were classified into other phases (Phase 8
for startup callbacks, Phase 7 for worker/background).
Adds 2 invariant tests:
- test_phase_6_invariant_signal_handler_count_dropped: pins the count
to exactly 3 (the pre-Phase-7 baseline) before Phases 7-9 migrate.
- test_phase_6_invariant_zero_sites_in_phase_6: documents that no
Phase 6 site tests exist (machine-checkable: future agent adding a
Phase 6 site will see this test fail at the count assertion).
Updates state.toml: phase_6 status = completed.
Sub-track 4 of the 5-sub-track result_migration_20260616 umbrella.
Migrates src/gui_2.py (the largest source file at 260KB / 7282 lines;
the immediate-mode ImGui rendering layer) to the data-oriented
Result[T] convention.
Scope: 42 migration-target sites (38 V + 2 S + 2 UNCLEAR) + 6 infra
sites for the drain plane. Per the user's directive (2026-06-19),
the phase structure is EXTRA LONG (13 phases instead of the umbrella's
1-2) to give Tier 2 well-defined narrow scope per phase. No phase has
more than 10 migration sites. This is the anti-sliming protocol:
previous sub-tracks slimed when scope felt tight (sub-track 2 Phase 10
slimed 21/26 sites via 5 laundering heuristics; sub-track 3 Phase 3
slimed 8 sites via logging.debug bodies). The 13-phase structure with
per-phase audit gates prevents sliming.
The 13 phases:
0. Setup + styleguide re-read (Tier 2 reads error_handling.md)
1. Site inventory + classification (42 sites in PHASE1_SITE_INVENTORY.md)
2. Drain plane wiring (3 new render functions: render_controller_error_modal,
_render_worker_error_indicator, _render_last_request_errors_modal)
3. INTERNAL_BROAD_CATCH Batch A (render-loop, <=10 sites)
4. INTERNAL_BROAD_CATCH Batch B (modal/dialog, <=10 sites)
5. INTERNAL_BROAD_CATCH Batch C (event handlers, <=10 sites)
6. Signal handler sites (<=5 sites; Pattern 3 drain: sys.exit)
7. Worker/background sites (<=5 sites; thread-safety via app._worker_errors_lock)
8. Property setter/state sites (<=5 sites)
9. Helper/utility sites (<=5 sites)
10. INTERNAL_SILENT_SWALLOW (<=13 sites; CRITICAL anti-sliming phase;
per user principle 'logging is NOT a drain')
11. INTERNAL_RETHROW classification (<=2 sites; Pattern 1/2/3)
12. UNCLEAR classification (<=2 sites)
13. Audit gate + end-of-track report (--strict exits 0; 11/11 tiers PASS)
Anti-sliming protocol per phase:
- Styleguide re-read at start of each phase (commit msg acknowledgment)
- Per-site audit pre/post check (capture before + after in commit body)
- Per-phase invariant test (test_phase_N_invariant_count_dropped)
- Per-file atomic commits (1 site = 1 commit)
- 'If a site resists migration: DO NOT invent a heuristic. Report.'
The data plane (8 controller state attributes added by sub-track 3
Phase 6: _last_request_errors, _worker_errors + lock,
_startup_timeline_errors, _signal_handler_error, _inject_preview_error,
_mcp_config_parse_error, _save_project_error, _model_fetch_errors) is
the source of truth. Sub-track 4 adds the drain plane (3 new render
functions in Phase 2) and migrates the 42 sites to feed their errors
into the data plane.
Files:
- spec.md (323 lines, 11 sections)
- plan.md (938 lines, 13 phases, 60+ atomic commits, anti-sliming protocol)
- metadata.json (14 VCs, 8 risks, scope)
- state.toml (14 phases, 102 tasks, 22 verification entries)
- tracks.md (new row 6d-4 in Active Tracks table)
Total: 5 files, 1327 lines added (excluding tracks.md).
Next: Tier 2 picks up Phase 0 (setup + styleguide re-read).