Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 6 additions & 10 deletions apps/code/snapshots.yml
Original file line number Diff line number Diff line change
Expand Up @@ -537,21 +537,17 @@ snapshots:
git-dialogs--sync-success--light:
hash: v1.k4693efd2.8d79d77c9338aeaa73734836f0e17fde987f6d3239914f4013889d3110e5088d.Rq-w2o1uhes_a5hUWqMXeiDkfnoPCZPt932LkEQXCco
loops-loopslistview--comprehensive--dark:
hash: v1.k4693efd2.c128012b7f910839e65e8eaf14d5456c93f90d77747d0625ca35fddd8d5adf7a.fuugB5Ov6boP7fg6fWP7A7IG2yYnPUAAWLKZLuV8rZ0
hash: v1.k4693efd2.25744a9471ec664c70e346ac5cb330c025a031626bc486abe8820b7b6dbc1a19.Shh8Yl7SdombnNc4-uJjlIbx-n4C0MGXxtOGB1bjJTY
loops-loopslistview--comprehensive--light:
hash: v1.k4693efd2.4d25a48e0bd7e60d3bbb433e246486e4c9ac95979db86e20eb8bf5cb119d1eb2.EzrENjVHwVMyV00pEA-71TeVomJtchiym5DqWFkujlA
hash: v1.k4693efd2.ef8e012cc506a0bf5e761ec8e89943820d4b391f7023f506da7d79586b49a356.ATiN8Y0hUmfGvr0rUytYWX-fITyHRTgeN1i_HOOGZuc
loops-loopslistview--long-mixed-list--dark:
hash: v1.k4693efd2.fdbf0c24cb386c4345279db3e648efe72aa8a2a984d491361522f62074a771c9.2QmRxRMWYFFfBFrbMm0Dm9rWcvd1lfRbc0egfzoESnY
hash: v1.k4693efd2.c9915e22655fe1f6b77eabaf11d8876648c387ceebac6cd8be1880e7255bd7a5.y-gyTKSp7wYbuS57TABRbEyMSL9_U1wvHYvbyCeAbiQ
loops-loopslistview--long-mixed-list--light:
hash: v1.k4693efd2.aa17d9b6f40fbd3914bd742951db9f90add0bd233c54170803c8483aeb45b43b.yXpqqGczOq1uW5k4Ie7ddNTnne-cFTglZ9cL800pXB4
loops-loopslistview--shared-page-header--dark:
hash: v1.k4693efd2.14ab860dcb0df51b4019f012288e45f3a2c4c23fa08e809efef8c04b5687fe36.qoMLHprZmV2wON156NBbl3sqP84a4nXgdYm1H6WpTVM
loops-loopslistview--shared-page-header--light:
hash: v1.k4693efd2.23be5408ff3b4a912a0ce0457af8638124b99a01c88a499d0f4204cee2c62487.dGBP1K08MA2Fvhml-BPl5eFra8U83JXmy04NK9wOQnM
hash: v1.k4693efd2.5fec9e1a3c14f1bc319cd7e5abc24b3d66ed787986a103b5330f49341d4983ad.mpD-eTS6vkSbsJdOYaHXASHQd5IiJGWRCb6uDGlzhpk
loops-loopslistview--with-builder-sessions--dark:
hash: v1.k4693efd2.df4a1a4764e1de7b69905814b09c30d9b43f705f5e66c7ad83829c567d4faa1a.jthufoX_KPbbxScjj3pPBA4lEtT9Ym6zUCH-v1759GM
hash: v1.k4693efd2.06b404e4016ba0eb86769331a574bc640be1ad26ebf3a04d0256334d1da041a3.fPfF8c2wNFREfy8dVRdsw7W9Fpqj7HEtuaERMroNHMA
loops-loopslistview--with-builder-sessions--light:
hash: v1.k4693efd2.eb65c38bb0de7efedbc0d7a6c27a6695528e2e6b60949617e7d22335b1e68c8b.fJr9uykvc8S7LI_ASXk5KRqxXCwIqh6ld9zfzs4shP0
hash: v1.k4693efd2.30f89915a12cadf313216403fb0f3e221f3c33cee763f0692ae2b96b4332e2b9.j00vexnH4QS0wJAHn7pQNpeITYYRtOxlvB2ngyzqU0c
primitives-pageheader--title-only--dark:
hash: v1.k4693efd2.f7f8c560b1e5cf20050189e10fc0f129e555ba672300a7a09bef5827c171a743.yP9Pp_k51agu_9Ri55Y7uCAPBQ1UTeUQJA9U9dPMKfQ
primitives-pageheader--title-only--light:
Expand Down
4 changes: 2 additions & 2 deletions apps/mobile/src/app/inbox/[...id].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,7 @@ export default function ReportDetailScreen() {

{/* Title */}
<Text className="mb-2 font-semibold text-[18px] text-gray-12">
{report.title ?? "Untitled signal"}
{report.title ?? "Untitled report"}
</Text>

{/* Meta row */}
Expand Down Expand Up @@ -638,7 +638,7 @@ export default function ReportDetailScreen() {
<DismissReportSheet
visible={dismissOpen}
reportId={report.id}
reportTitle={report.title?.trim() ? report.title : "Untitled signal"}
reportTitle={report.title?.trim() ? report.title : "Untitled report"}
onClose={() => setDismissOpen(false)}
onDismissed={handleDismissed}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const ArchivedRow = memo(function ArchivedRow({
numberOfLines={2}
ellipsizeMode="tail"
>
{report.title ?? "Untitled signal"}
{report.title ?? "Untitled report"}
</Text>

<View className="mt-1 flex-row flex-wrap items-center gap-2">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ function ReportListRowComponent({ report, onPress }: ReportListRowProps) {
numberOfLines={2}
ellipsizeMode="tail"
>
{report.title ?? "Untitled signal"}
{report.title ?? "Untitled report"}
</Text>

<View className="mt-1 flex-row items-center gap-2">
Expand Down
16 changes: 8 additions & 8 deletions packages/ui/src/features/inbox/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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.

Expand All @@ -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.

Expand All @@ -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.

Expand All @@ -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.

Expand All @@ -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.
Expand Down
8 changes: 4 additions & 4 deletions packages/ui/src/features/inbox/components/AgentRunDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ function RunOutputWidget({ report }: { report: SignalReport }) {
</Text>
<Text className="text-[12px] text-gray-11 leading-snug">
Research couldn't complete – check the task log below for the error.
The Responder may retry automatically.
The agent may retry automatically.
</Text>
</Flex>
</Flex>
Expand All @@ -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"
Expand Down Expand Up @@ -325,7 +325,7 @@ function AgentRunDetailContent({ report }: { report: SignalReport }) {
<>
<InboxMetaSeparator />
<InboxMetaText className="tabular-nums">
{signals.length} finding{signals.length === 1 ? "" : "s"}
{signals.length} signal{signals.length === 1 ? "" : "s"}
</InboxMetaText>
</>
)}
Expand Down Expand Up @@ -412,7 +412,7 @@ function AgentRunDetailContent({ report }: { report: SignalReport }) {
title="Evidence so far"
rightSlot={
<Text className="cursor-default select-none text-[11px] text-gray-10 tabular-nums">
{signals.length || report.signal_count} finding
{signals.length || report.signal_count} signal
{(signals.length || report.signal_count) === 1 ? "" : "s"}
</Text>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ export function ConfigureAgentsSection() {

<Subsection
title="Connections"
description="Foundational integrations responders read from and write to."
description="Foundational integrations agents read from and write to."
>
<GitHubIntegrationSection
hasGithubIntegration={hasGithubIntegration}
Expand All @@ -139,7 +139,7 @@ export function ConfigureAgentsSection() {
description={
<>
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. */}
<a
href="https://posthog.com/blog/self-driving-product"
Expand All @@ -156,8 +156,8 @@ export function ConfigureAgentsSection() {
</Subsection>

<Subsection
title="Responders"
description="Each source: 1. watches for signals, 2. spins up a Responder when something matters, 3. hands you solutions."
title="Signal sources"
description="Each source watches for signals and spins up work when something matters."
>
{isLoading ? (
<ResponderAgentRosterSkeleton />
Expand Down Expand Up @@ -209,7 +209,7 @@ export function ConfigureAgentsSection() {

<Subsection
title="MCP servers"
description="External tools responders can read from. PostHog data is always available; this is everything else."
description="External tools agents can read from. PostHog data is always available; this is everything else."
>
<Link
to="/settings/$category"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ function GitHubSetup({ onComplete, onCancel }: SetupFormProps) {
? "We didn't hear back from GitHub. If the browser tab was closed, click Try again."
: connecting
? "Waiting for GitHub… finish authorizing in your browser, then return here."
: "Connect your GitHub account to import issues as Self-driving findings.";
: "Connect your GitHub account to import issues as Self-driving signals.";
return (
<SetupFormContainer title="Connect GitHub">
<Flex direction="column" gap="3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ export function InboxDetailFrame({
{evidenceCount > 0 && (
<>
<InboxMetaText className="tabular-nums">
{evidenceCount} finding{evidenceCount === 1 ? "" : "s"}
{evidenceCount} signal{evidenceCount === 1 ? "" : "s"}
</InboxMetaText>
<InboxMetaSeparator />
</>
Expand All @@ -151,7 +151,7 @@ export function InboxDetailFrame({
<InboxMetaSeparator />
<InboxMetaSourceStack
sourceProducts={report.source_products}
labelPrefix="Responder · "
labelPrefix="Agent · "
/>
</>
)}
Expand Down Expand Up @@ -181,7 +181,7 @@ export function InboxDetailFrame({
<DetailSection Icon={SummaryIcon} title={summarySection.title}>
<SignalReportSummaryMarkdown
content={report.summary}
fallback="No summary yet – the Responder is still investigating."
fallback="No summary yet – the agent is still investigating."
variant="detail"
pending={report.status === "in_progress"}
/>
Expand All @@ -196,7 +196,7 @@ export function InboxDetailFrame({
title={evidenceSection.title}
rightSlot={
<Text className="cursor-default select-none text-[11px] text-gray-10 tabular-nums">
{evidenceCount} finding
{evidenceCount} signal
{evidenceCount === 1 ? "" : "s"}
</Text>
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
}}
/>
);
Expand Down
2 changes: 1 addition & 1 deletion packages/ui/src/features/inbox/components/ReportCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ export function ReportCard(props: ReportCardProps) {
>
<LightningIcon size={11} />
<span className="tabular-nums">
{report.signal_count} finding
{report.signal_count} signal
{report.signal_count !== 1 ? "s" : ""}
</span>
</Flex>
Expand Down
2 changes: 1 addition & 1 deletion packages/ui/src/features/inbox/components/ReportsTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
}}
/>
);
Expand Down
6 changes: 3 additions & 3 deletions packages/ui/src/features/inbox/components/RunsTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,10 @@ export function RunsTab() {
</EmptyMedia>
<EmptyTitle>
{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"}
</EmptyTitle>
<EmptyDescription>
When Self-driving kicks one off, you'll see the live run land here
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ const STATUS_TOOLTIPS: Record<string, string> = {
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.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ export function FleetFindingsCallout() {
<SparkleIcon size={20} className="shrink-0 text-(--iris-9)" />
<Flex direction="column" gap="0" className="min-w-0">
<Text className="font-medium text-[13px] text-gray-12">
Scout findings
Scout signals
</Text>
<Text className="truncate text-[12px] text-gray-11 leading-snug">
{summary.totalCount} finding{summary.totalCount === 1 ? "" : "s"}{" "}
{summary.totalCount} signal{summary.totalCount === 1 ? "" : "s"}{" "}
across {summary.scoutCount} scout
{summary.scoutCount === 1 ? "" : "s"}
{summary.latestEmittedAt ? (
Expand Down
Loading
Loading