[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FMBY5EW44XF7Z1GCWH6SQ5":3,"skill-same:01M6FMBY5EW44XF7Z1GCWH6SQ5":288},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":58,"ownerDescription":59,"updatedAt":60,"install":61,"resources":73},"01M6FMBY5EW44XF7Z1GCWH6SQ5","attractor-scout",null,"Use when someone asks what to automate, what they keep doing by hand, or to scout their own sessions for attractor opportunities (\"\u002Fattractor-scout\", \"mine my own work for pipelines\"). Mines YOUR OWN context-intelligence history for recurring, costly work that would survive a loop; ranks it, honest-NOs first-class, writes a self-contained HTML map. Own data only, nothing leaves the machine.","microsoft\u002Famplifier-bundle-attractor","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M6FMBV7X8F2K0XZ4QESEXPWR",8,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"attractor scout","scout","recurring","machine","keep","mine","self","map","only","use","sessions","write","read","delegate","work","history","loop","Bash","first","file","2026-11-10 10:12:30",false,"---\nname: attractor-scout\nversion: \"1.0.0\"\ndescription: >\n  Use when someone asks what to automate, what they keep doing by hand, or to scout their\n  own sessions for attractor opportunities (\"\u002Fattractor-scout\", \"mine my own work for\n  pipelines\"). Mines YOUR OWN context-intelligence history for recurring, costly work that\n  would survive a loop; ranks it, honest-NOs first-class, writes a self-contained HTML map.\n  Own data only, nothing leaves the machine.\nuser-invocable: true\n# Hand-run authoring tool: started by a human, never reached for by the model\n# (owner directive 2026-09-07, model_performance-lswd). What this buys is NOT\n# catalog bytes -- measured, the visibility block is 0 bytes smaller, because\n# the skill moves from \"Available skills\" to \"User-invoked skills\" and both\n# render one capped line. It buys the tail: the model can no longer decide on\n# its own to load this ~30 KB body (~7.6k tokens) in the middle of an unrelated\n# task. And it costs nothing here -- the flag is read only by the visibility\n# hook, never on the load path -- so `\u002Fattractor-scout` and\n# `load_skill(skill_name=\"attractor-scout\")` still load this file in full,\n# inline. Guarded by tests\u002Ftest_skill_catalog_visibility.py; measured in\n# docs\u002Flanes\u002Flswd-attractor-catalog-reduction\u002F.\ndisable-model-invocation: true\nmodel_role: reasoning\nallowed-tools:\n  - bash\n  - read_file\n  - write_file\n  - delegate\n---\n\n# \u002Fattractor-scout — mine your own work for the loops worth building\n\nThis skill runs **inline** in the current session so it can read the repo's\n`AGENTS.md`, resolve an output path, and shell out to the bundled mining\nscripts. It reads **your own** context-intelligence session history — the\nrecord of what you actually did, session after session — and finds the\nrecurring units of work that are shaped like an attractor: a loop, gated on\nevidence, that would survive a bad day. Then it hands you a ranked map, and it\nis just as willing to tell you which of your habits are **not** worth\nautomating and why.\n\n> **What \"attractor-shaped\" means — the three-question test, in your terms.**\n> The same test `\u002Fattractorify` applies to one piece of work, this skill\n> applies to every recurring unit in your history:\n>\n> - **Q1 — Is there a cycle?** Does the work actually iterate (try, check,\n>   fix, repeat), or does it run once straight through? Once-through is a\n>   *recipe*, not an attractor.\n> - **Q2 — Is the exit gated on evidence?** Does it stop on a machine-checkable\n>   condition — a test, a lint, a build, a readback — or does it stop when the\n>   model feels done? An ungated loop is a *one-shot*: one gate away from\n>   converting.\n> - **Q3 — Would it survive one node having a bad day?** When a step errored,\n>   did the work recover and still finish? If errors were never even observed,\n>   that is *unproven* — a caveat, never a failure.\n>\n> A unit that clears all three, recurs at least twice, and cost you real toil\n> is an **opportunity**. Everything else that recurs and cost toil is an\n> **honest-NO**, reported *with the sub-test it failed and what would change\n> the answer*. The classification is the value.\n\n---\n\n## Setup — do this first (defines every variable the commands use)\n\nThe pipeline shells out to the bundled scripts and writes intermediate JSON to\na scratch directory. Establish these three shell variables **before running any\ncommand below** — every command references them, and none of them may be left\nundefined:\n\n```bash\n# 1. The skill directory. When this skill was loaded via load_skill, it reports\n#    a skill_directory; use that. Otherwise SKILL_DIR is the directory that\n#    contains this SKILL.md (the folder holding scripts\u002F). Set it explicitly to\n#    an absolute path:\nSKILL_DIR=\"\u002Fabsolute\u002Fpath\u002Fto\u002Fskills\u002Fattractor-scout\"   # from load_skill's skill_directory\nCLI=\"python $SKILL_DIR\u002Fscripts\u002Fattractor_scout_cli.py\"\n\n# 2. A scratch directory for intermediate JSON. Kept OUT of any repo — the\n#    user's mined data must never land in version control.\nWORK=\"$(mktemp -d -t attractor-scout.XXXXXX)\"\n\n# 3. Where the final HTML map is written. Default: the current working\n#    directory. If this repo's AGENTS.md declares an artifacts\u002Foutput path,\n#    resolve it and set OUTPUT_PATH there instead.\nOUTPUT_PATH=\"$PWD\u002Fattractor-scout-report.html\"\n\n# 4. Persist these for the whole run, because each shell command below may run\n#    in a fresh shell that does not inherit them:\ncat > \"$WORK\u002Fenv.sh\" \u003C\u003CEOF\nSKILL_DIR=\"$SKILL_DIR\"; CLI=\"$CLI\"; WORK=\"$WORK\"; OUTPUT_PATH=\"$OUTPUT_PATH\"\nEOF\n# ...then start every later command with:  source \"$WORK\u002Fenv.sh\"\n```\n\nIf you cannot resolve `SKILL_DIR` (no `skill_directory` from load_skill and you\nare not inside the skill's own tree), STOP and say so — do not guess a path.\n`$WORK` lives under `mktemp`, so its path is stable once created; re-`source`\n`$WORK\u002Fenv.sh` at the top of each step rather than re-running `mktemp`.\n\n---\n\n## The pipeline (fixed order; do not improvise the stages)\n\nThe logic lives once, in the bundled library (`scripts\u002Fattractor_scout\u002F`); the\nCLI (`scripts\u002Fattractor_scout_cli.py`, invoked here as `$CLI`) is the\nworkhorse. You orchestrate — you do not re-implement a detector.\n\n**1 — Deterministic mining spine (NO LLM).** Discover → qualify → extract, all\nin the bundled scripts:\n\n```bash\nsource \"$WORK\u002Fenv.sh\"\n# Mines your own default tree (~\u002F.amplifier\u002Fprojects). To point at a different\n# OWN-DATA location, pass --root as a TOP-LEVEL flag BEFORE the subcommand:\n#   $CLI --root \u002Fpath\u002Fto\u002Fyour\u002Fprojects extract --out \"$WORK\u002Fextracts.jsonl\"\n$CLI extract --out \"$WORK\u002Fextracts.jsonl\"\n```\n\nThis resolves the context-intelligence root\n(`AMPLIFIER_CONTEXT_INTELLIGENCE_BASE_PATH` → `~\u002F.amplifier\u002Fprojects`),\nversion-checks every `metadata.json` and **fails loud on a schema mismatch**,\nselects **prompt-carrying root sessions** (never top-N-by-workspace-size — the\nbiggest recurring unit lives smeared across dozens of tiny workspaces and is\ninvisible to size-ranked selection), reads errors from `tool:post.result.error`,\nkeys on **full** session ids, and caps span at 7,200 s. It **fails loud on an\nempty root** with the exact message `looked in \u003Croot>, found 0` — if you see\nthat, STOP and report it; do not fabricate a count from a shallower glob.\n\n**The same pass classifies PROVENANCE — whose work each session is.** A\n`prompt:submit` proves a prompt was submitted and nothing whatsoever about who\nsubmitted it: a harness firing one non-interactive run emits a byte-identical\nevent. So every mined session is put through a deterministic ladder\n(`scripts\u002Fattractor_scout\u002Fprovenance.py`) before anything downstream sees it:\n\n| Rung | Verdict | What fires it |\n| --- | --- | --- |\n| `R0` | agent | a parent session id, a delegate id shape, or a `session:fork` opener |\n| `R1` | agent | a pipeline or recipe start event |\n| `R2` | agent | an ephemeral or lane-shaped `working_dir` (tmp, scratch, worktree, lane) |\n| `R3` | likely-agent | a one-shot templated long brief |\n| `R4` | human-presumed | two or more prompts with a real gap between them |\n| `R5` | unknown | nothing decisive was recorded |\n\nEach verdict records **which rung fired, on what signal, with its evidence**,\nand that record is rendered in the artifact.\n\n**The policy, and it is not negotiable inside a run: opportunities are mined\nfrom `R4` only.** `R0`–`R3` are excluded and counted as an already-automated\nfootprint (context — what agents already do for you — never an opportunity to\nhand back). `R5` is excluded and counted too: nothing recorded at session start\nsays who launched a run, so a single-prompt session in a normal workspace\ngenuinely cannot be told apart from an agent one-shot, and the contamination in\nthat band is exactly the complaint this pass exists to fix. **`UNKNOWN` never\nsilently becomes human.** Say the exclusion out loud when you report; do not\npresent a shrunken ranking as if nothing was held back.\n\n**2 — Semantic label + cluster (`fast` role).** The deterministic spine dedups\nby tool-signature, but the large majority of real opportunities are found ONLY\nby reading the work's *meaning* across differently-worded sessions. Delegate\nthis to `fast`-role sub-agents over **local text only**, in **batches of ~40\nsessions**, run in **waves of 5 batches in series**. Those two numbers are the\ncalibrated shape: ~40 keeps a batch inside one workspace's coherence so a\ncluster is not split across unrelated work, and 5-at-a-time in series stays\nunder provider rate limits on a corpus of any size. The `fast`\nrole does this reliably at scale but **not perfectly**: a full-corpus run\nmeasured it returning a small number of session ids that were in no supplied\nbatch. So the discipline is ENFORCED rather than assumed — **every id a batch\nreturns is checked against the ids THAT batch was handed; one that is not is\ndropped, counted, and reported as `invented_ids_rejected` in the run summary.**\nWrite each batch's response next to the ids that batch was handed, and collect\nthem THROUGH that check into `$WORK\u002Ffast-clusters.json` (the verdict-carrying\n`$WORK\u002Fclusters.json` is assembled in step 4):\n\n```json\n{\"batch_id\": \"b07\", \"session_ids\": [\"\u003Csid>\", \"\u003Csid>\"],\n \"clusters\": [{\"id\": \"b07-c1\", \"name\": \"short label\", \"members\": [\"\u003Csid>\"]}]}\n```\n\n```bash\n$CLI label-merge --batches \"$WORK\u002Flabel-batches\" --out \"$WORK\u002Ffast-clusters.json\"\n```\n\n**3 — Merge + fit verdicts (`reasoning` role).** Merge the per-batch clusters\n(staged: batch → regional → global) and assign each cluster its **fit verdict**\nwith a `reasoning`-role sub-agent. This tier is not optional and not cosmetic:\nthe verdict-tier A\u002FB (Gate 1, evidence in `evals\u002FREADME.md`) measured a **~18%\nverdict-flip rate** between the fast and reasoning tiers, **78%** of them the\nreasoning tier upgrading a verdict the fast tier mechanically declined. Fast\nlabels; reasoning judges.\n\n**4 — Author adjudication (`general` role).** The deterministic spine already\ncarries an author *prior* (harness \u002F human \u002F mixed) from fingerprints,\nsentinels, and the step-1 provenance verdict. That prior **over-calls human**,\nbecause it cannot read intent from prompt text — a templated autonomous \"lane\"\nmission looks human to it but is machine-launched. So adjudicate author at the\n**cluster level, reading the prompt text**, with a `general`-role sub-agent\n(the author-gate A\u002FB, Gate 2 in `evals\u002FREADME.md`, built this step: it admitted\n**0 of 2** harness clusters in **10\u002F10** trials). The adjudicated label\noverrides the prior.\n\n**Give the adjudicator the provenance verdict, and bind it with one rule.**\nEach member record carries `provenance.rung`, `provenance.signal` and\n`provenance.evidence` (prompt count, session span, workspace class, first-prompt\nshape). Pass those into the adjudication prompt alongside the text — they are\nfacts the prompt text cannot show, and withholding them is what made this step\nguess. State this rule verbatim in the prompt you send:\n\n> *You are given a deterministic provenance verdict per session. You may move a\n> cluster AWAY from human — to mixed or harness — when the prompt text shows\n> machine authorship the ladder could not see. You may NEVER move a cluster\n> toward human: a rung of R0, R1, R2 or R3 is evidence a machine started that\n> work, and no reading of prompt text overrides it. If the verdicts disagree\n> with each other inside one cluster, say mixed.*\n\nThe adjudicator can tighten; it cannot launder an agent session into human\nwork.\n\nAfter steps 2–4, write `$WORK\u002Fclusters.json` in exactly this shape — one entry\nper global cluster, carrying the fast-tier members and the reasoning\u002Fgeneral\nverdicts. `members` are session ids from the extract; `cycle` and\n`evidence_gate` are the reasoning-tier fit booleans; `author` is the\ngeneral-tier adjudicated label (`human` | `mixed` | `harness`):\n\n```json\n{\"clusters\": [\n  {\"id\": \"c1\", \"name\": \"short label\", \"members\": [\"\u003Csid>\", \"\u003Csid>\"],\n   \"cycle\": true, \"evidence_gate\": true, \"author\": \"human\"}\n]}\n```\n\n**5 — Deterministic re-verification (trust, then verify — a FATAL gate).**\nEvery count the LLM emitted — cluster membership above all — is handed BACK to\nthe deterministic layer and re-checked against the extract. This runs as part\nof ranking, with `--strict`:\n\n```bash\n$CLI rank --strict \\\n    --extracts \"$WORK\u002Fextracts.jsonl\" \\\n    --clusters \"$WORK\u002Fclusters.json\" \\\n    --out \"$WORK\u002Franked.json\"\n```\n\n`--strict` makes a re-verification mismatch **FATAL**: if any member id the LLM\nemitted does not resolve against the extract, the command prints the offending\nids and **exits non-zero**. If that happens, **STOP** — do not render, do not\nreport a ranking. A ranking that rests on counts you could not verify is worse\nthan no ranking. Re-run the label\u002Fcluster pass or fix the cluster JSON first.\n\n**6 — Rank (inside the same `rank` call).** `score = n_sessions × leverage ×\nfit \u002F 100`, where `leverage = med_tool_calls + med_llm_cycles +\nmed_span_capped\u002F60 + 2·errs\u002Fn` (median within cluster, never p75; `n_prompts`\ncarries zero signal and is dropped). Fit is binary {0,1}. **Two gates run\nBEFORE scoring, in this order.** First the provenance boundary narrows every\nunit's membership to its `R4` sessions; a unit left with none is reported in\nthe provenance panel (as already-automated, or as unattributed) instead of\nranked. Then the author admission gate admits **only human\u002Fmixed units**;\nharness ceremony is routed to the waste-findings channel — reported (it is time\nyou could reclaim), not offered as an opportunity to act on. A unit carrying no\nauthor verdict at all is **not** treated as yours: it lands in `unattributed`,\nreported and unranked, because an absent verdict is an absence of evidence.\n\n**7 — Render (NO LLM).** The bundled deterministic renderer turns the ranked\nJSON into ONE self-contained HTML file — a sampled simple→complex range across\nthe top, in-page modal deep-dives into the full list, honest-NOs shown with\nverdict and remediation, waste-findings in their own channel, and a\n**provenance panel** carrying the per-rung counts, sample evidence, the\nalready-automated footprint, and the honest UNKNOWN story:\n\n```bash\n$CLI render --ranked \"$WORK\u002Franked.json\" --out \"$OUTPUT_PATH\"\n```\n\n**8 — Demonstrate (teach with their top opportunity).** The map shows *what*\nrecurs; this step shows *the pipeline that would have converged it*. Run it for\n`opportunities[0]` in `$WORK\u002Franked.json` — the ranking already made the pick, so\ndo not open with a menu. Skip this step entirely if the user asked for the map\nonly. If `opportunities` is empty there is no subject to demonstrate: write the\nprimer-only document and re-render, then say so plainly.\n\n```bash\nsource \"$WORK\u002Fenv.sh\"\n# No opportunities? Primer only, and skip the rest of this step:\n#   $CLI demo primer-only --out \"$WORK\u002Fdemos.json\"\n# Pin the unit ONCE, and pass it to every demo command in this step:\nUNIT=$(python -c 'import json,sys; print(json.load(open(sys.argv[1]))[\"opportunities\"][0][\"unit_id\"])' \\\n        \"$WORK\u002Franked.json\")\nSLUG=$($CLI demo brief --ranked \"$WORK\u002Franked.json\" --unit \"$UNIT\" \\\n        --extracts \"$WORK\u002Fextracts.jsonl\" --workdir \"$WORK\u002Fdemo\")\n```\n\n`demo brief` writes `$WORK\u002Fdemo\u002F$SLUG\u002Fbrief.md` — deterministically assembled\nfrom their verified stats, their fit detail, the verify-class tools actually\nseen in their own sessions' terminal windows, the A0–A10 authoring contract, and\nthe engine's attribute vocabulary. Delegate to a **fresh-context `reasoning`\nsub-agent** whose instruction is exactly that file; it writes `pipeline.dot`,\n`pipeline.md` and `narrative.json` into `$WORK\u002Fdemo\u002F$SLUG\u002F`. **Cost: one\ndelegation; at most two if the gates reject the first draft; never more.**\nThen gate, validate and publish:\n\n```bash\n$CLI demo assemble --ranked \"$WORK\u002Franked.json\" --unit \"$UNIT\" \\\n    --workdir \"$WORK\u002Fdemo\u002F$SLUG\" --output-dir \"$(dirname \"$OUTPUT_PATH\")\" \\\n    --out \"$WORK\u002Fdemos.json\" --append\n```\n\n**`brief` and `assemble` must both point at the SAME unit.** `--unit` defaults\nto `opportunities[0]` on *each* command independently, so an `assemble` that\nomits it silently validates the draft against the top-ranked unit's numbers —\nwhich is why `$UNIT` is pinned once above and passed to both. Mismatch it and\nthe count check fails on numbers the delegate never wrote.\n\n`assemble` runs the verification ladder (`dot-runner lint` if it is on PATH; the\nbundled doctrine checker always), validates every number in the **six teaching-\nprose slots** against the re-verified ranking — **an invented count there is\nFATAL, same as step 5** — and copies the `.dot` + companion beside the HTML\n**only after the gates finish**. (Numbers written *inside* the generated `.dot`\n— budgets, `max_iterations`, thresholds — are gate-checked by lint+doctrine, not\ndigit-whitelisted: a pipeline legitimately carries parameters, and the panel's\n\"what nothing checked\" names that surface out loud.)\nIf `attractor` is missing it will say so in the artifact rather than imply a\npass. You may then ask the user ONCE whether to fetch the public linter via\n`uvx` — **an inbound package fetch; none of their mined data leaves the machine;\nnever run it without their yes**. On yes, re-run assemble with\n`--lint-cmd \"uvx --from git+https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-dot-runner@main#subdirectory=modules\u002Fpipeline-runner attractor\"`.\nIf the gates reject the draft it exits non-zero and leaves the verbatim reports\nat `$WORK\u002Fdemo\u002F$SLUG\u002Fgate-report.txt`: re-delegate **ONCE** with those reports\nappended, and if it is still red, do not publish — say so and move on. Then\nre-render the same file:\n\n```bash\n$CLI render --ranked \"$WORK\u002Franked.json\" --demos \"$WORK\u002Fdemos.json\" --out \"$OUTPUT_PATH\"\n```\n\n**Generation is stochastic; verification, assembly and rendering are not.**\nAnd: **what you authored — via your delegate — you cannot certify.** The\nartifact carries the machine verdicts verbatim, says which checks did NOT run,\nand offers the independent path (`examples\u002Fauthoring\u002Fpipeline-author.dot` plus\nthe CLI install line). If the user asks you to vouch for the demo, answer in\nthose three parts — never \"yes, I'm sure.\"\n\n**9 — Offer more (their call).** List the top five not-yet-demonstrated\nopportunities by name and ask exactly one question: *\"Want another one\ndemonstrated? Name or number — or no.\"* Each yes repeats step 8 for that unit —\nre-point `$UNIT` at the chosen `unit_id` so **both** `demo brief` and `demo\nassemble` carry the same `--unit`, keep `--append`, and re-render. **Never\ngenerate a second demonstration without a fresh explicit yes** — the first one\nis the skill's second half; every one after it is marginal spend for marginal\npersonalization.\n\n**10 — Deck mode (OPT-IN; ask once, and only after step 9).** Steps 7–9 produce\na deterministic report: a renderer places every number, so no model can invent\none. Deck mode produces something different — ONE authored, deck-grade,\npersonalized page over the same verified data — and pays for that freedom with\nmachine gates instead of with a deterministic renderer. Offer it in one\nquestion, naming the cost out loud:\n\n> *\"I can also build a deck-grade version of this — one self-contained page\n> that teaches the ideas and walks your own results, authored rather than\n> templated. It costs one more reasoning-model delegation (two if the gates\n> reject the first draft), and it only publishes if it passes them. Want it?\"*\n\n**Never build a deck without an explicit yes.** On yes:\n\n```bash\nsource \"$WORK\u002Fenv.sh\"\nRUNDIR=\"$(dirname \"$OUTPUT_PATH\")\"\nBRIEF=$($CLI deck brief --ranked \"$WORK\u002Franked.json\" --demos \"$WORK\u002Fdemos.json\" \\\n        --workdir \"$WORK\u002Fdeck\")\n```\n\n`deck brief` writes `$WORK\u002Fdeck\u002Fdeck-brief.md` — deterministically assembled\nfrom the same verified data the report rests on: the ranking, the honest-NOs,\nthe waste channel, every generated `.dot` verbatim with its gate verdicts, the\nhouse style\u002Ftechnique contract, the hard self-containment constraints, and the\nfour MANDATES that make the gates passable. Delegate to a **fresh-context\n`reasoning` sub-agent** whose instruction is exactly that file; it writes ONE\nfile, `deck.html`, into `$WORK\u002Fdeck\u002F`. **Cost: one delegation; at most two if\nthe gates reject the first draft; never more.**\n\n**Drive that delegation across resumed turns, not one giant request.** A deck is\ntens of thousands of tokens of markup, and a single request that tries to emit\nthe whole file in one response reliably exceeds the provider's ~600 s request\ntimeout and loses the work. Have the fresh-context author build the file up in\nseveral turns — the document head\u002Fstylesheet\u002F`\u003Cdefs>` first, then one section\nper turn, then the dialogs and the closing script — resuming the same session\neach turn so it is still ONE fresh context. The brief tells the author this too;\nit is stated here because the orchestrating session is what sequences the turns.\n\nThen gate it:\n\n```bash\n$CLI deck verify --deck \"$WORK\u002Fdeck\u002Fdeck.html\" \\\n    --ranked \"$WORK\u002Franked.json\" --demos \"$WORK\u002Fdemos.json\" \\\n    --report \"$WORK\u002Fdeck\u002Fdeck-gate-report.txt\"\n```\n\n`deck verify` is deterministic and it is the only thing that decides whether the\ndeck publishes. Six gates: **(a)** the HTML parses; **(b)** the page is\nself-contained — no `\u003Cimg>`\u002F`\u003Clink>`\u002F`\u003Cscript src>`\u002F`@import`\u002F`\u003Ciframe>`\u002F\n`srcset`, `url(` only as `url(#…)`, exactly two https links, zero `file:\u002F\u002F`;\n**(c)** every modal has a trigger and every trigger has a modal; **(d)** every\nnumber displayed in visible text re-verifies against the run data or against a\nderivation the deck itself declares, with provenance, in its\n`\u003Cscript type=\"application\u002Fjson\" id=\"derived-values\">` block — **an undeclared\nnumber is FATAL, same as step 5**; **(e)** every pipeline diagram matches its\nreal `.dot` node-for-node and edge-for-edge (an edge MULTISET comparison, so a\nback-edge quietly not drawn is caught); **(f)** the **structural depth gate** —\nevery `\u003Cdialog>` carries the five parts the style contract mandates (a title and\nkicker, at least two `\u003Ch4>` sub-sections, an `evidence` inset quoting the\nreader's own verified data, a `why`, and an `entry` point). It counts structure,\nnever length, so padding cannot buy a pass and an honest short modal is never\npunished. Exit 0 means all six passed; **exit 3 means a gate came back red and\nthe deck must NOT be published**.\n\nIf it exits 3, re-delegate **ONCE** with `$WORK\u002Fdeck\u002Fdeck-gate-report.txt`\nappended verbatim, then re-verify. Still red? **Do not publish.** Say which\ngates failed and move on — the report and the demonstrations are already\ncomplete artifacts. On green, publish it beside the report:\n\n```bash\ncp \"$WORK\u002Fdeck\u002Fdeck.html\" \"$RUNDIR\u002Fattractor-scout-deck.html\"\n```\n\n**Optional vision rung — only AFTER `deck verify` passes.** If a\nvision-analysis tool is available in this session, render the published deck to\nimages, stitch them, and inspect for layout defects (overlap, clipping,\nunreadable contrast, a diagram running off its viewBox). At most **one** fix\nround: hand the defects back to the same fresh-context author, re-run\n`deck verify` (a visual fix must not break a gate), and republish. If no such\ntool is available, do **not** imply it was checked — leave the honest label in\nthe deck's footer comment:\n\n```\n\u003C!-- vision QA: NOT RUN -->\n```\n\nSame ladder philosophy as the demo lint rung: a rung that could not run is\n*labelled*, never silently treated as a pass.\n\n---\n\n## Hard rules (non-negotiable — these are the trust contract)\n\n- **Own data only. Nothing leaves the machine.** The label\u002Fcluster\u002Fverdict\u002F\n  author passes reason over **local text**; there is no network egress. Skip\n  any write-only or read-blocked endpoint; sessions whose metadata explicitly\n  labels them as originating from another source are out of scope. The\n  top-level `--root` lever (it precedes the subcommand: `$CLI --root \u003Cpath>\n  extract ...`) exists only to point at *your own* context-intelligence tree —\n  **never point it at another user's corpus or a shared mount**; this skill\n  mines the caller's own history, nobody else's.\n- **Tier C (local JSONL) is the floor, and it is fully sufficient.** Every\n  signal expresses at Tier C — this is the proven path. A personal graph\n  (Tier A\u002FB) is an *optional sharpener* for counts and joins; it is **never a\n  precondition**. If no graph answers, run at Tier C and say so with an honest\n  one-line note. Never let the graph become required for a rung to appear.\n- **Whose work it is is PRESUMED, never asserted — and never presumed to be\n  yours.** Nothing in the session record positively marks a human: there is no\n  argv, no mode, no tty flag, no launcher recorded at session start, so\n  `human-presumed` (`R4`) is the strongest claim the data supports and\n  `unknown` (`R5`) is a real answer, not a soft yes. Only `R4` sessions feed\n  the ranking; `R0`–`R3` and `R5` are counted in the provenance panel and kept\n  out of it. A unit with no author verdict is `unattributed`, never human. When\n  you report, name what was held back — a smaller, honest map beats a fuller\n  one that mixes an agent's work in with the user's.\n- **Honest-NOs are first-class output**, never dropped, never padded into the\n  opportunity list to lengthen it. Each carries its verdict, the sub-test it\n  failed (`recipe` \u002F `one-shot` \u002F `fragile`), and its remediation.\n- **Provisional flags surface in the artifact verbatim.** A unit seen in only\n  2–3 sessions is admitted but flagged `provisional`. A `PASS-provisional`\n  recovery is labelled as such. And **UNKNOWN never renders as FAIL** — a unit\n  whose resilience was never stress-tested is `OPPORTUNITY(unproven)`, a\n  caveat on an opportunity, not a decline. Most sessions never hit an error at\n  all; \"no bad day observed\" is not \"would not survive a bad day.\"\n- **Fail loud on an empty root** — exact string `looked in \u003Croot>, found 0`,\n  non-zero exit. Never invent a count.\n- **What you authored, you cannot certify.** A demonstration your delegate\n  wrote is not something you may vouch for. Asked whether it is right, answer\n  in three parts and no fourth: what a machine checked and what it said\n  (verbatim), what nothing checked (whether the prompts fit their workflow,\n  whether the gate is the right definition-of-done, whether it solves the\n  problem they actually have), and the independent path\n  (`examples\u002Fauthoring\u002Fpipeline-author.dot`, plus the CLI install line). Never\n  \"yes, I'm sure.\"\n- **Never auto-fetch. Ask before any `uvx`.** The bundled doctrine checker is\n  the floor and it always runs, so a \"no\" costs nothing but a label. An inbound\n  public-package fetch is not data egress — say that plainly — but unrequested\n  network activity inside a local-only promise is still a trust violation. And\n  never run `uv tool install`: that line is text the user may choose to run.\n- **Generated `.dot`\u002F`.md` land beside the HTML, never in a repo** — under\n  `attractor-scout-demos\u002F` next to `$OUTPUT_PATH`, and only *after* the gates\n  finish. A demo whose gates came back red is not published at all; an\n  unverified-but-labelled demo is. **The deck lands there too**, as\n  `attractor-scout-deck.html` — never in a repo, and never before\n  `deck verify` exits 0.\n- **Deck mode is opt-in, and a gate-failed deck never publishes.** Ask once,\n  name the cost, and build nothing without a yes. The deck is *authored*, so\n  it does not inherit the renderer's structural guarantee — it earns trust from\n  `deck verify` instead, and a red gate after the one retry means the deck is\n  discarded, not shipped with a caveat. The report and the demonstrations are\n  already complete artifacts; a deck is a bonus, never a hostage.\n- **Every number a deck displays is re-verified or declared.** The deck may do\n  arithmetic the run data does not contain — a total, a percentage, a unit\n  conversion — but it must declare each one, with its provenance, in its own\n  `derived-values` block. An undeclared number is FATAL. And where the run has\n  no value for something, the deck says so out loud; it never fills the hole.\n- **The artifact is not the success test.** A pretty HTML file proves nothing;\n  the ranking is only trustworthy because every count in it was re-verified\n  against the raw records (step 5, `--strict`). Ship the map, but the map earns\n  trust from that gate.\n\n---\n\n## Output\n\nOne **self-contained HTML** opportunity map (inlined CSS\u002FJS, no network\nreferences), written to `$OUTPUT_PATH`. It carries the ranked opportunities,\nthe honest-NOs, the waste channel, and a **provenance panel**: how many of your\nsessions landed on each rung, sample evidence for each, the already-automated\nfootprint, and the honest note about what could not be attributed and why. That is the current working directory\nby default, or an **`AGENTS.md`-guided output path** if the repo declares one.\nNever write the user's mined data into a shared repo — their session history\nbelongs in their own artifact.\n\nPlus, when demonstrated: `attractor-scout-demos\u002F\u003Cslug>.dot` + `.md` beside it.\nThe HTML embeds the pipeline text as well as naming that path, so the artifact\nstays self-contained if the folder ever moves. The one hyperlink it carries is\nthe published explainer — an anchor a reader may follow, not a resource the\npage loads.\n\nPlus, when deck mode was accepted AND every gate passed:\n`attractor-scout-deck.html` beside them — one authored, self-contained,\ndeck-grade page over the same verified data, carrying exactly two outbound\nanchors (the explainer and the bundle repository) and loading nothing. A deck\nthat failed `deck verify` is never written there at all.\n\n---\n\n## Notes\n\n- The working name `attractor-scout` lives in **one place**,\n  `scripts\u002Fattractor_scout\u002Fnaming.py` (`SKILL_NAME`). Renaming the skill means\n  changing that constant, this directory, and the `name:` above — nothing else\n  hardcodes the string.\n- Every quantitative claim above (\"~18% flip\", \"78% upgrades\", \"0 of 2 in\n  10\u002F10\") is pinned to the in-repo evidence file `evals\u002FREADME.md`, and a\n  doc-guard test (`tests\u002Ftest_skill_doc_claims.py`) fails if a pinned number in\n  this file drifts from that source. The deterministic acceptance gates are in\n  `tests\u002F` and run standalone with `pytest tests`.\n","# \u002Fattractor-scout — mine your own work for the loops worth building\n\nThis skill runs **inline** in the current session so it can read the repo's\n`AGENTS.md`, resolve an output path, and shell out to the bundled mining\nscripts. It reads **your own** context-intelligence session history — the\nrecord of what you actually did, session after session — and finds the\nrecurring units of work that are shaped like an attractor: a loop, gated on\nevidence, that would survive a bad day. Then it hands you a ranked map, and it\nis just as willing to tell you which of your habits are **not** worth\nautomating and why.\n\n> **What \"attractor-shaped\" means — the three-question test, in your terms.**\n> The same test `\u002Fattractorify` applies to one piece of work, this skill\n> applies to every recurring unit in your history:\n>\n> - **Q1 — Is there a cycle?** Does the work actually iterate (try, check,\n>   fix, repeat), or does it run once straight through? Once-through is a\n>   *recipe*, not an attractor.\n> - **Q2 — Is the exit gated on evidence?** Does it stop on a machine-checkable\n>   condition — a test, a lint, a build, a readback — or does it stop when the\n>   model feels done? An ungated loop is a *one-shot*: one gate away from\n>   converting.\n> - **Q3 — Would it survive one node having a bad day?** When a step errored,\n>   did the work recover and still finish? If errors were never even observed,\n>   that is *unproven* — a caveat, never a failure.\n>\n> A unit that clears all three, recurs at least twice, and cost you real toil\n> is an **opportunity**. Everything else that recurs and cost toil is an\n> **honest-NO**, reported *with the sub-test it failed and what would change\n> the answer*. The classification is the value.\n\n---\n\n## Setup — do this first (defines every variable the commands use)\n\nThe pipeline shells out to the bundled scripts and writes intermediate JSON to\na scratch directory. Establish these three shell variables **before running any\ncommand below** — every command references them, and none of them may be left\nundefined:\n\n```bash\n# 1. The skill directory. When this skill was loaded via load_skill, it reports\n#    a skill_directory; use that. Otherwise SKILL_DIR is the directory that\n#    contains this SKILL.md (the folder holding scripts\u002F). Set it explicitly to\n#    an absolute path:\nSKILL_DIR=\"\u002Fabsolute\u002Fpath\u002Fto\u002Fskills\u002Fattractor-scout\"   # from load_skill's skill_directory\nCLI=\"python $SKILL_DIR\u002Fscripts\u002Fattractor_scout_cli.py\"\n\n# 2. A scratch directory for intermediate JSON. Kept OUT of any repo — the\n#    user's mined data must never land in version control.\nWORK=\"$(mktemp -d -t attractor-scout.XXXXXX)\"\n\n# 3. Where the final HTML map is written. Default: the current working\n#    directory. If this repo's AGENTS.md declares an artifacts\u002Foutput path,\n#    resolve it and set OUTPUT_PATH there instead.\nOUTPUT_PATH=\"$PWD\u002Fattractor-scout-report.html\"\n\n# 4. Persist these for the whole run, because each shell command below may run\n#    in a fresh shell that does not inherit them:\ncat > \"$WORK\u002Fenv.sh\" \u003C\u003CEOF\nSKILL_DIR=\"$SKILL_DIR\"; CLI=\"$CLI\"; WORK=\"$WORK\"; OUTPUT_PATH=\"$OUTPUT_PATH\"\nEOF\n# ...then start every later command with:  source \"$WORK\u002Fenv.sh\"\n```\n\nIf you cannot resolve `SKILL_DIR` (no `skill_directory` from load_skill and you\nare not inside the skill's own tree), STOP and say so — do not guess a path.\n`$WORK` lives under `mktemp`, so its path is stable once created; re-`source`\n`$WORK\u002Fenv.sh` at the top of each step rather than re-running `mktemp`.\n\n---\n\n## The pipeline (fixed order; do not improvise the stages)\n\nThe logic lives once, in the bundled library (`scripts\u002Fattractor_scout\u002F`); the\nCLI (`scripts\u002Fattractor_scout_cli.py`, invoked here as `$CLI`) is the\nworkhorse. You orchestrate — you do not re-implement a detector.\n\n**1 — Deterministic mining spine (NO LLM).** Discover → qualify → extract, all\nin the bundled scripts:\n\n```bash\nsource \"$WORK\u002Fenv.sh\"\n# Mines your own default tree (~\u002F.amplifier\u002Fprojects). To point at a different\n# OWN-DATA location, pass --root as a TOP-LEVEL flag BEFORE the subcommand:\n#   $CLI --root \u002Fpath\u002Fto\u002Fyour\u002Fprojects extract --out \"$WORK\u002Fextracts.jsonl\"\n$CLI extract --out \"$WORK\u002Fextracts.jsonl\"\n```\n\nThis resolves the context-intelligence root\n(`AMPLIFIER_CONTEXT_INTELLIGENCE_BASE_PATH` → `~\u002F.amplifier\u002Fprojects`),\nversion-checks every `metadata.json` and **fails loud on a schema mismatch**,\nselects **prompt-carrying root sessions** (never top-N-by-workspace-size — the\nbiggest recurring unit lives smeared across dozens of tiny workspaces and is\ninvisible to size-ranked selection), reads errors from `tool:post.result.error`,\nkeys on **full** session ids, and caps span at 7,200 s. It **fails loud on an\nempty root** with the exact message `looked in \u003Croot>, found 0` — if you see\nthat, STOP and report it; do not fabricate a count from a shallower glob.\n\n**The same pass classifies PROVENANCE — whose work each session is.** A\n`prompt:submit` proves a prompt was submitted and nothing whatsoever about who\nsubmitted it: a harness firing one non-interactive run emits a byte-identical\nevent. So every mined session is put through a deterministic ladder\n(`scripts\u002Fattractor_scout\u002Fprovenance.py`) before anything downstream sees it:\n\n| Rung | Verdict | What fires it |\n| --- | --- | --- |\n| `R0` | agent | a parent session id, a delegate id shape, or a `session:fork` opener |\n| `R1` | agent | a pipeline or recipe start event |\n| `R2` | agent | an ephemeral or lane-shaped `working_dir` (tmp, scratch, worktree, lane) |\n| `R3` | likely-agent | a one-shot templated long brief |\n| `R4` | human-presumed | two or more prompts with a real gap between them |\n| `R5` | unknown | nothing decisive was recorded |\n\nEach verdict records **which rung fired, on what signal, with its evidence**,\nand that record is rendered in the artifact.\n\n**The policy, and it is not negotiable inside a run: opportunities are mined\nfrom `R4` only.** `R0`–`R3` are excluded and counted as an already-automated\nfootprint (context — what agents already do for you — never an opportunity to\nhand back). `R5` is excluded and counted too: nothing recorded at session start\nsays who launched a run, so a single-prompt session in a normal workspace\ngenuinely cannot be told apart from an agent one-shot, and the contamination in\nthat band is exactly the complaint this pass exists to fix. **`UNKNOWN` never\nsilently becomes human.** Say the exclusion out loud when you report; do not\npresent a shrunken ranking as if nothing was held back.\n\n**2 — Semantic label + cluster (`fast` role).** The deterministic spine dedups\nby tool-signature, but the large majority of real opportunities are found ONLY\nby reading the work's *meaning* across differently-worded sessions. Delegate\nthis to `fast`-role sub-agents over **local text only**, in **batches of ~40\nsessions**, run in **waves of 5 batches in series**. Those two numbers are the\ncalibrated shape: ~40 keeps a batch inside one workspace's coherence so a\ncluster is not split across unrelated work, and 5-at-a-time in series stays\nunder provider rate limits on a corpus of any size. The `fast`\nrole does this reliably at scale but **not perfectly**: a full-corpus run\nmeasured it returning a small number of session ids that were in no supplied\nbatch. So the discipline is ENFORCED rather than assumed — **every id a batch\nreturns is checked against the ids THAT batch was handed; one that is not is\ndropped, counted, and reported as `invented_ids_rejected` in the run summary.**\nWrite each batch's response next to the ids that batch was handed, and collect\nthem THROUGH that check into `$WORK\u002Ffast-clusters.json` (the verdict-carrying\n`$WORK\u002Fclusters.json` is assembled in step 4):\n\n```json\n{\"batch_id\": \"b07\", \"session_ids\": [\"\u003Csid>\", \"\u003Csid>\"],\n \"clusters\": [{\"id\": \"b07-c1\", \"name\": \"short label\", \"members\": [\"\u003Csid>\"]}]}\n```\n\n```bash\n$CLI label-merge --batches \"$WORK\u002Flabel-batches\" --out \"$WORK\u002Ffast-clusters.json\"\n```\n\n**3 — Merge + fit verdicts (`reasoning` role).** Merge the per-batch clusters\n(staged: batch → regional → global) and assign each cluster its **fit verdict**\nwith a `reasoning`-role sub-agent. This tier is not optional and not cosmetic:\nthe verdict-tier A\u002FB (Gate 1, evidence in `evals\u002FREADME.md`) measured a **~18%\nverdict-flip rate** between the fast and reasoning tiers, **78%** of them the\nreasoning tier upgrading a verdict the fast tier mechanically declined. Fast\nlabels; reasoning judges.\n\n**4 — Author adjudication (`general` role).** The deterministic spine already\ncarries an author *prior* (harness \u002F human \u002F mixed) from fingerprints,\nsentinels, and the step-1 provenance verdict. That prior **over-calls human**,\nbecause it cannot read intent from prompt text — a templated autonomous \"lane\"\nmission looks human to it but is machine-launched. So adjudicate author at the\n**cluster level, reading the prompt text**, with a `general`-role sub-agent\n(the author-gate A\u002FB, Gate 2 in `evals\u002FREADME.md`, built this step: it admitted\n**0 of 2** harness clusters in **10\u002F10** trials). The adjudicated label\noverrides the prior.\n\n**Give the adjudicator the provenance verdict, and bind it with one rule.**\nEach member record carries `provenance.rung`, `provenance.signal` and\n`provenance.evidence` (prompt count, session span, workspace class, first-prompt\nshape). Pass those into the adjudication prompt alongside the text — they are\nfacts the prompt text cannot show, and withholding them is what made this step\nguess. State this rule verbatim in the prompt you send:\n\n> *You are given a deterministic provenance verdict per session. You may move a\n> cluster AWAY from human — to mixed or harness — when the prompt text shows\n> machine authorship the ladder could not see. You may NEVER move a cluster\n> toward human: a rung of R0, R1, R2 or R3 is evidence a machine started that\n> work, and no reading of prompt text overrides it. If the verdicts disagree\n> with each other inside one cluster, say mixed.*\n\nThe adjudicator can tighten; it cannot launder an agent session into human\nwork.\n\nAfter steps 2–4, write `$WORK\u002Fclusters.json` in exactly this shape — one entry\nper global cluster, carrying the fast-tier members and the reasoning\u002Fgeneral\nverdicts. `members` are session ids from the extract; `cycle` and\n`evidence_gate` are the reasoning-tier fit booleans; `author` is the\ngeneral-tier adjudicated label (`human` | `mixed` | `harness`):\n\n```json\n{\"clusters\": [\n  {\"id\": \"c1\", \"name\": \"short label\", \"members\": [\"\u003Csid>\", \"\u003Csid>\"],\n   \"cycle\": true, \"evidence_gate\": true, \"author\": \"human\"}\n]}\n```\n\n**5 — Deterministic re-verification (trust, then verify — a FATAL gate).**\nEvery count the LLM emitted — cluster membership above all — is handed BACK to\nthe deterministic layer and re-checked against the extract. This runs as part\nof ranking, with `--strict`:\n\n```bash\n$CLI rank --strict \\\n    --extracts \"$WORK\u002Fextracts.jsonl\" \\\n    --clusters \"$WORK\u002Fclusters.json\" \\\n    --out \"$WORK\u002Franked.json\"\n```\n\n`--strict` makes a re-verification mismatch **FATAL**: if any member id the LLM\nemitted does not resolve against the extract, the command prints the offending\nids and **exits non-zero**. If that happens, **STOP** — do not render, do not\nreport a ranking. A ranking that rests on counts you could not verify is worse\nthan no ranking. Re-run the label\u002Fcluster pass or fix the cluster JSON first.\n\n**6 — Rank (inside the same `rank` call).** `score = n_sessions × leverage ×\nfit \u002F 100`, where `leverage = med_tool_calls + med_llm_cycles +\nmed_span_capped\u002F60 + 2·errs\u002Fn` (median within cluster, never p75; `n_prompts`\ncarries zero signal and is dropped). Fit is binary {0,1}. **Two gates run\nBEFORE scoring, in this order.** First the provenance boundary narrows every\nunit's membership to its `R4` sessions; a unit left with none is reported in\nthe provenance panel (as already-automated, or as unattributed) instead of\nranked. Then the author admission gate admits **only human\u002Fmixed units**;\nharness ceremony is routed to the waste-findings channel — reported (it is time\nyou could reclaim), not offered as an opportunity to act on. A unit carrying no\nauthor verdict at all is **not** treated as yours: it lands in `unattributed`,\nreported and unranked, because an absent verdict is an absence of evidence.\n\n**7 — Render (NO LLM).** The bundled deterministic renderer turns the ranked\nJSON into ONE self-contained HTML file — a sampled simple→complex range across\nthe top, in-page modal deep-dives into the full list, honest-NOs shown with\nverdict and remediation, waste-findings in their own channel, and a\n**provenance panel** carrying the per-rung counts, sample evidence, the\nalready-automated footprint, and the honest UNKNOWN story:\n\n```bash\n$CLI render --ranked \"$WORK\u002Franked.json\" --out \"$OUTPUT_PATH\"\n```\n\n**8 — Demonstrate (teach with their top opportunity).** The map shows *what*\nrecurs; this step shows *the pipeline that would have converged it*. Run it for\n`opportunities[0]` in `$WORK\u002Franked.json` — the ranking already made the pick, so\ndo not open with a menu. Skip this step entirely if the user asked for the map\nonly. If `opportunities` is empty there is no subject to demonstrate: write the\nprimer-only document and re-render, then say so plainly.\n\n```bash\nsource \"$WORK\u002Fenv.sh\"\n# No opportunities? Primer only, and skip the rest of this step:\n#   $CLI demo primer-only --out \"$WORK\u002Fdemos.json\"\n# Pin the unit ONCE, and pass it to every demo command in this step:\nUNIT=$(python -c 'import json,sys; print(json.load(open(sys.argv[1]))[\"opportunities\"][0][\"unit_id\"])' \\\n        \"$WORK\u002Franked.json\")\nSLUG=$($CLI demo brief --ranked \"$WORK\u002Franked.json\" --unit \"$UNIT\" \\\n        --extracts \"$WORK\u002Fextracts.jsonl\" --workdir \"$WORK\u002Fdemo\")\n```\n\n`demo brief` writes `$WORK\u002Fdemo\u002F$SLUG\u002Fbrief.md` — deterministically assembled\nfrom their verified stats, their fit detail, the verify-class tools actually\nseen in their own sessions' terminal windows, the A0–A10 authoring contract, and\nthe engine's attribute vocabulary. Delegate to a **fresh-context `reasoning`\nsub-agent** whose instruction is exactly that file; it writes `pipeline.dot`,\n`pipeline.md` and `narrative.json` into `$WORK\u002Fdemo\u002F$SLUG\u002F`. **Cost: one\ndelegation; at most two if the gates reject the first draft; never more.**\nThen gate, validate and publish:\n\n```bash\n$CLI demo assemble --ranked \"$WORK\u002Franked.json\" --unit \"$UNIT\" \\\n    --workdir \"$WORK\u002Fdemo\u002F$SLUG\" --output-dir \"$(dirname \"$OUTPUT_PATH\")\" \\\n    --out \"$WORK\u002Fdemos.json\" --append\n```\n\n**`brief` and `assemble` must both point at the SAME unit.** `--unit` defaults\nto `opportunities[0]` on *each* command independently, so an `assemble` that\nomits it silently validates the draft against the top-ranked unit's numbers —\nwhich is why `$UNIT` is pinned once above and passed to both. Mismatch it and\nthe count check fails on numbers the delegate never wrote.\n\n`assemble` runs the verification ladder (`dot-runner lint` if it is on PATH; the\nbundled doctrine checker always), validates every number in the **six teaching-\nprose slots** against the re-verified ranking — **an invented count there is\nFATAL, same as step 5** — and copies the `.dot` + companion beside the HTML\n**only after the gates finish**. (Numbers written *inside* the generated `.dot`\n— budgets, `max_iterations`, thresholds — are gate-checked by lint+doctrine, not\ndigit-whitelisted: a pipeline legitimately carries parameters, and the panel's\n\"what nothing checked\" names that surface out loud.)\nIf `attractor` is missing it will say so in the artifact rather than imply a\npass. You may then ask the user ONCE whether to fetch the public linter via\n`uvx` — **an inbound package fetch; none of their mined data leaves the machine;\nnever run it without their yes**. On yes, re-run assemble with\n`--lint-cmd \"uvx --from git+https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-dot-runner@main#subdirectory=modules\u002Fpipeline-runner attractor\"`.\nIf the gates reject the draft it exits non-zero and leaves the verbatim reports\nat `$WORK\u002Fdemo\u002F$SLUG\u002Fgate-report.txt`: re-delegate **ONCE** with those reports\nappended, and if it is still red, do not publish — say so and move on. Then\nre-render the same file:\n\n```bash\n$CLI render --ranked \"$WORK\u002Franked.json\" --demos \"$WORK\u002Fdemos.json\" --out \"$OUTPUT_PATH\"\n```\n\n**Generation is stochastic; verification, assembly and rendering are not.**\nAnd: **what you authored — via your delegate — you cannot certify.** The\nartifact carries the machine verdicts verbatim, says which checks did NOT run,\nand offers the independent path (`examples\u002Fauthoring\u002Fpipeline-author.dot` plus\nthe CLI install line). If the user asks you to vouch for the demo, answer in\nthose three parts — never \"yes, I'm sure.\"\n\n**9 — Offer more (their call).** List the top five not-yet-demonstrated\nopportunities by name and ask exactly one question: *\"Want another one\ndemonstrated? Name or number — or no.\"* Each yes repeats step 8 for that unit —\nre-point `$UNIT` at the chosen `unit_id` so **both** `demo brief` and `demo\nassemble` carry the same `--unit`, keep `--append`, and re-render. **Never\ngenerate a second demonstration without a fresh explicit yes** — the first one\nis the skill's second half; every one after it is marginal spend for marginal\npersonalization.\n\n**10 — Deck mode (OPT-IN; ask once, and only after step 9).** Steps 7–9 produce\na deterministic report: a renderer places every number, so no model can invent\none. Deck mode produces something different — ONE authored, deck-grade,\npersonalized page over the same verified data — and pays for that freedom with\nmachine gates instead of with a deterministic renderer. Offer it in one\nquestion, naming the cost out loud:\n\n> *\"I can also build a deck-grade version of this — one self-contained page\n> that teaches the ideas and walks your own results, authored rather than\n> templated. It costs one more reasoning-model delegation (two if the gates\n> reject the first draft), and it only publishes if it passes them. Want it?\"*\n\n**Never build a deck without an explicit yes.** On yes:\n\n```bash\nsource \"$WORK\u002Fenv.sh\"\nRUNDIR=\"$(dirname \"$OUTPUT_PATH\")\"\nBRIEF=$($CLI deck brief --ranked \"$WORK\u002Franked.json\" --demos \"$WORK\u002Fdemos.json\" \\\n        --workdir \"$WORK\u002Fdeck\")\n```\n\n`deck brief` writes `$WORK\u002Fdeck\u002Fdeck-brief.md` — deterministically assembled\nfrom the same verified data the report rests on: the ranking, the honest-NOs,\nthe waste channel, every generated `.dot` verbatim with its gate verdicts, the\nhouse style\u002Ftechnique contract, the hard self-containment constraints, and the\nfour MANDATES that make the gates passable. Delegate to a **fresh-context\n`reasoning` sub-agent** whose instruction is exactly that file; it writes ONE\nfile, `deck.html`, into `$WORK\u002Fdeck\u002F`. **Cost: one delegation; at most two if\nthe gates reject the first draft; never more.**\n\n**Drive that delegation across resumed turns, not one giant request.** A deck is\ntens of thousands of tokens of markup, and a single request that tries to emit\nthe whole file in one response reliably exceeds the provider's ~600 s request\ntimeout and loses the work. Have the fresh-context author build the file up in\nseveral turns — the document head\u002Fstylesheet\u002F`\u003Cdefs>` first, then one section\nper turn, then the dialogs and the closing script — resuming the same session\neach turn so it is still ONE fresh context. The brief tells the author this too;\nit is stated here because the orchestrating session is what sequences the turns.\n\nThen gate it:\n\n```bash\n$CLI deck verify --deck \"$WORK\u002Fdeck\u002Fdeck.html\" \\\n    --ranked \"$WORK\u002Franked.json\" --demos \"$WORK\u002Fdemos.json\" \\\n    --report \"$WORK\u002Fdeck\u002Fdeck-gate-report.txt\"\n```\n\n`deck verify` is deterministic and it is the only thing that decides whether the\ndeck publishes. Six gates: **(a)** the HTML parses; **(b)** the page is\nself-contained — no `\u003Cimg>`\u002F`\u003Clink>`\u002F`\u003Cscript src>`\u002F`@import`\u002F`\u003Ciframe>`\u002F\n`srcset`, `url(` only as `url(#…)`, exactly two https links, zero `file:\u002F\u002F`;\n**(c)** every modal has a trigger and every trigger has a modal; **(d)** every\nnumber displayed in visible text re-verifies against the run data or against a\nderivation the deck itself declares, with provenance, in its\n`\u003Cscript type=\"application\u002Fjson\" id=\"derived-values\">` block — **an undeclared\nnumber is FATAL, same as step 5**; **(e)** every pipeline diagram matches its\nreal `.dot` node-for-node and edge-for-edge (an edge MULTISET comparison, so a\nback-edge quietly not drawn is caught); **(f)** the **structural depth gate** —\nevery `\u003Cdialog>` carries the five parts the style contract mandates (a title and\nkicker, at least two `\u003Ch4>` sub-sections, an `evidence` inset quoting the\nreader's own verified data, a `why`, and an `entry` point). It counts structure,\nnever length, so padding cannot buy a pass and an honest short modal is never\npunished. Exit 0 means all six passed; **exit 3 means a gate came back red and\nthe deck must NOT be published**.\n\nIf it exits 3, re-delegate **ONCE** with `$WORK\u002Fdeck\u002Fdeck-gate-report.txt`\nappended verbatim, then re-verify. Still red? **Do not publish.** Say which\ngates failed and move on — the report and the demonstrations are already\ncomplete artifacts. On green, publish it beside the report:\n\n```bash\ncp \"$WORK\u002Fdeck\u002Fdeck.html\" \"$RUNDIR\u002Fattractor-scout-deck.html\"\n```\n\n**Optional vision rung — only AFTER `deck verify` passes.** If a\nvision-analysis tool is available in this session, render the published deck to\nimages, stitch them, and inspect for layout defects (overlap, clipping,\nunreadable contrast, a diagram running off its viewBox). At most **one** fix\nround: hand the defects back to the same fresh-context author, re-run\n`deck verify` (a visual fix must not break a gate), and republish. If no such\ntool is available, do **not** imply it was checked — leave the honest label in\nthe deck's footer comment:\n\n```\n\u003C!-- vision QA: NOT RUN -->\n```\n\nSame ladder philosophy as the demo lint rung: a rung that could not run is\n*labelled*, never silently treated as a pass.\n\n---\n\n## Hard rules (non-negotiable — these are the trust contract)\n\n- **Own data only. Nothing leaves the machine.** The label\u002Fcluster\u002Fverdict\u002F\n  author passes reason over **local text**; there is no network egress. Skip\n  any write-only or read-blocked endpoint; sessions whose metadata explicitly\n  labels them as originating from another source are out of scope. The\n  top-level `--root` lever (it precedes the subcommand: `$CLI --root \u003Cpath>\n  extract ...`) exists only to point at *your own* context-intelligence tree —\n  **never point it at another user's corpus or a shared mount**; this skill\n  mines the caller's own history, nobody else's.\n- **Tier C (local JSONL) is the floor, and it is fully sufficient.** Every\n  signal expresses at Tier C — this is the proven path. A personal graph\n  (Tier A\u002FB) is an *optional sharpener* for counts and joins; it is **never a\n  precondition**. If no graph answers, run at Tier C and say so with an honest\n  one-line note. Never let the graph become required for a rung to appear.\n- **Whose work it is is PRESUMED, never asserted — and never presumed to be\n  yours.** Nothing in the session record positively marks a human: there is no\n  argv, no mode, no tty flag, no launcher recorded at session start, so\n  `human-presumed` (`R4`) is the strongest claim the data supports and\n  `unknown` (`R5`) is a real answer, not a soft yes. Only `R4` sessions feed\n  the ranking; `R0`–`R3` and `R5` are counted in the provenance panel and kept\n  out of it. A unit with no author verdict is `unattributed`, never human. When\n  you report, name what was held back — a smaller, honest map beats a fuller\n  one that mixes an agent's work in with the user's.\n- **Honest-NOs are first-class output**, never dropped, never padded into the\n  opportunity list to lengthen it. Each carries its verdict, the sub-test it\n  failed (`recipe` \u002F `one-shot` \u002F `fragile`), and its remediation.\n- **Provisional flags surface in the artifact verbatim.** A unit seen in only\n  2–3 sessions is admitted but flagged `provisional`. A `PASS-provisional`\n  recovery is labelled as such. And **UNKNOWN never renders as FAIL** — a unit\n  whose resilience was never stress-tested is `OPPORTUNITY(unproven)`, a\n  caveat on an opportunity, not a decline. Most sessions never hit an error at\n  all; \"no bad day observed\" is not \"would not survive a bad day.\"\n- **Fail loud on an empty root** — exact string `looked in \u003Croot>, found 0`,\n  non-zero exit. Never invent a count.\n- **What you authored, you cannot certify.** A demonstration your delegate\n  wrote is not something you may vouch for. Asked whether it is right, answer\n  in three parts and no fourth: what a machine checked and what it said\n  (verbatim), what nothing checked (whether the prompts fit their workflow,\n  whether the gate is the right definition-of-done, whether it solves the\n  problem they actually have), and the independent path\n  (`examples\u002Fauthoring\u002Fpipeline-author.dot`, plus the CLI install line). Never\n  \"yes, I'm sure.\"\n- **Never auto-fetch. Ask before any `uvx`.** The bundled doctrine checker is\n  the floor and it always runs, so a \"no\" costs nothing but a label. An inbound\n  public-package fetch is not data egress — say that plainly — but unrequested\n  network activity inside a local-only promise is still a trust violation. And\n  never run `uv tool install`: that line is text the user may choose to run.\n- **Generated `.dot`\u002F`.md` land beside the HTML, never in a repo** — under\n  `attractor-scout-demos\u002F` next to `$OUTPUT_PATH`, and only *after* the gates\n  finish. A demo whose gates came back red is not published at all; an\n  unverified-but-labelled demo is. **The deck lands there too**, as\n  `attractor-scout-deck.html` — never in a repo, and never before\n  `deck verify` exits 0.\n- **Deck mode is opt-in, and a gate-failed deck never publishes.** Ask once,\n  name the cost, and build nothing without a yes. The deck is *authored*, so\n  it does not inherit the renderer's structural guarantee — it earns trust from\n  `deck verify` instead, and a red gate after the one retry means the deck is\n  discarded, not shipped with a caveat. The report and the demonstrations are\n  already complete artifacts; a deck is a bonus, never a hostage.\n- **Every number a deck displays is re-verified or declared.** The deck may do\n  arithmetic the run data does not contain — a total, a percentage, a unit\n  conversion — but it must declare each one, with its provenance, in its own\n  `derived-values` block. An undeclared number is FATAL. And where the run has\n  no value for something, the deck says so out loud; it never fills the hole.\n- **The artifact is not the success test.** A pretty HTML file proves nothing;\n  the ranking is only trustworthy because every count in it was re-verified\n  against the raw records (step 5, `--strict`). Ship the map, but the map earns\n  trust from that gate.\n\n---\n\n## Output\n\nOne **self-contained HTML** opportunity map (inlined CSS\u002FJS, no network\nreferences), written to `$OUTPUT_PATH`. It carries the ranked opportunities,\nthe honest-NOs, the waste channel, and a **provenance panel**: how many of your\nsessions landed on each rung, sample evidence for each, the already-automated\nfootprint, and the honest note about what could not be attributed and why. That is the current working directory\nby default, or an **`AGENTS.md`-guided output path** if the repo declares one.\nNever write the user's mined data into a shared repo — their session history\nbelongs in their own artifact.\n\nPlus, when demonstrated: `attractor-scout-demos\u002F\u003Cslug>.dot` + `.md` beside it.\nThe HTML embeds the pipeline text as well as naming that path, so the artifact\nstays self-contained if the folder ever moves. The one hyperlink it carries is\nthe published explainer — an anchor a reader may follow, not a resource the\npage loads.\n\nPlus, when deck mode was accepted AND every gate passed:\n`attractor-scout-deck.html` beside them — one authored, self-contained,\ndeck-grade page over the same verified data, carrying exactly two outbound\nanchors (the explainer and the bundle repository) and loading nothing. A deck\nthat failed `deck verify` is never written there at all.\n\n---\n\n## Notes\n\n- The working name `attractor-scout` lives in **one place**,\n  `scripts\u002Fattractor_scout\u002Fnaming.py` (`SKILL_NAME`). Renaming the skill means\n  changing that constant, this directory, and the `name:` above — nothing else\n  hardcodes the string.\n- Every quantitative claim above (\"~18% flip\", \"78% upgrades\", \"0 of 2 in\n  10\u002F10\") is pinned to the in-repo evidence file `evals\u002FREADME.md`, and a\n  doc-guard test (`tests\u002Ftest_skill_doc_claims.py`) fails if a pinned number in\n  this file drifts from that source. The deterministic acceptance gates are in\n  `tests\u002F` and run standalone with `pytest tests`.\n",{"name":5,"version":44,"model_role":45,"description":46,"allowed-tools":47,"user-invocable":51,"disable-model-invocation":51},"1.0.0","reasoning","Use when someone asks what to automate, what they keep doing by hand, or to scout their own sessions for attractor opportunities (\"\u002Fattractor-scout\", \"mine my own work for pipelines\"). Mines YOUR OWN context-intelligence history for recurring, costly work that would survive a loop; ranks it, honest-NOs first-class, writes a self-contained HTML map. Own data only, nothing leaves the machine.\n",[48,49,50,32],"bash","read_file","write_file",true,"main","36bff7b285b50df91050552eebf16d12718e6b54","skills\u002Fattractor-scout",4,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-10-10 05:54:50",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":51},[63,66,69],{"tool":64,"command":65},"npx","npx skills add microsoft\u002Famplifier-bundle-attractor --skill attractor-scout",{"tool":67,"command":68},"bunx","bunx skills add microsoft\u002Famplifier-bundle-attractor --skill attractor-scout",{"tool":70,"command":71},"pnpm","pnpm dlx skills add microsoft\u002Famplifier-bundle-attractor --skill attractor-scout","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002FSKILL.md",[74,80,84,90,94,98,102,106,110,114,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"evals\u002Fgate1_verdict_tier_ab.py","SCRIPT","脚本",11571,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fevals\u002Fgate1_verdict_tier_ab.py",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"evals\u002Fgate2_author_admission.py",13211,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fevals\u002Fgate2_author_admission.py",{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"evals\u002FREADME.md","REFERENCE","参考文档",14846,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fevals\u002FREADME.md",{"path":91,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":92,"sourceHtmlUrl":93},"evals\u002Freal_corpus_arms.py",21444,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fevals\u002Freal_corpus_arms.py",{"path":95,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":96,"sourceHtmlUrl":97},"fixtures\u002F__init__.py",146,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ffixtures\u002F__init__.py",{"path":99,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":100,"sourceHtmlUrl":101},"fixtures\u002Fdeck_fixture.py",25688,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ffixtures\u002Fdeck_fixture.py",{"path":103,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":104,"sourceHtmlUrl":105},"fixtures\u002Fdemo_fixture.py",13706,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ffixtures\u002Fdemo_fixture.py",{"path":107,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":108,"sourceHtmlUrl":109},"fixtures\u002Fsynthetic_corpus.py",34558,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ffixtures\u002Fsynthetic_corpus.py",{"path":111,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":112,"sourceHtmlUrl":113},"pyrightconfig.json",159,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fpyrightconfig.json",{"path":115,"resourceType":116,"resourceTypeDesc":117,"sizeBytes":118,"sourceHtmlUrl":119},"pytest.ini","OTHER","其他",281,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fpytest.ini",{"path":121,"resourceType":116,"resourceTypeDesc":117,"sizeBytes":122,"sourceHtmlUrl":123},"ruff.toml",704,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fruff.toml",{"path":125,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":126,"sourceHtmlUrl":127},"scripts\u002Fattractor_scout_cli.py",22180,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout_cli.py",{"path":129,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":130,"sourceHtmlUrl":131},"scripts\u002Fattractor_scout\u002F__init__.py",1629,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002F__init__.py",{"path":133,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":134,"sourceHtmlUrl":135},"scripts\u002Fattractor_scout\u002Fauthor.py",7733,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fauthor.py",{"path":137,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":138,"sourceHtmlUrl":139},"scripts\u002Fattractor_scout\u002Fauthoring_contract.py",46826,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fauthoring_contract.py",{"path":141,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":142,"sourceHtmlUrl":143},"scripts\u002Fattractor_scout\u002Fclustering.py",11820,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fclustering.py",{"path":145,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":146,"sourceHtmlUrl":147},"scripts\u002Fattractor_scout\u002Fdeck_templates.py",39141,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fdeck_templates.py",{"path":149,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":150,"sourceHtmlUrl":151},"scripts\u002Fattractor_scout\u002Fdeck.py",51433,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fdeck.py",{"path":153,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":154,"sourceHtmlUrl":155},"scripts\u002Fattractor_scout\u002Fdemo_templates.py",24094,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fdemo_templates.py",{"path":157,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":158,"sourceHtmlUrl":159},"scripts\u002Fattractor_scout\u002Fdemo.py",31025,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fdemo.py",{"path":161,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":162,"sourceHtmlUrl":163},"scripts\u002Fattractor_scout\u002Fdiscover.py",17997,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fdiscover.py",{"path":165,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":166,"sourceHtmlUrl":167},"scripts\u002Fattractor_scout\u002Ferrors.py",2010,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Ferrors.py",{"path":169,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":170,"sourceHtmlUrl":171},"scripts\u002Fattractor_scout\u002Fextract.py",17741,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fextract.py",{"path":173,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":174,"sourceHtmlUrl":175},"scripts\u002Fattractor_scout\u002Ffit_cycle.py",5243,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Ffit_cycle.py",{"path":177,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":178,"sourceHtmlUrl":179},"scripts\u002Fattractor_scout\u002Ffit_gate.py",7369,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Ffit_gate.py",{"path":181,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":182,"sourceHtmlUrl":183},"scripts\u002Fattractor_scout\u002Ffit_recovery.py",4946,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Ffit_recovery.py",{"path":185,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":186,"sourceHtmlUrl":187},"scripts\u002Fattractor_scout\u002Ffrequency_signature.py",3986,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Ffrequency_signature.py",{"path":189,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":190,"sourceHtmlUrl":191},"scripts\u002Fattractor_scout\u002Fgraph.py",4659,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fgraph.py",{"path":193,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":194,"sourceHtmlUrl":195},"scripts\u002Fattractor_scout\u002Fhonest_no.py",5483,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fhonest_no.py",{"path":197,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":198,"sourceHtmlUrl":199},"scripts\u002Fattractor_scout\u002Fleverage.py",7666,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fleverage.py",{"path":201,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":202,"sourceHtmlUrl":203},"scripts\u002Fattractor_scout\u002Fnaming.py",1078,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fnaming.py",{"path":205,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":206,"sourceHtmlUrl":207},"scripts\u002Fattractor_scout\u002Fpipeline.py",5498,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fpipeline.py",{"path":209,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":210,"sourceHtmlUrl":211},"scripts\u002Fattractor_scout\u002Fprovenance.py",26020,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Fprovenance.py",{"path":213,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":214,"sourceHtmlUrl":215},"scripts\u002Fattractor_scout\u002Franking.py",12934,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Franking.py",{"path":217,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":218,"sourceHtmlUrl":219},"scripts\u002Fattractor_scout\u002Frender.py",27581,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Fscripts\u002Fattractor_scout\u002Frender.py",{"path":221,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":222,"sourceHtmlUrl":223},"tests\u002Fconftest.py",712,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Fconftest.py",{"path":225,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":226,"sourceHtmlUrl":227},"tests\u002Ftest_gate0_faillowd_schema_scope.py",7529,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_gate0_faillowd_schema_scope.py",{"path":229,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":230,"sourceHtmlUrl":231},"tests\u002Ftest_no_real_data_leak.py",11069,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_no_real_data_leak.py",{"path":233,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":234,"sourceHtmlUrl":235},"tests\u002Ftest_scenario1_author_gate.py",7183,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario1_author_gate.py",{"path":237,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":238,"sourceHtmlUrl":239},"tests\u002Ftest_scenario10_deck_brief.py",9588,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario10_deck_brief.py",{"path":241,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":242,"sourceHtmlUrl":243},"tests\u002Ftest_scenario11_session_provenance.py",27318,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario11_session_provenance.py",{"path":245,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":246,"sourceHtmlUrl":247},"tests\u002Ftest_scenario12_batch_boundary.py",13910,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario12_batch_boundary.py",{"path":249,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":250,"sourceHtmlUrl":251},"tests\u002Ftest_scenario2_frequency.py",6170,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario2_frequency.py",{"path":253,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":254,"sourceHtmlUrl":255},"tests\u002Ftest_scenario3_leverage.py",5786,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario3_leverage.py",{"path":257,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":258,"sourceHtmlUrl":259},"tests\u002Ftest_scenario4_fit.py",6723,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario4_fit.py",{"path":261,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":262,"sourceHtmlUrl":263},"tests\u002Ftest_scenario5_honest_no.py",8653,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario5_honest_no.py",{"path":265,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":266,"sourceHtmlUrl":267},"tests\u002Ftest_scenario6_demo_assembly.py",16913,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario6_demo_assembly.py",{"path":269,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":270,"sourceHtmlUrl":271},"tests\u002Ftest_scenario7_verification_ladder.py",10376,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario7_verification_ladder.py",{"path":273,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":274,"sourceHtmlUrl":275},"tests\u002Ftest_scenario8_demo_render.py",12020,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario8_demo_render.py",{"path":277,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":278,"sourceHtmlUrl":279},"tests\u002Ftest_scenario9_deck_gates.py",23711,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_scenario9_deck_gates.py",{"path":281,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":282,"sourceHtmlUrl":283},"tests\u002Ftest_skill_doc_claims.py",10919,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_skill_doc_claims.py",{"path":285,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":286,"sourceHtmlUrl":287},"tests\u002Ftest_vendored_doctrine_checker_pin.py",4035,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractor-scout\u002Ftests\u002Ftest_vendored_doctrine_checker_pin.py",[289],{"skillNo":290,"name":291,"nameZh":6,"description":292,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":293,"categories":294,"keywords":300,"publishedAt":39},"01M6FMC7V0AR48J288T8H5HPE8","attractorify","Use when the session might warrant an attractor pipeline: decide whether one is, then design it conversationally if so. Triggers: \"\u002Fattractorify\", \"should this be an attractor?\", \"design a pipeline for\", \"attractorify this\", \"do I need an attractor pipeline?\", \"turn this into a pipeline\".","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Famplifier-bundle-attractor\u002Fblob\u002Fmain\u002Fskills\u002Fattractorify\u002FSKILL.md",[295],{"categoryNo":296,"categoryName":297,"taxonomyType":298,"taxonomyTypeDesc":299},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",[291,301,45,38,302,36,303,32,31,30,304,28,305,306,307,308],"design","pipeline","decide","session","do","triggers","it","design it"]