[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-automattic-staircase-report":3,"mdc--mxzt3k-key":32,"related-org-automattic-staircase-report":3340,"related-repo-automattic-staircase-report":3532},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":22,"topics":26,"repo":27,"sourceUrl":30,"mdContent":31},"staircase-report","generate staircase audience relationship reports","Run the staircase audience-relationship report for a customer. Use when the user asks to run the staircase report, requests it for a specific site, or asks for an audience-tier or relationship-intelligence report.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"automattic","Automattic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fautomattic.png",[12,16,19],{"name":13,"slug":14,"type":15},"Reporting","reporting","tag",{"name":17,"slug":18,"type":15},"Customer Success","customer-success",{"name":20,"slug":21,"type":15},"Analytics","analytics",1,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fagentic-analytics","2026-07-24T05:42:06.016457",null,[],{"repoUrl":23,"stars":22,"forks":22,"topics":28,"description":29},[],"Claude Code plugin for analytics across Parse.ly, GA, and your own data.","https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fagentic-analytics\u002Ftree\u002FHEAD\u002Fskills\u002Fstaircase-report","---\nname: staircase-report\ndescription: Run the staircase audience-relationship report for a customer. Use when the user asks to run the staircase report, requests it for a specific site, or asks for an audience-tier or relationship-intelligence report.\n---\n\nRun the staircase audience-relationship report.\n\nThe customer may supply an optional **site ID filter** (via a slash-command argument on harnesses that have them, or in plain chat: \"run the staircase report for your-site.com\"). Empty means \"run across all sites in the configured bucket\"; non-empty means \"filter to that one site (e.g. `your-site.com`).\"\n\n**Output ONLY the report contents** (the markdown body of the generated report file) followed by a single `file:\u002F\u002F` link line at the end. NO preamble. NO postscript. NO commentary. NO explanation. The Recommendations section at the top of the report IS the analysis. Don't re-narrate it.\n\nYou are a pipe, not an analyst. The customer reads the report directly.\n\n**This rule applies to conversational invocations too.** When the user asks for \"the staircase report\" \u002F \"run the report\" \u002F \"run the staircase report for \u003Csite-id>\" without typing a slash command, follow the same contract: render the markdown report verbatim in chat, then the `file:\u002F\u002F` HTML link, no narration. A summary instead of the report is the wrong shape. The user wants to read the report in the terminal. The HTML version is allowed to carry more detail than the in-chat markdown (e.g., the collapsible full-tail referrer list); that asymmetry is intentional, don't try to mirror everything into the chat output.\n\n## Steps\n\n0. **Resolve the plugin root.** Every bash snippet below assumes `$plugin_root` is set in that shell invocation; re-run this line whenever you start a new shell:\n\n   ```bash\n   plugin_root=\"${CLAUDE_PLUGIN_ROOT:-${CURSOR_PLUGIN_ROOT:-\u003Cplugin-root>}}\"\n   plugin_python=\"${AGENTIC_ANALYTICS_VENV:-${AGENTIC_ANALYTICS_DATA_DIR:-$HOME\u002F.local\u002Fshare\u002Fagentic-analytics}\u002Fvenv}\u002Fbin\u002Fpython\"\n   [ -x \"$plugin_python\" ] || plugin_python=\"python3\"\n   ```\n\n   `\u003Cplugin-root>` is the plugin's install directory – the directory two levels above this SKILL.md file. In a dev checkout of the source repo that's `plugin\u002F`. `$plugin_python` is the plugin's isolated venv (created by the init flow at `$AGENTIC_ANALYTICS_DATA_DIR\u002Fvenv`, default `~\u002F.local\u002Fshare\u002Fagentic-analytics\u002Fvenv`); it falls back to `python3` if the venv doesn't exist yet.\n\n1. **Load the bucket config and resolve the site ID filter.** Read `${XDG_CONFIG_HOME:-~\u002F.config}\u002Fagentic-analytics\u002Fbucket.json`, written by the init flow. It contains:\n\n   - `bucket`: S3 bucket holding the customer's DPL events.\n   - `profile`: AWS profile to authenticate with.\n   - `cache_dir`: a slug used to identify the customer's data and name output files (e.g. `acme`).\n   - `employee_filter` (optional): `{ \"extra_data_key\": \"...\", \"extra_data_value\": ... }`. Written by the auto-detection in step 3 (or a manual run of the identify-employees skill) when an unambiguous employee-traffic tag was found. If present, pass it through to `staircase.py` (step 4); the report excludes those events and renders a one-line note up top.\n   - `employee_filter_checked` (optional): boolean flag set after employee-traffic detection has run at least once against a populated cache. Step 3 below uses this to decide whether to run a first-time auto-detect.\n   - `join_id_key` (optional): the URL query parameter the customer carries in email-campaign links to identify each recipient (e.g. `\"pid\"`). When set, cohort CSVs gain a column with that name, populated from the query string of any pageview where the parameter appears. The customer joins the cohort back to their CRM list on that column. If present, pass it through to `staircase.py` (step 4) as `--join-id-key \u003Cvalue>`.\n\n   If the file is missing, tell the user to run the init flow first (`\u002Fagentic-analytics:init` on harnesses with slash commands, or \"set up agentic analytics\" in chat) and stop.\n\n   The site ID filter:\n\n   - If empty: the report runs across every site in the bucket. Pass NO `--site-id` flag to `staircase.py`.\n   - If non-empty: filter events to that site. Pass `--site-id \u003Cvalue>` to `staircase.py`. The site ID itself shows up in the report's `Site ID filter:` line, so the report stays identifiable without a separate header label.\n\n2. **Try to ensure a full 60 days of coverage, then compute windows from what's actually on disk.** The DPL pull is incremental, and a customer's cache may start well after the date the report was requested. Using a fixed `today - 30d` window can land the prior window entirely before the data starts, producing a report where every prior count is 0 and every row is labeled \"new\". Always anchor on what's on disk.\n\n   First, attempt to pull the target 60-day range. `pull_parsely_dpl.py` is incremental: it checks the lake for each day's parquet partition and only fetches missing days, so already-synced customers pay milliseconds, fresh onboards pay the full pull once.\n\n   When the site ID filter is non-empty (single-site mode), pass `--site \u003Csite-id>` so only that site's partition is synced. When the site ID filter is empty (all-sites mode), omit `--site` so the full bucket is synced.\n\n   ```bash\n   # Target range: 60 days ending yesterday. Use Python for cross-platform date math.\n   read target_start target_end \u003C \u003C(python3 -c \"\n   from datetime import date, timedelta\n   start = date.today() - timedelta(days=60)\n   end = date.today() - timedelta(days=1)\n   print(start.strftime('%Y-%m-%d'), end.strftime('%Y-%m-%d'))\n   \")\n   # Single-site pull (when site-id provided):\n   \"$plugin_python\" \"$plugin_root\u002Fscripts\u002Fdb\u002Fpull_parsely_dpl.py\" \\\n     --bucket \u003Cbucket> --site \u003Csite-id> \\\n     --start \"$target_start\" --end \"$target_end\" \\\n     [--profile \u003Cprofile>] || true\n   # All-sites pull (when no site-id):\n   \"$plugin_python\" \"$plugin_root\u002Fscripts\u002Fdb\u002Fpull_parsely_dpl.py\" \\\n     --bucket \u003Cbucket> \\\n     --start \"$target_start\" --end \"$target_end\" \\\n     [--profile \u003Cprofile>] || true\n   ```\n\n   The trailing `|| true` is intentional: don't fail the report on auth lapse, S3 hiccup, or no-such-day. Fall through to whatever's in the lake.\n\n   Then probe the catalog for the earliest and latest day available, split the available span into two equal-size windows. In single-site mode filter by `site`; in all-sites mode query the whole lake:\n\n   ```bash\n   # Single-site catalog probe:\n   read earliest latest \u003C \u003C(python3 -c \"\n   import sys; sys.path.insert(0, '$plugin_root\u002Fscripts\u002Fdb\u002Flib')\n   import catalog\n   con = catalog.connect()\n   catalog.ensure_view(con, 'dpl', 'events')\n   row = con.execute(\\\"SELECT min(day), max(day) FROM dpl_events WHERE apikey = '\u003Csite-id>'\\\").fetchone()\n   if row[0] is None: sys.exit(1)\n   print(row[0], row[1])\n   \")\n\n   # All-sites catalog probe:\n   read earliest latest \u003C \u003C(python3 -c \"\n   import sys; sys.path.insert(0, '$plugin_root\u002Fscripts\u002Fdb\u002Flib')\n   import catalog\n   con = catalog.connect()\n   catalog.ensure_view(con, 'dpl', 'events')\n   row = con.execute('SELECT min(day), max(day) FROM dpl_events').fetchone()\n   if row[0] is None: sys.exit(1)\n   print(row[0], row[1])\n   \")\n\n   if [ -z \"$earliest\" ]; then echo \"ERROR: no data found in catalog for the requested site\u002Fbucket\" >&2; exit 1; fi\n\n   # Compute window in Python for cross-platform date arithmetic.\n   # Prefer 30\u002F30; fall back to N\u002FN where 2N fits the available span.\n   read available window current_start current_end prior_start prior_end \u003C \u003C(python3 -c \"\n   from datetime import date, timedelta\n   import sys\n   earliest = date.fromisoformat('$earliest')\n   latest = date.fromisoformat('$latest')\n   available = (latest - earliest).days + 1\n   window = 30 if available >= 60 else available \u002F\u002F 2\n   if window \u003C 1:\n       sys.stderr.write(f'ERROR: not enough catalog coverage (only {available} day(s))\\n')\n       sys.exit(1)\n   current_end = latest\n   current_start = latest - timedelta(days=window - 1)\n   prior_end = latest - timedelta(days=window)\n   prior_start = prior_end - timedelta(days=window - 1)\n   print(available, window, current_start, current_end, prior_start, prior_end)\n   \")\n   if [ -z \"$window\" ] || [ \"$window\" -lt 1 ]; then exit 1; fi\n   echo \"available=$available days  window=$window  current=$current_start..$current_end  prior=$prior_start..$prior_end\"\n   ```\n\n   If `window \u003C 30` after the pull attempt, build a one-line coverage caveat string and pass it as `--data-coverage-note` in the next step. It renders into the report markdown and HTML so it travels with shared reports. Don't add chat-only narration on top. Example:\n\n   ```bash\n   note=\"\"\n   if [ \"$window\" -lt 30 ]; then\n     note=\"Only $available days of data were available, so windows are ${window}\u002F${window} days instead of the usual 30\u002F30. Trends from shorter windows are noisier.\"\n   fi\n   ```\n\n3. **Auto-detect employee traffic on first populated cache (silent).** If `employee_filter_checked` is absent from `bucket.json`, run the detection script in quiet mode now that the pull has had a chance to populate the lake. The script writes `employee_filter_checked: true` after scanning so this only runs once, and writes `employee_filter` only if it finds an unambiguous match. On match, the report's own one-line note (rendered by `staircase.py` when `--employee-filter-*` is passed) is what surfaces the result – this step adds no chat output of its own.\n\n   ```bash\n   if ! python3 -c \"import json,sys; sys.exit(0 if json.load(open('${XDG_CONFIG_HOME:-$HOME\u002F.config}\u002Fagentic-analytics\u002Fbucket.json')).get('employee_filter_checked') else 1)\" 2>\u002Fdev\u002Fnull; then\n     \"$plugin_python\" \"$plugin_root\u002Fskills\u002Fidentify-employees\u002Fscripts\u002Fdetect_employee_filter.py\" \\\n       --bucket-config \"${XDG_CONFIG_HOME:-$HOME\u002F.config}\u002Fagentic-analytics\u002Fbucket.json\" \\\n       [--site \u003Csite-id>] \\\n       --quiet || true\n   fi\n   ```\n\n   Pass `--site \u003Csite-id>` only when the site ID filter is non-empty (single-site mode); omit it in all-sites mode.\n\n   The `|| true` is intentional: detection failures (empty lake, transient I\u002FO) should never block the report. Re-read `bucket.json` after this step so any newly-written `employee_filter` is available for step 4.\n\n4. **Run the report.** Slug the output filename from `cache_dir` plus the site ID filter (or `all` when none):\n\n   ```bash\n   slug=\"\u003Ccache_dir>$([ -n \"\u003Csite-id>\" ] && echo \"-\u003Csite-id>\" || echo \"-all\")\"\n   \"$plugin_python\" \"$plugin_root\u002Fskills\u002Fstaircase-report\u002Fscripts\u002Fstaircase.py\" \\\n     [--site-id \u003Csite-id>] \\\n     --current \u003Ccurrent_start> \u003Ccurrent_end> \\\n     --prior \u003Cprior_start> \u003Cprior_end> \\\n     [--internal-domains \u003Ccorp-domain>] \\\n     [--network-label \"\u003Cnetwork-label>\" --network-sources \"\u003Cnetwork-sources>\"] \\\n     [--data-coverage-note \"$note\"] \\\n     [--employee-filter-key \u003Ckey> --employee-filter-value \u003Cjson-value>] \\\n     [--join-id-key \u003Ckey>] \\\n     --output-md \u002Ftmp\u002Fstaircase-$slug.md \\\n     --output-html \u002Ftmp\u002Fstaircase-$slug.html\n   ```\n\n   `--events-dir` and `--cache-root` are NOT passed; `staircase.py` opens the catalog and reads events from the lake internally.\n\n   `--site-label` is omitted in the public flow – reports just say \"Relationship Staircase Report\" at the top. Callers that want a labeled header (the dev wrapper) can still pass `--site-label \"\u003Cvalue>\"`.\n\n   `--network-label` and `--network-sources` are paired: pass both or neither. They classify cross-promotion traffic from the customer's own properties under a named channel. Source values for the customer come from the wrapper (when invoked via the dev `\u002Fstaircase` wrapper) or future plugin config; the public init flow doesn't set them.\n\n   `--internal-domains` only applies when the wrapper supplies a corp domain or the user has configured one. Plain customer installs typically omit it.\n\n   `--employee-filter-key` and `--employee-filter-value` are paired: pass both or neither. Read from `bucket.json[\"employee_filter\"]` when present (step 1). The key passes through as-is. The value must be JSON-encoded on the command line: a Python boolean becomes `true` or `false`, a string gets wrapped in quotes (e.g. `'\"yes\"'` with single-quoted shell escaping), and numbers stay bare (`1`). `staircase.py` decodes it with `json.loads` and compares with `==` against `extra_data[\u003Ckey>]`. When set, matching events are excluded from the report and a one-line note appears at the top.\n\n   Pass `--site-id` only when the site ID filter is non-empty. Pass `--data-coverage-note` only when `$note` is non-empty (i.e. windows are short). Pass `--employee-filter-*` only when `employee_filter` is present in `bucket.json`. Pass `--join-id-key` only when `join_id_key` is present in `bucket.json` (this flag is plumbing between the skill and the script; customers don't type it).\n\n5. **Output the report**: read `\u002Ftmp\u002Fstaircase-$slug.md` and emit its contents verbatim. Don't add formatting, don't add framing.\n\n6. **Append the HTML link** as the last line, with one blank line separating it from the report body:\n\n   ```\n   [Open the HTML version in browser](file:\u002F\u002F\u002Ftmp\u002Fstaircase-$slug.html)\n   ```\n\n   The link target is the **`.html`** file — same `$slug` as step 4, with the `.html` extension. Do **not** link the `.md` file: that's the report body you just emitted verbatim in step 5, not the HTML version. The `file:\u002F\u002F` protocol matters: a bare path can be intercepted by an editor.\n\n## Constraints (re-stated for emphasis)\n\n- No \"Running staircase for…\" preamble.\n- No \"Two things stand out…\" \u002F \"Let me know if…\" postscript.\n- No re-narration of the report's findings.\n- The pull-then-probe step in §2 handles short caches. Pass the caveat via `--data-coverage-note` so it lands inside the report itself (visible in both the in-chat verbatim render and the shared HTML). Don't add chat-only narration on top of that.\n- If `bucket.json` is missing, tell the user to run the init flow first; do not try to guess values.\n- The trailing link points at the `.html` file from step 4 (`--output-html`), never the `.md` file.\n- If the lake has no DPL events for the configured bucket\u002Fsite, surface that as an error (one short line) and stop.\n",{"data":33,"body":34},{"name":4,"description":6},{"type":35,"children":36},"root",[37,45,67,85,90,113,120,3255,3261,3334],{"type":38,"tag":39,"props":40,"children":41},"element","p",{},[42],{"type":43,"value":44},"text","Run the staircase audience-relationship report.",{"type":38,"tag":39,"props":46,"children":47},{},[48,50,56,58,65],{"type":43,"value":49},"The customer may supply an optional ",{"type":38,"tag":51,"props":52,"children":53},"strong",{},[54],{"type":43,"value":55},"site ID filter",{"type":43,"value":57}," (via a slash-command argument on harnesses that have them, or in plain chat: \"run the staircase report for your-site.com\"). Empty means \"run across all sites in the configured bucket\"; non-empty means \"filter to that one site (e.g. ",{"type":38,"tag":59,"props":60,"children":62},"code",{"className":61},[],[63],{"type":43,"value":64},"your-site.com",{"type":43,"value":66},").\"",{"type":38,"tag":39,"props":68,"children":69},{},[70,75,77,83],{"type":38,"tag":51,"props":71,"children":72},{},[73],{"type":43,"value":74},"Output ONLY the report contents",{"type":43,"value":76}," (the markdown body of the generated report file) followed by a single ",{"type":38,"tag":59,"props":78,"children":80},{"className":79},[],[81],{"type":43,"value":82},"file:\u002F\u002F",{"type":43,"value":84}," link line at the end. NO preamble. NO postscript. NO commentary. NO explanation. The Recommendations section at the top of the report IS the analysis. Don't re-narrate it.",{"type":38,"tag":39,"props":86,"children":87},{},[88],{"type":43,"value":89},"You are a pipe, not an analyst. The customer reads the report directly.",{"type":38,"tag":39,"props":91,"children":92},{},[93,98,100],{"type":38,"tag":51,"props":94,"children":95},{},[96],{"type":43,"value":97},"This rule applies to conversational invocations too.",{"type":43,"value":99}," When the user asks for \"the staircase report\" \u002F \"run the report\" \u002F \"run the staircase report for ",{"type":38,"tag":101,"props":102,"children":103},"site-id",{},[104,106,111],{"type":43,"value":105},"\" without typing a slash command, follow the same contract: render the markdown report verbatim in chat, then the ",{"type":38,"tag":59,"props":107,"children":109},{"className":108},[],[110],{"type":43,"value":82},{"type":43,"value":112}," HTML link, no narration. A summary instead of the report is the wrong shape. The user wants to read the report in the terminal. The HTML version is allowed to carry more detail than the in-chat markdown (e.g., the collapsible full-tail referrer list); that asymmetry is intentional, don't try to mirror everything into the chat output.",{"type":38,"tag":114,"props":115,"children":117},"h2",{"id":116},"steps",[118],{"type":43,"value":119},"Steps",{"type":38,"tag":121,"props":122,"children":124},"ol",{"start":123},0,[125,427,629,2063,2401,3166,3184],{"type":38,"tag":126,"props":127,"children":128},"li",{},[129,134,136,142,144,377,381,387,389,395,397,402,404,410,412,418,420,425],{"type":38,"tag":51,"props":130,"children":131},{},[132],{"type":43,"value":133},"Resolve the plugin root.",{"type":43,"value":135}," Every bash snippet below assumes ",{"type":38,"tag":59,"props":137,"children":139},{"className":138},[],[140],{"type":43,"value":141},"$plugin_root",{"type":43,"value":143}," is set in that shell invocation; re-run this line whenever you start a new shell:",{"type":38,"tag":145,"props":146,"children":151},"pre",{"className":147,"code":148,"language":149,"meta":150,"style":150},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","plugin_root=\"${CLAUDE_PLUGIN_ROOT:-${CURSOR_PLUGIN_ROOT:-\u003Cplugin-root>}}\"\nplugin_python=\"${AGENTIC_ANALYTICS_VENV:-${AGENTIC_ANALYTICS_DATA_DIR:-$HOME\u002F.local\u002Fshare\u002Fagentic-analytics}\u002Fvenv}\u002Fbin\u002Fpython\"\n[ -x \"$plugin_python\" ] || plugin_python=\"python3\"\n","bash","",[152],{"type":38,"tag":59,"props":153,"children":154},{"__ignoreMap":150},[155,218,316],{"type":38,"tag":156,"props":157,"children":159},"span",{"class":158,"line":22},"line",[160,166,172,177,182,187,192,197,203,208,213],{"type":38,"tag":156,"props":161,"children":163},{"style":162},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[164],{"type":43,"value":165},"plugin_root",{"type":38,"tag":156,"props":167,"children":169},{"style":168},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[170],{"type":43,"value":171},"=",{"type":38,"tag":156,"props":173,"children":174},{"style":168},[175],{"type":43,"value":176},"\"${",{"type":38,"tag":156,"props":178,"children":179},{"style":162},[180],{"type":43,"value":181},"CLAUDE_PLUGIN_ROOT",{"type":38,"tag":156,"props":183,"children":184},{"style":168},[185],{"type":43,"value":186},":-${",{"type":38,"tag":156,"props":188,"children":189},{"style":162},[190],{"type":43,"value":191},"CURSOR_PLUGIN_ROOT",{"type":38,"tag":156,"props":193,"children":194},{"style":168},[195],{"type":43,"value":196},":-",{"type":38,"tag":156,"props":198,"children":200},{"style":199},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[201],{"type":43,"value":202},"\u003C",{"type":38,"tag":156,"props":204,"children":205},{"style":162},[206],{"type":43,"value":207},"plugin-root",{"type":38,"tag":156,"props":209,"children":210},{"style":199},[211],{"type":43,"value":212},">",{"type":38,"tag":156,"props":214,"children":215},{"style":168},[216],{"type":43,"value":217},"}}\"\n",{"type":38,"tag":156,"props":219,"children":221},{"class":158,"line":220},2,[222,227,231,235,240,244,249,253,258,263,268,273,277,282,286,291,296,301,306,311],{"type":38,"tag":156,"props":223,"children":224},{"style":162},[225],{"type":43,"value":226},"plugin_python",{"type":38,"tag":156,"props":228,"children":229},{"style":168},[230],{"type":43,"value":171},{"type":38,"tag":156,"props":232,"children":233},{"style":168},[234],{"type":43,"value":176},{"type":38,"tag":156,"props":236,"children":237},{"style":162},[238],{"type":43,"value":239},"AGENTIC_ANALYTICS_VENV",{"type":38,"tag":156,"props":241,"children":242},{"style":168},[243],{"type":43,"value":186},{"type":38,"tag":156,"props":245,"children":246},{"style":162},[247],{"type":43,"value":248},"AGENTIC_ANALYTICS_DATA_DIR",{"type":38,"tag":156,"props":250,"children":251},{"style":168},[252],{"type":43,"value":196},{"type":38,"tag":156,"props":254,"children":255},{"style":162},[256],{"type":43,"value":257},"$HOME",{"type":38,"tag":156,"props":259,"children":260},{"style":168},[261],{"type":43,"value":262},"\u002F",{"type":38,"tag":156,"props":264,"children":265},{"style":199},[266],{"type":43,"value":267},".",{"type":38,"tag":156,"props":269,"children":270},{"style":162},[271],{"type":43,"value":272},"local",{"type":38,"tag":156,"props":274,"children":275},{"style":168},[276],{"type":43,"value":262},{"type":38,"tag":156,"props":278,"children":279},{"style":162},[280],{"type":43,"value":281},"share",{"type":38,"tag":156,"props":283,"children":284},{"style":168},[285],{"type":43,"value":262},{"type":38,"tag":156,"props":287,"children":288},{"style":162},[289],{"type":43,"value":290},"agentic-analytics",{"type":38,"tag":156,"props":292,"children":293},{"style":168},[294],{"type":43,"value":295},"}\u002F",{"type":38,"tag":156,"props":297,"children":298},{"style":162},[299],{"type":43,"value":300},"venv",{"type":38,"tag":156,"props":302,"children":303},{"style":168},[304],{"type":43,"value":305},"}",{"type":38,"tag":156,"props":307,"children":308},{"style":199},[309],{"type":43,"value":310},"\u002Fbin\u002Fpython",{"type":38,"tag":156,"props":312,"children":313},{"style":168},[314],{"type":43,"value":315},"\"\n",{"type":38,"tag":156,"props":317,"children":319},{"class":158,"line":318},3,[320,325,330,335,340,345,350,355,360,364,368,373],{"type":38,"tag":156,"props":321,"children":322},{"style":168},[323],{"type":43,"value":324},"[",{"type":38,"tag":156,"props":326,"children":327},{"style":168},[328],{"type":43,"value":329}," -x",{"type":38,"tag":156,"props":331,"children":332},{"style":168},[333],{"type":43,"value":334}," \"",{"type":38,"tag":156,"props":336,"children":337},{"style":162},[338],{"type":43,"value":339},"$plugin_python",{"type":38,"tag":156,"props":341,"children":342},{"style":168},[343],{"type":43,"value":344},"\"",{"type":38,"tag":156,"props":346,"children":347},{"style":168},[348],{"type":43,"value":349}," ]",{"type":38,"tag":156,"props":351,"children":352},{"style":168},[353],{"type":43,"value":354}," ||",{"type":38,"tag":156,"props":356,"children":357},{"style":162},[358],{"type":43,"value":359}," plugin_python",{"type":38,"tag":156,"props":361,"children":362},{"style":168},[363],{"type":43,"value":171},{"type":38,"tag":156,"props":365,"children":366},{"style":168},[367],{"type":43,"value":344},{"type":38,"tag":156,"props":369,"children":370},{"style":199},[371],{"type":43,"value":372},"python3",{"type":38,"tag":156,"props":374,"children":375},{"style":168},[376],{"type":43,"value":315},{"type":38,"tag":378,"props":379,"children":380},"br",{},[],{"type":38,"tag":59,"props":382,"children":384},{"className":383},[],[385],{"type":43,"value":386},"\u003Cplugin-root>",{"type":43,"value":388}," is the plugin's install directory – the directory two levels above this SKILL.md file. In a dev checkout of the source repo that's ",{"type":38,"tag":59,"props":390,"children":392},{"className":391},[],[393],{"type":43,"value":394},"plugin\u002F",{"type":43,"value":396},". ",{"type":38,"tag":59,"props":398,"children":400},{"className":399},[],[401],{"type":43,"value":339},{"type":43,"value":403}," is the plugin's isolated venv (created by the init flow at ",{"type":38,"tag":59,"props":405,"children":407},{"className":406},[],[408],{"type":43,"value":409},"$AGENTIC_ANALYTICS_DATA_DIR\u002Fvenv",{"type":43,"value":411},", default ",{"type":38,"tag":59,"props":413,"children":415},{"className":414},[],[416],{"type":43,"value":417},"~\u002F.local\u002Fshare\u002Fagentic-analytics\u002Fvenv",{"type":43,"value":419},"); it falls back to ",{"type":38,"tag":59,"props":421,"children":423},{"className":422},[],[424],{"type":43,"value":372},{"type":43,"value":426}," if the venv doesn't exist yet.",{"type":38,"tag":126,"props":428,"children":429},{},[430,435,437,443,445,561,564,566,572,574,577,579],{"type":38,"tag":51,"props":431,"children":432},{},[433],{"type":43,"value":434},"Load the bucket config and resolve the site ID filter.",{"type":43,"value":436}," Read ",{"type":38,"tag":59,"props":438,"children":440},{"className":439},[],[441],{"type":43,"value":442},"${XDG_CONFIG_HOME:-~\u002F.config}\u002Fagentic-analytics\u002Fbucket.json",{"type":43,"value":444},", written by the init flow. It contains:",{"type":38,"tag":446,"props":447,"children":448},"ul",{},[449,460,471,490,517,528],{"type":38,"tag":126,"props":450,"children":451},{},[452,458],{"type":38,"tag":59,"props":453,"children":455},{"className":454},[],[456],{"type":43,"value":457},"bucket",{"type":43,"value":459},": S3 bucket holding the customer's DPL events.",{"type":38,"tag":126,"props":461,"children":462},{},[463,469],{"type":38,"tag":59,"props":464,"children":466},{"className":465},[],[467],{"type":43,"value":468},"profile",{"type":43,"value":470},": AWS profile to authenticate with.",{"type":38,"tag":126,"props":472,"children":473},{},[474,480,482,488],{"type":38,"tag":59,"props":475,"children":477},{"className":476},[],[478],{"type":43,"value":479},"cache_dir",{"type":43,"value":481},": a slug used to identify the customer's data and name output files (e.g. ",{"type":38,"tag":59,"props":483,"children":485},{"className":484},[],[486],{"type":43,"value":487},"acme",{"type":43,"value":489},").",{"type":38,"tag":126,"props":491,"children":492},{},[493,499,501,507,509,515],{"type":38,"tag":59,"props":494,"children":496},{"className":495},[],[497],{"type":43,"value":498},"employee_filter",{"type":43,"value":500}," (optional): ",{"type":38,"tag":59,"props":502,"children":504},{"className":503},[],[505],{"type":43,"value":506},"{ \"extra_data_key\": \"...\", \"extra_data_value\": ... }",{"type":43,"value":508},". Written by the auto-detection in step 3 (or a manual run of the identify-employees skill) when an unambiguous employee-traffic tag was found. If present, pass it through to ",{"type":38,"tag":59,"props":510,"children":512},{"className":511},[],[513],{"type":43,"value":514},"staircase.py",{"type":43,"value":516}," (step 4); the report excludes those events and renders a one-line note up top.",{"type":38,"tag":126,"props":518,"children":519},{},[520,526],{"type":38,"tag":59,"props":521,"children":523},{"className":522},[],[524],{"type":43,"value":525},"employee_filter_checked",{"type":43,"value":527}," (optional): boolean flag set after employee-traffic detection has run at least once against a populated cache. Step 3 below uses this to decide whether to run a first-time auto-detect.",{"type":38,"tag":126,"props":529,"children":530},{},[531,537,539,545,547,552,554,560],{"type":38,"tag":59,"props":532,"children":534},{"className":533},[],[535],{"type":43,"value":536},"join_id_key",{"type":43,"value":538}," (optional): the URL query parameter the customer carries in email-campaign links to identify each recipient (e.g. ",{"type":38,"tag":59,"props":540,"children":542},{"className":541},[],[543],{"type":43,"value":544},"\"pid\"",{"type":43,"value":546},"). When set, cohort CSVs gain a column with that name, populated from the query string of any pageview where the parameter appears. The customer joins the cohort back to their CRM list on that column. If present, pass it through to ",{"type":38,"tag":59,"props":548,"children":550},{"className":549},[],[551],{"type":43,"value":514},{"type":43,"value":553}," (step 4) as ",{"type":38,"tag":59,"props":555,"children":557},{"className":556},[],[558],{"type":43,"value":559},"--join-id-key \u003Cvalue>",{"type":43,"value":267},{"type":38,"tag":378,"props":562,"children":563},{},[],{"type":43,"value":565},"If the file is missing, tell the user to run the init flow first (",{"type":38,"tag":59,"props":567,"children":569},{"className":568},[],[570],{"type":43,"value":571},"\u002Fagentic-analytics:init",{"type":43,"value":573}," on harnesses with slash commands, or \"set up agentic analytics\" in chat) and stop.",{"type":38,"tag":378,"props":575,"children":576},{},[],{"type":43,"value":578},"The site ID filter:",{"type":38,"tag":446,"props":580,"children":581},{},[582,601],{"type":38,"tag":126,"props":583,"children":584},{},[585,587,593,595,600],{"type":43,"value":586},"If empty: the report runs across every site in the bucket. Pass NO ",{"type":38,"tag":59,"props":588,"children":590},{"className":589},[],[591],{"type":43,"value":592},"--site-id",{"type":43,"value":594}," flag to ",{"type":38,"tag":59,"props":596,"children":598},{"className":597},[],[599],{"type":43,"value":514},{"type":43,"value":267},{"type":38,"tag":126,"props":602,"children":603},{},[604,606,612,614,619,621,627],{"type":43,"value":605},"If non-empty: filter events to that site. Pass ",{"type":38,"tag":59,"props":607,"children":609},{"className":608},[],[610],{"type":43,"value":611},"--site-id \u003Cvalue>",{"type":43,"value":613}," to ",{"type":38,"tag":59,"props":615,"children":617},{"className":616},[],[618],{"type":43,"value":514},{"type":43,"value":620},". The site ID itself shows up in the report's ",{"type":38,"tag":59,"props":622,"children":624},{"className":623},[],[625],{"type":43,"value":626},"Site ID filter:",{"type":43,"value":628}," line, so the report stays identifiable without a separate header label.",{"type":38,"tag":126,"props":630,"children":631},{},[632,637,639,645,647,650,652,658,660,663,665,671,673,679,681,1119,1122,1124,1130,1132,1135,1137,1143,1145,1900,1903,1905,1911,1913,1919,1921],{"type":38,"tag":51,"props":633,"children":634},{},[635],{"type":43,"value":636},"Try to ensure a full 60 days of coverage, then compute windows from what's actually on disk.",{"type":43,"value":638}," The DPL pull is incremental, and a customer's cache may start well after the date the report was requested. Using a fixed ",{"type":38,"tag":59,"props":640,"children":642},{"className":641},[],[643],{"type":43,"value":644},"today - 30d",{"type":43,"value":646}," window can land the prior window entirely before the data starts, producing a report where every prior count is 0 and every row is labeled \"new\". Always anchor on what's on disk.",{"type":38,"tag":378,"props":648,"children":649},{},[],{"type":43,"value":651},"First, attempt to pull the target 60-day range. ",{"type":38,"tag":59,"props":653,"children":655},{"className":654},[],[656],{"type":43,"value":657},"pull_parsely_dpl.py",{"type":43,"value":659}," is incremental: it checks the lake for each day's parquet partition and only fetches missing days, so already-synced customers pay milliseconds, fresh onboards pay the full pull once.",{"type":38,"tag":378,"props":661,"children":662},{},[],{"type":43,"value":664},"When the site ID filter is non-empty (single-site mode), pass ",{"type":38,"tag":59,"props":666,"children":668},{"className":667},[],[669],{"type":43,"value":670},"--site \u003Csite-id>",{"type":43,"value":672}," so only that site's partition is synced. When the site ID filter is empty (all-sites mode), omit ",{"type":38,"tag":59,"props":674,"children":676},{"className":675},[],[677],{"type":43,"value":678},"--site",{"type":43,"value":680}," so the full bucket is synced.",{"type":38,"tag":145,"props":682,"children":684},{"className":147,"code":683,"language":149,"meta":150,"style":150},"# Target range: 60 days ending yesterday. Use Python for cross-platform date math.\nread target_start target_end \u003C \u003C(python3 -c \"\nfrom datetime import date, timedelta\nstart = date.today() - timedelta(days=60)\nend = date.today() - timedelta(days=1)\nprint(start.strftime('%Y-%m-%d'), end.strftime('%Y-%m-%d'))\n\")\n# Single-site pull (when site-id provided):\n\"$plugin_python\" \"$plugin_root\u002Fscripts\u002Fdb\u002Fpull_parsely_dpl.py\" \\\n  --bucket \u003Cbucket> --site \u003Csite-id> \\\n  --start \"$target_start\" --end \"$target_end\" \\\n  [--profile \u003Cprofile>] || true\n# All-sites pull (when no site-id):\n\"$plugin_python\" \"$plugin_root\u002Fscripts\u002Fdb\u002Fpull_parsely_dpl.py\" \\\n  --bucket \u003Cbucket> \\\n  --start \"$target_start\" --end \"$target_end\" \\\n  [--profile \u003Cprofile>] || true\n",[685],{"type":38,"tag":59,"props":686,"children":687},{"__ignoreMap":150},[688,697,740,748,757,766,775,784,793,831,885,929,970,979,1015,1043,1083],{"type":38,"tag":156,"props":689,"children":690},{"class":158,"line":22},[691],{"type":38,"tag":156,"props":692,"children":694},{"style":693},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[695],{"type":43,"value":696},"# Target range: 60 days ending yesterday. Use Python for cross-platform date math.\n",{"type":38,"tag":156,"props":698,"children":699},{"class":158,"line":220},[700,706,711,716,721,726,731,736],{"type":38,"tag":156,"props":701,"children":703},{"style":702},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[704],{"type":43,"value":705},"read",{"type":38,"tag":156,"props":707,"children":708},{"style":199},[709],{"type":43,"value":710}," target_start",{"type":38,"tag":156,"props":712,"children":713},{"style":199},[714],{"type":43,"value":715}," target_end",{"type":38,"tag":156,"props":717,"children":718},{"style":168},[719],{"type":43,"value":720}," \u003C",{"type":38,"tag":156,"props":722,"children":723},{"style":168},[724],{"type":43,"value":725}," \u003C(",{"type":38,"tag":156,"props":727,"children":729},{"style":728},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[730],{"type":43,"value":372},{"type":38,"tag":156,"props":732,"children":733},{"style":199},[734],{"type":43,"value":735}," -c ",{"type":38,"tag":156,"props":737,"children":738},{"style":168},[739],{"type":43,"value":315},{"type":38,"tag":156,"props":741,"children":742},{"class":158,"line":318},[743],{"type":38,"tag":156,"props":744,"children":745},{"style":199},[746],{"type":43,"value":747},"from datetime import date, timedelta\n",{"type":38,"tag":156,"props":749,"children":751},{"class":158,"line":750},4,[752],{"type":38,"tag":156,"props":753,"children":754},{"style":199},[755],{"type":43,"value":756},"start = date.today() - timedelta(days=60)\n",{"type":38,"tag":156,"props":758,"children":760},{"class":158,"line":759},5,[761],{"type":38,"tag":156,"props":762,"children":763},{"style":199},[764],{"type":43,"value":765},"end = date.today() - timedelta(days=1)\n",{"type":38,"tag":156,"props":767,"children":769},{"class":158,"line":768},6,[770],{"type":38,"tag":156,"props":771,"children":772},{"style":199},[773],{"type":43,"value":774},"print(start.strftime('%Y-%m-%d'), end.strftime('%Y-%m-%d'))\n",{"type":38,"tag":156,"props":776,"children":778},{"class":158,"line":777},7,[779],{"type":38,"tag":156,"props":780,"children":781},{"style":168},[782],{"type":43,"value":783},"\")\n",{"type":38,"tag":156,"props":785,"children":787},{"class":158,"line":786},8,[788],{"type":38,"tag":156,"props":789,"children":790},{"style":693},[791],{"type":43,"value":792},"# Single-site pull (when site-id provided):\n",{"type":38,"tag":156,"props":794,"children":796},{"class":158,"line":795},9,[797,801,805,809,813,817,822,826],{"type":38,"tag":156,"props":798,"children":799},{"style":728},[800],{"type":43,"value":344},{"type":38,"tag":156,"props":802,"children":803},{"style":162},[804],{"type":43,"value":339},{"type":38,"tag":156,"props":806,"children":807},{"style":728},[808],{"type":43,"value":344},{"type":38,"tag":156,"props":810,"children":811},{"style":168},[812],{"type":43,"value":334},{"type":38,"tag":156,"props":814,"children":815},{"style":162},[816],{"type":43,"value":141},{"type":38,"tag":156,"props":818,"children":819},{"style":199},[820],{"type":43,"value":821},"\u002Fscripts\u002Fdb\u002Fpull_parsely_dpl.py",{"type":38,"tag":156,"props":823,"children":824},{"style":168},[825],{"type":43,"value":344},{"type":38,"tag":156,"props":827,"children":828},{"style":162},[829],{"type":43,"value":830}," \\\n",{"type":38,"tag":156,"props":832,"children":834},{"class":158,"line":833},10,[835,840,844,849,854,858,863,867,872,877,881],{"type":38,"tag":156,"props":836,"children":837},{"style":199},[838],{"type":43,"value":839},"  --bucket",{"type":38,"tag":156,"props":841,"children":842},{"style":168},[843],{"type":43,"value":720},{"type":38,"tag":156,"props":845,"children":846},{"style":199},[847],{"type":43,"value":848},"bucke",{"type":38,"tag":156,"props":850,"children":851},{"style":162},[852],{"type":43,"value":853},"t",{"type":38,"tag":156,"props":855,"children":856},{"style":168},[857],{"type":43,"value":212},{"type":38,"tag":156,"props":859,"children":860},{"style":199},[861],{"type":43,"value":862}," --site",{"type":38,"tag":156,"props":864,"children":865},{"style":168},[866],{"type":43,"value":720},{"type":38,"tag":156,"props":868,"children":869},{"style":199},[870],{"type":43,"value":871},"site-i",{"type":38,"tag":156,"props":873,"children":874},{"style":162},[875],{"type":43,"value":876},"d",{"type":38,"tag":156,"props":878,"children":879},{"style":168},[880],{"type":43,"value":212},{"type":38,"tag":156,"props":882,"children":883},{"style":162},[884],{"type":43,"value":830},{"type":38,"tag":156,"props":886,"children":888},{"class":158,"line":887},11,[889,894,898,903,907,912,916,921,925],{"type":38,"tag":156,"props":890,"children":891},{"style":199},[892],{"type":43,"value":893},"  --start",{"type":38,"tag":156,"props":895,"children":896},{"style":168},[897],{"type":43,"value":334},{"type":38,"tag":156,"props":899,"children":900},{"style":162},[901],{"type":43,"value":902},"$target_start",{"type":38,"tag":156,"props":904,"children":905},{"style":168},[906],{"type":43,"value":344},{"type":38,"tag":156,"props":908,"children":909},{"style":199},[910],{"type":43,"value":911}," --end",{"type":38,"tag":156,"props":913,"children":914},{"style":168},[915],{"type":43,"value":334},{"type":38,"tag":156,"props":917,"children":918},{"style":162},[919],{"type":43,"value":920},"$target_end",{"type":38,"tag":156,"props":922,"children":923},{"style":168},[924],{"type":43,"value":344},{"type":38,"tag":156,"props":926,"children":927},{"style":162},[928],{"type":43,"value":830},{"type":38,"tag":156,"props":930,"children":932},{"class":158,"line":931},12,[933,938,942,947,952,956,961,965],{"type":38,"tag":156,"props":934,"children":935},{"style":162},[936],{"type":43,"value":937},"  [--profile ",{"type":38,"tag":156,"props":939,"children":940},{"style":168},[941],{"type":43,"value":202},{"type":38,"tag":156,"props":943,"children":944},{"style":199},[945],{"type":43,"value":946},"profil",{"type":38,"tag":156,"props":948,"children":949},{"style":162},[950],{"type":43,"value":951},"e",{"type":38,"tag":156,"props":953,"children":954},{"style":168},[955],{"type":43,"value":212},{"type":38,"tag":156,"props":957,"children":958},{"style":199},[959],{"type":43,"value":960},"]",{"type":38,"tag":156,"props":962,"children":963},{"style":168},[964],{"type":43,"value":354},{"type":38,"tag":156,"props":966,"children":967},{"style":702},[968],{"type":43,"value":969}," true\n",{"type":38,"tag":156,"props":971,"children":973},{"class":158,"line":972},13,[974],{"type":38,"tag":156,"props":975,"children":976},{"style":693},[977],{"type":43,"value":978},"# All-sites pull (when no site-id):\n",{"type":38,"tag":156,"props":980,"children":982},{"class":158,"line":981},14,[983,987,991,995,999,1003,1007,1011],{"type":38,"tag":156,"props":984,"children":985},{"style":728},[986],{"type":43,"value":344},{"type":38,"tag":156,"props":988,"children":989},{"style":162},[990],{"type":43,"value":339},{"type":38,"tag":156,"props":992,"children":993},{"style":728},[994],{"type":43,"value":344},{"type":38,"tag":156,"props":996,"children":997},{"style":168},[998],{"type":43,"value":334},{"type":38,"tag":156,"props":1000,"children":1001},{"style":162},[1002],{"type":43,"value":141},{"type":38,"tag":156,"props":1004,"children":1005},{"style":199},[1006],{"type":43,"value":821},{"type":38,"tag":156,"props":1008,"children":1009},{"style":168},[1010],{"type":43,"value":344},{"type":38,"tag":156,"props":1012,"children":1013},{"style":162},[1014],{"type":43,"value":830},{"type":38,"tag":156,"props":1016,"children":1018},{"class":158,"line":1017},15,[1019,1023,1027,1031,1035,1039],{"type":38,"tag":156,"props":1020,"children":1021},{"style":199},[1022],{"type":43,"value":839},{"type":38,"tag":156,"props":1024,"children":1025},{"style":168},[1026],{"type":43,"value":720},{"type":38,"tag":156,"props":1028,"children":1029},{"style":199},[1030],{"type":43,"value":848},{"type":38,"tag":156,"props":1032,"children":1033},{"style":162},[1034],{"type":43,"value":853},{"type":38,"tag":156,"props":1036,"children":1037},{"style":168},[1038],{"type":43,"value":212},{"type":38,"tag":156,"props":1040,"children":1041},{"style":162},[1042],{"type":43,"value":830},{"type":38,"tag":156,"props":1044,"children":1046},{"class":158,"line":1045},16,[1047,1051,1055,1059,1063,1067,1071,1075,1079],{"type":38,"tag":156,"props":1048,"children":1049},{"style":199},[1050],{"type":43,"value":893},{"type":38,"tag":156,"props":1052,"children":1053},{"style":168},[1054],{"type":43,"value":334},{"type":38,"tag":156,"props":1056,"children":1057},{"style":162},[1058],{"type":43,"value":902},{"type":38,"tag":156,"props":1060,"children":1061},{"style":168},[1062],{"type":43,"value":344},{"type":38,"tag":156,"props":1064,"children":1065},{"style":199},[1066],{"type":43,"value":911},{"type":38,"tag":156,"props":1068,"children":1069},{"style":168},[1070],{"type":43,"value":334},{"type":38,"tag":156,"props":1072,"children":1073},{"style":162},[1074],{"type":43,"value":920},{"type":38,"tag":156,"props":1076,"children":1077},{"style":168},[1078],{"type":43,"value":344},{"type":38,"tag":156,"props":1080,"children":1081},{"style":162},[1082],{"type":43,"value":830},{"type":38,"tag":156,"props":1084,"children":1086},{"class":158,"line":1085},17,[1087,1091,1095,1099,1103,1107,1111,1115],{"type":38,"tag":156,"props":1088,"children":1089},{"style":162},[1090],{"type":43,"value":937},{"type":38,"tag":156,"props":1092,"children":1093},{"style":168},[1094],{"type":43,"value":202},{"type":38,"tag":156,"props":1096,"children":1097},{"style":199},[1098],{"type":43,"value":946},{"type":38,"tag":156,"props":1100,"children":1101},{"style":162},[1102],{"type":43,"value":951},{"type":38,"tag":156,"props":1104,"children":1105},{"style":168},[1106],{"type":43,"value":212},{"type":38,"tag":156,"props":1108,"children":1109},{"style":199},[1110],{"type":43,"value":960},{"type":38,"tag":156,"props":1112,"children":1113},{"style":168},[1114],{"type":43,"value":354},{"type":38,"tag":156,"props":1116,"children":1117},{"style":702},[1118],{"type":43,"value":969},{"type":38,"tag":378,"props":1120,"children":1121},{},[],{"type":43,"value":1123},"The trailing ",{"type":38,"tag":59,"props":1125,"children":1127},{"className":1126},[],[1128],{"type":43,"value":1129},"|| true",{"type":43,"value":1131}," is intentional: don't fail the report on auth lapse, S3 hiccup, or no-such-day. Fall through to whatever's in the lake.",{"type":38,"tag":378,"props":1133,"children":1134},{},[],{"type":43,"value":1136},"Then probe the catalog for the earliest and latest day available, split the available span into two equal-size windows. In single-site mode filter by ",{"type":38,"tag":59,"props":1138,"children":1140},{"className":1139},[],[1141],{"type":43,"value":1142},"site",{"type":43,"value":1144},"; in all-sites mode query the whole lake:",{"type":38,"tag":145,"props":1146,"children":1148},{"className":147,"code":1147,"language":149,"meta":150,"style":150},"# Single-site catalog probe:\nread earliest latest \u003C \u003C(python3 -c \"\nimport sys; sys.path.insert(0, '$plugin_root\u002Fscripts\u002Fdb\u002Flib')\nimport catalog\ncon = catalog.connect()\ncatalog.ensure_view(con, 'dpl', 'events')\nrow = con.execute(\\\"SELECT min(day), max(day) FROM dpl_events WHERE apikey = '\u003Csite-id>'\\\").fetchone()\nif row[0] is None: sys.exit(1)\nprint(row[0], row[1])\n\")\n\n# All-sites catalog probe:\nread earliest latest \u003C \u003C(python3 -c \"\nimport sys; sys.path.insert(0, '$plugin_root\u002Fscripts\u002Fdb\u002Flib')\nimport catalog\ncon = catalog.connect()\ncatalog.ensure_view(con, 'dpl', 'events')\nrow = con.execute('SELECT min(day), max(day) FROM dpl_events').fetchone()\nif row[0] is None: sys.exit(1)\nprint(row[0], row[1])\n\")\n\nif [ -z \"$earliest\" ]; then echo \"ERROR: no data found in catalog for the requested site\u002Fbucket\" >&2; exit 1; fi\n\n# Compute window in Python for cross-platform date arithmetic.\n# Prefer 30\u002F30; fall back to N\u002FN where 2N fits the available span.\nread available window current_start current_end prior_start prior_end \u003C \u003C(python3 -c \"\nfrom datetime import date, timedelta\nimport sys\nearliest = date.fromisoformat('$earliest')\nlatest = date.fromisoformat('$latest')\navailable = (latest - earliest).days + 1\nwindow = 30 if available >= 60 else available \u002F\u002F 2\nif window \u003C 1:\n    sys.stderr.write(f'ERROR: not enough catalog coverage (only {available} day(s))\\n')\n    sys.exit(1)\ncurrent_end = latest\ncurrent_start = latest - timedelta(days=window - 1)\nprior_end = latest - timedelta(days=window)\nprior_start = prior_end - timedelta(days=window - 1)\nprint(available, window, current_start, current_end, prior_start, prior_end)\n\")\nif [ -z \"$window\" ] || [ \"$window\" -lt 1 ]; then exit 1; fi\necho \"available=$available days  window=$window  current=$current_start..$current_end  prior=$prior_start..$prior_end\"\n",[1149],{"type":38,"tag":59,"props":1150,"children":1151},{"__ignoreMap":150},[1152,1160,1197,1214,1222,1230,1238,1265,1273,1281,1288,1297,1305,1340,1355,1362,1369,1376,1385,1393,1401,1409,1417,1504,1512,1521,1530,1588,1596,1605,1623,1641,1650,1659,1668,1677,1686,1695,1704,1713,1722,1731,1739,1825],{"type":38,"tag":156,"props":1153,"children":1154},{"class":158,"line":22},[1155],{"type":38,"tag":156,"props":1156,"children":1157},{"style":693},[1158],{"type":43,"value":1159},"# Single-site catalog probe:\n",{"type":38,"tag":156,"props":1161,"children":1162},{"class":158,"line":220},[1163,1167,1172,1177,1181,1185,1189,1193],{"type":38,"tag":156,"props":1164,"children":1165},{"style":702},[1166],{"type":43,"value":705},{"type":38,"tag":156,"props":1168,"children":1169},{"style":199},[1170],{"type":43,"value":1171}," earliest",{"type":38,"tag":156,"props":1173,"children":1174},{"style":199},[1175],{"type":43,"value":1176}," latest",{"type":38,"tag":156,"props":1178,"children":1179},{"style":168},[1180],{"type":43,"value":720},{"type":38,"tag":156,"props":1182,"children":1183},{"style":168},[1184],{"type":43,"value":725},{"type":38,"tag":156,"props":1186,"children":1187},{"style":728},[1188],{"type":43,"value":372},{"type":38,"tag":156,"props":1190,"children":1191},{"style":199},[1192],{"type":43,"value":735},{"type":38,"tag":156,"props":1194,"children":1195},{"style":168},[1196],{"type":43,"value":315},{"type":38,"tag":156,"props":1198,"children":1199},{"class":158,"line":318},[1200,1205,1209],{"type":38,"tag":156,"props":1201,"children":1202},{"style":199},[1203],{"type":43,"value":1204},"import sys; sys.path.insert(0, '",{"type":38,"tag":156,"props":1206,"children":1207},{"style":162},[1208],{"type":43,"value":141},{"type":38,"tag":156,"props":1210,"children":1211},{"style":199},[1212],{"type":43,"value":1213},"\u002Fscripts\u002Fdb\u002Flib')\n",{"type":38,"tag":156,"props":1215,"children":1216},{"class":158,"line":750},[1217],{"type":38,"tag":156,"props":1218,"children":1219},{"style":199},[1220],{"type":43,"value":1221},"import catalog\n",{"type":38,"tag":156,"props":1223,"children":1224},{"class":158,"line":759},[1225],{"type":38,"tag":156,"props":1226,"children":1227},{"style":199},[1228],{"type":43,"value":1229},"con = catalog.connect()\n",{"type":38,"tag":156,"props":1231,"children":1232},{"class":158,"line":768},[1233],{"type":38,"tag":156,"props":1234,"children":1235},{"style":199},[1236],{"type":43,"value":1237},"catalog.ensure_view(con, 'dpl', 'events')\n",{"type":38,"tag":156,"props":1239,"children":1240},{"class":158,"line":777},[1241,1246,1251,1256,1260],{"type":38,"tag":156,"props":1242,"children":1243},{"style":199},[1244],{"type":43,"value":1245},"row = con.execute(",{"type":38,"tag":156,"props":1247,"children":1248},{"style":162},[1249],{"type":43,"value":1250},"\\\"",{"type":38,"tag":156,"props":1252,"children":1253},{"style":199},[1254],{"type":43,"value":1255},"SELECT min(day), max(day) FROM dpl_events WHERE apikey = '\u003Csite-id>'",{"type":38,"tag":156,"props":1257,"children":1258},{"style":162},[1259],{"type":43,"value":1250},{"type":38,"tag":156,"props":1261,"children":1262},{"style":199},[1263],{"type":43,"value":1264},").fetchone()\n",{"type":38,"tag":156,"props":1266,"children":1267},{"class":158,"line":786},[1268],{"type":38,"tag":156,"props":1269,"children":1270},{"style":199},[1271],{"type":43,"value":1272},"if row[0] is None: sys.exit(1)\n",{"type":38,"tag":156,"props":1274,"children":1275},{"class":158,"line":795},[1276],{"type":38,"tag":156,"props":1277,"children":1278},{"style":199},[1279],{"type":43,"value":1280},"print(row[0], row[1])\n",{"type":38,"tag":156,"props":1282,"children":1283},{"class":158,"line":833},[1284],{"type":38,"tag":156,"props":1285,"children":1286},{"style":168},[1287],{"type":43,"value":783},{"type":38,"tag":156,"props":1289,"children":1290},{"class":158,"line":887},[1291],{"type":38,"tag":156,"props":1292,"children":1294},{"emptyLinePlaceholder":1293},true,[1295],{"type":43,"value":1296},"\n",{"type":38,"tag":156,"props":1298,"children":1299},{"class":158,"line":931},[1300],{"type":38,"tag":156,"props":1301,"children":1302},{"style":693},[1303],{"type":43,"value":1304},"# All-sites catalog probe:\n",{"type":38,"tag":156,"props":1306,"children":1307},{"class":158,"line":972},[1308,1312,1316,1320,1324,1328,1332,1336],{"type":38,"tag":156,"props":1309,"children":1310},{"style":702},[1311],{"type":43,"value":705},{"type":38,"tag":156,"props":1313,"children":1314},{"style":199},[1315],{"type":43,"value":1171},{"type":38,"tag":156,"props":1317,"children":1318},{"style":199},[1319],{"type":43,"value":1176},{"type":38,"tag":156,"props":1321,"children":1322},{"style":168},[1323],{"type":43,"value":720},{"type":38,"tag":156,"props":1325,"children":1326},{"style":168},[1327],{"type":43,"value":725},{"type":38,"tag":156,"props":1329,"children":1330},{"style":728},[1331],{"type":43,"value":372},{"type":38,"tag":156,"props":1333,"children":1334},{"style":199},[1335],{"type":43,"value":735},{"type":38,"tag":156,"props":1337,"children":1338},{"style":168},[1339],{"type":43,"value":315},{"type":38,"tag":156,"props":1341,"children":1342},{"class":158,"line":981},[1343,1347,1351],{"type":38,"tag":156,"props":1344,"children":1345},{"style":199},[1346],{"type":43,"value":1204},{"type":38,"tag":156,"props":1348,"children":1349},{"style":162},[1350],{"type":43,"value":141},{"type":38,"tag":156,"props":1352,"children":1353},{"style":199},[1354],{"type":43,"value":1213},{"type":38,"tag":156,"props":1356,"children":1357},{"class":158,"line":1017},[1358],{"type":38,"tag":156,"props":1359,"children":1360},{"style":199},[1361],{"type":43,"value":1221},{"type":38,"tag":156,"props":1363,"children":1364},{"class":158,"line":1045},[1365],{"type":38,"tag":156,"props":1366,"children":1367},{"style":199},[1368],{"type":43,"value":1229},{"type":38,"tag":156,"props":1370,"children":1371},{"class":158,"line":1085},[1372],{"type":38,"tag":156,"props":1373,"children":1374},{"style":199},[1375],{"type":43,"value":1237},{"type":38,"tag":156,"props":1377,"children":1379},{"class":158,"line":1378},18,[1380],{"type":38,"tag":156,"props":1381,"children":1382},{"style":199},[1383],{"type":43,"value":1384},"row = con.execute('SELECT min(day), max(day) FROM dpl_events').fetchone()\n",{"type":38,"tag":156,"props":1386,"children":1388},{"class":158,"line":1387},19,[1389],{"type":38,"tag":156,"props":1390,"children":1391},{"style":199},[1392],{"type":43,"value":1272},{"type":38,"tag":156,"props":1394,"children":1396},{"class":158,"line":1395},20,[1397],{"type":38,"tag":156,"props":1398,"children":1399},{"style":199},[1400],{"type":43,"value":1280},{"type":38,"tag":156,"props":1402,"children":1404},{"class":158,"line":1403},21,[1405],{"type":38,"tag":156,"props":1406,"children":1407},{"style":168},[1408],{"type":43,"value":783},{"type":38,"tag":156,"props":1410,"children":1412},{"class":158,"line":1411},22,[1413],{"type":38,"tag":156,"props":1414,"children":1415},{"emptyLinePlaceholder":1293},[1416],{"type":43,"value":1296},{"type":38,"tag":156,"props":1418,"children":1420},{"class":158,"line":1419},23,[1421,1427,1432,1437,1441,1446,1450,1455,1460,1465,1469,1474,1478,1483,1488,1494,1499],{"type":38,"tag":156,"props":1422,"children":1424},{"style":1423},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1425],{"type":43,"value":1426},"if",{"type":38,"tag":156,"props":1428,"children":1429},{"style":168},[1430],{"type":43,"value":1431}," [",{"type":38,"tag":156,"props":1433,"children":1434},{"style":168},[1435],{"type":43,"value":1436}," -z",{"type":38,"tag":156,"props":1438,"children":1439},{"style":168},[1440],{"type":43,"value":334},{"type":38,"tag":156,"props":1442,"children":1443},{"style":162},[1444],{"type":43,"value":1445},"$earliest",{"type":38,"tag":156,"props":1447,"children":1448},{"style":168},[1449],{"type":43,"value":344},{"type":38,"tag":156,"props":1451,"children":1452},{"style":168},[1453],{"type":43,"value":1454}," ];",{"type":38,"tag":156,"props":1456,"children":1457},{"style":1423},[1458],{"type":43,"value":1459}," then",{"type":38,"tag":156,"props":1461,"children":1462},{"style":702},[1463],{"type":43,"value":1464}," echo",{"type":38,"tag":156,"props":1466,"children":1467},{"style":168},[1468],{"type":43,"value":334},{"type":38,"tag":156,"props":1470,"children":1471},{"style":199},[1472],{"type":43,"value":1473},"ERROR: no data found in catalog for the requested site\u002Fbucket",{"type":38,"tag":156,"props":1475,"children":1476},{"style":168},[1477],{"type":43,"value":344},{"type":38,"tag":156,"props":1479,"children":1480},{"style":168},[1481],{"type":43,"value":1482}," >&2;",{"type":38,"tag":156,"props":1484,"children":1485},{"style":702},[1486],{"type":43,"value":1487}," exit",{"type":38,"tag":156,"props":1489,"children":1491},{"style":1490},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1492],{"type":43,"value":1493}," 1",{"type":38,"tag":156,"props":1495,"children":1496},{"style":168},[1497],{"type":43,"value":1498},";",{"type":38,"tag":156,"props":1500,"children":1501},{"style":1423},[1502],{"type":43,"value":1503}," fi\n",{"type":38,"tag":156,"props":1505,"children":1507},{"class":158,"line":1506},24,[1508],{"type":38,"tag":156,"props":1509,"children":1510},{"emptyLinePlaceholder":1293},[1511],{"type":43,"value":1296},{"type":38,"tag":156,"props":1513,"children":1515},{"class":158,"line":1514},25,[1516],{"type":38,"tag":156,"props":1517,"children":1518},{"style":693},[1519],{"type":43,"value":1520},"# Compute window in Python for cross-platform date arithmetic.\n",{"type":38,"tag":156,"props":1522,"children":1524},{"class":158,"line":1523},26,[1525],{"type":38,"tag":156,"props":1526,"children":1527},{"style":693},[1528],{"type":43,"value":1529},"# Prefer 30\u002F30; fall back to N\u002FN where 2N fits the available span.\n",{"type":38,"tag":156,"props":1531,"children":1533},{"class":158,"line":1532},27,[1534,1538,1543,1548,1553,1558,1563,1568,1572,1576,1580,1584],{"type":38,"tag":156,"props":1535,"children":1536},{"style":702},[1537],{"type":43,"value":705},{"type":38,"tag":156,"props":1539,"children":1540},{"style":199},[1541],{"type":43,"value":1542}," available",{"type":38,"tag":156,"props":1544,"children":1545},{"style":199},[1546],{"type":43,"value":1547}," window",{"type":38,"tag":156,"props":1549,"children":1550},{"style":199},[1551],{"type":43,"value":1552}," current_start",{"type":38,"tag":156,"props":1554,"children":1555},{"style":199},[1556],{"type":43,"value":1557}," current_end",{"type":38,"tag":156,"props":1559,"children":1560},{"style":199},[1561],{"type":43,"value":1562}," prior_start",{"type":38,"tag":156,"props":1564,"children":1565},{"style":199},[1566],{"type":43,"value":1567}," prior_end",{"type":38,"tag":156,"props":1569,"children":1570},{"style":168},[1571],{"type":43,"value":720},{"type":38,"tag":156,"props":1573,"children":1574},{"style":168},[1575],{"type":43,"value":725},{"type":38,"tag":156,"props":1577,"children":1578},{"style":728},[1579],{"type":43,"value":372},{"type":38,"tag":156,"props":1581,"children":1582},{"style":199},[1583],{"type":43,"value":735},{"type":38,"tag":156,"props":1585,"children":1586},{"style":168},[1587],{"type":43,"value":315},{"type":38,"tag":156,"props":1589,"children":1591},{"class":158,"line":1590},28,[1592],{"type":38,"tag":156,"props":1593,"children":1594},{"style":199},[1595],{"type":43,"value":747},{"type":38,"tag":156,"props":1597,"children":1599},{"class":158,"line":1598},29,[1600],{"type":38,"tag":156,"props":1601,"children":1602},{"style":199},[1603],{"type":43,"value":1604},"import sys\n",{"type":38,"tag":156,"props":1606,"children":1608},{"class":158,"line":1607},30,[1609,1614,1618],{"type":38,"tag":156,"props":1610,"children":1611},{"style":199},[1612],{"type":43,"value":1613},"earliest = date.fromisoformat('",{"type":38,"tag":156,"props":1615,"children":1616},{"style":162},[1617],{"type":43,"value":1445},{"type":38,"tag":156,"props":1619,"children":1620},{"style":199},[1621],{"type":43,"value":1622},"')\n",{"type":38,"tag":156,"props":1624,"children":1626},{"class":158,"line":1625},31,[1627,1632,1637],{"type":38,"tag":156,"props":1628,"children":1629},{"style":199},[1630],{"type":43,"value":1631},"latest = date.fromisoformat('",{"type":38,"tag":156,"props":1633,"children":1634},{"style":162},[1635],{"type":43,"value":1636},"$latest",{"type":38,"tag":156,"props":1638,"children":1639},{"style":199},[1640],{"type":43,"value":1622},{"type":38,"tag":156,"props":1642,"children":1644},{"class":158,"line":1643},32,[1645],{"type":38,"tag":156,"props":1646,"children":1647},{"style":199},[1648],{"type":43,"value":1649},"available = (latest - earliest).days + 1\n",{"type":38,"tag":156,"props":1651,"children":1653},{"class":158,"line":1652},33,[1654],{"type":38,"tag":156,"props":1655,"children":1656},{"style":199},[1657],{"type":43,"value":1658},"window = 30 if available >= 60 else available \u002F\u002F 2\n",{"type":38,"tag":156,"props":1660,"children":1662},{"class":158,"line":1661},34,[1663],{"type":38,"tag":156,"props":1664,"children":1665},{"style":199},[1666],{"type":43,"value":1667},"if window \u003C 1:\n",{"type":38,"tag":156,"props":1669,"children":1671},{"class":158,"line":1670},35,[1672],{"type":38,"tag":156,"props":1673,"children":1674},{"style":199},[1675],{"type":43,"value":1676},"    sys.stderr.write(f'ERROR: not enough catalog coverage (only {available} day(s))\\n')\n",{"type":38,"tag":156,"props":1678,"children":1680},{"class":158,"line":1679},36,[1681],{"type":38,"tag":156,"props":1682,"children":1683},{"style":199},[1684],{"type":43,"value":1685},"    sys.exit(1)\n",{"type":38,"tag":156,"props":1687,"children":1689},{"class":158,"line":1688},37,[1690],{"type":38,"tag":156,"props":1691,"children":1692},{"style":199},[1693],{"type":43,"value":1694},"current_end = latest\n",{"type":38,"tag":156,"props":1696,"children":1698},{"class":158,"line":1697},38,[1699],{"type":38,"tag":156,"props":1700,"children":1701},{"style":199},[1702],{"type":43,"value":1703},"current_start = latest - timedelta(days=window - 1)\n",{"type":38,"tag":156,"props":1705,"children":1707},{"class":158,"line":1706},39,[1708],{"type":38,"tag":156,"props":1709,"children":1710},{"style":199},[1711],{"type":43,"value":1712},"prior_end = latest - timedelta(days=window)\n",{"type":38,"tag":156,"props":1714,"children":1716},{"class":158,"line":1715},40,[1717],{"type":38,"tag":156,"props":1718,"children":1719},{"style":199},[1720],{"type":43,"value":1721},"prior_start = prior_end - timedelta(days=window - 1)\n",{"type":38,"tag":156,"props":1723,"children":1725},{"class":158,"line":1724},41,[1726],{"type":38,"tag":156,"props":1727,"children":1728},{"style":199},[1729],{"type":43,"value":1730},"print(available, window, current_start, current_end, prior_start, prior_end)\n",{"type":38,"tag":156,"props":1732,"children":1734},{"class":158,"line":1733},42,[1735],{"type":38,"tag":156,"props":1736,"children":1737},{"style":168},[1738],{"type":43,"value":783},{"type":38,"tag":156,"props":1740,"children":1742},{"class":158,"line":1741},43,[1743,1747,1751,1755,1759,1764,1768,1772,1776,1780,1784,1788,1792,1797,1801,1805,1809,1813,1817,1821],{"type":38,"tag":156,"props":1744,"children":1745},{"style":1423},[1746],{"type":43,"value":1426},{"type":38,"tag":156,"props":1748,"children":1749},{"style":168},[1750],{"type":43,"value":1431},{"type":38,"tag":156,"props":1752,"children":1753},{"style":168},[1754],{"type":43,"value":1436},{"type":38,"tag":156,"props":1756,"children":1757},{"style":168},[1758],{"type":43,"value":334},{"type":38,"tag":156,"props":1760,"children":1761},{"style":162},[1762],{"type":43,"value":1763},"$window",{"type":38,"tag":156,"props":1765,"children":1766},{"style":168},[1767],{"type":43,"value":344},{"type":38,"tag":156,"props":1769,"children":1770},{"style":168},[1771],{"type":43,"value":349},{"type":38,"tag":156,"props":1773,"children":1774},{"style":168},[1775],{"type":43,"value":354},{"type":38,"tag":156,"props":1777,"children":1778},{"style":168},[1779],{"type":43,"value":1431},{"type":38,"tag":156,"props":1781,"children":1782},{"style":168},[1783],{"type":43,"value":334},{"type":38,"tag":156,"props":1785,"children":1786},{"style":162},[1787],{"type":43,"value":1763},{"type":38,"tag":156,"props":1789,"children":1790},{"style":168},[1791],{"type":43,"value":344},{"type":38,"tag":156,"props":1793,"children":1794},{"style":168},[1795],{"type":43,"value":1796}," -lt",{"type":38,"tag":156,"props":1798,"children":1799},{"style":1490},[1800],{"type":43,"value":1493},{"type":38,"tag":156,"props":1802,"children":1803},{"style":168},[1804],{"type":43,"value":1454},{"type":38,"tag":156,"props":1806,"children":1807},{"style":1423},[1808],{"type":43,"value":1459},{"type":38,"tag":156,"props":1810,"children":1811},{"style":702},[1812],{"type":43,"value":1487},{"type":38,"tag":156,"props":1814,"children":1815},{"style":1490},[1816],{"type":43,"value":1493},{"type":38,"tag":156,"props":1818,"children":1819},{"style":168},[1820],{"type":43,"value":1498},{"type":38,"tag":156,"props":1822,"children":1823},{"style":1423},[1824],{"type":43,"value":1503},{"type":38,"tag":156,"props":1826,"children":1828},{"class":158,"line":1827},44,[1829,1834,1838,1843,1848,1853,1857,1862,1867,1872,1877,1882,1887,1891,1896],{"type":38,"tag":156,"props":1830,"children":1831},{"style":702},[1832],{"type":43,"value":1833},"echo",{"type":38,"tag":156,"props":1835,"children":1836},{"style":168},[1837],{"type":43,"value":334},{"type":38,"tag":156,"props":1839,"children":1840},{"style":199},[1841],{"type":43,"value":1842},"available=",{"type":38,"tag":156,"props":1844,"children":1845},{"style":162},[1846],{"type":43,"value":1847},"$available",{"type":38,"tag":156,"props":1849,"children":1850},{"style":199},[1851],{"type":43,"value":1852}," days  window=",{"type":38,"tag":156,"props":1854,"children":1855},{"style":162},[1856],{"type":43,"value":1763},{"type":38,"tag":156,"props":1858,"children":1859},{"style":199},[1860],{"type":43,"value":1861},"  current=",{"type":38,"tag":156,"props":1863,"children":1864},{"style":162},[1865],{"type":43,"value":1866},"$current_start",{"type":38,"tag":156,"props":1868,"children":1869},{"style":199},[1870],{"type":43,"value":1871},"..",{"type":38,"tag":156,"props":1873,"children":1874},{"style":162},[1875],{"type":43,"value":1876},"$current_end",{"type":38,"tag":156,"props":1878,"children":1879},{"style":199},[1880],{"type":43,"value":1881},"  prior=",{"type":38,"tag":156,"props":1883,"children":1884},{"style":162},[1885],{"type":43,"value":1886},"$prior_start",{"type":38,"tag":156,"props":1888,"children":1889},{"style":199},[1890],{"type":43,"value":1871},{"type":38,"tag":156,"props":1892,"children":1893},{"style":162},[1894],{"type":43,"value":1895},"$prior_end",{"type":38,"tag":156,"props":1897,"children":1898},{"style":168},[1899],{"type":43,"value":315},{"type":38,"tag":378,"props":1901,"children":1902},{},[],{"type":43,"value":1904},"If ",{"type":38,"tag":59,"props":1906,"children":1908},{"className":1907},[],[1909],{"type":43,"value":1910},"window \u003C 30",{"type":43,"value":1912}," after the pull attempt, build a one-line coverage caveat string and pass it as ",{"type":38,"tag":59,"props":1914,"children":1916},{"className":1915},[],[1917],{"type":43,"value":1918},"--data-coverage-note",{"type":43,"value":1920}," in the next step. It renders into the report markdown and HTML so it travels with shared reports. Don't add chat-only narration on top. Example:",{"type":38,"tag":145,"props":1922,"children":1924},{"className":147,"code":1923,"language":149,"meta":150,"style":150},"note=\"\"\nif [ \"$window\" -lt 30 ]; then\n  note=\"Only $available days of data were available, so windows are ${window}\u002F${window} days instead of the usual 30\u002F30. Trends from shorter windows are noisier.\"\nfi\n",[1925],{"type":38,"tag":59,"props":1926,"children":1927},{"__ignoreMap":150},[1928,1945,1986,2055],{"type":38,"tag":156,"props":1929,"children":1930},{"class":158,"line":22},[1931,1936,1940],{"type":38,"tag":156,"props":1932,"children":1933},{"style":162},[1934],{"type":43,"value":1935},"note",{"type":38,"tag":156,"props":1937,"children":1938},{"style":168},[1939],{"type":43,"value":171},{"type":38,"tag":156,"props":1941,"children":1942},{"style":168},[1943],{"type":43,"value":1944},"\"\"\n",{"type":38,"tag":156,"props":1946,"children":1947},{"class":158,"line":220},[1948,1952,1956,1960,1964,1968,1972,1977,1981],{"type":38,"tag":156,"props":1949,"children":1950},{"style":1423},[1951],{"type":43,"value":1426},{"type":38,"tag":156,"props":1953,"children":1954},{"style":168},[1955],{"type":43,"value":1431},{"type":38,"tag":156,"props":1957,"children":1958},{"style":168},[1959],{"type":43,"value":334},{"type":38,"tag":156,"props":1961,"children":1962},{"style":162},[1963],{"type":43,"value":1763},{"type":38,"tag":156,"props":1965,"children":1966},{"style":168},[1967],{"type":43,"value":344},{"type":38,"tag":156,"props":1969,"children":1970},{"style":168},[1971],{"type":43,"value":1796},{"type":38,"tag":156,"props":1973,"children":1974},{"style":1490},[1975],{"type":43,"value":1976}," 30",{"type":38,"tag":156,"props":1978,"children":1979},{"style":168},[1980],{"type":43,"value":1454},{"type":38,"tag":156,"props":1982,"children":1983},{"style":1423},[1984],{"type":43,"value":1985}," then\n",{"type":38,"tag":156,"props":1987,"children":1988},{"class":158,"line":318},[1989,1994,1998,2002,2007,2011,2016,2021,2026,2030,2034,2038,2042,2046,2051],{"type":38,"tag":156,"props":1990,"children":1991},{"style":162},[1992],{"type":43,"value":1993},"  note",{"type":38,"tag":156,"props":1995,"children":1996},{"style":168},[1997],{"type":43,"value":171},{"type":38,"tag":156,"props":1999,"children":2000},{"style":168},[2001],{"type":43,"value":344},{"type":38,"tag":156,"props":2003,"children":2004},{"style":199},[2005],{"type":43,"value":2006},"Only ",{"type":38,"tag":156,"props":2008,"children":2009},{"style":162},[2010],{"type":43,"value":1847},{"type":38,"tag":156,"props":2012,"children":2013},{"style":199},[2014],{"type":43,"value":2015}," days of data were available, so windows are ",{"type":38,"tag":156,"props":2017,"children":2018},{"style":168},[2019],{"type":43,"value":2020},"${",{"type":38,"tag":156,"props":2022,"children":2023},{"style":162},[2024],{"type":43,"value":2025},"window",{"type":38,"tag":156,"props":2027,"children":2028},{"style":168},[2029],{"type":43,"value":305},{"type":38,"tag":156,"props":2031,"children":2032},{"style":199},[2033],{"type":43,"value":262},{"type":38,"tag":156,"props":2035,"children":2036},{"style":168},[2037],{"type":43,"value":2020},{"type":38,"tag":156,"props":2039,"children":2040},{"style":162},[2041],{"type":43,"value":2025},{"type":38,"tag":156,"props":2043,"children":2044},{"style":168},[2045],{"type":43,"value":305},{"type":38,"tag":156,"props":2047,"children":2048},{"style":199},[2049],{"type":43,"value":2050}," days instead of the usual 30\u002F30. Trends from shorter windows are noisier.",{"type":38,"tag":156,"props":2052,"children":2053},{"style":168},[2054],{"type":43,"value":315},{"type":38,"tag":156,"props":2056,"children":2057},{"class":158,"line":750},[2058],{"type":38,"tag":156,"props":2059,"children":2060},{"style":1423},[2061],{"type":43,"value":2062},"fi\n",{"type":38,"tag":126,"props":2064,"children":2065},{},[2066,2071,2073,2078,2080,2086,2088,2094,2096,2101,2103,2108,2110,2116,2118,2363,2366,2368,2373,2375,2378,2380,2385,2387,2392,2394,2399],{"type":38,"tag":51,"props":2067,"children":2068},{},[2069],{"type":43,"value":2070},"Auto-detect employee traffic on first populated cache (silent).",{"type":43,"value":2072}," If ",{"type":38,"tag":59,"props":2074,"children":2076},{"className":2075},[],[2077],{"type":43,"value":525},{"type":43,"value":2079}," is absent from ",{"type":38,"tag":59,"props":2081,"children":2083},{"className":2082},[],[2084],{"type":43,"value":2085},"bucket.json",{"type":43,"value":2087},", run the detection script in quiet mode now that the pull has had a chance to populate the lake. The script writes ",{"type":38,"tag":59,"props":2089,"children":2091},{"className":2090},[],[2092],{"type":43,"value":2093},"employee_filter_checked: true",{"type":43,"value":2095}," after scanning so this only runs once, and writes ",{"type":38,"tag":59,"props":2097,"children":2099},{"className":2098},[],[2100],{"type":43,"value":498},{"type":43,"value":2102}," only if it finds an unambiguous match. On match, the report's own one-line note (rendered by ",{"type":38,"tag":59,"props":2104,"children":2106},{"className":2105},[],[2107],{"type":43,"value":514},{"type":43,"value":2109}," when ",{"type":38,"tag":59,"props":2111,"children":2113},{"className":2112},[],[2114],{"type":43,"value":2115},"--employee-filter-*",{"type":43,"value":2117}," is passed) is what surfaces the result – this step adds no chat output of its own.",{"type":38,"tag":145,"props":2119,"children":2121},{"className":147,"code":2120,"language":149,"meta":150,"style":150},"if ! python3 -c \"import json,sys; sys.exit(0 if json.load(open('${XDG_CONFIG_HOME:-$HOME\u002F.config}\u002Fagentic-analytics\u002Fbucket.json')).get('employee_filter_checked') else 1)\" 2>\u002Fdev\u002Fnull; then\n  \"$plugin_python\" \"$plugin_root\u002Fskills\u002Fidentify-employees\u002Fscripts\u002Fdetect_employee_filter.py\" \\\n    --bucket-config \"${XDG_CONFIG_HOME:-$HOME\u002F.config}\u002Fagentic-analytics\u002Fbucket.json\" \\\n    [--site \u003Csite-id>] \\\n    --quiet || true\nfi\n",[2122],{"type":38,"tag":59,"props":2123,"children":2124},{"__ignoreMap":150},[2125,2217,2254,2308,2340,2356],{"type":38,"tag":156,"props":2126,"children":2127},{"class":158,"line":22},[2128,2132,2137,2142,2147,2151,2156,2160,2165,2169,2173,2177,2181,2186,2190,2195,2199,2204,2209,2213],{"type":38,"tag":156,"props":2129,"children":2130},{"style":1423},[2131],{"type":43,"value":1426},{"type":38,"tag":156,"props":2133,"children":2134},{"style":168},[2135],{"type":43,"value":2136}," !",{"type":38,"tag":156,"props":2138,"children":2139},{"style":728},[2140],{"type":43,"value":2141}," python3",{"type":38,"tag":156,"props":2143,"children":2144},{"style":199},[2145],{"type":43,"value":2146}," -c",{"type":38,"tag":156,"props":2148,"children":2149},{"style":168},[2150],{"type":43,"value":334},{"type":38,"tag":156,"props":2152,"children":2153},{"style":199},[2154],{"type":43,"value":2155},"import json,sys; sys.exit(0 if json.load(open('",{"type":38,"tag":156,"props":2157,"children":2158},{"style":168},[2159],{"type":43,"value":2020},{"type":38,"tag":156,"props":2161,"children":2162},{"style":162},[2163],{"type":43,"value":2164},"XDG_CONFIG_HOME",{"type":38,"tag":156,"props":2166,"children":2167},{"style":168},[2168],{"type":43,"value":196},{"type":38,"tag":156,"props":2170,"children":2171},{"style":162},[2172],{"type":43,"value":257},{"type":38,"tag":156,"props":2174,"children":2175},{"style":168},[2176],{"type":43,"value":262},{"type":38,"tag":156,"props":2178,"children":2179},{"style":199},[2180],{"type":43,"value":267},{"type":38,"tag":156,"props":2182,"children":2183},{"style":162},[2184],{"type":43,"value":2185},"config",{"type":38,"tag":156,"props":2187,"children":2188},{"style":168},[2189],{"type":43,"value":305},{"type":38,"tag":156,"props":2191,"children":2192},{"style":199},[2193],{"type":43,"value":2194},"\u002Fagentic-analytics\u002Fbucket.json')).get('employee_filter_checked') else 1)",{"type":38,"tag":156,"props":2196,"children":2197},{"style":168},[2198],{"type":43,"value":344},{"type":38,"tag":156,"props":2200,"children":2201},{"style":168},[2202],{"type":43,"value":2203}," 2>",{"type":38,"tag":156,"props":2205,"children":2206},{"style":199},[2207],{"type":43,"value":2208},"\u002Fdev\u002Fnull",{"type":38,"tag":156,"props":2210,"children":2211},{"style":168},[2212],{"type":43,"value":1498},{"type":38,"tag":156,"props":2214,"children":2215},{"style":1423},[2216],{"type":43,"value":1985},{"type":38,"tag":156,"props":2218,"children":2219},{"class":158,"line":220},[2220,2225,2229,2233,2237,2241,2246,2250],{"type":38,"tag":156,"props":2221,"children":2222},{"style":728},[2223],{"type":43,"value":2224},"  \"",{"type":38,"tag":156,"props":2226,"children":2227},{"style":162},[2228],{"type":43,"value":339},{"type":38,"tag":156,"props":2230,"children":2231},{"style":728},[2232],{"type":43,"value":344},{"type":38,"tag":156,"props":2234,"children":2235},{"style":168},[2236],{"type":43,"value":334},{"type":38,"tag":156,"props":2238,"children":2239},{"style":162},[2240],{"type":43,"value":141},{"type":38,"tag":156,"props":2242,"children":2243},{"style":199},[2244],{"type":43,"value":2245},"\u002Fskills\u002Fidentify-employees\u002Fscripts\u002Fdetect_employee_filter.py",{"type":38,"tag":156,"props":2247,"children":2248},{"style":168},[2249],{"type":43,"value":344},{"type":38,"tag":156,"props":2251,"children":2252},{"style":162},[2253],{"type":43,"value":830},{"type":38,"tag":156,"props":2255,"children":2256},{"class":158,"line":318},[2257,2262,2267,2271,2275,2279,2283,2287,2291,2295,2300,2304],{"type":38,"tag":156,"props":2258,"children":2259},{"style":199},[2260],{"type":43,"value":2261},"    --bucket-config",{"type":38,"tag":156,"props":2263,"children":2264},{"style":168},[2265],{"type":43,"value":2266}," \"${",{"type":38,"tag":156,"props":2268,"children":2269},{"style":162},[2270],{"type":43,"value":2164},{"type":38,"tag":156,"props":2272,"children":2273},{"style":168},[2274],{"type":43,"value":196},{"type":38,"tag":156,"props":2276,"children":2277},{"style":162},[2278],{"type":43,"value":257},{"type":38,"tag":156,"props":2280,"children":2281},{"style":168},[2282],{"type":43,"value":262},{"type":38,"tag":156,"props":2284,"children":2285},{"style":199},[2286],{"type":43,"value":267},{"type":38,"tag":156,"props":2288,"children":2289},{"style":162},[2290],{"type":43,"value":2185},{"type":38,"tag":156,"props":2292,"children":2293},{"style":168},[2294],{"type":43,"value":305},{"type":38,"tag":156,"props":2296,"children":2297},{"style":199},[2298],{"type":43,"value":2299},"\u002Fagentic-analytics\u002Fbucket.json",{"type":38,"tag":156,"props":2301,"children":2302},{"style":168},[2303],{"type":43,"value":344},{"type":38,"tag":156,"props":2305,"children":2306},{"style":162},[2307],{"type":43,"value":830},{"type":38,"tag":156,"props":2309,"children":2310},{"class":158,"line":750},[2311,2316,2320,2324,2328,2332,2336],{"type":38,"tag":156,"props":2312,"children":2313},{"style":162},[2314],{"type":43,"value":2315},"    [--site ",{"type":38,"tag":156,"props":2317,"children":2318},{"style":168},[2319],{"type":43,"value":202},{"type":38,"tag":156,"props":2321,"children":2322},{"style":199},[2323],{"type":43,"value":871},{"type":38,"tag":156,"props":2325,"children":2326},{"style":162},[2327],{"type":43,"value":876},{"type":38,"tag":156,"props":2329,"children":2330},{"style":168},[2331],{"type":43,"value":212},{"type":38,"tag":156,"props":2333,"children":2334},{"style":199},[2335],{"type":43,"value":960},{"type":38,"tag":156,"props":2337,"children":2338},{"style":162},[2339],{"type":43,"value":830},{"type":38,"tag":156,"props":2341,"children":2342},{"class":158,"line":759},[2343,2348,2352],{"type":38,"tag":156,"props":2344,"children":2345},{"style":199},[2346],{"type":43,"value":2347},"    --quiet",{"type":38,"tag":156,"props":2349,"children":2350},{"style":168},[2351],{"type":43,"value":354},{"type":38,"tag":156,"props":2353,"children":2354},{"style":702},[2355],{"type":43,"value":969},{"type":38,"tag":156,"props":2357,"children":2358},{"class":158,"line":768},[2359],{"type":38,"tag":156,"props":2360,"children":2361},{"style":1423},[2362],{"type":43,"value":2062},{"type":38,"tag":378,"props":2364,"children":2365},{},[],{"type":43,"value":2367},"Pass ",{"type":38,"tag":59,"props":2369,"children":2371},{"className":2370},[],[2372],{"type":43,"value":670},{"type":43,"value":2374}," only when the site ID filter is non-empty (single-site mode); omit it in all-sites mode.",{"type":38,"tag":378,"props":2376,"children":2377},{},[],{"type":43,"value":2379},"The ",{"type":38,"tag":59,"props":2381,"children":2383},{"className":2382},[],[2384],{"type":43,"value":1129},{"type":43,"value":2386}," is intentional: detection failures (empty lake, transient I\u002FO) should never block the report. Re-read ",{"type":38,"tag":59,"props":2388,"children":2390},{"className":2389},[],[2391],{"type":43,"value":2085},{"type":43,"value":2393}," after this step so any newly-written ",{"type":38,"tag":59,"props":2395,"children":2397},{"className":2396},[],[2398],{"type":43,"value":498},{"type":43,"value":2400}," is available for step 4.",{"type":38,"tag":126,"props":2402,"children":2403},{},[2404,2409,2411,2416,2418,2424,2426,2931,2934,2940,2942,2948,2950,2955,2957,2960,2966,2968,2974,2975,2978,2984,2985,2991,2993,2999,3001,3004,3010,3012,3015,3021,3022,3028,3030,3036,3038,3044,3046,3052,3054,3060,3062,3068,3070,3075,3077,3083,3085,3091,3093,3099,3101,3104,3105,3110,3112,3117,3119,3124,3126,3131,3132,3137,3139,3144,3146,3152,3153,3158,3159,3164],{"type":38,"tag":51,"props":2405,"children":2406},{},[2407],{"type":43,"value":2408},"Run the report.",{"type":43,"value":2410}," Slug the output filename from ",{"type":38,"tag":59,"props":2412,"children":2414},{"className":2413},[],[2415],{"type":43,"value":479},{"type":43,"value":2417}," plus the site ID filter (or ",{"type":38,"tag":59,"props":2419,"children":2421},{"className":2420},[],[2422],{"type":43,"value":2423},"all",{"type":43,"value":2425}," when none):",{"type":38,"tag":145,"props":2427,"children":2429},{"className":147,"code":2428,"language":149,"meta":150,"style":150},"slug=\"\u003Ccache_dir>$([ -n \"\u003Csite-id>\" ] && echo \"-\u003Csite-id>\" || echo \"-all\")\"\n\"$plugin_python\" \"$plugin_root\u002Fskills\u002Fstaircase-report\u002Fscripts\u002Fstaircase.py\" \\\n  [--site-id \u003Csite-id>] \\\n  --current \u003Ccurrent_start> \u003Ccurrent_end> \\\n  --prior \u003Cprior_start> \u003Cprior_end> \\\n  [--internal-domains \u003Ccorp-domain>] \\\n  [--network-label \"\u003Cnetwork-label>\" --network-sources \"\u003Cnetwork-sources>\"] \\\n  [--data-coverage-note \"$note\"] \\\n  [--employee-filter-key \u003Ckey> --employee-filter-value \u003Cjson-value>] \\\n  [--join-id-key \u003Ckey>] \\\n  --output-md \u002Ftmp\u002Fstaircase-$slug.md \\\n  --output-html \u002Ftmp\u002Fstaircase-$slug.html\n",[2430],{"type":38,"tag":59,"props":2431,"children":2432},{"__ignoreMap":150},[2433,2525,2561,2593,2639,2685,2719,2766,2795,2851,2883,2910],{"type":38,"tag":156,"props":2434,"children":2435},{"class":158,"line":22},[2436,2441,2445,2449,2454,2459,2464,2468,2473,2477,2481,2486,2490,2494,2499,2503,2507,2511,2515,2520],{"type":38,"tag":156,"props":2437,"children":2438},{"style":162},[2439],{"type":43,"value":2440},"slug",{"type":38,"tag":156,"props":2442,"children":2443},{"style":168},[2444],{"type":43,"value":171},{"type":38,"tag":156,"props":2446,"children":2447},{"style":168},[2448],{"type":43,"value":344},{"type":38,"tag":156,"props":2450,"children":2451},{"style":199},[2452],{"type":43,"value":2453},"\u003Ccache_dir>",{"type":38,"tag":156,"props":2455,"children":2456},{"style":168},[2457],{"type":43,"value":2458},"$([",{"type":38,"tag":156,"props":2460,"children":2461},{"style":168},[2462],{"type":43,"value":2463}," -n",{"type":38,"tag":156,"props":2465,"children":2466},{"style":168},[2467],{"type":43,"value":334},{"type":38,"tag":156,"props":2469,"children":2470},{"style":199},[2471],{"type":43,"value":2472},"\u003Csite-id>",{"type":38,"tag":156,"props":2474,"children":2475},{"style":168},[2476],{"type":43,"value":344},{"type":38,"tag":156,"props":2478,"children":2479},{"style":168},[2480],{"type":43,"value":349},{"type":38,"tag":156,"props":2482,"children":2483},{"style":168},[2484],{"type":43,"value":2485}," &&",{"type":38,"tag":156,"props":2487,"children":2488},{"style":702},[2489],{"type":43,"value":1464},{"type":38,"tag":156,"props":2491,"children":2492},{"style":168},[2493],{"type":43,"value":334},{"type":38,"tag":156,"props":2495,"children":2496},{"style":199},[2497],{"type":43,"value":2498},"-\u003Csite-id>",{"type":38,"tag":156,"props":2500,"children":2501},{"style":168},[2502],{"type":43,"value":344},{"type":38,"tag":156,"props":2504,"children":2505},{"style":168},[2506],{"type":43,"value":354},{"type":38,"tag":156,"props":2508,"children":2509},{"style":702},[2510],{"type":43,"value":1464},{"type":38,"tag":156,"props":2512,"children":2513},{"style":168},[2514],{"type":43,"value":334},{"type":38,"tag":156,"props":2516,"children":2517},{"style":199},[2518],{"type":43,"value":2519},"-all",{"type":38,"tag":156,"props":2521,"children":2522},{"style":168},[2523],{"type":43,"value":2524},"\")\"\n",{"type":38,"tag":156,"props":2526,"children":2527},{"class":158,"line":220},[2528,2532,2536,2540,2544,2548,2553,2557],{"type":38,"tag":156,"props":2529,"children":2530},{"style":728},[2531],{"type":43,"value":344},{"type":38,"tag":156,"props":2533,"children":2534},{"style":162},[2535],{"type":43,"value":339},{"type":38,"tag":156,"props":2537,"children":2538},{"style":728},[2539],{"type":43,"value":344},{"type":38,"tag":156,"props":2541,"children":2542},{"style":168},[2543],{"type":43,"value":334},{"type":38,"tag":156,"props":2545,"children":2546},{"style":162},[2547],{"type":43,"value":141},{"type":38,"tag":156,"props":2549,"children":2550},{"style":199},[2551],{"type":43,"value":2552},"\u002Fskills\u002Fstaircase-report\u002Fscripts\u002Fstaircase.py",{"type":38,"tag":156,"props":2554,"children":2555},{"style":168},[2556],{"type":43,"value":344},{"type":38,"tag":156,"props":2558,"children":2559},{"style":162},[2560],{"type":43,"value":830},{"type":38,"tag":156,"props":2562,"children":2563},{"class":158,"line":318},[2564,2569,2573,2577,2581,2585,2589],{"type":38,"tag":156,"props":2565,"children":2566},{"style":162},[2567],{"type":43,"value":2568},"  [--site-id ",{"type":38,"tag":156,"props":2570,"children":2571},{"style":168},[2572],{"type":43,"value":202},{"type":38,"tag":156,"props":2574,"children":2575},{"style":199},[2576],{"type":43,"value":871},{"type":38,"tag":156,"props":2578,"children":2579},{"style":162},[2580],{"type":43,"value":876},{"type":38,"tag":156,"props":2582,"children":2583},{"style":168},[2584],{"type":43,"value":212},{"type":38,"tag":156,"props":2586,"children":2587},{"style":199},[2588],{"type":43,"value":960},{"type":38,"tag":156,"props":2590,"children":2591},{"style":162},[2592],{"type":43,"value":830},{"type":38,"tag":156,"props":2594,"children":2595},{"class":158,"line":750},[2596,2601,2605,2610,2614,2618,2622,2627,2631,2635],{"type":38,"tag":156,"props":2597,"children":2598},{"style":199},[2599],{"type":43,"value":2600},"  --current",{"type":38,"tag":156,"props":2602,"children":2603},{"style":168},[2604],{"type":43,"value":720},{"type":38,"tag":156,"props":2606,"children":2607},{"style":199},[2608],{"type":43,"value":2609},"current_star",{"type":38,"tag":156,"props":2611,"children":2612},{"style":162},[2613],{"type":43,"value":853},{"type":38,"tag":156,"props":2615,"children":2616},{"style":168},[2617],{"type":43,"value":212},{"type":38,"tag":156,"props":2619,"children":2620},{"style":168},[2621],{"type":43,"value":720},{"type":38,"tag":156,"props":2623,"children":2624},{"style":199},[2625],{"type":43,"value":2626},"current_en",{"type":38,"tag":156,"props":2628,"children":2629},{"style":162},[2630],{"type":43,"value":876},{"type":38,"tag":156,"props":2632,"children":2633},{"style":168},[2634],{"type":43,"value":212},{"type":38,"tag":156,"props":2636,"children":2637},{"style":162},[2638],{"type":43,"value":830},{"type":38,"tag":156,"props":2640,"children":2641},{"class":158,"line":759},[2642,2647,2651,2656,2660,2664,2668,2673,2677,2681],{"type":38,"tag":156,"props":2643,"children":2644},{"style":199},[2645],{"type":43,"value":2646},"  --prior",{"type":38,"tag":156,"props":2648,"children":2649},{"style":168},[2650],{"type":43,"value":720},{"type":38,"tag":156,"props":2652,"children":2653},{"style":199},[2654],{"type":43,"value":2655},"prior_star",{"type":38,"tag":156,"props":2657,"children":2658},{"style":162},[2659],{"type":43,"value":853},{"type":38,"tag":156,"props":2661,"children":2662},{"style":168},[2663],{"type":43,"value":212},{"type":38,"tag":156,"props":2665,"children":2666},{"style":168},[2667],{"type":43,"value":720},{"type":38,"tag":156,"props":2669,"children":2670},{"style":199},[2671],{"type":43,"value":2672},"prior_en",{"type":38,"tag":156,"props":2674,"children":2675},{"style":162},[2676],{"type":43,"value":876},{"type":38,"tag":156,"props":2678,"children":2679},{"style":168},[2680],{"type":43,"value":212},{"type":38,"tag":156,"props":2682,"children":2683},{"style":162},[2684],{"type":43,"value":830},{"type":38,"tag":156,"props":2686,"children":2687},{"class":158,"line":768},[2688,2693,2697,2702,2707,2711,2715],{"type":38,"tag":156,"props":2689,"children":2690},{"style":162},[2691],{"type":43,"value":2692},"  [--internal-domains ",{"type":38,"tag":156,"props":2694,"children":2695},{"style":168},[2696],{"type":43,"value":202},{"type":38,"tag":156,"props":2698,"children":2699},{"style":199},[2700],{"type":43,"value":2701},"corp-domai",{"type":38,"tag":156,"props":2703,"children":2704},{"style":162},[2705],{"type":43,"value":2706},"n",{"type":38,"tag":156,"props":2708,"children":2709},{"style":168},[2710],{"type":43,"value":212},{"type":38,"tag":156,"props":2712,"children":2713},{"style":199},[2714],{"type":43,"value":960},{"type":38,"tag":156,"props":2716,"children":2717},{"style":162},[2718],{"type":43,"value":830},{"type":38,"tag":156,"props":2720,"children":2721},{"class":158,"line":777},[2722,2727,2731,2736,2740,2745,2749,2754,2758,2762],{"type":38,"tag":156,"props":2723,"children":2724},{"style":162},[2725],{"type":43,"value":2726},"  [--network-label ",{"type":38,"tag":156,"props":2728,"children":2729},{"style":168},[2730],{"type":43,"value":344},{"type":38,"tag":156,"props":2732,"children":2733},{"style":199},[2734],{"type":43,"value":2735},"\u003Cnetwork-label>",{"type":38,"tag":156,"props":2737,"children":2738},{"style":168},[2739],{"type":43,"value":344},{"type":38,"tag":156,"props":2741,"children":2742},{"style":199},[2743],{"type":43,"value":2744}," --network-sources",{"type":38,"tag":156,"props":2746,"children":2747},{"style":168},[2748],{"type":43,"value":334},{"type":38,"tag":156,"props":2750,"children":2751},{"style":199},[2752],{"type":43,"value":2753},"\u003Cnetwork-sources>",{"type":38,"tag":156,"props":2755,"children":2756},{"style":168},[2757],{"type":43,"value":344},{"type":38,"tag":156,"props":2759,"children":2760},{"style":199},[2761],{"type":43,"value":960},{"type":38,"tag":156,"props":2763,"children":2764},{"style":162},[2765],{"type":43,"value":830},{"type":38,"tag":156,"props":2767,"children":2768},{"class":158,"line":786},[2769,2774,2778,2783,2787,2791],{"type":38,"tag":156,"props":2770,"children":2771},{"style":162},[2772],{"type":43,"value":2773},"  [--data-coverage-note ",{"type":38,"tag":156,"props":2775,"children":2776},{"style":168},[2777],{"type":43,"value":344},{"type":38,"tag":156,"props":2779,"children":2780},{"style":162},[2781],{"type":43,"value":2782},"$note",{"type":38,"tag":156,"props":2784,"children":2785},{"style":168},[2786],{"type":43,"value":344},{"type":38,"tag":156,"props":2788,"children":2789},{"style":199},[2790],{"type":43,"value":960},{"type":38,"tag":156,"props":2792,"children":2793},{"style":162},[2794],{"type":43,"value":830},{"type":38,"tag":156,"props":2796,"children":2797},{"class":158,"line":795},[2798,2803,2807,2812,2817,2821,2826,2830,2835,2839,2843,2847],{"type":38,"tag":156,"props":2799,"children":2800},{"style":162},[2801],{"type":43,"value":2802},"  [--employee-filter-key ",{"type":38,"tag":156,"props":2804,"children":2805},{"style":168},[2806],{"type":43,"value":202},{"type":38,"tag":156,"props":2808,"children":2809},{"style":199},[2810],{"type":43,"value":2811},"ke",{"type":38,"tag":156,"props":2813,"children":2814},{"style":162},[2815],{"type":43,"value":2816},"y",{"type":38,"tag":156,"props":2818,"children":2819},{"style":168},[2820],{"type":43,"value":212},{"type":38,"tag":156,"props":2822,"children":2823},{"style":199},[2824],{"type":43,"value":2825}," --employee-filter-value",{"type":38,"tag":156,"props":2827,"children":2828},{"style":168},[2829],{"type":43,"value":720},{"type":38,"tag":156,"props":2831,"children":2832},{"style":199},[2833],{"type":43,"value":2834},"json-valu",{"type":38,"tag":156,"props":2836,"children":2837},{"style":162},[2838],{"type":43,"value":951},{"type":38,"tag":156,"props":2840,"children":2841},{"style":168},[2842],{"type":43,"value":212},{"type":38,"tag":156,"props":2844,"children":2845},{"style":199},[2846],{"type":43,"value":960},{"type":38,"tag":156,"props":2848,"children":2849},{"style":162},[2850],{"type":43,"value":830},{"type":38,"tag":156,"props":2852,"children":2853},{"class":158,"line":833},[2854,2859,2863,2867,2871,2875,2879],{"type":38,"tag":156,"props":2855,"children":2856},{"style":162},[2857],{"type":43,"value":2858},"  [--join-id-key ",{"type":38,"tag":156,"props":2860,"children":2861},{"style":168},[2862],{"type":43,"value":202},{"type":38,"tag":156,"props":2864,"children":2865},{"style":199},[2866],{"type":43,"value":2811},{"type":38,"tag":156,"props":2868,"children":2869},{"style":162},[2870],{"type":43,"value":2816},{"type":38,"tag":156,"props":2872,"children":2873},{"style":168},[2874],{"type":43,"value":212},{"type":38,"tag":156,"props":2876,"children":2877},{"style":199},[2878],{"type":43,"value":960},{"type":38,"tag":156,"props":2880,"children":2881},{"style":162},[2882],{"type":43,"value":830},{"type":38,"tag":156,"props":2884,"children":2885},{"class":158,"line":887},[2886,2891,2896,2901,2906],{"type":38,"tag":156,"props":2887,"children":2888},{"style":199},[2889],{"type":43,"value":2890},"  --output-md",{"type":38,"tag":156,"props":2892,"children":2893},{"style":199},[2894],{"type":43,"value":2895}," \u002Ftmp\u002Fstaircase-",{"type":38,"tag":156,"props":2897,"children":2898},{"style":162},[2899],{"type":43,"value":2900},"$slug",{"type":38,"tag":156,"props":2902,"children":2903},{"style":199},[2904],{"type":43,"value":2905},".md",{"type":38,"tag":156,"props":2907,"children":2908},{"style":162},[2909],{"type":43,"value":830},{"type":38,"tag":156,"props":2911,"children":2912},{"class":158,"line":931},[2913,2918,2922,2926],{"type":38,"tag":156,"props":2914,"children":2915},{"style":199},[2916],{"type":43,"value":2917},"  --output-html",{"type":38,"tag":156,"props":2919,"children":2920},{"style":199},[2921],{"type":43,"value":2895},{"type":38,"tag":156,"props":2923,"children":2924},{"style":162},[2925],{"type":43,"value":2900},{"type":38,"tag":156,"props":2927,"children":2928},{"style":199},[2929],{"type":43,"value":2930},".html\n",{"type":38,"tag":378,"props":2932,"children":2933},{},[],{"type":38,"tag":59,"props":2935,"children":2937},{"className":2936},[],[2938],{"type":43,"value":2939},"--events-dir",{"type":43,"value":2941}," and ",{"type":38,"tag":59,"props":2943,"children":2945},{"className":2944},[],[2946],{"type":43,"value":2947},"--cache-root",{"type":43,"value":2949}," are NOT passed; ",{"type":38,"tag":59,"props":2951,"children":2953},{"className":2952},[],[2954],{"type":43,"value":514},{"type":43,"value":2956}," opens the catalog and reads events from the lake internally.",{"type":38,"tag":378,"props":2958,"children":2959},{},[],{"type":38,"tag":59,"props":2961,"children":2963},{"className":2962},[],[2964],{"type":43,"value":2965},"--site-label",{"type":43,"value":2967}," is omitted in the public flow – reports just say \"Relationship Staircase Report\" at the top. Callers that want a labeled header (the dev wrapper) can still pass ",{"type":38,"tag":59,"props":2969,"children":2971},{"className":2970},[],[2972],{"type":43,"value":2973},"--site-label \"\u003Cvalue>\"",{"type":43,"value":267},{"type":38,"tag":378,"props":2976,"children":2977},{},[],{"type":38,"tag":59,"props":2979,"children":2981},{"className":2980},[],[2982],{"type":43,"value":2983},"--network-label",{"type":43,"value":2941},{"type":38,"tag":59,"props":2986,"children":2988},{"className":2987},[],[2989],{"type":43,"value":2990},"--network-sources",{"type":43,"value":2992}," are paired: pass both or neither. They classify cross-promotion traffic from the customer's own properties under a named channel. Source values for the customer come from the wrapper (when invoked via the dev ",{"type":38,"tag":59,"props":2994,"children":2996},{"className":2995},[],[2997],{"type":43,"value":2998},"\u002Fstaircase",{"type":43,"value":3000}," wrapper) or future plugin config; the public init flow doesn't set them.",{"type":38,"tag":378,"props":3002,"children":3003},{},[],{"type":38,"tag":59,"props":3005,"children":3007},{"className":3006},[],[3008],{"type":43,"value":3009},"--internal-domains",{"type":43,"value":3011}," only applies when the wrapper supplies a corp domain or the user has configured one. Plain customer installs typically omit it.",{"type":38,"tag":378,"props":3013,"children":3014},{},[],{"type":38,"tag":59,"props":3016,"children":3018},{"className":3017},[],[3019],{"type":43,"value":3020},"--employee-filter-key",{"type":43,"value":2941},{"type":38,"tag":59,"props":3023,"children":3025},{"className":3024},[],[3026],{"type":43,"value":3027},"--employee-filter-value",{"type":43,"value":3029}," are paired: pass both or neither. Read from ",{"type":38,"tag":59,"props":3031,"children":3033},{"className":3032},[],[3034],{"type":43,"value":3035},"bucket.json[\"employee_filter\"]",{"type":43,"value":3037}," when present (step 1). The key passes through as-is. The value must be JSON-encoded on the command line: a Python boolean becomes ",{"type":38,"tag":59,"props":3039,"children":3041},{"className":3040},[],[3042],{"type":43,"value":3043},"true",{"type":43,"value":3045}," or ",{"type":38,"tag":59,"props":3047,"children":3049},{"className":3048},[],[3050],{"type":43,"value":3051},"false",{"type":43,"value":3053},", a string gets wrapped in quotes (e.g. ",{"type":38,"tag":59,"props":3055,"children":3057},{"className":3056},[],[3058],{"type":43,"value":3059},"'\"yes\"'",{"type":43,"value":3061}," with single-quoted shell escaping), and numbers stay bare (",{"type":38,"tag":59,"props":3063,"children":3065},{"className":3064},[],[3066],{"type":43,"value":3067},"1",{"type":43,"value":3069},"). ",{"type":38,"tag":59,"props":3071,"children":3073},{"className":3072},[],[3074],{"type":43,"value":514},{"type":43,"value":3076}," decodes it with ",{"type":38,"tag":59,"props":3078,"children":3080},{"className":3079},[],[3081],{"type":43,"value":3082},"json.loads",{"type":43,"value":3084}," and compares with ",{"type":38,"tag":59,"props":3086,"children":3088},{"className":3087},[],[3089],{"type":43,"value":3090},"==",{"type":43,"value":3092}," against ",{"type":38,"tag":59,"props":3094,"children":3096},{"className":3095},[],[3097],{"type":43,"value":3098},"extra_data[\u003Ckey>]",{"type":43,"value":3100},". When set, matching events are excluded from the report and a one-line note appears at the top.",{"type":38,"tag":378,"props":3102,"children":3103},{},[],{"type":43,"value":2367},{"type":38,"tag":59,"props":3106,"children":3108},{"className":3107},[],[3109],{"type":43,"value":592},{"type":43,"value":3111}," only when the site ID filter is non-empty. Pass ",{"type":38,"tag":59,"props":3113,"children":3115},{"className":3114},[],[3116],{"type":43,"value":1918},{"type":43,"value":3118}," only when ",{"type":38,"tag":59,"props":3120,"children":3122},{"className":3121},[],[3123],{"type":43,"value":2782},{"type":43,"value":3125}," is non-empty (i.e. windows are short). Pass ",{"type":38,"tag":59,"props":3127,"children":3129},{"className":3128},[],[3130],{"type":43,"value":2115},{"type":43,"value":3118},{"type":38,"tag":59,"props":3133,"children":3135},{"className":3134},[],[3136],{"type":43,"value":498},{"type":43,"value":3138}," is present in ",{"type":38,"tag":59,"props":3140,"children":3142},{"className":3141},[],[3143],{"type":43,"value":2085},{"type":43,"value":3145},". Pass ",{"type":38,"tag":59,"props":3147,"children":3149},{"className":3148},[],[3150],{"type":43,"value":3151},"--join-id-key",{"type":43,"value":3118},{"type":38,"tag":59,"props":3154,"children":3156},{"className":3155},[],[3157],{"type":43,"value":536},{"type":43,"value":3138},{"type":38,"tag":59,"props":3160,"children":3162},{"className":3161},[],[3163],{"type":43,"value":2085},{"type":43,"value":3165}," (this flag is plumbing between the skill and the script; customers don't type it).",{"type":38,"tag":126,"props":3167,"children":3168},{},[3169,3174,3176,3182],{"type":38,"tag":51,"props":3170,"children":3171},{},[3172],{"type":43,"value":3173},"Output the report",{"type":43,"value":3175},": read ",{"type":38,"tag":59,"props":3177,"children":3179},{"className":3178},[],[3180],{"type":43,"value":3181},"\u002Ftmp\u002Fstaircase-$slug.md",{"type":43,"value":3183}," and emit its contents verbatim. Don't add formatting, don't add framing.",{"type":38,"tag":126,"props":3185,"children":3186},{},[3187,3192,3194,3204,3207,3209,3218,3220,3225,3227,3232,3234,3239,3241,3246,3248,3253],{"type":38,"tag":51,"props":3188,"children":3189},{},[3190],{"type":43,"value":3191},"Append the HTML link",{"type":43,"value":3193}," as the last line, with one blank line separating it from the report body:",{"type":38,"tag":145,"props":3195,"children":3199},{"className":3196,"code":3198,"language":43},[3197],"language-text","[Open the HTML version in browser](file:\u002F\u002F\u002Ftmp\u002Fstaircase-$slug.html)\n",[3200],{"type":38,"tag":59,"props":3201,"children":3202},{"__ignoreMap":150},[3203],{"type":43,"value":3198},{"type":38,"tag":378,"props":3205,"children":3206},{},[],{"type":43,"value":3208},"The link target is the ",{"type":38,"tag":51,"props":3210,"children":3211},{},[3212],{"type":38,"tag":59,"props":3213,"children":3215},{"className":3214},[],[3216],{"type":43,"value":3217},".html",{"type":43,"value":3219}," file — same ",{"type":38,"tag":59,"props":3221,"children":3223},{"className":3222},[],[3224],{"type":43,"value":2900},{"type":43,"value":3226}," as step 4, with the ",{"type":38,"tag":59,"props":3228,"children":3230},{"className":3229},[],[3231],{"type":43,"value":3217},{"type":43,"value":3233}," extension. Do ",{"type":38,"tag":51,"props":3235,"children":3236},{},[3237],{"type":43,"value":3238},"not",{"type":43,"value":3240}," link the ",{"type":38,"tag":59,"props":3242,"children":3244},{"className":3243},[],[3245],{"type":43,"value":2905},{"type":43,"value":3247}," file: that's the report body you just emitted verbatim in step 5, not the HTML version. The ",{"type":38,"tag":59,"props":3249,"children":3251},{"className":3250},[],[3252],{"type":43,"value":82},{"type":43,"value":3254}," protocol matters: a bare path can be intercepted by an editor.",{"type":38,"tag":114,"props":3256,"children":3258},{"id":3257},"constraints-re-stated-for-emphasis",[3259],{"type":43,"value":3260},"Constraints (re-stated for emphasis)",{"type":38,"tag":446,"props":3262,"children":3263},{},[3264,3269,3274,3279,3291,3302,3329],{"type":38,"tag":126,"props":3265,"children":3266},{},[3267],{"type":43,"value":3268},"No \"Running staircase for…\" preamble.",{"type":38,"tag":126,"props":3270,"children":3271},{},[3272],{"type":43,"value":3273},"No \"Two things stand out…\" \u002F \"Let me know if…\" postscript.",{"type":38,"tag":126,"props":3275,"children":3276},{},[3277],{"type":43,"value":3278},"No re-narration of the report's findings.",{"type":38,"tag":126,"props":3280,"children":3281},{},[3282,3284,3289],{"type":43,"value":3283},"The pull-then-probe step in §2 handles short caches. Pass the caveat via ",{"type":38,"tag":59,"props":3285,"children":3287},{"className":3286},[],[3288],{"type":43,"value":1918},{"type":43,"value":3290}," so it lands inside the report itself (visible in both the in-chat verbatim render and the shared HTML). Don't add chat-only narration on top of that.",{"type":38,"tag":126,"props":3292,"children":3293},{},[3294,3295,3300],{"type":43,"value":1904},{"type":38,"tag":59,"props":3296,"children":3298},{"className":3297},[],[3299],{"type":43,"value":2085},{"type":43,"value":3301}," is missing, tell the user to run the init flow first; do not try to guess values.",{"type":38,"tag":126,"props":3303,"children":3304},{},[3305,3307,3312,3314,3320,3322,3327],{"type":43,"value":3306},"The trailing link points at the ",{"type":38,"tag":59,"props":3308,"children":3310},{"className":3309},[],[3311],{"type":43,"value":3217},{"type":43,"value":3313}," file from step 4 (",{"type":38,"tag":59,"props":3315,"children":3317},{"className":3316},[],[3318],{"type":43,"value":3319},"--output-html",{"type":43,"value":3321},"), never the ",{"type":38,"tag":59,"props":3323,"children":3325},{"className":3324},[],[3326],{"type":43,"value":2905},{"type":43,"value":3328}," file.",{"type":38,"tag":126,"props":3330,"children":3331},{},[3332],{"type":43,"value":3333},"If the lake has no DPL events for the configured bucket\u002Fsite, surface that as an error (one short line) and stop.",{"type":38,"tag":3335,"props":3336,"children":3337},"style",{},[3338],{"type":43,"value":3339},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3341,"total":3531},[3342,3363,3382,3396,3413,3428,3442,3457,3474,3485,3500,3516],{"slug":3343,"name":3343,"fn":3344,"description":3345,"org":3346,"tags":3347,"stars":3360,"repoUrl":3361,"updatedAt":3362},"annotate","collect visual feedback with browser annotation tools","Open a browser with visual annotation tools. The user clicks elements on their site and leaves feedback — the agent reads annotations and makes changes. Use this when the user wants to point at specific elements to fix, tweak, or redesign.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3348,3351,3354,3357],{"name":3349,"slug":3350,"type":15},"Frontend","frontend",{"name":3352,"slug":3353,"type":15},"Productivity","productivity",{"name":3355,"slug":3356,"type":15},"UX Copy","ux-copy",{"name":3358,"slug":3359,"type":15},"UX Design","ux-design",484,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fstudio","2026-05-06T05:40:01.516544",{"slug":3364,"name":3364,"fn":3365,"description":3366,"org":3367,"tags":3368,"stars":3360,"repoUrl":3361,"updatedAt":3381},"block-content","write editable WordPress block markup","Write editable WordPress block markup for local Studio sites, including core\u002Fhtml limits, block-theme layout rules, full-width sections, validation, and skeleton-first page\u002FCSS recipes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3369,3372,3375,3378],{"name":3370,"slug":3371,"type":15},"Block Editor","block-editor",{"name":3373,"slug":3374,"type":15},"CSS","css",{"name":3376,"slug":3377,"type":15},"HTML","html",{"name":3379,"slug":3380,"type":15},"WordPress","wordpress","2026-05-27T07:01:55.629681",{"slug":3383,"name":3383,"fn":3384,"description":3385,"org":3386,"tags":3387,"stars":3360,"repoUrl":3361,"updatedAt":3395},"hosting-plans-helper","provide WordPress.com hosting plan information","Answer WordPress.com plan, pricing, upgrade, and feature-tier questions (plan names, what each tier unlocks — plugins, themes, custom code, SSH, hosting — and current prices) from authoritative live data. Load before answering ANY plan, pricing, or feature-gating question; never answer these from memory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3388,3391,3394],{"name":3389,"slug":3390,"type":15},"Pricing","pricing",{"name":3392,"slug":3393,"type":15},"Reference","reference",{"name":3379,"slug":3380,"type":15},"2026-07-02T07:42:33.654791",{"slug":3397,"name":3397,"fn":3398,"description":3399,"org":3400,"tags":3401,"stars":3360,"repoUrl":3361,"updatedAt":3412},"liberate","migrate websites to WordPress","Import and rebuild a website from a closed platform (Wix, Squarespace, Webflow, Shopify, GoDaddy, Hostinger, HubSpot, Weebly) into a Studio WordPress site. Extracts pages\u002Fposts\u002Fproducts + media, then reconstructs the design as editable blocks + WooCommerce OR as a high-fidelity replica theme. Invoke when the user wants to migrate, import, liberate, or rebuild a site from one of these platforms.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3402,3405,3408,3411],{"name":3403,"slug":3404,"type":15},"CMS","cms",{"name":3406,"slug":3407,"type":15},"Migration","migration",{"name":3409,"slug":3410,"type":15},"Web Development","web-development",{"name":3379,"slug":3380,"type":15},"2026-07-09T06:47:33.454311",{"slug":3414,"name":3414,"fn":3415,"description":3416,"org":3417,"tags":3418,"stars":3360,"repoUrl":3361,"updatedAt":3427},"need-for-speed","run frontend performance audits for WordPress sites","Run a frontend performance audit on a WordPress site and get actionable optimization recommendations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3419,3422,3423,3426],{"name":3420,"slug":3421,"type":15},"Audit","audit",{"name":3349,"slug":3350,"type":15},{"name":3424,"slug":3425,"type":15},"Performance","performance",{"name":3379,"slug":3380,"type":15},"2026-05-06T05:40:06.433267",{"slug":3429,"name":3429,"fn":3430,"description":3431,"org":3432,"tags":3433,"stars":3360,"repoUrl":3361,"updatedAt":3441},"plugin-recommendations","recommend WordPress plugins for site features","Choose recommended plugins and plugin-provided blocks for features core WordPress blocks do not cover - ecommerce (WooCommerce), forms and newsletters (Jetpack), online courses and quizzes (Sensei LMS), polls, surveys and ratings (Crowdsignal), spam protection (Akismet) - while keeping generated content editable and avoiding raw HTML fallbacks. Any request to sell products or build a shop, store, or storefront requires WooCommerce with products.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3434,3437,3440],{"name":3435,"slug":3436,"type":15},"Content Creation","content-creation",{"name":3438,"slug":3439,"type":15},"Plugin Development","plugin-development",{"name":3379,"slug":3380,"type":15},"2026-05-27T07:01:58.249105",{"slug":3443,"name":3443,"fn":3444,"description":3445,"org":3446,"tags":3447,"stars":3360,"repoUrl":3361,"updatedAt":3456},"rank-me-up","run on-page SEO audits for WordPress sites","Run an on-page SEO audit on a WordPress site and get actionable recommendations to improve search visibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3448,3449,3452,3455],{"name":3420,"slug":3421,"type":15},{"name":3450,"slug":3451,"type":15},"Marketing","marketing",{"name":3453,"slug":3454,"type":15},"SEO","seo",{"name":3379,"slug":3380,"type":15},"2026-05-06T05:40:05.196367",{"slug":3458,"name":3458,"fn":3459,"description":3460,"org":3461,"tags":3462,"stars":3360,"repoUrl":3361,"updatedAt":3473},"site-spec","gather specifications for new WordPress sites","Gather the site name and layout preference before building a WordPress site. Run this before creating any new site.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3463,3466,3469,3472],{"name":3464,"slug":3465,"type":15},"Design","design",{"name":3467,"slug":3468,"type":15},"Product Management","product-management",{"name":3470,"slug":3471,"type":15},"Specs","specs",{"name":3379,"slug":3380,"type":15},"2026-05-06T05:40:02.739409",{"slug":3475,"name":3475,"fn":3476,"description":3477,"org":3478,"tags":3479,"stars":3360,"repoUrl":3361,"updatedAt":3484},"studio-cli","manage local WordPress sites with Studio CLI","Use the Studio CLI to manage local WordPress sites, authentication, and preview sites. Invoke this skill when you need to run Studio CLI commands, manage sites, or troubleshoot site issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3480,3483],{"name":3481,"slug":3482,"type":15},"CLI","cli",{"name":3379,"slug":3380,"type":15},"2026-04-06T18:02:57.150231",{"slug":3486,"name":3486,"fn":3487,"description":3488,"org":3489,"tags":3490,"stars":3360,"repoUrl":3361,"updatedAt":3499},"taxonomist","optimize WordPress category taxonomy","Analyze and optimize a WordPress site's category taxonomy. Exports all posts, uses AI to suggest an improved category structure — merging duplicates, retiring dead categories, creating missing ones, writing descriptions, and re-categorizing posts. Run this when the user wants to clean up or improve their categories.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3491,3494,3497,3498],{"name":3492,"slug":3493,"type":15},"Content Strategy","content-strategy",{"name":3495,"slug":3496,"type":15},"Data Cleaning","data-cleaning",{"name":3453,"slug":3454,"type":15},{"name":3379,"slug":3380,"type":15},"2026-05-06T05:40:03.966799",{"slug":3501,"name":3501,"fn":3502,"description":3503,"org":3504,"tags":3505,"stars":3360,"repoUrl":3361,"updatedAt":3515},"visual-design","plan and execute visual design direction","Plan and execute high-quality visual direction for site creation, redesign, layout, typography, color, motion, and visual polish.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3506,3509,3510,3513],{"name":3507,"slug":3508,"type":15},"Animation","animation",{"name":3464,"slug":3465,"type":15},{"name":3511,"slug":3512,"type":15},"Typography","typography",{"name":3514,"slug":3501,"type":15},"Visual Design","2026-07-24T05:40:57.887452",{"slug":3517,"name":3517,"fn":3518,"description":3519,"org":3520,"tags":3521,"stars":3360,"repoUrl":3361,"updatedAt":3530},"visual-polish","verify and polish website visual design","Verify and polish a built or redesigned site by diagnosing rendered-DOM issues against intent and fixing them in a planned, batched screenshot-and-fix loop.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3522,3525,3526,3529],{"name":3523,"slug":3524,"type":15},"Debugging","debugging",{"name":3349,"slug":3350,"type":15},{"name":3527,"slug":3528,"type":15},"Screenshots","screenshots",{"name":3514,"slug":3501,"type":15},"2026-06-06T07:09:59.809812",81,{"items":3533,"total":777},[3534,3550,3562,3574,3584,3596,3602],{"slug":3535,"name":3535,"fn":3536,"description":3537,"org":3538,"tags":3539,"stars":22,"repoUrl":23,"updatedAt":3549},"clear-configs","remove local agentic analytics configuration files","Remove the local config files written by first-time setup (bucket.json and the agentic-analytics AWS profile). Leaves the events cache alone. Use when the user wants to start setup over, entered the wrong bucket name, or asks to reset\u002Fclear the plugin's configuration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3540,3543,3546],{"name":3541,"slug":3542,"type":15},"AWS","aws",{"name":3544,"slug":3545,"type":15},"Configuration","configuration",{"name":3547,"slug":3548,"type":15},"Operations","operations","2026-07-24T06:08:49.942979",{"slug":3551,"name":3551,"fn":3552,"description":3553,"org":3554,"tags":3555,"stars":22,"repoUrl":23,"updatedAt":3561},"conversions-report","generate conversion attribution reports","Seed for a future standalone conversions report. Currently holds conversion-attribution code lifted out of the staircase report (PR B of the staircase climbing revision); not yet runnable end-to-end. Use when the user asks to build out the standalone conversions report; do not invoke for \"run the conversions report\" until the file is reshaped.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3556,3557,3558],{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":3559,"slug":3560,"type":15},"Sales","sales","2026-05-23T06:06:37.112153",{"slug":3563,"name":3563,"fn":3564,"description":3565,"org":3566,"tags":3567,"stars":22,"repoUrl":23,"updatedAt":3573},"getting-started","set up agentic-analytics plugin","Walk the user through first-time setup of the agentic-analytics plugin. Use when the user asks how to get started, how to set up the plugin, where to put their credentials, what the plugin can do for them, or any variant of \"first run\" \u002F \"onboarding\" \u002F \"walk me through this.\"",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3568,3569,3572],{"name":20,"slug":21,"type":15},{"name":3570,"slug":3571,"type":15},"Documentation","documentation",{"name":3392,"slug":3393,"type":15},"2026-07-24T05:42:05.056763",{"slug":3575,"name":3575,"fn":3576,"description":3577,"org":3578,"tags":3579,"stars":22,"repoUrl":23,"updatedAt":3583},"identify-employees","filter internal employee traffic from reports","Detect whether the configured customer's tracker tags employee\u002Finternal pageviews via `extra_data`, and if so, save the filter so reports exclude that traffic. Use when the user asks to identify employees, exclude employee traffic, filter internal users, or says results look skewed by their own staff.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3580,3581,3582],{"name":20,"slug":21,"type":15},{"name":3495,"slug":3496,"type":15},{"name":3547,"slug":3548,"type":15},"2026-07-24T05:42:07.991328",{"slug":3585,"name":3585,"fn":3586,"description":3587,"org":3588,"tags":3589,"stars":22,"repoUrl":23,"updatedAt":3595},"refresh-cache","clear and rebuild local data cache","Blow away the local data cache and rebuild it. Use when the user asks to refresh the cache, rebuild the cache, clear cached data, start clean, recover from a bad pull, or says reports are returning stale or weird-looking numbers. Leaves config alone. Offers the lighter update-cache flow as an alternative before deleting anything.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3590,3593,3594],{"name":3591,"slug":3592,"type":15},"Caching","caching",{"name":3523,"slug":3524,"type":15},{"name":3424,"slug":3425,"type":15},"2026-07-24T05:42:07.032844",{"slug":4,"name":4,"fn":5,"description":6,"org":3597,"tags":3598,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3599,3600,3601],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"slug":3603,"name":3603,"fn":3604,"description":3605,"org":3606,"tags":3607,"stars":22,"repoUrl":23,"updatedAt":3613},"update-cache","update local agentic analytics data cache","Top up the local data cache with new data, without deleting anything. Use when the user wants to bring the cache up to date, pull the latest days, sync recent data, or top up the cache. The lighter, non-destructive sibling of refresh-cache – offered as an alternative there.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3608,3609,3612],{"name":3591,"slug":3592,"type":15},{"name":3610,"slug":3611,"type":15},"Data Analysis","data-analysis",{"name":3547,"slug":3548,"type":15},"2026-07-24T06:08:50.338585"]