Skip to content

feat(status): offer don't clear for every status - #3515

Merged
wesbillman merged 1 commit into
mainfrom
feat/status-dont-clear
Nov 13, 2026
Merged

wesbillman merged 1 commit into
mainfrom
feat/status-dont-clear

Conversation

@kalvinnchau

@kalvinnchau kalvinnchau commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Problem

The status duration menu showed "Don’t clear" only when the current status already had no expiry. A new status, or one with a deadline, could not be set to persist.

Change

StatusEditor lists every entry in statusDurations, including "Don’t clear". Choosing it saves without expiresAt (existing duration === "never" path in submit).

Evidence

  • bin/pnpm exec vitest run src/features/user-status: 29/29 pass, including a new test that picks "Don’t clear" for a new status and asserts save gets no expiresAt; the existing quick-choice test now asserts the option is offered.
  • bin/pnpm check passes.
  • Exercised in the running app by the human author: choosing "Don’t clear" keeps the status.

🤖 Generated with Claude Code

the duration menu only listed "don't clear" when the current status
already had no expiry, so a new or expiring status could not be made
permanent. list it for every status; saving it omits expiresAt.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Kalvin Chau <[email protected]>
@kalvinnchau
kalvinnchau marked this pull request as ready for review November 13, 2026 22:11
@kalvinnchau
kalvinnchau requested a review from a team as a code owner November 13, 2026 22:11

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Carl, an automated reviewer, commenting via Wes’s GitHub account.

Verdict: no blockers. Not approving; that stays a human call.

  • The newly reachable case (an existing status with a deadline, switched to "Don’t clear") is sound: duration === "never" short-circuits expiresAt to undefined before the keep-current-deadline branch, and user-status.ts signs a full replacement event with no expiration tag, so the old expiry does not carry over.
  • The new test drives the same branch, so I don't think a second test for the deadline case is needed.
  • Product note for whoever merges: the original status feature (#228) hid "Don’t clear" unless the status already had no expiry. Its PR doesn't say why. This change deliberately reverses that, which looks right to me, but it's a behavior decision, not just a bug fix.

Merge criteria: the CI jobs still pending at head 42877ffe (Rust and tool integration, chromium 7/9, Vitest flake check) go green.

@wesbillman
wesbillman merged commit c41fbc6 into main Nov 13, 2026
62 checks passed
@wesbillman
wesbillman deleted the feat/status-dont-clear branch November 13, 2026 22:25
philazar added a commit that referenced this pull request Nov 13, 2026
…ve-client

* origin/main:
  feat(solo): smooth chat recency reordering (#3502)
  Reject self-mentions that cannot wake another session (#3513)
  feat(status): offer don't clear for every status (#3515)
  Let plugin panels name their tab with panels.useTabTitle (#3251)
  fix(agents): report a conversation wake that fails before its turn starts (#2192)
  fix(usage): read Claude transcripts over 50 MB a page at a time (#3498)
  feat(agents): preview where interrupted agents were working before resume (#3494)
  perf(messages): close the editor and delete dialog on submit (#3493)
  feat(messages): quote selected message text into the composer (#2392)
  perf(toast): scope docked clearance to the toast host (#3489)
  fix(unread): undo exact captured ordinary reads conditionally (#3473)

Signed-off-by: Philip Azar <[email protected]>
wpfleger96 added a commit that referenced this pull request Nov 14, 2026
…y-unreads

* origin/main: (24 commits)
  [1/2] feat(agents): add a recommended agent setup (core) (#3344)
  test(browser): survive the live-stream restart a page-clock jump causes (#3442)
  chore(renovate): hold rusqlite below 0.41 for mesh-llm (#3438)
  test(browser): serve the diffs and CLI reload fixtures outside the navigation budget (#3445)
  test(browser): play the draft clip at rate 0 instead of looping it before the Play click (#3446)
  fix(status): reopen a status whose preset deadlines coincide as Today (#3449)
  fix(messages): tolerate a cancelled reaction-name chunk load (#3450)
  fix(pairing): tolerate /proc/net/tcp rows printed twice or missed (#3451)
  test(browser): wait on the signal each test asserts in local-agent-activity and message-navigation (#3444)
  Expose native channel headings to Solo sources (#3523)
  test(browser-host): run the 100,000-channel broker scale check alone in the measurements lane (#3447)
  fix(solo): keep every contributed destination action (#3516)
  fix(identity): report an issuer that keeps rate-limiting an agent as a limit (#2365)
  fix(identity): let a stuck at-launch sign-in copy its link (#2453)
  fix(profiles): open avatar previews on hover in compact density (#3510)
  feat(solo): smooth chat recency reordering (#3502)
  Reject self-mentions that cannot wake another session (#3513)
  feat(status): offer don't clear for every status (#3515)
  Let plugin panels name their tab with panels.useTabTitle (#3251)
  fix(agents): report a conversation wake that fails before its turn starts (#2192)
  ...

# Conflicts:
#	tests/browser/message-management.spec.mjs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants