Skip to content

Terminal experience 2026-09-28: tab titles, needed-only alerts, quiet bell and colour depth for Windows Terminal - #484

Merged
seathatflowsinourveins merged 1 commit into
mainfrom
claude/terminal-experience-20260928
Sep 29, 2026
Merged

seathatflowsinourveins merged 1 commit into
mainfrom
claude/terminal-experience-20260928

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator

Scope

  • What this PR changes, in one or two sentences: records the measured 2026-09-28 decision for this workstation's terminal layer (Windows Terminal tab titles, needed-only alerts, a quiet bell and colour depth for Claude Code and Codex), adds a Windows Terminal paragraph to the Claude profile recipe, one scoped native-clients catalog sentence, supersession pointers in the community-sweep record (its A09 setting and its bellStyle "Not covered" bullet), and the receipt with its probe scripts. The host settings the record describes (Windows Terminal fragment, Claude Code and Codex user settings) were applied separately on the host and are not in this diff.
  • Base commit: 16f3c7fe (origin/main at the last rebase)
  • Lane: lane:foundation
  • Owned paths touched: docs/decisions/, recipes/claude-native-profile.md, catalogs/foundation/manifest.json (one sentence in the native-clients layer), evidence/receipts/, evidence/artifacts/terminal-experience-20260928/, and manifests/evidence.json (hot-file protocol: main's copy taken after each rebase, own receipt entry and files re-registered, last commit). The two anti-pattern rows for this record are deliberately not in this PR: docs/harness-defaults.md is edited by most changes (11 commits in the last 24 hours) and a shared edit there made this PR unmergeable twice; they arrive with the follow-up PR.
  • Authorship: written by a Claude Sonnet 5.5 coordinator session, hence the commit trailer. Independently reviewed by Codex GPT-6 (read-only, max) and a headless Opus (max) before and after one repair round.

SOTA sources

  • microsoft/terminal at tag v1.24.11911.0 (installed stable) and v1.25.1912.0 (preview): src/cascadia/TerminalCore/TerminalApi.cpp L87; src/terminal/adapter/adaptDispatch.cpp DoConEmuAction (v1.24 L3523-L3614, v1.25 L3533-L3628) and L3797-L3819; src/terminal/parser/OutputStateMachineEngine.hpp L202-L225 and .cpp L749-L892; src/cascadia/TerminalApp/TerminalPaneContent.cpp L268-L303; Tab.cpp L440-L461 and L1131-L1156; src/cascadia/WindowsTerminal/IslandWindow.cpp L919-L924; src/cascadia/TerminalApp/AppLogic.cpp L207-L439; src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp L1203, L1246, L1271; src/cascadia/TerminalConnection/ConptyConnection.cpp L104-L127 (profile environment and WSLENV); src/terminal/parser/stateMachine.cpp L1084-L1161, L1487-L1532, L1667-L1830 and L1838-L1924 (the transitions the probe's BEL counter models); adaptDispatch.cpp L4799-L4818 (DECPS plays notes, no bell indicator); doc/cascadia/profiles.schema.json (BellStyle enum: no notification on either tag, present on main). Unreleased on main: pull requests #20010, #20011 and #20012 (gh api repos/microsoft/terminal/compare/93bdbfaa3d62304f4b50b4ca4484da4dd08e4a1f...<tag> reports diverged for both tags).
  • anthropics/claude-code: CHANGELOG.md entries 2.1.141 (terminalSequence), 2.1.152 (sessionTitle), 2.1.228 and 2.1.236 (title glyphs, write on change), 2.1.212; docs read 2026-09-28: code.claude.com/docs/en/hooks ("Emit terminal notifications", "Notification" types and timing, "Matcher patterns"), /settings ("When edits take effect"), /terminal-config, /agent-view. The installed 2.1.284 binary for the notification sender, the undocumented worker_permission_prompt type and the first-party COLORTERM=truecolor tip.
  • openai/codex at tag rust-v0.157.1: codex-rs/config/src/types.rs L652-L657 and L826-L833; codex-rs/tui/src/chatwidget/notifications.rs L72-L81 and L94-L98; codex-rs/tui/src/notifications/mod.rs L53-L61 and L116-L131; codex-rs/tui/src/terminal_palette.rs L43-L75 and diff_render.rs L1132-L1156; codex-rs/core/config.schema.json.
  • Terminal per-OS notification sequences: gnachman/iTerm2@52fdf260 sources/VT100/VT100XtermParser.m L276-L320 (OSC 9 mapped, 777 not).
  • Candidates compared, with pins and live checks, in the decision record: DevinoSolutions/anotifier-for-claude-codex-cursor@92c080a7, 777genius/agent-notifications@0376f9c9 (README L241-L256, bin/install.sh L228-L260), congmnguyen/claude-code-wsl2-setup@69620ec4, shanselman/toasty@973eeb8d, PeonPing/peon-ping@8ef37660, mylee04/code-notify@dcfd4ae6, asheshgoplani/agent-deck@035fd602, kbwo/ccmanager@ee0af836, zellij-org/zellij@a79e15e1; tmux 3.4 (options-table.c, tmux.1 at the 3.4 tag).
  • No code was written where a maintained upstream exists: the hook command is the hooks reference's own construction (jq -n --arg), the colour depth uses Windows Terminal's native profile environment key, and no toast bridge was built because Windows Terminal main will ship native toasts. The probe scripts under evidence/artifacts/ are measurement tools for this record's claims, not product code.

Evidence-class table

Claim Evidence class Command / receipt
A program title flows once suppressApplicationTitle is off, and does not with it on native_proven (native Windows Terminal, negative control) receipt terminal-experience-20260928, data.titles.trial
7 tabs with 1 distinct title became 7 distinct titles (8 of 8 at the last read); all Claude tabs, no Codex tab observed native_proven (UI Automation read-back, counts only) receipt data.titles; wt_tab_titles.ps1
A pending AskUserQuestion (in this host's own bypassPermissions mode, read from the on-screen footer, and in default mode) and a pending plan approval (plan mode) each raise one permission_prompt Notification and one bare BEL byte about 6 s (+6.0 to +6.1 s) after opening, none at open native_proven (real session in a pty, observer hook, no keys sent) receipt data.alert_probes; alert_probe.py ask, ... ask --permission-mode default, ... plan
That BEL comes from the user's hook: in separate runs with every hook disabled the dialog still opens and there is no BEL byte (Notification events cannot be observed in that setup: the observer hook is off) native_proven (control runs) receipt data.alert_probes.hooks_disabled_controls; alert_probe.py ... --control
The BEL counter models the pinned terminal's parser: bytes across split reads, BEL in the escape state, DCS/APC strings, CAN/SUB, an OSC-terminating BEL; the payload directory is removed after an interruption and a failure synthetic (24 self-test checks; a model of the cited transitions, not Windows Terminal itself) alert_probe.py --selftest
The saved hook command yields exactly one BEL synthetic (fixture) receipt data.hook_command_fixture
Claude Code emits 24-bit colour with COLORTERM=truecolor (0 vs 45 truecolor sequences, 41 vs 0 in 256 colours) native_proven (bare first frame) receipt data.colour_capture_claude_bare_first_frame; color_capture.py
The profile environment key reaches a wsl.exe --exec process (env=truecolor vs env= without the key) native_proven (native Windows Terminal, negative control) receipt data.environment_key_trial
The host check catches the previous fragment and nine single-defect mutants, each failing exactly one expected rule (eight distinct rules) synthetic (fixtures) receipt data.check_script_controls; fragment_check_mutants.py
The bell chime and tab bell icon on this host; the taskbar flash is not confirmed native_proven (user-reported observation) receipt data.bell_user_report
No shipped Windows Terminal handles plain OSC 9 text, OSC 777 or OSC 99; toasts are unreleased; BellStyle lacks notification on both release tags source_review (pinned tags, GitHub API) decision record fact table; receipt provenance.commands
The Codex [tui] notifications list loads under --strict-config and its kinds match type_name() native_proven (exit 0) plus source_review receipt data.codex
The fragment validates against the release schema's own draft (2020-12) and an invalid tabColor or bellStyle is rejected native_proven (schema validation, negative control) validate_fragment.py; receipt provenance.commands

Local commands run

$ python3 scripts/validate.py
exit 0: {"components": 69, "hashed_files": 8036, "profiles": 4, "receipts": 169, "status": "passed"}
$ python3 scripts/validate_foundation.py
exit 0: FOUNDATION catalog valid: layers=20, decisions=54, foundation_components=61
$ python3 scripts/component_matrix.py --check ; python3 scripts/new_host_grand_list.py --check
exit 0 and 0
$ python3 -m unittest            (whole suite, zizmor and gitleaks on PATH, this branch at 9d81a4ca; later rebases changed only the hot-file registrations and generated reports)
Ran 7113 tests: failures=173, errors=148, skipped=770. Every failing id sits in 22 modules this diff cannot reach (codex lane, data lake, paper credentials, adjudication, tiering, ...).
$ the same 22 modules, back to back in the same minute, on that branch head and on clean origin/main (6d626654)
PR head:     Ran 1151 tests: failures=173, errors=148, skipped=83
origin/main: Ran 1151 tests: failures=173, errors=148, skipped=83   (the 321 failing ids are identical)
The count on this host moves with host state: earlier the same modules gave 162 failures on both trees, before a `/tmp/.git` marker directory appeared while Codex sessions ran, and the process-scanning reaper tests depend on live peer sessions. The largest groups refuse a temporary directory inside a git work tree or a credential file in a worktree. CI's clean runner is the authority.
$ python3 checks/check-terminal-profiles.py        (host practice repository)
PASS 5 profiles; fails on the previous fragment; fragment_check_mutants.py: 9 mutants, 8 distinct rules, 0 problems

Decision record

docs/decisions/2026-09-28-terminal-experience.md: evidence, alternatives with pins, and the overturn conditions (a Windows Terminal release whose BellStyle enum carries notification, or whose ancestry contains #20012; a maintained state-indicator or WSL-aware notifier; the agent view probe).

Review

Round 1: Codex GPT-6 (read-only, max) and a headless Opus (max) each returned changes-needed (8 and 18 findings, several overlapping). All were accepted and repaired in one repair round: byte-accurate BEL counting with a hooks-disabled control, no raw payloads in the checkout, per-terminal notification sequences, scoped catalog and recipe statements, corrected line citations, the native environment key instead of a shell wrapper, silent static tabs, additional limitations, a direct schema probe for the toast watch, and supersession pointers.

Round 2 (one bounded re-check of that repair, same two reviewers, both changes-needed): 24 of the 26 round-1 items were fixed and 2 partly (line ranges); 16 new findings (4 from Codex, 12 from Opus, one of them informational; 6 medium, several overlapping), all applied in this head: the BEL counter now follows the pinned terminal's parser transitions (escape-state BEL, interrupted OSC and DCS strings, CAN and SUB) with 22 counter cases; the probe's private directory is removed on interruption and failure (two more checks); the hooks-disabled controls no longer report a Notification count that is unobservable by construction; AskUserQuestion is measured in this host's own bypassPermissions mode as well as default; the mutant harness now asserts exactly one expected failing rule per mutant (nine mutants, eight distinct rules, so the earlier "each with its own message" was corrected); the fragment validator uses the schema's declared draft; wording fixes (DECPS, agent_needs_input timing, the schema-enum signal proves #20011 not #20012, line ranges). No third review round, per the bounded-loop rule; the repaired probes and checks were re-run instead (self-test 24 of 24; five probe runs: ask in the host's default mode, its hooks-disabled control, ask in explicit default mode, plan and its control; nine mutants; validator negative control) and the results are in the receipt.

Residuals (recorded, not fixed here)

  • The taskbar flash, click-to-focus and any toast are not observed (none exists yet in a release). The probe measures the BEL bytes the client writes to its pty; ConPTY sits between that stream and Windows Terminal, so an audible bell for the alert path itself was not observed (the user's observed chime was the trial tab's).
  • No Codex tab was open during any measurement; Codex title behaviour rests on source.
  • preferredNotifChannel reaching sessions that started before the edit is supported by the per-call read in the 2.1.284 binary but not observed on a peer.
  • The agent view probe (claude agents, --bg) is not run; its pass criteria are in the decision record and it needs the user to accept a workspace-trust dialog in a throwaway repository.
  • The other Mac hosts keep the client's native auto notifications; making them needed-only needs a per-terminal sequence and an observed delivery first.

Host evidence

Not applicable: no file under evidence/hosts/ is added or changed.

Checklist

  • New/changed GitHub Actions are pinned to a full commit SHA with a version comment (none added or changed).
  • New/changed workflows declare top-level permissions: contents: read (none added or changed).
  • No secrets are printed, logged or committed (gitleaks clean on the commit; the colour probe uses a non-credential dummy value); no new required secret was added.
  • No new paid hosting, subscription or billing surface was introduced.
  • Peer-owned untracked files and worktrees were preserved.

Not merged by the author: the user decides the merge.

🤖 Generated with Claude Code

@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Sep 29, 2026
@seathatflowsinourveins
seathatflowsinourveins force-pushed the claude/terminal-experience-20260928 branch 4 times, most recently from 09bd949 to 5ff6776 Compare September 29, 2026 04:54
… bell and colour depth for Windows Terminal

Records the measured decision for this workstation: the AI-client profiles stop suppressing application
titles (7 tabs, 1 distinct title -> 7 distinct), alerts narrow to pending decisions (one Notification and
one bare BEL byte about 6 s after an unanswered AskUserQuestion, in this host's own bypassPermissions mode
and in default mode, or an unanswered plan approval; none at open; no BEL byte in separate runs with every
hook disabled), the bell sound is chosen from measured levels, static shell tabs stay silent, and Claude
Code gets COLORTERM=truecolor through the profile environment key (41 256-colour -> 45 truecolor sequences;
the key reached a wsl.exe --exec process in a trial with a negative control).

Adds the decision record, a Windows Terminal paragraph in the Claude profile recipe,
a scoped native-clients catalog sentence, supersession pointers in the community-sweep record (A09 and the
bellStyle "Not covered" bullet), the receipt and its probe scripts (a BEL counter that follows the pinned
terminal's parser, hooks-disabled controls, nine isolating mutants of the host check), and registers them in
the shared manifests/evidence.json hot file. Runtime settings changed on the host only. The overturn step
carries a direct schema probe for Terminal's toast work because release ancestry can miss a backport.

Reviewed by Codex GPT-6 (read-only, max) and headless Opus (max): round 1 returned 26 findings (8 + 18, several overlapping), one bounded
re-check of the repair returned 16 more, several overlapping; all were applied. Authored by a Claude Sonnet 5.5 coordinator session.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
@seathatflowsinourveins
seathatflowsinourveins force-pushed the claude/terminal-experience-20260928 branch from 5ff6776 to f2626a4 Compare September 29, 2026 05:46
@seathatflowsinourveins
seathatflowsinourveins merged commit cf2960a into main Sep 29, 2026
25 of 30 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the claude/terminal-experience-20260928 branch September 29, 2026 06:13
seathatflowsinourveins pushed a commit that referenced this pull request Sep 30, 2026
…ough the packaged Codex lane on OmniRoute), 46 findings checked, 39 repaired

Nine read-only jobs (#484, #498, #510, #519; two lenses each, #519 in three parts) returned 46 findings (3 high, 34 medium, 9 low). Each was graded by an independent Claude verifier
(23: 17 confirmed, 4 partly, 2 refuted) or checked by the coordinator against the code or the upstream source before any change; 39 led to a repair, 2 were refuted, 3 concerned the removed
second-distro target, 2 duplicates of one convention were kept.

Repairs, each with a control that fails without it: the settings-swap tool installs only over the bytes it read, refuses keys beyond matcher and hooks and prints no matcher value (24 controls,
15 mutant runs); the notification-type scan resolves the catalog's spread identifier instead of choosing an array by contents (eight reader tests, seven mutants); the login-shell check needs an
answer for every command and an end marker, uses type -P and lets only the first startup file bash reads shadow ~/.profile; the digest, Codex strict-config, overlay, tmux and pty probes exit
nonzero when they measured nothing (selftests, an end-to-end SIGTERM case with a negative control); the BEL counter ignores UTF-8 C1 characters like the pinned output engine; the colour counter
counts SGR only; the 512-combination bash oracle compares first_read; the practice repository's sound rule is exact.

Wording corrected: tmux has a sync feature (measured); the bell icon clears after about 2 s on a focused tab; the push presence rule is for a local session; a profiles.defaults key beats a
fragment-only profile; a terminal's permission notification is timed by inactivity (the fixed-delay timer is the Agent SDK path, which the coordinator's own earlier correction had confused).

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
seathatflowsinourveins added a commit that referenced this pull request Sep 30, 2026
… (gpt-6.1-sol and gpt-6-astra-ultra through the packaged Codex lane on OmniRoute) (#532)

Nine read-only jobs of the packaged Codex lane (gpt-6.1-sol, effort max, through the local OmniRoute gateway) reviewed the four merged terminal-lane pull requests (#484, #498, #510, #519)
and returned 46 findings; each was graded by an independent Claude verifier or checked against the code or the upstream source before any change (39 repaired, 2 refuted, 3 removed with the
second-distro target, 2 kept). A bounded re-check of those repairs (three gpt-6.1-sol jobs and one gpt-6-astra-ultra job) returned 33 more findings (19 graded: 16 confirmed, 3 partly), all repaired in a
fifth round: a false recovery claim in the settings-swap tool, signal handling that still left the client behind (first signal wins, deferred cleanups, client created under a spawn flag, a mutant
runner that shows each case failing without its guard), controls that could not fail, two claims without a recorded rerun. Adds the sanitized review record, a receipt with the re-check data, a correction
note in the four older receipts and native reruns of the scrub probe and the PATH digest.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant