Skip to content

Going incognito from an open chat forks it; the original is never flagged - #1

Merged
EveAeternam merged 2 commits into
mainfrom
fix/incognito-fork
Oct 13, 2026
Merged

EveAeternam merged 2 commits into
mainfrom
fix/incognito-fork

Conversation

@EveAeternam

Copy link
Copy Markdown
Collaborator

Requested by Evie · project thread

What changed and why

Before: Shell:B had no way to take an open chat incognito. /incognito and "New incognito chat" only started a blank incognito draft, and that draft flag stayed set after you opened another chat. A chat started later without going through "New chat" (Notes → "Brainstorm in a new chat", for example) was then created incognito without you choosing it. That's the likely way "Personal details and phobias" ended up flagged, with no separate original. This is inferred from the code, since nothing on the server ever flags an existing chat.

After: going incognito from an open chat forks it. POST /api/conversations/{id}/fork takes incognito: true and flags only the copy. /incognito in an open chat, and a new eye button beside Fork in the chat header, open that incognito copy (desktop and kiosk). On a blank chat, /incognito still starts an incognito draft. A leftover draft no longer leaks: opening a chat clears it, creating a chat clears it, and Notes → Brainstorm always starts a normal chat (desktop, mobile and kiosk).

How you tested it

  • New tests/incognito_fork_test.py: an incognito fork is flagged and has the messages, and the original stays normal with its messages. A plain fork stays normal, and a fork of an incognito chat stays incognito. Two of these fail without the server/app.py change.

  • py_compile, lint_test, i18n_test, changelog_test and tsc --noEmit pass. Full suite: 426 tests, 2 failures that also fail on main in this container. /api/models needs a local model engine, and integrity_test CellBackups breaks when run as root.

  • Not tried by hand in a browser.

  • scripts/check.sh passes (compile, pyflakes, tests, tsc). All steps were run individually, with the two environment failures above

  • User-visible change: entry added at the top of docs/changelog.json

  • New UI strings wrapped in t('…') with a French line in ui/src/i18n/fr.json

  • Manual or API docs updated where a route, tool or table changed. The fork route gained an optional incognito field and the docs weren't updated

  • No secrets, chats or personal data in the diff or the screenshots

New dependencies

None.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SoiLLmrxcq1QYVAqdPqcsC


Generated by Claude Code

…gged

The fork endpoint takes `incognito: true` and flags only the copy. /incognito and a
new header button fork the open chat into an incognito copy (desktop and kiosk);
on a blank chat they still start an incognito draft.

A leftover incognito draft no longer makes a later chat incognito: opening a chat
clears it, creating a chat clears it, and Notes → "Brainstorm in a new chat" always
starts a normal chat (desktop, mobile, kiosk).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SoiLLmrxcq1QYVAqdPqcsC
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SoiLLmrxcq1QYVAqdPqcsC
@EveAeternam
EveAeternam marked this pull request as ready for review October 13, 2026 01:50
@EveAeternam
EveAeternam merged commit a9eb62b into main Oct 13, 2026
2 checks passed
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