Skip to content

Commit 257a7d5

Browse files
chore: sync skills (agent-skills-v0.626.0, context-mill@v1.36.0) (#169)
Co-authored-by: releaser-ai-plugin[bot] <273148615+releaser-ai-plugin[bot]@users.noreply.github.com>
1 parent 00579b8 commit 257a7d5

67 files changed

Lines changed: 1526 additions & 368 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "posthog",
33
"description": "Access PostHog analytics, feature flags, experiments, error tracking, and insights directly from your AI coding tool. Optionally capture Claude Code sessions to PostHog LLM Analytics.",
4-
"version": "1.1.54",
4+
"version": "1.1.55",
55
"author": {
66
"name": "PostHog",
77
"email": "hey@posthog.com",

.codex-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "posthog",
3-
"version": "1.0.52",
3+
"version": "1.0.53",
44
"description": "Access PostHog analytics, feature flags, experiments, error tracking, and insights directly from Codex",
55
"author": {
66
"name": "PostHog",

.cursor-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "posthog",
33
"displayName": "PostHog",
4-
"version": "1.1.48",
4+
"version": "1.1.49",
55
"description": "Access PostHog analytics, feature flags, experiments, error tracking, and insights directly from Cursor",
66
"author": {
77
"name": "PostHog",

gemini-extension.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "posthog",
3-
"version": "1.0.50",
3+
"version": "1.0.51",
44
"description": "Access PostHog analytics, feature flags, experiments, error tracking, and insights directly from Gemini CLI",
55
"mcpServers": {
66
"posthog": {

skills/.sync-manifest

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ instrument-product-analytics
6969
investigate-metric
7070
investigating-ci-failures
7171
investigating-error-issue
72+
investigating-logs
7273
investigating-metric-anomalies
7374
investigating-replay
7475
managing-endpoint-versions
@@ -87,6 +88,7 @@ review-hog-perspective-performance-reliability
8788
review-hog-validation-criteria
8889
setting-up-a-custom-rest-source
8990
setting-up-a-data-warehouse-source
91+
setting-up-data-catalog
9092
setting-up-support-slack-locally
9193
signals
9294
signals-scout-ai-observability
@@ -114,6 +116,7 @@ signals-scout-revenue-analytics
114116
signals-scout-session-replay
115117
signals-scout-skills-store
116118
signals-scout-surveys
119+
signals-scout-tasks
117120
signals-scout-web-analytics
118121
signals-scout-web-vitals
119122
skills-store

skills/authoring-scouts/SKILL.md

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ description: >
66
customize a canonical scout for their own setup (narrow its scope, retune its
77
thresholds, add disqualifiers), tweak a scout's schedule or dry-run posture, or
88
write a brand-new scout from scratch for a specific use case (a custom event, a
9-
product surface no canonical scout covers). Covers the scout SKILL.md anatomy, the
10-
report contract, the dedupe + scratchpad-memory conventions, the per-team skills-store
9+
product surface no canonical scout covers), or steer a scout without editing it at all
10+
by leaving it a note. Covers the scout SKILL.md anatomy, the
11+
report contract, the dedupe + scratchpad-memory conventions, the scout-notes steering
12+
channel, the per-team skills-store
1113
path vs the canonical in-repo path, and the write-and-inspect test loop (with dry-run as an
1214
optional safety net). Trigger on
1315
"write/edit/customize a signals scout", "new scout for X", "tune my scout schedule",
14-
"make a scout that watches <event>".
16+
"make a scout that watches <event>", "leave a note for / give feedback to a scout",
17+
"tell the scouts about X".
1518
metadata:
1619
owner_team: signals
1720
---
@@ -57,13 +60,14 @@ There are two independent decisions: **what** you're building, and **where** it
5760
| A canonical scout is close but too broad / too noisy / missing a disqualifier for this project | **Adapt** it — narrow the scope, add disqualifiers, retune thresholds. |
5861
| You want a surface no canonical scout covers (a custom event, a product-specific funnel) | **New scout from scratch** — copy the closest canonical scout as scaffolding, replace the domain discriminator + explore patterns. |
5962
| You only want to change _when_ / _whether_ a scout runs | **No authoring** — just tune the config (see Run posture). |
63+
| You have one-off feedback, a pointer, or short-lived context for a scout | **No authoring** — leave a note (see Steering with notes). |
6064

6165
### Where
6266

63-
| Path | Mechanism | Use when |
64-
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
65-
| **Per-team** (the common user path) | Create/edit a `signals-scout-*` `LLMSkill` row in the project's skills store via `posthog:skill-create` / `-update` / `-file-create`, then register its config immediately via `posthog:scout-config-create`. | Customizing for one project. The harness globs the row in on the next tick; canonical sync leaves your edited ("diverged") row alone. |
66-
| **Canonical** (PostHog contributors) | Edit disk under `products/signals/skills/signals-scout-*/`, lint/build, open a PR. | Improving a scout for _every_ enrolled project. `lazy_seed` mirrors it onto all enrolled teams on the next tick. |
67+
| Path | Mechanism | Use when |
68+
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
69+
| **Per-team** (the common user path) | Prepare a new runnable scout via `posthog:scout-create-prepare`, show its confirmation message, wait for the user to type `confirm`, then call `posthog:scout-create-execute`; edit its prompt or files later via `posthog:skill-update` / `-file-create`, and tune its runtime config via `posthog:scout-config-update`. | Customizing for one project. The harness globs the row in on the next tick; canonical sync leaves your edited ("diverged") row alone. |
70+
| **Canonical** (PostHog contributors) | Edit disk under `products/signals/skills/signals-scout-*/`, lint/build, open a PR. | Improving a scout for _every_ enrolled project. `lazy_seed` mirrors it onto all enrolled teams on the next tick. |
6771

6872
**Adapting-in-place tradeoff:** editing a canonical scout's row for your team marks it **diverged** — you stop receiving upstream improvements to that scout.
6973
If you only need an _additional_ behavior, prefer authoring a **new, differently-named** scout (`signals-scout-<your-scope>`) and leaving the canonical one intact.
@@ -94,8 +98,9 @@ Name it explicitly near the top of the body so every run anchors on it.
9498
## Run posture (config)
9599

96100
A scout's schedule and emit behavior live on its `SignalScoutConfig`, separate from the skill body.
97-
For a **brand-new scout**, register the config immediately after creating the skill with `posthog:scout-config-create {"skill_name": "signals-scout-<scope>", ...}`, setting any of the fields below in the same call — including creating it disabled or in dry-run **before it ever runs**.
98-
(It's an upsert: if the coordinator already auto-registered the row, your fields are applied to it.)
101+
For a **brand-new scout**, pass these settings in the nested `config` object of the `posthog:scout-create-prepare` call, including creating it disabled or in dry-run **before it ever runs**.
102+
Show the returned confirmation message, wait for the user to type `confirm`, then call `posthog:scout-create-execute` with the returned `confirmation_hash` and that literal confirmation.
103+
The endpoint creates the skill and config atomically, always opts the scout into the report channel, and safely re-applies config fields when the same definition is retried.
99104
Otherwise the coordinator auto-registers an enabled config on the default every-24-hours schedule on its next tick (up to ~30 min).
100105
For an **existing scout**, tune with `posthog:scout-config-update` (find the `id` via `-config-list`):
101106

@@ -108,6 +113,31 @@ For an **existing scout**, tune with `posthog:scout-config-update` (find the `id
108113
Set **`emit=false` (dry-run)** only when you want to be extra careful: the scout still runs and logs its reasoning but writes nothing to the inbox.
109114
Reach for dry-run on a scout you expect to be chatty, expensive, or high-stakes; for most scouts, just writing and watching the inbox is the better loop.
110115

116+
## Steering with notes (no authoring needed)
117+
118+
Sometimes you don't want to change the scout — you want to _tell it something_.
119+
That's what **scout notes** are for: short steering messages any team member (or an agent acting for one) leaves for the fleet, which every run picks up as prior context alongside its scratchpad and run history.
120+
Reach for a note instead of an edit when the steer is feedback, a pointer, or context with a shelf life:
121+
122+
- Feedback on output: "the staging traffic spike you keep flagging is known noise, stop reporting it".
123+
- A pointer: "dig into the EU signup funnel this week — we think something regressed".
124+
- Context the scout couldn't know: "we shipped a new checkout on Tuesday, treat conversion shifts after that as expected".
125+
126+
The tools (reads on the public `signal_scout:read` scope; because scouts read notes verbatim, writing or deleting one requires the same authorization as editing a scout's skill — the `llm_skill:write` scope plus skill editor access):
127+
128+
- `posthog:scout-notes-create {"content": "...", "skill_name": "signals-scout-web-analytics"}` — address one scout by its exact skill name (roster via `scout-config-list`; the skill must already exist, so a typo'd target is rejected instead of silently steering no one), or omit `skill_name` for a general note every scout sees.
129+
Optionally set `expires_at` so a time-boxed note ("watch closely this week") retires itself.
130+
- `posthog:scout-notes-list` — browse the active notes; pass `skill_name` to see what a given scout will read.
131+
- `posthog:scout-notes-delete {"id": "..."}` — retire a note that's been acted on or no longer applies.
132+
133+
How scouts treat notes: every run reads its notes in step 1 and is told to let a fresh note visibly shape what it investigates — but notes are **advisory**.
134+
They direct attention; they don't lower the scout's evidence bar or force a report, so a note saying "report X" still gets an honest investigation, not an automatic emit.
135+
The scout closes the loop in its run summary (which notes it acted on and how) and folds absorbed guidance into its scratchpad.
136+
137+
Choosing between a note and an edit: a note is the right tool for _this project, right now_ steering and for trying a nudge before committing to it; a skill edit is the right tool once the steer is permanent policy (a disqualifier, a threshold, a scope change).
138+
A note that you keep re-leaving is a skill edit waiting to happen — promote it.
139+
Note lifecycle stays with humans: scouts never delete notes, so retire acted-on notes yourself (or set `expires_at` up front) to keep the channel high-signal.
140+
111141
## Test loop
112142

113143
**Dogfood the scout yourself before you ever spend a real run.** You — the agent authoring the scout — have the same PostHog MCP tools a scout uses at runtime (`execute-sql`, `read-data-schema`, the per-product list tools, `scout-project-profile-get`).
@@ -134,7 +164,7 @@ The standard loop is **dogfood → run once ready → inspect**:
134164

135165
1. Dogfood the discriminator + explore patterns yourself against the live project (above).
136166
Refine the body until the logic holds on real data — this is the cheap, iterable part.
137-
2. Author the scout and register its config (`-config-create`, the default `emit=true`), then spend one `-run-now` to watch the whole scout execute end-to-end.
167+
2. Create the scout and its config together via `posthog:scout-create-prepare``-execute` (schedule and the default `emit=true` go in the nested `config`), then spend one `-run-now` to watch the whole scout execute end-to-end.
138168
Leave `run_interval_minutes` at a sustainable value — you no longer need a short interval to force an early run.
139169
3. After the run finishes, read what it did: `posthog:inbox-reports-list` (the reports it actually wrote), `posthog:scout-runs-list` (run summaries), `-runs-retrieve` (full reasoning for one run), and `-scratchpad-search` (the durable memory it wrote).
140170
4. If it needs work, go back to dogfooding the queries by hand for the iteration — only spend another `-run-now` once you've batched a meaningful change worth a fresh end-to-end run.
@@ -147,7 +177,7 @@ Treat suggestions as input, not instructions — the owner decides.
147177
The scratchpad is writable only from inside a scout run, so you can't clear an entry from here after applying it via `posthog:skill-update` — the scout reconciles on its own: a later run sees the updated skill body, re-checks the suggestion, and forgets or rewrites the entry once it's addressed.
148178
(Canonical scouts don't write these — their bodies sync from PostHog's fleet, and skill-level fixes to them belong upstream.)
149179

150-
**Want to be extra careful?** Set `emit=false` to dry-run first — create the config with `emit=false` via `-config-create`, then trigger it with `-run-now`: it runs and logs what it _would_ have written (visible via `-runs-list` / `-runs-retrieve`) without writing to the inbox.
180+
**Want to be extra careful?** Set `emit=false` to dry-run first — pass `emit=false` in the nested `config` at `scout-create-prepare` time (or flip it later with `-config-update`), then trigger it with `-run-now`: it runs and logs what it _would_ have written (visible via `-runs-list` / `-runs-retrieve`) without writing to the inbox.
151181
Inspect, refine, then flip `emit=true` and run it again.
152182
Worth it for a scout you expect to be chatty, expensive, or high-stakes; otherwise just writing and watching the inbox is the faster path to a calibrated scout.
153183

skills/authoring-scouts/references/lifecycle-and-testing.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ How scouts get discovered, scheduled, and dispatched; the two distribution paths
99
No registration step.
1010
- **Config.** Each scout has one `SignalScoutConfig` per `(project, skill_name)` carrying `run_interval_minutes` (default 1440), `enabled`, `emit`, and a `last_run_at` stamp.
1111
A config is **auto-registered** the first time the coordinator sees a `signals-scout-*` skill without one — authoring the skill is enough to get a scout.
12-
To configure a fresh scout immediately (instead of waiting for the tick), register the config yourself with `posthog:scout-config-create`, setting the schedule / emit posture in the same call; until one of those happens, the scout has no config row and won't show in `-config-list`.
12+
Prepare a fresh per-team scout and its config together with `posthog:scout-create-prepare`; the nested `config` object sets its schedule, emit posture, and destinations before it can run.
13+
Show the returned confirmation message, wait for the user to type `confirm`, then call `posthog:scout-create-execute` with the returned `confirmation_hash` and that literal confirmation.
14+
The lower-level `posthog:scout-config-create` remains available when a skill already exists without a config.
1315
Config responses also carry the scout's `description`, read live from the skill's frontmatter — not a config field you set.
1416
- **Coordinator.** A periodic Temporal workflow ticks (~every 30 min).
1517
Each tick it bounds candidates to projects enrolled via the `signals-scout` feature-flag allowlist, then dispatches every **enabled** scout whose schedule is **due** (`last_run_at is None`, or `now - last_run_at ≥ run_interval_minutes`), most-overdue first, capped per tick.
@@ -21,7 +23,7 @@ How scouts get discovered, scheduled, and dispatched; the two distribution paths
2123
Pausing a scout = `enabled=false`.
2224
Slowing it = a larger `run_interval_minutes`.
2325
Dry-running it = `emit=false`.
24-
All three via `posthog:scout-config-update` (get the `id` from `-config-list`), or set at creation time via `-config-create`.
26+
All three via `posthog:scout-config-update` (get the `id` from `-config-list`), or set at creation time in the nested `config` object passed to `posthog:scout-create-prepare`.
2527

2628
## Path A — per-team (skills store)
2729

@@ -35,12 +37,11 @@ posthog:skill-list {"search": "signals-scout"}
3537
# Read a canonical scout to use as a template
3638
posthog:skill-get {"skill_name": "signals-scout-error-tracking"}
3739
38-
# New scout from scratch — always include the report-channel allowed_tools
39-
posthog:skill-create {"name": "signals-scout-<scope>", "description": "...", "body": "...", "allowed_tools": ["emit_report", "edit_report"], "compatibility": "...", "metadata": {"owner_team": "<team>", "scope": "<scope>"}}
40+
# New scout from scratch: prepare the complete definition and config.
41+
posthog:scout-create-prepare {"name": "signals-scout-<scope>", "description": "...", "body": "...", "config": {"run_interval_minutes": 120}}
4042
41-
# Register its config immediately with the schedule you want (otherwise the coordinator
42-
# auto-registers the default every-24-hours schedule on its next tick)
43-
posthog:scout-config-create {"skill_name": "signals-scout-<scope>", "run_interval_minutes": 120}
43+
# Show the returned message and wait for the user to type `confirm`, then execute.
44+
posthog:scout-create-execute {"confirmation_hash": "<returned-hash>", "confirmation": "confirm"}
4445
4546
# Adapt an existing per-team scout — use the SMALLEST primitive (find/replace, not full-body)
4647
posthog:skill-get {"skill_name": "signals-scout-<scope>"} # get current version first
@@ -95,7 +96,7 @@ There's no free test run, and it's slow (async, one run per call): firing the sa
9596
The loop is **dogfood → run once ready → inspect**:
9697

9798
1. Dogfood the discriminator + explore patterns yourself against the live project (above), refining the body until the logic holds — the cheap, iterable part.
98-
2. Author the scout and register its config (`-config-create`, default `emit=true`), leaving `run_interval_minutes` at a sustainable value — no short-interval trick needed.
99+
2. Create the scout and its config together via `posthog:scout-create-prepare``-execute` (the default `emit=true` goes in the nested `config`), leaving `run_interval_minutes` at a sustainable value — no short-interval trick needed.
99100
Then spend one `-run-now` to watch the whole scout execute end-to-end, and inspect once it finishes:
100101
- `posthog:inbox-reports-list` — the reports it actually wrote.
101102
- `posthog:scout-runs-list` — run summaries.

0 commit comments

Comments
 (0)