hegel-elixir-tests
Skill1.6k starsChanged todayMITView on GitHub
Create, migrate, run, and review Elixir property tests using the repository's Hegel engine; use for StreamData migration, generator design, stateful/concurrent BEAM verification, replay, and evidence reporting.
We split this skill into the rules it gives an agent
12 rules. About 0 are common, 3 are distinctive, and 9 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 10
Use this skill when changing generated tests in an Overalls Mix application or when reviewing a Hegel property.
- Very specific: line 17
Read the repository AGENTS.md, the target application's AGENTS.md, ancestor CONTRACTS files, and relevant ADRs.
- Very specific: line 28
Keep Hegel development/test-only (runtime: false) and use the repository-pinned native engine.
- Very specific: line 30
When changing the hegel_ex Git revision in any mix.exs or mix.lock, update the corresponding fixed-output Mix dependency hash in …
- Distinctive: line 36
Prefer explicit typed generators and bounded values.
- Very specific: line 55
Treat test_cases as a verification-strength setting, not a generic timeout workaround.
- Very specific: line 62
Use one property runner with labelled draws.
- Distinctive: line 76
Keep diagnostics redacted by default.
- Very specific: line 82
When replacing StreamData, first inventory all property, check all, generator, fixture, and dependency usages.
- Very specific: line 99
Run the smallest focused property or replay first, then the target application's Buck2 :check and :test (tools/precommit selects them).
- Very specific: line 107
Never copy over a loaded .so in place: truncating its mapped inode can crash another BEAM, even when the replacement bytes are identical.
- Very specific: line 111
Before recording execution, compare the dependency checkout with mix.lock and identify the loaded NIF and its ABI.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Hegel property tests for Elixir
Use this skill when changing generated tests in an Overalls Mix application or when reviewing a Hegel property. It applies to BEAM-level behavior and test tooling; it does not replace NixOS machine tests, native Rust tests, browser probes, or fixed ExUnit tests where those provide the required evidence.
Before editing
- Read the repository
AGENTS.md, the target application'sAGENTS.md, ancestorCONTRACTSfiles, and relevant ADRs. - Find the application's reviewed Events catalog before adding diagnostics. Hegel failures and test telemetry must use catalogued metadata and must not expose credentials, tokens, terminal bytes, command arguments, or payloads.
- Identify the existing property runner, dependency pin, fixtures, sandbox ownership, and whether the property crosses a native, host, distributed, or machine boundary. Record architecture impact before implementation.
Write properties
- Keep Hegel development/test-only (
runtime: false) and use the repository-pinned native engine. Fail clearly when the NIF or ABI version is unavailable. - When changing the
hegel_exGit revision in anymix.exsormix.lock, update the corresponding fixed-output Mix dependency hash innix/domains/artifacts/dependency-hashes.jsonfor every affected application. Rebuild the relevant Nix artifact (or run the repository's hash-refresh workflow) and record the resulting hash; a Mix lock update alone leaves offline Nix builds inconsistent. - Prefer explicit typed generators and bounded values. Give collections finite size; do not generate arbitrary atoms, PIDs, references, resources, secrets, or unbounded terms implicitly. Use assumptions only for genuinely unreachable combinations.
- Draw values through the explicit test-case API (
Hegel.draw/2or/3) and label draws. Keep process-dictionary convenience APIs at the boundary rather than in domain helpers. - Set up and tear down every mutable fixture per generated case and replay: SQL sandboxes, processes, sockets, temporary files, registries, and distributed nodes. Cleanup errors are failures and must not be swallowed. Make setup idempotent so shrinking and replay cannot observe leftovers from a previous case.
- For stateful behavior, model commands, preconditions, transitions, postconditions, and invariants separately. Use engine-managed pools for values produced by earlier commands; rejected commands should be distinguishable from failed assertions.
- For concurrency, use controlled Hegel schedules and inspect the complete history against a reference model or linearizability oracle. Keep real multi-node, KVM, isolation, and recovery claims in their existing machine/integration suites.
- Preserve refusal, malformed-input, stale-generation, duplicate, restart, and redaction assertions from the migrated property. A Hegel property may strengthen coverage but must not weaken an existing contract.
- Treat
test_casesas a verification-strength setting, not a generic timeout workaround. Never clamp an ordinary property to one generated case merely to make a suite finish. Preserve default exploration (currently 100 cases) and existing larger budgets, including for real sockets and fresh OTP processes. A small count is appropriate for a deliberate failing replay control, not for making a generated success property pass. Audit truncated mutation lists as well as runner counts. A fixed exhaustive matrix belongs in an ordinary test. - Use one
propertyrunner with labelled draws. Standalonecheck allruns its own engine, but nestedcheck allat older pins silently ignores its options.max_runsandmax_shrinking_stepsare not supported Hegel settings. Inspect the exact pinned frontend before relying on compatibility syntax. The Elixir labelled convenience form isdraw(label, generator); the explicit Erlang API is:hegel.draw(test_case, label, generator). - Diagnose slow cases before changing their budgets. Keep per-operation
deadlines and assertions; size a finite aggregate ExUnit timeout from measured
case duration and the full exploration budget. Use Astra for stalled BEAM/NIF
diagnosis when authorized, inspecting progress, stacks, CPU and memory. Do not
kill an owned run merely because it is quiet. ExUnit
--tracedisables aggregate timeouts, including explicit tags and--timeout; omit it when verifying finite test budgets. Profile names alone do not prove effective case counts, randomness, replay-database or health-check settings. - Keep diagnostics redacted by default. Include labels, locations, seeds, and bounded structural metadata; opt into values or replay blobs only when the test explicitly proves they are safe. Failure rendering must preserve the original exception.
Migration and review
When replacing StreamData, first inventory all property, check all, generator,
fixture, and dependency usages. Convert mechanical syntax with an AST-assisted tool,
then review every property for Hegel size, shrinking, assumptions, context setup,
and replay cleanup. Remove stale StreamData/ExUnitProperties dependencies and
lock entries only after all applications compile.
Review each property for:
- a precise input/output type and bounded generator;
- deterministic seed/replay behavior;
- setup and teardown ownership on pass, failure, rejection, and timeout;
- secret-safe diagnostics and catalogued events;
- evidence limits (BEAM behavior versus native or deployment guarantees);
- meaningful shrinking rather than filtering away the interesting state space.
Run and report
Run the smallest focused property or replay first, then the target application's
Buck2 :check and :test (tools/precommit selects them). Shared protocol changes require both Marshall and Lilly consumer
checks. Run contract, ADR, logging, and conflict-marker checks required by the
repository. Record exact seeds/replay identifiers, test counts, and known skipped
boundaries; do not describe a passing BEAM property as proof of physical isolation or
production recovery.
The native installer must publish a complete sibling file with atomic rename.
Never copy over a loaded .so in place: truncating its mapped inode can crash
another BEAM, even when the replacement bytes are identical. Before b0dec2a,
avoid concurrent Mix compilation and tests in the same application.
Before recording execution, compare the dependency checkout with mix.lock and
identify the loaded NIF and its ABI. A stale deps/ checkout or an external NIF
override does not verify the packaged current pin. Exercise both successful
generation and a deliberate failure/replay through the native engine. For a
full-suite request, inventory every Mix application and default exclusions;
enable required distributed/host/capacity fixtures in an isolated environment.
Report unfinished and excluded tests separately from passes.
For failures, retain the minimized replay and original exception, identify whether the cause is a generator, oracle, fixture cleanup, engine, or product defect, and add a regression property when appropriate. If the engine or NIF cannot load, report the pinned version and reproducible build command rather than silently falling back to a weaker runner.
References
- Existing machine Hegel patterns and redaction rules:
docs/development/testing-with-hegel.md - Contract scope and evidence limits:
docs/development/code-contracts.md - Architecture review requirements:
architecture-review - Contract discovery and enforcement:
code-contracts
Trending
Quiet since January.thin dataabout the whole repository
Who's talking about ghuntley/loom
- A Hacker News story“If your name is not Geoffrey Huntley then do not use loom”Hacker News · Jan 16, 2026 · 2 points
- daydemir/milhouse-go-legacy“Cross-Session Thread Loading & Replay (from Huntley Loom research)”GitHub · Jan 17, 2026
- daydemir/milhouse-go-legacy“Active System Verification Loops (from Huntley Loom research)”GitHub · Jan 17, 2026
- daydemir/milhouse-go-legacy“Meta-Loop Orchestration: Agents Spawning Sub-Loops (exploratory/major from Huntley Loom research)”GitHub · Jan 17, 2026
- daydemir/milhouse-go-legacy“Structured Audit Threads for Agent Decision Trails (from Huntley Loom research)”GitHub · Jan 17, 2026
The biggest 5 of 14 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 14
Talked about on GitHub and Hacker News (14 times).
On GitHub · 13
- Jan 17, 2026Cross-Session Thread Loading & Replay (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Active System Verification Loops (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Meta-Loop Orchestration: Agents Spawning Sub-Loops (exploratory/major from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Structured Audit Threads for Agent Decision Trails (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Server-Side LLM Proxy for Credential Isolation (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
8 more on GitHub
- Jan 17, 2026Secret Wrapper Type for Auto-Redacting (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Error Classification with Transient/Quota/Permanent (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Thread Persistence with UUID7 & Offline-First Sync (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Post-Tool Hook State for Auto-Commit (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Snippet-Based File Editing (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Proactive OAuth Token Refresh (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Multi-Account LLM Pool with Failover & Cooling (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
- Jan 17, 2026Explicit State Machine for Agent Orchestration (from Huntley Loom research) — daydemir/milhouse-go-legacy0 reactions
On Hacker News · 1
- Jan 16, 2026If your name is not Geoffrey Huntley then do not use loom2 points · 1 comment
In this repository31 other files it gives its agents.
- AGENTS.mdAGENTS.md
- antithesis/AGENTS.mdAGENTS.md
- lilly/AGENTS.mdAGENTS.md
- marshall/AGENTS.mdAGENTS.md
- mila/AGENTS.mdAGENTS.md
- protocol/AGENTS.mdAGENTS.md
- susan/AGENTS.mdAGENTS.md
- adr-maintenanceSkill
- antithesis-agent-browserSkill
- antithesis-debugSkill
- antithesis-documentationSkill
- antithesis-feature-workloadSkill
- antithesis-launchSkill
- antithesis-mutation-testingSkill
- antithesis-query-logsSkill
- antithesis-researchSkill
- antithesis-review-inputsSkill
- antithesis-setup-k8sSkill
- antithesis-setupSkill
- antithesis-skills-feedbackSkill
- antithesis-triageSkill
- antithesis-workloadSkill
- architecture-reviewSkill
- buck2Skill
- code-contractsSkill
- covenantSkill
- localizationSkill
- monospace-webSkill
- nix-buildsSkill
- security-auditSkill
- test:triageSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

