Skip to content
cccskills
FreePublished on GitHub

bench-maintain

Maintenance of the nu-validator coverage benchmark: defend the invariants (nu-only = 0, xref audit green), follow up a nu-validator upstream update (submodule bump / Docker image drift), and regression-check after markuplint rule or spec changes. Use when updating the validator submodule, when a bench refresh surfaces new nu-only entries, when excluded-ids entries go stale, or for the periodic health check. Trigger keywords: bench maintain, bench maintenance, nu update, submodule bump, validator update, bench refresh, nu-only regression, stale excluded-ids, image digest.

The English summary is being prepared. Showing the original description.

markuplint/markuplint630 stars(GitHub 630 + cccskills 0)
Works withDocker

Run score Not tested

See how to install

Files included (1)

  • SKILL.md6.2 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

nu-validator Bench Maintenance Skill

The job is not to reduce a backlog but to defend invariants across upstream updates and markuplint changes. Per-fixture verdict work is still bench-triage; environment recovery is still bench-setup; issue-body sync is still bench-xref. This skill is the loop around them.

Invariants to defend

After every full refresh, all of these must hold before committing:

InvariantCheck
No unprocessed coverage gapssnapshots/diff/nu-only.json has "entries": []
No untracked exclusionsevery excluded-ids.json reason cites a spec URL and, for deferred-*, an OPEN tracking Issue
No stale issue mappingsyarn bench:xref --audit reports all mapped issues OPEN
nu ran cleansnapshots/diff/nu-failures.json is empty

A new nu-only entry after a refresh is never noise to sit on — it is one of exactly three things (see decision tree below), and each has an owner action.

Two upstream update axes

nu-validator updates reach the bench on two independent axes; know which one moved before interpreting a diff (tests/external/snapshots/meta.json records both — compare against the committed previous version):

  • Fixture corpus — the tests/external/validator submodule (submoduleSha in meta.json). Moves only when you run git submodule update --remote tests/external/validator.
  • nu engine — the Docker image. bench/docker.ts pulls ghcr.io/validator/validator:latest and resolves it to an immutable digest (nuValidatorImage in meta.json) at each yarn bench:update / --target nu run. The engine therefore drifts implicitly whenever upstream publishes, even with an unchanged submodule.

Because the engine follows :latest, a "routine" full refresh can change verdicts by itself. That is expected — the digest in meta.json is the audit trail.

