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.
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:
Plugin: a directory under plugins/ with a
.claude-plugin/plugin.json manifest. Most have their own Makefile,
pyproject.toml, and tests/.
skrills: a Rust CLI for skill validation and token analysis,
vendored at plugins/abstract/bin/skrills. Every skrills target has
a Python fallback, so a missing binary never blocks you.
ClawHub export: a cross-framework skill package format written to
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 anatomy
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/.
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.
Scoping runs: one plugin, one file
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>:
make 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:
cd plugins/imbue && uv run pytest tests/unit/test_deferred_capture.py -x -q
Rules that save you an hour:
Never run root pytest expecting plugin tests to run. Root
pyproject.toml sets norecursedirs = ["plugins/*", ...] because
plugin conftest.py files collide on import paths. Plugin tests run
per-plugin, always.
Some plugins force coverage on every run. imbue's pytest addopts
include --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.
Coverage thresholds: root coverage fail_under = 85. Per-plugin
overrides 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 conventions
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
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.
Preflight. Run Skill(sanctum:git-workspace-review) for a
read-only workspace check. Confirm you are on a
<topic>-<version> branch. Do not release from master.
Bump the version everywhere. Dry-run first:
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
any **/__init__.py that contains __version__
Expect a large diff of roughly 100 files. That is the design.
Add the CHANGELOG entry. CHANGELOG.md follows Keep a Changelog
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.
Sync the docs. Update the per-plugin version column in
docs/api-overview.md. Then run:
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.
Open the PR and clear the gates. Follow
night-market-change-control. The gates are the pre-commit hooks, the
slop check on docs, capabilities-sync, typecheck, and the security
workflows.
Merge to master.
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.
Tag the release. Run /sanctum:create-tag v1.9.16. The command
pushes a v-prefixed annotated tag. It then confirms that the release
pipeline started.
Let the release pipeline run.
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-clawhub
night-market-openclaw-bridge
night-market-a2a-cards
night-market-cross-framework
It 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 locally
update_versions.py diff reviewed and marketplace.json shows the
new version
CHANGELOG has the new section, [Unreleased] still on top
make docs-sync-check clean
Tag pushed, both workflows green, release has 4 tarball assets
Book publishing
The mdBook under book/ deploys via deploy-book.yml:
Triggers: push to master or main touching book/** or the workflow
file itself, plus PRs on the same paths (build-only) and manual
dispatch.
Build: 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.
Known fragility: mdbook is unpinned ("latest"), so a new upstream
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:
cd book && mdbook build # output in book/build/
Cross-framework export surface
make 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.
When NOT to use
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")
Exit Criteria
The chosen make target ran and its per-plugin summary was read,
beyond the exit code alone. For make validate-all and
make plugin-check, output was scanned for embedded failure
notes.
Single-plugin or single-file test runs were executed from inside
the plugin directory, never via root pytest.
For a release: update_versions.py diff verified, CHANGELOG
section added, make docs-sync-check clean, tag pushed, and the
GitHub release shows all four tarball assets.
Any generated artifact (htmlcov, coverage.xml, clawhub/,
book/build) was identified as generated and not hand-edited.
Provenance and maintenance
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:
# 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
1---2name: night-market-operations-23description: 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.4---56# Night Market Operations78This skill is the runbook for operating the claude-night-market repo:9what each make target actually executes, where artifacts land, and the10exact sequence that ships a release. Every command below was verified11against the Makefile, scripts/, and .github/workflows/ on 2026-07-0212(repo v1.9.15).1314Terms used once and reused throughout:1516- **Plugin**: a directory under `plugins/` with a17 `.claude-plugin/plugin.json` manifest. Most have their own Makefile,18 pyproject.toml, and tests/.19- **skrills**: a Rust CLI for skill validation and token analysis,20 vendored at `plugins/abstract/bin/skrills`. Every skrills target has21 a Python fallback, so a missing binary never blocks you.22- **ClawHub export**: a cross-framework skill package format written to23 `clawhub/` by `scripts/clawhub_export.py`.2425All commands run from the repo root unless a `cd` is shown. `uv` is26required for everything Python. For environment setup, see27night-market-build-and-env.2829## Command anatomy3031| Command | What it actually executes | When to use | Expected output shape |32|---------|---------------------------|-------------|-----------------------|33| `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. |34| `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". |35| `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. |36| `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. |37| `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)". |38| `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`. |39| `make supply-chain-scan` | `python3 scripts/supply_chain_scan.py` | After dependency or lockfile changes. | Scan report between banner lines. |40| `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. |41| `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. |42| `make status` | `make -C <plugin> status` for every plugin. | Quick overview. | Per-plugin status or "(status unavailable)". |43| `make clean` | `make -C <plugin> clean` for every plugin, errors ignored. | Reset build artifacts. | "Done." |4445Two targets have soft failure modes worth repeating: `make validate-all`46and `make plugin-check` keep going past failures and can exit 0 while a47plugin is broken. Read their output. Do not treat a green exit as proof.4849## Scoping runs: one plugin, one file5051The root Makefile auto-generates delegation targets for every plugin52that has a Makefile. `make <plugin>-<target>` is identical to53`make -C plugins/<plugin> <target>`:5455```bash56make sanctum-test # run sanctum's test suite57make imbue-lint # run imbue's lint target58make abstract-help # list a plugin's own targets59```6061Run a single test file from inside the plugin directory:6263```bash64cd plugins/imbue && uv run pytest tests/unit/test_deferred_capture.py -x -q65```6667Rules that save you an hour:6869- Never run root `pytest` expecting plugin tests to run. Root70 pyproject.toml sets `norecursedirs = ["plugins/*", ...]` because71 plugin conftest.py files collide on import paths. Plugin tests run72 per-plugin, always.73- Some plugins force coverage on every run. imbue's pytest `addopts`74 include `--cov=scripts`, `--cov-report=html:htmlcov`, and75 `--cov-report=xml`, so even a single-file run writes `htmlcov/` and76 `coverage.xml` into `plugins/imbue/`. This is normal, not a mess you77 made.78- Coverage thresholds: root coverage `fail_under = 85`. Per-plugin79 overrides live in each plugin's `[tool.nightmarket]`80 `coverage_threshold` (per-plugin values: see81 night-market-validation-and-qa, the designated home for the82 threshold inventory). `run-plugin-tests.sh` reads that value and83 passes `--cov-fail-under=<n>` when the plugin runs via the pytest84 path.8586## Artifact conventions8788| Artifact | Producer | Location | Committed? |89|----------|----------|----------|------------|90| `htmlcov/`, `coverage.xml` | pytest coverage addopts | Repo root and per-plugin dirs | Present in tree but regenerated. Never hand-edit |91| `reports/skill-graph.json` | skill-graph tooling | `reports/` | No, generated locally (`reports/` is gitignored). Rebuild with the skill-graph tooling |92| `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 |93| `bridge/openclaw/`, `bridge/a2a/` | `make bridge-build`, `make a2a-cards` | `bridge/` | Build outputs. `make bridge-clean` removes skills and a2a |94| `book/build/` | `mdbook build` (book/book.toml sets `build-dir = "build"`) | `book/build/` | No, CI-built |95| `trust-report.json` | CI only: trust-attestation.yml on push to master | Workflow workspace, SLSA-attested | No, never in tree |9697## Release runbook9899The ecosystem ships as one version. `.claude-plugin/marketplace.json`100is the version source of truth, fanned out to every plugin manifest.101Gates and review policy are night-market-change-control territory.102This is the mechanical sequence.1031041. **Preflight.** Run `Skill(sanctum:git-workspace-review)` for a105 read-only workspace check. Confirm you are on a106 `<topic>-<version>` branch. Do not release from master.1071082. **Bump the version everywhere.** Dry-run first:109110 ```bash111 uv run python plugins/sanctum/scripts/update_versions.py 1.9.16 --dry-run112 uv run python plugins/sanctum/scripts/update_versions.py 1.9.16113 git diff --stat114 ```115116 The script rejects any version that does not match117 `^\d+\.\d+\.\d+$`. It then rewrites the version field in every match118 of these globs, and it skips cache and venv directories:119120 - `**/pyproject.toml`121 - `**/Cargo.toml`122 - `**/package.json`123 - `**/.claude-plugin/plugin.json`124 - `**/.claude-plugin/metadata.json`125 - `**/.claude-plugin/marketplace.json`126 - `**/openpackage.yml`127 - any `**/__init__.py` that contains `__version__`128129 Expect a large diff of roughly 100 files. That is the design.1301313. **Add the CHANGELOG entry.** CHANGELOG.md follows Keep a Changelog132 1.1.0 with SemVer. Keep `## [Unreleased]` at the top. Insert133 `## [X.Y.Z] - YYYY-MM-DD` directly below it. Do not rewrite or134 de-slop historical entries.1351364. **Sync the docs.** Update the per-plugin version column in137 `docs/api-overview.md`. Then run:138139 ```bash140 make docs-sync-check141 ```142143 The check compares plugin.json registrations against the generated144 capabilities reference in `book/src/reference/`. If it reports145 drift, run `/sanctum:sync-capabilities --fix`.1461475. **Open the PR and clear the gates.** Follow148 night-market-change-control. The gates are the pre-commit hooks, the149 slop check on docs, capabilities-sync, typecheck, and the security150 workflows.1511526. **Merge to master.**153154 `trust-attestation.yml` fires on the push. It runs `make test`. It155 writes `trust-report.json`. It attaches a SLSA provenance156 attestation with `actions/attest-build-provenance@v4`.1571587. **Tag the release.** Run `/sanctum:create-tag v1.9.16`. The command159 pushes a v-prefixed annotated tag. It then confirms that the release160 pipeline started.1611628. **Let the release pipeline run.**163164 `cross-framework-publish.yml` fires on `v*` tags. It strips the `v`165 and validates the version against `^[0-9]+\.[0-9]+\.[0-9]+`. It runs166 the cross-framework unit tests: clawhub_export, build_bridge,167 a2a_cards, and framework_detect. It runs `make cross-framework`. It168 packages four tarballs:169170 - `night-market-clawhub`171 - `night-market-openclaw-bridge`172 - `night-market-a2a-cards`173 - `night-market-cross-framework`174175 It then creates the GitHub release.176177 One precondition applies. The publish job fails when178 `clawhub/manifest.json` does not exist. It also fails when179 `total_exported` is 0. The current count is 188.180181 ClawHub submission after the release stays manual. Run182 `./scripts/clawhub-submit.sh v<version>`.183184Release checklist:185186- [ ] `make test`, `make lint`, `make typecheck` all pass locally187- [ ] `update_versions.py` diff reviewed and marketplace.json shows the188 new version189- [ ] CHANGELOG has the new section, `[Unreleased]` still on top190- [ ] `make docs-sync-check` clean191- [ ] Tag pushed, both workflows green, release has 4 tarball assets192193## Book publishing194195The mdBook under `book/` deploys via deploy-book.yml:196197- Triggers: push to master or main touching `book/**` or the workflow198 file itself, plus PRs on the same paths (build-only) and manual199 dispatch.200- Build: `peaceiris/actions-mdbook@v2` with `mdbook-version: 'latest'`,201 then `mdbook build` with working-directory `book`. Output202 `book/build` uploads via `actions/upload-pages-artifact@v5` and203 deploys with `actions/deploy-pages@v5`, with one retry step if the204 first deploy fails.205- Known fragility: mdbook is unpinned ("latest"), so a new upstream206 mdbook release can break the build with no change in this repo. If207 the book job fails right after an mdbook release, suspect that first.208209Local preview, if mdbook is installed:210211```bash212cd book && mdbook build # output in book/build/213```214215## Cross-framework export surface216217```bash218make clawhub-export # export all skills to clawhub/, then validate219make clawhub-export-top # top 20 most marketable skills only220make clawhub-validate # re-validate an existing export221make clawhub-stats # export statistics, no writes222make bridge-build # (depends on clawhub-export) build bridge/openclaw/223make a2a-cards # generate A2A agent cards into bridge/a2a/224make a2a-list # list agents eligible for card generation225make detect-framework # detect the active agentic framework226make cross-framework # all of the above: export + bridge + cards227```228229`make cross-framework` is exactly what the release pipeline runs, so230running it locally before tagging catches export failures early. It231prints skill and agent counts and ends with framework detection.232233## When NOT to use234235| You want | Use instead |236|----------|-------------|237| Set up uv, Python, tools from scratch | night-market-build-and-env |238| Classify a change, know which gates apply | night-market-change-control |239| Diagnose a failing test or broken hook | night-market-debugging-playbook |240| Configuration axes, env vars, defaults | night-market-config-catalog |241| Coverage discipline and evidence bar | night-market-validation-and-qa |242| Plugin/skill/hook mechanics | claude-code-plugin-reference |243| Measurement tooling interpretation | night-market-diagnostics-toolkit |244| Stop an egregore loop or its watchdog relaunch machinery | night-market-completion-integrity-campaign (P1b, "Stopping and relaunch machinery") |245246## Exit Criteria247248- [ ] The chosen make target ran and its per-plugin summary was read,249 beyond the exit code alone. For `make validate-all` and250 `make plugin-check`, output was scanned for embedded failure251 notes.252- [ ] Single-plugin or single-file test runs were executed from inside253 the plugin directory, never via root pytest.254- [ ] For a release: `update_versions.py` diff verified, CHANGELOG255 section added, `make docs-sync-check` clean, tag pushed, and the256 GitHub release shows all four tarball assets.257- [ ] Any generated artifact (htmlcov, coverage.xml, clawhub/,258 book/build) was identified as generated and not hand-edited.259260## Provenance and maintenance261262Compiled 2026-07-02 against repo v1.9.15, branch discussions-fix-1.9.14.263Coverage-threshold inventory delegated to night-market-validation-and-qa264and the egregore stop cross-reference added on 2026-07-03.265Volatile facts and how to re-verify them:266267```bash268# Make target wiring269sed -n '60,150p' Makefile && sed -n '150,300p' Makefile270271# Test runner behavior (delegation, coverage threshold, skip logic)272sed -n '1,110p' scripts/run-plugin-tests.sh273274# Version bump globs and semver regex275rg -n "patterns|re.match" plugins/sanctum/scripts/update_versions.py276277# Release pipeline gates278rg -n "tags|total_exported|tar -czf" \279 .github/workflows/cross-framework-publish.yml280281# Attestation flow282rg -n "make test|attest|trust-report" \283 .github/workflows/trust-attestation.yml284285# Book deploy and mdbook pin286rg -n "mdbook-version|deploy-pages|working-directory" \287 .github/workflows/deploy-book.yml288289# Current export count (was 188 on 2026-07-02)290python3 -c "import json; \291 print(json.load(open('clawhub/manifest.json'))['total_exported'])"292293# Coverage thresholds294rg -n "coverage_threshold" plugins/*/pyproject.toml295rg -n "fail_under" pyproject.toml296```
Run npx skillmds@latest add athola/night-market-operations-2 in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
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. It is listed under Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Independent scanners report: SkillSpector: PASS, Skill Scanner: PASS. Capability flags: reads secrets. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
athola (@athola) published this skill. Their other Agent Skills are listed on their SkillMD profile.