From bec49bfc0f04fdfb7ccc3f184555424786abef57 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Tue, 27 Oct 2026 08:52:39 -0700 Subject: [PATCH 1/6] docs(audits): landing FAQ and firstRun claim table (TASK-009) One claim-table row per sentence of the landing FAQ (six items, 18 sentences) and the claim-bearing firstRun copy (eight keys). Each row has a TRUE or FALSE verdict and file:line evidence on main at 67dd25b21. Seven rows are FALSE. The doc lists them with their failing clauses. This change edits no copy; the launch copy PR fixes them. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: wren Agent-Model: claude/claude-haiku-5-5/max --- docs/audits/landing-faq-firstrun-claims.md | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 docs/audits/landing-faq-firstrun-claims.md diff --git a/docs/audits/landing-faq-firstrun-claims.md b/docs/audits/landing-faq-firstrun-claims.md new file mode 100644 index 0000000000..eaf1f8eb29 --- /dev/null +++ b/docs/audits/landing-faq-firstrun-claims.md @@ -0,0 +1,83 @@ +# Landing FAQ and firstRun copy: claim audit + +Audit of the six landing FAQ items (`frontend/src/content/landing-faq.json`) and the +claim-bearing `firstRun` keys (`frontend/src/i18n/locales/en.json`, lines 460–489). Audit SHA +`67dd25b21` (`main`). Every line number below is from that SHA. + +## Scope and rules + +- **Verdicts** follow [claim-table.md](claim-table.md). Only TRUE and FALSE are used here. + TRUE needs a `file:line` on `main`, not another doc. +- **Per sentence.** Each sentence of the copy is one row. A sentence is FALSE if any reader it + addresses is told something the code does not do. "Such as" lists are judged on the class. +- **Evidence age.** Evidence is no older than 14 days. All rows are dated 2026-10-27. +- **No copy edits in this audit.** Every FALSE row is fixed by the launch copy PR. A staff session + writes that copy, and it is gated with an Opus review and rendered. +- **Split.** The landing FAQ and firstRun copy ship before the freeze. The other 27 uncovered + pages, the connector and tool keys, and zh-CN move to TASK-020, post-launch. +- **Diagrams.** Cut from scope. Nothing on `main` names a diagram deliverable for this copy. + The matches for "diagram" are prose in `frontend/src/content/guides.json` (`:1689`, `:1926`) + and in `docs/`. + +## Claim table + +| Page | Claim | Verdict | Evidence | Date | +|---|---|---|---|---| +| Landing FAQ 1 | Commonly is an open-source (Apache-2.0), self-hostable workspace where a team and its AI agents share a pod. | TRUE | `package.json:4` (Apache-2.0); `install.sh:57` (compose `up -d --build`); `backend/services/agentIdentityService.ts:691` (`ensureAgentInPod`) | 2026-10-27 | +| Landing FAQ 1 | Claude Code, Codex and OpenCode join from your own machine, or you can use the hosted agent, and everyone works in the same chat and task board. | FALSE | The connect page offers `claude` and `codex` only (`frontend/src/v2/components/V2AgentBYO.tsx:73`). The OpenCode handoff is Mac-only (`backend/services/byoHandoffService.ts:115-118`). Codex cannot join from Windows (`frontend/src/i18n/locales/en.json:1612`). Hosted path: `V2AgentBYO.tsx:546`, `en.json:1618`. | 2026-10-27 | +| Landing FAQ 2 | Commonly is an open-source (Apache-2.0) workspace built for teams of people and AI agents. | TRUE | `package.json:4` | 2026-10-27 | +| Landing FAQ 2 | A pod has a chat, a task board that agents claim work from, and decision cards where an agent asks a person before acting. | FALSE | Claim route: `backend/routes/tasksApi.ts:594`. Decision card creation: `backend/routes/agentsRuntime.ts:4126`. The only pre-action gate is the approval card for connector writes (`backend/services/toolBrokerService.ts:1256-1276`). Decision cards are a prompt frame for genuine forks, not a gate on every action (`cli/src/lib/enforcement.js:38-40`). | 2026-10-27 | +| Landing FAQ 2 | You can self-host it or use `commonly.me`. | TRUE | `install.sh:57` (self-host); `backend/routes/auth.ts:262` (default app origin `https://commonly.me`); `backend/middleware/corsPolicy.ts:14` (origin allowlist). A live walk is outside this audit. | 2026-10-27 | +| Landing FAQ 3 | In a Commonly pod, choose "Use my own agent", then "Get my connect command", and run the lines it shows on your Mac. | TRUE | `en.json:1620` (`mode.byo`, "Use my own agent"); `en.json:1529` (`agentByo.actions.install`, "Get my connect command"), rendered at `V2AgentBYO.tsx:1321`; Mac listener for Claude Code (`V2AgentBYO.tsx:103-105`, `listenerRunsOn`). | 2026-10-27 | +| Landing FAQ 3 | Your own Claude Code then answers `@mentions` in the pod, in a thread. | FALSE | Failing clause: "in a thread". A reply is one top-level post (`cli/src/lib/enforcement.js:776-780`). A thread is used only past the chunk limit, and its continuations carry `threadRootId` (`enforcement.js:791-821`, `:817`). The threading cue says a plain post broadcasts to the channel (`backend/services/agentMentionService.ts:504`). | 2026-10-27 | +| Landing FAQ 3 | On Linux or Windows, the same page connects your Claude Code session over MCP. | TRUE | MCP commands for both OSes: `V2AgentBYO.tsx:957-965` (`claudeSnippet`, `claudeSnippetWindows`). Caveat: an MCP connection does not answer `@mentions` (`en.json:1611`). This sentence does not claim it does. | 2026-10-27 | +| Landing FAQ 4 | Commonly is open source (Apache-2.0) and self-hostable. | TRUE | `package.json:4`; `install.sh:57` | 2026-10-27 | +| Landing FAQ 4 | Several agents, such as Claude Code, Codex, OpenCode and a hosted agent, work alongside people in one pod. | TRUE | Judged on the class, several agent runtimes in one pod: `backend/services/agentIdentityService.ts:691`; connect paths `V2AgentBYO.tsx:73`; hosted path `V2AgentBYO.tsx:546`. The named OpenCode example fails in Landing FAQ 1 (`byoHandoffService.ts:115-118`), so the launch copy PR should narrow it. | 2026-10-27 | +| Landing FAQ 4 | They claim tasks on a shared board, post what they tried, and ask a person on a decision card when the call is theirs. | TRUE | Claim: `backend/routes/tasksApi.ts:594`. Post an update: `backend/routes/tasksApi.ts:787`. Decision card for a genuine fork that needs a human choice: `cli/src/lib/enforcement.js:38-40`. | 2026-10-27 | +| Landing FAQ 5 | In a Commonly pod, Claude Code, Codex and OpenCode from teammates' machines, plus a hosted agent, share one chat and task board with the people on the team. | FALSE | Failing clauses: OpenCode from a teammate's machine (`V2AgentBYO.tsx:73`; `byoHandoffService.ts:115-118`), and Codex from a Windows machine (`en.json:1612`). The hosted agent is real (`V2AgentBYO.tsx:546`). The shared board resolves each claimer for all pod members (`frontend/src/v2/components/V2PodBoard.tsx:244`). | 2026-10-27 | +| Landing FAQ 5 | Activity shows what each agent claimed and finished, and what needs a person. | FALSE | Failing clause: "what each agent claimed". Activity lists a board item only when it has a `lastUpdate` (`frontend/src/v2/components/V2ActivityPage.tsx:796-803`) and names no claimer. The claimer lookup exists only on the board (`V2PodBoard.tsx:244`). "Finished" is the status mapping (`backend/services/activityService.ts:254-286`). "Needs a person" is pending decision items (`activityService.ts:1416`). | 2026-10-27 | +| Landing FAQ 6 (premise) | Anthropic recommends one agent loop over subagents. | FALSE | No source on `main` states or supports this. A TRUE verdict needs a `file:line` on `main`, and the only match for the phrase is the FAQ entry itself (`frontend/src/content/landing-faq.json:23`). The launch copy PR must source the claim or cut it. | 2026-10-27 | +| Landing FAQ 6 | For a single agent, we agree: each expert should be one strong loop, and Commonly doesn't split an agent into subagents. | FALSE | Failing clause: "Commonly doesn't split an agent into subagents". The Claude Code adapter cues parallel read-only subagents for non-public seats (`cli/src/lib/adapters/claude.js:113-116`, applied at `:1077`). The gateway caps subagent concurrency at 4 (`backend/services/agentProvisionerService.ts:929-932`). | 2026-10-27 | +| Landing FAQ 6 | Across a team, work still divides by expertise and ownership, so there are several of those experts, each running under its own owner. | TRUE | Each agent has a required installer (`backend/models/AgentRegistry.ts:261`). Runtime tokens are issued for an owner (`backend/routes/registry/agent-tokens.ts:224`). "Divides by expertise" is framing that no code asserts. | 2026-10-27 | +| Landing FAQ 6 | A pod is where they work together: your Claude Code and a teammate's agent, each a named member, sharing one thread and one board with the people who run them. | TRUE | Agents join pods as members (`backend/services/agentIdentityService.ts:691`). The agent's display name is on its User row (`backend/models/User.ts:135`). The shared board (`V2PodBoard.tsx:244`). | 2026-10-27 | +| Landing FAQ 6 | A task claimed on the board shows as taken to everyone, and a connector grant gives one agent read access to one tool without handing over your keys. | TRUE | A claimed task shows its claimer to pod members (`V2PodBoard.tsx:244`); claim route `backend/routes/tasksApi.ts:594`. A grant has a write mode and a tool list (`backend/models/RoomGrant.ts:12`; `backend/services/roomGrantService.ts:412`, `:418`). The broker returns a result with no credential (`backend/services/toolBrokerService.ts:1352`, `:1360-1365`). | 2026-10-27 | +| firstRun `lede` (en.json:463) | Connect Claude Code or Codex, or run one here, then start a private conversation without leaving your workspace. | TRUE | Connect: `V2AgentBYO.tsx:73` (`claude`, `codex`). Run here: `en.json:1618`, `V2AgentBYO.tsx:546`. Private 1:1 room: `V2FirstRunHero.tsx:211` (POST `/api/agents/runtime/room`); `backend/routes/agentsRuntime.ts:917`. Codex has no Windows path (`en.json:1612`), so the "or" still holds there through Claude Code. | 2026-10-27 | +| firstRun `connect.text` (en.json:469) | Generate its private runtime token and copy the setup command for your tool. | TRUE | Issue: `V2AgentBYO.tsx:733-736` (POST without `force`); route `backend/routes/registry/agent-tokens.ts:157`. Setup commands: `V2AgentBYO.tsx:957-965`. Caveat: if a token already exists, nothing is generated. The page opens the replacement confirmation instead (`V2AgentBYO.tsx:737-740`; copy `en.json:1555`). | 2026-10-27 | +| firstRun `connect.openSetup` (en.json:470) | Open connection setup | TRUE | `V2FirstRunHero.tsx:263-274` (link to `/v2/agents/byo`, new tab). | 2026-10-27 | +| firstRun `start.waiting` (en.json:476) | Waiting for your agent to connect… | TRUE | Shown until `status.connected` (`V2FirstRunHero.tsx:281-283`). Status is polled every 3 s (`V2FirstRunHero.tsx:9`, `:118-152`) from `backend/routes/users.ts:132`. | 2026-10-27 | +| firstRun `start.connectedStatus` (en.json:475) | ✓ Connected | TRUE | Shown when `status.connected` (`V2FirstRunHero.tsx:282-283`). The flag comes from `backend/routes/users.ts:132`. | 2026-10-27 | +| firstRun `hello.text` (en.json:480) | Your agent gets its own durable identity and private 1:1 with you. | TRUE | Durable: the agent User row is created once (`backend/routes/registry/agent-tokens.ts:202`). Rotation revokes tokens, not the user (`agent-tokens.ts:208-222`). Private 1:1: an `agent-room` must have exactly two members (`backend/services/agentIdentityService.ts:44`); the room is find-or-create (`backend/routes/agentsRuntime.ts:917`). | 2026-10-27 | +| firstRun `errors.statusUnavailable` (en.json:486) | Connection status is temporarily unavailable. We'll keep checking. | TRUE | Set on a failed poll (`V2FirstRunHero.tsx:77-79`). The interval keeps running (`V2FirstRunHero.tsx:118-152`). | 2026-10-27 | +| firstRun `errors.roomFailed` (en.json:487) | Could not open your 1:1 yet. Try again. | TRUE | Set on a failed room request (`V2FirstRunHero.tsx:226-231`). The button stays enabled (`:299` disables it only while opening; `:230` clears that state), labelled "Say hello" (`en.json:482`). So "Try again" means pressing it again. A server message replaces this copy (`V2FirstRunHero.tsx:227-229`). | 2026-10-27 | + +## FALSE rows + +These are not fixed in this PR. The launch copy PR corrects each failing clause or cuts it. + +1. **Landing FAQ 1, sentence 2.** OpenCode joins from your own machine: the connect page does not + offer it, and the handoff is Mac-only. Codex joins from your own machine: there is no Windows path. +2. **Landing FAQ 2, sentence 2.** "Decision cards where an agent asks a person before acting": the + only pre-action gate on `main` is the approval card for connector writes. +3. **Landing FAQ 3, sentence 2.** Replies come "in a thread": the default is one top-level post. +4. **Landing FAQ 5, sentence 1.** OpenCode from teammates' machines, and Codex from a Windows machine. +5. **Landing FAQ 5, sentence 2.** "What each agent claimed": Activity names no claimer. +6. **Landing FAQ 6, premise.** "Anthropic recommends one agent loop over subagents": no source on `main`. +7. **Landing FAQ 6, sentence 1.** "Commonly doesn't split an agent into subagents": the Claude Code + adapter cues subagents, and the gateway caps them at 4. + +## Checks closed + +- **commonly.me as a hosted service.** A non-test code cite exists: `backend/routes/auth.ts:262` + (default app origin) and `backend/middleware/corsPolicy.ts:14`. +- **firstRun token branch.** The hero never calls the token route. Its link opens the setup page, + which issues without `force`. If a token already exists, the page asks for confirmation instead + of rotating it (`V2AgentBYO.tsx:737-740`). The hero never forces rotation. +- **"Try again" state.** The button is re-enabled after a failed room request (row above). + +## Not scored + +- The six FAQ questions are fixed and not scored (`frontend/src/v2/landing/landingFaq.ts:4-8`). + "Isn't Commonly a multi-agent system?" is a question, not a claim. +- firstRun labels with no claim are not rows: eyebrow, title, skip, reopen, step titles, and + button labels. The eyebrow "Your first five minutes" (`en.json:461`) is a time estimate with no + code behind it. The launch copy PR decides whether to keep it. From e184484be65172b329aa36c823aaddbfd6b6ddd9 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Tue, 27 Oct 2026 09:04:04 -0700 Subject: [PATCH 2/6] docs(audits): mark two FAQ 6 clauses FALSE (TASK-009) CodeRabbit's two open threads on #2884 were valid. Verified against main a6058f39d: - Row 42, "sharing one thread": a pod is one room with many threads. Messages are scoped by podId (backend/models/pg/Message.ts:271), and a thread is one root plus its replies (Message.ts:281-284). - Row 43, "read access to one tool": a RoomGrant lists several tools (backend/models/RoomGrant.ts:29), allows write and write-with-confirm (:12, :30), and lists several audience members (:33). 26 rows: 17 TRUE, 9 FALSE. The FALSE list gains items 8 and 9. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: wren Agent-Model: claude/claude-haiku-5-5/max --- docs/audits/landing-faq-firstrun-claims.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/audits/landing-faq-firstrun-claims.md b/docs/audits/landing-faq-firstrun-claims.md index eaf1f8eb29..42169e71bf 100644 --- a/docs/audits/landing-faq-firstrun-claims.md +++ b/docs/audits/landing-faq-firstrun-claims.md @@ -39,8 +39,8 @@ claim-bearing `firstRun` keys (`frontend/src/i18n/locales/en.json`, lines 460– | Landing FAQ 6 (premise) | Anthropic recommends one agent loop over subagents. | FALSE | No source on `main` states or supports this. A TRUE verdict needs a `file:line` on `main`, and the only match for the phrase is the FAQ entry itself (`frontend/src/content/landing-faq.json:23`). The launch copy PR must source the claim or cut it. | 2026-10-27 | | Landing FAQ 6 | For a single agent, we agree: each expert should be one strong loop, and Commonly doesn't split an agent into subagents. | FALSE | Failing clause: "Commonly doesn't split an agent into subagents". The Claude Code adapter cues parallel read-only subagents for non-public seats (`cli/src/lib/adapters/claude.js:113-116`, applied at `:1077`). The gateway caps subagent concurrency at 4 (`backend/services/agentProvisionerService.ts:929-932`). | 2026-10-27 | | Landing FAQ 6 | Across a team, work still divides by expertise and ownership, so there are several of those experts, each running under its own owner. | TRUE | Each agent has a required installer (`backend/models/AgentRegistry.ts:261`). Runtime tokens are issued for an owner (`backend/routes/registry/agent-tokens.ts:224`). "Divides by expertise" is framing that no code asserts. | 2026-10-27 | -| Landing FAQ 6 | A pod is where they work together: your Claude Code and a teammate's agent, each a named member, sharing one thread and one board with the people who run them. | TRUE | Agents join pods as members (`backend/services/agentIdentityService.ts:691`). The agent's display name is on its User row (`backend/models/User.ts:135`). The shared board (`V2PodBoard.tsx:244`). | 2026-10-27 | -| Landing FAQ 6 | A task claimed on the board shows as taken to everyone, and a connector grant gives one agent read access to one tool without handing over your keys. | TRUE | A claimed task shows its claimer to pod members (`V2PodBoard.tsx:244`); claim route `backend/routes/tasksApi.ts:594`. A grant has a write mode and a tool list (`backend/models/RoomGrant.ts:12`; `backend/services/roomGrantService.ts:412`, `:418`). The broker returns a result with no credential (`backend/services/toolBrokerService.ts:1352`, `:1360-1365`). | 2026-10-27 | +| Landing FAQ 6 | A pod is where they work together: your Claude Code and a teammate's agent, each a named member, sharing one thread and one board with the people who run them. | FALSE | Failing clause: "sharing one thread". A pod is one room with many threads. Its messages are scoped by `podId` (`backend/models/pg/Message.ts:271`), a thread is one root plus its replies (`Message.ts:281-284`), and the UI groups messages per root (`frontend/src/v2/components/V2Thread.tsx:339`). The membership clause holds: agents join pods as members (`backend/services/agentIdentityService.ts:691`), and the agent's display name is on its User row (`backend/models/User.ts:135`). The shared board holds (`V2PodBoard.tsx:244`). | 2026-10-27 | +| Landing FAQ 6 | A task claimed on the board shows as taken to everyone, and a connector grant gives one agent read access to one tool without handing over your keys. | FALSE | Failing clause: "a connector grant gives one agent read access to one tool." A grant can list several tools (`backend/models/RoomGrant.ts:29`), allow `write` or `write-with-confirm` (`RoomGrant.ts:12`, `:30`), and list several audience members (`RoomGrant.ts:33`). The claimed-task clause holds: a claimed task shows its claimer to pod members (`V2PodBoard.tsx:244`; claim route `backend/routes/tasksApi.ts:594`). The no-credential clause holds: the broker returns a result with no credential (`backend/services/toolBrokerService.ts:1352`, `:1360-1365`). | 2026-10-27 | | firstRun `lede` (en.json:463) | Connect Claude Code or Codex, or run one here, then start a private conversation without leaving your workspace. | TRUE | Connect: `V2AgentBYO.tsx:73` (`claude`, `codex`). Run here: `en.json:1618`, `V2AgentBYO.tsx:546`. Private 1:1 room: `V2FirstRunHero.tsx:211` (POST `/api/agents/runtime/room`); `backend/routes/agentsRuntime.ts:917`. Codex has no Windows path (`en.json:1612`), so the "or" still holds there through Claude Code. | 2026-10-27 | | firstRun `connect.text` (en.json:469) | Generate its private runtime token and copy the setup command for your tool. | TRUE | Issue: `V2AgentBYO.tsx:733-736` (POST without `force`); route `backend/routes/registry/agent-tokens.ts:157`. Setup commands: `V2AgentBYO.tsx:957-965`. Caveat: if a token already exists, nothing is generated. The page opens the replacement confirmation instead (`V2AgentBYO.tsx:737-740`; copy `en.json:1555`). | 2026-10-27 | | firstRun `connect.openSetup` (en.json:470) | Open connection setup | TRUE | `V2FirstRunHero.tsx:263-274` (link to `/v2/agents/byo`, new tab). | 2026-10-27 | @@ -64,6 +64,10 @@ These are not fixed in this PR. The launch copy PR corrects each failing clause 6. **Landing FAQ 6, premise.** "Anthropic recommends one agent loop over subagents": no source on `main`. 7. **Landing FAQ 6, sentence 1.** "Commonly doesn't split an agent into subagents": the Claude Code adapter cues subagents, and the gateway caps them at 4. +8. **Landing FAQ 6, sentence 3.** "Sharing one thread": a pod is one room with many threads, one per + root message. +9. **Landing FAQ 6, sentence 4.** "Read access to one tool": a connector grant can list several tools + and allow `write` or `write-with-confirm`. ## Checks closed From 5b47cf7c0170b6830e85ac4cd8d88b001f4cbcea Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Tue, 27 Oct 2026 09:11:06 -0700 Subject: [PATCH 3/6] docs(audit): mark landing FAQ 6 row 42 fixed in #2886 "sharing one thread" is replaced with "sharing the same conversations" in frontend/src/content/landing-faq.json:24 by #2886. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: quire Agent-Model: claude/claude-haiku-5-5/high Co-authored-by: wren Agent-Model: claude/claude-haiku-5-5/max --- docs/audits/landing-faq-firstrun-claims.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/audits/landing-faq-firstrun-claims.md b/docs/audits/landing-faq-firstrun-claims.md index 42169e71bf..d5ccd1f743 100644 --- a/docs/audits/landing-faq-firstrun-claims.md +++ b/docs/audits/landing-faq-firstrun-claims.md @@ -39,7 +39,7 @@ claim-bearing `firstRun` keys (`frontend/src/i18n/locales/en.json`, lines 460– | Landing FAQ 6 (premise) | Anthropic recommends one agent loop over subagents. | FALSE | No source on `main` states or supports this. A TRUE verdict needs a `file:line` on `main`, and the only match for the phrase is the FAQ entry itself (`frontend/src/content/landing-faq.json:23`). The launch copy PR must source the claim or cut it. | 2026-10-27 | | Landing FAQ 6 | For a single agent, we agree: each expert should be one strong loop, and Commonly doesn't split an agent into subagents. | FALSE | Failing clause: "Commonly doesn't split an agent into subagents". The Claude Code adapter cues parallel read-only subagents for non-public seats (`cli/src/lib/adapters/claude.js:113-116`, applied at `:1077`). The gateway caps subagent concurrency at 4 (`backend/services/agentProvisionerService.ts:929-932`). | 2026-10-27 | | Landing FAQ 6 | Across a team, work still divides by expertise and ownership, so there are several of those experts, each running under its own owner. | TRUE | Each agent has a required installer (`backend/models/AgentRegistry.ts:261`). Runtime tokens are issued for an owner (`backend/routes/registry/agent-tokens.ts:224`). "Divides by expertise" is framing that no code asserts. | 2026-10-27 | -| Landing FAQ 6 | A pod is where they work together: your Claude Code and a teammate's agent, each a named member, sharing one thread and one board with the people who run them. | FALSE | Failing clause: "sharing one thread". A pod is one room with many threads. Its messages are scoped by `podId` (`backend/models/pg/Message.ts:271`), a thread is one root plus its replies (`Message.ts:281-284`), and the UI groups messages per root (`frontend/src/v2/components/V2Thread.tsx:339`). The membership clause holds: agents join pods as members (`backend/services/agentIdentityService.ts:691`), and the agent's display name is on its User row (`backend/models/User.ts:135`). The shared board holds (`V2PodBoard.tsx:244`). | 2026-10-27 | +| Landing FAQ 6 | A pod is where they work together: your Claude Code and a teammate's agent, each a named member, sharing one thread and one board with the people who run them. | FALSE → fixed in #2886 ("sharing the same conversations") | Failing clause: "sharing one thread". A pod is one room with many threads. Its messages are scoped by `podId` (`backend/models/pg/Message.ts:271`), a thread is one root plus its replies (`Message.ts:281-284`), and the UI groups messages per root (`frontend/src/v2/components/V2Thread.tsx:339`). The membership clause holds: agents join pods as members (`backend/services/agentIdentityService.ts:691`), and the agent's display name is on its User row (`backend/models/User.ts:135`). The shared board holds (`V2PodBoard.tsx:244`). | 2026-10-27 | | Landing FAQ 6 | A task claimed on the board shows as taken to everyone, and a connector grant gives one agent read access to one tool without handing over your keys. | FALSE | Failing clause: "a connector grant gives one agent read access to one tool." A grant can list several tools (`backend/models/RoomGrant.ts:29`), allow `write` or `write-with-confirm` (`RoomGrant.ts:12`, `:30`), and list several audience members (`RoomGrant.ts:33`). The claimed-task clause holds: a claimed task shows its claimer to pod members (`V2PodBoard.tsx:244`; claim route `backend/routes/tasksApi.ts:594`). The no-credential clause holds: the broker returns a result with no credential (`backend/services/toolBrokerService.ts:1352`, `:1360-1365`). | 2026-10-27 | | firstRun `lede` (en.json:463) | Connect Claude Code or Codex, or run one here, then start a private conversation without leaving your workspace. | TRUE | Connect: `V2AgentBYO.tsx:73` (`claude`, `codex`). Run here: `en.json:1618`, `V2AgentBYO.tsx:546`. Private 1:1 room: `V2FirstRunHero.tsx:211` (POST `/api/agents/runtime/room`); `backend/routes/agentsRuntime.ts:917`. Codex has no Windows path (`en.json:1612`), so the "or" still holds there through Claude Code. | 2026-10-27 | | firstRun `connect.text` (en.json:469) | Generate its private runtime token and copy the setup command for your tool. | TRUE | Issue: `V2AgentBYO.tsx:733-736` (POST without `force`); route `backend/routes/registry/agent-tokens.ts:157`. Setup commands: `V2AgentBYO.tsx:957-965`. Caveat: if a token already exists, nothing is generated. The page opens the replacement confirmation instead (`V2AgentBYO.tsx:737-740`; copy `en.json:1555`). | 2026-10-27 | From e539f33917c6f990f2776a4ca006cdd414f28cc1 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Tue, 27 Oct 2026 09:32:20 -0700 Subject: [PATCH 4/6] docs(audit): re-cite FAQ 5 needs-a-person, retarget FAQ 6 fix (TASK-009) Header SHA moves to a6058f39d. The only commit since 67dd25b21 (#2752, OAuth) touches no cited file. Row 38: "needs a person" now cites the Needs-you queue (V2ActivityPage.tsx:1244, fed by the decision-queue route). The demo seed cite (activityService.ts:1416) is gone. "Finished" is added as a failing clause: the board status is projected at activityService.ts:274, but the page never reads it. Row 39: the FAQ 6 premise sits in the fixed question, so the row says so. Fix item 6 targets the answer's "we agree" (landing-faq.json:24), not the question. The Not-scored note now says a declarative premise inside a question is scored. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: wren Agent-Model: claude/claude-haiku-5-5/max --- docs/audits/landing-faq-firstrun-claims.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/audits/landing-faq-firstrun-claims.md b/docs/audits/landing-faq-firstrun-claims.md index d5ccd1f743..4856f0d6f9 100644 --- a/docs/audits/landing-faq-firstrun-claims.md +++ b/docs/audits/landing-faq-firstrun-claims.md @@ -2,7 +2,8 @@ Audit of the six landing FAQ items (`frontend/src/content/landing-faq.json`) and the claim-bearing `firstRun` keys (`frontend/src/i18n/locales/en.json`, lines 460–489). Audit SHA -`67dd25b21` (`main`). Every line number below is from that SHA. +`a6058f39d` (`main`). Every line number below is from that SHA. The only commit since +`67dd25b21` is #2752 (OAuth), which touches no file cited here. ## Scope and rules @@ -35,8 +36,8 @@ claim-bearing `firstRun` keys (`frontend/src/i18n/locales/en.json`, lines 460– | Landing FAQ 4 | Several agents, such as Claude Code, Codex, OpenCode and a hosted agent, work alongside people in one pod. | TRUE | Judged on the class, several agent runtimes in one pod: `backend/services/agentIdentityService.ts:691`; connect paths `V2AgentBYO.tsx:73`; hosted path `V2AgentBYO.tsx:546`. The named OpenCode example fails in Landing FAQ 1 (`byoHandoffService.ts:115-118`), so the launch copy PR should narrow it. | 2026-10-27 | | Landing FAQ 4 | They claim tasks on a shared board, post what they tried, and ask a person on a decision card when the call is theirs. | TRUE | Claim: `backend/routes/tasksApi.ts:594`. Post an update: `backend/routes/tasksApi.ts:787`. Decision card for a genuine fork that needs a human choice: `cli/src/lib/enforcement.js:38-40`. | 2026-10-27 | | Landing FAQ 5 | In a Commonly pod, Claude Code, Codex and OpenCode from teammates' machines, plus a hosted agent, share one chat and task board with the people on the team. | FALSE | Failing clauses: OpenCode from a teammate's machine (`V2AgentBYO.tsx:73`; `byoHandoffService.ts:115-118`), and Codex from a Windows machine (`en.json:1612`). The hosted agent is real (`V2AgentBYO.tsx:546`). The shared board resolves each claimer for all pod members (`frontend/src/v2/components/V2PodBoard.tsx:244`). | 2026-10-27 | -| Landing FAQ 5 | Activity shows what each agent claimed and finished, and what needs a person. | FALSE | Failing clause: "what each agent claimed". Activity lists a board item only when it has a `lastUpdate` (`frontend/src/v2/components/V2ActivityPage.tsx:796-803`) and names no claimer. The claimer lookup exists only on the board (`V2PodBoard.tsx:244`). "Finished" is the status mapping (`backend/services/activityService.ts:254-286`). "Needs a person" is pending decision items (`activityService.ts:1416`). | 2026-10-27 | -| Landing FAQ 6 (premise) | Anthropic recommends one agent loop over subagents. | FALSE | No source on `main` states or supports this. A TRUE verdict needs a `file:line` on `main`, and the only match for the phrase is the FAQ entry itself (`frontend/src/content/landing-faq.json:23`). The launch copy PR must source the claim or cut it. | 2026-10-27 | +| Landing FAQ 5 | Activity shows what each agent claimed and finished, and what needs a person. | FALSE | Failing clauses: "what each agent claimed" and "finished". Activity lists a board item only when it has a `lastUpdate` (`frontend/src/v2/components/V2ActivityPage.tsx:796-803`) and names no claimer. The claimer lookup exists only on the board (`V2PodBoard.tsx:244`). "Finished" has no state on Activity: the board `status` is projected (`backend/services/activityService.ts:274`), but the page never reads it (`V2ActivityPage.tsx:796-804` renders the title and last update only), and `activity.board.done` (`frontend/src/i18n/locales/en.json:277`) has no reader in `frontend/src`. "Needs a person" holds: the Needs-you heading (`V2ActivityPage.tsx:1244`) is fed by `/api/activity/decision-queue` (`V2ActivityPage.tsx:623`), then `activityService.ts:389-397`, then `attentionItemService.ts:676` (route `backend/routes/activity.ts:117,186`). | 2026-10-27 | +| Landing FAQ 6 (premise, in the question) | Anthropic recommends one agent loop over subagents. | FALSE | No source on `main` states or supports this. A TRUE verdict needs a `file:line` on `main`, and the only match for the phrase is the question itself (`frontend/src/content/landing-faq.json:23`). The question is fixed text (`frontend/src/v2/landing/landingFaq.ts:4-8`) and came from GTM's entry (`landingFaq.ts:5`), so the copy PR cannot reword it. The premise needs a GTM decision. Item 6 is the part the copy PR can change. | 2026-10-27 | | Landing FAQ 6 | For a single agent, we agree: each expert should be one strong loop, and Commonly doesn't split an agent into subagents. | FALSE | Failing clause: "Commonly doesn't split an agent into subagents". The Claude Code adapter cues parallel read-only subagents for non-public seats (`cli/src/lib/adapters/claude.js:113-116`, applied at `:1077`). The gateway caps subagent concurrency at 4 (`backend/services/agentProvisionerService.ts:929-932`). | 2026-10-27 | | Landing FAQ 6 | Across a team, work still divides by expertise and ownership, so there are several of those experts, each running under its own owner. | TRUE | Each agent has a required installer (`backend/models/AgentRegistry.ts:261`). Runtime tokens are issued for an owner (`backend/routes/registry/agent-tokens.ts:224`). "Divides by expertise" is framing that no code asserts. | 2026-10-27 | | Landing FAQ 6 | A pod is where they work together: your Claude Code and a teammate's agent, each a named member, sharing one thread and one board with the people who run them. | FALSE → fixed in #2886 ("sharing the same conversations") | Failing clause: "sharing one thread". A pod is one room with many threads. Its messages are scoped by `podId` (`backend/models/pg/Message.ts:271`), a thread is one root plus its replies (`Message.ts:281-284`), and the UI groups messages per root (`frontend/src/v2/components/V2Thread.tsx:339`). The membership clause holds: agents join pods as members (`backend/services/agentIdentityService.ts:691`), and the agent's display name is on its User row (`backend/models/User.ts:135`). The shared board holds (`V2PodBoard.tsx:244`). | 2026-10-27 | @@ -60,8 +61,8 @@ These are not fixed in this PR. The launch copy PR corrects each failing clause only pre-action gate on `main` is the approval card for connector writes. 3. **Landing FAQ 3, sentence 2.** Replies come "in a thread": the default is one top-level post. 4. **Landing FAQ 5, sentence 1.** OpenCode from teammates' machines, and Codex from a Windows machine. -5. **Landing FAQ 5, sentence 2.** "What each agent claimed": Activity names no claimer. -6. **Landing FAQ 6, premise.** "Anthropic recommends one agent loop over subagents": no source on `main`. +5. **Landing FAQ 5, sentence 2.** "What each agent claimed" and "finished": Activity names no claimer and renders no board status. +6. **Landing FAQ 6, premise (row 39).** The question is fixed text, so the copy PR changes only the answer. Its first sentence opens "we agree" (`landing-faq.json:24`), which agrees with a premise no file on `main` states. The copy PR drops "we agree" in the same edit as item 7. The premise itself needs a GTM decision. 7. **Landing FAQ 6, sentence 1.** "Commonly doesn't split an agent into subagents": the Claude Code adapter cues subagents, and the gateway caps them at 4. 8. **Landing FAQ 6, sentence 3.** "Sharing one thread": a pod is one room with many threads, one per @@ -80,8 +81,9 @@ These are not fixed in this PR. The launch copy PR corrects each failing clause ## Not scored -- The six FAQ questions are fixed and not scored (`frontend/src/v2/landing/landingFaq.ts:4-8`). - "Isn't Commonly a multi-agent system?" is a question, not a claim. +- The six FAQ questions are fixed text (`frontend/src/v2/landing/landingFaq.ts:4-8`), so the copy + PR cannot reword them. A question is scored only for a declarative premise inside it. + "Isn't Commonly a multi-agent system?" has none. FAQ 6's question has one, scored in row 39. - firstRun labels with no claim are not rows: eyebrow, title, skip, reopen, step titles, and button labels. The eyebrow "Your first five minutes" (`en.json:461`) is a time estimate with no code behind it. The launch copy PR decides whether to keep it. From 696ec23f6051af3b1176e0cb076c19794b3202b3 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Tue, 27 Oct 2026 10:55:41 -0700 Subject: [PATCH 5/6] docs(audit): row 43 is FALSE, row 42 stays TRUE with its expertise cite (TASK-009) - Row 42: the expertise clause now cites the preset rule (presets.ts:1609-1610). The rule is prompt text, not a platform router, and the row says so. - Row 43: verdict is FALSE. The fix status moves into the evidence, and the per-root grouping cite is threadView.ts:69-108 (CodeRabbit 5670415810). - FALSE item 6 and the Not Scored line cite row 40, the premise row (was row 39). - Scope: note that #2886 merged after the audit SHA and rewrote the copy. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: wren Agent-Model: claude/claude-haiku-5-5/max --- docs/audits/landing-faq-firstrun-claims.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/audits/landing-faq-firstrun-claims.md b/docs/audits/landing-faq-firstrun-claims.md index 4856f0d6f9..1cbe3111e8 100644 --- a/docs/audits/landing-faq-firstrun-claims.md +++ b/docs/audits/landing-faq-firstrun-claims.md @@ -12,6 +12,10 @@ claim-bearing `firstRun` keys (`frontend/src/i18n/locales/en.json`, lines 460– - **Per sentence.** Each sentence of the copy is one row. A sentence is FALSE if any reader it addresses is told something the code does not do. "Such as" lists are judged on the class. - **Evidence age.** Evidence is no older than 14 days. All rows are dated 2026-10-27. +- **Merged after this SHA.** The launch copy PR, #2886 (`555db7399`, 2026-10-27 16:51Z), rewrote the + failing clause in eight of the nine FALSE rows, all in `landing-faq.json`. Row 40 is only partly + done: the FAQ 6 question was reworded, which `landingFaq.ts:6` says not to do, and the answer keeps + "we agree" (item 6). Verdicts stay pinned to `a6058f39d`; the new copy is not re-audited here. - **No copy edits in this audit.** Every FALSE row is fixed by the launch copy PR. A staff session writes that copy, and it is gated with an Opus review and rendered. - **Split.** The landing FAQ and firstRun copy ship before the freeze. The other 27 uncovered @@ -39,8 +43,8 @@ claim-bearing `firstRun` keys (`frontend/src/i18n/locales/en.json`, lines 460– | Landing FAQ 5 | Activity shows what each agent claimed and finished, and what needs a person. | FALSE | Failing clauses: "what each agent claimed" and "finished". Activity lists a board item only when it has a `lastUpdate` (`frontend/src/v2/components/V2ActivityPage.tsx:796-803`) and names no claimer. The claimer lookup exists only on the board (`V2PodBoard.tsx:244`). "Finished" has no state on Activity: the board `status` is projected (`backend/services/activityService.ts:274`), but the page never reads it (`V2ActivityPage.tsx:796-804` renders the title and last update only), and `activity.board.done` (`frontend/src/i18n/locales/en.json:277`) has no reader in `frontend/src`. "Needs a person" holds: the Needs-you heading (`V2ActivityPage.tsx:1244`) is fed by `/api/activity/decision-queue` (`V2ActivityPage.tsx:623`), then `activityService.ts:389-397`, then `attentionItemService.ts:676` (route `backend/routes/activity.ts:117,186`). | 2026-10-27 | | Landing FAQ 6 (premise, in the question) | Anthropic recommends one agent loop over subagents. | FALSE | No source on `main` states or supports this. A TRUE verdict needs a `file:line` on `main`, and the only match for the phrase is the question itself (`frontend/src/content/landing-faq.json:23`). The question is fixed text (`frontend/src/v2/landing/landingFaq.ts:4-8`) and came from GTM's entry (`landingFaq.ts:5`), so the copy PR cannot reword it. The premise needs a GTM decision. Item 6 is the part the copy PR can change. | 2026-10-27 | | Landing FAQ 6 | For a single agent, we agree: each expert should be one strong loop, and Commonly doesn't split an agent into subagents. | FALSE | Failing clause: "Commonly doesn't split an agent into subagents". The Claude Code adapter cues parallel read-only subagents for non-public seats (`cli/src/lib/adapters/claude.js:113-116`, applied at `:1077`). The gateway caps subagent concurrency at 4 (`backend/services/agentProvisionerService.ts:929-932`). | 2026-10-27 | -| Landing FAQ 6 | Across a team, work still divides by expertise and ownership, so there are several of those experts, each running under its own owner. | TRUE | Each agent has a required installer (`backend/models/AgentRegistry.ts:261`). Runtime tokens are issued for an owner (`backend/routes/registry/agent-tokens.ts:224`). "Divides by expertise" is framing that no code asserts. | 2026-10-27 | -| Landing FAQ 6 | A pod is where they work together: your Claude Code and a teammate's agent, each a named member, sharing one thread and one board with the people who run them. | FALSE → fixed in #2886 ("sharing the same conversations") | Failing clause: "sharing one thread". A pod is one room with many threads. Its messages are scoped by `podId` (`backend/models/pg/Message.ts:271`), a thread is one root plus its replies (`Message.ts:281-284`), and the UI groups messages per root (`frontend/src/v2/components/V2Thread.tsx:339`). The membership clause holds: agents join pods as members (`backend/services/agentIdentityService.ts:691`), and the agent's display name is on its User row (`backend/models/User.ts:135`). The shared board holds (`V2PodBoard.tsx:244`). | 2026-10-27 | +| Landing FAQ 6 | Across a team, work still divides by expertise and ownership, so there are several of those experts, each running under its own owner. | TRUE | Expertise: the preset rules say "Never do the work. Coordinate it. Route it." and to @mention another agent "ONLY when their specific expertise is needed" (`backend/routes/registry/presets.ts:1609-1610`). That is prompt text, not a platform router. Each agent has a required installer (`backend/models/AgentRegistry.ts:261`). Runtime tokens are issued for an owner (`backend/routes/registry/agent-tokens.ts:224`). | 2026-10-27 | +| Landing FAQ 6 | A pod is where they work together: your Claude Code and a teammate's agent, each a named member, sharing one thread and one board with the people who run them. | FALSE | Failing clause: "sharing one thread". A pod is one room with many threads. Its messages are scoped by `podId` (`backend/models/pg/Message.ts:271`), a thread is one root plus its replies (`Message.ts:281-284`), and the UI groups messages per root (`frontend/src/v2/utils/threadView.ts:69-108`). Status: #2886 (merged `555db7399`, 2026-10-27 16:51Z) changes this clause to "sharing the same conversations"; not re-audited at that SHA. The membership clause holds: agents join pods as members (`backend/services/agentIdentityService.ts:691`), and the agent's display name is on its User row (`backend/models/User.ts:135`). The shared board holds (`V2PodBoard.tsx:244`). | 2026-10-27 | | Landing FAQ 6 | A task claimed on the board shows as taken to everyone, and a connector grant gives one agent read access to one tool without handing over your keys. | FALSE | Failing clause: "a connector grant gives one agent read access to one tool." A grant can list several tools (`backend/models/RoomGrant.ts:29`), allow `write` or `write-with-confirm` (`RoomGrant.ts:12`, `:30`), and list several audience members (`RoomGrant.ts:33`). The claimed-task clause holds: a claimed task shows its claimer to pod members (`V2PodBoard.tsx:244`; claim route `backend/routes/tasksApi.ts:594`). The no-credential clause holds: the broker returns a result with no credential (`backend/services/toolBrokerService.ts:1352`, `:1360-1365`). | 2026-10-27 | | firstRun `lede` (en.json:463) | Connect Claude Code or Codex, or run one here, then start a private conversation without leaving your workspace. | TRUE | Connect: `V2AgentBYO.tsx:73` (`claude`, `codex`). Run here: `en.json:1618`, `V2AgentBYO.tsx:546`. Private 1:1 room: `V2FirstRunHero.tsx:211` (POST `/api/agents/runtime/room`); `backend/routes/agentsRuntime.ts:917`. Codex has no Windows path (`en.json:1612`), so the "or" still holds there through Claude Code. | 2026-10-27 | | firstRun `connect.text` (en.json:469) | Generate its private runtime token and copy the setup command for your tool. | TRUE | Issue: `V2AgentBYO.tsx:733-736` (POST without `force`); route `backend/routes/registry/agent-tokens.ts:157`. Setup commands: `V2AgentBYO.tsx:957-965`. Caveat: if a token already exists, nothing is generated. The page opens the replacement confirmation instead (`V2AgentBYO.tsx:737-740`; copy `en.json:1555`). | 2026-10-27 | @@ -62,7 +66,7 @@ These are not fixed in this PR. The launch copy PR corrects each failing clause 3. **Landing FAQ 3, sentence 2.** Replies come "in a thread": the default is one top-level post. 4. **Landing FAQ 5, sentence 1.** OpenCode from teammates' machines, and Codex from a Windows machine. 5. **Landing FAQ 5, sentence 2.** "What each agent claimed" and "finished": Activity names no claimer and renders no board status. -6. **Landing FAQ 6, premise (row 39).** The question is fixed text, so the copy PR changes only the answer. Its first sentence opens "we agree" (`landing-faq.json:24`), which agrees with a premise no file on `main` states. The copy PR drops "we agree" in the same edit as item 7. The premise itself needs a GTM decision. +6. **Landing FAQ 6, premise (row 40).** The question is fixed text, so the copy PR changes only the answer. Its first sentence opens "we agree" (`landing-faq.json:24`), which agrees with a premise no file on `main` states. The copy PR drops "we agree" in the same edit as item 7. The premise itself needs a GTM decision. 7. **Landing FAQ 6, sentence 1.** "Commonly doesn't split an agent into subagents": the Claude Code adapter cues subagents, and the gateway caps them at 4. 8. **Landing FAQ 6, sentence 3.** "Sharing one thread": a pod is one room with many threads, one per @@ -83,7 +87,7 @@ These are not fixed in this PR. The launch copy PR corrects each failing clause - The six FAQ questions are fixed text (`frontend/src/v2/landing/landingFaq.ts:4-8`), so the copy PR cannot reword them. A question is scored only for a declarative premise inside it. - "Isn't Commonly a multi-agent system?" has none. FAQ 6's question has one, scored in row 39. + "Isn't Commonly a multi-agent system?" has none. FAQ 6's question has one, scored in row 40. - firstRun labels with no claim are not rows: eyebrow, title, skip, reopen, step titles, and button labels. The eyebrow "Your first five minutes" (`en.json:461`) is a time estimate with no code behind it. The launch copy PR decides whether to keep it. From 63f8097163847bff2102b0c6f00dc228f9fc0200 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Tue, 27 Oct 2026 11:06:18 -0700 Subject: [PATCH 6/6] docs(audit): name the FAQ 6 premise row by its label (TASK-009) Row numbers move when rows are added above them, so the premise row is named by its label, Landing FAQ 6 (premise, in the question), at the three places that cited it. Item 6 said the copy PR drops "we agree". #2886 keeps it (landing-faq.json:24) and drops the subagent clause in item 7. It also said the question was fixed text, which #2886 did not keep. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: wren Agent-Model: claude/claude-haiku-5-5/max --- docs/audits/landing-faq-firstrun-claims.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/audits/landing-faq-firstrun-claims.md b/docs/audits/landing-faq-firstrun-claims.md index 1cbe3111e8..30e2ed5f86 100644 --- a/docs/audits/landing-faq-firstrun-claims.md +++ b/docs/audits/landing-faq-firstrun-claims.md @@ -13,7 +13,7 @@ claim-bearing `firstRun` keys (`frontend/src/i18n/locales/en.json`, lines 460– addresses is told something the code does not do. "Such as" lists are judged on the class. - **Evidence age.** Evidence is no older than 14 days. All rows are dated 2026-10-27. - **Merged after this SHA.** The launch copy PR, #2886 (`555db7399`, 2026-10-27 16:51Z), rewrote the - failing clause in eight of the nine FALSE rows, all in `landing-faq.json`. Row 40 is only partly + failing clause in eight of the nine FALSE rows, all in `landing-faq.json`. Landing FAQ 6 (premise, in the question) is only partly done: the FAQ 6 question was reworded, which `landingFaq.ts:6` says not to do, and the answer keeps "we agree" (item 6). Verdicts stay pinned to `a6058f39d`; the new copy is not re-audited here. - **No copy edits in this audit.** Every FALSE row is fixed by the launch copy PR. A staff session @@ -66,7 +66,7 @@ These are not fixed in this PR. The launch copy PR corrects each failing clause 3. **Landing FAQ 3, sentence 2.** Replies come "in a thread": the default is one top-level post. 4. **Landing FAQ 5, sentence 1.** OpenCode from teammates' machines, and Codex from a Windows machine. 5. **Landing FAQ 5, sentence 2.** "What each agent claimed" and "finished": Activity names no claimer and renders no board status. -6. **Landing FAQ 6, premise (row 40).** The question is fixed text, so the copy PR changes only the answer. Its first sentence opens "we agree" (`landing-faq.json:24`), which agrees with a premise no file on `main` states. The copy PR drops "we agree" in the same edit as item 7. The premise itself needs a GTM decision. +6. **Landing FAQ 6 (premise, in the question).** The question was fixed text at this SHA, and #2886 rewrote it (see Merged after this SHA). Its first sentence opens "we agree" (`landing-faq.json:24`), which agrees with a premise no file on `main` states. #2886 keeps "we agree" and drops the subagent clause in item 7. The premise itself needs a GTM decision. 7. **Landing FAQ 6, sentence 1.** "Commonly doesn't split an agent into subagents": the Claude Code adapter cues subagents, and the gateway caps them at 4. 8. **Landing FAQ 6, sentence 3.** "Sharing one thread": a pod is one room with many threads, one per @@ -87,7 +87,7 @@ These are not fixed in this PR. The launch copy PR corrects each failing clause - The six FAQ questions are fixed text (`frontend/src/v2/landing/landingFaq.ts:4-8`), so the copy PR cannot reword them. A question is scored only for a declarative premise inside it. - "Isn't Commonly a multi-agent system?" has none. FAQ 6's question has one, scored in row 40. + "Isn't Commonly a multi-agent system?" has none. FAQ 6's question has one, scored in Landing FAQ 6 (premise, in the question). - firstRun labels with no claim are not rows: eyebrow, title, skip, reopen, step titles, and button labels. The eyebrow "Your first five minutes" (`en.json:461`) is a time estimate with no code behind it. The launch copy PR decides whether to keep it.