Pitch
`crates/tui/src/tui/app.rs::App` is now ~200+ public fields, many of which group naturally:
- `onboarding_*` (4 fields)
- `approval_*` (3 fields)
- `composer_*` (5+ fields)
- `runtime_turn_*` (3 fields)
- `subagent_*` (4 fields)
- `transcript_*` (5 fields)
- ...
Each cluster could be its own struct (`OnboardingState`, `ApprovalCache`, `ComposerState`, `TurnState`, `SubagentTracker`, `TranscriptViewport`) with focused methods. `App` becomes a thin top-level container of these. Easier to read, easier to test, easier to refactor later.
Acceptance
Why now
Acquisition-readiness: a future maintainer reading `App` for the first time should see structure, not a flat 200-field god struct. This refactor pays for itself within a few PRs.
Pitch
`crates/tui/src/tui/app.rs::App` is now ~200+ public fields, many of which group naturally:
Each cluster could be its own struct (`OnboardingState`, `ApprovalCache`, `ComposerState`, `TurnState`, `SubagentTracker`, `TranscriptViewport`) with focused methods. `App` becomes a thin top-level container of these. Easier to read, easier to test, easier to refactor later.
Acceptance
Why now
Acquisition-readiness: a future maintainer reading `App` for the first time should see structure, not a flat 200-field god struct. This refactor pays for itself within a few PRs.