From cf2415cc6527cb92898694aae88fd84d54aac28c Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Tue, 29 Sep 2026 03:08:56 -0300 Subject: A failed builtin's err replaces its msg, and (xN) is a running total A builtin failing a ctl write logged its Verbose announcement, its words as a msg, and the write's err, so the same failure again never repeated the newest record and never collapsed. Its err alone is logged now (the msg is still shown and kept in +Messages). A repeat of a record a follower has read is a new line with the running total, (xN) being N in all. fs.md states both rules. Co-Authored-By: Claude Opus 5.5 --- src/Messages.zig | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/Messages.zig') diff --git a/src/Messages.zig b/src/Messages.zig index daf195bb..7970908e 100644 --- a/src/Messages.zig +++ b/src/Messages.zig @@ -412,9 +412,8 @@ fn logMessage(p: *Pardes, id: usize, text: []const u8) void { if (text.len == 0) return; const serial: u32 = if (p.fs.session_write) 0 else if (id < MAX_PANES) if (p.panes[id]) |pane| pane.serial else 0 else 0; const kept = text[0..@min(text.len, LoggedMessage.cap)]; - // /log hears every one: a client that retried and failed the same way - // is waiting on that second line. Only the +Messages view collapses. - ctlfs.events.noteMessage(p, serial, kept); + // /log hears every one (a failure of a ctl write as its err record). + if (!p.fs.unlogged) ctlfs.events.noteMessage(p, serial, kept); if (p.messages.len > 0) { const last = &p.messages.log[(p.messages.head + limits.message_log - 1) % limits.message_log]; if (last.serial == serial and @@ -498,6 +497,16 @@ pub fn reportFailure(p: *Pardes, id: usize, text: []const u8) void { } p.fs.failure_len = @intCast(n); } + // The write fails with it, and its err record says it: no msg for it, + // and no Verbose announcement before that, so the same failure again is + // the same record again, counted (events.pushCounting). + if (p.fs.no_prompt) { + const serial: u32 = if (p.fs.session_write) 0 else if (id < MAX_PANES) if (p.panes[id]) |pane| pane.serial else 0 else 0; + ctlfs.events.dropAnnouncement(p, serial, text); + p.fs.unlogged = true; + defer p.fs.unlogged = false; + return setMessage(p, id, text); + } setMessage(p, id, text); } -- cgit v1.3