diff --git a/commands/measure.md b/commands/measure.md index f1961a6..995417e 100644 --- a/commands/measure.md +++ b/commands/measure.md @@ -8,7 +8,6 @@ description: | Triggers on: "measure", "how am I doing", "my performance", "show my analytics", "performance overview", "how are my posts doing", "linkedin measure". allowed-tools: - - Read - Glob - AskUserQuestion --- @@ -21,7 +20,7 @@ intent in one question and route. **You do not run the analysis here.** ## Step 0: Quick context (optional) -If `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/analytics/` holds imported data, you may note "last import: [date]" in one +You may `Glob` `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/analytics/`; if it holds imported data, note "last import: [date]" in one line so the user knows whether a fresh import is needed first. Do not block on it. ## Step 1: Identify what they need diff --git a/docs/hardening/log.md b/docs/hardening/log.md index 406b649..43d22c5 100644 --- a/docs/hardening/log.md +++ b/docs/hardening/log.md @@ -1723,3 +1723,42 @@ read, pattern greps) from a tool, never by reasoning. expanded (one command per session); each catches its own. --- + +### /linkedin:measure — performance front-door (guided "how am I doing?" → routes to the owning analytics command); delegates only, no number-crunching (S25) + +**CLASS: routing front-door** (Measure-journey, v4.1). Predicate: every emitted `/linkedin:Y` resolves to +`commands/Y.md`; bidirectional grant-hygiene; "delegates only" (never crunches numbers). + +**TEST (tool-grounded).** +- Routing (main axis): **5/5 targets resolve** — `commands/{import,report,analyze,audit,ab-test}.md` all + present (menu `:31-35` / table `:44-48` / order-note `:51`). +- Grant-hygiene (bidirectional): `AskUserQuestion` (`:13`) used at `:29`; `Glob` (`:12`) + `Read` (`:11`) — + neither named a tool in body, both hung only on the **optional Step 0** filesystem glance (`:22-25`, + pre-edit). UNLIKE `create` (Glob a pure orphan, no fs-check at all), measure HAS a Step 0 ("if + `…/analytics/` holds imported data, note last import"), giving `Glob` a real home — but the grant↔use + link was implicit (body named no tool). +- Delegates-only: 3 no-do promises (`:7`, `:20`, `:40`); all crunch/analysis hits are negations — no leak. +- Persona (ICP author, "how am I doing?"): Step 0 optional analytics glance → Step 1 AskUserQuestion (5 + opts) `:29` → Step 2 route into target workflow `:37-48`; order-note `:50-51` (no data → import first). ✓ +- No fixture (pure routing prose). + +**HARDEN (operator-chosen — explicit `Glob`, drop `Read`; 2 edits, 1 file — `commands/measure.md`).** +1. [REWORK · grant-hygiene] dropped `Read` from `allowed-tools` (`:11`, pre-edit) — redundant; the Step 0 + import-date need is met by a `Glob` listing of the analytics dir. +2. [REWORK · grant↔use traceability] made Step 0 explicit: "You may `Glob` `…/analytics/`; if it holds + imported data, note last import" (`:23`), giving the retained `Glob` grant a named body home. + Net grants = {Glob, AskUserQuestion}. + +**VERIFY.** +- Re-grep final: `Read` as a tool name → **NONE**; `allowed-tools` = Glob + AskUserQuestion (`:11-12`); + `Glob` now in body `:23`. +- Routing unchanged: 5 distinct targets, all present. +- `git diff --stat` = 1 file, **+1/−2**. +- `bash scripts/test-runner.sh` → `Passed: 81 · Failed: 0 · Warnings: 0`, **exit 0**; counts **29/19** + unchanged (.md-only edit). +- Disposition: **FIXED** (2 edits, 1 file) · 0 deferrals · routing axis **PASS**, delegates-only **PASS**, + grant-hygiene **FIXED** (Glob retained + made explicit, Read dropped). +- Scope note: the `Glob`-orphan question is now resolved for `measure` (it had a home via Step 0; `create` + did not). `linkedin` (S26) still to check independently. + +---