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
4 changes: 2 additions & 2 deletions products/signals/skills/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ A scout is a skill that holds a `SignalScoutConfig`. The harness globs `signals-
Also carries a second, lower-priority **standing-performance lane** that runs only when no P1/P2 regression is live, at most every 7 days behind an `pattern:apm:last-perf-audit` scratchpad date: N+1 calls (`apm-spans-tree`'s `calls_per_parent_invocation` on the heaviest root operations as a hint, gated on one statement shape repeating under one parent on a sample trace, because verb-named DB spans make an edge count every query), expensive query shapes, and caching candidates (`apm-attribute-breakdown` on the statement and full-URL keys). Its discriminator is a waste pattern present in both the current window and the window 7 days earlier, on an operation with real traffic; it files capped, evergreen-deduped P3 reports from bundled `references/performance-issues.md`.
- `signals-scout-logs/` — anomaly watcher for logs (rate / level / pattern shifts).
- `signals-scout-error-tracking/` — anomaly watcher for error tracking (issue spikes, regressions, suppression-rule churn).
- `signals-scout-feature-flags/` — state-vs-traffic watcher for feature flags. Audits the wiring between the flag UI and the code: evaluation cliffs on healthy flags, ghost flags (code calling deleted keys), response-distribution shifts with no matching flag edit, plus a flag-debt pass. Debt splits by who classifies it: the `stale_feature_flags` health check owns staleness and the scout is the only author of its reports — one re-verified, single-flag cleanup report per active issue, because each stale flag is an independently actionable code removal (the health-checks scout cedes the kind); dead checks the stale check cannot see, because the code still calls them, stay a bundled finding. Its discriminator is the flag's configured state against the `$feature_flag_called` stream; experiment-linked flags are the experiments scout's territory. The payload fields its stale section names are produced by `StaleFeatureFlagsCheck` in `products/feature_flags/backend/temporal/health_checks/stale_flags.py` — rename one there and the scout's table drifts silently, because no test reads a scout's prose.
- `signals-scout-feature-flags/` — state-vs-traffic watcher for feature flags. Audits the wiring between the flag UI and the code: evaluation cliffs on healthy flags, ghost flags (code calling deleted keys), response-distribution shifts with no matching flag edit, plus a flag-debt pass. Debt splits by who classifies it: the `stale_feature_flags` health check owns staleness and the scout is the only author of its reports — one re-verified, single-flag cleanup report per active issue, because each stale flag is an independently actionable code removal (the health-checks scout cedes the kind); dead checks the stale check cannot see, because the code still calls them, stay a bundled finding. Its discriminator is the flag's configured state against the `$feature_flag_called` stream; experiment-linked flags are the experiments scout's territory. Its stale-flag lane lives in bundled `references/stale-flags.md`, including the rule that a code match counts as a call site only when it evaluates or gates on the flag. The payload fields that reference names are produced by `StaleFeatureFlagsCheck` in `products/feature_flags/backend/temporal/health_checks/stale_flags.py` — rename one there and the scout's table drifts silently, because no test reads a scout's prose.
- `signals-scout-data-pipelines/` — delivery watcher for data pipelines: CDP destinations and transformations (hog functions), batch exports, and hog flows.
Watches for platform interventions (the hog watcher degrading or auto-disabling an enabled function), delivery failure shares stepping above a pipeline's own baseline, batch export runs failing or stalling (a growing data gap), filter starvation, and active flows failing for the people they trigger on. Its discriminator is configured-to-deliver vs actually-delivering — drafts, paused exports, and deliberately disabled functions are operator choices, not signal;
data warehouse / external-data syncs (data coming _in_) are the
Expand Down Expand Up @@ -140,7 +140,7 @@ The legacy signal channel (weak `emit_signal` findings for the pipeline to clust
The user-facing skills (`authoring-scouts`, `exploring-scouts`) no longer teach it; new scouts that author reports list the report tools.

The specialists each carry their own domain discriminator + investigation patterns.
Most are a single self-contained `SKILL.md`; a few bundle surface-specific references read on demand — `signals-scout-anomaly-detection` (`anomaly-methods.md`, `watchlist-and-memory.md`, `report-contract.md`, `source-liveness.md`), `signals-scout-ai-observability` (`lenses.md`), `signals-scout-apm` (`performance-issues.md`), `signals-scout-surveys` (`response-querying.md`), `signals-scout-web-vitals` (`remediation.md`, `onset-correlation.md`), `signals-scout-mcp-tool-calls` (`queries.md`, `metrics-dashboard.md`, `structured-output.schema.json`), `signals-scout-tasks` (`queries.md`), `signals-scout-pr-follow-up` (`sources.md`, `deploy-ladder.md`, `probes.md`), `signals-scout-product-analytics` (`funnel-maturity.md`), and `signals-scout-unused-features` (`queries.md`); `ls signals-scout-*/references/` is the current list. Treat the generalist as the reference shape. Note that a scout can only read its own bundled files at runtime (each team's `LLMSkill` row carries just that skill's files) — which is why a scout that needs the dedupe/memory conventions in depth bundles its own copy rather than pointing at the generalist's. The report-channel contract is the exception to that copy-it-locally rule: it rides in the harness prompt, not a file, so report scouts share one definition without each bundling a copy.
Most are a single self-contained `SKILL.md`; a few bundle surface-specific references read on demand — `signals-scout-anomaly-detection` (`anomaly-methods.md`, `watchlist-and-memory.md`, `report-contract.md`, `source-liveness.md`), `signals-scout-ai-observability` (`lenses.md`), `signals-scout-feature-flags` (`stale-flags.md`), `signals-scout-apm` (`performance-issues.md`), `signals-scout-surveys` (`response-querying.md`), `signals-scout-web-vitals` (`remediation.md`, `onset-correlation.md`), `signals-scout-mcp-tool-calls` (`queries.md`, `metrics-dashboard.md`, `structured-output.schema.json`), `signals-scout-tasks` (`queries.md`), `signals-scout-pr-follow-up` (`sources.md`, `deploy-ladder.md`, `probes.md`), `signals-scout-product-analytics` (`funnel-maturity.md`), and `signals-scout-unused-features` (`queries.md`); `ls signals-scout-*/references/` is the current list. Treat the generalist as the reference shape. Note that a scout can only read its own bundled files at runtime (each team's `LLMSkill` row carries just that skill's files) — which is why a scout that needs the dedupe/memory conventions in depth bundles its own copy rather than pointing at the generalist's. The report-channel contract is the exception to that copy-it-locally rule: it rides in the harness prompt, not a file, so report scouts share one definition without each bundling a copy.

## When editing skills in this directory

Expand Down
Loading
Loading