Agent skill

Hole Hunt

by joselado in joselado/dmrgpy

Run a multi-lens hole hunt (audit) of the dmrgpy Python layer, or add a lens, a finding or a fix cluster to an existing one.

GPL-3.0Auto-check passed

Install Hole Hunt

skills CLI
$ npx skills add joselado/dmrgpy --skill hole-hunt -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install joselado/dmrgpy hole-hunt --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/joselado/dmrgpy.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/hole-hunt .claude/skills/hole-hunt && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
hole-hunt
GitHub stars
114
Token cost
~3.4k tokens
SKILL.md length
1,770 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
GPL-3.0

At a glance

Run a multi-lens hole hunt (audit) of the dmrgpy Python layer, or add a lens, a finding or a fix cluster to an existing one.

  • Works in 7 steps: Fix the frame → Choose the lenses → Hunt, then refute → …
  • Sweep for holes
  • SKILL.md covers 1. Fix the frame, 2. Choose the lenses, 3. Hunt, then refute and 4. Write the record, plus 3 more sections
  • Calls git and make

What it does

Hole Hunt is an agent skill from joselado/dmrgpy. Run a multi-lens hole hunt (audit) of the dmrgpy Python layer, or add a lens, a finding or a fix cluster to an existing one. Use this whenever the user asks to audit, hole-hunt, hunt for bugs, sweep for holes, cross-check the backends against each other, or look for silently-wrong numbers, and also when they ask to record or fix a finding in docs/auditholehunt.md. This is the repository's established audit process, run in 2026-08 and 2026-09, and it has a fixed record shape and a fixed evidence standard that a…

Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It works with Python. The repository describes itself as: DMRGPy is a Python library to compute quasi-one-dimensional spin chains and fermionic systems using matrix product states with DMRG as implemented in ITensor. Most of the… The licence is GPL-3.0.

When your agent uses it

  • Sweep for holes
  • Cross-check the backends against each other
  • Look for silently-wrong numbers
  • Also when they ask to record

Example prompts

  • “/hole-hunt”

Requirements

  • Python 3

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Fix the frame
  2. Choose the lenses
  3. Hunt, then refute
  4. Write the record
  5. Fix in file-disjoint clusters
  6. Say when numbers change
  7. Close the loop

What it can do on your machine

Read from SKILL.md and the folder at commit 7373fce. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • make

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Hole Hunt loads about 3.4k tokens when it runs. Until then it costs about 142 tokens; SKILL.md has 1,770 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~142
When it runs · the whole SKILL.md, loaded when a task matches
~3.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from joselado/dmrgpy at commit 7373fce, republished under its GPL-3.0 licence (© joselado). 1,770 words, ~3,369 tokens.

