• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

umputun / ralphex / 26063630696
83%
master: 83%

Build:
Build:
LAST BUILD BRANCH: feat/plan-model
DEFAULT BRANCH: master
Ran 18 May 2026 10:17PM UTC
Jobs 1
Files 43
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

18 May 2026 10:10PM UTC coverage: 83.136% (+0.2%) from 82.902%
26063630696

Pull #350

github

umputun
fix(progress): hold writeMu across each public method's full write sequence

Addresses Copilot review on commit 960bbcf (pkg/progress/progress.go:642):
the previous mutex implementation acquired and released the lock inside each
writeFile / writeStdout call independently. Public methods doing back-to-back
writeFile + writeStdout (Print, PrintRaw, PrintSection, PrintAligned,
LogQuestion, LogDraftReview, Close) could therefore have a concurrent producer
slip between the two sinks — the file gets producer A's line while stdout
shows producer B's, or LogQuestion's QUESTION line gets separated from its
companion OPTIONS line on either sink. The doc comments overstated the
guarantee.

Fix: rename writeFile / writeStdout to writeFileLocked / writeStdoutLocked
(require l.writeMu to be held by the caller; the inner methods just do the
fmt.Fprintf). Each public method that emits a coherent log entry now takes
the mutex once around its entire writeFile + writeStdout sequence so the
two sinks stay in step under concurrent producers (codex stderr processor +
rollout-file tailer both call OutputHandler -> Print on the same Logger).

Methods adjusted:
- writeTimestamped, PrintRaw, PrintSection — 2-write file+stdout pairs
- PrintAligned (per-line loop) — file+stdout pair per displayed line
- LogQuestion — 4-write QUESTION/OPTIONS sequence kept atomic
- LogDraftReview — DRAFT REVIEW + optional FEEDBACK pair
- LogDiffStats — single file write, but still takes the mutex so a producer
  holding it for a pair sequence is not interrupted by this method
- Close — separator + Completed/Failed footer kept atomic

NewLogger setup writes (header) intentionally not wrapped — they run before
any concurrent producer exists. Tests pass under -race; linter clean.
Pull Request #350: Add first-class codex executor mode

599 of 667 new or added lines in 9 files covered. (89.81%)

15 existing lines in 5 files now uncovered.

7385 of 8883 relevant lines covered (83.14%)

231.73 hits per line

Uncovered Changes

Lines Coverage ∆ File
30
47.01
1.36% cmd/ralphex/main.go
22
93.01
-1.82% pkg/executor/codex.go
14
90.24
0.33% pkg/processor/runner.go
2
96.77
-0.51% pkg/config/values.go

Coverage Regressions

Lines Coverage ∆ File
5
80.31
-2.59% pkg/web/watcher.go
4
90.24
0.33% pkg/processor/runner.go
2
96.77
-0.51% pkg/config/values.go
2
84.88
-1.16% pkg/web/dashboard.go
2
90.75
-0.34% pkg/web/session_manager.go
Jobs
ID Job ID Ran Files Coverage
1 26063630696.1 18 May 2026 10:17PM UTC 43
83.14
GitHub Action Run
Source Files on build 26063630696
  • Tree
  • List 43
  • Changed 11
  • Source Changed 0
  • Coverage Changed 11
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Pull Request #350
  • PR Base - master (#25904902940)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc