You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Regression: non-file feed operations collapse to opaque Ran ellipsis rows #530
The post-ledger feed rewrite makes non-file operations close to unusable in real sessions.
Observed in the July 14 npm start build:
file writes and file edits are useful and should be preserved;
command operations frequently render only Ran plus an opaque dark … token;
the actual command is not visible;
streaming/final command output is not visible as the primary content;
surrounding non-file operation families are over-collapsed and harder to scan than the old feed.
The placeholder is consistent with commandFromLive() falling back to command: '…' while CommandCard treats that fallback as the command headline. The result is technically a rendered operation but not useful information.
User contract
For commands, the feed must show immediately:
the best currently known command or structured operation name;
live output as it arrives;
final output, exit status, and useful structure without requiring a mystery disclosure click;
an honest preparing state when the command has not been decoded yet—not Ran ….
File edit/write rendering is explicitly out of scope for rollback because it is the part of the rewrite that currently works well.
Acceptance criteria
A live Claude Bash command shows its command text before completion.
A live Codex exec_command shows its decoded cmd before completion.
A partial Codex unified-exec script shows a named preparing/running row until command decoding is possible; it never claims Ran ….
stdout/stderr streams visibly into the row before the durable result exists.
completed commands retain the command and raw output.
unknown/non-file operations expose useful name, parameters, status, and result by default.
Add renderer fixtures/tests for the exact black-square ellipsis regression.
Additional retained-session evidence from 2026-08-26 shows a related presentation failure after the original opaque-ellipsis regression:
A committed Codex unified exec wrapper was safely normalized to its inner tools.exec_command. The inner command consisted entirely of rg, rg --files, sort, and head, but the durable row still presented the transport-level label exec, raw shell text, and exit unknown.
The route is structurally correct (codex.rows.dispatch owns the invocation and paired output), so the Unknown Shape Inbox considers it known-claimed. The remaining failure is semantic presentation: the shared command protocol has no conservative search/read/list operation model.
Proposed additional acceptance criteria:
Fully parsed, read-only discovery commands render as Search, Read, or List operations while preserving exact command/output disclosures.
Classification is parse-full-or-decline. Mixed or mutating expressions such as rg foo && rm file, redirection, find -delete, and sed -i remain ordinary commands.
Transparent wrappers that discard the inner exit code say that the exit code is unavailable; they never imply success or show the ambiguous phrase exit unknown.
The specialized receipt includes a stable protocol identifier so known-claimed generic command presentation can be audited separately from semantic discovery presentation.
Obsolete — every file this issue names was deleted by the #555 renderer rewrite, and the contract it asked for is met by what replaced them.
Gone: features/feed/ui/resolve/fromLive.ts, ui/artifacts/command.tsx, ui/operations/OperationRow.tsx, presentation/projectBlock.ts; commandFromLive, CommandCard and the command: '…' fallback have no occurrences anywhere.
What replaced them does the right thing by construction. src/providers/shared/renderer/protocols/command/model.ts states the rule in its header — streaming-first: a model must be paintable the moment the command string is known, with output and exit arriving as props updates to the same row — and src/providers/claude/renderer/adapters/command.ts:30-52 emits the real command text with status: 'streaming'. Critically, fromClaudePartialBashJson (:55-64) returns null until the command JSON field closes, so a half-streamed command is never painted as a headline; and Codex's adapter declines with return null rather than inventing a placeholder. That is the opposite of the opaque "Ran …" collapse this issue reported.
One acceptance item does survive, recorded here rather than lost: a declined Codex partial falls through to the generic/fallback route, not to an explicitly-named "preparing"/"running" row. If that named intermediate state still matters, it wants a fresh issue against the current protocol model — this one points at code that no longer exists.
Activity
Juliusolsson05 commentedon Aug 26, 2026
Additional retained-session evidence from 2026-08-26 shows a related presentation failure after the original opaque-ellipsis regression:
A committed Codex unified
execwrapper was safely normalized to its innertools.exec_command. The inner command consisted entirely ofrg,rg --files,sort, andhead, but the durable row still presented the transport-level labelexec, raw shell text, andexit unknown.The route is structurally correct (
codex.rows.dispatchowns the invocation and paired output), so the Unknown Shape Inbox considers it known-claimed. The remaining failure is semantic presentation: the shared command protocol has no conservative search/read/list operation model.Proposed additional acceptance criteria:
rg foo && rm file, redirection,find -delete, andsed -iremain ordinary commands.exit unknown.Juliusolsson05 commentedon Sep 20, 2026
Obsolete — every file this issue names was deleted by the #555 renderer rewrite, and the contract it asked for is met by what replaced them.
Gone:
features/feed/ui/resolve/fromLive.ts,ui/artifacts/command.tsx,ui/operations/OperationRow.tsx,presentation/projectBlock.ts;commandFromLive,CommandCardand thecommand: '…'fallback have no occurrences anywhere.What replaced them does the right thing by construction.
src/providers/shared/renderer/protocols/command/model.tsstates the rule in its header — streaming-first: a model must be paintable the moment the command string is known, with output and exit arriving as props updates to the same row — andsrc/providers/claude/renderer/adapters/command.ts:30-52emits the real command text withstatus: 'streaming'. Critically,fromClaudePartialBashJson(:55-64) returns null until thecommandJSON field closes, so a half-streamed command is never painted as a headline; and Codex's adapter declines withreturn nullrather than inventing a placeholder. That is the opposite of the opaque "Ran …" collapse this issue reported.One acceptance item does survive, recorded here rather than lost: a declined Codex partial falls through to the generic/fallback route, not to an explicitly-named "preparing"/"running" row. If that named intermediate state still matters, it wants a fresh issue against the current protocol model — this one points at code that no longer exists.