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
Claude local-command and synthetic transcript rows render as user prompt rows #338
Claude transcript rows generated by local commands and resume/model-switch scaffolding can render in the main feed as if they were normal conversation content.
Line 2329: isMeta: true local-command caveat, correctly hidden by feed visibility.
Line 2330: non-meta user row with <command-name>/compact</command-name>..., rendered as a visible user prompt row.
Line 2331: non-meta user row with <local-command-stdout>Compacted...</local-command-stdout>, also rendered as a visible user prompt row.
Feed debug shows only the caveat hidden as meta_filtered; command/stdout rows are added as visible entries.
Suspected Cause
Feed visibility uses a weaker synthetic-row predicate than other prompt surfaces.
visibleDecisionForEntry in src/renderer/src/features/feed/model/renderModel.ts filters non-conversation entries and isMeta === true, but does not apply the stronger Claude prompt predicate already used by:
Those paths skip Claude user rows without permissionMode and skip text starting with <, catching <command-name>, <local-command-stdout>, <environment_context>, etc.
Expected
Local-command caveats, command envelopes, command stdout, environment context, and other synthetic prompt scaffolding should not render as normal user prompt rows.
Suggested Fix Direction
Centralize a shared visible-conversation-row or synthetic-Claude-user-row predicate and use it in feed projection. Add a debug reason such as synthetic_user_filtered so saved bundles explain the decision.
Fixed by the ledger's committed collector (#425): isSyntheticClaudeUserRow (src/renderer/src/rendering/observations/committed.ts) filters <command-name> / <local-command-stdout> / <environment_context> synthetic Claude user rows with the decision reason synthetic-user-filtered, verified by the #338-named test in committed.test.ts. The ledger is now the sole feed decision core (#483). Closing.
Activity
Merge pull request #425 from Juliusolsson05/feat/rendering-slice2-col…
Juliusolsson05 commentedon Jul 7, 2026
Fixed by the ledger's committed collector (#425):
isSyntheticClaudeUserRow(src/renderer/src/rendering/observations/committed.ts) filters<command-name>/<local-command-stdout>/<environment_context>synthetic Claude user rows with the decision reasonsynthetic-user-filtered, verified by the #338-named test incommitted.test.ts. The ledger is now the sole feed decision core (#483). Closing.