mirror of
https://github.com/hanzoai/insights.git
synced 2026-11-03 00:52:32 +00:00
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.
109 lines
6.4 KiB
JSON
109 lines
6.4 KiB
JSON
{
|
||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||
"description": "Request body for registering a scout config without waiting for the coordinator tick.\n\nUpsert keyed on `skill_name`: if the coordinator (or a concurrent caller) already\nregistered the row, the provided tunables are applied to it instead.",
|
||
"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"
|
||
},
|
||
"skill_name": {
|
||
"description": "The `signals-scout-*` skill to register a config for. The skill must already exist on this project — author it via the skills store first.",
|
||
"maxLength": 200,
|
||
"type": "string"
|
||
},
|
||
"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"
|
||
}
|
||
},
|
||
"required": ["skill_name"],
|
||
"type": "object"
|
||
}
|