nu update follow-up procedure

  1. Bump the fixture corpus (skip to step 2 for an engine-only refresh):

    git submodule update --remote tests/external/validator
    
  2. Full refresh (Docker required; pulls the current engine):

    yarn bench:update
    
  3. Diff tests/external/snapshots/meta.json against the committed version: which axis moved (submoduleSha, nuValidatorImage), and do the totals (totalFilesNu, totalNuMessages) shift plausibly with it?

  4. Classify every new nu-only.json entry — three causes, three actions:

    CauseHow to recognizeAction
    New upstream fixture or new nu checkPath is new to the corpus, or the message id is new on an old fixtureRun bench-triage on it (spec read → rule fix, Issue, or exclusion). This is the normal intake path for new coverage.
    Stale per-id exclusionFixture was nu-over; its excluded-ids.json entry no longer matches because nu changed the message wording (the nv-<hex12> hash is derived from the message)Re-read the entry's spec citation; if the conclusion still holds, re-pin the new id (keep the reason, update addedAt). If nu's new wording changes the substance, re-triage from scratch.
    markuplint regressionFixture was match-error; ml side no longer reportsTreat as a bug in the responsible rule — find the causing commit, fix or revert. Do not exclude.
  5. Pattern-based exclusions fail in the opposite direction — silently. A wording change makes a patterns[] entry stop matching without any nu-only reappearance (the fixture just flips verdict). Check the nu-over headcount against the expected counts recorded in pattern reason fields, and re-check any deferred-* counts in the bench-triage "Deferred specs" table.

  6. Verify all invariants (table above), then sync issue bodies:

    yarn bench:xref --audit
    yarn bench:xref --all --dry-run --write
    

    --write edits GitHub Issue bodies. Show the user the previewed new bodies and get their go-ahead, then apply (--audit rejects --dry-run / --write, so it stays a separate command):

    yarn bench:xref --all --write
    
  7. Commit snapshots/diff/*, snapshots/meta.json, snapshots/excluded-ids.json, the submodule pointer, and any issue-xref.config.ts edits as a test: commit describing what moved (submodule range and/or image digest). Raw snapshot trees stay gitignored.

Before acting on any single surprising fixture, pin it with --concurrency 1 (see the concurrency caveat in bench-triage) — parallel-run flicker is not a signal.

markuplint-side regression check

After a rule / spec / parser change that could affect bench-covered behavior (no Docker needed):

yarn bench:update:ml
yarn bench:compare
  • nu-only.json must stay empty. A new entry here is always a regression caused by the change under test — there is no upstream axis involved.
  • Diff the ml-only path set against the committed snapshot. Growth is acceptable only when each added path is explained by the change (spot-check per the "ml-only readings" note in bench-triage); shrinkage means detection was lost somewhere — explain every disappeared path before committing.

Periodic health check (cheap, no Docker)

yarn bench:xref --audit runs on relevant PRs and a weekly cron (.github/workflows/bench-xref-audit.yml), so CLOSED-issue mappings surface on their own. What has no automation is upstream drift: the engine and corpus only move locally when a maintainer runs the update, so schedule a full nu update follow-up (steps above) periodically — before each release at the latest (see the pre-release checklist in bench-xref).

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Enable an existing or newly-added markuplint rule on the nu-validator bench by editing tests/external/bench/config.ts. Covers the flat-rule case (rules: { '<name>': true }) and the severity override case (rules: { '<name>': { severity: 'error' } }) that bench-virtual-rule does not. Use when a rule exists in the registry but the relevant nu fixtures stay nu-only because the rule is not enabled in the bench config, or when a rule's default severity is warning but the spec text it mirrors is a MUST / MUST NOT. Trigger keywords: enable bench rule, bench config flat rule, severity override bench, rule not flagging on bench, warning vs error in bench, escalate severity bench, no-contradictory-aria-prop bench, bench coverage missing rule.

The English summary is being prepared. Showing the original description.

markuplint/markuplint630Updated Oct 26, 2026

Set up the nu-validator benchmark environment — initialise the validator submodule, ensure Docker is running, populate the gitignored raw snapshots via yarn bench:update. Also covers Docker / nu-runner troubleshooting. Use when bench commands fail with "no snapshots found", "Docker daemon not reachable", port 28888 conflicts, or healthcheck timeouts; or when refreshing the bench after a long break. Trigger keywords: bench setup, bench Docker, validator submodule, no snapshots found, Docker daemon not reachable, healthcheck times out, port 28888, yarn bench:update first time, bench install, fresh clone bench.

The English summary is being prepared. Showing the original description.

markuplint/markuplint630Updated Oct 26, 2026

Triage one nu-only fixture from tests/external/snapshots/diff/nu-only.json by reading the spec, then drive its verdict to match-error, match-clean, or nu-over by either fixing markuplint or recording an excluded-ids.json entry. The core per-fixture operation of the nu-validator coverage benchmark. Use when a bench refresh surfaces new nu-only entries, when checking a coverage-claim ("markuplint misses X" / "over-detects Y") against the bench, or when classifying a specific fixture. Trigger keywords: nu-only, ml-only, coverage gap, bench triage, verdict, match-error, match-clean, nu-over, excluded-ids, declare nu over-detection, claim audit, audit fixture, mark-up valid per spec, spec-cited exclusion.

The English summary is being prepared. Showing the original description.

markuplint/markuplint630Updated Oct 26, 2026

Mirror a preset virtual rule (selectors under `nodeRules` in preset.html-standard.jsonc and similar) into bench/config.ts so the benchmark exercises it. Use when a new disallowed-element / similar selector lands in a preset and the matching nu fixtures remain stuck at nu-only despite the new rule existing in markuplint. Trigger keywords: virtual rule, nodeRules, disallowed-element, preset html-standard, bench config mirror, rule does not fire on bench, preset rule not exercised.

The English summary is being prepared. Showing the original description.

markuplint/markuplint630Updated Oct 26, 2026

Sync benchmark cross-reference blocks onto GitHub Issue bodies via `yarn bench:xref`, manage `tests/external/bench/issue-xref.config.ts` mappings, and run the pre-release checklist. Use when adding / removing / updating a primary or secondary mapping, when an issue closes upstream, when the xref CLI's output disagrees with what's on the issue body, or before cutting a release that touches a rule the benchmark covers. Trigger keywords: bench-xref, issue-xref, xref CLI, GitHub issue body, primary mapping, secondary mapping, umbrella block, pre-release checklist, bench-xref-audit workflow, marker version.

The English summary is being prepared. Showing the original description.

markuplint/markuplint630Updated Oct 26, 2026

Investigate a problem to its root cause and file it as a GitHub Issue with the right labels and an As is / To be / Why / How body backed by primary sources. Use when asked to file, create, or open an issue, or when the `impl` skill hands over a carry-over. Trigger keywords: create issue, file an issue, open an issue, report a bug as an issue.

The English summary is being prepared. Showing the original description.

markuplint/markuplint630Updated Oct 26, 2026

See all skills by markuplint

Report a problem with this skill