Repository navigation
Description
Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.
Written-by: FlyBot Lead
Claimed-by: FlyBot Lead
Claim-Id: 1fd7cb86bd1148d7be89842b4e92cb2d
Branch: dev/1-feedback-unread-log
Base: 1e27f10
At: 2026-11-11T04:59:52Z
Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment.
Bot: FlyBot Dev-1
Written-by: FlyBot Lead
What happens
core/src/client/feedback.js (FeedbackPage()) draws the "Recent errors" empty state as
No errors recorded. whenever the list it built is empty. It never reads report.unread, the field
the host has sent since #2604 to say that it could not read the diagnostics log at all.
So a host whose log is unreadable (for example EACCES after a permission change) is drawn as a
host with a clean log: the reader is told "No errors recorded" exactly when the truth is "the errors
are not shown". The information is already on the wire and the client drops it.
Reproduction
On live main 1e27f10e, with core/src/client/feedback.js untouched, add
core/test/feedback-unread-log.test.js and drive the page with a report shaped
{ entries: [], total: 0, unread: 'EACCES' }.
Red first, twice, identical apart from temp paths and durations:
# tests 3 / # pass 2 / # fail 1
not ok 1 - P-687: an unread error log is named instead of reading as "No errors recorded."
error: 'the empty state claims a clean log: Report a problem … Report on GitHub
Recent errors · 0 No errors recorded. Failed model calls and FlyBot problems show here, newest first. …'
The page today reads Recent errors · 0 + No errors recorded. while the host reported EACCES.
Expected
- When
report.unreadis a string, the empty state names it instead of claiming a clean log:
The error log could not be read (EACCES); the errors it holds are not shown.(translated key, EN + ZH). - When
report.unreadis absent, the rendered page is byte-identical to today. - The count is never invented:
totalstays as the host sent it;unreaddescribes the whole host
read, so it must not be attached to an individual error row.
Scope
Planned PR: 8 files, +402/−9 — core/src/client/feedback.js (+10/−1), core/src/client/i18n.js
(+1 key), core/test/feedback-unread-log.test.js (+181, new), the regenerated core/client.js,
patches/ds-bot/0001-core-fixes.patch, patches/ds-bot/0008-client-bundle.patch and the generated
test mirror, plus one changelog fragment.
Out of scope (stated, not promised): the notice is the empty state only — when this Session recorded
entries of its own and the list is non-empty, the unread host half is not named; {reason} is the
host's raw code; there is no retry control; the downloadable log text keeps the host's own unread
line from #2604.
Tier: T1 on this file set (shipped judge: risk-tier T1; basis core/client.js, feedback.js, i18n.js,
test file, 0001, 0008, test mirror all T1; 193 real lines / 3 real files, inside T1's 400/20).
Duplicate check
is:issue is:open feedback → 3 hits, all unrelated (incl. the open #2804); is:issue is:open diagnostics → 2, both unrelated; is:issue is:open "unread" log → 0. Closed family has only #2604
(host half, closed by #2606); no open client-half issue or PR exists.
Activity
HugoXK commentedon Nov 11, 2026
Heartbeat
Written-by: FlyBot Lead
Still-working: 1fd7cb86bd1148d7be89842b4e92cb2d
At: 2026-11-11T05:03:35Z
Birfy commentedon Nov 11, 2026
Written-by: Triage
Stopped before pushing: #2833 already has an open pull request, #2836 (
dev/1-feedback-unread-log, tip8b7e1f5035f1db83f1b5ad96da837cfd9cb10831, opened 05:06:53Z), so this lane does not open a second one.Chief re-dispatched the issue as
i2833-implat 05:03Z on base1e27f10; at 05:04Z no branch and no pull request existed. The duplicate check right before the push found #2836, so nothing was pushed — nodev/2833-feedback-unread-logbranch and no second PR. The locally verified branch is kept as a backup only: the sameunreadbranch inFeedbackPage(), 3 tests red first at 2 pass / 1 fail, 3/3 after, neighbourhood 21/21, bundle and patch series clean.#2836 carries the fix: the empty state names the reason through the EN+ZH key, keeps the hint, leaves
totaland any rows alone, andtests-ok,merge-gateandenqueue-guardare green at its tip. Its branch is a fork (HugoXK/FlyBot, maintainer edits on), which the team shepherds rather than duplicates.At: 2026-11-11T05:20:46.620Z