Skip to content

workspace: rename topics to projects, each a folder with an AGENTS.md - #189

Merged
mutewinter merged 9 commits into
mainfrom
rename/topics-to-projects
Nov 3, 2026
Merged

mutewinter merged 9 commits into
mainfrom
rename/topics-to-projects

Conversation

@mutewinter

Copy link
Copy Markdown
Contributor

What a chat is filed under is now a project everywhere: code, routes, UI copy, agent text, docs and the wireframe kit. Topics had become long-running places of their own (the agent keeps reference files in one and works from its instructions), which is what everyone else calls a project, and 1.x called them that too.

On disk

  • A project is any folder in Projects/<Name>/, the system's clutter aside. Its instructions are the AGENTS.md in it, the name coding agents already read, so another agent opened in the folder gets the same instructions. Front matter is optional: a copied-in AGENTS.md with none, or a bare folder, is a project.
  • A project whose file names no id goes by one drawn from its folder name (folderProjectId), the same on every computer, and listing it writes nothing. Filing a chat under it writes the id into the file first (saveProjectId), so a later folder rename keeps the chat in it. New ids take prj_; existing top_ ids stay valid.

Agent

  • The project note and the system prompt's finished-file rule say a project's folder is where its lasting files go, so a finished file the user gave no place for goes there before the chat's own folder. No eval run; the change reads as the rule it states.

Existing data

  • Topics/ and each TOPIC.md move into Projects/ on every launch.
  • Read under both names: settings set lines (topic field), permissions.json (topics), DRAFT.md (topic:), stored parts (data-topic, data-topics, setup changes of kind topic), 1.x chat.db rows, and the activity log's purposes and surface. workspace.db is rebuilt (index version bump).
  • 1.x workspaces go straight to projects, each keeping its 1.x prj_ id. On a case-insensitive disk 1.x's lowercase projects/ is the same folder as Projects/, so the layout sweep first moves it into .instrument/1x-projects/; before that, the sweep would have set aside the projects it had just made.

Not kept: chats.setTopic, instrument://new?topic= (now ?project=), event and RPC names. The phone app reads topic from chat-list.json and needs project.

Plan and full list of what is read under both names: docs/plans/topics-to-projects-rename.md.

Checked: workspace, studio and shared unit suites, types, lint, knip, docs. Not checked: the app driven end to end.

The editor's link plugin followed a Cmd-click in place and took Shift
for a new tab, and it consumed the click, so the window's own
Cmd-click-is-a-new-tab rule never ran. Cmd-click (Ctrl off macOS) or a
middle click now opens a new tab, on the link in the text and on the
address in its tooltip; a plain click on that address opens the link in
place, and the right-click menu offers both.

Rejected: Cmd-Shift-click to open in place | not a standard gesture; the tooltip's address already opens in place
Commits-to: no Shift bindings on editor links; a modified click means a new tab, as everywhere else in the window
Not-tested: Cmd-click on the tooltip's address; the expanded file view in the running app
Android voice recorders and older phones save sound in .3gp, which is
typed as video by its extension. The extensions read before the icon
and kind are chosen are now one table (WebM, 3GP, 3G2), each with the
audio type a file of it has when it holds no picture.

Rejected: probe .mp4/.mov/.mkv too | sound-only files there are rare (.m4a/.mka exist) and they are the most common video files, so reading each costs ffprobe runs for little
…info

The computer line read "macOS (darwin 27.0.0)" or "Windows (win32
10.0.26100)". Windows 11 keeps the 10.0 release, so a model told the
release names it Windows 10, and Darwin's number is not the macOS
version. Two Macs on the same OS also read as one computer, so a chat
moving between them got no environment-change note.

It now reads "Studio's Mac Studio, macOS 27.0.1", "Blue's PC, Windows
11 (build 26100)", "Ubuntu 24.04 LTS (Linux 6.8.0)": the name the
device file uses (Computer Name, else host name), macOS's
SystemVersion.plist, the Windows build, /etc/os-release. Read once per
process. The GNU-shell line that stopped BSD `stat -f` is unchanged.

Commits-to: the computer line carries the computer's name, so a change of computer is told even when the OS matches
Not-tested: the Linux branch; an eval run (agent behavior only gains a fact)
Asked "what version is this", an agent loaded instrument-guide, found
nothing, then read /Applications/Instrument.app's Info.plist with
Python: Mac-only, and the bundle on disk rather than the running app.
Loading the bundled guide now appends a "This build" section with the
app version and a link to Version and updates.

Rejected: the version in system info | goes stale after an update in a chat whose start is never rewritten, and is rarely asked
Not-tested: an eval run; the transcript already showed the agent loading the guide for this question
What a chat is filed under is now a project everywhere: code, routes,
UI copy, agent text, docs and the wireframe kit. A project is any folder
in Projects/<Name>/, and its instructions are the AGENTS.md in it, with
front matter optional, so an AGENTS.md copied in, or a bare folder, is a
project. One with no id in its file goes by an id drawn from its folder
name until a chat is filed under it, which writes the id down first.

The agent is told a project's folder is where its lasting files go, and
a finished file the user gave no place for goes there before the chat's
own folder.

Existing data: Topics/ and each TOPIC.md move into Projects/ at every
launch; settings lines, permissions.json, DRAFT.md, stored parts, 1.x
chat.db rows and the activity log read the old names; workspace.db is
rebuilt. 1.x workspaces go straight to projects, keeping each 1.x
project's id. The layout sweep first moves 1.x's lowercase projects/
into .instrument/1x-projects/, since on a case-insensitive disk it is
the same folder as Projects/ and the sweep would otherwise set aside
the projects it had just made.

Rejected: PROJECT.md as the file | a name only Instrument reads; AGENTS.md is what coding agents already read in a folder, and what 1.x projects used
Rejected: writing an id into every AGENTS.md on first sight | edits a file the person may keep in git before anything needs the id
Rejected: rewriting top_ ids to prj_ | the ids are in append-only logs on every device
Commits-to: every folder in Projects/ is a project, the system's clutter aside
Commits-to: anything that stores a project id calls saveProjectId first
Commits-to: 1.x's projects/ is read only from legacyProjectsDir, never the workspace's top level
Not-tested: the agent following the new placement rule, by eval
Not-tested: the app driven end to end; checked by unit suites in workspace, studio and shared
@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 235 files, which is 135 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: aa5778f3-f5ba-44da-ae0f-324639fb2834
Commits

Reviewing files that changed from the base of the PR and between 1a1739a and 7205439.

Files selected for processing: 235
  • .agents/skills/chat-database-query/SKILL.md
  • .agents/skills/studio-chrome-devtools/SKILL.md
  • .agents/wireframe-kit/KIT.md
  • .agents/wireframe-kit/baseline.js
  • .agents/wireframe-kit/kit/chat.js
  • .agents/wireframe-kit/kit/compose.js
  • .agents/wireframe-kit/kit/inbox.js
  • .agents/wireframe-kit/kit/marks.js
  • .agents/wireframe-kit/kit/scenario.js
  • .agents/wireframe-kit/measure/capture.mjs
  • AGENTS.md
  • apps/studio/smoke-test.spec.ts
  • apps/studio/src/client/atoms/project-details-modal.ts
  • apps/studio/src/client/atoms/topic-details-modal.ts
  • apps/studio/src/client/atoms/window.ts
  • apps/studio/src/client/components/chat-stream-data-parts.tsx
  • apps/studio/src/client/components/icons/folder-glyph.tsx
  • apps/studio/src/client/components/settings/activity-section.tsx
  • apps/studio/src/client/components/settings/settings-index.ts
  • apps/studio/src/client/components/settings/storage-section.tsx
  • apps/studio/src/client/components/setup-changes-note.tsx
  • apps/studio/src/client/components/setup/steps/folder.tsx
  • apps/studio/src/client/components/studio-modals/project-details-modal.tsx
  • apps/studio/src/client/components/studio-modals/studio-modals.tsx
  • apps/studio/src/client/components/studio-modals/topic-details-modal.tsx
  • apps/studio/src/client/components/window/app-identity-chip.tsx
  • apps/studio/src/client/components/window/app-window.tsx
  • apps/studio/src/client/components/window/chat-header.tsx
  • apps/studio/src/client/components/window/chat-list.tsx
  • apps/studio/src/client/components/window/chat-pane.tsx
  • apps/studio/src/client/components/window/chat-row.browser.test.tsx
  • apps/studio/src/client/components/window/chat-row.tsx
  • apps/studio/src/client/components/window/chat-window.tsx
  • apps/studio/src/client/components/window/chats.test.ts
  • apps/studio/src/client/components/window/chats.ts
  • apps/studio/src/client/components/window/command-menu.browser.test.tsx
  • apps/studio/src/client/components/window/command-menu.test.tsx
  • apps/studio/src/client/components/window/command-menu.tsx
  • apps/studio/src/client/components/window/compose-layer.tsx
  • apps/studio/src/client/components/window/compose-window.tsx
  • apps/studio/src/client/components/window/draft-row.browser.test.tsx
  • apps/studio/src/client/components/window/draft-row.tsx
  • apps/studio/src/client/components/window/emoji-suggestions.ts
  • apps/studio/src/client/components/window/filter-head.test.tsx
  • apps/studio/src/client/components/window/filter-head.tsx
  • apps/studio/src/client/components/window/project-banner.tsx
  • apps/studio/src/client/components/window/project-colors.ts
  • apps/studio/src/client/components/window/project-dialog.browser.test.tsx
  • apps/studio/src/client/components/window/project-dialog.test.tsx
  • apps/studio/src/client/components/window/project-dialog.tsx
  • apps/studio/src/client/components/window/project-mark-picker.tsx
  • apps/studio/src/client/components/window/project-mark.tsx
  • apps/studio/src/client/components/window/project-menu.tsx
  • apps/studio/src/client/components/window/project-picker.tsx
  • apps/studio/src/client/components/window/project-tint.ts
  • apps/studio/src/client/components/window/row-shell.ts
  • apps/studio/src/client/components/window/shell-context.ts
  • apps/studio/src/client/components/window/tab-strip.tsx
  • apps/studio/src/client/components/window/use-chat-search-fallback.ts
  • apps/studio/src/client/components/window/use-draft-project-suggestion.ts
  • apps/studio/src/client/components/window/use-drafts.ts
  • apps/studio/src/client/components/window/use-project-backfill.ts
  • apps/studio/src/client/components/window/use-set-chat-project.ts
  • apps/studio/src/client/components/window/use-window-commands.test.tsx
  • apps/studio/src/client/components/window/use-window-commands.ts
  • apps/studio/src/client/drafts/store.test.tsx
  • apps/studio/src/client/hooks/use-decision-personal.test.tsx
  • apps/studio/src/client/hooks/use-decision.ts
  • apps/studio/src/client/hooks/use-refresh-projects-on-change.ts
  • apps/studio/src/client/routes/_app/route.tsx
  • apps/studio/src/client/routes/debug/-transcript/scenarios.ts
  • apps/studio/src/client/styles/globals.css
  • apps/studio/src/electron-main/drafts/draft-record.ts
  • apps/studio/src/electron-main/drafts/draft-store.test.ts
  • apps/studio/src/electron-main/drafts/draft-store.ts
  • apps/studio/src/electron-main/drafts/send-asked-drafts.test.ts
  • apps/studio/src/electron-main/drafts/send-asked-drafts.ts
  • apps/studio/src/electron-main/lib/migration-rehearsal.test.ts
  • apps/studio/src/electron-main/lib/outside-links.ts
  • apps/studio/src/electron-main/lib/refused-files.test.ts
  • apps/studio/src/electron-main/lib/start-workspace.ts
  • apps/studio/src/electron-main/lib/workspace-launch-sweeps.ts
  • apps/studio/src/electron-main/lib/workspace-move.ts
  • apps/studio/src/electron-main/lib/workspaces.ts
  • apps/studio/src/electron-main/rpc/routes/files.test.ts
  • apps/studio/src/electron-main/rpc/routes/utils.ts
  • apps/studio/src/electron-main/rpc/routes/window.ts
  • apps/studio/src/electron-main/windows/app-window-asks.ts
  • apps/studio/src/shared/dev-instance-colors.ts
  • apps/studio/src/shared/dictation.ts
  • apps/studio/src/shared/drafts.test.ts
  • apps/studio/src/shared/drafts.ts
  • apps/studio/src/shared/features.ts
  • apps/studio/src/shared/instrument-folders.test.ts
  • apps/studio/src/shared/instrument-folders.ts
  • docs/architecture/agent-sandbox.md
  • docs/architecture/bash-sandbox-mounts-and-native-binaries.md
  • docs/architecture/chat-records.md
  • docs/architecture/deep-links.md
  • docs/architecture/drafts.md
  • docs/architecture/system-overview.md
  • docs/architecture/threat-model.md
  • docs/plans/README.md
  • docs/plans/topics-to-projects-rename.md
  • docs/reviews/2026-10-19-layout-merge-hunt.md
  • packages/shared/src/front-matter.ts
  • packages/shared/src/instrument-link.test.ts
  • packages/shared/src/instrument-link.ts
  • packages/workspace/.oxlintrc.json
  • packages/workspace/AGENTS.md
  • packages/workspace/evals/cases/app-scripting-api.ts
  • packages/workspace/evals/cases/handoff.ts
  • packages/workspace/evals/cases/permissions.ts
  • packages/workspace/evals/cases/unprompted-tools.ts
  • packages/workspace/evals/cases/workspace-parts.ts
  • packages/workspace/evals/decision/cli.ts
  • packages/workspace/evals/decision/corpus/README.md
  • packages/workspace/evals/decision/corpus/backfill.json
  • packages/workspace/evals/decision/corpus/drafts.json
  • packages/workspace/evals/decision/shapes.ts
  • packages/workspace/evals/handoff-matrix.ts
  • packages/workspace/evals/harness.ts
  • packages/workspace/evals/lib/run-record.ts
  • packages/workspace/src/agents/instrument.ts
  • packages/workspace/src/client.ts
  • packages/workspace/src/constants.ts
  • packages/workspace/src/electron.ts
  • packages/workspace/src/lib/activity/log-file.ts
  • packages/workspace/src/lib/activity/schema.ts
  • packages/workspace/src/lib/app-data-rules.test.ts
  • packages/workspace/src/lib/apps/context.ts
  • packages/workspace/src/lib/attached-file-grant.test.ts
  • packages/workspace/src/lib/chat-folders/chat-markdown.test.ts
  • packages/workspace/src/lib/chat-folders/chat-markdown.ts
  • packages/workspace/src/lib/chat-folders/first-folders.ts
  • packages/workspace/src/lib/chat-writes.test.ts
  • packages/workspace/src/lib/chat/asks.test.ts
  • packages/workspace/src/lib/chat/chat-list-file.ts
  • packages/workspace/src/lib/chat/chats.test.ts
  • packages/workspace/src/lib/chat/chats.ts
  • packages/workspace/src/lib/chat/folder-reach.test.ts
  • packages/workspace/src/lib/chat/folder-reach.ts
  • packages/workspace/src/lib/chat/live-chat-list.ts
  • packages/workspace/src/lib/chat/project-file.test.ts
  • packages/workspace/src/lib/chat/project-file.ts
  • packages/workspace/src/lib/chat/project-folder-reach.test.ts
  • packages/workspace/src/lib/chat/projects.test.ts
  • packages/workspace/src/lib/chat/projects.ts
  • packages/workspace/src/lib/chat/topics.test.ts
  • packages/workspace/src/lib/chat/topics.ts
  • packages/workspace/src/lib/chat/wake.ts
  • packages/workspace/src/lib/create-bash-env.ts
  • packages/workspace/src/lib/data-part-visibility.ts
  • packages/workspace/src/lib/drafts/draft-file.test.ts
  • packages/workspace/src/lib/drafts/draft-file.ts
  • packages/workspace/src/lib/drafts/draft-folder.test.ts
  • packages/workspace/src/lib/drafts/migrate.test.ts
  • packages/workspace/src/lib/drafts/migrate.ts
  • packages/workspace/src/lib/folder-fingerprint.ts
  • packages/workspace/src/lib/instructions-in-context.ts
  • packages/workspace/src/lib/json-record-file.ts
  • packages/workspace/src/lib/memory/store.test.ts
  • packages/workspace/src/lib/migrate-legacy-tasks.test.ts
  • packages/workspace/src/lib/migrate-legacy-tasks.ts
  • packages/workspace/src/lib/migrate-workspace-layout.test.ts
  • packages/workspace/src/lib/migrate-workspace-layout.ts
  • packages/workspace/src/lib/move-app-folders.test.ts
  • packages/workspace/src/lib/move-app-folders.ts
  • packages/workspace/src/lib/new-message.ts
  • packages/workspace/src/lib/permissions/chat-rules.ts
  • packages/workspace/src/lib/permissions/move-project-folders.ts
  • packages/workspace/src/lib/permissions/places.test.ts
  • packages/workspace/src/lib/permissions/project-folders.ts
  • packages/workspace/src/lib/permissions/rules.test.ts
  • packages/workspace/src/lib/permissions/rules.ts
  • packages/workspace/src/lib/permissions/topic-folders.ts
  • packages/workspace/src/lib/project-folder-name.test.ts
  • packages/workspace/src/lib/project-folder-name.ts
  • packages/workspace/src/lib/project-model-text.test.ts
  • packages/workspace/src/lib/project-model-text.ts
  • packages/workspace/src/lib/projects-move.test.ts
  • packages/workspace/src/lib/projects-move.ts
  • packages/workspace/src/lib/record-changes.ts
  • packages/workspace/src/lib/records/chat-records.ts
  • packages/workspace/src/lib/records/convert/convert-chat.test.ts
  • packages/workspace/src/lib/records/convert/convert-chat.ts
  • packages/workspace/src/lib/records/convert/read-chat-db.ts
  • packages/workspace/src/lib/records/convert/test-chats.ts
  • packages/workspace/src/lib/records/fake-sync.ts
  • packages/workspace/src/lib/records/fold.ts
  • packages/workspace/src/lib/records/part-paths.test.ts
  • packages/workspace/src/lib/records/part-paths.ts
  • packages/workspace/src/lib/records/record.test.ts
  • packages/workspace/src/lib/records/record.ts
  • packages/workspace/src/lib/records/records-guide.ts
  • packages/workspace/src/lib/records/session-of.test.ts
  • packages/workspace/src/lib/records/session-of.ts
  • packages/workspace/src/lib/report-outline.ts
  • packages/workspace/src/lib/request-prefix-determinism.test.ts
  • packages/workspace/src/lib/rewrite-file.test.ts
  • packages/workspace/src/lib/rewrite-stored-paths.test.ts
  • packages/workspace/src/lib/rewrite-stored-paths.ts
  • packages/workspace/src/lib/setup-change-sentence.ts
  • packages/workspace/src/lib/setup-changes.test.ts
  • packages/workspace/src/lib/setup-changes.ts
  • packages/workspace/src/lib/setup-news.test.ts
  • packages/workspace/src/lib/setup-news.ts
  • packages/workspace/src/lib/setup-snapshot.ts
  • packages/workspace/src/lib/state-notes.test.ts
  • packages/workspace/src/lib/state-notes.ts
  • packages/workspace/src/lib/topic-model-text.ts
  • packages/workspace/src/lib/topics-move.test.ts
  • packages/workspace/src/lib/topics-move.ts
  • packages/workspace/src/lib/workspace-fs-layout.ts
  • packages/workspace/src/lib/workspace-index.ts
  • packages/workspace/src/lib/workspace-instructions-model-text.ts
  • packages/workspace/src/lib/workspace-layout.ts
  • packages/workspace/src/rpc/index.ts
  • packages/workspace/src/rpc/publisher.ts
  • packages/workspace/src/rpc/routes/chat/folders.ts
  • packages/workspace/src/rpc/routes/chats.ts
  • packages/workspace/src/rpc/routes/message.ts
  • packages/workspace/src/rpc/routes/permissions.test.ts
  • packages/workspace/src/rpc/routes/permissions.ts
  • packages/workspace/src/rpc/routes/projects.test.ts
  • packages/workspace/src/rpc/routes/projects.ts
  • packages/workspace/src/rpc/routes/session.test.ts
  • packages/workspace/src/schemas/session/index.ts
  • packages/workspace/src/schemas/session/message-data-part.test.ts
  • packages/workspace/src/schemas/session/message-data-part.ts
  • packages/workspace/src/schemas/session/message-part.ts
  • packages/workspace/src/schemas/session/message.ts
  • packages/workspace/src/test/helpers/session-to-shorthand.ts
  • packages/workspace/system-skills/chat-history/records.md
  • packages/workspace/system-skills/instrument-guide/reference.md

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.

@mutewinter

Copy link
Copy Markdown
Contributor Author

@greptileai review

…he topics move

Fixes from a review of the topics-to-projects rename:

- A file saved into a project's folder, which the agent is now told to
  do, reported the project as changed, and as removed for a folder with
  no AGENTS.md. A project is a setup item by its AGENTS.md alone: the
  snapshot fingerprints that file only, and the write tracker counts a
  write under Projects/<Name>/ only when it is that file or the folder.
- 1.x's lowercase projects/ is moved off the top level only when the
  layout sweep is going to run. Once a workspace is swept, a projects/
  someone makes there is theirs, and was being hidden on every launch.
- Topics/ moves into Projects/ before the layout sweep, so an unfinished
  1.x migration in a topics-era workspace finds the project it joined
  rather than making a second one under the 1.x id.
- The move skips system clutter, removes a Topics/ left holding only
  clutter, and logs a line per folder it actually moved.
- A workspace move rewrites the paths in permissions.json's old topics
  key too, so a file not written since the update keeps its grants.

Commits-to: a project changes only when its AGENTS.md does or its folder comes or goes
Rejected: an instrument://new?topic= alias | no build has shipped a link that writes it outside the app
Not-tested: rewriting a permissions.json topics key on a workspace move
@mutewinter

Copy link
Copy Markdown
Contributor Author

Review pass (CodeRabbit skipped the PR at 242 files, Greptile did not answer): fixed in c6c7b21. Saved files no longer count as project changes; 1.x's lowercase projects/ is staged only when the layout sweep runs; Topics/ moves before the sweep; the move skips system clutter; a workspace move rewrites a leftover topics key in permissions.json. Not changed: no ?topic= deep-link alias, and a draft filed under a never-used project whose folder is renamed before sending opens its chat under no project.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Changes recommended

Draft migration can permanently lose legacy topic assignments, and project tracking mistakes instruction-file removal for project deletion while missing changes to bare project folders.

2 open issues
What changed in this PR

Renames topics to folder-based projects across the workspace engine, Studio, agent context, and documentation. Projects live under Projects/, with optional standing instructions in AGENTS.md; compatibility readers support older topic-named data.

Changes:

  • Rename schemas, RPCs, events, UI controls, and exported metadata to projects.
  • Update legacy-data migration, draft handling, permissions, records, and indexing.
  • Refresh tests, docs, and wireframes, alongside build-context, media-icon, and Markdown link-navigation updates.

This pull request requires changes. Four moderate findings remain unresolved:

  • apps/studio/src/electron-main/drafts/draft-record.ts:72 — Stabilize folder-derived project IDs before persisting draft selections, so folder renames do not lose their filing choice. Votes: 1.
  • packages/workspace/src/lib/activity/schema.ts:54 — Bump the activity index version so historical topic names are reindexed consistently for filtering and facets. Votes: 1.
  • packages/workspace/src/lib/drafts/migrate.ts:197 — Read legacy settings.topicId as a fallback to projectId, and retain a legacy-format fixture to prevent migration from permanently losing draft selections. Votes: 3.
  • packages/workspace/src/lib/setup-changes.ts:64 — Track project presence by its folder rather than AGENTS.md, while fingerprinting instructions separately. Votes: 2.
File Description
packages/​workspace/​system-skills/​instrument-guide/​reference.md Updates generated folder terminology.
packages/​workspace/​system-skills/​chat-history/​records.md Documents project settings records.
packages/​workspace/​src/​tools/​load-skill.ts Adds running-build context to the guide.
packages/​workspace/​src/​test/​helpers/​session-to-shorthand.ts Renders project parts in test shorthand.
packages/​workspace/​src/​schemas/​session/​message.ts Registers project turn notes.
packages/​workspace/​src/​schemas/​session/​message-part.ts Normalizes legacy topic data parts.
packages/​workspace/​src/​schemas/​session/​message-data-part.test.ts Updates state-cadence expectations.
packages/​workspace/​src/​schemas/​session/​index.ts Renames session filing metadata.
packages/​workspace/​src/​schemas/​environment.ts Clarifies computer-context documentation.
packages/​workspace/​src/​rpc/​routes/​session.test.ts Renames a callback parameter.
packages/​workspace/​src/​rpc/​routes/​permissions.ts Checks project grants for reset eligibility.
packages/​workspace/​src/​rpc/​routes/​permissions.test.ts Updates permission-reset expectations.
packages/​workspace/​src/​rpc/​routes/​message.ts Accepts projects when sending messages.
packages/​workspace/​src/​rpc/​routes/​chats.ts Exposes the project-filing RPC.
packages/​workspace/​src/​rpc/​routes/​chat/​folders.ts Updates folder-subscription documentation.
packages/​workspace/​src/​rpc/​publisher.ts Renames project change events.
packages/​workspace/​src/​rpc/​index.ts Registers project routes.
packages/​workspace/​src/​lib/​workspace-layout.ts Adds the legacy-project staging path.
packages/​workspace/​src/​lib/​workspace-instructions-model-text.ts Updates instruction-precedence wording.
packages/​workspace/​src/​lib/​workspace-index.ts Bumps the derived chat-index version.
packages/​workspace/​src/​lib/​workspace-fs-layout.ts Tracks project setup-folder writes.
packages/​workspace/​src/​lib/​topic-model-text.ts Removes the topic-note renderer.
packages/​workspace/​src/​lib/​state-notes.ts Resolves project standing-state notes.
packages/​workspace/​src/​lib/​setup-snapshot.ts Restricts project fingerprints to instructions.
packages/​workspace/​src/​lib/​setup-news.ts Updates standing-note documentation.
packages/​workspace/​src/​lib/​setup-news.test.ts Updates setup-snapshot fixtures.
packages/​workspace/​src/​lib/​setup-changes.ts Renames setup kinds and filters project writes.
packages/​workspace/​src/​lib/​setup-change-sentence.ts Produces project change sentences.
packages/​workspace/​src/​lib/​rewrite-stored-paths.ts Rewrites grants under current and legacy names.
packages/​workspace/​src/​lib/​rewrite-stored-paths.test.ts Updates project-grant rewrite fixtures.
packages/​workspace/​src/​lib/​rewrite-file.test.ts Uses AGENTS.md in rewrite tests.
packages/​workspace/​src/​lib/​request-prefix-determinism.test.ts Updates test documentation terminology.
packages/​workspace/​src/​lib/​report-outline.ts Retains project notes in outlines.
packages/​workspace/​src/​lib/​records/​session-of.ts Derives project metadata from settings.
packages/​workspace/​src/​lib/​records/​session-of.test.ts Updates session-fold expectations.
packages/​workspace/​src/​lib/​records/​records-guide.ts Describes the project settings field.
packages/​workspace/​src/​lib/​records/​record.ts Reads legacy topic settings as projects.
packages/​workspace/​src/​lib/​records/​record.test.ts Updates settings round-trip cases.
packages/​workspace/​src/​lib/​records/​part-paths.ts Maps project-folder paths in parts.
packages/​workspace/​src/​lib/​records/​fold.ts Folds project settings.
packages/​workspace/​src/​lib/​records/​fake-sync.ts Generates project settings for sync tests.
packages/​workspace/​src/​lib/​records/​convert/​test-chats.ts Updates conversion fixtures.
packages/​workspace/​src/​lib/​records/​convert/​read-chat-db.ts Reads legacy database filing fields.
packages/​workspace/​src/​lib/​records/​convert/​convert-chat.ts Converts project settings to records.
packages/​workspace/​src/​lib/​records/​convert/​convert-chat.test.ts Covers legacy database field names.
packages/​workspace/​src/​lib/​records/​chat-records.ts Detects and applies project-setting changes.
packages/​workspace/​src/​lib/​record-changes.ts Updates change-event documentation.
packages/​workspace/​src/​lib/​project-model-text.ts Adds project instructions and output-location guidance.
packages/​workspace/​src/​lib/​project-model-text.test.ts Checks project-note rendering.
packages/​workspace/​src/​lib/​project-folder-name.ts Updates validation documentation.
packages/​workspace/​src/​lib/​project-folder-name.test.ts Uses project validation labels.
packages/​workspace/​src/​lib/​permissions/​rules.test.ts Updates permission fixtures.
packages/​workspace/​src/​lib/​permissions/​places.test.ts Updates platform permission fixtures.
packages/​workspace/​src/​lib/​permissions/​chat-rules.ts Updates inherited-grant documentation.
packages/​workspace/​src/​lib/​move-app-folders.ts Updates migration documentation terminology.
packages/​workspace/​src/​lib/​move-app-folders.test.ts Checks visible project folders remain in place.
packages/​workspace/​src/​lib/​memory/​store.test.ts Updates preserved front-matter fixtures.
packages/​workspace/​src/​lib/​json-record-file.ts Updates JSON-writer documentation.
packages/​workspace/​src/​lib/​instructions-in-context.ts Updates instruction-budget documentation.
packages/​workspace/​src/​lib/​get-system-info.test.ts Adds operating-system naming cases.
packages/​workspace/​src/​lib/​folder-fingerprint.ts Updates marker-file documentation.
packages/​workspace/​src/​lib/​environment.ts Awaits computer information.
packages/​workspace/​src/​lib/​drafts/​migrate.ts Changes hidden-draft filing-field reads.
packages/​workspace/​src/​lib/​drafts/​migrate.test.ts Updates hidden-draft migration fixtures.
packages/​workspace/​src/​lib/​drafts/​draft-folder.test.ts Uses project front matter in draft tests.
packages/​workspace/​src/​lib/​drafts/​draft-file.ts Reads both names and writes project front matter.
packages/​workspace/​src/​lib/​drafts/​draft-file.test.ts Updates draft serialization expectations.
packages/​workspace/​src/​lib/​data-part-visibility.ts Keeps project notes developer-visible.
packages/​workspace/​src/​lib/​create-bash-env.ts Updates setup-tracking documentation.
packages/​workspace/​src/​lib/​chat/​wake.ts Updates subscriber documentation wording.
packages/​workspace/​src/​lib/​chat/​live-chat-list.ts Updates optimistic-filing documentation.
packages/​workspace/​src/​lib/​chat/​folder-reach.ts Resolves project-granted folders.
packages/​workspace/​src/​lib/​chat/​chats.ts Saves project IDs before filing chats.
packages/​workspace/​src/​lib/​chat/​chats.test.ts Updates filing and live-list cases.
packages/​workspace/​src/​lib/​chat/​chat-list-file.ts Writes project metadata for external readers.
packages/​workspace/​src/​lib/​chat/​asks.test.ts Updates permission fixtures.
packages/​workspace/​src/​lib/​chat-writes.test.ts Checks project-setting writes.
packages/​workspace/​src/​lib/​chat-folders/​first-folders.ts Updates first-render documentation.
packages/​workspace/​src/​lib/​chat-folders/​chat-markdown.ts Writes project metadata into CHAT.md.
packages/​workspace/​src/​lib/​chat-folders/​chat-markdown.test.ts Updates rendered-chat expectations.
packages/​workspace/​src/​lib/​attached-file-grant.test.ts Updates grant fixtures.
packages/​workspace/​src/​lib/​apps/​context.ts Updates instruction-rendering documentation.
packages/​workspace/​src/​lib/​app-data-rules.test.ts Updates permission fixtures.
packages/​workspace/​src/​lib/​activity/​schema.ts Normalizes legacy activity purposes and surfaces.
packages/​workspace/​src/​lib/​activity/​log-file.ts Uses compatibility schemas when reading activity.
packages/​workspace/​src/​electron.ts Exports project migration APIs.
packages/​workspace/​src/​constants.ts Defines Projects/ and AGENTS.md.
packages/​workspace/​src/​client.ts Exports the project-note renderer.
packages/​workspace/​evals/​lib/​run-record.ts Updates eval-record documentation.
packages/​workspace/​evals/​handoff-matrix.ts Renames the instruction scenario.
packages/​workspace/​evals/​decision/​corpus/​README.md Documents project-oriented corpus fields.
packages/​workspace/​evals/​decision/​corpus/​drafts.json Renames project-list keys.
packages/​workspace/​evals/​decision/​corpus/​backfill.json Renames backfill project keys.
packages/​workspace/​evals/​decision/​cli.ts Updates decision-eval documentation.
packages/​workspace/​evals/​cases/​unprompted-tools.ts Renames meeting-subject fixture variables.
packages/​workspace/​evals/​cases/​permissions.ts Renames history-summary fixture variables.
packages/​workspace/​evals/​cases/​handoff.ts Updates project instruction scenarios.
packages/​workspace/​AGENTS.md Documents project state cadence.
packages/​workspace/​.oxlintrc.json Updates renamed-file rule exceptions.
packages/​shared/​src/​instrument-link.ts Parses project parameters in new-chat links.
packages/​shared/​src/​instrument-link.test.ts Updates deep-link parsing cases.
packages/​shared/​src/​front-matter.ts Updates parser documentation terminology.
docs/​reviews/​2026-10-19-layout-merge-hunt.md Repairs a historical source reference.
docs/​plans/​README.md Adds the rename-plan index entry.
docs/​architecture/​threat-model.md Updates project-boundary terminology.
docs/​architecture/​deep-links.md Documents project-aware new-chat links.
docs/​architecture/​chat-records.md Documents project settings records.
docs/​architecture/​bash-sandbox-mounts-and-native-binaries.md Updates inherited-folder terminology.
apps/​studio/​src/​shared/​instrument-folders.ts Labels the protected Projects folder.
apps/​studio/​src/​shared/​instrument-folders.test.ts Updates folder-protection cases.
apps/​studio/​src/​shared/​features.ts Updates personal-suggestion disclosure.
apps/​studio/​src/​shared/​drafts.ts Renames draft filing fields.
apps/​studio/​src/​shared/​drafts.test.ts Updates draft-operation expectations.
apps/​studio/​src/​shared/​dictation.ts Renames the instruction dictation surface.
apps/​studio/​src/​shared/​dev-instance-colors.ts Updates palette-source documentation.
apps/​studio/​src/​electron-main/​windows/​app-window-asks.ts Carries projects in new-chat requests.
apps/​studio/​src/​electron-main/​rpc/​routes/​window.ts Validates project-aware window requests.
apps/​studio/​src/​electron-main/​rpc/​routes/​utils.ts Updates subscription documentation wording.
apps/​studio/​src/​electron-main/​lib/​workspaces.ts Updates workspace documentation terminology.
apps/​studio/​src/​electron-main/​lib/​workspace-move.ts Updates move documentation terminology.
apps/​studio/​src/​electron-main/​lib/​start-workspace.ts Passes draft projects when sending.
apps/​studio/​src/​electron-main/​lib/​refused-files.test.ts Updates visible and hidden project-path cases.
apps/​studio/​src/​electron-main/​lib/​outside-links.ts Forwards projects from outside links.
apps/​studio/​src/​electron-main/​lib/​migration-rehearsal.test.ts Updates project migration rehearsals.
apps/​studio/​src/​electron-main/​drafts/​send-asked-drafts.ts Sends new drafts under their projects.
apps/​studio/​src/​electron-main/​drafts/​send-asked-drafts.test.ts Updates project-aware sending cases.
apps/​studio/​src/​electron-main/​drafts/​draft-store.test.ts Updates persisted and synchronized draft fixtures.
apps/​studio/​src/​electron-main/​drafts/​draft-record.ts Maps project fields between disk and UI.
apps/​studio/​src/​client/​routes/​debug/​-transcript/​scenarios.ts Updates setup-change preview data.
apps/​studio/​src/​client/​routes/​_app/​route.tsx Wires project controls into chat views.
apps/​studio/​src/​client/​hooks/​use-refresh-projects-on-change.ts Invalidates project queries after changes.
apps/​studio/​src/​client/​hooks/​use-decision.ts Updates personal-content documentation.
apps/​studio/​src/​client/​hooks/​use-decision-personal.test.tsx Updates project privacy-gating cases.
apps/​studio/​src/​client/​drafts/​store.test.tsx Updates synchronized draft-project fixtures.
apps/​studio/​src/​client/​components/​window/​use-window-commands.ts Handles project-aware new-chat commands.
apps/​studio/​src/​client/​components/​window/​use-window-commands.test.tsx Updates window-command fixtures.
apps/​studio/​src/​client/​components/​window/​use-set-chat-project.ts Optimistically updates project filing.
apps/​studio/​src/​client/​components/​window/​use-chat-search-fallback.ts Updates search-comparison documentation.
apps/​studio/​src/​client/​components/​window/​tab-strip.tsx Updates tint documentation.
apps/​studio/​src/​client/​components/​window/​shell-context.ts Exposes project actions and lists.
apps/​studio/​src/​client/​components/​window/​row-shell.ts Uses project-aware row styling.
apps/​studio/​src/​client/​components/​window/​project-tint.ts Renames tint functions and CSS variables.
apps/​studio/​src/​client/​components/​window/​project-mark-picker.tsx Uses project palette and tint APIs.
apps/​studio/​src/​client/​components/​window/​project-dialog.browser.test.tsx Updates dialog layout fixtures.
apps/​studio/​src/​client/​components/​window/​project-banner.tsx Displays project instructions and edit action.
apps/​studio/​src/​client/​components/​window/​file-mark.tsx Detects additional audio-only containers.
apps/​studio/​src/​client/​components/​window/​emoji-suggestions.ts Updates project prompts and activity attribution.
apps/​studio/​src/​client/​components/​window/​draft-row.tsx Displays draft project pills.
apps/​studio/​src/​client/​components/​window/​draft-row.browser.test.tsx Updates draft-row project cases.
apps/​studio/​src/​client/​components/​window/​computer-page.tsx Classifies ambiguous audio/video files.
apps/​studio/​src/​client/​components/​window/​command-menu.test.tsx Updates shell fixtures.
apps/​studio/​src/​client/​components/​window/​command-menu.browser.test.tsx Updates browser shell fixtures.
apps/​studio/​src/​client/​components/​window/​chat-window.tsx Wires project controls into floating chats.
apps/​studio/​src/​client/​components/​window/​app-identity-chip.tsx Uses the renamed project palette.
apps/​studio/​src/​client/​components/​studio-modals/​topic-details-modal.tsx Removes the topic details modal.
apps/​studio/​src/​client/​components/​studio-modals/​studio-modals.tsx Mounts the project details modal.
apps/​studio/​src/​client/​components/​studio-modals/​project-details-modal.tsx Adds project editing and retirement wiring.
apps/​studio/​src/​client/​components/​setup/​steps/​folder.tsx Updates workspace-placement copy.
apps/​studio/​src/​client/​components/​setup-changes-note.tsx Displays linked project change notes.
apps/​studio/​src/​client/​components/​settings/​storage-section.tsx Updates storage copy.
apps/​studio/​src/​client/​components/​settings/​settings-index.ts Updates searchable settings text.
apps/​studio/​src/​client/​components/​settings/​activity-section.tsx Labels project activity purposes and surfaces.
apps/​studio/​src/​client/​components/​markdown-editor/​links.ts Opens modifier-clicked links in separate tabs.
apps/​studio/​src/​client/​components/​markdown-editor/​links.browser.test.tsx Updates modifier-click navigation expectations.
apps/​studio/​src/​client/​components/​chat-stream-data-parts.tsx Renders project standing-state cards.
apps/​studio/​src/​client/​atoms/​window.ts Updates inbox-state documentation.
apps/​studio/​src/​client/​atoms/​topic-details-modal.ts Removes topic-modal state.
apps/​studio/​src/​client/​atoms/​project-details-modal.ts Adds project-modal state and opener.
apps/​studio/​smoke-test.spec.ts Updates legacy-folder checks.
.agents/​wireframe-kit/​measure/​capture.mjs Creates and files fixture projects.
.agents/​wireframe-kit/​kit/​scenario.js Updates shared wireframe project data.
.agents/​wireframe-kit/​kit/​marks.js Renames project palette and tint helpers.
.agents/​wireframe-kit/​kit/​compose.js Updates the compose project label.
.agents/​wireframe-kit/​kit/​chat.js Renders project pills in chat headers.
.agents/​skills/​studio-chrome-devtools/​SKILL.md Updates selector-example terminology.
.agents/​skills/​chat-database-query/​SKILL.md Documents project settings records.

