doing-a-simple-two-sta…
Use when analyzing a large corpus of text, code, or data that exceeds a single agent's effective context - orchestrates parallel…
Use when writing tests for serialization, validation, normalization, or pure functions - provides property catalog, pattern detection, and library reference for property-based testing
Claude Code
$ npx -y skills add ed3dai/ed3d-plugins --skill property-based-testing --agent claude-code
Codex
$ npx skills add ed3dai/ed3d-plugins --skill property-based-testing -a codex -y
Cursor
$ npx skills add ed3dai/ed3d-plugins --skill property-based-testing -a cursor -y
Gemini CLI
$ npx skills add ed3dai/ed3d-plugins --skill property-based-testing -a gemini-cli -y
GitHub Copilot
$ npx skills add ed3dai/ed3d-plugins --skill property-based-testing -a github-copilot -y
OpenCode
$ npx skills add ed3dai/ed3d-plugins --skill property-based-testing -a opencode -y
Windsurf
$ npx skills add ed3dai/ed3d-plugins --skill property-based-testing -a windsurf -y
name: property-based-testing description: Use when writing tests for serialization, validation, normalization, or pure functions - provides property catalog, pattern detection, and library reference for property-based testing user-invocable: false
Property-based testing (PBT) generates random inputs and verifies that properties hold for all of them. Instead of testing specific examples, you test invariants.
**When PBT beats example-based tests:**
| Property | Formula | When to Use | |----------|---------|-------------| | **Roundtrip** | `decode(encode(x)) == x` | Serialization, conversion pairs | | **Idempotence** | `f(f(x)) == f(x)` | Normalization, formatting, sorting | | **Invariant** | Property holds before/after | Any transformation | | **Commutativity** | `f(a, b) == f(b, a)` | Binary/set operations | | **Associativity** | `f(f(a,b), c) == f(a, f(b,c))` | Combining operations | | **Identity** | `f(x, identity) == x` | Operations with neutral element | | **Inverse** | `f(g(x)) == x` | encrypt/decrypt, compress/decompress | | **Oracle** | `new_impl(x) == reference(x)` | Optimization, refactoring | | **Easy to Verify** | `is_sorted(sort(x))` | Complex algorithms | | **No Exception** | No crash on valid input | Baseline (weakest) |
**Strength hierarchy** (weakest to strongest):
No Exception -> Type Preservation -> Invariant -> Idempotence -> Roundtrip
Always aim for the strongest property that applies.
**Use PBT when you see:**
| Pattern | Property | Priority | |---------|----------|----------| | `encode`/`decode`, `serialize`/`deserialize` | Roundtrip | HIGH | | `toJSON`/`fromJSON`, `pack`/`unpack` | Roundtrip | HIGH | | Pure functions with clear contracts | Multiple | HIGH | | `normalize`, `sanitize`, `canonicalize` | Idempotence | MEDIUM | | `is_valid`, `validate` with normalizers | Valid after normalize | MEDIUM | | Sorting, ordering, comparators | Idempotence + ordering | MEDIUM | | Custom collections (add/remove/get) | Invariants | MEDIUM | | Builder/factory patterns | Output invariants | LOW |
| Language | Library | Import | |----------|---------|--------| | Python | Hypothesis | `from hypothesis import given, strategies as st` | | TypeScript/JS | fast-check | `import fc from 'fast-check'` | | Rust | proptest | `use proptest::prelude::*` | | Go | rapid | `import "pgregory.net/rapid"` | | Java | jqwik | `@Property` annotations | | Haskell | QuickCheck | `import Test.QuickCheck` |
**For library-specific syntax and patterns:** Use `@ed3d-research-agents:internet-researcher` to get current documentation.
1. **Constrain early:** Build constraints INTO the strategy, not via `assume()`
# GOOD st.integers(min_value=1, max_value=100) # BAD - high rejection rate st.integers().filter(lambda x: 1 <= x <= 100)
2. **Size limits:** Prevent slow tests
st.lists(st.integers(), max_size=100) st.text(max_size=1000)
3. **Realistic data:** Match real-world constraints
st.integers(min_value=0, max_value=150) # Real ages, not arbitrary ints
4. **Reuse strategies:** Define once, use across tests
valid_users = st.builds(User, ...) @given(valid_users) def test_one(user): ... @given(valid_users) def test_two(user): ...
# Development (fast feedback) @settings(max_examples=10) # CI (thorough) @settings(max_examples=200) # Nightly/Release (exhaustive) @settings(max_examples=1000, deadline=None)
Before committing PBT tests:
| Mistake | Fix | |---------|-----| | Testing mock behavior | Test real behavior | | Reimplementing function in test | Use algebraic properties | | Filtering with assume() | Build constraints into strategy | | No edge case examples | Add @example decorators | | One property only | Add multiple properties (length, ordering, etc.) |
Ed's repo of Claude Code plugins, centered around a research-plan-implement workflow. Only a tiny bit cursed. If you're lucky.
Use when analyzing a large corpus of text, code, or data that exceeds a single agent's effective context - orchestrates parallel…
Use when creating a new Claude Code plugin or setting up plugin structure - provides complete file organization, manifest format,…
Use when creating specialized subagents for Claude Code plugins or the Task tool - covers description writing for…
Use when creating, releasing, or maintaining a Claude Code Plugin Marketplace - covers marketplace.json schema, version…
Use when completing development phases or branches to identify and update CLAUDE.md or AGENTS.md files that may have become stale…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.