Skip to content

Screen predicates fire on assistant prose: permission prompt, slash picker, compaction, Codex readiness #1293

Open

Description

@Juliusolsson05

Several predicates scan the whole viewport, so an idle pane's last reply can hold a condition forever:

  • PermissionPromptParser (claude-code-headless PermissionPromptParser.ts:59-157; gate claudeSession.ts:784): prose "Do you want to apply the fix?" followed by a markdown list "1. Yes… / 2. No…" is read as a permission prompt. The gate stays blocked (retry-after-resolve), and the false modal's Deny sends 3\\r as a prompt.
  • SlashPickerParser (:118-172): any row whose first cell is a coloured / counts, and inline code such as /Users/… or /compact is painted in that colour. That shows claude.slash-picker with no actions, blocked.
  • CompactionParser RUNNING_RE (:18): reply text ✽ Compacting conversation… (1m 51s) is read as running.
  • Codex codexReadyForPrompt.ts:21-26: substring checks (Working (, Approve+Deny, don't ask again, …) over the viewport. A reply mentioning them makes every orchestration/remote delivery poll 15 s and time out, retry-same-session, forever. Working ( also false-times-out long turns.

0 recorded frames exercise these false positives; frequency is unproven. Fix direction: anchor predicates to the live UI region (below the last divider / the composer box), not the whole viewport, and add recorded negative fixtures. Severity P2.

Found by the Stage 3 C1 hunt; lines are origin/main d525d45 and pinned submodules. Findings: temp/quality-loop/hunt-c1.md.

🤖 Generated with Claude Code

Activity

  1. Juliusolsson05 commented on Sep 25, 2026

    @Juliusolsson05
    OwnerAuthor

    Triage (quality loop): needs-evidence before a fix. The repo has 0 recorded frames of these states: a Codex approval or trust dialog, 'Working (' with prose above it, a Claude permission prompt, the slash picker, a compaction line. Anchoring each predicate to the live UI region means knowing where that region is on real screens. Next step: capture PTY frames of each state (and of a reply that quotes them) into testing/fixtures, then scope each predicate to the rows below the last transcript block, with negative fixtures from the captures.

  2. Juliusolsson05 commented on Oct 14, 2026

    @Juliusolsson05
    OwnerAuthor

    The slash-picker part now has recordings and a fix: #1477, fixed by #1478 and claude-code-headless#72.

    The suggested fix direction is wrong for this predicate. The installed Claude (2.1.283 and 2.1.296) draws the picker above the composer's top rule, not below it. The fix anchors on the block directly on top of that rule. Evidence and a graveyard are in docs/decomposition/claude-slash-picker.md. Permission prompt, compaction and Codex readiness are still open here.

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

    bugSomething isn't workingclass:C1-prompt-deliveryPrompt delivery inferred from the terminal screenneeds-evidenceNeeds a recording/real use to settlesev:P2Real bug with a workaroundtype:bugSomething works wrong

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions