[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-automattic-journey-report":3,"mdc-in7ne-key":32,"related-org-automattic-journey-report":2110,"related-repo-automattic-journey-report":2302},{"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},"journey-report","run website visitor journey reports","Run the Journey Report — how far into the site a visit gets and where it ends. Use when the user asks to run the journey report, asks how deep visitors go, where the site loses people, what route visitors take after landing, which pages or sections have the worst loss or exit rate, engagement depth, or how a section of the site performs. Also use for follow-up questions about visit paths, entry points, campaigns or engaged time once a report has been run.",{"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},"Data Analysis","data-analysis",{"name":20,"slug":21,"type":15},"Analytics","analytics",1,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fagentic-analytics","2026-08-13T05:04:15.209184",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\u002Fjourney-report","---\nname: journey-report\ndescription: Run the Journey Report — how far into the site a visit gets and where it ends. Use when the user asks to run the journey report, asks how deep visitors go, where the site loses people, what route visitors take after landing, which pages or sections have the worst loss or exit rate, engagement depth, or how a section of the site performs. Also use for follow-up questions about visit paths, entry points, campaigns or engaged time once a report has been run.\n---\n\nRun the Journey Report.\n\nThe staircase report asks how often a **visitor** comes back. This asks how much of the site a single **visit** gets through. They answer different questions and both are meant to exist.\n\nIt is built for content sites where signing someone up is not the KPI — the job is to bring people in, have them consume something, and have them leave with a better impression. So the report measures how far into the site a visit gets and where the site loses it. Conversions are counted but are never the headline.\n\nNothing in it is specific to one customer. Sections are derived from the URL path, so the report runs against any site or business unit without being told what that site contains first.\n\n**Output ONLY the report markdown**, then a single `file:\u002F\u002F` link to the HTML version. No preamble, no postscript, no re-narration. The report is the analysis; you are the pipe. This applies to conversational invocations exactly as it does to the slash command.\n\nThe one exception is the **follow-up questions** in the last section below. Those are answered in chat, in prose, because the report deliberately does not try to answer everything.\n\n## Steps\n\n0. **Resolve the plugin root and the venv python.** Re-run this 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 directory two levels above this SKILL.md.\n\n1. **Load the config.** Read `${XDG_CONFIG_HOME:-~\u002F.config}\u002Fagentic-analytics\u002Fbucket.json` for `bucket`, `profile` and `cache_dir`. If it is missing, tell the user to run the init flow first (`\u002Fagentic-analytics:init`) and stop. Do not guess values.\n\n   That is the only config file. Journey settings, if there are any, live under a `journey` key in the same file — the pattern `identify-employees` already uses for `employee_filter`. **If the key is absent the report runs on defaults**, which is the intended way to point it at a new site or business unit. There is nothing to create and nothing to copy.\n\n   What the report works out for itself: **sections come from the URL path**, so everything under `\u002Fproducts\u002F` belongs to section `products`, and so does `\u002Fproducts` itself. No list of sections, nothing read from page metadata. A leading locale is detected from the data and removed first, so `\u002Fde-de\u002Fproducts` and `\u002Fproducts` are one section and the report does not name six languages as its six biggest sections; it says so when it does this, and `locale_prefixes` overrides it. Two things a URL cannot tell you are the only entries worth adding — how the site tags paid traffic (`source_rules`) and which traffic blocs cannot be measured (`traffic_quality_exclusions`) — plus tuning such as the engaged-time bar.\n\n2. **Resolve the site.** `--site` wins; then `journey.site`; then, if the lake holds exactly one apikey, that one. With several and no answer the engine refuses and lists them, rather than picking.\n\n3. **Top up the cache.** Follow the `update-cache` skill to pull the latest data into the local lake. The pull is incremental, so an already-synced customer pays milliseconds. If the pull fails (auth lapse, S3 hiccup), fall through to whatever is in the lake — the report states its own coverage.\n\n   The Journey Report offers a 90-day window and each window compares against a prior window of equal length, so a full 90-day comparison needs 180 days on disk. The canonical 60-day pull keeps the cache current for the default 60-day window; the 90-day comparison accumulates over subsequent runs as the lake grows. Until it has enough data the engine withholds the change figure and says why, which is correct but less useful.\n\n4. **Run the report.** Two ways, and the difference matters.\n\n   **Serve it** when the user is at their machine and might want to ask\n   anything beyond what the page shows. This is the default; prefer it.\n\n   ```bash\n   \"$plugin_python\" \"$plugin_root\u002Fskills\u002Fjourney-report\u002Fscripts\u002Fserve.py\" \\\n     [--site \u003Csite-id>] --windows 7,30,60,90 --default-window 60\n   ```\n\n   It builds the report, opens the browser, and stays running so the question\n   box on the page can reach the data. Tell the user in one line that it is\n   running and that Ctrl-C stops it. Do not wait for it to exit.\n\n   **Write files** when the user wants something to keep, attach or send. A\n   file has no server behind it, so the question box on that copy explains\n   that rather than pretending.\n\n   ```bash\n   slug=\"\u003Ccache_dir>$([ -n \"\u003Csite-id>\" ] && echo \"-\u003Csite-id>\" || echo \"-all\")\"\n   \"$plugin_python\" \"$plugin_root\u002Fskills\u002Fjourney-report\u002Fscripts\u002Fjourney.py\" \\\n     [--site \u003Csite-id>] \\\n     --windows 7,30,60,90 --default-window 60 \\\n     --output-md \u002Ftmp\u002Fjourney-$slug.md \\\n     --output-html \u002Ftmp\u002Fjourney-$slug.html \\\n     --output-json \u002Ftmp\u002Fjourney-$slug.json\n   ```\n\n   Neither takes `--config`: both read the plugin's own `bucket.json`. Pass\n   `--site` only when the user names one, or when the lake holds more than one\n   site and the config does not say which.\n\n   **If either exits non-zero, do not improvise.** The engine refuses to render\n   when a consistency check fails, by design: a plausible-looking wrong number\n   is worse than no report, because nobody audits a number that looks fine.\n   Show the user the error verbatim and stop. `--no-strict` exists for\n   debugging and must never be used for a customer-facing run.\n\n5. **Output.** When you served it, give the URL the server printed and stop —\n   the report is in the browser and the user reads it there. When you wrote\n   files, read `\u002Ftmp\u002Fjourney-$slug.md` and emit its contents verbatim, then the\n   HTML link on the last line, one blank line after the body:\n\n   ```\n   [Open the HTML version in browser](file:\u002F\u002F\u002Ftmp\u002Fjourney-$slug.html)\n   ```\n\n   Link the `.html`, never the `.md` — the markdown is what you just emitted.\n   The `file:\u002F\u002F` protocol matters: a bare path gets intercepted by an editor.\n\n   The HTML carries more than the markdown, deliberately: the three-level route\n   tree, the entry\u002Fcampaign\u002Fsource filters, the window switcher and the PDF\n   export. Do not try to mirror it into chat.\n\n## What the report contains\n\n**Engagement depth** is the metric everything else hangs off. A visit is a run of events from one visitor with no gap over the configured session gap. A qualifying action is a pageview of a URL not already seen in that visit that cleared the engaged-time bar, or a download, or a video play. Depth is the count of those, minimum 1. The headline is the share of visits at depth 2 or more.\n\nAlongside it the report always shows the same share computed **without** the engaged-time rule. That contrast is not decoration: it is what demonstrates the metric is not ordinary pages per session, and the engaged-time signal comes from Parse.ly heartbeats arriving as events in the DPL, which is the commercial differentiator.\n\nThe headline will be low. Never inflate it by excluding single-action visits from the denominator, and never count non-engaged pageviews toward it. It is a baseline to improve.\n\n**Route tree**, anchored on a selectable entry point and going forward three levels. Branches are **sections**, so it reads as \"of the visits that landed on `\u002Fproducts`, how many went on to `\u002Fnews`, to `\u002Fsupport`, or to another page inside `\u002Fproducts`\". Exit is a first-class branch at every level, listed first, with its own share and volume, because it is the largest outcome. No conversion gating: every path is traced whether or not it ends in a conversion. That gating is the specific limitation of Parse.ly's own Journeys view that this section exists to fix.\n\n**Loss map**, pages ranked by the share of visits that end on them, with the most common next step for those who did continue.\n\n**Section scoreboard**, with size in one column and pull in the other. The finding lives in the contrast, not in either column alone. Sections are derived, so this table needs no list of what the site contains.\n\n**Site shape**, measured rather than assumed. Sections read correctly where the site has a section layer and degenerate on a flat site, where every article sits at the root and becomes a section of one page. Both are real shapes; the report states which one it is looking at instead of applying a threshold that would make a flat site look structured.\n\n**Composition tiles**, so the headline is auditable: engaged against loaded pageviews, downloads, video plays, visits, unique visitors, median engaged time.\n\n**Traffic set aside.** Blocs configured as traffic-quality exclusions are reported with their own volume and headline rather than dropped. Where a signal is genuinely absent, say which signal is missing and what it would unlock. Never render a silent zero.\n\n## Filter scope — decided, do not change\n\n| Filter | Scope |\n|---|---|\n| Time window (7 \u002F 30 \u002F 60 \u002F 90 days) | **Global.** Every section recomputes. A header saying \"last 7 days\" while any number on the page still reflects 60 is a correctness bug, not a gap. |\n| Entry point | Local to the route tree |\n| Campaign | Local to the route tree |\n| Entry source | Local to the route tree |\n\nEvery window compares against the immediately prior window of equal length, anchored on the latest complete day in the data, never on today.\n\n## Follow-up questions\n\nThe report is a starting point, not the product. There are two places a\nfollow-up can be answered, and they are good at different things.\n\n**The question box on the served page** is you. It hands the question to\n`claude` verbatim and renders the reply, so the user gets the command line\nwithout leaving the report. Nothing is added to the question and nothing is\npre-answered; whatever you would say in a terminal is what appears in the box.\nPoint the user at it rather than asking them to switch windows.\n\nIt runs headless with an explicit read-only allow-list, so a question can read\nthe data but cannot change anything. If the box reports that tools were denied,\nthe machine's permission settings are stricter than the default; starting the\nserver with `JOURNEY_ASK_PERMISSION_MODE=bypassPermissions` is the way out.\n\n**You, here in the conversation**, for anything it cannot do: an odd cut, a\ncombination of filters, a question that needs judgement rather than a table.\nQuery the same derived tables rather than guessing or re-reading raw parquet.\nBuild them once, then use SQL:\n\n```bash\n\"$plugin_python\" - \u003C\u003C'PY'\nimport sys, json\nsys.path.insert(0, \"PLUGIN_ROOT\u002Fscripts\u002Fdb\u002Flib\")\nimport catalog, sessions\ncfg = json.load(open(\"CONFIG_PATH\"))\ncon = catalog.connect(); catalog.ensure_view(con, \"dpl\", \"events\")\nlo, hi = sessions.available_days(con, cfg[\"site\"])\nsessions.build(con, cfg, site=cfg[\"site\"], day_start=lo, day_end=hi)\n# ... then query j_visit \u002F j_step \u002F j_pv \u002F j_sess\nPY\n```\n\nThe tables, and what one row means in each:\n\n| Table | One row is | Key columns |\n|---|---|---|\n| `j_pv` | a pageview | `vsid`, `ts`, `url_path`, `title`, `engaged_seconds`, `section`, `is_section_landing`, `source`, `campaign`, `exclusion` |\n| `j_act` | anything that can earn a point | `kind` in pageview \u002F download \u002F videostart, `conv_type`, `conv_label` |\n| `j_sess` | `j_act` plus a visit id | `sid` |\n| `j_step` | a distinct URL within one visit, in order | `step_idx` (0 is the entry), `qualifies`, `engaged_seconds` |\n| `j_visit` | a visit | `entry_path`, `entry_title`, `entry_section`, `source`, `campaign`, `depth_qualified`, `depth_raw`, `loaded_pageviews`, `downloads`, `video_plays`, `max_step_idx`, `exclusion` |\n\nFilter `exclusion IS NULL` to match the report's clean base. Three worked examples:\n\n```sql\n-- which pages send the most traffic onward into a different section\nSELECT s.title, count(*) AS onward\nFROM j_step s JOIN j_step n\n  ON n.vsid = s.vsid AND n.sid = s.sid AND n.step_idx = s.step_idx + 1\nJOIN j_visit v ON v.vsid = s.vsid AND v.sid = s.sid\nWHERE v.exclusion IS NULL AND s.section \u003C> n.section\nGROUP BY 1 ORDER BY onward DESC LIMIT 20;\n\n-- entry pages with the worst loss rate, this month against last\nSELECT v.entry_title,\n       date_trunc('month', v.started_at) AS month,\n       count(*) AS visits,\n       round(100.0 * avg(CASE WHEN v.max_step_idx = 0 THEN 1 ELSE 0 END), 1) AS loss_pct\nFROM j_visit v WHERE v.exclusion IS NULL\nGROUP BY 1, 2 HAVING count(*) > 200 ORDER BY 1, 2;\n\n-- for campaign traffic, the most common three-page path\nSELECT s0.url_path AS p1, s1.url_path AS p2, s2.url_path AS p3, count(*) AS visits\nFROM j_visit v\nJOIN j_step s0 ON s0.vsid = v.vsid AND s0.sid = v.sid AND s0.step_idx = 0\nJOIN j_step s1 ON s1.vsid = v.vsid AND s1.sid = v.sid AND s1.step_idx = 1\nJOIN j_step s2 ON s2.vsid = v.vsid AND s2.sid = v.sid AND s2.step_idx = 2\nWHERE v.exclusion IS NULL AND v.campaign = 'PaidCampaign'\nGROUP BY 1, 2, 3 ORDER BY visits DESC LIMIT 20;\n```\n\nAnswer follow-ups in prose with the numbers inline. Two rules carry over from the report itself: state the volume behind any rate you quote, and if the answer is that the data cannot support the question, say that instead of producing a number.\n\n## Constraints (re-stated for emphasis)\n\n- No \"Running the journey report…\" preamble, no \"Two things stand out…\" postscript.\n- If a consistency check fails, surface the error and stop. Do not render partial output and do not reach for `--no-strict`.\n- If the lake has no events for the configured site, say so in one line and stop.\n- The trailing link points at the `.html` from step 4, never the `.md`.\n- Sections are derived from the URL and must stay that way. If you find yourself wanting to write a list of the site's sections, or to read one from page metadata, stop: that is how this became a bespoke report for one customer the first time.\n- There is one config file and the plugin already owns it. Do not add a second.\n",{"data":33,"body":34},{"name":4,"description":6},{"type":35,"children":36},"root",[37,45,65,70,75,94,106,113,1091,1097,1107,1119,1124,1171,1181,1191,1201,1211,1221,1227,1310,1315,1321,1326,1344,1357,1367,1479,1484,1812,1825,2040,2045,2051,2104],{"type":38,"tag":39,"props":40,"children":41},"element","p",{},[42],{"type":43,"value":44},"text","Run the Journey Report.",{"type":38,"tag":39,"props":46,"children":47},{},[48,50,56,58,63],{"type":43,"value":49},"The staircase report asks how often a ",{"type":38,"tag":51,"props":52,"children":53},"strong",{},[54],{"type":43,"value":55},"visitor",{"type":43,"value":57}," comes back. This asks how much of the site a single ",{"type":38,"tag":51,"props":59,"children":60},{},[61],{"type":43,"value":62},"visit",{"type":43,"value":64}," gets through. They answer different questions and both are meant to exist.",{"type":38,"tag":39,"props":66,"children":67},{},[68],{"type":43,"value":69},"It is built for content sites where signing someone up is not the KPI — the job is to bring people in, have them consume something, and have them leave with a better impression. So the report measures how far into the site a visit gets and where the site loses it. Conversions are counted but are never the headline.",{"type":38,"tag":39,"props":71,"children":72},{},[73],{"type":43,"value":74},"Nothing in it is specific to one customer. Sections are derived from the URL path, so the report runs against any site or business unit without being told what that site contains first.",{"type":38,"tag":39,"props":76,"children":77},{},[78,83,85,92],{"type":38,"tag":51,"props":79,"children":80},{},[81],{"type":43,"value":82},"Output ONLY the report markdown",{"type":43,"value":84},", then a single ",{"type":38,"tag":86,"props":87,"children":89},"code",{"className":88},[],[90],{"type":43,"value":91},"file:\u002F\u002F",{"type":43,"value":93}," link to the HTML version. No preamble, no postscript, no re-narration. The report is the analysis; you are the pipe. This applies to conversational invocations exactly as it does to the slash command.",{"type":38,"tag":39,"props":95,"children":96},{},[97,99,104],{"type":43,"value":98},"The one exception is the ",{"type":38,"tag":51,"props":100,"children":101},{},[102],{"type":43,"value":103},"follow-up questions",{"type":43,"value":105}," in the last section below. Those are answered in chat, in prose, because the report deliberately does not try to answer everything.",{"type":38,"tag":107,"props":108,"children":110},"h2",{"id":109},"steps",[111],{"type":43,"value":112},"Steps",{"type":38,"tag":114,"props":115,"children":117},"ol",{"start":116},0,[118,374,534,560,583,1032],{"type":38,"tag":119,"props":120,"children":121},"li",{},[122,127,129,362,366,372],{"type":38,"tag":51,"props":123,"children":124},{},[125],{"type":43,"value":126},"Resolve the plugin root and the venv python.",{"type":43,"value":128}," Re-run this whenever you start a new shell:",{"type":38,"tag":130,"props":131,"children":136},"pre",{"className":132,"code":133,"language":134,"meta":135,"style":135},"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","",[137],{"type":38,"tag":86,"props":138,"children":139},{"__ignoreMap":135},[140,203,301],{"type":38,"tag":141,"props":142,"children":144},"span",{"class":143,"line":22},"line",[145,151,157,162,167,172,177,182,188,193,198],{"type":38,"tag":141,"props":146,"children":148},{"style":147},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[149],{"type":43,"value":150},"plugin_root",{"type":38,"tag":141,"props":152,"children":154},{"style":153},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[155],{"type":43,"value":156},"=",{"type":38,"tag":141,"props":158,"children":159},{"style":153},[160],{"type":43,"value":161},"\"${",{"type":38,"tag":141,"props":163,"children":164},{"style":147},[165],{"type":43,"value":166},"CLAUDE_PLUGIN_ROOT",{"type":38,"tag":141,"props":168,"children":169},{"style":153},[170],{"type":43,"value":171},":-${",{"type":38,"tag":141,"props":173,"children":174},{"style":147},[175],{"type":43,"value":176},"CURSOR_PLUGIN_ROOT",{"type":38,"tag":141,"props":178,"children":179},{"style":153},[180],{"type":43,"value":181},":-",{"type":38,"tag":141,"props":183,"children":185},{"style":184},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[186],{"type":43,"value":187},"\u003C",{"type":38,"tag":141,"props":189,"children":190},{"style":147},[191],{"type":43,"value":192},"plugin-root",{"type":38,"tag":141,"props":194,"children":195},{"style":184},[196],{"type":43,"value":197},">",{"type":38,"tag":141,"props":199,"children":200},{"style":153},[201],{"type":43,"value":202},"}}\"\n",{"type":38,"tag":141,"props":204,"children":206},{"class":143,"line":205},2,[207,212,216,220,225,229,234,238,243,248,253,258,262,267,271,276,281,286,291,296],{"type":38,"tag":141,"props":208,"children":209},{"style":147},[210],{"type":43,"value":211},"plugin_python",{"type":38,"tag":141,"props":213,"children":214},{"style":153},[215],{"type":43,"value":156},{"type":38,"tag":141,"props":217,"children":218},{"style":153},[219],{"type":43,"value":161},{"type":38,"tag":141,"props":221,"children":222},{"style":147},[223],{"type":43,"value":224},"AGENTIC_ANALYTICS_VENV",{"type":38,"tag":141,"props":226,"children":227},{"style":153},[228],{"type":43,"value":171},{"type":38,"tag":141,"props":230,"children":231},{"style":147},[232],{"type":43,"value":233},"AGENTIC_ANALYTICS_DATA_DIR",{"type":38,"tag":141,"props":235,"children":236},{"style":153},[237],{"type":43,"value":181},{"type":38,"tag":141,"props":239,"children":240},{"style":147},[241],{"type":43,"value":242},"$HOME",{"type":38,"tag":141,"props":244,"children":245},{"style":153},[246],{"type":43,"value":247},"\u002F",{"type":38,"tag":141,"props":249,"children":250},{"style":184},[251],{"type":43,"value":252},".",{"type":38,"tag":141,"props":254,"children":255},{"style":147},[256],{"type":43,"value":257},"local",{"type":38,"tag":141,"props":259,"children":260},{"style":153},[261],{"type":43,"value":247},{"type":38,"tag":141,"props":263,"children":264},{"style":147},[265],{"type":43,"value":266},"share",{"type":38,"tag":141,"props":268,"children":269},{"style":153},[270],{"type":43,"value":247},{"type":38,"tag":141,"props":272,"children":273},{"style":147},[274],{"type":43,"value":275},"agentic-analytics",{"type":38,"tag":141,"props":277,"children":278},{"style":153},[279],{"type":43,"value":280},"}\u002F",{"type":38,"tag":141,"props":282,"children":283},{"style":147},[284],{"type":43,"value":285},"venv",{"type":38,"tag":141,"props":287,"children":288},{"style":153},[289],{"type":43,"value":290},"}",{"type":38,"tag":141,"props":292,"children":293},{"style":184},[294],{"type":43,"value":295},"\u002Fbin\u002Fpython",{"type":38,"tag":141,"props":297,"children":298},{"style":153},[299],{"type":43,"value":300},"\"\n",{"type":38,"tag":141,"props":302,"children":304},{"class":143,"line":303},3,[305,310,315,320,325,330,335,340,345,349,353,358],{"type":38,"tag":141,"props":306,"children":307},{"style":153},[308],{"type":43,"value":309},"[",{"type":38,"tag":141,"props":311,"children":312},{"style":153},[313],{"type":43,"value":314}," -x",{"type":38,"tag":141,"props":316,"children":317},{"style":153},[318],{"type":43,"value":319}," \"",{"type":38,"tag":141,"props":321,"children":322},{"style":147},[323],{"type":43,"value":324},"$plugin_python",{"type":38,"tag":141,"props":326,"children":327},{"style":153},[328],{"type":43,"value":329},"\"",{"type":38,"tag":141,"props":331,"children":332},{"style":153},[333],{"type":43,"value":334}," ]",{"type":38,"tag":141,"props":336,"children":337},{"style":153},[338],{"type":43,"value":339}," ||",{"type":38,"tag":141,"props":341,"children":342},{"style":147},[343],{"type":43,"value":344}," plugin_python",{"type":38,"tag":141,"props":346,"children":347},{"style":153},[348],{"type":43,"value":156},{"type":38,"tag":141,"props":350,"children":351},{"style":153},[352],{"type":43,"value":329},{"type":38,"tag":141,"props":354,"children":355},{"style":184},[356],{"type":43,"value":357},"python3",{"type":38,"tag":141,"props":359,"children":360},{"style":153},[361],{"type":43,"value":300},{"type":38,"tag":363,"props":364,"children":365},"br",{},[],{"type":38,"tag":86,"props":367,"children":369},{"className":368},[],[370],{"type":43,"value":371},"\u003Cplugin-root>",{"type":43,"value":373}," is the directory two levels above this SKILL.md.",{"type":38,"tag":119,"props":375,"children":376},{},[377,382,384,390,392,398,400,406,408,414,416,422,424,427,429,435,437,443,445,451,453,458,460,463,465,470,472,478,480,486,488,494,496,502,503,508,510,516,518,524,526,532],{"type":38,"tag":51,"props":378,"children":379},{},[380],{"type":43,"value":381},"Load the config.",{"type":43,"value":383}," Read ",{"type":38,"tag":86,"props":385,"children":387},{"className":386},[],[388],{"type":43,"value":389},"${XDG_CONFIG_HOME:-~\u002F.config}\u002Fagentic-analytics\u002Fbucket.json",{"type":43,"value":391}," for ",{"type":38,"tag":86,"props":393,"children":395},{"className":394},[],[396],{"type":43,"value":397},"bucket",{"type":43,"value":399},", ",{"type":38,"tag":86,"props":401,"children":403},{"className":402},[],[404],{"type":43,"value":405},"profile",{"type":43,"value":407}," and ",{"type":38,"tag":86,"props":409,"children":411},{"className":410},[],[412],{"type":43,"value":413},"cache_dir",{"type":43,"value":415},". If it is missing, tell the user to run the init flow first (",{"type":38,"tag":86,"props":417,"children":419},{"className":418},[],[420],{"type":43,"value":421},"\u002Fagentic-analytics:init",{"type":43,"value":423},") and stop. Do not guess values.",{"type":38,"tag":363,"props":425,"children":426},{},[],{"type":43,"value":428},"That is the only config file. Journey settings, if there are any, live under a ",{"type":38,"tag":86,"props":430,"children":432},{"className":431},[],[433],{"type":43,"value":434},"journey",{"type":43,"value":436}," key in the same file — the pattern ",{"type":38,"tag":86,"props":438,"children":440},{"className":439},[],[441],{"type":43,"value":442},"identify-employees",{"type":43,"value":444}," already uses for ",{"type":38,"tag":86,"props":446,"children":448},{"className":447},[],[449],{"type":43,"value":450},"employee_filter",{"type":43,"value":452},". ",{"type":38,"tag":51,"props":454,"children":455},{},[456],{"type":43,"value":457},"If the key is absent the report runs on defaults",{"type":43,"value":459},", which is the intended way to point it at a new site or business unit. There is nothing to create and nothing to copy.",{"type":38,"tag":363,"props":461,"children":462},{},[],{"type":43,"value":464},"What the report works out for itself: ",{"type":38,"tag":51,"props":466,"children":467},{},[468],{"type":43,"value":469},"sections come from the URL path",{"type":43,"value":471},", so everything under ",{"type":38,"tag":86,"props":473,"children":475},{"className":474},[],[476],{"type":43,"value":477},"\u002Fproducts\u002F",{"type":43,"value":479}," belongs to section ",{"type":38,"tag":86,"props":481,"children":483},{"className":482},[],[484],{"type":43,"value":485},"products",{"type":43,"value":487},", and so does ",{"type":38,"tag":86,"props":489,"children":491},{"className":490},[],[492],{"type":43,"value":493},"\u002Fproducts",{"type":43,"value":495}," itself. No list of sections, nothing read from page metadata. A leading locale is detected from the data and removed first, so ",{"type":38,"tag":86,"props":497,"children":499},{"className":498},[],[500],{"type":43,"value":501},"\u002Fde-de\u002Fproducts",{"type":43,"value":407},{"type":38,"tag":86,"props":504,"children":506},{"className":505},[],[507],{"type":43,"value":493},{"type":43,"value":509}," are one section and the report does not name six languages as its six biggest sections; it says so when it does this, and ",{"type":38,"tag":86,"props":511,"children":513},{"className":512},[],[514],{"type":43,"value":515},"locale_prefixes",{"type":43,"value":517}," overrides it. Two things a URL cannot tell you are the only entries worth adding — how the site tags paid traffic (",{"type":38,"tag":86,"props":519,"children":521},{"className":520},[],[522],{"type":43,"value":523},"source_rules",{"type":43,"value":525},") and which traffic blocs cannot be measured (",{"type":38,"tag":86,"props":527,"children":529},{"className":528},[],[530],{"type":43,"value":531},"traffic_quality_exclusions",{"type":43,"value":533},") — plus tuning such as the engaged-time bar.",{"type":38,"tag":119,"props":535,"children":536},{},[537,542,544,550,552,558],{"type":38,"tag":51,"props":538,"children":539},{},[540],{"type":43,"value":541},"Resolve the site.",{"type":43,"value":543}," ",{"type":38,"tag":86,"props":545,"children":547},{"className":546},[],[548],{"type":43,"value":549},"--site",{"type":43,"value":551}," wins; then ",{"type":38,"tag":86,"props":553,"children":555},{"className":554},[],[556],{"type":43,"value":557},"journey.site",{"type":43,"value":559},"; then, if the lake holds exactly one apikey, that one. With several and no answer the engine refuses and lists them, rather than picking.",{"type":38,"tag":119,"props":561,"children":562},{},[563,568,570,576,578,581],{"type":38,"tag":51,"props":564,"children":565},{},[566],{"type":43,"value":567},"Top up the cache.",{"type":43,"value":569}," Follow the ",{"type":38,"tag":86,"props":571,"children":573},{"className":572},[],[574],{"type":43,"value":575},"update-cache",{"type":43,"value":577}," skill to pull the latest data into the local lake. The pull is incremental, so an already-synced customer pays milliseconds. If the pull fails (auth lapse, S3 hiccup), fall through to whatever is in the lake — the report states its own coverage.",{"type":38,"tag":363,"props":579,"children":580},{},[],{"type":43,"value":582},"The Journey Report offers a 90-day window and each window compares against a prior window of equal length, so a full 90-day comparison needs 180 days on disk. The canonical 60-day pull keeps the cache current for the default 60-day window; the 90-day comparison accumulates over subsequent runs as the lake grows. Until it has enough data the engine withholds the change figure and says why, which is correct but less useful.",{"type":38,"tag":119,"props":584,"children":585},{},[586,591,593,596,601,603,701,704,706,709,714,716,986,989,991,997,999,1005,1007,1012,1014,1017,1022,1024,1030],{"type":38,"tag":51,"props":587,"children":588},{},[589],{"type":43,"value":590},"Run the report.",{"type":43,"value":592}," Two ways, and the difference matters.",{"type":38,"tag":363,"props":594,"children":595},{},[],{"type":38,"tag":51,"props":597,"children":598},{},[599],{"type":43,"value":600},"Serve it",{"type":43,"value":602}," when the user is at their machine and might want to ask\nanything beyond what the page shows. This is the default; prefer it.",{"type":38,"tag":130,"props":604,"children":606},{"className":132,"code":605,"language":134,"meta":135,"style":135},"\"$plugin_python\" \"$plugin_root\u002Fskills\u002Fjourney-report\u002Fscripts\u002Fserve.py\" \\\n  [--site \u003Csite-id>] --windows 7,30,60,90 --default-window 60\n",[607],{"type":38,"tag":86,"props":608,"children":609},{"__ignoreMap":135},[610,649],{"type":38,"tag":141,"props":611,"children":612},{"class":143,"line":22},[613,618,622,626,630,635,640,644],{"type":38,"tag":141,"props":614,"children":616},{"style":615},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[617],{"type":43,"value":329},{"type":38,"tag":141,"props":619,"children":620},{"style":147},[621],{"type":43,"value":324},{"type":38,"tag":141,"props":623,"children":624},{"style":615},[625],{"type":43,"value":329},{"type":38,"tag":141,"props":627,"children":628},{"style":153},[629],{"type":43,"value":319},{"type":38,"tag":141,"props":631,"children":632},{"style":147},[633],{"type":43,"value":634},"$plugin_root",{"type":38,"tag":141,"props":636,"children":637},{"style":184},[638],{"type":43,"value":639},"\u002Fskills\u002Fjourney-report\u002Fscripts\u002Fserve.py",{"type":38,"tag":141,"props":641,"children":642},{"style":153},[643],{"type":43,"value":329},{"type":38,"tag":141,"props":645,"children":646},{"style":147},[647],{"type":43,"value":648}," \\\n",{"type":38,"tag":141,"props":650,"children":651},{"class":143,"line":205},[652,657,661,666,671,675,680,685,690,695],{"type":38,"tag":141,"props":653,"children":654},{"style":147},[655],{"type":43,"value":656},"  [--site ",{"type":38,"tag":141,"props":658,"children":659},{"style":153},[660],{"type":43,"value":187},{"type":38,"tag":141,"props":662,"children":663},{"style":184},[664],{"type":43,"value":665},"site-i",{"type":38,"tag":141,"props":667,"children":668},{"style":147},[669],{"type":43,"value":670},"d",{"type":38,"tag":141,"props":672,"children":673},{"style":153},[674],{"type":43,"value":197},{"type":38,"tag":141,"props":676,"children":677},{"style":184},[678],{"type":43,"value":679},"]",{"type":38,"tag":141,"props":681,"children":682},{"style":184},[683],{"type":43,"value":684}," --windows",{"type":38,"tag":141,"props":686,"children":687},{"style":184},[688],{"type":43,"value":689}," 7,30,60,90",{"type":38,"tag":141,"props":691,"children":692},{"style":184},[693],{"type":43,"value":694}," --default-window",{"type":38,"tag":141,"props":696,"children":698},{"style":697},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[699],{"type":43,"value":700}," 60\n",{"type":38,"tag":363,"props":702,"children":703},{},[],{"type":43,"value":705},"It builds the report, opens the browser, and stays running so the question\nbox on the page can reach the data. Tell the user in one line that it is\nrunning and that Ctrl-C stops it. Do not wait for it to exit.",{"type":38,"tag":363,"props":707,"children":708},{},[],{"type":38,"tag":51,"props":710,"children":711},{},[712],{"type":43,"value":713},"Write files",{"type":43,"value":715}," when the user wants something to keep, attach or send. A\nfile has no server behind it, so the question box on that copy explains\nthat rather than pretending.",{"type":38,"tag":130,"props":717,"children":719},{"className":132,"code":718,"language":134,"meta":135,"style":135},"slug=\"\u003Ccache_dir>$([ -n \"\u003Csite-id>\" ] && echo \"-\u003Csite-id>\" || echo \"-all\")\"\n\"$plugin_python\" \"$plugin_root\u002Fskills\u002Fjourney-report\u002Fscripts\u002Fjourney.py\" \\\n  [--site \u003Csite-id>] \\\n  --windows 7,30,60,90 --default-window 60 \\\n  --output-md \u002Ftmp\u002Fjourney-$slug.md \\\n  --output-html \u002Ftmp\u002Fjourney-$slug.html \\\n  --output-json \u002Ftmp\u002Fjourney-$slug.json\n",[720],{"type":38,"tag":86,"props":721,"children":722},{"__ignoreMap":135},[723,817,853,884,910,938,964],{"type":38,"tag":141,"props":724,"children":725},{"class":143,"line":22},[726,731,735,739,744,749,754,758,763,767,771,776,782,786,791,795,799,803,807,812],{"type":38,"tag":141,"props":727,"children":728},{"style":147},[729],{"type":43,"value":730},"slug",{"type":38,"tag":141,"props":732,"children":733},{"style":153},[734],{"type":43,"value":156},{"type":38,"tag":141,"props":736,"children":737},{"style":153},[738],{"type":43,"value":329},{"type":38,"tag":141,"props":740,"children":741},{"style":184},[742],{"type":43,"value":743},"\u003Ccache_dir>",{"type":38,"tag":141,"props":745,"children":746},{"style":153},[747],{"type":43,"value":748},"$([",{"type":38,"tag":141,"props":750,"children":751},{"style":153},[752],{"type":43,"value":753}," -n",{"type":38,"tag":141,"props":755,"children":756},{"style":153},[757],{"type":43,"value":319},{"type":38,"tag":141,"props":759,"children":760},{"style":184},[761],{"type":43,"value":762},"\u003Csite-id>",{"type":38,"tag":141,"props":764,"children":765},{"style":153},[766],{"type":43,"value":329},{"type":38,"tag":141,"props":768,"children":769},{"style":153},[770],{"type":43,"value":334},{"type":38,"tag":141,"props":772,"children":773},{"style":153},[774],{"type":43,"value":775}," &&",{"type":38,"tag":141,"props":777,"children":779},{"style":778},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[780],{"type":43,"value":781}," echo",{"type":38,"tag":141,"props":783,"children":784},{"style":153},[785],{"type":43,"value":319},{"type":38,"tag":141,"props":787,"children":788},{"style":184},[789],{"type":43,"value":790},"-\u003Csite-id>",{"type":38,"tag":141,"props":792,"children":793},{"style":153},[794],{"type":43,"value":329},{"type":38,"tag":141,"props":796,"children":797},{"style":153},[798],{"type":43,"value":339},{"type":38,"tag":141,"props":800,"children":801},{"style":778},[802],{"type":43,"value":781},{"type":38,"tag":141,"props":804,"children":805},{"style":153},[806],{"type":43,"value":319},{"type":38,"tag":141,"props":808,"children":809},{"style":184},[810],{"type":43,"value":811},"-all",{"type":38,"tag":141,"props":813,"children":814},{"style":153},[815],{"type":43,"value":816},"\")\"\n",{"type":38,"tag":141,"props":818,"children":819},{"class":143,"line":205},[820,824,828,832,836,840,845,849],{"type":38,"tag":141,"props":821,"children":822},{"style":615},[823],{"type":43,"value":329},{"type":38,"tag":141,"props":825,"children":826},{"style":147},[827],{"type":43,"value":324},{"type":38,"tag":141,"props":829,"children":830},{"style":615},[831],{"type":43,"value":329},{"type":38,"tag":141,"props":833,"children":834},{"style":153},[835],{"type":43,"value":319},{"type":38,"tag":141,"props":837,"children":838},{"style":147},[839],{"type":43,"value":634},{"type":38,"tag":141,"props":841,"children":842},{"style":184},[843],{"type":43,"value":844},"\u002Fskills\u002Fjourney-report\u002Fscripts\u002Fjourney.py",{"type":38,"tag":141,"props":846,"children":847},{"style":153},[848],{"type":43,"value":329},{"type":38,"tag":141,"props":850,"children":851},{"style":147},[852],{"type":43,"value":648},{"type":38,"tag":141,"props":854,"children":855},{"class":143,"line":303},[856,860,864,868,872,876,880],{"type":38,"tag":141,"props":857,"children":858},{"style":147},[859],{"type":43,"value":656},{"type":38,"tag":141,"props":861,"children":862},{"style":153},[863],{"type":43,"value":187},{"type":38,"tag":141,"props":865,"children":866},{"style":184},[867],{"type":43,"value":665},{"type":38,"tag":141,"props":869,"children":870},{"style":147},[871],{"type":43,"value":670},{"type":38,"tag":141,"props":873,"children":874},{"style":153},[875],{"type":43,"value":197},{"type":38,"tag":141,"props":877,"children":878},{"style":184},[879],{"type":43,"value":679},{"type":38,"tag":141,"props":881,"children":882},{"style":147},[883],{"type":43,"value":648},{"type":38,"tag":141,"props":885,"children":887},{"class":143,"line":886},4,[888,893,897,901,906],{"type":38,"tag":141,"props":889,"children":890},{"style":184},[891],{"type":43,"value":892},"  --windows",{"type":38,"tag":141,"props":894,"children":895},{"style":184},[896],{"type":43,"value":689},{"type":38,"tag":141,"props":898,"children":899},{"style":184},[900],{"type":43,"value":694},{"type":38,"tag":141,"props":902,"children":903},{"style":697},[904],{"type":43,"value":905}," 60",{"type":38,"tag":141,"props":907,"children":908},{"style":147},[909],{"type":43,"value":648},{"type":38,"tag":141,"props":911,"children":913},{"class":143,"line":912},5,[914,919,924,929,934],{"type":38,"tag":141,"props":915,"children":916},{"style":184},[917],{"type":43,"value":918},"  --output-md",{"type":38,"tag":141,"props":920,"children":921},{"style":184},[922],{"type":43,"value":923}," \u002Ftmp\u002Fjourney-",{"type":38,"tag":141,"props":925,"children":926},{"style":147},[927],{"type":43,"value":928},"$slug",{"type":38,"tag":141,"props":930,"children":931},{"style":184},[932],{"type":43,"value":933},".md",{"type":38,"tag":141,"props":935,"children":936},{"style":147},[937],{"type":43,"value":648},{"type":38,"tag":141,"props":939,"children":941},{"class":143,"line":940},6,[942,947,951,955,960],{"type":38,"tag":141,"props":943,"children":944},{"style":184},[945],{"type":43,"value":946},"  --output-html",{"type":38,"tag":141,"props":948,"children":949},{"style":184},[950],{"type":43,"value":923},{"type":38,"tag":141,"props":952,"children":953},{"style":147},[954],{"type":43,"value":928},{"type":38,"tag":141,"props":956,"children":957},{"style":184},[958],{"type":43,"value":959},".html",{"type":38,"tag":141,"props":961,"children":962},{"style":147},[963],{"type":43,"value":648},{"type":38,"tag":141,"props":965,"children":967},{"class":143,"line":966},7,[968,973,977,981],{"type":38,"tag":141,"props":969,"children":970},{"style":184},[971],{"type":43,"value":972},"  --output-json",{"type":38,"tag":141,"props":974,"children":975},{"style":184},[976],{"type":43,"value":923},{"type":38,"tag":141,"props":978,"children":979},{"style":147},[980],{"type":43,"value":928},{"type":38,"tag":141,"props":982,"children":983},{"style":184},[984],{"type":43,"value":985},".json\n",{"type":38,"tag":363,"props":987,"children":988},{},[],{"type":43,"value":990},"Neither takes ",{"type":38,"tag":86,"props":992,"children":994},{"className":993},[],[995],{"type":43,"value":996},"--config",{"type":43,"value":998},": both read the plugin's own ",{"type":38,"tag":86,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":43,"value":1004},"bucket.json",{"type":43,"value":1006},". Pass\n",{"type":38,"tag":86,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":43,"value":549},{"type":43,"value":1013}," only when the user names one, or when the lake holds more than one\nsite and the config does not say which.",{"type":38,"tag":363,"props":1015,"children":1016},{},[],{"type":38,"tag":51,"props":1018,"children":1019},{},[1020],{"type":43,"value":1021},"If either exits non-zero, do not improvise.",{"type":43,"value":1023}," The engine refuses to render\nwhen a consistency check fails, by design: a plausible-looking wrong number\nis worse than no report, because nobody audits a number that looks fine.\nShow the user the error verbatim and stop. ",{"type":38,"tag":86,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":43,"value":1029},"--no-strict",{"type":43,"value":1031}," exists for\ndebugging and must never be used for a customer-facing run.",{"type":38,"tag":119,"props":1033,"children":1034},{},[1035,1040,1042,1048,1050,1060,1063,1065,1070,1072,1077,1079,1084,1086,1089],{"type":38,"tag":51,"props":1036,"children":1037},{},[1038],{"type":43,"value":1039},"Output.",{"type":43,"value":1041}," When you served it, give the URL the server printed and stop —\nthe report is in the browser and the user reads it there. When you wrote\nfiles, read ",{"type":38,"tag":86,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":43,"value":1047},"\u002Ftmp\u002Fjourney-$slug.md",{"type":43,"value":1049}," and emit its contents verbatim, then the\nHTML link on the last line, one blank line after the body:",{"type":38,"tag":130,"props":1051,"children":1055},{"className":1052,"code":1054,"language":43},[1053],"language-text","[Open the HTML version in browser](file:\u002F\u002F\u002Ftmp\u002Fjourney-$slug.html)\n",[1056],{"type":38,"tag":86,"props":1057,"children":1058},{"__ignoreMap":135},[1059],{"type":43,"value":1054},{"type":38,"tag":363,"props":1061,"children":1062},{},[],{"type":43,"value":1064},"Link the ",{"type":38,"tag":86,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":43,"value":959},{"type":43,"value":1071},", never the ",{"type":38,"tag":86,"props":1073,"children":1075},{"className":1074},[],[1076],{"type":43,"value":933},{"type":43,"value":1078}," — the markdown is what you just emitted.\nThe ",{"type":38,"tag":86,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":43,"value":91},{"type":43,"value":1085}," protocol matters: a bare path gets intercepted by an editor.",{"type":38,"tag":363,"props":1087,"children":1088},{},[],{"type":43,"value":1090},"The HTML carries more than the markdown, deliberately: the three-level route\ntree, the entry\u002Fcampaign\u002Fsource filters, the window switcher and the PDF\nexport. Do not try to mirror it into chat.",{"type":38,"tag":107,"props":1092,"children":1094},{"id":1093},"what-the-report-contains",[1095],{"type":43,"value":1096},"What the report contains",{"type":38,"tag":39,"props":1098,"children":1099},{},[1100,1105],{"type":38,"tag":51,"props":1101,"children":1102},{},[1103],{"type":43,"value":1104},"Engagement depth",{"type":43,"value":1106}," is the metric everything else hangs off. A visit is a run of events from one visitor with no gap over the configured session gap. A qualifying action is a pageview of a URL not already seen in that visit that cleared the engaged-time bar, or a download, or a video play. Depth is the count of those, minimum 1. The headline is the share of visits at depth 2 or more.",{"type":38,"tag":39,"props":1108,"children":1109},{},[1110,1112,1117],{"type":43,"value":1111},"Alongside it the report always shows the same share computed ",{"type":38,"tag":51,"props":1113,"children":1114},{},[1115],{"type":43,"value":1116},"without",{"type":43,"value":1118}," the engaged-time rule. That contrast is not decoration: it is what demonstrates the metric is not ordinary pages per session, and the engaged-time signal comes from Parse.ly heartbeats arriving as events in the DPL, which is the commercial differentiator.",{"type":38,"tag":39,"props":1120,"children":1121},{},[1122],{"type":43,"value":1123},"The headline will be low. Never inflate it by excluding single-action visits from the denominator, and never count non-engaged pageviews toward it. It is a baseline to improve.",{"type":38,"tag":39,"props":1125,"children":1126},{},[1127,1132,1134,1139,1141,1146,1148,1154,1156,1162,1164,1169],{"type":38,"tag":51,"props":1128,"children":1129},{},[1130],{"type":43,"value":1131},"Route tree",{"type":43,"value":1133},", anchored on a selectable entry point and going forward three levels. Branches are ",{"type":38,"tag":51,"props":1135,"children":1136},{},[1137],{"type":43,"value":1138},"sections",{"type":43,"value":1140},", so it reads as \"of the visits that landed on ",{"type":38,"tag":86,"props":1142,"children":1144},{"className":1143},[],[1145],{"type":43,"value":493},{"type":43,"value":1147},", how many went on to ",{"type":38,"tag":86,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":43,"value":1153},"\u002Fnews",{"type":43,"value":1155},", to ",{"type":38,"tag":86,"props":1157,"children":1159},{"className":1158},[],[1160],{"type":43,"value":1161},"\u002Fsupport",{"type":43,"value":1163},", or to another page inside ",{"type":38,"tag":86,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":43,"value":493},{"type":43,"value":1170},"\". Exit is a first-class branch at every level, listed first, with its own share and volume, because it is the largest outcome. No conversion gating: every path is traced whether or not it ends in a conversion. That gating is the specific limitation of Parse.ly's own Journeys view that this section exists to fix.",{"type":38,"tag":39,"props":1172,"children":1173},{},[1174,1179],{"type":38,"tag":51,"props":1175,"children":1176},{},[1177],{"type":43,"value":1178},"Loss map",{"type":43,"value":1180},", pages ranked by the share of visits that end on them, with the most common next step for those who did continue.",{"type":38,"tag":39,"props":1182,"children":1183},{},[1184,1189],{"type":38,"tag":51,"props":1185,"children":1186},{},[1187],{"type":43,"value":1188},"Section scoreboard",{"type":43,"value":1190},", with size in one column and pull in the other. The finding lives in the contrast, not in either column alone. Sections are derived, so this table needs no list of what the site contains.",{"type":38,"tag":39,"props":1192,"children":1193},{},[1194,1199],{"type":38,"tag":51,"props":1195,"children":1196},{},[1197],{"type":43,"value":1198},"Site shape",{"type":43,"value":1200},", measured rather than assumed. Sections read correctly where the site has a section layer and degenerate on a flat site, where every article sits at the root and becomes a section of one page. Both are real shapes; the report states which one it is looking at instead of applying a threshold that would make a flat site look structured.",{"type":38,"tag":39,"props":1202,"children":1203},{},[1204,1209],{"type":38,"tag":51,"props":1205,"children":1206},{},[1207],{"type":43,"value":1208},"Composition tiles",{"type":43,"value":1210},", so the headline is auditable: engaged against loaded pageviews, downloads, video plays, visits, unique visitors, median engaged time.",{"type":38,"tag":39,"props":1212,"children":1213},{},[1214,1219],{"type":38,"tag":51,"props":1215,"children":1216},{},[1217],{"type":43,"value":1218},"Traffic set aside.",{"type":43,"value":1220}," Blocs configured as traffic-quality exclusions are reported with their own volume and headline rather than dropped. Where a signal is genuinely absent, say which signal is missing and what it would unlock. Never render a silent zero.",{"type":38,"tag":107,"props":1222,"children":1224},{"id":1223},"filter-scope-decided-do-not-change",[1225],{"type":43,"value":1226},"Filter scope — decided, do not change",{"type":38,"tag":1228,"props":1229,"children":1230},"table",{},[1231,1250],{"type":38,"tag":1232,"props":1233,"children":1234},"thead",{},[1235],{"type":38,"tag":1236,"props":1237,"children":1238},"tr",{},[1239,1245],{"type":38,"tag":1240,"props":1241,"children":1242},"th",{},[1243],{"type":43,"value":1244},"Filter",{"type":38,"tag":1240,"props":1246,"children":1247},{},[1248],{"type":43,"value":1249},"Scope",{"type":38,"tag":1251,"props":1252,"children":1253},"tbody",{},[1254,1273,1286,1298],{"type":38,"tag":1236,"props":1255,"children":1256},{},[1257,1263],{"type":38,"tag":1258,"props":1259,"children":1260},"td",{},[1261],{"type":43,"value":1262},"Time window (7 \u002F 30 \u002F 60 \u002F 90 days)",{"type":38,"tag":1258,"props":1264,"children":1265},{},[1266,1271],{"type":38,"tag":51,"props":1267,"children":1268},{},[1269],{"type":43,"value":1270},"Global.",{"type":43,"value":1272}," Every section recomputes. A header saying \"last 7 days\" while any number on the page still reflects 60 is a correctness bug, not a gap.",{"type":38,"tag":1236,"props":1274,"children":1275},{},[1276,1281],{"type":38,"tag":1258,"props":1277,"children":1278},{},[1279],{"type":43,"value":1280},"Entry point",{"type":38,"tag":1258,"props":1282,"children":1283},{},[1284],{"type":43,"value":1285},"Local to the route tree",{"type":38,"tag":1236,"props":1287,"children":1288},{},[1289,1294],{"type":38,"tag":1258,"props":1290,"children":1291},{},[1292],{"type":43,"value":1293},"Campaign",{"type":38,"tag":1258,"props":1295,"children":1296},{},[1297],{"type":43,"value":1285},{"type":38,"tag":1236,"props":1299,"children":1300},{},[1301,1306],{"type":38,"tag":1258,"props":1302,"children":1303},{},[1304],{"type":43,"value":1305},"Entry source",{"type":38,"tag":1258,"props":1307,"children":1308},{},[1309],{"type":43,"value":1285},{"type":38,"tag":39,"props":1311,"children":1312},{},[1313],{"type":43,"value":1314},"Every window compares against the immediately prior window of equal length, anchored on the latest complete day in the data, never on today.",{"type":38,"tag":107,"props":1316,"children":1318},{"id":1317},"follow-up-questions",[1319],{"type":43,"value":1320},"Follow-up questions",{"type":38,"tag":39,"props":1322,"children":1323},{},[1324],{"type":43,"value":1325},"The report is a starting point, not the product. There are two places a\nfollow-up can be answered, and they are good at different things.",{"type":38,"tag":39,"props":1327,"children":1328},{},[1329,1334,1336,1342],{"type":38,"tag":51,"props":1330,"children":1331},{},[1332],{"type":43,"value":1333},"The question box on the served page",{"type":43,"value":1335}," is you. It hands the question to\n",{"type":38,"tag":86,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":43,"value":1341},"claude",{"type":43,"value":1343}," verbatim and renders the reply, so the user gets the command line\nwithout leaving the report. Nothing is added to the question and nothing is\npre-answered; whatever you would say in a terminal is what appears in the box.\nPoint the user at it rather than asking them to switch windows.",{"type":38,"tag":39,"props":1345,"children":1346},{},[1347,1349,1355],{"type":43,"value":1348},"It runs headless with an explicit read-only allow-list, so a question can read\nthe data but cannot change anything. If the box reports that tools were denied,\nthe machine's permission settings are stricter than the default; starting the\nserver with ",{"type":38,"tag":86,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":43,"value":1354},"JOURNEY_ASK_PERMISSION_MODE=bypassPermissions",{"type":43,"value":1356}," is the way out.",{"type":38,"tag":39,"props":1358,"children":1359},{},[1360,1365],{"type":38,"tag":51,"props":1361,"children":1362},{},[1363],{"type":43,"value":1364},"You, here in the conversation",{"type":43,"value":1366},", for anything it cannot do: an odd cut, a\ncombination of filters, a question that needs judgement rather than a table.\nQuery the same derived tables rather than guessing or re-reading raw parquet.\nBuild them once, then use SQL:",{"type":38,"tag":130,"props":1368,"children":1370},{"className":132,"code":1369,"language":134,"meta":135,"style":135},"\"$plugin_python\" - \u003C\u003C'PY'\nimport sys, json\nsys.path.insert(0, \"PLUGIN_ROOT\u002Fscripts\u002Fdb\u002Flib\")\nimport catalog, sessions\ncfg = json.load(open(\"CONFIG_PATH\"))\ncon = catalog.connect(); catalog.ensure_view(con, \"dpl\", \"events\")\nlo, hi = sessions.available_days(con, cfg[\"site\"])\nsessions.build(con, cfg, site=cfg[\"site\"], day_start=lo, day_end=hi)\n# ... then query j_visit \u002F j_step \u002F j_pv \u002F j_sess\nPY\n",[1371],{"type":38,"tag":86,"props":1372,"children":1373},{"__ignoreMap":135},[1374,1404,1412,1420,1428,1436,1444,1452,1461,1470],{"type":38,"tag":141,"props":1375,"children":1376},{"class":143,"line":22},[1377,1381,1385,1389,1394,1399],{"type":38,"tag":141,"props":1378,"children":1379},{"style":615},[1380],{"type":43,"value":329},{"type":38,"tag":141,"props":1382,"children":1383},{"style":147},[1384],{"type":43,"value":324},{"type":38,"tag":141,"props":1386,"children":1387},{"style":615},[1388],{"type":43,"value":329},{"type":38,"tag":141,"props":1390,"children":1391},{"style":184},[1392],{"type":43,"value":1393}," -",{"type":38,"tag":141,"props":1395,"children":1396},{"style":153},[1397],{"type":43,"value":1398}," \u003C\u003C",{"type":38,"tag":141,"props":1400,"children":1401},{"style":153},[1402],{"type":43,"value":1403},"'PY'\n",{"type":38,"tag":141,"props":1405,"children":1406},{"class":143,"line":205},[1407],{"type":38,"tag":141,"props":1408,"children":1409},{"style":184},[1410],{"type":43,"value":1411},"import sys, json\n",{"type":38,"tag":141,"props":1413,"children":1414},{"class":143,"line":303},[1415],{"type":38,"tag":141,"props":1416,"children":1417},{"style":184},[1418],{"type":43,"value":1419},"sys.path.insert(0, \"PLUGIN_ROOT\u002Fscripts\u002Fdb\u002Flib\")\n",{"type":38,"tag":141,"props":1421,"children":1422},{"class":143,"line":886},[1423],{"type":38,"tag":141,"props":1424,"children":1425},{"style":184},[1426],{"type":43,"value":1427},"import catalog, sessions\n",{"type":38,"tag":141,"props":1429,"children":1430},{"class":143,"line":912},[1431],{"type":38,"tag":141,"props":1432,"children":1433},{"style":184},[1434],{"type":43,"value":1435},"cfg = json.load(open(\"CONFIG_PATH\"))\n",{"type":38,"tag":141,"props":1437,"children":1438},{"class":143,"line":940},[1439],{"type":38,"tag":141,"props":1440,"children":1441},{"style":184},[1442],{"type":43,"value":1443},"con = catalog.connect(); catalog.ensure_view(con, \"dpl\", \"events\")\n",{"type":38,"tag":141,"props":1445,"children":1446},{"class":143,"line":966},[1447],{"type":38,"tag":141,"props":1448,"children":1449},{"style":184},[1450],{"type":43,"value":1451},"lo, hi = sessions.available_days(con, cfg[\"site\"])\n",{"type":38,"tag":141,"props":1453,"children":1455},{"class":143,"line":1454},8,[1456],{"type":38,"tag":141,"props":1457,"children":1458},{"style":184},[1459],{"type":43,"value":1460},"sessions.build(con, cfg, site=cfg[\"site\"], day_start=lo, day_end=hi)\n",{"type":38,"tag":141,"props":1462,"children":1464},{"class":143,"line":1463},9,[1465],{"type":38,"tag":141,"props":1466,"children":1467},{"style":184},[1468],{"type":43,"value":1469},"# ... then query j_visit \u002F j_step \u002F j_pv \u002F j_sess\n",{"type":38,"tag":141,"props":1471,"children":1473},{"class":143,"line":1472},10,[1474],{"type":38,"tag":141,"props":1475,"children":1476},{"style":153},[1477],{"type":43,"value":1478},"PY\n",{"type":38,"tag":39,"props":1480,"children":1481},{},[1482],{"type":43,"value":1483},"The tables, and what one row means in each:",{"type":38,"tag":1228,"props":1485,"children":1486},{},[1487,1508],{"type":38,"tag":1232,"props":1488,"children":1489},{},[1490],{"type":38,"tag":1236,"props":1491,"children":1492},{},[1493,1498,1503],{"type":38,"tag":1240,"props":1494,"children":1495},{},[1496],{"type":43,"value":1497},"Table",{"type":38,"tag":1240,"props":1499,"children":1500},{},[1501],{"type":43,"value":1502},"One row is",{"type":38,"tag":1240,"props":1504,"children":1505},{},[1506],{"type":43,"value":1507},"Key columns",{"type":38,"tag":1251,"props":1509,"children":1510},{},[1511,1600,1641,1672,1712],{"type":38,"tag":1236,"props":1512,"children":1513},{},[1514,1523,1528],{"type":38,"tag":1258,"props":1515,"children":1516},{},[1517],{"type":38,"tag":86,"props":1518,"children":1520},{"className":1519},[],[1521],{"type":43,"value":1522},"j_pv",{"type":38,"tag":1258,"props":1524,"children":1525},{},[1526],{"type":43,"value":1527},"a pageview",{"type":38,"tag":1258,"props":1529,"children":1530},{},[1531,1537,1538,1544,1545,1551,1552,1558,1559,1565,1566,1572,1573,1579,1580,1586,1587,1593,1594],{"type":38,"tag":86,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":43,"value":1536},"vsid",{"type":43,"value":399},{"type":38,"tag":86,"props":1539,"children":1541},{"className":1540},[],[1542],{"type":43,"value":1543},"ts",{"type":43,"value":399},{"type":38,"tag":86,"props":1546,"children":1548},{"className":1547},[],[1549],{"type":43,"value":1550},"url_path",{"type":43,"value":399},{"type":38,"tag":86,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":43,"value":1557},"title",{"type":43,"value":399},{"type":38,"tag":86,"props":1560,"children":1562},{"className":1561},[],[1563],{"type":43,"value":1564},"engaged_seconds",{"type":43,"value":399},{"type":38,"tag":86,"props":1567,"children":1569},{"className":1568},[],[1570],{"type":43,"value":1571},"section",{"type":43,"value":399},{"type":38,"tag":86,"props":1574,"children":1576},{"className":1575},[],[1577],{"type":43,"value":1578},"is_section_landing",{"type":43,"value":399},{"type":38,"tag":86,"props":1581,"children":1583},{"className":1582},[],[1584],{"type":43,"value":1585},"source",{"type":43,"value":399},{"type":38,"tag":86,"props":1588,"children":1590},{"className":1589},[],[1591],{"type":43,"value":1592},"campaign",{"type":43,"value":399},{"type":38,"tag":86,"props":1595,"children":1597},{"className":1596},[],[1598],{"type":43,"value":1599},"exclusion",{"type":38,"tag":1236,"props":1601,"children":1602},{},[1603,1612,1617],{"type":38,"tag":1258,"props":1604,"children":1605},{},[1606],{"type":38,"tag":86,"props":1607,"children":1609},{"className":1608},[],[1610],{"type":43,"value":1611},"j_act",{"type":38,"tag":1258,"props":1613,"children":1614},{},[1615],{"type":43,"value":1616},"anything that can earn a point",{"type":38,"tag":1258,"props":1618,"children":1619},{},[1620,1626,1628,1634,1635],{"type":38,"tag":86,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":43,"value":1625},"kind",{"type":43,"value":1627}," in pageview \u002F download \u002F videostart, ",{"type":38,"tag":86,"props":1629,"children":1631},{"className":1630},[],[1632],{"type":43,"value":1633},"conv_type",{"type":43,"value":399},{"type":38,"tag":86,"props":1636,"children":1638},{"className":1637},[],[1639],{"type":43,"value":1640},"conv_label",{"type":38,"tag":1236,"props":1642,"children":1643},{},[1644,1653,1663],{"type":38,"tag":1258,"props":1645,"children":1646},{},[1647],{"type":38,"tag":86,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":43,"value":1652},"j_sess",{"type":38,"tag":1258,"props":1654,"children":1655},{},[1656,1661],{"type":38,"tag":86,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":43,"value":1611},{"type":43,"value":1662}," plus a visit id",{"type":38,"tag":1258,"props":1664,"children":1665},{},[1666],{"type":38,"tag":86,"props":1667,"children":1669},{"className":1668},[],[1670],{"type":43,"value":1671},"sid",{"type":38,"tag":1236,"props":1673,"children":1674},{},[1675,1684,1689],{"type":38,"tag":1258,"props":1676,"children":1677},{},[1678],{"type":38,"tag":86,"props":1679,"children":1681},{"className":1680},[],[1682],{"type":43,"value":1683},"j_step",{"type":38,"tag":1258,"props":1685,"children":1686},{},[1687],{"type":43,"value":1688},"a distinct URL within one visit, in order",{"type":38,"tag":1258,"props":1690,"children":1691},{},[1692,1698,1700,1706,1707],{"type":38,"tag":86,"props":1693,"children":1695},{"className":1694},[],[1696],{"type":43,"value":1697},"step_idx",{"type":43,"value":1699}," (0 is the entry), ",{"type":38,"tag":86,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":43,"value":1705},"qualifies",{"type":43,"value":399},{"type":38,"tag":86,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":43,"value":1564},{"type":38,"tag":1236,"props":1713,"children":1714},{},[1715,1724,1729],{"type":38,"tag":1258,"props":1716,"children":1717},{},[1718],{"type":38,"tag":86,"props":1719,"children":1721},{"className":1720},[],[1722],{"type":43,"value":1723},"j_visit",{"type":38,"tag":1258,"props":1725,"children":1726},{},[1727],{"type":43,"value":1728},"a visit",{"type":38,"tag":1258,"props":1730,"children":1731},{},[1732,1738,1739,1745,1746,1752,1753,1758,1759,1764,1765,1771,1772,1778,1779,1785,1786,1792,1793,1799,1800,1806,1807],{"type":38,"tag":86,"props":1733,"children":1735},{"className":1734},[],[1736],{"type":43,"value":1737},"entry_path",{"type":43,"value":399},{"type":38,"tag":86,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":43,"value":1744},"entry_title",{"type":43,"value":399},{"type":38,"tag":86,"props":1747,"children":1749},{"className":1748},[],[1750],{"type":43,"value":1751},"entry_section",{"type":43,"value":399},{"type":38,"tag":86,"props":1754,"children":1756},{"className":1755},[],[1757],{"type":43,"value":1585},{"type":43,"value":399},{"type":38,"tag":86,"props":1760,"children":1762},{"className":1761},[],[1763],{"type":43,"value":1592},{"type":43,"value":399},{"type":38,"tag":86,"props":1766,"children":1768},{"className":1767},[],[1769],{"type":43,"value":1770},"depth_qualified",{"type":43,"value":399},{"type":38,"tag":86,"props":1773,"children":1775},{"className":1774},[],[1776],{"type":43,"value":1777},"depth_raw",{"type":43,"value":399},{"type":38,"tag":86,"props":1780,"children":1782},{"className":1781},[],[1783],{"type":43,"value":1784},"loaded_pageviews",{"type":43,"value":399},{"type":38,"tag":86,"props":1787,"children":1789},{"className":1788},[],[1790],{"type":43,"value":1791},"downloads",{"type":43,"value":399},{"type":38,"tag":86,"props":1794,"children":1796},{"className":1795},[],[1797],{"type":43,"value":1798},"video_plays",{"type":43,"value":399},{"type":38,"tag":86,"props":1801,"children":1803},{"className":1802},[],[1804],{"type":43,"value":1805},"max_step_idx",{"type":43,"value":399},{"type":38,"tag":86,"props":1808,"children":1810},{"className":1809},[],[1811],{"type":43,"value":1599},{"type":38,"tag":39,"props":1813,"children":1814},{},[1815,1817,1823],{"type":43,"value":1816},"Filter ",{"type":38,"tag":86,"props":1818,"children":1820},{"className":1819},[],[1821],{"type":43,"value":1822},"exclusion IS NULL",{"type":43,"value":1824}," to match the report's clean base. Three worked examples:",{"type":38,"tag":130,"props":1826,"children":1830},{"className":1827,"code":1828,"language":1829,"meta":135,"style":135},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- which pages send the most traffic onward into a different section\nSELECT s.title, count(*) AS onward\nFROM j_step s JOIN j_step n\n  ON n.vsid = s.vsid AND n.sid = s.sid AND n.step_idx = s.step_idx + 1\nJOIN j_visit v ON v.vsid = s.vsid AND v.sid = s.sid\nWHERE v.exclusion IS NULL AND s.section \u003C> n.section\nGROUP BY 1 ORDER BY onward DESC LIMIT 20;\n\n-- entry pages with the worst loss rate, this month against last\nSELECT v.entry_title,\n       date_trunc('month', v.started_at) AS month,\n       count(*) AS visits,\n       round(100.0 * avg(CASE WHEN v.max_step_idx = 0 THEN 1 ELSE 0 END), 1) AS loss_pct\nFROM j_visit v WHERE v.exclusion IS NULL\nGROUP BY 1, 2 HAVING count(*) > 200 ORDER BY 1, 2;\n\n-- for campaign traffic, the most common three-page path\nSELECT s0.url_path AS p1, s1.url_path AS p2, s2.url_path AS p3, count(*) AS visits\nFROM j_visit v\nJOIN j_step s0 ON s0.vsid = v.vsid AND s0.sid = v.sid AND s0.step_idx = 0\nJOIN j_step s1 ON s1.vsid = v.vsid AND s1.sid = v.sid AND s1.step_idx = 1\nJOIN j_step s2 ON s2.vsid = v.vsid AND s2.sid = v.sid AND s2.step_idx = 2\nWHERE v.exclusion IS NULL AND v.campaign = 'PaidCampaign'\nGROUP BY 1, 2, 3 ORDER BY visits DESC LIMIT 20;\n","sql",[1831],{"type":38,"tag":86,"props":1832,"children":1833},{"__ignoreMap":135},[1834,1842,1850,1858,1866,1874,1882,1890,1899,1907,1915,1924,1933,1942,1951,1960,1968,1977,1986,1995,2004,2013,2022,2031],{"type":38,"tag":141,"props":1835,"children":1836},{"class":143,"line":22},[1837],{"type":38,"tag":141,"props":1838,"children":1839},{},[1840],{"type":43,"value":1841},"-- which pages send the most traffic onward into a different section\n",{"type":38,"tag":141,"props":1843,"children":1844},{"class":143,"line":205},[1845],{"type":38,"tag":141,"props":1846,"children":1847},{},[1848],{"type":43,"value":1849},"SELECT s.title, count(*) AS onward\n",{"type":38,"tag":141,"props":1851,"children":1852},{"class":143,"line":303},[1853],{"type":38,"tag":141,"props":1854,"children":1855},{},[1856],{"type":43,"value":1857},"FROM j_step s JOIN j_step n\n",{"type":38,"tag":141,"props":1859,"children":1860},{"class":143,"line":886},[1861],{"type":38,"tag":141,"props":1862,"children":1863},{},[1864],{"type":43,"value":1865},"  ON n.vsid = s.vsid AND n.sid = s.sid AND n.step_idx = s.step_idx + 1\n",{"type":38,"tag":141,"props":1867,"children":1868},{"class":143,"line":912},[1869],{"type":38,"tag":141,"props":1870,"children":1871},{},[1872],{"type":43,"value":1873},"JOIN j_visit v ON v.vsid = s.vsid AND v.sid = s.sid\n",{"type":38,"tag":141,"props":1875,"children":1876},{"class":143,"line":940},[1877],{"type":38,"tag":141,"props":1878,"children":1879},{},[1880],{"type":43,"value":1881},"WHERE v.exclusion IS NULL AND s.section \u003C> n.section\n",{"type":38,"tag":141,"props":1883,"children":1884},{"class":143,"line":966},[1885],{"type":38,"tag":141,"props":1886,"children":1887},{},[1888],{"type":43,"value":1889},"GROUP BY 1 ORDER BY onward DESC LIMIT 20;\n",{"type":38,"tag":141,"props":1891,"children":1892},{"class":143,"line":1454},[1893],{"type":38,"tag":141,"props":1894,"children":1896},{"emptyLinePlaceholder":1895},true,[1897],{"type":43,"value":1898},"\n",{"type":38,"tag":141,"props":1900,"children":1901},{"class":143,"line":1463},[1902],{"type":38,"tag":141,"props":1903,"children":1904},{},[1905],{"type":43,"value":1906},"-- entry pages with the worst loss rate, this month against last\n",{"type":38,"tag":141,"props":1908,"children":1909},{"class":143,"line":1472},[1910],{"type":38,"tag":141,"props":1911,"children":1912},{},[1913],{"type":43,"value":1914},"SELECT v.entry_title,\n",{"type":38,"tag":141,"props":1916,"children":1918},{"class":143,"line":1917},11,[1919],{"type":38,"tag":141,"props":1920,"children":1921},{},[1922],{"type":43,"value":1923},"       date_trunc('month', v.started_at) AS month,\n",{"type":38,"tag":141,"props":1925,"children":1927},{"class":143,"line":1926},12,[1928],{"type":38,"tag":141,"props":1929,"children":1930},{},[1931],{"type":43,"value":1932},"       count(*) AS visits,\n",{"type":38,"tag":141,"props":1934,"children":1936},{"class":143,"line":1935},13,[1937],{"type":38,"tag":141,"props":1938,"children":1939},{},[1940],{"type":43,"value":1941},"       round(100.0 * avg(CASE WHEN v.max_step_idx = 0 THEN 1 ELSE 0 END), 1) AS loss_pct\n",{"type":38,"tag":141,"props":1943,"children":1945},{"class":143,"line":1944},14,[1946],{"type":38,"tag":141,"props":1947,"children":1948},{},[1949],{"type":43,"value":1950},"FROM j_visit v WHERE v.exclusion IS NULL\n",{"type":38,"tag":141,"props":1952,"children":1954},{"class":143,"line":1953},15,[1955],{"type":38,"tag":141,"props":1956,"children":1957},{},[1958],{"type":43,"value":1959},"GROUP BY 1, 2 HAVING count(*) > 200 ORDER BY 1, 2;\n",{"type":38,"tag":141,"props":1961,"children":1963},{"class":143,"line":1962},16,[1964],{"type":38,"tag":141,"props":1965,"children":1966},{"emptyLinePlaceholder":1895},[1967],{"type":43,"value":1898},{"type":38,"tag":141,"props":1969,"children":1971},{"class":143,"line":1970},17,[1972],{"type":38,"tag":141,"props":1973,"children":1974},{},[1975],{"type":43,"value":1976},"-- for campaign traffic, the most common three-page path\n",{"type":38,"tag":141,"props":1978,"children":1980},{"class":143,"line":1979},18,[1981],{"type":38,"tag":141,"props":1982,"children":1983},{},[1984],{"type":43,"value":1985},"SELECT s0.url_path AS p1, s1.url_path AS p2, s2.url_path AS p3, count(*) AS visits\n",{"type":38,"tag":141,"props":1987,"children":1989},{"class":143,"line":1988},19,[1990],{"type":38,"tag":141,"props":1991,"children":1992},{},[1993],{"type":43,"value":1994},"FROM j_visit v\n",{"type":38,"tag":141,"props":1996,"children":1998},{"class":143,"line":1997},20,[1999],{"type":38,"tag":141,"props":2000,"children":2001},{},[2002],{"type":43,"value":2003},"JOIN j_step s0 ON s0.vsid = v.vsid AND s0.sid = v.sid AND s0.step_idx = 0\n",{"type":38,"tag":141,"props":2005,"children":2007},{"class":143,"line":2006},21,[2008],{"type":38,"tag":141,"props":2009,"children":2010},{},[2011],{"type":43,"value":2012},"JOIN j_step s1 ON s1.vsid = v.vsid AND s1.sid = v.sid AND s1.step_idx = 1\n",{"type":38,"tag":141,"props":2014,"children":2016},{"class":143,"line":2015},22,[2017],{"type":38,"tag":141,"props":2018,"children":2019},{},[2020],{"type":43,"value":2021},"JOIN j_step s2 ON s2.vsid = v.vsid AND s2.sid = v.sid AND s2.step_idx = 2\n",{"type":38,"tag":141,"props":2023,"children":2025},{"class":143,"line":2024},23,[2026],{"type":38,"tag":141,"props":2027,"children":2028},{},[2029],{"type":43,"value":2030},"WHERE v.exclusion IS NULL AND v.campaign = 'PaidCampaign'\n",{"type":38,"tag":141,"props":2032,"children":2034},{"class":143,"line":2033},24,[2035],{"type":38,"tag":141,"props":2036,"children":2037},{},[2038],{"type":43,"value":2039},"GROUP BY 1, 2, 3 ORDER BY visits DESC LIMIT 20;\n",{"type":38,"tag":39,"props":2041,"children":2042},{},[2043],{"type":43,"value":2044},"Answer follow-ups in prose with the numbers inline. Two rules carry over from the report itself: state the volume behind any rate you quote, and if the answer is that the data cannot support the question, say that instead of producing a number.",{"type":38,"tag":107,"props":2046,"children":2048},{"id":2047},"constraints-re-stated-for-emphasis",[2049],{"type":43,"value":2050},"Constraints (re-stated for emphasis)",{"type":38,"tag":2052,"props":2053,"children":2054},"ul",{},[2055,2060,2071,2076,2094,2099],{"type":38,"tag":119,"props":2056,"children":2057},{},[2058],{"type":43,"value":2059},"No \"Running the journey report…\" preamble, no \"Two things stand out…\" postscript.",{"type":38,"tag":119,"props":2061,"children":2062},{},[2063,2065,2070],{"type":43,"value":2064},"If a consistency check fails, surface the error and stop. Do not render partial output and do not reach for ",{"type":38,"tag":86,"props":2066,"children":2068},{"className":2067},[],[2069],{"type":43,"value":1029},{"type":43,"value":252},{"type":38,"tag":119,"props":2072,"children":2073},{},[2074],{"type":43,"value":2075},"If the lake has no events for the configured site, say so in one line and stop.",{"type":38,"tag":119,"props":2077,"children":2078},{},[2079,2081,2086,2088,2093],{"type":43,"value":2080},"The trailing link points at the ",{"type":38,"tag":86,"props":2082,"children":2084},{"className":2083},[],[2085],{"type":43,"value":959},{"type":43,"value":2087}," from step 4, never the ",{"type":38,"tag":86,"props":2089,"children":2091},{"className":2090},[],[2092],{"type":43,"value":933},{"type":43,"value":252},{"type":38,"tag":119,"props":2095,"children":2096},{},[2097],{"type":43,"value":2098},"Sections are derived from the URL and must stay that way. If you find yourself wanting to write a list of the site's sections, or to read one from page metadata, stop: that is how this became a bespoke report for one customer the first time.",{"type":38,"tag":119,"props":2100,"children":2101},{},[2102],{"type":43,"value":2103},"There is one config file and the plugin already owns it. Do not add a second.",{"type":38,"tag":2105,"props":2106,"children":2107},"style",{},[2108],{"type":43,"value":2109},"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":2111,"total":2301},[2112,2133,2152,2166,2183,2198,2212,2227,2244,2255,2270,2286],{"slug":2113,"name":2113,"fn":2114,"description":2115,"org":2116,"tags":2117,"stars":2130,"repoUrl":2131,"updatedAt":2132},"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},[2118,2121,2124,2127],{"name":2119,"slug":2120,"type":15},"Frontend","frontend",{"name":2122,"slug":2123,"type":15},"Productivity","productivity",{"name":2125,"slug":2126,"type":15},"UX Copy","ux-copy",{"name":2128,"slug":2129,"type":15},"UX Design","ux-design",484,"https:\u002F\u002Fgithub.com\u002FAutomattic\u002Fstudio","2026-05-06T05:40:01.516544",{"slug":2134,"name":2134,"fn":2135,"description":2136,"org":2137,"tags":2138,"stars":2130,"repoUrl":2131,"updatedAt":2151},"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},[2139,2142,2145,2148],{"name":2140,"slug":2141,"type":15},"Block Editor","block-editor",{"name":2143,"slug":2144,"type":15},"CSS","css",{"name":2146,"slug":2147,"type":15},"HTML","html",{"name":2149,"slug":2150,"type":15},"WordPress","wordpress","2026-05-27T07:01:55.629681",{"slug":2153,"name":2153,"fn":2154,"description":2155,"org":2156,"tags":2157,"stars":2130,"repoUrl":2131,"updatedAt":2165},"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},[2158,2161,2164],{"name":2159,"slug":2160,"type":15},"Pricing","pricing",{"name":2162,"slug":2163,"type":15},"Reference","reference",{"name":2149,"slug":2150,"type":15},"2026-07-02T07:42:33.654791",{"slug":2167,"name":2167,"fn":2168,"description":2169,"org":2170,"tags":2171,"stars":2130,"repoUrl":2131,"updatedAt":2182},"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},[2172,2175,2178,2181],{"name":2173,"slug":2174,"type":15},"CMS","cms",{"name":2176,"slug":2177,"type":15},"Migration","migration",{"name":2179,"slug":2180,"type":15},"Web Development","web-development",{"name":2149,"slug":2150,"type":15},"2026-07-09T06:47:33.454311",{"slug":2184,"name":2184,"fn":2185,"description":2186,"org":2187,"tags":2188,"stars":2130,"repoUrl":2131,"updatedAt":2197},"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},[2189,2192,2193,2196],{"name":2190,"slug":2191,"type":15},"Audit","audit",{"name":2119,"slug":2120,"type":15},{"name":2194,"slug":2195,"type":15},"Performance","performance",{"name":2149,"slug":2150,"type":15},"2026-05-06T05:40:06.433267",{"slug":2199,"name":2199,"fn":2200,"description":2201,"org":2202,"tags":2203,"stars":2130,"repoUrl":2131,"updatedAt":2211},"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},[2204,2207,2210],{"name":2205,"slug":2206,"type":15},"Content Creation","content-creation",{"name":2208,"slug":2209,"type":15},"Plugin Development","plugin-development",{"name":2149,"slug":2150,"type":15},"2026-05-27T07:01:58.249105",{"slug":2213,"name":2213,"fn":2214,"description":2215,"org":2216,"tags":2217,"stars":2130,"repoUrl":2131,"updatedAt":2226},"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},[2218,2219,2222,2225],{"name":2190,"slug":2191,"type":15},{"name":2220,"slug":2221,"type":15},"Marketing","marketing",{"name":2223,"slug":2224,"type":15},"SEO","seo",{"name":2149,"slug":2150,"type":15},"2026-05-06T05:40:05.196367",{"slug":2228,"name":2228,"fn":2229,"description":2230,"org":2231,"tags":2232,"stars":2130,"repoUrl":2131,"updatedAt":2243},"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},[2233,2236,2239,2242],{"name":2234,"slug":2235,"type":15},"Design","design",{"name":2237,"slug":2238,"type":15},"Product Management","product-management",{"name":2240,"slug":2241,"type":15},"Specs","specs",{"name":2149,"slug":2150,"type":15},"2026-05-06T05:40:02.739409",{"slug":2245,"name":2245,"fn":2246,"description":2247,"org":2248,"tags":2249,"stars":2130,"repoUrl":2131,"updatedAt":2254},"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},[2250,2253],{"name":2251,"slug":2252,"type":15},"CLI","cli",{"name":2149,"slug":2150,"type":15},"2026-04-06T18:02:57.150231",{"slug":2256,"name":2256,"fn":2257,"description":2258,"org":2259,"tags":2260,"stars":2130,"repoUrl":2131,"updatedAt":2269},"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},[2261,2264,2267,2268],{"name":2262,"slug":2263,"type":15},"Content Strategy","content-strategy",{"name":2265,"slug":2266,"type":15},"Data Cleaning","data-cleaning",{"name":2223,"slug":2224,"type":15},{"name":2149,"slug":2150,"type":15},"2026-05-06T05:40:03.966799",{"slug":2271,"name":2271,"fn":2272,"description":2273,"org":2274,"tags":2275,"stars":2130,"repoUrl":2131,"updatedAt":2285},"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},[2276,2279,2280,2283],{"name":2277,"slug":2278,"type":15},"Animation","animation",{"name":2234,"slug":2235,"type":15},{"name":2281,"slug":2282,"type":15},"Typography","typography",{"name":2284,"slug":2271,"type":15},"Visual Design","2026-07-24T05:40:57.887452",{"slug":2287,"name":2287,"fn":2288,"description":2289,"org":2290,"tags":2291,"stars":2130,"repoUrl":2131,"updatedAt":2300},"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},[2292,2295,2296,2299],{"name":2293,"slug":2294,"type":15},"Debugging","debugging",{"name":2119,"slug":2120,"type":15},{"name":2297,"slug":2298,"type":15},"Screenshots","screenshots",{"name":2284,"slug":2271,"type":15},"2026-06-06T07:09:59.809812",83,{"items":2303,"total":1454},[2304,2320,2332,2344,2353,2359,2371],{"slug":2305,"name":2305,"fn":2306,"description":2307,"org":2308,"tags":2309,"stars":22,"repoUrl":23,"updatedAt":2319},"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},[2310,2313,2316],{"name":2311,"slug":2312,"type":15},"AWS","aws",{"name":2314,"slug":2315,"type":15},"Configuration","configuration",{"name":2317,"slug":2318,"type":15},"Operations","operations","2026-07-24T06:08:49.942979",{"slug":2321,"name":2321,"fn":2322,"description":2323,"org":2324,"tags":2325,"stars":22,"repoUrl":23,"updatedAt":2331},"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},[2326,2327,2328],{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":2329,"slug":2330,"type":15},"Sales","sales","2026-05-23T06:06:37.112153",{"slug":2333,"name":2333,"fn":2334,"description":2335,"org":2336,"tags":2337,"stars":22,"repoUrl":23,"updatedAt":2343},"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},[2338,2339,2342],{"name":20,"slug":21,"type":15},{"name":2340,"slug":2341,"type":15},"Documentation","documentation",{"name":2162,"slug":2163,"type":15},"2026-08-13T04:29:43.518071",{"slug":442,"name":442,"fn":2345,"description":2346,"org":2347,"tags":2348,"stars":22,"repoUrl":23,"updatedAt":2352},"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},[2349,2350,2351],{"name":20,"slug":21,"type":15},{"name":2265,"slug":2266,"type":15},{"name":2317,"slug":2318,"type":15},"2026-07-24T05:42:07.991328",{"slug":4,"name":4,"fn":5,"description":6,"org":2354,"tags":2355,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2356,2357,2358],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"slug":2360,"name":2360,"fn":2361,"description":2362,"org":2363,"tags":2364,"stars":22,"repoUrl":23,"updatedAt":2370},"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},[2365,2368,2369],{"name":2366,"slug":2367,"type":15},"Caching","caching",{"name":2293,"slug":2294,"type":15},{"name":2194,"slug":2195,"type":15},"2026-07-24T05:42:07.032844",{"slug":2372,"name":2372,"fn":2373,"description":2374,"org":2375,"tags":2376,"stars":22,"repoUrl":23,"updatedAt":2382},"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},[2377,2378,2381],{"name":20,"slug":21,"type":15},{"name":2379,"slug":2380,"type":15},"Customer Success","customer-success",{"name":13,"slug":14,"type":15},"2026-08-13T04:29:44.588658"]