From 2ec82ed9e616f79066fa0ef186b812f6e91d6966 Mon Sep 17 00:00:00 2001 From: Joshua Snyder Date: Wed, 29 Jul 2026 19:00:31 +0100 Subject: [PATCH 1/5] Label untitled reports as "report" not "signal" in mobile inbox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The mobile inbox fell back to "Untitled signal" for reports with no title, but the object is a report — the desktop app and mobile's own TinderView already say "Untitled report". Aligns the four remaining spots. Generated-By: PostHog Code Task-Id: c095eab9-ff75-4110-8b4f-d29ca1bd95da --- apps/mobile/src/app/inbox/[...id].tsx | 4 ++-- .../src/features/inbox/components/ArchivedReportList.tsx | 2 +- apps/mobile/src/features/inbox/components/ReportListRow.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/mobile/src/app/inbox/[...id].tsx b/apps/mobile/src/app/inbox/[...id].tsx index 8ad989bfa9..5ffc461924 100644 --- a/apps/mobile/src/app/inbox/[...id].tsx +++ b/apps/mobile/src/app/inbox/[...id].tsx @@ -463,7 +463,7 @@ export default function ReportDetailScreen() { {/* Title */} - {report.title ?? "Untitled signal"} + {report.title ?? "Untitled report"} {/* Meta row */} @@ -638,7 +638,7 @@ export default function ReportDetailScreen() { setDismissOpen(false)} onDismissed={handleDismissed} /> diff --git a/apps/mobile/src/features/inbox/components/ArchivedReportList.tsx b/apps/mobile/src/features/inbox/components/ArchivedReportList.tsx index 72de972737..03524e145d 100644 --- a/apps/mobile/src/features/inbox/components/ArchivedReportList.tsx +++ b/apps/mobile/src/features/inbox/components/ArchivedReportList.tsx @@ -55,7 +55,7 @@ const ArchivedRow = memo(function ArchivedRow({ numberOfLines={2} ellipsizeMode="tail" > - {report.title ?? "Untitled signal"} + {report.title ?? "Untitled report"} diff --git a/apps/mobile/src/features/inbox/components/ReportListRow.tsx b/apps/mobile/src/features/inbox/components/ReportListRow.tsx index 3b0508bb83..e12cff57bf 100644 --- a/apps/mobile/src/features/inbox/components/ReportListRow.tsx +++ b/apps/mobile/src/features/inbox/components/ReportListRow.tsx @@ -70,7 +70,7 @@ function ReportListRowComponent({ report, onPress }: ReportListRowProps) { numberOfLines={2} ellipsizeMode="tail" > - {report.title ?? "Untitled signal"} + {report.title ?? "Untitled report"} From dc337f141047fadd0a5ab6cc4a9218ab6d86bce9 Mon Sep 17 00:00:00 2001 From: Joshua Snyder Date: Wed, 29 Jul 2026 19:18:43 +0100 Subject: [PATCH 2/5] Align inbox/scout copy with self-driving docs vocabulary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renames user-facing display strings to the canonical docs terms: "finding" → "signal" (scout emissions and report evidence), "Responder" → "agent" (the investigating agent), "skill" → "scout" (scout tooltips/labels), and "inbox item" → "report". Updates the inbox CLAUDE.md naming convention to match. Backend API fields, deep links, analytics event names, and type names are unchanged. Generated-By: PostHog Code Task-Id: c095eab9-ff75-4110-8b4f-d29ca1bd95da --- packages/ui/src/features/inbox/CLAUDE.md | 16 ++++++------- .../inbox/components/AgentRunDetail.tsx | 8 +++---- .../components/ConfigureAgentsSection.tsx | 10 ++++---- .../inbox/components/DataSourceSetup.tsx | 2 +- .../inbox/components/InboxDetailFrame.tsx | 8 +++---- .../inbox/components/PullRequestsTab.tsx | 2 +- .../features/inbox/components/ReportCard.tsx | 2 +- .../features/inbox/components/ReportsTab.tsx | 2 +- .../src/features/inbox/components/RunsTab.tsx | 6 ++--- .../utils/ExplainedDismissOptionLabels.tsx | 4 ++-- .../utils/SignalReportStatusBadge.tsx | 4 ++-- .../components/FleetFindingsCallout.tsx | 4 ++-- .../scouts/components/ScoutBadges.tsx | 2 +- .../scouts/components/ScoutConfigControls.tsx | 2 +- .../scouts/components/ScoutDetailHeader.tsx | 4 ++-- .../scouts/components/ScoutEmissionCard.tsx | 2 +- .../components/ScoutFindingDiscussButton.tsx | 8 +++---- .../components/ScoutFindingShareButton.tsx | 4 ++-- .../scouts/components/ScoutFindingsView.tsx | 24 +++++++++---------- .../scouts/components/ScoutRowCard.tsx | 4 ++-- .../SignalSlackNotificationsSettings.tsx | 2 +- 21 files changed, 60 insertions(+), 60 deletions(-) diff --git a/packages/ui/src/features/inbox/CLAUDE.md b/packages/ui/src/features/inbox/CLAUDE.md index 7ac2c6f467..b8b8273d57 100644 --- a/packages/ui/src/features/inbox/CLAUDE.md +++ b/packages/ui/src/features/inbox/CLAUDE.md @@ -4,13 +4,13 @@ The Inbox is the PostHog surface for **Self-driving**: agents that watch product ## Product Model -The renderer still talks to backend endpoints and TypeScript types with the legacy `signals` naming. User-facing copy should say **Self-driving**, **Responder**, **report**, **run**, or **finding** depending on context. Do not rename backend paths or shared API fields unless the PostHog Cloud backend has changed too. +The renderer still talks to backend endpoints and TypeScript types with the legacy `signals` naming. User-facing copy should say **Self-driving**, **agent**, **report**, **run**, or **signal** depending on context. Do not rename backend paths or shared API fields unless the PostHog Cloud backend has changed too. The main objects are: - `SignalReport`: the unit shown in all Inbox tabs. - Findings: the source observations that contributed to a report, fetched separately for detail screens. -- Artefacts: structured agent output attached to a report, such as priority, actionability, suggested reviewers, repo selection, and findings from research. +- Artefacts: structured agent output attached to a report, such as priority, actionability, suggested reviewers, repo selection, and signals from research. - Report tasks: links from a report to tasks created for research or implementation. ## Information Architecture @@ -53,7 +53,7 @@ same artefact-lift pattern as `priority`/`actionability`/`already_addressed` — so cards avoid an N+1 per-card artefact fetch. Unknown reason codes fall back to the raw value; cards with no dismissal artefact simply omit the chip. -Responder configuration is **not** an Inbox tab. It is the top-level Responders sidebar item at `/code/agents`. The legacy `/code/inbox/agents` route redirects there. +Agent configuration is **not** an Inbox tab. It is the top-level Agents sidebar item at `/code/agents`. The legacy `/code/inbox/agents` route redirects there. Reviewer scope is a UI preference stored in `inboxReviewerScopeStore`. It filters the list between reports suggested for the current user and reports for someone else. It does not change tab membership; the tab predicates are independent. @@ -90,7 +90,7 @@ Tab membership and counts live in `utils/reportMembership.ts`. Keep that file as Detail screens layer additional data on top of the base report: - `useInboxReportById(reportId)` for the report record. -- `useInboxReportSignals(reportId)` for contributing findings. +- `useInboxReportSignals(reportId)` for contributing signals. - `useInboxReportArtefacts(reportId)` for structured outputs such as suggested reviewers and repo selection. - `useReportTasks(reportId, status)` for linked research/implementation tasks. @@ -102,7 +102,7 @@ The Inbox reads from PostHog Cloud's Self-driving backend, currently implemented - `GET /api/projects/{teamId}/signals/reports/`: paginated report list. Supports filters such as status, ordering, source product, suggested reviewers, and priority. - `GET /api/projects/{teamId}/signals/reports/{id}/`: single report detail. -- `GET /api/projects/{teamId}/signals/reports/{id}/signals/`: contributing findings. +- `GET /api/projects/{teamId}/signals/reports/{id}/signals/`: contributing signals. - `GET /api/projects/{teamId}/signals/reports/{id}/artefacts/`: structured report artefacts. - `GET /api/projects/{teamId}/signals/reports/{id}/tasks/`: tasks linked to a report. @@ -112,7 +112,7 @@ Card headlines are derived client-side from `summary` by `utils/reportPresentati ## Configuration Surface -Responder setup lives in `features/agents/components/AgentsView.tsx`, which mounts `ConfigureAgentsSection`. This surface composes existing GitHub, Slack, source-toggle, and MCP configuration pieces. Keep setup copy outcome-focused: the user is asking Self-driving to figure out what matters, not choosing internal artefact types. +Agent setup lives in `features/agents/components/AgentsView.tsx`, which mounts `ConfigureAgentsSection`. This surface composes existing GitHub, Slack, source-toggle, and MCP configuration pieces. Keep setup copy outcome-focused: the user is asking Self-driving to figure out what matters, not choosing internal artefact types. Onboarding/setup should be task-backed when it starts work. Do not model it as a static checklist if the intended behavior is to launch an agent task. @@ -124,7 +124,7 @@ Shared primitives exist to keep the surfaces consistent: - `InboxDetailPageHeader` for detail headers. - `DetailSection` for content sections inside detail screens. -- `SignalsList` and the existing detail `SignalCard` for contributing findings. +- `SignalsList` and the existing detail `SignalCard` for contributing signals. - Badge and metadata helpers in `components/utils/` and `InboxMetaRow`. - `SOURCE_PRODUCT_META` for source-product labels and icons. @@ -134,7 +134,7 @@ When adding or changing UI, reuse those primitives first. Avoid encoding one-off - Do not reuse the deleted legacy `ReportListRow`, `ReportDetailPane`, or old list/detail stores. - Do not put page-level Inbox title or navigation into the global app header; `InboxView` owns the Inbox page chrome. -- Do not add a configure shortcut back into the Inbox header; Responders configuration is a sidebar destination. +- Do not add a configure shortcut back into the Inbox header; Agents configuration is a sidebar destination. - Scout (`signals_scout`) is a real Cloud source product. Keep it covered wherever source products surface: `INBOX_SOURCE_OPTIONS`, `SOURCE_PRODUCT_META`, and the scout-name display in `SignalCard`. - Scout management UI (fleet configuration, run history) lives in `features/scouts/` and is backed by the PostHog Cloud scout endpoints (`/api/projects/{teamId}/signals/scout/`). Do not add scout controls that have no backing endpoint there. - Do not put preview shims or mock report data in `apps/code/index.html`; the app shell should stay minimal. diff --git a/packages/ui/src/features/inbox/components/AgentRunDetail.tsx b/packages/ui/src/features/inbox/components/AgentRunDetail.tsx index c8751d0306..4f32aea5e9 100644 --- a/packages/ui/src/features/inbox/components/AgentRunDetail.tsx +++ b/packages/ui/src/features/inbox/components/AgentRunDetail.tsx @@ -110,7 +110,7 @@ function RunOutputWidget({ report }: { report: SignalReport }) { Research couldn't complete – check the task log below for the error. - The Responder may retry automatically. + The agent may retry automatically. @@ -123,7 +123,7 @@ function RunOutputWidget({ report }: { report: SignalReport }) { content={report.summary} fallback={ report.status === "in_progress" - ? "The Responder is investigating – partial findings will appear here as they land." + ? "The agent is investigating – partial signals will appear here as they land." : "Queued for research." } variant="detail" @@ -325,7 +325,7 @@ function AgentRunDetailContent({ report }: { report: SignalReport }) { <> - {signals.length} finding{signals.length === 1 ? "" : "s"} + {signals.length} signal{signals.length === 1 ? "" : "s"} )} @@ -412,7 +412,7 @@ function AgentRunDetailContent({ report }: { report: SignalReport }) { title="Evidence so far" rightSlot={ - {signals.length || report.signal_count} finding + {signals.length || report.signal_count} signal {(signals.length || report.signal_count) === 1 ? "" : "s"} } diff --git a/packages/ui/src/features/inbox/components/ConfigureAgentsSection.tsx b/packages/ui/src/features/inbox/components/ConfigureAgentsSection.tsx index 3f98471ae2..498917b5e8 100644 --- a/packages/ui/src/features/inbox/components/ConfigureAgentsSection.tsx +++ b/packages/ui/src/features/inbox/components/ConfigureAgentsSection.tsx @@ -125,7 +125,7 @@ export function ConfigureAgentsSection() { Scheduled agents that sweep this project on a cadence and emit - findings to your inbox.{" "} + signals to your inbox.{" "} {/* Placeholder docs link until a dedicated scouts page exists. */} {isLoading ? ( @@ -209,7 +209,7 @@ export function ConfigureAgentsSection() { diff --git a/packages/ui/src/features/inbox/components/InboxDetailFrame.tsx b/packages/ui/src/features/inbox/components/InboxDetailFrame.tsx index bcaacd6c00..e122dcd0ae 100644 --- a/packages/ui/src/features/inbox/components/InboxDetailFrame.tsx +++ b/packages/ui/src/features/inbox/components/InboxDetailFrame.tsx @@ -137,7 +137,7 @@ export function InboxDetailFrame({ {evidenceCount > 0 && ( <> - {evidenceCount} finding{evidenceCount === 1 ? "" : "s"} + {evidenceCount} signal{evidenceCount === 1 ? "" : "s"} @@ -151,7 +151,7 @@ export function InboxDetailFrame({ )} @@ -181,7 +181,7 @@ export function InboxDetailFrame({ @@ -196,7 +196,7 @@ export function InboxDetailFrame({ title={evidenceSection.title} rightSlot={ - {evidenceCount} finding + {evidenceCount} signal {evidenceCount === 1 ? "" : "s"} } diff --git a/packages/ui/src/features/inbox/components/PullRequestsTab.tsx b/packages/ui/src/features/inbox/components/PullRequestsTab.tsx index e29d53bdc9..1d33402ca5 100644 --- a/packages/ui/src/features/inbox/components/PullRequestsTab.tsx +++ b/packages/ui/src/features/inbox/components/PullRequestsTab.tsx @@ -24,7 +24,7 @@ export function PullRequestsTab() { entireProjectTitle: "No pull requests in the project right now", teammateTitle: "No pull requests for this reviewer right now", description: - "When a Responder ships a code change, the PR draft lands here for you to review and publish.", + "When an agent ships a code change, the PR draft lands here for you to review and publish.", }} /> ); diff --git a/packages/ui/src/features/inbox/components/ReportCard.tsx b/packages/ui/src/features/inbox/components/ReportCard.tsx index a58955c4af..3cdfbbe2d9 100644 --- a/packages/ui/src/features/inbox/components/ReportCard.tsx +++ b/packages/ui/src/features/inbox/components/ReportCard.tsx @@ -323,7 +323,7 @@ export function ReportCard(props: ReportCardProps) { > - {report.signal_count} finding + {report.signal_count} signal {report.signal_count !== 1 ? "s" : ""} diff --git a/packages/ui/src/features/inbox/components/ReportsTab.tsx b/packages/ui/src/features/inbox/components/ReportsTab.tsx index 1b531a0172..c33746e8a3 100644 --- a/packages/ui/src/features/inbox/components/ReportsTab.tsx +++ b/packages/ui/src/features/inbox/components/ReportsTab.tsx @@ -15,7 +15,7 @@ export function ReportsTab() { entireProjectTitle: "No reports in the project yet", teammateTitle: "No reports for this reviewer yet", description: - "Reports are what Responders surface when there's something worth your judgment but no clean code change to draft.", + "Reports are what agents surface when there's something worth your judgment but no clean code change to draft.", }} /> ); diff --git a/packages/ui/src/features/inbox/components/RunsTab.tsx b/packages/ui/src/features/inbox/components/RunsTab.tsx index af45dab0d9..8e4b41279f 100644 --- a/packages/ui/src/features/inbox/components/RunsTab.tsx +++ b/packages/ui/src/features/inbox/components/RunsTab.tsx @@ -95,10 +95,10 @@ export function RunsTab() { {scope === INBOX_SCOPE_FOR_YOU - ? "No Responders are working on something for you right now" + ? "No agents are working on something for you right now" : scope === INBOX_SCOPE_ENTIRE_PROJECT - ? "No Responders are working on anything in the project right now" - : "No Responders are working on something for this reviewer right now"} + ? "No agents are working on anything in the project right now" + : "No agents are working on something for this reviewer right now"} When Self-driving kicks one off, you'll see the live run land here diff --git a/packages/ui/src/features/inbox/components/utils/ExplainedDismissOptionLabels.tsx b/packages/ui/src/features/inbox/components/utils/ExplainedDismissOptionLabels.tsx index 5da50a8adf..203a3a5382 100644 --- a/packages/ui/src/features/inbox/components/utils/ExplainedDismissOptionLabels.tsx +++ b/packages/ui/src/features/inbox/components/utils/ExplainedDismissOptionLabels.tsx @@ -4,10 +4,10 @@ import { RadioGroup, Tooltip } from "@radix-ui/themes"; import type { ReactNode } from "react"; const PAUSE_OPTION_TOOLTIP = - "Snoozes this report: it briefly leaves your inbox while more context is gathered, and it can come back if new findings match."; + "Snoozes this report: it briefly leaves your inbox while more context is gathered, and it can come back if new signals match."; const SUPPRESS_OPTION_TOOLTIP = - "Archives permanently: the report leaves your inbox and matching findings will not surface it again. Your reason is saved with the report."; + "Archives permanently: the report leaves your inbox and matching signals will not surface it again. Your reason is saved with the report."; function dismissReasonOptionDomId(value: DismissalReasonOptionValue): string { return `dismiss-report-dialog-reason-${value}`; diff --git a/packages/ui/src/features/inbox/components/utils/SignalReportStatusBadge.tsx b/packages/ui/src/features/inbox/components/utils/SignalReportStatusBadge.tsx index 0acdd3e73b..9f72d0680e 100644 --- a/packages/ui/src/features/inbox/components/utils/SignalReportStatusBadge.tsx +++ b/packages/ui/src/features/inbox/components/utils/SignalReportStatusBadge.tsx @@ -8,10 +8,10 @@ const STATUS_TOOLTIPS: Record = { resolved: "This report is resolved — its implementation pull request merged.", pending_input: "This report needs human input in PostHog before it can proceed.", - in_progress: "An AI agent is actively researching this report's findings.", + in_progress: "An AI agent is actively researching this report's signals.", candidate: "Queued for research. An agent will pick this up shortly.", potential: - "Gathering findings. The report will be queued once enough evidence accumulates.", + "Gathering signals. The report will be queued once enough evidence accumulates.", failed: "Research failed. The report may be retried automatically.", suppressed: "This report has been suppressed and is out of your inbox.", deleted: "This report has been deleted.", diff --git a/packages/ui/src/features/scouts/components/FleetFindingsCallout.tsx b/packages/ui/src/features/scouts/components/FleetFindingsCallout.tsx index 45e6ac0440..ba2ee222c2 100644 --- a/packages/ui/src/features/scouts/components/FleetFindingsCallout.tsx +++ b/packages/ui/src/features/scouts/components/FleetFindingsCallout.tsx @@ -45,10 +45,10 @@ export function FleetFindingsCallout() { - Scout findings + Scout signals - {summary.totalCount} finding{summary.totalCount === 1 ? "" : "s"}{" "} + {summary.totalCount} signal{summary.totalCount === 1 ? "" : "s"}{" "} across {summary.scoutCount} scout {summary.scoutCount === 1 ? "" : "s"} {summary.latestEmittedAt ? ( diff --git a/packages/ui/src/features/scouts/components/ScoutBadges.tsx b/packages/ui/src/features/scouts/components/ScoutBadges.tsx index 4245298dfa..952e5cbf39 100644 --- a/packages/ui/src/features/scouts/components/ScoutBadges.tsx +++ b/packages/ui/src/features/scouts/components/ScoutBadges.tsx @@ -27,7 +27,7 @@ export function ScoutOriginBadge({ config }: { config: ScoutConfig }) { export function DryRunBadge({ config }: { config: ScoutConfig }) { if (config.emit) return null; return ( - + Mode - Dry run executes the scout but holds back its findings + Dry run executes the scout but holds back its signals {cloudSkillUrl ? ( - + track(ANALYTICS_EVENTS.SCOUT_ACTION, { action_type: "open_skill_in_posthog", diff --git a/packages/ui/src/features/scouts/components/ScoutEmissionCard.tsx b/packages/ui/src/features/scouts/components/ScoutEmissionCard.tsx index 14b502ee9b..cf1e3fbb85 100644 --- a/packages/ui/src/features/scouts/components/ScoutEmissionCard.tsx +++ b/packages/ui/src/features/scouts/components/ScoutEmissionCard.tsx @@ -83,7 +83,7 @@ export function ScoutEmissionCard({ className={`shrink-0 text-gray-9 transition-transform duration-150 ${expanded ? "rotate-90" : ""}`} /> - Finding + Signal confidence {Math.round(emission.confidence * 100)}% diff --git a/packages/ui/src/features/scouts/components/ScoutFindingDiscussButton.tsx b/packages/ui/src/features/scouts/components/ScoutFindingDiscussButton.tsx index b539ad6650..fb83bf8c96 100644 --- a/packages/ui/src/features/scouts/components/ScoutFindingDiscussButton.tsx +++ b/packages/ui/src/features/scouts/components/ScoutFindingDiscussButton.tsx @@ -56,7 +56,7 @@ export function ScoutFindingDiscussButton({ const { runTask, isRunning } = useScoutChatTask({ prompt, - taskLabel: "finding discussion", + taskLabel: "signal discussion", loggerScope: "scout-finding-discuss", chatType: "finding_discuss", surface: "scout_detail", @@ -85,7 +85,7 @@ export function ScoutFindingDiscussButton({