Review effort: Balanced

words: string;
}): DraftFile {
const { createdAt, topicId, updatedAt } = settings;
const { createdAt, projectId, updatedAt } = settings;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in ad3f103: the move reads the stored topicId, and the fixture is back to the legacy key. No build wrote projectId into a hidden draft record, so there is no fallback to add.

folder: () => path.join(getWorkspaceConfig().rootDir, PROJECTS_FOLDER_NAME),
itemOf: (entry) => entry,
marker: (name) => `${name}/${TOPIC_FILE_NAME}`,
marker: (name) => `${name}/${PROJECT_FILE_NAME}`,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Agreed, fixed in f46dca6. Each setup kind now separates what makes an item there (presence: a project's folder) from the file that says what it is (marker: its AGENTS.md). Making a bare folder reads as an added project, and removing only AGENTS.md reads as a change. Tests in setup-changes.test.ts cover both.

…s project id

The scripted rename turned two names that earlier builds wrote to disk:

- permissions.json's mark that a computer has taken in the folders its
  projects' files listed is topicFoldersMoved. Checking projectFoldersMoved
  ran the import again on every computer that had done it, so a folders:
  key the agent wrote into a project's file became a real grant with no
  card, the hole 5a3e539 closed.
- A hidden draft's record from before Drafts/ kept its project as
  topicId, which the move to Drafts/ read as projectId and so dropped.

A draft filed under a project whose id is not in its file yet now writes
the id down when the draft is saved, as filing a chat does, so renaming
the folder before sending leaves the draft in its project.

Review: docs/reviews/2026-11-03-pr-189.md A, B
Commits-to: a name an earlier build wrote to disk keeps its spelling, whatever the code around it is called
Related: 5a3e539
…GENTS.md

A project is its folder, but the notes on what a turn changed still took
its AGENTS.md as the project: taking that file away read as "removed the
project" while the folder stayed listed, and a bare folder the agent made
read as nothing. Each setup kind now names what makes an item there
(presence) apart from the file that says what it is (marker): a project's
folder for the first, its AGENTS.md for the second, so making a folder
adds a project and taking its instructions away changes it.

Commits-to: a project comes and goes with its folder; only its AGENTS.md changes it
…ects

# Conflicts:
#	apps/studio/src/client/components/window/use-window-commands.test.tsx
@mutewinter
mutewinter merged commit ae3addc into main Nov 3, 2026
12 checks passed
@mutewinter
mutewinter deleted the rename/topics-to-projects branch November 3, 2026 17:21
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