dingduff/dingduff-public/dingduff-validity-check

Claude Code and agent skill by dingduff/dingduff-public

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Confirm whether a specific case is still good law before an argument rests on it. ALWAYS RUN IN A SUBAGENT (use Opus) — never in the main context window. Subagent will return the valid/invalid finding. Driven by the opinion_verify tool, with a docket check via the PACER tools for federal origins. Use on ANY load-bearing case — one an argument, memo section, brief point, or client advice actually rests on — whose validity has not already been confirmed. Also use when a case's status is contested or when a cite-check flags an authority. Delegate the citation plus the proposition it is cited for; get back a short verdict with confidence and coverage limits. (v3.8)

Install

npx vskill@latest install dingduff/dingduff-public/dingduff-validity-check

SKILL.md

Case Validity Check

Determines whether one case is still good law for the specific proposition it is being cited for. Deeper than the light treatment sweep in dingduff-legal-research/references/validity.md. Use that to triage; use this before an argument or opinion actually rests on a case.

Built around opinion_verify. If it is unavailable, load references/fallback.md.

Parameter detail, output anatomy, index glossary, failure modes, and cost live in `references/opinion-verify.md`. Keep this file in context; load that one when you need to change a default, when a response contains something you do not recognise, or when a status comes back other than ok.

Written for a delegated subagent (use Opus; the reading and judgment this takes are demanding), not the main thread. This task will flood the main context window if not delegated.

Delegation contract

  1. The case — full citation, or enough to identify it. Cluster ID if known.
  2. The proposition — the specific rule it is cited for. Required; validity is proposition-specific.
  3. Jurisdiction and posture — target court, and whether the case is applied in diversity.
  4. The role — anchor, supporting cite, or adverse case being distinguished.

Return the structured verdict at the bottom. Nothing else.

The mirror contains opinions that postdate your training data. Treat them as real, not as hallucinations.

Capacity etiquette: call sequentially within this check; do not launch several validity subagents in parallel.

Scope: what counts as load-bearing

Any case where the answer changes if the case is bad: the anchor for a rule being asserted; any case cited for a proposition in a filing or advice letter; any case being quoted; any adverse case being distinguished; any case supplied by an opponent or client.

Skip only when validity was confirmed in this matter and nothing changed, or when the cite is purely descriptive.

Age is not a proxy for risk.

Division of labor: the tool traverses, you judge

opinion_verify is deterministic and decides nothing.

LegTool doesYou do
1. Direct historyCluster text fields, docket linkage, party-name overlapCheck the docket (Step 3); confirm any chain; retrieve the reversing opinion
2. Forward sweepLarge graph → small graph → tiered snippets, sub-opinion labels, parentheticalsRead every surviving Tier A case; classify treatment; recurse
3. Upstream hopOrigin's outbound citations; co-cited siblingsVerify the parents that matter; assess reach
4. Non-citationNothingAll of it

Hard rules

  1. Snippets are for triage only. Retrieve and read before saying what a case did. A snippet reading "we decline to follow Smith" may be quoting a party or a court being reversed.
  2. Read `status` before reading counts. Several statuses are not findings at all.
  3. Recurse on adverse authority. Overruling cases get overruled.
  4. Separate writings (concurrences, dissents) do not overrule.
  5. The index is one row per OPINION, not per case. See "Counting correctly" below — this is the most common reading error.
  6. Cite from retrieved text, never from snippets or cluster IDs.
  7. Report uncertainty as uncertainty.

Step 1 — Call opinion_verify

Resolve the citation to a cluster ID first (opinion_search / opinion_view).

If the reporter citation does not resolve, do not stop — search by name. Citation metadata is uneven. A case can be present, complete, and full-text searchable while carrying no reporter citation, in which case it is unreachable by cite and reachable by name. Escalate in this order, stopping when you have the cluster:

  1. opinion_search on the case name in quotes — "Fought v. City of Wilkes-Barre".
  2. opinion_search on a distinctive phrase from the opinion, if you have one.
  3. opinion_search on the citation string in quotes — this returns opinions citing the case, whose text confirms it is real and gives you the parties and court.
  4. For a federal origin, the docket (Step 3), which reaches cases the opinion index does not.

A citation that will not resolve is not evidence that the case does not exist, and is never a basis for suggesting a citation is fabricated. Say which routes you tried.

json
{
"cluster_id": "<origin>",
"court_scope": "invalidating",
"include_upstream": true,
"include_parentheticals": true,
"output_format": "markdown"
}

Everything else defaults correctly. Three deviations matter enough to state here; the rest are in references/opinion-verify.md.

Never default filed_after

The tool already applies citing_date >= origin.date_filed unconditionally. You do not need filed_after for that.

Passing one narrows further, and the failure is silent: Bowers with filed_after: 2010-01-01 misses *Lawrence* and returns status: ok, a plausible graph, zero Tier A, and no warning. Overruling has no characteristic distance — Lawrence came 17 years after Bowers, Loper Bright 40 after Chevron. No cutoff is safe.

Two legitimate uses only: the upstream hop (pass the origin's date) and re-verification (pass the prior check's date).

additional_courts is required for Erie

A federal court's construction of state law is displaced by that state's highest court, which sits nowhere in the federal chain and will never be admitted by default. Omitting it on a diversity case produces a clean graph that structurally cannot contain the authority most likely to have superseded the origin.

