# Phase 0 — Call lanes "workspaces" in the UI and docs _One PR. No behaviour change, no identifier change. Every test that passed before passes after; only copy and snapshots differ._ ## Goal The **word** a user reads changes: "Lane" → "Workspace", "Lanes" → "Workspaces", "Add lane" → "Add workspace", "lane strip" → "workspace list", and so on — in the dashboard UI (both languages), in the docs, in CLI *help and output text*, and in the plugin's skill/command prose. ## What does NOT change Everything that is an identifier stays exactly as it is: - API paths and payload keys: `/api/lanes`, `{ lanes, counts }`, `lane_id`, … - WebSocket message types `lane` / `lanes`. - CLI commands and flags: `agenthub lanes add|up|down|…`, `agenthub stage --lane 3`. - Env vars: `AGENTHUB_LANE_ID`, `LANES_ROOT`, `LANE_DEAD_SEC`, … - Error codes (`EBADLANE`, …), tmux session names `agenthub-lane-`. - SQLite tables/columns (`lanes`, `lane_features`, `lane_stage_events`). - Source file, component, hook, type and function names (`LaneCard.tsx`, `LaneChangesPanel`, `useLaneGitFacts`, `listLanes`, `Lane` type, …), `data-testid` values, localStorage keys, i18n **namespace file name** `lanes.json` and its **keys**. Rationale: a rename of identifiers touches ~200 files and every running install's tmux panes, hooks and bookmarks, for no user-visible gain. The user-visible gain is the word, so only the word changes. ## Where the word changes | Surface | Action | | --- | --- | | `client/src/i18n/locales/en/*.json`, `…/vi/*.json` | Replace the English word in **values** (not keys): `"Lane"→"Workspace"`, `"lane"→"workspace"`, `"Lanes"→"Workspaces"`, plural/possessive forms. Vietnamese values: "lane"/"làn" → "workspace" (the Vietnamese UI already uses the English loanword "Workspace" in `nav.json`; keep that). Check `lanes.json`, `nav.json`, `settings.json` (`lanesSection.title` = "Workspaces"), `run.json`, `dashboard.json`, `kanban.json`, `errors.json`, `splash.json`. | | Hardcoded UI strings | `grep -rn -i '\blanes\?\b' client/src --include=*.tsx` — any string literal rendered to the user that escaped i18n is moved into i18n with the new word (do not leave it hardcoded). Code comments and identifiers are left alone. | | CLI output and help (`bin/agenthub.js`) | Prose in `console.log`/`console.error`/usage strings: "lane" → "workspace" in the sentence, while the command names in those same sentences stay literal: e.g. `no workspace owns — create one with: agenthub lanes add --cwd `. | | Docs | `docs/LANES.md`: keep the file name (it is linked from many places and from `CLAUDE.md`), retitle to "Workspaces (lanes)" and open with one paragraph: *"A workspace — called a lane in the API, CLI, database and code — is …"*. Then use "workspace" in prose throughout, keeping every literal command/route/field as is. Same treatment in `README.md`, `docs/API.md`, `docs/CLI.md`, `docs/DATABASE.md`, `docs/HOOKS.md`, `client/README.md`, `server/README.md`, `docs/PLUGINS.md`. | | `CLAUDE.md` | The "## Lanes" heading becomes "## Workspaces (lanes)"; the first bullet gains the one-sentence glossary above; every rule keeps its literal identifiers. Bump the sync marker. | | Plugin skills/commands (`skills/*`, `plugins/agenthub/commands/*`) | Prose only. | | Server-side user-facing text | Error `message` strings that reach the UI (e.g. `"lane not found"`): change the word, keep the `code`. Log lines may stay. | ## Order of work 1. i18n values (en, vi) + any escaped literals → `npm run test:client`, review the snapshot diff (copy only), regenerate. 2. CLI strings → `npm run test:server` (`lanes-cli.test.js` asserts some output text; update those assertions). 3. Server error messages → server suite. 4. Docs + `CLAUDE.md` + skills prose. ## Acceptance - Opening every page of the dashboard in EN and VI shows no "lane" (walk: Dashboard, Sessions, Workflows, Workspace incl. Add modal / destructive modals / Changes panel / run form, Settings incl. every tool tab). - `agenthub lanes` (no args) and `agenthub help` print "workspace" in prose and `lanes` as the command. - `git diff --stat` shows no renamed files, no changes to `server/routes/` paths, `client/src/lib/api.ts` or `client/src/lib/types.ts`. - Headers check, both suites, snapshots regenerated once.