Download SKILL.mdSave it as .claude/skills/hole-hunt/SKILL.md (or your agent's skills folder).
name
hole-hunt
description
Run a multi-lens hole hunt (audit) of the dmrgpy Python layer, or add a lens, a finding or a fix cluster to an existing one. Use this whenever the user asks to audit, hole-hunt, hunt for bugs, sweep for holes, cross-check the backends against each other, or look for silently-wrong numbers, and also when they ask to record or fix a finding in docs/audit_*_hole_hunt.md. This is the repository's established audit process, run in 2026-08 and 2026-09, and it has a fixed record shape and a fixed evidence standard that a free-form bug hunt will not reproduce.

Hole hunt

A hole hunt is a parallel, multi-lens search for behaviour in the dmrgpy Python layer that is silently wrong: a number that is plausible and incorrect, a dispatch that answers a question nobody asked, a kwarg with no consumer. The previous hunts are docs/audit_2026_08_hole_hunt.md (five lenses, 21 findings), docs/audit_2026_09_hole_hunt.md (eight lenses, 36 findings), docs/audit_2026_09_24_hole_hunt.md (five lenses, 16 findings), docs/audit_2026_09_24b_hole_hunt.md (five lenses, 18 findings) and docs/audit_2026_09_24c_hole_hunt.md (four lenses, 18 findings), followed by docs/audit_2026_09_25_open_items.md, a fix pass over ten of their open items rather than a hunt, whose "Left open, and new leads" section belongs in the next brief next to every record's "New leads", and by docs/audit_2026_09_25b_hole_hunt.md (four lenses, 29 findings) over that fix pass. Read the scope section and the lens table of the most recent one before starting: a finding already recorded there is not a new finding.

What makes this process worth following rather than improvising: every claim in the record was executed, and every claim was then handed to a second agent whose only brief was to refute it. That is what makes the record trustworthy enough that a later fix does not have to re-derive the evidence. Predicted output, remembered output and output from a stale .so all break that, so they are the failure mode to guard against throughout.

1. Fix the frame

Record, and keep true for the whole hunt:

  • The commit (git rev-parse --short HEAD) and that the tree is clean.
  • Whether both compiled extensions are current. If a lens will touch C++, rebuild first, because a fix that lands mid-hunt and replaces _dmrgcpp*.so invalidates every other lens's measurements. The 2026-09 hunt took its one C++ fix by hand, separately, for exactly this reason.
  • When the hunt is scoped to one commit, a compiled snapshot of its parent, so every candidate runs on both trees and the record can say whether the commit brought the defect in. git archive of the parent without the vendored ITensor/TDVP folders, those linked back to this checkout's copies (check they are unchanged between the two commits), then make pybind in each mpscppN: about a minute, and it never touches the repo's own .so. The recipe and the two-runner setup are in the 2026-09-25b record's "Shared helpers".
  • The invocation every repro uses:
bash
MKL_NUM_THREADS=1 OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 NUMEXPR_NUM_THREADS=1 \
  PYTHONPATH=<this worktree>/src python3 <script>

Both halves matter. Unpinned threads make a timing claim meaningless, and a bare import resolves to whichever checkout site-packages is symlinked into, so an ad-hoc probe can silently test code that is not the code under audit.

2. Choose the lenses

Four to eight, each a one-line brief naming one class of problem, and as file-disjoint as you can make them so the fix clusters afterwards can run in parallel. Previous sets, to vary rather than repeat:

  • 2026-08: silent backend and method dispatch fallbacks, dropped keyword arguments, feature-by-feature combinations, garbage-in-garbage-out cases that should raise, and cross-backend numerical disagreement on chains small enough for ED to be exact.
  • 2026-09: python-backend-parity, wavefunction-consumers, dispatch-matrix, pyitensor-performance, cpp-v3-completeness, ed-and-operators, recent-commits, docs-examples-drift.
  • 2026-09-24 (docs/audit_2026_09_24_hole_hunt.md, scoped to the commits since the previous hunt's fixes): kpm-calibration, td-convention, canonical-form, infinite-chain, recent-misc. Scoping a hunt to a commit window, one lens per recent change, found 16 holes in 11 commits, seven or eight of them introduced by the single commit that closed the previous hunt's open items; a hunt right after a fix pass is worth running for that reason alone.
  • 2026-09-24b (docs/audit_2026_09_24b_hole_hunt.md, scoped to the one fix commit 30200a4): one lens per fix cluster, operators, kpm, realtime, kondo, pyitensor; 18 findings, twelve of them older than the commit and reached by probing next to it.
  • 2026-09-24c (docs/audit_2026_09_24c_hole_hunt.md, scoped to the one fix commit 867e2b4): again one lens per fix cluster, groundstate, kpm, realtime, misc; 18 findings, six of them from the commit itself. Two things it taught. The brief listing what is already recorded has to carry every earlier record's "New leads", not only the last one's: its one refutation was a lead two records back that the brief left out. And a candidate turned up by a reviewer of a reviewer-found candidate needs its own reviewer too; a workflow that stops one level down leaves it as a lead.
  • 2026-09-25b (docs/audit_2026_09_25b_hole_hunt.md, scoped to the fix-pass commit e7b1196): one lens per fix cluster, construction, session, scale, scale_cpp, run on e7b1196 and on a compiled snapshot of its parent; 32 candidates reviewed to depth three, none refuted, 29 findings, three from the commit itself and four more it made reachable. What it taught: a fix that lowers one floor exposes the next one. Once clean_threshold stopped dropping small operators, seventeen absolute thresholds further down became reachable, and one of them sat in the previous record's "Ruled out" as unreachable for exactly the reason the fix removed. After a threshold or a guard changes, read the earlier "Ruled out" sections as candidates, not as settled.

Out of scope by construction, and stated in the record so the exclusion is on the page rather than in someone's head: vendored ITensor (mpscpp2/ITensor/, mpscpp3/ITensor/); the legacy bugs CLAUDE.md says are deliberately reproduced (evoloperator's z^3/6 term on H2, the "moise" key, the unreachable "tevol_fit_td" branch); the open docs/known_issue_*.md items; anything already in an earlier audit record; and gaps ROADMAP.md already marks as absent. Decide explicitly whether itensor_version="julia_live" is in scope, since its juliacall JIT cost dominates any lens that touches it, and say so.

3. Hunt, then refute

Spawn one hole-hunter agent per lens, all in one message so they run concurrently. Each returns candidate findings, each carrying a repro script that was actually run and its verbatim output.

Then spawn one finding-reviewer agent per candidate, briefed to refute it. A reviewer that reproduces the repro and finds the behaviour intended, already documented, or an artifact of the probe returns REFUTED, and that candidate never enters the record. A reviewer that narrows the claim returns the narrowed version, and the narrowed version is what gets written down. The 2026-09 record carries several findings whose sub-claims the reviewer struck; keeping the strike visible is part of the point.

Two practical points from the 2026-09-24 hunt. Subagents cannot write report files (the harness refuses them), so a reviewer's report arrives only as its hand-back text: save a condensed copy next to its scripts as it arrives, since the conversation that holds the full text may be compacted before the record is written. And the scratch folders every repro runs in do not outlive the session, so the record must carry each script and output inline rather than by path; the 2026-09-24 record was assembled by a small builder that splices the files from disk into the markdown, which keeps the outputs byte-for-byte what was run. A finding a reviewer turns up while reviewing another one gets its own reviewer before it enters the record.

Show full SKILL.md (647 more words)Show less

4. Write the record

docs/audit_<YYYY_MM>_hole_hunt.md (<YYYY_MM_DD> when the month already has one), in the shape the existing records share:

markdown
# Audit, <YYYY-MM>: <n>-lens hole hunt

<one paragraph: date, commit, tree state, that every repro was executed and
every finding handed to an independent reviewer briefed to refute it, and that
REFUTED findings are not reproduced here>

<one paragraph: this file is the evidence, not a task list; fixed entries keep
their repro and gain a **Status** line rather than being deleted>

## The <n> lenses

| Lens | Brief |
|---|---|

## Scope

<what is excluded by construction, and the pinned-threads invocation above>

## Findings

### 1. <the defect stated as a claim, with its measured size, in one sentence>

`bug` &middot; severity **HIGH** &middot; CONFIRMED &middot; lens `<lens-name>`

**Where**: `<file:line list, every site the defect reaches>`

<prose: what the code does, what the layer above believes it does, why every
existing test passes through it>

**Expected**: <what a correct implementation returns>

Repro:

```bash
<the exact pinned-threads invocation that was run>
```

Observed:

```
<verbatim output, not retyped>
```

**Reviewer (CONFIRMED)**: <the attempt to refute it, and what survived>

**Suggested fix**: <one paragraph>

A **Status** line goes directly under the classification line once the finding has been acted on, and **Reviewer on severity** is the variant used where the reviewer accepted the defect and disputed how bad it is.

Two things about the finding heading, because they are what makes the record readable a year later: state the defect as a claim rather than a topic ("vev(op, npow=n) silently ignores npow on every ED route" beats "npow handling"), and put the measured size in it where there is one.

5. Fix in file-disjoint clusters

Group the findings into clusters that do not touch the same files, and take one cluster at a time or in parallel agents. Each cluster gets one regression file, tests/test_audit_<YYYY_MM>_<cluster>.py, and each fix gets a **Status** line appended to its finding: FIXED, PARTIAL (say which half landed), or the reasoning if the behaviour turns out to be intended after all. Name the tests that pin it, or say explicitly that none does.

Pin the property, not a golden number, wherever the property is what was wrong: the 2026-09 TDVP fix is pinned by a test that asserts the order in dt rather than a value. Where a fix removes a bug from an existing computation, keeping the pre-fix reference construction verbatim inside the test is the cheapest way to prove the new path agrees with the old one where it should.

The 2026-09-25b fix pass ran nine clusters as parallel agents, each in its own git worktree, and four things about that shape are worth keeping:

  • Take the baseline on the machine the fix pass runs on, with freshly built extensions, before any agent starts. That pass ran on a different machine from its hunt, and the baseline turned up a thirtieth defect: a roundoff floor that MKL had rounded to exact zero and OpenBLAS did not (finding 30).
  • A worktree has no compiled extension. The .so files are gitignored, so v2/v3 silently fall back to ED and every test passes vacuously. Each agent copies (not symlinks) both .so in and asserts cppext.available first. The cluster that edits C++ builds its own by copying the untracked ITensor/this_dir.mk and options.mk into its worktree, which points the build at the main checkout's libitensor.a.
  • Agents amend their commits. Merge into a separate integration worktree, never into the main checkout the other agents still use as their pristine reference. Rebuild the integration branch from the final branch heads with a script rather than re-merging on top, and resolve the audit record's Status-line conflicts by keeping both sides.
  • Decide shared formulas in the brief. Where a fix has a Python and a C++ half owned by two clusters (the NH Ritz window) or must happen in exactly one place (NH unit scaling at the Python entry, not also inside Chain::nhdmrg), write the formula and the place into both briefs.

6. Say when numbers change

A fix that makes a previously-returned number different is a different kind of event from a fix that makes a crash stop, because saved results elsewhere are now not comparable. Every such fix gets NUMBERS CHANGE in its **Status** line, naming the old value, the new one and the exact chain it was measured on, and the consolidated list goes into CLAUDE.md's paragraph for that audit. Other projects save results produced by this library, so this is not bookkeeping.

7. Close the loop

Update CLAUDE.md with a paragraph for the hunt: how many lenses, how many findings, where the regressions live, which fixes changed numbers, and which items are open rather than fixed. An open item stays in the record with what is known about it, the way the kpm_energy_truncate window problem and the submode="TD"/"TDZ" convention items did, rather than being dropped because it did not get fixed.

© joselado, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/hole-hunt of joselado/dmrgpy.

Open the folder on GitHubat commit 7373fce

Compare with similar skills

Hole Hunt next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Hole Hunt compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Hole Hunt this skilljoselado/dmrgpy114—~3.4kAutomated safety check: PassGPL-3.0
MCP Server Builderanthropics/skills180k63 repos~2.3kAutomated safety check: PassApache-2.0
PDF Processinganthropics/skills180k47 repos~2kAutomated safety check: PassProprietary
NotebookLM Research AssistantPleasePrompto/notebooklm-skill7.8k14 repos~2.4kAutomated safety check: NotesMIT
Manim Video Productionbrowser-use/video-use29k6 repos~3kAutomated safety check: PassMIT
PPT Masterhugohe3/ppt-master59k1 repos~2.5kAutomated safety check: PassMIT

Similar skills

  • MCP Server Builder

    anthropics/skills

    Official

    Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.

    180k GitHub starsUsed in 63 repos~2.3k tokens
    Agent WorkflowsAuto-check passed
  • PDF Processing

    anthropics/skills

    Official

    Handles everyday PDF jobs in Python and on the command line: extract text and tables, merge, split, rotate, watermark, fill forms, encrypt and OCR.

    180k GitHub starsUsed in 47 repos~2k tokens
    Documents & OfficeAuto-check passed
  • NotebookLM Research Assistant

    PleasePrompto/notebooklm-skill

    Lets Claude Code ask questions of your Google NotebookLM notebooks through browser automation and return answers grounded in your uploaded sources.

    7.8k GitHub starsUsed in 14 repos~2.4k tokens
    Knowledge ManagementAuto-check: notes
  • Manim Video Production

    browser-use/video-use

    Produces math and technical explainer videos with Manim Community Edition: concept animations, equation derivations, algorithm walkthroughs and data stories.

    29k GitHub starsUsed in 6 repos~3k tokens
    Media & CreativeAuto-check passed
  • PPT Master

    hugohe3/ppt-master

    Generates editable PowerPoint decks, rebuilds slides from images, fills .pptx templates and polishes existing presentations through routed workflows.

    59k GitHub starsUsed in 1 repo~2.5k tokens
    Documents & OfficeAuto-check passed
  • Scikit Learn

    zLanqing/codex-claude-academic-skills

    Machine learning in Python with scikit-learn. An agent skill from zLanqing/codex-claude-academic-skills.

    4.7k GitHub starsUsed in 16 repos~3.9k tokens
    Data & AnalyticsAuto-check passed

More from joselado/dmrgpy

  • Docs Sync

    joselado/dmrgpy

    Update docs/userguide.{md,tex} and docs/documentation.{md,tex} together after a change to dmrgpy, keeping the Markdown and LaTeX versions of each in step and verifying the .tex still compiles under…

    114 GitHub stars~926 tokensUpdated 15 days ago
    Auto-check passed
  • New Example

    joselado/dmrgpy

    Add or revise a script under examples/ in dmrgpy. An agent skill from joselado/dmrgpy.

    114 GitHub stars~1.2k tokensUpdated 15 days ago
    Auto-check passed

Works with

Questions about Hole Hunt

What does Hole Hunt do?

Run a multi-lens hole hunt (audit) of the dmrgpy Python layer, or add a lens, a finding or a fix cluster to an existing one. Hole Hunt is an agent skill from joselado/dmrgpy. Run a multi-lens hole hunt (audit) of the dmrgpy Python layer, or add a lens, a finding or a fix cluster to an existing one.

When should I use Hole Hunt?

Hole Hunt fits situations like: sweep for holes; cross-check the backends against each other; look for silently-wrong numbers; also when they ask to record.

How do I install Hole Hunt in Claude Code?

Run `npx skills add joselado/dmrgpy --skill hole-hunt -a claude-code`. Or copy the skill folder (.claude/skills/hole-hunt in joselado/dmrgpy) into .claude/skills/hole-hunt in your project. Claude Code loads it when a task matches its description.

How do I install Hole Hunt in Codex?

Run `npx skills add joselado/dmrgpy --skill hole-hunt -a codex`. Or copy the skill folder (.claude/skills/hole-hunt in joselado/dmrgpy) into .agents/skills/hole-hunt in your project. Codex loads it when a task matches its description.

Can I use Hole Hunt in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add joselado/dmrgpy --skill hole-hunt -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/hole-hunt, .gemini/skills/hole-hunt, .github/skills/hole-hunt and .opencode/skills/hole-hunt in your project.

What does Hole Hunt need to run?

Going by SKILL.md and its folder, Hole Hunt needs the command-line tools its instructions call (git and make). Our summary lists: Python 3.

Does Hole Hunt access the network?

SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Hole Hunt safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Hole Hunt use?

Hole Hunt is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Hole Hunt use?

About 3.4k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Hole Hunt?

Skills that share tags, products or a category with Hole Hunt: MCP Server Builder (anthropics/skills, 180k stars), PDF Processing (anthropics/skills, 180k stars), NotebookLM Research Assistant (PleasePrompto/notebooklm-skill, 7.8k stars) and Manim Video Production (browser-use/video-use, 29k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Hole Hunt?

joselado (a GitHub user) maintains it in joselado/dmrgpy, which has 114 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on September 26, 2026.

Source: joselado/dmrgpy on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.