Skip to content

Terminal profiles: two picker resume profiles in the example fragment, landscape refresh after WSL 3.0.1 - #604

Merged
seathatflowsinourveins merged 6 commits into
mainfrom
claude/terminal-profiles-refresh-20261002
Oct 2, 2026
Merged

seathatflowsinourveins merged 6 commits into
mainfrom
claude/terminal-profiles-refresh-20261002

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

Scope

  • What this PR changes, in one or two sentences: the example Windows Terminal fragment gains two resume profiles that open each client's own session picker (exec codex resume, exec claude --resume), and the terminal decision record gains a dated landscape refresh after the WSL 3.0.1 update. The default profiles are unchanged and still start a new session.
  • Base commit: 49a4260029244e3e20d8b2dd3ada00af7983a3c9
  • Lane: lane:foundation
  • Owned paths touched: examples/claude-native/windows-terminal.fragment.example.json, tests/test_windows_terminal_defaults.py, adoption/platforms/linux-wsl2.md, docs/decisions/2026-09-28-terminal-experience.md, recipes/claude-native-profile.md (one clause), manifests/evidence.json (re-registration by the hot-file protocol).

SOTA sources

Every claim in the record's new section carries its own line-anchored source; the ones the change rests on:

  • Claude Code session picker: https://code.claude.com/docs/en/sessions ("Run /resume inside a session, or claude --resume with no arguments, to open the interactive session picker"); anthropics/claude-code CHANGELOG.md at v2.1.287.
  • Codex session picker: openai/codex at rust-v0.159.3 (commit 01fc69f4), codex-rs/cli/src/main.rs L2576 and codex-rs/tui/src/resume_picker.rs L674-L687; compared with rust-v0.160.0 (commit a956835d).
  • Windows Terminal: microsoft/terminal at v1.24.11911.0 (latest stable) for the bell handler, titles, the profile environment key, the settings loader and closeOnExit; v1.25.1912.0 (Preview) and the tag v1.26.2734.0 for the toast watch.
  • WSL launch line: microsoft/WSL at 3.0.1, src/windows/common/WslClient.cpp L1644-L1649 and src/linux/init/init.cpp L708-L735.

Evidence-class table

Claim Evidence class Command / receipt
The example fragment holds five profiles, each resume profile right after its default profile and equal to it except for name, command line and tab title; no AI profile passes a session-binding option synthetic python3 -B -m unittest tests.test_windows_terminal_defaults (42 tests, negative controls on in-memory copies)
What stays unchanged upstream, the toast watch and the options not adopted source_review the record's "Update 2026-10-02" section; the coordinator re-read 13 of its line-anchored citations at the named tags, 13 matched
On reload Windows Terminal writes a four-key entry for a new fragment profile and records its guid in state.json native_proven on one host, read from files only the record's "Host observation" subsection (2026-10-02, 08:16Z); no receipt file is added
Not established: the pickers were not opened from the menu by the author; Codex's focus-gated bell was not observed end to end n/a the record's "Not established" subsection

Local commands run

$ python3 -B -m unittest tests.test_adoption_contract tests.test_adoption_docs_consistency tests.test_release_pin_contents tests.test_install_claude_profile tests.test_windows_terminal_defaults tests.test_wsl_new_distro_recipe
exit 0
$ python3 -B scripts/validate.py
exit 0 {"components": 69, "hashed_files": 9145, "profiles": 4, "receipts": 186, "status": "passed"}

Decision record

docs/decisions/2026-09-28-terminal-experience.md, section "Update 2026-10-02: landscape refresh after the WSL 3.0.1 update, and two resume profiles". It reverses the "No resume profile" row of the 2026-09-29 update on the owner's direction (no cost was measured), and names an overturn condition for each option it does not adopt.

Host evidence

Not relevant: no file under evidence/hosts/ changes.

Checklist

  • New/changed GitHub Actions are pinned to a full commit SHA with a version comment (none changed).
  • New/changed workflows declare top-level permissions: contents: read (none changed).
  • No secrets are printed, logged or committed; no new required secret was added without a documented owner.
  • No new paid hosting, subscription or billing surface was introduced.
  • Peer-owned untracked files and worktrees were preserved (not deleted, moved or overwritten).

Built by a Sonnet 5.5 worker from a written contract and reviewed on Opus. Cross-family read: GPT-6.1 Sol at max effort read 2af4f953 with a local mirror of the cited upstream trees (comment 5948935862) and asked for changes; every point is repaired (comment 5948936255). The recipe's F10 wording, which the read also named, is changed in #593 because that file's hash is frozen in a record #593 owns (comment 5949290896).

🤖 Generated with Claude Code

Scout and others added 2 commits October 2, 2026 04:20
…, and a landscape refresh after the WSL 3.0.1 update

The owner asked for the terminal profiles, Codex side included, to be brought in line with current upstream. The
example fragment gains WSL - Codex - resume (`exec codex resume`) and WSL - Claude - resume (`exec claude --resume`):
each opens its client's own session picker, sits right after the profile it copies and differs from it only in
name, command line and tab title. The default profiles still start a new session.

The decision record gains "Update 2026-10-02": versions checked (Windows Terminal 1.24.11911.0, Claude Code 2.1.287,
Codex 0.159.3 against 0.160.0, WSL 3.0.1), what stays unchanged with its source, the toast watch (the tag
v1.26.2734.0 carries the notification flag and OSC 777; no release ships it, so no overturn condition is met), the
options considered and not adopted with their overturn conditions, one host's read-back of what Windows Terminal
wrote on reload, and what is not established.

Tests: tests/test_windows_terminal_defaults.py holds for five profiles (placement, copy keys, commands, barred
session options, COLORTERM on both Claude profiles) with negative controls on in-memory copies; 42 tests pass.

Built by a Sonnet 5.5 worker from a written contract; reviewed by the coordinator, who added the host observation
and spot-checked 13 line-anchored citations against upstream at the named tags.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Oct 2, 2026
Scout and others added 3 commits October 2, 2026 04:30
…its, three source attributions, two test gaps)

The GPT-6.1 Sol read of 2af4f95 asked for changes; each point was re-read at its source before the edit.

- The new-distribution recipe's F10 renames all five example profiles (it said three, which would have left the two
  resume profiles colliding with the workstation's in the same fragment folder).
- The record no longer says both pickers create nothing until a row is chosen: in Codex's picker Esc with an empty
  search starts a new session (resume_picker.rs L1248-L1250). It limits the empty-history behaviour to Codex, keeps
  Claude Code's as not established, narrows the changelog conclusion (terminal tab title, with the three other title
  entries and a third resume entry named), and qualifies the shell-type equivalence to a Bash account.
- Attributions: the permission request raises no desktop or BEL notification (it does signal the ambient pet);
  ConptyConnection.cpp L547 also treats STILL_ACTIVE as closed; the buffer file is written in TerminalPaneContent.cpp
  L145-L156, not at TerminalPage.cpp L2244.
- Tests: the copy rule now tells a missing key from a null one, and every example profile must keep hidden false;
  three new negative controls (both Codex profiles hidden, a profile without the key, a null key on one side). The
  earlier helper returned no problem for the null key.

42 tests pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Cross-family read of 2af4f953 (GPT-6.1 Sol, max effort, read-only sandbox, no network; a local mirror of the cited upstream trees at their tags was supplied; run 2026-10-02T08:25Z to 09:11Z by the merge-train session). Verdict: changes needed before merge. Every finding below was accepted and is repaired in the next push; the reviewer's own words follow unedited apart from path links.

changes needed before merge

should-fix — adoption/platforms/linux-wsl2-new-distro.md:630. The operative installation instructions still say to rename “three profiles” and list only Shell, Codex and Claude. Following those instructions leaves both resume profiles with their original names in the same fragment folder, so their identities collide with the first distro’s profiles.

Verified with rtk rg -n -i -U over all five requested directories, followed by reading F10 at lines 625–632. The pinned Terminal source confirms that the folder supplies the source namespace (v1.24.11911.0, src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp L369–378), and the source and profile name determine the GUID (Profile.cpp L307–319). A different JSON filename does not distinguish these profiles. Smallest repair: say “five profiles” and include <Name> - Codex - resume and <Name> - Claude - resume in the rename list. No other operative stale count or list was found; the recipe’s list is updated, and the older “No resume profile” row is historical and explicitly reversed.

should-fix — docs/decisions/2026-09-28-terminal-experience.md:608. “Both clients … create nothing until a row is chosen” is false for Codex. With an empty search query, Escape starts a new session without selecting a row.

Verified in rust-v0.159.3: codex-rs/tui/src/resume_picker.rs L1248–1250 returns SessionSelection::StartFresh; its upstream test at L7270–7286 explicitly checks Escape’s behavior. tui/src/app/startup.rs L397–408 handles StartFresh by calling spawn_startup_thread_start, whose implementation at L16–36 starts a thread. The cited cli/src/main.rs L2576 establishes that the picker opens; it does not establish the creation restriction. Smallest repair: say that nothing resumes automatically, and document Codex’s Escape-to-new-session behavior.

should-fix — docs/decisions/2026-09-28-terminal-experience.md:620. The conclusion that the picker “neither collides nor fails on an empty history” exceeds the evidence presented for both clients. Line 637 expressly says Claude’s empty-history behavior was neither established by documentation nor run. Line 610 also acknowledges that choosing an already-open Claude session can interleave transcripts.

Verified by reading those three sentences together. The mirrored Codex code supports its own empty-list behavior (resume_picker.rs L3564); the cited Codex --last fallback cannot establish Claude picker behavior. Smallest repair: distinguish deliberate selection from automatic session reuse, limit the established empty-history behavior to Codex, and retain Claude’s stated uncertainty.

should-fix — docs/decisions/2026-09-28-terminal-experience.md:581. The changelog conclusion is broader than the entries support. There are title-related changes, including session-title request handling at L37, title-generation model fallback at L274, and the VS Code tab-name fix at L330. Also, “Two concern the new profiles” omits L256, which fixes compacting or resuming sessions failing, losing their history, or crashing on malformed stored fields.

Verified by reading claude-code@v2.1.287/CHANGELOG.md L3–341. The requested case-insensitive scan recomputed 330 bullet entries and 35 matching lines, so those counts are correct; the interpretation needs narrowing. Smallest repair: distinguish terminal title handling from the other title changes, and describe the two named resume entries as examples rather than the complete relevant set, including L256.

should-fix — docs/decisions/2026-09-28-terminal-experience.md:621. “The startup files are the same” requires the account’s default shell to be the same Bash executable that the fragment selects. The WSL source does not guarantee that.

Verified in WSL@3.0.1/src/linux/init/init.cpp L716–725: the shell form chooses PasswordEntry->pw_shell, falling back to /bin/sh; the fragment explicitly chooses /bin/bash. L729–749 constructs login-shell argv[0]. The row itself later acknowledges the account-shell distinction. Smallest repair: qualify the equivalence as applying to the workstation’s Bash account.

note — docs/decisions/2026-09-28-terminal-experience.md:587. “Raises no notification of any kind” is too broad. The cited handler has no desktop-notification notify call, but L479–482 explicitly calls set_ambient_pet_notification(Waiting, None). tui/src/chatwidget/pets.rs L63–70 forwards that notification to a configured pet. Smallest repair: say “raises no desktop/BEL notification through [tui] notifications.”

note — docs/decisions/2026-09-28-terminal-experience.md:618. The nonzero-exit claim omits the STILL_ACTIVE exception. At the cited ConptyConnection.cpp L547, both zero and STILL_ACTIVE produce ConnectionState::Closed; other values produce Failed. The preceding comment explains the console-detachment case. Smallest repair: state that graceful retains failed connections, with the source’s STILL_ACTIVE exception.

note — docs/decisions/2026-09-28-terminal-experience.md:616. The literal attribution “TerminalPage.cpp L2244 writes the buffers” points to a delegation call, not the buffer write. It calls BuildStartupActions, selecting PersistAll when requested. The actual write is _control.PersistToPath(path) in src/cascadia/TerminalApp/TerminalPaneContent.cpp L145–156, specifically L155. Smallest repair: describe L2244 as requesting persistence, or cite the actual write.

note — tests/test_windows_terminal_defaults.py:122. resume_copy_problems does not distinguish a missing key from an explicit null because it compares dict.get() values. Adding "icon": null only to the Codex resume profile produces unequal key sets but returns []; check_fragment also accepts it.

Verified by importing the module with python3 -B -c and mutating an in-memory copy. Output:

default has icon False resume has icon True resume_copy_problems []
null extra key check_fragment PASS

Smallest repair: compare the dictionaries after removing name, commandline and tabTitle, preserving key presence.

A separate functional defect the tests would miss is setting hidden: true on both Codex profiles. With that in-memory mutation, check_fragment passed and the entire 12-test FragmentExampleTests class returned OK. Smallest repair for that gap: explicitly require the shipped profiles to remain visible. These are coverage gaps; the checked-in fragment currently has neither defect.

note — docs/decisions/2026-09-28-terminal-experience.md:616. The required citation audit follows. Paths are relative to each mirrored repository; Codex paths include codex-rs/. “Matches” means source support, not observed client execution. Comment anchors are identified where the operative statement follows nearby. Repairs for the mismatches are stated above.

Every line-anchored citation in “Considered and not adopted”:

Tag and file Cited lines Result
Terminal v1.24.11911.0, src/cascadia/TerminalApp/TerminalPage.cpp 2244 Partial: delegates persistence; the actual buffer write is in TerminalPaneContent.cpp L155.
Same file 3610 Matches the restore path’s creation of a connection from settings; the expression also permits an explicitly supplied existing connection.
Terminal v1.24.11911.0, src/cascadia/TerminalSettingsModel/TerminalSettings.cpp 136 Matches as a comment anchor; the command-line override is applied at L137–141.
Terminal v1.25.1912.0, src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h 269 Matches: legacy value maps to PersistedLayoutAndContent.
Terminal v1.25.1912.0, src/cascadia/TerminalSettingsModel/GlobalAppSettings.cpp 208 Matches as a comment anchor; L209–211 marks the legacy value for fixup.
Terminal v1.25.1912.0, src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp 1274–1284 Matches the fixup-to-write condition; the actual write call follows at L1286.
Terminal v1.24.11911.0, src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h 265 Matches: the mapping at L263–265 has the two stated values.
Terminal v1.24.11911.0, doc/cascadia/profiles.schema.json 430; 1550 Both match: multipleActions is listed and defined.
Terminal v1.24.11911.0, src/cascadia/TerminalConnection/ConptyConnection.cpp 547 Overstated: includes the STILL_ACTIVE exception to the nonzero-exit claim.
Terminal v1.24.11911.0, src/cascadia/TerminalApp/TerminalPaneContent.cpp 246–253 Matches the graceful/never connection-state behavior.
Terminal v1.24.11911.0, src/cascadia/TerminalConnection/Resources/en-US/Resources.resw 206–211 Matches both exit-message and Enter-to-restart strings.
Terminal v1.24.11911.0, src/cascadia/TerminalControl/ControlCore.cpp 2522; 2532; 2541 Each matches: GotFocus, LostFocus, and _focusChanged; L2546–2550 forwards the generated input.
Same file 218–228 Matches: 25 ms debounce and the _focusChanged callback.
Terminal v1.24.11911.0, src/cascadia/TerminalCore/Terminal.cpp 789–792 Matches: forwards focus to HandleFocus.
Terminal v1.24.11911.0, src/terminal/input/terminalInput.cpp 317–325 Matches: focus-event mode gates the focus-in/out sequence.
Codex rust-v0.159.3, codex-rs/tui/src/tui.rs 258–259 Matches: non-Windows builds request focus reports.
Codex rust-v0.159.3, codex-rs/tui/src/lib.rs 997–1012 Matches the local directory filter; show_all and remote-workspace branches are explicit.
Same file 1605–1608 Matches: no latest-session target yields StartFresh.
Same file 1409–1428 Matches the fatal missing-session error; it does not establish both clients’ empty-picker behavior.
WSL 3.0.1, src/linux/init/init.cpp 708–735 Matches shell selection and the documented dash-prefix convention; the assignments are at L748–749. Does not establish identical startup files for a non-Bash account.
WSL 3.0.1, localization/strings/en-US/Resources.resw 399–436 Matches: help resource contains --exec, --shell-type, and --cd.
WSL 3.0.1, src/windows/common/WslClient.cpp 1803–1838 Matches: direct argv parsing in exec mode versus passing a raw command to the account’s shell.

Every line-anchored citation in “Host observation,” all in Terminal v1.24.11911.0, src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp:

Cited lines Result
1067–1095 Matches: reuse an existing user profile or create a child with the fragment profile as parent.
515–539 Matches: record newly encountered generated GUIDs and return whether settings need saving.
1274–1287 Matches: newly generated profiles cause a settings write.
521–531 Matches: a previously recorded generated profile absent from the user entries is marked deleted and hidden.
1069–1073 Matches: a matching user GUID receives the fragment profile as a parent.
1444–1458 Matches: a user profile with a source needs a matching-source parent; orphaned profiles are excluded from active profiles.
878–879 Matches: fragment support is limited to schemes and profiles.

Additional citations checked across “Confirmed unchanged,” “The toast watch,” and “Decision: two resume profiles”:

Tag and file Cited lines Result
Terminal v1.24.11911.0, src/cascadia/TerminalApp/TerminalPaneContent.cpp 276; 293; 299–300 Each matches the audible, pane-flash, and taskbar flag checks.
Terminal v1.25.1912.0, same path 272; 289; 295–296 Each matches the corresponding Preview handler. The complete function text is byte-equal.
Terminal v1.24.11911.0, src/cascadia/WindowsTerminal/IslandWindow.cpp 922 Matches the unfocused-window taskbar comment and following call.
Terminal v1.24.11911.0, src/cascadia/TerminalCore/TerminalApi.cpp 87 Matches the application-title suppression guard.
Terminal v1.24.11911.0, src/cascadia/TerminalConnection/ConptyConnection.cpp 118 Matches as the WSLENV comment anchor; L116 sets the environment value and L119–122 adds the key.
Claude Code v2.1.287, CHANGELOG.md 3–341; 284; 117 Named resume entries and scan counts match. The broad title conclusion and exhaustive “Two” interpretation do not.
Codex rust-v0.159.3, codex-rs/tui/src/chatwidget/notifications.rs 72–99 Matches notification names and plain-string equality.
Codex rust-v0.159.3, codex-rs/tui/src/notifications/mod.rs 22–27; 53–62 Both match: automatic BEL fallback and the stated OSC 9 terminal list.
Codex rust-v0.159.3, codex-rs/tui/src/tui.rs 114–119; 1004–1008 Both match focus gating under Unfocused; Always is explicitly supported.
Codex rust-v0.159.3, codex-rs/tui/src/chatwidget/notifications.rs 19–22 Matches: the pending notification is taken before attempting delivery.
Codex rust-v0.159.3, codex-rs/tui/src/chatwidget/tool_requests.rs 467–484 No desktop notify call, but an ambient-pet notification is present. “Of any kind” is overstated.
Codex rust-v0.159.3, codex-rs/tui/src/bottom_pane/mod.rs 1856–1864 Matches creation and display of the approval overlay.
Codex rust-v0.159.3, codex-rs/tui/src/bottom_pane/approval_overlay.rs 620–622 Matches: the overlay reports that action is required.
Codex rust-v0.159.3, codex-rs/tui/src/bottom_pane/bottom_pane_view.rs 157–164 Matches the documented “Action Required” title contract.
Codex rust-v0.159.3, codex-rs/config/src/types.rs 896–903 Matches the default title items and activity behavior.
Codex rust-v0.159.3, codex-rs/tui/src/terminal_palette.rs 43–75 Matches promotion to truecolor with WT_SESSION and no FORCE_COLOR override.
WSL 3.0.1, src/windows/common/WslClient.cpp 1644–1649 Matches: exec mode consumes the option and stops parsing.
WSL 3.0.1, src/linux/init/init.cpp 708–735; 816 Matches direct filename handling and execvpe; an implicit shell is used only in the shell branch.
Terminal v1.26.2734.0, src/cascadia/TerminalSettingsModel/Profile.idl 32 Matches Notification = 0x8; L33 defines All = 0xffffffff.
Terminal v1.26.2734.0, src/cascadia/TerminalSettingsModel/TerminalSettingsSerializationHelpers.h 118 Matches the "notification" mapping.
Terminal v1.26.2734.0, src/terminal/parser/OutputStateMachineEngine.hpp 230 Matches UrxvtAction = 777.
Codex rust-v0.159.3, codex-rs/cli/src/main.rs 2576 Matches picker selection with no ID and no --last; does not prohibit Escape starting fresh.
Codex rust-v0.159.3, codex-rs/tui/src/resume_picker.rs 674–687; 204–226 Both match directory filtering and switching between directory/all filters.
Same file 3564; 4672 Both match: empty-list text and the footer test expectation, including esc new.
Claude Code v2.1.287, CHANGELOG.md 405 Matches the change to default auto permission mode; does not establish whether picked sessions restore their stored mode.

The platform page’s additional serialization citations also match: Terminal v1.24.11911.0, CascadiaSettingsSerialization.cpp L1602 writes the settings model, with four-space indentation configured at L1597; JsonUtils.h L359–389 accepts a scalar as a one-element list, and L549–551 initializes array serialization. No wrong-file citation was found.

note — docs/decisions/2026-09-28-terminal-experience.md:583. Both requested identity checks match the record. No repair is indicated.

For each Codex file, I ran rtk cmp -s between the two mirrored tags. These are the returned exit codes:

File under codex-rs/ cmp exit
config/src/types.rs 0
tui/src/chatwidget/notifications.rs 0
tui/src/notifications/mod.rs 0
tui/src/terminal_palette.rs 0
tui/src/terminal_title.rs 0
tui/src/tui.rs 0
tui/src/tui/keyboard_modes.rs 0
tui/src/chatwidget/tool_requests.rs 0
tui/src/bottom_pane/bottom_pane_view.rs 0
tui/src/cli.rs 0
cli/src/main.rs 0
tui/src/lib.rs 1
tui/src/resume_picker.rs 1

For WSL I ran:

rtk cmp -s \
  <(rtk sed -n '1553,1821p' /var/tmp/c5-terminal/mirror/WSL@2.7.14/src/windows/common/WslClient.cpp) \
  <(rtk sed -n '1573,1841p' /var/tmp/c5-terminal/mirror/WSL@3.0.1/src/windows/common/WslClient.cpp)

It returned exit 0, with no output. A separate raw-byte comparison using read_bytes().splitlines(keepends=True) returned True, with 269 lines in each range.

The schema comparison also returned exactly four added leaves under compatibility.ambiguousWidth, with no removed or changed leaves. The available toast schemas yielded false for stable and Preview and true for v1.26.2734.0; only that available tag contained compatibility.allowOSC777, defaulting to false.

note — examples/claude-native/windows-terminal.fragment.example.json:25 and tests/test_windows_terminal_defaults.py:432. The current resume profiles have identical key sets to their defaults, with differences limited to name, commandline and tabTitle. Comparing the base fragment also returned True for unchanged Shell, Codex and Claude defaults. No fragment repair is indicated by those checks.

Direct module import and in-memory calls verified all 55 new negative controls: each raised the named assertion for the intended placement, membership, GUID, copy, title, bell, exit, command, environment or forbidden-flag rule. The five existing profile controls also raised the expected policy assertion. The direct flag-spelling tests passed.

Running the fragment and documentation classes through direct import returned:

Ran 16 tests in 0.011s
OK

note — docs/decisions/2026-09-28-terminal-experience.md:557. The reversal is stated plainly: the owner’s direction replaces the earlier decision despite its measured-cost overturn condition not being met. The historical section was preserved exactly.

Using rtk proxy git show 49a4260029244e3e20d8b2dd3ada00af7983a3c9:docs/decisions/2026-09-28-terminal-experience.md and comparing raw bytes returned:

decision base bytes 110919 lines 553 is exact HEAD prefix True
appended bytes 22758 earlier changed bytes 0

No repair is indicated.

note — docs/decisions/2026-09-28-terminal-experience.md:642, adoption/platforms/linux-wsl2.md:221, and recipes/claude-native-profile.md:43. I found no sentence in the added text or edited recipe that expressly presents source reading as observed client-session execution, or observed execution as source-only evidence. The stronger-than-source conclusions are identified above.

“Host observation” stays within its stated file-readback scope: it describes saved entries, timestamps, generated GUID state and a file-based profile check, then identifies the explanatory source paths. It expressly says no tab was opened. That wording does not claim a tested picker, audible bell, focus transition or rendered menu. I could not independently confirm the workstation observations. No evidence-class wording repair is otherwise indicated.

What I could not check, and why:

  • Documentation pages: no network access and no supplied copies of code.claude.com, Microsoft Learn, or the Codex configuration reference. Their notification, session, permission-restoration and documentation-absence claims remain unverified here.
  • GitHub release metadata: latest-release status, publication dates, tag dates, missing-release 404 responses, channel assignments and the quoted Codex 0.160.0 release notes require unavailable network responses.
  • The complete toast signals: terminal@v1.25.2733.0 is absent from the supplied mirror. The clones are shallow: rtk git … rev-parse --is-shallow-repository returned true, and cat-file -t 93bdbfaa returned exit 128, fatal: Not a valid object name 93bdbfaa. I could not recompute ancestry or ahead/behind counts.
  • Installed clients and host behavior: their binaries and workstation files were outside the permitted evidence. I did not check installed versions, Claude’s binary color function, settings-reload timing, the seven-profile host check, or open any terminal/client session.
  • The normal unittest entry point and temporary-directory tests: importing tests attempts to create a hermetic Git directory and failed with FileNotFoundError: No usable temporary directory found. Direct import bypassed that package setup for the 16 read-only tests above. The two Codex-template rendering cases also failed solely when creating temporary directories; I did not treat those sandbox failures as product failures.

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Repaired head 5830aa26 (2026-10-02T09:14:36Z). All five should-fix points and the notes with a repair are in; each was re-read at its source before the edit.

  • F10 of the new-distribution recipe now renames all five example profiles (the two resume profiles would otherwise have collided with the first distribution's in the same fragment folder).
  • Picker claims: the record no longer says both pickers create nothing until a row is chosen. It states that neither resumes a session until the operator acts, and that in Codex's picker Esc with an empty search starts a new session (resume_picker.rs L1248-L1250) while Ctrl+C leaves (L1241-L1247). The empty-history behaviour is limited to Codex; Claude Code's stays under "Not established".
  • Changelog row: narrowed to how the terminal tab title is set; the three other title entries (L37, L274, L330) are named, and the resume entries are given as examples with L256 added.
  • --shell-type login row: the equivalence is qualified to an account whose shell is Bash (init.cpp L714-L749).
  • Attributions: no desktop or BEL notification for a permission request (the ambient-pet signal at L479-L482 is named); ConptyConnection.cpp L547's STILL_ACTIVE case; the buffer write is cited at TerminalPaneContent.cpp L145-L156.
  • Tests: resume_copy_problems tells a missing key from a null one (the earlier helper returned [] for a null icon on one side; the repaired one returns the difference), and every example profile must keep hidden false. Three new negative controls: both Codex profiles hidden, a profile without the key, a null key on one side. 42 tests pass; validate.py passes.

Not repaired because not checkable by the reviewer, and unchanged: the documentation-page quotes, the release metadata and the workstation observations (the read lists them under what it could not check). A re-read of this small delta is not planned: every change is a narrowing of a claim to what its cited source says, or a stricter test.

…its F10 wording moves to pull request 593

The recipe file's hash is frozen in the convergence record that pull request 593 owns
(blueprints/convergence-practice/wsl-new-distro-image-20261001/experiment.json), so the one-sentence F10 change made
hosted validation fail here ("frozen_inputs.sources[0]: SHA-256 mismatch"). The file is back at main's copy. Pull
request 593 changes F10 to rename every profile of the example without naming a count, which holds for the example
with three profiles and with five.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Head 3231dbf5 (2026-10-02T09:34:09Z): the recipe file is back at main's copy; F10's wording moves to #593.

The previous head failed hosted validation: the new-distribution recipe's hash is frozen in the convergence record that #593 owns (frozen_inputs.sources[0]: SHA-256 mismatch), and my one-sentence F10 change altered the file. #593 changes F10 to rename every profile of the example without naming a count, which is true for the example with three profiles and with five, so the order in which the two pull requests merge does not matter. The other repairs of the read are unchanged. Local run of the hosted command: validate_convergence.py --all-recorded --root . --json reports 26 records, none invalid.

My branch helper ran validate.py only; it now runs the convergence validator too, so this class of failure is caught before a push.

@seathatflowsinourveins
seathatflowsinourveins merged commit 63c6b53 into main Oct 2, 2026
25 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the claude/terminal-profiles-refresh-20261002 branch October 2, 2026 10:07
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