Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Run and ship this repo: make targets, artifacts, release runbook. Use when testing, linting, or releasing. Do not use for setup; use night-market-build-and-env.
.claude/skills/athola-night-market-operations/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 169% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 142% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 149% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 163% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 229% | 0% |
This skill is the runbook for operating the claude-night-market repo: what each make target actually executes, where artifacts land, and the exact sequence that ships a release. Every command below was verified against the Makefile, scripts/, and .github/workflows/ on 2026-07-02 (repo v1.9.15).
Terms used once and reused throughout:
plugins/ with a.claude-plugin/plugin.json manifest. Most have their own Makefile, pyproject.toml, and tests/.
vendored at plugins/abstract/bin/skrills. Every skrills target has a Python fallback, so a missing binary never blocks you.
clawhub/ by scripts/clawhub_export.py.
All commands run from the repo root unless a cd is shown. uv is required for everything Python. For environment setup, see night-market-build-and-env.
| Command | What it actually executes | When to use | Expected output shape | |---------|---------------------------|-------------|-----------------------| | make test | ./scripts/run-plugin-tests.sh --all: per plugin, runs make test --quiet if the plugin Makefile has a test: target, else uv run python -m pytest tests/ --tb=short --quiet if pyproject mentions pytest. Skips plugins without tests/. | Full sweep before a PR or release. | Per-plugin pass/fail/skip lines. Failures re-run verbose. | | make lint | uv run ruff format plugins/, then uv run ruff check --fix plugins/, then ruff format again, then uv run bandit --quiet -c pyproject.toml -r plugins/. All use root pyproject.toml config. | Before every commit. Mutates files (auto-fix). | Four staged sections ending "Lint Complete". | | make typecheck | ./scripts/run-plugin-typecheck.sh --all: per-plugin uv run mypy under each plugin's own strict config, plus a separate uv run mypy hooks/ pass when hooks/*.py exists. | After type-touching changes and before release. | Per-plugin pass/fail. Hooks checked as a sub-step. | | make validate-all | python3 plugins/abstract/scripts/validate_plugin.py <plugin> for every plugin. Failures print "(validation failed)" but do NOT stop the loop or fail the target. | Structure audit after manifest edits. | One validation block per plugin. Read output, not exit code. | | make plugin-check | For each plugin whose Makefile has a plugin-check: target: timeout 180 make -C plugins/<p> plugin-check. Failures and timeouts print a note, exit code stays 0. | Dogfood/demo sweep before release. | Per-plugin sections. Watch for "(plugin-check failed or timed out)". | | make docs-sync-check | bash scripts/capabilities-sync-check.sh | PR touches plugin manifests or skills (mirrors capabilities-sync.yml CI). | Drift list or clean pass. Fix drift with /sanctum:sync-capabilities --fix. | | make supply-chain-scan | python3 scripts/supply_chain_scan.py | After dependency or lockfile changes. | Scan report between banner lines. | | make validate-skills | skrills validate --skill-dir plugins --target claude (plugin bin, then PATH). Falls back to uv run python scripts/check_plugin_hooks.py. | Skill frontmatter/structure check. | skrills report, or the Python fallback notice plus its output. | | make analyze-skills | skrills analyze --skill-dir plugins. Falls back to uv run python scripts/generate_dependency_map.py. | Skill token-budget and dependency analysis. | Token/dependency stats. | | make status | make -C <plugin> status for every plugin. | Quick overview. | Per-plugin status or "(status unavailable)". | | make clean | make -C <plugin> clean for every plugin, errors ignored. | Reset build artifacts. | "Done." |
Two targets have soft failure modes worth repeating: make validate-all and make plugin-check keep going past failures and can exit 0 while a plugin is broken. Read their output. Do not treat a green exit as proof.
The root Makefile auto-generates delegation targets for every plugin that has a Makefile. make <plugin>-<target> is identical to make -C plugins/<plugin> <target>:
bashmake sanctum-test # run sanctum's test suite make imbue-lint # run imbue's lint target make abstract-help # list a plugin's own targets
Run a single test file from inside the plugin directory:
bashcd plugins/imbue && uv run pytest tests/unit/test_deferred_capture.py -x -q
Rules that save you an hour:
pytest expecting plugin tests to run. Rootpyproject.toml sets norecursedirs = ["plugins/*", ...] because plugin conftest.py files collide on import paths. Plugin tests run per-plugin, always.
addoptsinclude --cov=scripts, --cov-report=html:htmlcov, and --cov-report=xml, so even a single-file run writes htmlcov/ and coverage.xml into plugins/imbue/. This is normal, not a mess you made.
fail_under = 85. Per-pluginoverrides live in each plugin's [tool.nightmarket] coverage_threshold (per-plugin values: see night-market-validation-and-qa, the designated home for the threshold inventory). run-plugin-tests.sh reads that value and passes --cov-fail-under=<n> when the plugin runs via the pytest path.
| Artifact | Producer | Location | Committed? | |----------|----------|----------|------------| | htmlcov/, coverage.xml | pytest coverage addopts | Repo root and per-plugin dirs | Present in tree but regenerated. Never hand-edit | | reports/skill-graph.json | skill-graph tooling | reports/ | No, generated locally (reports/ is gitignored). Rebuild with the skill-graph tooling | | clawhub/ | make clawhub-export | clawhub/manifest.json plus one nm-<plugin>-<skill>/ dir per exported skill | No, generated locally. make clawhub-export rebuilds it, and the release workflow regenerates it in CI | | bridge/openclaw/, bridge/a2a/ | make bridge-build, make a2a-cards | bridge/ | Build outputs. make bridge-clean removes skills and a2a | | book/build/ | mdbook build (book/book.toml sets build-dir = "build") | book/build/ | No, CI-built | | trust-report.json | CI only: trust-attestation.yml on push to master | Workflow workspace, SLSA-attested | No, never in tree |
The ecosystem ships as one version. .claude-plugin/marketplace.json is the version source of truth, fanned out to every plugin manifest. Gates and review policy are night-market-change-control territory. This is the mechanical sequence.
Skill(sanctum:git-workspace-review) for aread-only workspace check. Confirm you are on a <topic>-<version> branch. Do not release from master.
bash uv run python plugins/sanctum/scripts/update_versions.py 1.9.16 --dry-run uv run python plugins/sanctum/scripts/update_versions.py 1.9.16 git diff --stat
The script rejects any version that does not match ^\d+\.\d+\.\d+$. It then rewrites the version field in every match of these globs, and it skips cache and venv directories:
**/pyproject.toml**/Cargo.toml**/package.json**/.claude-plugin/plugin.json**/.claude-plugin/metadata.json**/.claude-plugin/marketplace.json**/openpackage.yml**/__init__.py that contains __version__Expect a large diff of roughly 100 files. That is the design.
1.1.0 with SemVer. Keep ## [Unreleased] at the top. Insert ## [X.Y.Z] - YYYY-MM-DD directly below it. Do not rewrite or de-slop historical entries.
docs/api-overview.md. Then run:
bash make docs-sync-check
The check compares plugin.json registrations against the generated capabilities reference in book/src/reference/. If it reports drift, run /sanctum:sync-capabilities --fix.
night-market-change-control. The gates are the pre-commit hooks, the slop check on docs, capabilities-sync, typecheck, and the security workflows.
trust-attestation.yml fires on the push. It runs make test. It writes trust-report.json. It attaches a SLSA provenance attestation with actions/attest-build-provenance@v4.
/sanctum:create-tag v1.9.16. The commandpushes a v-prefixed annotated tag. It then confirms that the release pipeline started.
cross-framework-publish.yml fires on v* tags. It strips the v and validates the version against ^[0-9]+\.[0-9]+\.[0-9]+. It runs the cross-framework unit tests: clawhub_export, build_bridge, a2a_cards, and framework_detect. It runs make cross-framework. It packages four tarballs:
night-market-clawhubnight-market-openclaw-bridgenight-market-a2a-cardsnight-market-cross-frameworkIt then creates the GitHub release.
One precondition applies. The publish job fails when clawhub/manifest.json does not exist. It also fails when total_exported is 0. The current count is 188.
ClawHub submission after the release stays manual. Run ./scripts/clawhub-submit.sh v<version>.
Release checklist:
make test, make lint, make typecheck all pass locallyupdate_versions.py diff reviewed and marketplace.json shows thenew version
[Unreleased] still on topmake docs-sync-check cleanThe mdBook under book/ deploys via deploy-book.yml:
book/** or the workflowfile itself, plus PRs on the same paths (build-only) and manual dispatch.
peaceiris/actions-mdbook@v2 with mdbook-version: 'latest',then mdbook build with working-directory book. Output book/build uploads via actions/upload-pages-artifact@v5 and deploys with actions/deploy-pages@v5, with one retry step if the first deploy fails.
mdbook release can break the build with no change in this repo. If the book job fails right after an mdbook release, suspect that first.
Local preview, if mdbook is installed:
bashcd book && mdbook build # output in book/build/
bashmake clawhub-export # export all skills to clawhub/, then validate make clawhub-export-top # top 20 most marketable skills only make clawhub-validate # re-validate an existing export make clawhub-stats # export statistics, no writes make bridge-build # (depends on clawhub-export) build bridge/openclaw/ make a2a-cards # generate A2A agent cards into bridge/a2a/ make a2a-list # list agents eligible for card generation make detect-framework # detect the active agentic framework make cross-framework # all of the above: export + bridge + cards
make cross-framework is exactly what the release pipeline runs, so running it locally before tagging catches export failures early. It prints skill and agent counts and ends with framework detection.
| You want | Use instead | |----------|-------------| | Set up uv, Python, tools from scratch | night-market-build-and-env | | Classify a change, know which gates apply | night-market-change-control | | Diagnose a failing test or broken hook | night-market-debugging-playbook | | Configuration axes, env vars, defaults | night-market-config-catalog | | Coverage discipline and evidence bar | night-market-validation-and-qa | | Plugin/skill/hook mechanics | claude-code-plugin-reference | | Measurement tooling interpretation | night-market-diagnostics-toolkit | | Stop an egregore loop or its watchdog relaunch machinery | night-market-completion-integrity-campaign (P1b, "Stopping and relaunch machinery") |
beyond the exit code alone. For make validate-all and make plugin-check, output was scanned for embedded failure notes.
the plugin directory, never via root pytest.
update_versions.py diff verified, CHANGELOGsection added, make docs-sync-check clean, tag pushed, and the GitHub release shows all four tarball assets.
book/build) was identified as generated and not hand-edited.
Compiled 2026-07-02 against repo v1.9.15, branch discussions-fix-1.9.14. Coverage-threshold inventory delegated to night-market-validation-and-qa and the egregore stop cross-reference added on 2026-07-03. Volatile facts and how to re-verify them:
bash# Make target wiring sed -n '60,150p' Makefile && sed -n '150,300p' Makefile # Test runner behavior (delegation, coverage threshold, skip logic) sed -n '1,110p' scripts/run-plugin-tests.sh # Version bump globs and semver regex rg -n "patterns|re.match" plugins/sanctum/scripts/update_versions.py # Release pipeline gates rg -n "tags|total_exported|tar -czf" \ .github/workflows/cross-framework-publish.yml # Attestation flow rg -n "make test|attest|trust-report" \ .github/workflows/trust-attestation.yml # Book deploy and mdbook pin rg -n "mdbook-version|deploy-pages|working-directory" \ .github/workflows/deploy-book.yml # Current export count (was 188 on 2026-07-02) python3 -c "import json; \ print(json.load(open('clawhub/manifest.json'))['total_exported'])" # Coverage thresholds rg -n "coverage_threshold" plugins/*/pyproject.toml rg -n "fail_under" pyproject.toml
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | fail→pass | 10,826 | 4,957 | -54% | 1 | 1 | 0% | 1,815 | 4,885 | +169% | 0 | 0 | — |
case-01 | fail→pass | 12,981 | 7,883 | -39% | 1 | 1 | 0% | 2,242 | 5,427 | +142% | 0 | 0 | — |
case-02 | fail→pass | 11,188 | 4,112 | -63% | 1 | 1 | 0% | 1,911 | 4,752 | +149% | 0 | 0 | — |
case-03 | fail→pass | 11,180 | 4,701 | -58% | 1 | 1 | 0% | 1,811 | 4,767 | +163% | 0 | 0 | — |
case-05 | fail→pass | 8,214 | 3,983 | -52% | 1 | 1 | 0% | 1,405 | 4,619 | +229% | 0 | 0 | — |
case-06 | fail→pass | 14,225 | 2,986 | -79% | 1 | 1 | 0% | 2,188 | 4,458 | +104% | 0 | 0 | — |
case-07 | pass→pass | 13,099 | 4,007 | -69% | 1 | 1 | 0% | 1,993 | 4,639 | +133% | 0 | 0 | — |
case-08 | fail→pass | 10,349 | 4,879 | -53% | 1 | 1 | 0% | 1,602 | 4,760 | +197% | 0 | 0 | — |
case-09 | fail→pass | 8,265 | 2,795 | -66% | 1 | 1 | 0% | 1,295 | 4,512 | +248% | 0 | 0 | — |
case-10 | fail→pass | 10,385 | 3,841 | -63% | 1 | 1 | 0% | 1,696 | 4,625 | +173% | 0 | 0 | — |
case-11 | pass→pass | 10,860 | 2,562 | -76% | 1 | 1 | 0% | 1,627 | 4,414 | +171% | 0 | 0 | — |
case-12 | fail→pass | 8,855 | 2,312 | -74% | 1 | 1 | 0% | 1,318 | 4,313 | +227% | 0 | 0 | — |
case-13 | fail→pass | 8,301 | 3,285 | -60% | 1 | 1 | 0% | 1,313 | 4,558 | +247% | 0 | 0 | — |
case-14 | fail→fail | 5,960 | 1,873 | -69% | 1 | 1 | 0% | 973 | 4,293 | +341% | 0 | 0 | — |
case-15 | fail→pass | 10,724 | 2,237 | -79% | 1 | 1 | 0% | 1,647 | 4,327 | +163% | 0 | 0 | — |
case-16 | fail→pass | 10,687 | 3,028 | -72% | 1 | 1 | 0% | 1,555 | 4,513 | +190% | 0 | 0 | — |
case-17 | pass→pass | 9,930 | 2,290 | -77% | 1 | 1 | 0% | 1,620 | 4,288 | +165% | 0 | 0 | — |
case-18 | fail→pass | 6,672 | 1,927 | -71% | 1 | 1 | 0% | 998 | 4,292 | +330% | 0 | 0 | — |
case-19 | fail→pass | 11,004 | 3,155 | -71% | 1 | 1 | 0% | 1,847 | 4,532 | +145% | 0 | 0 | — |
case-20 | fail→fail | 9,541 | 8,849 | -7% | 1 | 1 | 0% | 1,713 | 5,270 | +208% | 0 | 0 | — |
case-21 | fail→fail | 12,420 | 11,362 | -9% | 1 | 1 | 0% | 1,850 | 5,944 | +221% | 0 | 0 | — |
case-22 | fail→pass | 16,117 | 22,471 | +39% | 1 | 1 | 0% | 2,515 | 5,823 | +132% | 0 | 0 | — |
case-23 | fail→pass | 5,305 | 5,347 | +1% | 1 | 1 | 0% | 823 | 4,857 | +490% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +74 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.