- Log rendered as wrapped monospaced lines in a LazyVStack; the single Text in a two-axis ScrollView drew nothing at 1,300+ lines.
- Split per
$ <step>line with the same rules asSplitBuildLog/FailedSection; pinned step headers, failed step open (withfailed_reason), others collapsible. Live builds open their latest step; passed builds start folded. - Toolbar: Jump to failure (end of the failed step), Jump to end.
.searchablefilters lines under their step. - Polls every 3s while pending/queued/running; the
.taskcancels it on disappear. A failed poll keeps the log. ran <duration>after finished, fromduration_s.- VoiceOver: each line is one element (blank lines hidden); step headers are header buttons with step, command, failed and expanded state.
Closes #15