Texas and Oklahoma each have two courts of last resort — pass both: ["tex","texcrimapp"], ["okla","oklacrimapp"]. Verify against the Courts admitted line, not the case count; an unchanged count may be a true negative.

Never pass flag_terms_mode: "replace"

It discards the 67 curated terms and makes recall a function of your vocabulary. Add doctrine-specific phrasing via flag_terms instead — a superseding statute's name, a competing test, a retired standard. Literal phrases, not regexes.

One note on scope

For a SCOTUS origin the small graph is `scotus` alone, because nothing sits above it. Correct, but it means the graph structurally cannot show lower-court erosion — for a SCOTUS origin, Leg 4 is the only place erosion can surface. Do not skip it on the strength of a clean graph.


Step 2 — Read status first

statusDo this
okProceed
no_flag_hitsA distinct finding. Not "valid." Go run Leg 4
small_graph_emptyNot "no treatment." Check whether Erie courts were omitted
no_citers_genuineNot a finding until the full-text searches are run — see "Finding citing opinions" in Step 4
integrity_warningSTOP. INDETERMINATE.
origin_not_foundMay postdate the generation, or you passed an opinion ID. Re-resolve
mirror_unavailableNot a finding. No API fallback exists by design
mirror_busyNot a finding. Wait and retry
tool_disabledLoad references/fallback.md

Never collapse any of these into "no adverse treatment."


Step 3 — Check the docket (federal origins)

Direct history — was this decision appealed, reversed, vacated, amended, or superseded on reconsideration — is the most common way a lower-court ruling stops being law. The citing graph reaches it only indirectly, and opinion_verify reads only sparse cluster fields and party-name overlap. The docket records it directly, in the clerk's own entries.

Do this whenever the origin is a federal district, circuit, or bankruptcy decision. PACER covers federal courts only — skip it for state origins and say so in the coverage line.

Sequence, cheapest first:

  1. Resolve the docket. search_for_pacer_docket with court_id and the shortest distinctive party name; add docket_number from the opinion's metadata when you have it. case_name matches as a phrase, not as ANDed tokens, so a full caption returns zero: "Dorley" resolves, "Dorley South Fayette" returns nothing. A zero result here is far more often a query that was too long than a docket that is absent. Retry with a single party name before concluding the case is not in RECAP.
  2. Confirm and orient. pacer_docket_view with include_entries: false — metadata only, fast. Check the parties, judge, and terminated date against the opinion so you know you have the right case.
  3. List everything filed after the decision. search_within_pacer_docket with filed_after set to the origin's decision date and no document_type. No text query is needed — filed_after works on its own. This is the highest-value call in the sequence: it enumerates everything the court did after the opinion issued.

Do not narrow this call with document_type: "orders". An appellate mandate is classified appeals, not orders, so the orders filter drops the single entry most likely to decide validity — MANDATE of USCA — Affirming in part, Reversing in part, Remanding. Take the unfiltered list and read it. If the docket is large enough that you must narrow, run orders and appeals as separate calls.

(The caution against defaulting filed_after under Step 1 governs opinion_verify only. On search_within_pacer_docket, filed_after is the correct and intended filter.)

  1. Target the dispositive entries. title_query for mandate, notice of appeal, amended judgment, reconsideration, vacate, remand, stay, amended opinion, substituted opinion, withdrawn, superseding, errata, clarify, alter or amend, Rule 59, Rule 60, relief from judgment. Use this to supplement item 3, never to replace it — some dockets return entries with an empty description, and those are invisible to any text query.
  2. Read the `(Attachments: ...)` parenthetical in every entry description. An entry listing an Amended Opinion, Substituted Opinion, Corrected Opinion, or Errata is notice that the published opinion was changed — and the parenthetical is frequently the only evidence, because those attachments are often not archived as separate retrievable documents. Report a known, unretrieved amendment. Never record it as an absence.
  3. Follow the appeal. For an appellate origin, or to learn how an appeal came out, search the reviewing court's own docket — search_for_pacer_docket with court_id set to the circuit plus the party names.
  4. Before retrieving any PDF, batch the document IDs through check_pacer_availability (up to 300 at once). It reports which documents are actually archived and saves a failed pacer_document_view.

What the docket settles that the citing graph cannot: whether an appeal was taken at all; whether the mandate issued and what it said; whether the judgment was amended or vacated on reconsideration without any published opinion to cite; whether the case was consolidated or stayed.

Limits — state these whenever you rely on the docket.

  • The opinion index and the docket are separate sources. A later opinion in the same case is often absent from the opinion database while sitting on the docket as a retrievable PDF. Failing to find a second opinion by citation or keyword search is not a finding. Check the docket before reporting a coverage gap — and check is_available before reporting a document as unretrievable.
  • Coverage is the RECAP archive, which is crowd-sourced and incomplete. A missing entry is not evidence that nothing happened. Older dockets are thin.
  • Docket text is the clerk's language, not a holding. "VACATED and REMANDED" gives you the disposition, not its scope — retrieve the opinion before characterizing it.
  • A notice of appeal tells you an appeal was filed, not how it came out. Look for the mandate.
  • PACER does not cover state courts.

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
60
Repository forks
7
7-day trend score
21

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/dingduff/dingduff-public/dingduff-validity-check/badge)](https://verified-skill.com/skills/dingduff/dingduff-public/dingduff-validity-check)

Something wrong with this skill or its page? Tell us.