Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Turn hunches into accepted results: worthiness score, evidence bar, research-to-rules. Use when vetting ideas. Not for QA; use night-market-validation-and-qa.
.claude/skills/athola-night-market-research-methodology/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 300% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 108% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 101% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 49% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 174% | 0% |
The discipline that turns a hunch into an accepted result in this repo. An "accepted result" is a change that survived the evidence bar and landed through change control as a rule, a skill module, a config gate, or an ADR. Everything else is either a local working note or a documented retirement. This skill covers the full path: score the idea, experiment behind a default-off flag, meet the evidence bar, land the durable artifact, or retire the idea on the record.
A claim graduates from hunch to result only when it passes all four tests.
If the hypothesis explains the three failing cases but not why the fourth case passed, it is incomplete. Keep digging until a single mechanism accounts for everything you saw.
measurement first, then measure. In-repo anchor: the forced-eval harness labels expected activations in prototypes/forced-eval/activation_cases.json before any run, then compares baseline against treatment with a McNemar paired test (a significance test for paired binary outcomes).
agent whose explicit job is to break the claim. Use Skill(attune:war-room) for hard-to-reverse decisions and Skill(imbue:rigorous-reasoning) to counter agreement bias. A claim nobody tried to break is unproven.
the work must not be its sole verifier. See plugins/imbue/skills/proof-of-work/modules/independent-verification.md. Prefer executable checks over an LLM judge, and prove the check can fail before trusting it (Guards 2 and 3 in plugins/imbue/skills/proof-of-work/modules/verifier-integrity.md).
Corollary from verifier-integrity: a green check proves the code satisfies the spec as written. It cannot prove the spec says what you meant, and it proves nothing if the check cannot fail. Validate the spec separately from the code, and mutation-test the check itself.
An idea moves through four gates in order. Skipping a gate is how speculative infrastructure gets built and reverted.
Formula and thresholds from docs/backlog/queue.md (a local, gitignored working file):
Worthiness = (Business Value + Time Criticality + Risk Reduction)
/ (Complexity + Token Cost + Scope Drift)| Score | Action | |-------|--------| | > 2.0 | Implement now | | 1.0 to 2.0 | Discuss before proceeding | | < 1.0 | Keep in backlog |
Queue rules: at most 10 active items. Items untouched for 30 days are archived to a GitHub issue (labels backlog,deferred) and removed from the queue. Because docs/backlog/ and docs/research/ are gitignored, the durable record of a deferred idea is the issue, not the queue file.
Exemplar: the egregore completion-integrity gate.
83281337 added the gate withcompletion_integrity: bool = False in plugins/egregore/scripts/config.py (still False as of 2026-07-02).
cd903cbf added a test covering the raw-JSON opt-in path.Pattern: land the mechanism off by default, cover the opt-in path with a test, and collect usage before proposing a default change.
ADR-0015 (docs/adr/0015-orchestrator-skill-simplification.md) requires 30 days of usage data before simplifying the over-built orchestrator skills. Apply the same bar to any promotion or simplification: name the data window in the PR, not an intuition.
Adoption goes through the process in night-market-change-control. Retirement is written down, never silent. ADR-0012 (confidence-tagged claims) and ADR-0013 (Naur theory-building) carry Status: Superseded by ADR-0017, which is Accepted and rules "Do not build an enforcement mechanism. Permit voluntary use." A documented no is a valid result.
Skill(tome:research) or manual) intoa dated synthesis at docs/research/YYYY-MM-DD-<topic>.md. Match the shape of the existing docs: Thesis, What the evidence says, solution pattern, Mapping to the night-market ecosystem, Evidence gaps and caveats.
new code. Most gaps turn out to be covered already (see case study 3).
.claude/rules/ file, a module inside an existing skill, or a config gate. A new skill is the last resort (.claude/rules/shared-utility-consumer-rule.md requires 2+ consumers within 30 days).
artifact that relies on it, as a table of sources and findings with resolvable identifiers (arXiv IDs, URLs), plus the caveats that bound them. Then delete the citation to the research file.
Caution: docs/research/ and docs/superpowers/ are both gitignored, so a tracked doc that cites a path under either is a dangling reference for every checkout but the author's. Step 4 is what prevents this, and it is not optional. Five syntheses were folded back into their consumers on 2026-07-27 for exactly this reason, and a brainstorm design record cited by .claude/rules/ceremony-requires-need.md survived that pass because the check below only looked at docs/research/. Verify with:
bashrg -o --hidden 'docs/(research|superpowers)/[A-Za-z0-9._/-]+\.md' \ -g '!docs/research/**' -g '!docs/superpowers/**' -g '!.git/**' . \ | sed 's/.*://' | sort -u \ | while read -r p; do git check-ignore -q "$p" && echo "DANGLING: $p" done
docs/backlog/ is gitignored too but stays out of the alternation on purpose. Every tracked citation of it is framed as a local convention, which .claude/skills/night-market-docs-and-writing/SKILL.md states outright, so adding it here would report three intentional hits and train the next reader to skip the output.
The failure it does invite is different, and ADR-0019 nearly shipped it: a tracked doc of record delegating its content to a gitignored path. Citing the backlog as the local ranking list is fine. Saying "the design is recorded in docs/backlog/queue.md" is not, because on a fresh clone nothing is recorded anywhere. A doc of record carries its own content.
Silence means every cited background path resolves on a fresh clone. The check tests whether the cited path is gitignored rather than matching on filename shape, so {session}-style templates in tome's own docs do not trip it. Add any newly ignored docs directory to the alternation, or the next draft cited from a rule repeats this.
The research doc is background, not the record.
The 2026-07-01 synthesis of Armin Ronacher's "The Coming Loop" pulled in the METR randomized trial (arXiv 2507.09089: 16 developers, 246 tasks), GitClear 2025 (211M changed lines), and Karpathy's "mortal terror of exceptions". It produced two artifacts:
.claude/rules/prefer-invariants-over-fallbacks.md (commit 9f771794), and
completion_integrity, default off(commit 83281337).
Lesson: one research doc can fan out into different artifact types. Match the artifact to where the failure occurs (review time versus runtime).
The 2026-07-01 prover-verifier synthesis landed as commit 29081fda: a 146-line module with six guards, plugins/imbue/skills/proof-of-work/modules/verifier-integrity.md, inside the existing proof-of-work skill. No new skill was created. Lesson: extend the consumer that already exists.
docs/karpathy-derivation/project-brief.md (tracked in git) maps four Karpathy principles against existing skills in a coverage matrix and concludes "~90% coverage exists." Only the delta was built: imbue:karpathy-principles, a compact synthesis with an anti-pattern catalog. The same matrix was later reused as the lens for the April 2026 skill audit. Lesson: run the coverage analysis first. The most common honest research outcome is "we already have this."
As practiced in Discussion #449, the April 2026 skill-audit synthesis (category Knowledge]).
rg scans(Skill(pensive:tiered-audit)). Escalate only what Tier 1 flags.
.claude/rules/plan-before-large-dispatch.md (plan mode at 4+ agents). Contract schema in plugins/imbue/skills/proof-of-work/modules/output-contracts.md: required_sections, min_evidence_count (minimum [EN] evidence tags in findings), strictness (strict/normal/lenient). Findings carry file:line evidence. An empty findings list is a valid result. Report "no findings" as such rather than padding.
rules. Issues #454 (Exit Criteria required in every SKILL.md) and #457 (utility skills need 2+ consumers) both followed this path, are CLOSED, and live on as .claude/rules/skill-exit-criteria.md and .claude/rules/shared-utility-consumer-rule.md.
skill-audit backlog, OPEN as of 2026-07-02).
Reading Discussions requires GraphQL. The gh discussion subcommand does not exist:
bashgh api graphql -f query='query { repository(owner: "athola", name: "claude-night-market") { discussion(number: 449) { title body } } }'
prototypes/forced-eval/ (commit 5683e89b) measures whether a forced-evaluation hook lifts skill activation:
activation_cases.json holds labeled prompts with expectedSkill() activations, recorded before measurement.
measure_activation.py runs each prompt via claude -p--output-format stream-json --max-turns 1 --allowedTools Skill, baseline (hook off) against treatment (hook on), and applies the McNemar paired test. True-negative cases count false activations, so a high positive rate alone is not treated as success.
Status: PROTOTYPE, not wired into any plugin.json. The harness is unit-tested but the live lift is unmeasured as of 2026-07-02 (the README says so). Run the harness tests:
bashuv run python -m pytest prototypes/forced-eval/ -q
Verified 2026-07-02: 20 passed.
Mutation testing mutates source code and checks whether the tests notice. A surviving mutant is a test that cannot fail on that behavior, which is the "hollow check" failure mode from verifier-integrity Guard 2. CI runs it weekly plus on dispatch (.github/workflows/mutation-testing.yml). Exit codes: 0 means no survivors, 2 means survivors found, anything else is a crash. Local, per plugin:
bashcd plugins/<plugin> uv pip install mutmut --quiet uv run mutmut run --paths-to-mutate=scripts/,src/ --tests-dir=tests/
Adjust --paths-to-mutate to the directories that exist. CI builds the list from the plugin's top-level scripts/ and src/ dirs.
A ratchet baseline freezes today's debt count in a JSON file. The check fails only when new debt appears, and prints when the count drops so you can tighten the baseline and lock the win. Two live ratchets, both pre-commit hooks and standalone scripts:
bashpython3 scripts/check_skill_graph_drift.py python3 scripts/check_skill_exit_criteria_drift.py
Verified output on 2026-07-02: dangling Skill() refs at 5 against a baseline of 31, and SKILL.md files missing Exit Criteria at 1 against a baseline of 127. Each script names the baseline key to lower. The shrinking baseline diff is the burndown proof: cite it in the PR.
| Source | Path taken | |--------|-----------| | External research | Ronacher, METR, Karpathy syntheses became rules and gates (case studies above) | | PR-review pain | Recurring finding classes became pre-commit guards and .claude/rules/ entries | | Audits | Discussion #449 became issues #454/#457, which became rules | | Incident lessons | See night-market-failure-archaeology for the chronicle |
change: use night-market-validation-and-qa instead.
night-market-change-control instead.
use night-market-collective-memory instead.
night-market-failure-archaeology instead.
night-market-research-frontier instead.
night-market-completion-integrity-campaign instead.
and any score at or below 2.0 was discussed or queued, not built.
that did not fail.
influence, and that check has been shown able to fail.
covering the opt-in path.
ADR, or a superseding ADR documenting retirement.
Compiled 2026-07-02 against repo v1.9.15, branch discussions-fix-1.9.14. Commit anchors (9f771794, 83281337, cd903cbf, 29081fda, 5683e89b) are stable. Volatile facts and one-line re-verification:
rg -n "completion_integrity" plugins/egregore/scripts/config.py
2026-07-02): rerun python3 scripts/check_skill_graph_drift.py and python3 scripts/check_skill_exit_criteria_drift.py
gh issue view 574 --json state -q .state
rg -n "not measured" prototypes/forced-eval/README.md
git check-ignore docs/research docs/backlog docs/superpowers
rg -n "Exit codes" .github/workflows/mutation-testing.yml
docs/backlog/queue.md. It is alocal file, absent on fresh clones. The thresholds are restated above.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-09 | fail→pass | 8,567 | 2,730 | -68% | 1 | 1 | 0% | 1,151 | 4,604 | +300% | 0 | 0 | — |
case-01 | fail→pass | 21,352 | 18,478 | -13% | 1 | 1 | 0% | 3,548 | 7,375 | +108% | 0 | 0 | — |
case-02 | fail→pass | 20,237 | 15,847 | -22% | 1 | 1 | 0% | 3,465 | 6,969 | +101% | 0 | 0 | — |
case-03 | fail→pass | 30,362 | 19,554 | -36% | 1 | 1 | 0% | 5,012 | 7,481 | +49% | 0 | 0 | — |
case-04 | fail→pass | 11,284 | 2,655 | -76% | 1 | 1 | 0% | 1,665 | 4,559 | +174% | 0 | 0 | — |
case-05 | pass→pass | 11,315 | 4,260 | -62% | 1 | 1 | 0% | 1,726 | 4,827 | +180% | 0 | 0 | — |
case-06 | fail→pass | 9,217 | 4,399 | -52% | 1 | 1 | 0% | 1,549 | 4,849 | +213% | 0 | 0 | — |
case-07 | fail→pass | 9,143 | 5,223 | -43% | 1 | 1 | 0% | 1,298 | 5,031 | +288% | 0 | 0 | — |
case-08 | fail→pass | 20,117 | 8,972 | -55% | 1 | 1 | 0% | 3,818 | 5,775 | +51% | 0 | 0 | — |
case-10 | fail→pass | 15,757 | 4,353 | -72% | 1 | 1 | 0% | 3,034 | 4,876 | +61% | 0 | 0 | — |
case-11 | pass→pass | 12,345 | 4,230 | -66% | 1 | 1 | 0% | 1,877 | 4,807 | +156% | 0 | 0 | — |
case-12 | pass→pass | 7,207 | 2,602 | -64% | 1 | 1 | 0% | 1,363 | 4,556 | +234% | 0 | 0 | — |
case-13 | pass→pass | 12,367 | 2,923 | -76% | 1 | 1 | 0% | 2,097 | 4,559 | +117% | 0 | 0 | — |
case-14 | pass→pass | 12,000 | 4,819 | -60% | 1 | 1 | 0% | 1,885 | 4,893 | +160% | 0 | 0 | — |
case-15 | pass→pass | 10,352 | 6,116 | -41% | 1 | 1 | 0% | 1,490 | 5,111 | +243% | 0 | 0 | — |
case-16 | fail→pass | 12,873 | 3,848 | -70% | 1 | 1 | 0% | 1,925 | 4,771 | +148% | 0 | 0 | — |
case-17 | pass→pass | 16,555 | 7,158 | -57% | 1 | 1 | 0% | 2,387 | 5,227 | +119% | 0 | 0 | — |
case-18 | fail→pass | 16,493 | 5,057 | -69% | 1 | 1 | 0% | 2,586 | 4,877 | +89% | 0 | 0 | — |
case-19 | fail→pass | 11,922 | 5,454 | -54% | 1 | 1 | 0% | 1,715 | 5,073 | +196% | 0 | 0 | — |
case-20 | fail→pass | 13,064 | 6,613 | -49% | 1 | 1 | 0% | 1,915 | 5,253 | +174% | 0 | 0 | — |
case-21 | fail→pass | 9,977 | 3,993 | -60% | 1 | 1 | 0% | 1,532 | 4,815 | +214% | 0 | 0 | — |
case-22 | fail→pass | 11,781 | 1,997 | -83% | 1 | 1 | 0% | 1,931 | 4,398 | +128% | 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. 22 cases were attempted. The headline lift of +68 percentage points is the difference between those two pass rates over the 22 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.