Repository navigation
workspace: rename topics to projects, each a folder with an AGENTS.md - #189
Conversation
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
|
Important Review skippedToo 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.
|
|
@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
|
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 |
There was a problem hiding this comment.
🟡 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 legacysettings.topicIdas a fallback toprojectId, 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 thanAGENTS.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; |
There was a problem hiding this comment.
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}`, |
There was a problem hiding this comment.
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

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
Projects/<Name>/, the system's clutter aside. Its instructions are theAGENTS.mdin it, the name coding agents already read, so another agent opened in the folder gets the same instructions. Front matter is optional: a copied-inAGENTS.mdwith none, or a bare folder, is a project.idgoes 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 takeprj_; existingtop_ids stay valid.Agent
Existing data
Topics/and eachTOPIC.mdmove intoProjects/on every launch.setlines (topicfield),permissions.json(topics),DRAFT.md(topic:), stored parts (data-topic,data-topics, setup changes of kindtopic), 1.xchat.dbrows, and the activity log's purposes and surface.workspace.dbis rebuilt (index version bump).prj_id. On a case-insensitive disk 1.x's lowercaseprojects/is the same folder asProjects/, 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 readstopicfromchat-list.jsonand needsproject.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.