Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/nullhack/temple8/simulate-contractsnpx skills add nullhack/temple8 --skill simulate-contractsgit clone --depth 1 https://github.com/nullhack/temple8What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00040 | $0.01503 |
| Opus 5 | $0.00020 | $0.00751 |
| Sonnet 5 | $0.00008 | $0.00301 |
| Haiku 4.5 | $0.00004 | $0.00150 |
Grade A, and why
simulate-contracts scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 31 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Simulate Contracts
- Load [[requirements/spec-simulation]], [[software-craft/test-stubs]], [[methodology/simplicity-discipline]] — the simulation method, the test-pair drift rules, and the scope-minimal rule.
- Frame the step. This is NOT a ceremony that validates the model "works" — the model is already a binding input (
data-model.md), not something this gate ratifies. This step is a compiler: it takes the contract set (test.pyi, test.py, source.pyi, the modeled schema, the captured cassettes, the interview) and simulates how the real application would run if a correct implementation made every test pass — the way a compiler walks an AST to prove the program type-checks and links, before any code executes. You are running the program mentally, against the specs, to disprove or confirm that it works. The output is a verdict (accepted) or a named gap (needs-test-bodies,needs-source-stubs,needs-capture,needs-elicitation) — never a clean stamp on a tool run alone. This is NOT a code review or a contract↔spec consistency check — confirming the tests reference the findings is the failure mode, not the gate. - Walk the e2e path hop by hop, capturing observations at each hop. For each hop in the entry-point e2e (entry → adapter → domain → persistence → side effect):
- (a) Walk the hop — confirm the type handed across matches the type the receiver declares; the value carried matches the shape the producer emits; the side effect the hop performs is one a contract actually specifies.
- (b) Append the observation to
.cache/<session_id>/journal.mdat this hop — not only the verdict at the end. The journal is a per-hop record, not a summary; an observation recorded at the hop it was made is the evidence the verdict rests on. The content is mandated (per-hop observations exist, in any structure the reviewer chooses); the format is not. - (c) Cross-check the hop against the spec (
interview-notes.md,glossary.md,data-model.md) — does the spec require something this hop doesn't carry? does the hop carry something the spec doesn't name? A hop that fails this check is a spec gap. - (d) Name any gap precisely before continuing — which hop, which value, which spec finding. IF a hop breaks or two tests disagree on a value's shape THEN stop and route back to plan; do not advance on a clean tool run alone.
- Spec-diff. For each consolidated interview finding, confirm the test set enforces it (not merely names it). A finding named in a test but not enforced — a vacuous assertion, a lower-bound-only check, an
assert True, an effect asserted without pinning how — is a gap, not a pass. This is distinct from traceability (step 6), which counts whether a finding has any test; spec-diff asks whether the test would actually fail if the finding were violated. IF a finding is named but not enforced THEN route toneeds-test-bodieswith the finding and the offending test cited. - Build-implied gaps. Name any ambiguity a correct implementation would surface:
- two impls both pass but only one matches spec — the contract under-determines the behaviour;
- an effect asserted without pinning how — the test asserts an outcome but not the mechanism, so any mechanism passes (a constant, a no-op, a real computation);
- a side effect the test doesn't observe — the contract claims a side effect (a write, a publish, a state change) but no test observes it, so the implementation could omit it and pass;
- a persistence shape the test asserts but the model doesn't declare (or vice versa) — disagreement with
data-model.md. Each is a build-implied gap. The gate question expands from "would passing = working?" to "would passing = working and unambiguous?". IF any build-implied gap is found THEN route toneeds-test-bodies(orneeds-source-stubsif the ambiguity is at the source-stub surface) with the gap cited.
- Traceability. Every consolidated interview finding maps to at least one test or an explicit deferral, and every external service has a captured cassette its tests replay. This is the structural count; it is necessary but not sufficient — step 4 (spec-diff) is what makes a finding "tested" mean "enforced".
- Run pyright on the combined set. The gate is zero errors;
reportMissingModuleSourceis expected (source .pyi exist but no .py yet) and is tolerated. - Check no-orphans: every source .pyi symbol is exercised by at least one test, and every test reference is backed by a source .pyi.
- Check layer order: external-boundary stubs complete before adapter stubs, and so on.
- Run stubtest on the tests to confirm zero drift between every test .pyi and its sibling .py per [[software-craft/test-stubs]]. Source stubtest waits for build — no source .py exists yet.
- Run the dev ruff check (
ruff check .) on the whole project; the gate is zero violations. Restructure lint (SIM,RUF) andruff formatare merge-time per [[software-craft/docstring-lifecycle]] — a readability restructure is not a plan defect. Plan-authored tests and stubs must pass the bug-catcher set before build. - IF a test references an external exchange no captured cassette covers THEN append the finding to
.cache/<session_id>/journal.md(service, the missing case) and fireneeds-capture. This routes back to explore to record the missing reality, not forward to build. - Emit the verdict.
acceptedonly when the walkthrough reached no broken hop, the value traces found no disagreement, the spec-diff found no named-but-not-enforced finding, no build-implied gap was named, and the tool floor is clean. Any other outcome is a named gap routed to its target with the specifics (which hop, which value, which finding, which ambiguity) recorded in the journal. - On
accepted, commit the gated contract surface to dev as one change —git add tests <package>thengit commit -m 'test: author contract surface'— so the build's feature branch can branch off it. The surface is the test stubs/bodies and source stubs (tests/**/*_test.pyi,tests/**/*_test.py,<package>/**/*.pyi);data-model.mdis gitignored under.cache/and is not committed.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 31 lines · 40 tokens per session scan A bc87677faa6d
simulate-contracts is a skill published in the GitHub repository nullhack/temple8 (11 stars, last pushed 27d ago), licensed MIT. It adds 40 tokens to every session and 1,503 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
load-github-action-thread
Download retained Codex GitHub Action thread artifacts and load their rollout history into the local Codex app. Use when asked to open, load, import, resume, or inspect a Codex automation thread from a GitHub Actions run or a related GitHub issue or pull request.
test-generator
Generate pytest test cases for Python functions and classes.
python-binance
Help developers use the python-binance library for trading on Binance. Use when code imports binance, references Client/AsyncClient, or asks about Binance API trading, market data, websockets, or account management.
itx:execute
Execute the plan for an issue (parent or subtask).
clawctl
Know the clawctl CLI and manage your Clawrium fleet (hosts, agents, providers, channels, integrations, skills, secrets).
create-playwright
Record a browser-session demo (MP4) using Playwright via a replay-first compile pipeline. A YAML spec drives the driver script, the recording, and the ElevenLabs voiceover — mirrors create-vhs for browser flows.