Skip to content

Regression: non-file feed operations collapse to opaque Ran ellipsis rows #530

Closed

Description

@Juliusolsson05

Regression

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:

  1. the best currently known command or structured operation name;
  2. live output as it arrives;
  3. final output, exit status, and useful structure without requiring a mystery disclosure click;
  4. 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.

Relevant code

  • src/renderer/src/features/feed/ui/resolve/fromLive.ts
  • src/renderer/src/features/feed/ui/artifacts/command.tsx
  • src/renderer/src/features/feed/ui/operations/OperationRow.tsx
  • src/renderer/src/features/feed/presentation/projectBlock.ts

Activity

  1. Juliusolsson05 commented on Aug 26, 2026

    @Juliusolsson05
    OwnerAuthor

    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.
  2. Juliusolsson05 commented on Sep 20, 2026

    @Juliusolsson05
    OwnerAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions