action posthog_signals_scout_runs_retrieve { label: "Get a run by ID" description: "Return the full `SignalScoutRun` row. Status, timing, and error flow from the linked `tasks.TaskRun`. Strictly team-scoped — a UUID belonging to another team returns 404." provider: posthog method: GET path: "/api/projects/{project_id}/signals/scout/runs/{run_id}/" encoding: json input: { type: "object" properties: { run_id: { type: "string" format: "uuid" } } required: ["run_id"] additionalProperties: false } output: { type: "object" description: "Full `SignalScoutRun` projection used by `get-run`. Same shape as the summary\ntoday; kept distinct so future detail-only extensions (linked Signal rows,\nLLMA token-cost join) can land here without bloating the list response." required: ["completed_at", "created_at", "edited_report_ids", "emitted_count", "emitted_finding_ids", "emitted_report_ids", "metadata", "run_id", "skill_name", "skill_version", "started_at", "status", "summary"] properties: { completed_at: { type: ["string", "null"] description: "ISO-8601 timestamp the TaskRun completed; null while still running." } created_at: { type: "string" description: "ISO-8601 timestamp the bridge row was created — the field `date_from` / `date_to` filter and order on. Use this (not `started_at`) as the `date_to` cursor when walking past the 100-row cap, so runs created in the gap between a boundary run's TaskRun and its bridge row aren't skipped." } edited_report_ids: { type: "array" description: "The `SignalReport` ids this run mutated via the `edit_report` channel (rewrote title/summary and/or appended a note), deduped. Distinct from `emitted_report_ids`: edit can target any inbox report, so these are generally not reports the run authored. Empty for runs that edited no report." items: { type: "string" } } emitted_count: { type: "integer" description: "Number of findings this run actually emitted to the inbox. 0 for runs that investigated but surfaced nothing, or ran dry-run / before AI approval. `> 0` means the run produced at least one `Signal`." } emitted_finding_ids: { type: "array" description: "The `finding_id`s behind `emitted_count`, in emit order. Each maps to a `Signal` with `source_id = run::finding:`. Empty for non-emitting runs." items: { type: "string" } } emitted_report_ids: { type: "array" description: "The `SignalReport` ids this run authored directly via the `emit_report` channel, in emit order. Separate from `emitted_finding_ids` (weak `emit_signal` findings) — a report-authoring scout writes a full report here instead. Empty for runs that authored no report." items: { type: "string" } } error: { type: ["string", "null"] description: "Full `error_message` from the linked TaskRun, surfaced only for failed/cancelled runs (null otherwise, including on success). Use `failure_reason` for a concise scan-friendly summary." } failure_reason: { type: ["string", "null"] description: "Concise derived reason the run didn't complete cleanly — the first line of `error` (bounded), or a status-derived fallback. Null unless the run terminated failed/cancelled. Read this to see at a glance *why* a run emitted nothing without pulling full stack traces." } metadata: { type: "object" description: "Scout-owned per-run context, in two regions. Top-level keys are stamped by the runner at run start. Always present: `harness_prompt_version` (id of the harness prompt build the run was given), `report_channel` (which report tools the run held: `none`, `emit`, `edit`, or `both`), `skill_origin` (`canonical` or `custom`), and `github_guidance` (whether the run got the GitHub evidence section) — the provenance set that says which instructions the run actually got, so runs are only compared against runs of the same shape. Present only when the run departed from a default: `model`, `runtime_adapter`, and `reasoning_effort` (routing overrode the agent-server default), and `network_access` (`full` when the scout's config lifted the trusted-domain network restriction for this run). The nested `derived` object is the harness's own map of boolean run dimensions, computed server-side at finalize: `has_emit_report`, `has_edit_report`, `has_self_improvement`, `has_chart`, and `has_self_validation`. Use `derived` to answer 'what kind of run was this?' instead of parsing the `summary` prose. Note the flags describe the reports the run authored as they stand now, so charts attached to someone else's report via an edit are not counted. A missing `derived` object is unknown, not all-false: the run predates the field, never finalized, or its stamp failed." properties: { derived: { type: "object" required: ["has_chart", "has_edit_report", "has_emit_report", "has_self_improvement", "has_self_validation", "has_structured_output"] properties: { has_chart: { type: "boolean" } has_edit_report: { type: "boolean" } has_emit_report: { type: "boolean" } has_self_improvement: { type: "boolean" } has_self_validation: { type: "boolean" } has_structured_output: { type: "boolean" } } } github_guidance: { type: "boolean" } harness_prompt_version: { type: "string" } model: { type: "string" } network_access: { type: "string" } reasoning_effort: { type: "string" } report_channel: { type: "string" } runtime_adapter: { type: "string" } skill_origin: { type: "string" } } } run_id: { type: "string" description: "UUID of the bridge row." } skill_name: { type: "string" description: "Canonical skill name the run executed (e.g. `signals-scout-general`)." } skill_version: { type: "integer" description: "Skill version snapshotted at run start." } started_at: { type: "string" description: "ISO-8601 timestamp the TaskRun was created." } status: { description: "Status from the linked TaskRun.\n\n* `not_started` - not_started\n* `queued` - queued\n* `in_progress` - in_progress\n* `completed` - completed\n* `failed` - failed\n* `cancelled` - cancelled" type: "object" } summary: { type: "string" description: "One-paragraph close-out the scout wrote at end-of-run. Empty string for runs that errored before close-out. The dedupe key for non-emitting runs." } task_id: { type: ["string", "null"] description: "UUID of the Tasks `Task` the scout span ran inside." } task_run_id: { type: ["string", "null"] description: "UUID of the Tasks `TaskRun`. Pairs with `task_id` to deep-link." } task_url: { type: ["string", "null"] description: "Relative deep-link to the Tasks UI for this run, e.g. `/project/{team_id}/tasks/{task_id}?runId={task_run_id}`." } } } }