Files
zeekay bc4ddf332b chore: rebase the tree onto upstream master fa1a9a60
Mechanically re-derived: bin/debrand runs over a fresh import of
posthog/posthog@fa1a9a60d4 (2026-08-06).
The pipeline (.hanzo/workflows), the Dockerfiles and bin/docker*
entrypoints, compose files, LLM.md and the squashed initial migration
are restored from the shipped tree, same as the previous import.

The prune's import-closure guard kept 21 products the new core now
imports; dropping them is a refactor now, recorded rather than forced.
2026-08-06 01:25:36 -07:00

149 lines
8.6 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"description": "Create a runnable custom scout and its config in one atomic request.",
"properties": {
"body": {
"description": "Complete markdown prompt executed on every scout run. Include any project-specific signal names, thresholds, investigation steps, and report criteria here.",
"type": "string"
},
"config": {
"description": "Optional schedule, enablement, dry-run posture, and delivery settings. Defaults to an enabled, emitting scout on the daily interval with no external destination.",
"properties": {
"auto_pause_exempt": {
"description": "Exempt this scout from the inactivity pause, which otherwise switches off a scout that goes a fortnight without surfacing anything anyone engages with. Set it on watchdog scouts whose value is staying quiet. Defaults to false.",
"type": "boolean"
},
"emit": {
"description": "Whether the scout writes findings to the inbox. False = dry-run: it runs and logs but emits nothing. Defaults to true.",
"type": "boolean"
},
"enabled": {
"description": "Whether this scout runs on its schedule. Defaults to true.",
"type": "boolean"
},
"network_access": {
"description": "What the scout's sandbox can reach over the network while it runs. Defaults to `trusted`, the platform's trusted-domain allowlist (Insights, GitHub, common package registries). Set `full` to let this scout reach any site, for skills that read external sources such as documentation or papers.\n\n* `trusted` - Trusted domains only\n* `full` - Full",
"enum": ["trusted", "full"],
"type": "string"
},
"output_destinations": {
"description": "Destinations that receive each finding or report this scout emits. Empty by default.",
"properties": {
"slack": {
"anyOf": [
{
"properties": {
"channel": {
"anyOf": [
{
"maxLength": 255,
"type": "string"
},
{
"type": "null"
}
],
"description": "Slack channel target in the channel picker's `channel_id|#channel-name` format. Null while choosing a channel; no messages are sent until it is set."
},
"integration_id": {
"description": "ID of the Slack integration whose bot posts this scout's findings and reports.",
"minimum": 1,
"type": "number"
}
},
"required": ["integration_id"],
"type": "object"
},
{
"type": "null"
}
],
"description": "Slack destination for each emitted scout finding or report. Null or omitted disables Slack delivery."
}
},
"type": "object"
},
"run_cron_schedule": {
"anyOf": [
{
"maxLength": 100,
"type": "string"
},
{
"type": "null"
}
],
"description": "Optional five-field cron expression, e.g. '30 9 * * *' (daily at 09:30), '0 9,17 * * *' (twice daily), or '0 9 * * 1-5' (weekday mornings). Evaluated in the project timezone. Takes precedence over `run_interval_minutes`; occurrences must be at least 30 minutes apart."
},
"run_interval_minutes": {
"description": "Minutes between runs (30–43200). Defaults to 1440 (every 24 hours).",
"maximum": 43200,
"minimum": 30,
"type": "number"
},
"structured_output_schema": {
"anyOf": [
{
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
},
{
"type": "null"
}
],
"description": "Optional JSON Schema (draft 2020-12) describing ONE structured record this scout produces via `scout-record-output` — e.g. a per-report quality judgment (`{\"type\": \"object\", \"properties\": {\"verdict\": {\"enum\": [\"good\", \"bad\", \"unsure\"]}, \"reason\": {\"type\": \"string\"}}, \"required\": [\"verdict\", \"reason\"]}`). The root must be `\"type\": \"object\"`. Setting a schema turns the structured-output channel on: the run prompt renders the schema and every submitted record is validated against it and recorded in the project as a `$scout_structured_output` event, queryable like any event. The channel also requires emit — a dry-run scout has nowhere to record to. Cardinality is the scout's call (one record per run, one per judged entity, ...). Null = channel off. Setting a schema requires skill-authoring authorization (the `llm_skill:write` scope and skill editor access) since the scout reads it verbatim in its prompt; clearing it needs only the config write. Records validate against the schema in force when the run was dispatched."
},
"tags": {
"description": "Free-form labels for grouping the fleet, e.g. `[\"revenue\", \"on-call\"]`. Normalized to lowercase kebab-case (`On Call` and `on_call` both become `on-call`), deduped, and stored sorted; at most 10 tags, each at most 50 characters once normalized. Pass the full desired set — a write replaces the existing tags rather than merging into them. Filter the config list with the `tags` query parameter.",
"items": {
"type": "string"
},
"maxItems": 10,
"type": "array"
}
},
"type": "object"
},
"description": {
"description": "Short description of the signal or behavior this scout investigates.",
"maxLength": 4096,
"type": "string"
},
"files": {
"description": "Optional reference files bundled with the scout prompt.",
"items": {
"properties": {
"content": {
"description": "Text content of the file.",
"type": "string"
},
"content_type": {
"default": "text/plain",
"description": "MIME type of the file content.",
"maxLength": 100,
"type": "string"
},
"path": {
"description": "File path relative to skill root, e.g. 'scripts/setup.sh' or 'references/guide.md'.",
"maxLength": 500,
"type": "string"
}
},
"required": ["path", "content"],
"type": "object"
},
"type": "array"
},
"name": {
"description": "Unique scout name. Must start with `signals-scout-` and contain only lowercase letters, numbers, and hyphens.",
"maxLength": 64,
"type": "string"
}
},
"required": ["name", "description", "body"],
"type": "object"
}