← LegalQuants LitigationCONTENT HISTORY

Update to LegalQuants Litigation

Snapshot Sep 30, 2026 · 23:15 UTC · version 0.1.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Regulatory research, refreshing earlier research, jurisdiction comparison and legality checks built on primary sources — retrieves the instrument from its official publisher, proves which version it is, and quotes only from the bytes it fetched. Use when the user has a regulation problem: understanding what a law requires, checking whether text they hold is current, re-running earlier research against the instrument as it stands today, or comparing how a rule differs across markets. Domain- and sector-agnostic: any instrument, country or area of law. Trigger even without the word \"regulatory\" — e.g. \"what does the AI Act require,\" \"is this still in force,\" \"has this changed since we advised,\" \"how does this differ in the UK,\" \"we're planning to launch X, where does that land,\" \"find me the actual text of,\" \"is our compliance memo out of date.\" Answers questions about legal requirements with cited support; identifies unresolved facts and judgments without deciding disputed application questions.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 274
    },
    {
      "relative_path": "references/citation-handoff.md",
      "size_in_bytes": 2792
    },
    {
      "relative_path": "references/construction-rubric.md",
      "size_in_bytes": 10659
    },
    {
      "relative_path": "references/discovery.md",
      "size_in_bytes": 7671
    },
    {
      "relative_path": "references/jurisdictions/_unmapped.md",
      "size_in_bytes": 7837
    },
    {
      "relative_path": "references/jurisdictions/eu.md",
      "size_in_bytes": 7821
    },
    {
      "relative_path": "references/jurisdictions/index.md",
      "size_in_bytes": 2728
    },
    {
      "relative_path": "references/jurisdictions/sg.md",
      "size_in_bytes": 6689
    },
    {
      "relative_path": "references/jurisdictions/uk.md",
      "size_in_bytes": 6711
    },
    {
      "relative_path": "references/jurisdictions/us-ca.md",
      "size_in_bytes": 7755
    },
    {
      "relative_path": "references/jurisdictions/us-federal.md",
      "size_in_bytes": 9713
    },
    {
      "relative_path": "references/run-format.md",
      "size_in_bytes": 14416
    },
    {
      "relative_path": "references/version-check.md",
      "size_in_bytes": 6340
    },
    {
      "relative_path": "scripts/check_receipt.py",
      "size_in_bytes": 13036
    },
    {
      "relative_path": "scripts/diff_runs.py",
      "size_in_bytes": 17724
    },
    {
      "relative_path": "scripts/extract_provisions.py",
      "size_in_bytes": 34569
    },
    {
      "relative_path": "scripts/fetch_source.py",
      "size_in_bytes": 11977
    },
    {
      "relative_path": "scripts/integrity.py",
      "size_in_bytes": 11568
    },
    {
      "relative_path": "scripts/read_version.py",
      "size_in_bytes": 7809
    },
    {
      "relative_path": "scripts/record_transformation.py",
      "size_in_bytes": 1904
    },
    {
      "relative_path": "scripts/verify_quotes.py",
      "size_in_bytes": 34389
    }
  ],
  "name": "regulatory",
  "skill_md_contents": "---\nname: regulatory\ndescription: >-\n  Regulatory research, refreshing earlier research, jurisdiction comparison and\n  legality checks built on primary sources — retrieves the instrument from its\n  official publisher, proves which version it is, and quotes only from the bytes\n  it fetched. Use when the user has a regulation problem: understanding what a\n  law requires, checking whether text they hold is current, re-running earlier\n  research against the instrument as it stands today, or comparing how a rule\n  differs across markets.\n  Domain- and sector-agnostic: any instrument, country or area of law.\n  Trigger even without the word \"regulatory\" — e.g. \"what does the AI Act\n  require,\" \"is this still in force,\" \"has this changed since we advised,\"\n  \"how does this differ in the UK,\" \"we're planning to launch X, where does\n  that land,\" \"find me the actual text of,\" \"is our compliance memo out of\n  date.\" Answers questions about legal requirements with cited support;\n  identifies unresolved facts and judgments without deciding disputed\n  application questions.\n---\n\n# /regulatory\n\n## Profile & playbook (per AGENTS.md — clean separation)\n\n**Read:** exactly one thing before working — your own namespace in\n`lqplaybook.md` (`[regulatory] ...` confirmed lines: house citation format,\njurisdictions this user works in, how much version detail they want on\nscreen). If the file or namespace is absent, use defaults. Apply them over the defaults here. Read nothing else; the journey\nfile never influences work product. If the user asks \"explain how this works\"\nor wants coaching, you may read their archetype from `lqprofile.md` and pitch\nthe explanation at their level. A one-line declinable walkthrough offer on\nfirst use is fine.\n\n**Write:** nothing to the journey — the scribe owns that. One exception: when\nthe user reveals a preference in-session (a citation style, a jurisdiction they\nalways need alongside another), propose the exact `[regulatory]` playbook line\nand write it only on an explicit yes.\n\nNever client-identifying facts, in any entry.\n\n## The one rule\n\n> **Secondary sources tell you an instrument exists. Only the official\n> publisher tells you what it says.**\n\nNothing is quoted that did not come from the publisher's own bytes. Not from a\nsearch result, not from a law firm note, not from a tracker, not from a\ndatabase, not from memory, and not from a web-fetch tool's rendering of a page\n— that is a model's summary of the text, not the text.\n\nTrackers, alerts and search are excellent for **finding** instruments. Use them\nfor that. They are never the source layer.\n\n## The second rule\n\nAnswer the question about legal requirements, connecting the verified provisions\nto the supplied facts and clearly stated assumptions. Distinguish law, official\nguidance and additional contract terms. Reserve unresolved factual findings,\ndisputed interpretations and evaluative judgments for the lawyer; explain the\nprecise issue and evidence needed, rather than withholding an answerable duty.\n\n`references/construction-rubric.md` governs this in detail. Read it before\nwriting any output.\n\n## What this produces\n\nTwo labelled levels: **Your answer** (normally 150–250 words, essential citations,\nassumptions and qualifications) then **Supporting analysis**. The initial chat\nmust state the substance of the answer, even when a fuller file is delivered.\nKeep version qualifications brief unless they change or prevent the answer.\nSource receipts, hashes, amendment history and extraction diagnostics belong in\na separate verification record. For broader questions, explain a necessary\nlength exception briefly; do not repeat points across sections.\n\nUse a temporary run folder inside the user's workspace for official bytes and\none master extraction dataset per instrument, even for an on-screen answer.\nPersistent retention is optional: offer to keep the audit package; otherwise\nremove temporary material on completion and disclose that no retained package\nwill remain. Never describe ephemeral verification as a retained audit package.\n\n`references/run-format.md` gives the shape of the note, the rules for quoting\nand what a saved folder holds. The quoting rules there are enforced by a script,\nso read it before writing a note.\n\n## Intake\n\nAsk one question at a time. Skip any the user has already answered — most\npeople open with question 1 unprompted. Never ask all of these at once.\n\n**Before the fetch, ask only these two:**\n\n1. What's the problem? Tell me the way you'd tell a colleague.\n2. Is there a specific law or rule in play, or are you trying to work out what\n   applies?\n\n**Then retrieve the text.** Use any supplied link immediately. Establish the\njurisdiction and research/as-of date before selecting a version; ask only if\nmissing and material. Ask about activity, role, location and missing facts only\nwhen needed to answer the question. Do not demand a client name.\n\nA material version problem merits a short progress update. It does not replace\nthe answer-first delivery. Ask about persistent retention before keeping a run;\ntemporary verification does not depend on that choice.\n\n`check` runs this order differently, because it has no instrument to fetch until\nthe conduct is described. Its section says how.\n\nDo **not** ask about size or thresholds — the instrument generates those, and\nasking first anchors the analysis. Do not ask \"which regulators do you watch\";\nthat is a monitoring product's question, and this skill starts before you know\nwhat catches you. Do not ask about sector or output format.\n\n## Routing\n\nIf the user typed a shortcut — `research`, `refresh`, `compare`, `check` — use\nit. `track` is the older name for `refresh` and still routes there.\nOtherwise route on what they said:\n\n| They gave you | Workflow |\n|---|---|\n| A named instrument, or a link, or \"what does X require\" | `research` |\n| Two or more jurisdictions, or \"how does this differ in...\" | `compare` |\n| Something the client does, plans, or is about to ship | `check` |\n| An earlier run plus \"what's changed\" / \"is this still right\" | `refresh` |\n\nGenuinely ambiguous → ask intake question 1. It is not wasted work.\n\n## The spine\n\nAll four workflows run this. It is the whole value; the workflows are what you\ndo with the result.\n\nRead `references/version-check.md` and `references/jurisdictions/index.md`\nevery run, then the entry for the jurisdiction in play. If there is no entry,\nread `references/jurisdictions/_unmapped.md` and follow it — do not guess a\npublisher.\n\n### 1. Identify the instrument\n\nGet to a specific instrument: name, number, year, jurisdiction. Search and\ntrackers are fine here — this is finding, not sourcing. If the user described a\nproblem rather than a law, name the candidates and go to step 2.\n\n### 2. Confirm with the user before fetching\n\nState the instrument you are about to fetch and the publisher you will fetch it\nfrom. One line, and carry on unless they stop you. Fetching the wrong\ninstrument well is worse than fetching nothing.\n\n### 3. Fetch from the official publisher\n\n    python3 scripts/fetch_source.py <url> <dir> --publisher <host> --label \"<version>\" \\\n        --jurisdiction <code> --profile <source-profile-id> --instrument-id <stable-id>\n\n`--publisher` comes from the registry entry. The script refuses to save\nanything that redirects off that host. If it refuses, report that — do not fall\nback to a secondary source.\n\nA redirect that stays on the publisher is reported, not refused, and the notice\nis worth reading: some are the publisher canonicalising your URL, and some are\nan error page served with HTTP 200 from the right host. Read the saved bytes\nbefore quoting from them.\n\nRead the registry entry's \"Getting the bytes\" section before the first fetch of\na jurisdiction. Publishers differ in what they will serve to a script, and the\nentry says what was needed — California, for one, needs a trust store its\ncertificate chain resolves in.\n\n**Then check that what came back is what you asked for.** Publishers serve\nranges of sections on one page, and a range URL answers successfully whether or\nnot your provision is inside it: California's group pages are cut by title, and\n§1798.82 sits in Title 1.81 while the adjacent group is Title 1.81.5. The host\nis right, the bytes are a real statute, and the provision is absent. So search\nthe saved file for the number you came for before going on. If it is not there,\nthe remedy is another fetch — the individual section's own URL — and the finding\nis about the fetch. Extraction has not been tried yet and cannot be blamed.\n\n**Four findings, kept apart.** Before anything is quoted, establish and state\neach of these separately: **publisher identity** — whose site this is;\n**publication authority** — what this copy *is*, the authentic text or a\nconvenience copy; **language** — authentic, second authentic, or translation;\nand **version**. They are independent findings, and collapsing any two of them\nis how an unofficial copy comes to be labelled official.\n\nThe trap is site furniture. A page's language notice — *\"the English language\nversion is always the official and authoritative version of this website\"* — is\na translation-widget disclaimer about the website. It establishes nothing about\nthe legal authority of the statute printed on it, and the same publisher may say\nin its own user guide that the text is unofficial. Both were true of Illinois at\nonce. So quote the publisher's statement about the **statutory text**, not a\nnotice that happens to contain the word \"official\"; if the publisher makes no\nsuch statement, that absence is the finding, and it gets written down.\n\nA government-hosted convenience copy that disclaims its own authenticity can\nstill carry a qualified answer — that is the default, and a firm may set a\nstricter one. What it can never do is carry a silent one. Put the publisher's\ndisclaimer in the note, in its own words, and name the authentic publication\nthat would settle the point.\n\n### 4. Check the version\n\n    python3 scripts/read_version.py <dir>/source.html --jurisdiction <code> --json <dir>/version.json\n\nNon-zero exit means the publisher's own markers say this is not the text to\nquote. **Refetch the version the marker names.** A caveat on a stale quote is\nstill a stale quote.\n\nNo recognized marker is also non-zero and blocks extraction. For a dated\nquestion about superseded law, record both `--historical-effective <date>` and\n`--research-date <date>`; this creates an explicit historical selection rather\nthan weakening the current-law check.\n\nThen do the part no regex does: read the amendment list and say which of them\ntouch the provisions this question turns on; check commencement for the\nprovisions you are relying on, not for the instrument; check whether anything\nyou plan to quote is tagged prospective.\n\n### 5. Extract the provisions\n\n    python3 scripts/extract_provisions.py <dir>/source.html <dir>/provisions.json --provenance <dir>\n\nConfirm the numbering convention if it is not obviously right — the script\nreports what it detected, and `--calibrate-only` shows the counts without\nwriting anything. Everything downstream cites these ids, so a wrong convention\nfails quietly.\n\nAutomatic detection needs two headings before it commits, because one line that\nreads like a heading is more often a cross-reference. **A single-section source\nis normal, not a refusal** — most code sections are published on their own page.\nWhen the script reports one heading it names the convention; confirm it with\n`--pattern <name>` and extraction runs normally, keeping the section's\nsubdivisions. Confirm it the same way in every workflow, and record that you\nconfirmed it. What you may never do is force a convention the text does not use:\nthat is a run whose every quote is cited to one undivided block, and the script\nnow refuses it rather than reporting a calibration it did not achieve.\n\nExtraction also refuses a source in which two provisions come out under the same\nlabel or the same id. That is the one break with no downstream signal: a note\nquoting either one cites a real section and passes the checker, just not the\nsection the words came from. It is usually the publisher's page furniture — a\ncontents list, a breadcrumb or a page title repeating a heading the body also\ncarries — so fetch the section or chapter itself rather than an index or search\nview. It is a finding about the source, not something to edit away.\n\n**When extraction refuses, the source is evidence, not a formatting problem.**\nThe refusal is about the document, so the only supported move is to name the\nconvention the text actually uses — `--pattern <name>` — or to stop and report\nwhat the file looks like. Four things are out of bounds, and testing found all\nfour: editing or rewriting the publisher's headings so they match a pattern;\nfetching a larger document to raise the heading count; hand-writing\n`provisions.json`; and piping text in rather than saving it. Each puts the model\nbetween the publisher and the quotation, which is the one thing this skill\nexists to prevent — and each broke something further downstream, so the run cost\ntwo to three times the tokens and several extra minutes and still answered\nnothing. If you find yourself repairing the tools instead of reading the law,\nthat is the signal to stop and say so.\n\n**A chaptered act is not the code it amends.** Fetch a session law — a\nCalifornia `SEC. 2.`, an Illinois Public Act — and the provisions are *act*\nsections, each containing the code section it enacts. The act's own numbering is\nwhat the run cites. Two consequences worth stating in the note: a code-section\ncitation must name the act section carrying it, and a bill that carries several\nalternative versions of one code section (California's `SEC. 2.` through\n`SEC. 2.3.`) has them all extracted side by side. Which one took effect is a\nquestion for the act's own operative-condition sections, read in step 4 — never\na choice made during extraction.\n\nThe output classes every provision (`recital`, `preamble`, `operative`,\n`annex`, `schedule`) and indexes every term the instrument defines. Both\nmatter: nothing classed `recital` may be quoted as imposing a duty, and any\nordinary word the instrument defines is not being used in its ordinary sense.\nThe output also carries the instrument identity and exact source lineage. If a\nPDF or other publisher file was converted to text, write `transformation.json`\nas described in `references/run-format.md`; extraction refuses an unreceipted\nderivative.\n\n### 6. Construe, and quote\n\nPer `references/construction-rubric.md`. Quote verbatim from the fetched text.\nGive the provision and the version each quote came from. Lay the note out as\n`references/run-format.md` describes — the format is what makes step 7 possible.\n\n### 7. Check the quotes before the note goes out\n\n    python3 scripts/verify_quotes.py <dir>/note.md <dir>/provisions.json \\\n        --depends-on <provision-id>=\"<why unquoted text affects the analysis>\"\n\nEvery quote must be verbatim from the fetched bytes and cited to the provision\nthe words actually live in. Do this even when the note is only going on screen\nand nothing is being saved — write it to a temporary file and check it there.\n\nThis is the one error that has no symptom. A paraphrase of a provision reads\nexactly as well as the provision, so it survives your own review and the\nlawyer's. If a quote fails, fix it or cut it. Never ship it with a caveat.\n\n**Fixing a quote means changing the quote, not the formatting around it.** A\nfailing quotation set as a code span, in bold, or in single quotes leaves the\nsame words in front of the lawyer and takes them out of this check; the run then\nexits 0 over fewer quotations than it started with. `verify_quotes.py` reports\n`unquoted-instrument-text` for words of the instrument carried outside quotation\nmarks, so the escape is closed — but the reason it is closed is that the coverage\nfalling is invisible in a way a failing quote never is. Broadening a pinpoint\nuntil the attribution check stops objecting is the same move: the citation gets\nvaguer, the check gets quieter, and the note now cites a thousand words for one\nsentence.\n\nRecord every unquoted definition, exception, scope, commencement, annex, or\ncross-reference the analysis depends on with a separate `--depends-on`. Quote\nverification recomputes the saved source and complete provenance chain before\naccepting the note.\n\n**The note ends with the links.** Every source you consulted, official ones kept\nseparate from everything else, with the addresses taken from the fetch receipts\nrather than retyped — `references/run-format.md`, \"Sources\". This is not a\ncourtesy at the end of the work. A reader who has to ask where a quotation came\nfrom has been handed a claim, and the run folder they would have found it in is\nusually deleted after delivery. `verify_quotes.py` refuses a note that does not\ncarry the address its text came from.\n\n## The four workflows\n\nEach is a delta on the spine, not a separate machine.\n\n### research — \"I need to understand this law.\"\n\nThe spine, then: the provisions that decide the question the user asked,\nquoted; the defined terms those provisions rest on; the outstanding questions.\n\nLead with the answer to the question. Include a version difference in that\nanswer only if it changes the answer or prevents a verified answer.\n\n### refresh — \"Is the research we already did still right?\"\n\nThis re-runs research you already hold against today's publisher text and\nreports the delta. It does not watch anything: nothing happens between the two\nruns, and a user who asks to \"track\" an instrument is usually picturing a\nstanding monitor. Say what this does — one line, at the start — so they know\nwhether they got what they wanted.\n\nNeeds an earlier saved run. Run the spine again into a **new dated folder** —\nnever over the old one, because the comparison can only use what is still there.\nThen:\n\n    python3 scripts/diff_runs.py <earlier>/provisions.json <later>/provisions.json \\\n        --manifest <earlier>/run.json\n\n`run.json` is the manifest `verify_quotes.py` wrote when the earlier note was\nverified. It preserves the complete provision set, while separately identifying\nquoted provisions and unquoted semantic dependencies. The diff compares only\nmatching instrument identities, assesses every preserved provision, and\nhighlights the identified dependencies. It never treats unchanged quotations as\nproof that the legal conclusion remains valid.\n\nLead with the provisions the earlier analysis rested on. The rest of the\npreserved set is listed in full beneath them — never dropped, because \"three\nthings changed elsewhere\" is what makes a lawyer ask to look.\n\n**The answer is about the later text, not about the refresh.** Open with the\nresult under the later version, the words that produce it, and any condition\nthat immediately limits that result. A lawyer who reads the first paragraph and\nstops should have all three. Everything below is support for them.\n\nFour openings fail that test, and all four are recorded:\n\n- **The fate of the earlier research.** \"Completed; earlier research is\n  unchanged\" is a fact about files. An amendment does not reach back and change\n  what the earlier analysis said about the earlier text, so preservation is an\n  audit fact and belongs in the verification record. One run opened with it and\n  then said the earlier conclusion materially changes — both true, about\n  different things, and left for the lawyer to reconcile. If the earlier\n  analysis was actually wrong, that is a correction, and it is said as one.\n- **The part that did not move.** One run opened with access eligibility, which\n  was unchanged, and reached the new prohibition on copying fees afterwards.\n  Lead with what moved. The conditions that survived follow it, and they are\n  shorter than they look.\n- **The software.** Comparator statuses, hashes, exit codes, pagination\n  artefacts and recovered shell errors go in the verification record, reachable\n  by one link. The exception is a failure that prevents a reliable answer: that\n  goes first, worded as what could not be established rather than as which\n  command exited non-zero.\n- **A banner repeated in every section.** \"Provisional and unverified\" four\n  times tells the lawyer nothing to do. Once, near the answer, name the source\n  actually checked, the edition it supports, what was not verified, and the\n  missing fact that would change the answer. Keep separate questions separate —\n  whether the text is official, whether it is in force, what identification a\n  requester must produce, whether a record falls in an exception. And **\"not\n  verified as in force\" does not mean \"not in force.\"**\n\n**A definition that appeared or moved is a change in the law's reach**, even\nwhere the provisions using the term are reported unchanged. `diff_runs.py`\nprints those under \"Defined terms\" from the extractor's own index. Follow the\nterm into the provisions that use it and say what it does there; a new\ndefinition of \"legal guardian\" reaches every subdivision that grants a guardian\naccess, and none of those subdivisions will show a single moved word.\n\n**Quote the amendment; do not describe it.** For every provision reported as\n`amended` or `replaced`, the diff hands over the words themselves — a `was` run\nand a `now` run for each region that moved. Put those in the answer as the\nbefore and after they are. Do not go back to the two source texts and write your\nown account of what changed: a paraphrase is the model authoring the amendment,\nand it is the one sentence in a refresh that `verify_quotes.py` cannot check.\nThe failure this prevents is quiet. An amendment that renames a custodian often\nre-anchors the anaphors further down the same provision — \"the department\" now\nmeans a different department, spelled out where it used to be implied. A summary\nthat reports the rename is true and still loses the second half. The words do\nnot lose it.\n\nWhere a run was extracted with `--no-text`, the diff says so instead of showing\nwords. That is a report of hashes only: name it as such, and do not fill the gap\nfrom the source texts.\n\n**Check a refresh note against both runs.** The `was` side of every amendment is,\nby construction, not in today's extraction, so step 7 has to be given the earlier\none as well:\n\n    python3 scripts/verify_quotes.py <later>/note.md <later>/provisions.json \\\n        --earlier <earlier>/provisions.json\n\nWithout `--earlier` every quotation of the text as it read comes back\n`not-in-text` — \"a rendering or a recollection, not the instrument\" — which is\nboth false and the accusation most likely to be worked around instead of\nanswered. With it, those quotations verify against the earlier run's hashed\nbytes, and the cite has to say which edition it is: `— § 1347.08(B)(2), as it\nread before the amendment`. A cite that does not say so fails as\n`superseded-as-current`, because repealed words quoted as current law are worse\nthan a misquote — every word of them is genuine.\n\nRead `replaced` carefully and explain it in full. It means the number survived\nbut now holds a different provision — the earlier note's citation still\nresolves, and resolves to something else. Do not describe it as an amendment,\nand do not go looking for where the old provision went: if it was repealed while\nits neighbours moved up, there is nowhere for it to have gone.\n\n`retitled` is the quieter neighbour of `replaced`: the heading changed over a\nbody the comparison found substantially kept. The earlier note's citation still\npoints at the provision it always did, under a name the publisher has retired.\nSay that the heading changed and that the rules did not, and do not import\n`replaced`'s warning into it — a recaption sends nobody looking for a repeal.\nWhere one of the runs was extracted with `--no-text` the body cannot be read at\nall, so a changed heading is reported as `replaced` on the conservative side;\nthat is a limit of the run, not a finding about the instrument, and it is\nresolved by re-extracting with text rather than by reasoning around it.\n\n**When the diff cannot run, that is the first line.** The earlier run may not\ncarry what a comparison needs — no `provisions.json`, no `run.json`, a different\ninstrument identity. Open with **Comparison blocked**, say which prerequisite is\nmissing, then describe the later research separately and by name: fetching,\nversion-checking and extracting today's text is real work and worth reporting,\nbut it is not a refresh, and \"Completed the refresh\" at the top of an answer\nwhose fourth bullet says the comparison never ran is a line a skimming reader\nwill act on. The earlier files stay exactly as they are — the missing baseline\nis never reconstructed, and a reconstructed one would make the diff a comparison\nof your own work against itself.\n\n### compare — \"How does this differ across our markets?\"\n\nRun the spine once per jurisdiction, separately versioned — they will not be\ncurrent to the same date, and saying so is part of the answer.\n\nOutput is one row per test, one column per jurisdiction, each cell citing that\njurisdiction's provision and its own version. Never merge two jurisdictions'\ntext into a single statement, and never let the jurisdiction you fetched first\nset the frame for the others. `references/run-format.md` gives the table's\nshape and the worked example.\n\nStep 7 runs per jurisdiction too: each column's quotes are checked against that\njurisdiction's own `provisions.json`.\n\nA stop is per jurisdiction as well. Name which columns resolved, which stopped,\nand at which step each one stopped: \"the extractor failed on all three\" is three\nseparate failures reported as one, and it buries the fact that they may have\nthree different remedies — or that one of them was never an extraction failure\nat all.\n\n### check — \"We're planning X. Where does it land?\"\n\nIntake runs the other way round. The other three workflows start from an\ninstrument and ask what it says; this one starts from conduct and has to work\nout which instruments are even in play. So the questions that select them come\nbefore the fetch, and the version finding lands later than usual. Say so when\nyou ask — the user is being asked more before they see anything back, and\nknowing why is the difference between intake and interrogation.\n\nBefore selecting instruments, establish any missing material facts:\n\n- What will they actually do? The activity, step by step, as it will happen.\n- Who is on the other side — consumers, businesses, children, employees?\n- Where does it happen, and where are the people it affects?\n- What is their role in the chain — do they build it, deploy it, resell it,\n  host it?\n- When does it start?\n\nUse links already supplied and ask only for remaining material facts.\n\n**A sector is not an activity.** \"We're a fintech\", \"it's a health app\" — those\nname a market, and instruments do not test markets. Ask once more: what does the\nthing do on the day a customer uses it? If the answer is still a product\ncategory, the analysis will be about a category and will be wrong.\n\n**A role is not an identity.** Instruments assign duties by role — provider and\ndeployer, controller and processor, manufacturer and importer — and one company\nholds different roles under different instruments, sometimes more than one under\na single instrument. Role follows from what they do in the transaction, so it\ncannot be settled before the activity is described concretely.\n\n**Discovery is its own phase, with its own gate.** Once the conduct is\ndescribed, read `references/discovery.md` and work it before fetching anything:\nmodel the activity on its dimensions — actor, object, action, affected people,\nplace, lifecycle stage, failure mode — and generate candidate instruments from\nevery populated one. Ask what could prohibit, license, recall or penalise the\nconduct, not only which subject headings apply. Name the plausible regulators\nbefore settling on instruments, and check their lists, registers and orders as\nwell as their statutes. Prefer false positives here: the spine kills a weak\ncandidate against the official text, but nothing downstream can resurrect the\ninstrument nobody named. A verified note is not a complete note — the discovery\ncoverage receipt is what closes the gap between the two.\n\n**The last question is doing more work than it looks.** A `check` is a question\nabout the future, so the version discipline changes shape: `research` asks\nwhether this is the current text, and `check` asks what will be in force when\nthey do this. A provision that is prospective today, or effective but not yet\noperative, or commenced for some Parts and not others, is precisely what this\nworkflow exists to catch — and each of those is printed on the page for a reader\nwho looks. Run step 4 against the launch date, not against today.\n\nThen the spine per candidate instrument, then the output: each provision the\nconduct engages, quoted, with the fact that would decide it and the class it\nfalls into. Where the conduct meets a standard rather than a bright line —\nreasonable, appropriate, proportionate — name the judgment being asked for and\nstop. That is where the lawyer's opinion starts and this skill's job ends.\n\n**Say what you did not check.** This is the only workflow whose failure is a\nfalse negative, and the spine cannot protect against it: it proves the text you\nfetched, never the instrument nobody thought of. So the note carries the\ndiscovery coverage receipt from `references/discovery.md` — the search surface,\nrow by row, with unworked branches marked unresolved rather than left silent —\nand every negative finding states which of the four kinds of nothing it is:\nexpressly excluded, test not met on the supplied facts, nothing found after the\nsearches named, or not investigated. Run the omission challenge before\ndelivery. \"We found nothing that catches this\" is a sentence this skill must\nnever produce on its own.\n\nThen check the receipt the way you check the quotes:\n\n    python3 scripts/check_receipt.py <dir>/note.md\n\nIt audits the receipt, never the research. It cannot know whether the right\nregulators were named; it knows that the regulators row was filled in, that a\ndynamic source carries the date that makes it a dated fact, that a negative\nsays which kind of nothing it is, and that the challenge came back with an\nanswer. Those are the omissions that survive review, because an incomplete\nreceipt reads exactly like a complete one.\n\n**Expect to be pushed for a verdict**, harder here than anywhere else, because\nthe user is deciding something. The answer to \"so are we allowed?\" is the\nprovisions engaged and the facts still needed to apply them. Give it plainly and\nwithout apologising for it: a lawyer reading that list knows within a minute\nwhether the plan is fine, which is the thing they actually came for.\n\n## Scripts reference\n\n| Script | Does | Stops the run when |\n|---|---|---|\n| `fetch_source.py` | Retrieves publisher bytes; records URL, HTTP date, retrieval time and sha256 | Redirected off the asserted publisher; empty body; HTTP error; destination already holds a run |\n| `read_version.py` | Matches the registry's version markers against the fetched bytes | Version unresolved or blocked; historical selection must be dated |\n| `extract_provisions.py` | Splits and hashes provisions, classes them, indexes defined terms, carries provenance | Version unresolved or blocked; broken provenance; no numbering convention detected; a forced convention matches nothing; two provisions carry the same label or id |\n| `verify_quotes.py` | Matches every quote in the note against the extracted provisions, and every citation against the provision holding the words; writes the run manifest | A quote is not in the fetched text, is uncited, names the wrong provision, quotes a recital as though it were operative, quotes the earlier edition as though it were current, or carries the instrument's words outside quotation marks |\n| `diff_runs.py` | Compares two runs of one instrument — amended, retitled, replaced, added, removed — and the defined terms, filtered by the manifest | Exit 1 means something moved; exit 2 means the two runs are not the same instrument |\n| `check_receipt.py` | Audits a `check` note's discovery coverage receipt: every dimension recorded, dynamic sources dated, negatives classified, omission challenge answered | A receipt row is missing, blank or wrongly statused; a negative finding is unqualified; the challenge has no answer; the method version is absent or superseded |\n\nAll scripts are stdlib-only. For PDF source text, use this cascade: the host's\nbuilt-in document extraction or a separately available open-source extractor,\nthen a firm-approved legal-grade OCR/document service when required. Feed the\nresulting text or Markdown to `extract_provisions.py`; the skill never bundles\nor silently installs a PDF dependency.\n\nThese scripts refuse rather than degrade. When one stops, report what it said.\nWorking around a refusal defeats the only thing this skill offers.\n\nEvery script reads saved files and nothing else — a pipe, a device or a\ndirectory is refused on sight, because the whole chain depends on being able to\nread the same bytes twice and hash them. Save the text and pass the path.\n\n## Source failure and delivery gate\n\nIf official retrieval returns HTTP 202, a challenge, empty content, an error,\nor inaccessible documents, reject it as evidence. Try another format or endpoint\non the verified official publisher, within a bounded retry budget (at most two\nalternative attempts per source). User-supplied official downloads may be checked\nwith host tools, but must retain origin and version evidence; never fabricate a\nfetch receipt. Secondary sources can locate a document, not substitute for it.\n\nIf official bytes, the version, extraction coverage, or attribution cannot be\nverified, do not issue a definitive report on affected points. Begin **Your\nanswer — provisional and unverified**, identify exactly which points lack proof,\nand state what document/date/check would resolve them. A failed quote is removed\nor corrected; the provisional label does not license unchecked quotations. Keep\nverified and unresolved points distinguishable. Do not report a complete official\nsource package unless every relied-on source is actually retained and linked.\n\n**Report the attempt that happened, not the one you would have expected.** A\nstop record names the command that ran, the file it was given, and what it\nprinted. When a stage never executed, it is \"not attempted\" — a different\nsentence from \"attempted and failed\", and the only one of the two that tells the\nlawyer a step is still open. Never carry a failure across inputs: an extraction\nthat refused a group page has established nothing about the individual section's\npage, and describing it as though it had is how a source that would have worked\ngets written up as unusable. Before saving a stop record, read it against the\ncommands you actually ran; a stop record is evidence about the run, and it is\nthe only part of the run nothing downstream checks.\n\nScripts are optional host capabilities. Without Python/network/file retention,\nperform the same checks using available host tools and record their coverage;\nif equivalent checks cannot be completed, use the provisional route. Never claim\nscript verification when the scripts did not run. Tool cascade: official public\npublishers and stdlib helpers by default → firm-selected legal-grade retrieval\nor document services when required, retaining official origin and version proof.\n\nBefore delivery, inspect the actual first chat response and ordinary deliverable:\nanswer present; default length met or exception explained; citations and\nqualifications visible; law/guidance/contract separated; no repeated analysis;\nverification scope accurate; unresolved application judgments left explicit.\n\n## Bounded statutory citation handoff\n\nFor a statutory citation unit referred by another workflow, read\n`references/citation-handoff.md`. Run only that bounded verification, using the\nsame source/version/quotation gates. This receiving interface does not enable\nrouting in another skill by itself.\n"
}

SHA-256 of public snapshot: ee813ca8c3dce0ce5dcbe887f874cea3e18c38d2d4486d41f72597d2199fb269