Math Spec-Driven Skill
Purpose
Use this skill whenever a task requires rigorous, unambiguous specification of a system, process, relationship, or transformation. Mathematical specification is a methodology — not a subject. It applies whenever precision, completeness, and falsifiability matter more than narrative approximation.
This skill teaches Claude to think in mathematical structures: sets, functions, relations, invariants, and formal constraints. It is domain-agnostic. The formalism is the tool; the domain is whatever the user brings.
Core Philosophy
Mathematics is simultaneously:
- •A system (self-consistent, closed under its own rules)
- •A language (capable of expressing any precisely definable concept)
- •A specification method (the most unambiguous way to define what something IS and what it must DO)
When applied as a specification methodology, mathematics forces three things:
- •Explicitness — every assumption must be stated
- •Composability — every component can be independently verified then combined
- •Falsifiability — every claim is either provable or disprovable within the system
When to Apply This Skill
Trigger this skill when you encounter:
- •Ambiguous requirements that need precise boundaries
- •Systems with many interacting parts that must remain consistent
- •Transformations where the input/output relationship must be guaranteed
- •Constraints that must hold under all conditions (invariants)
- •Decisions that need justification beyond intuition or convention
- •Any domain where "it depends" is not an acceptable specification
The Math Spec Method
Step 1 — Model the Domain
Map the real-world problem onto mathematical primitives:
| Real World | Mathematical Primitive |
|---|---|
| A collection of things | Set S |
| A thing with properties | Tuple or Record (a, b, c) |
| A process or transformation | Function f: A → B |
| A relationship between things | Relation R ⊆ A × B |
| A constraint that must always hold | Invariant / Predicate P(x): Bool |
| A sequence of states | Trace [s₀, s₁, …, sₙ] |
| A measurement | Metric d: S × S → ℝ≥0 |
Task: Before writing any specification, identify which primitives apply. Name them explicitly.
Step 2 — Define the Universe of Discourse
Before specifying behavior, define what EXISTS in the system:
Let U = the universe of all valid entities in this domain Let S ⊆ U = the subset currently under consideration Let ∅ = the empty/null case (always handle this explicitly)
Ask:
- •What are the atomic elements? (Cannot be decomposed further)
- •What are the compound elements? (Defined in terms of atoms)
- •What is explicitly excluded?
Step 3 — Specify Functions and Transformations
Every transformation has a signature and a contract:
f: A → B Precondition: P(a) must hold before f is applied Postcondition: Q(f(a)) must hold after f is applied Invariant: I(a) = I(f(a)) [what must NOT change]
Write specs in this form even in prose-heavy domains. Example:
classify: Document → Category
Pre: Document is non-empty, language is detected
Post: Category ∈ {defined_taxonomy}
Inv: Document content is unchanged by classification
Step 4 — State Invariants Explicitly
Invariants are properties that must hold at ALL times, not just at some steps.
For each invariant, state:
- •What it asserts (the property)
- •When it must hold (always / at boundaries / after each operation)
- •What violates it (the failure mode)
Pattern:
∀ x ∈ S: P(x) — Universal invariant ∃ x ∈ S: P(x) — Existence guarantee P(x) ⟹ Q(f(x)) — Conditional guarantee ¬(P(x) ∧ Q(x)) — Mutual exclusion
Step 5 — Handle Edge Cases as First-Class Concerns
Mathematical completeness requires handling the boundary:
- •The empty set (
S = ∅) - •The singleton (
|S| = 1) - •The degenerate input (zero, negative, infinite, null)
- •The identity case (
f(x) = x) - •The composition case (
f(g(x))— does order matter?)
Never specify only the "happy path." A spec is incomplete if it omits boundary behavior.
Step 6 — Compose and Verify
Once individual components are specified, compose them:
h = f ∘ g (h(x) = f(g(x))) Verify: - Codomain of g matches domain of f - Preconditions of f are implied by postconditions of g - Invariants of both f and g are preserved by h
If composition breaks: the specification has a gap. Find and fill it.
Step 7 — Express Uncertainty with Precision
Where things are probabilistic or unknown, apply the right formalism:
P(outcome | evidence) — conditional probability
E[X] — expected value
Var(X) — variance / spread
argmax_{x} f(x) — best choice under a criterion
Uncertainty does not mean imprecision — it means quantified imprecision.
Output Format
When producing a mathematical specification, always structure output as:
## Specification: [Name] ### 1. Domain Model [Named sets, types, and primitives] ### 2. Functions / Operations [Signatures, preconditions, postconditions, invariants] ### 3. Invariants [Formal or semi-formal statements of what must always hold] ### 4. Edge Cases [Explicit boundary conditions and their specified behavior] ### 5. Composition / Interaction [How components combine; verification that composition is sound] ### 6. Open Questions [What is explicitly left unspecified and why]
Notation Guide (Use Consistently)
| Symbol | Meaning |
|---|---|
∀ | For all |
∃ | There exists |
∈ | Is a member of |
⊆ | Is a subset of |
∅ | Empty set |
→ | Function mapping (A → B) |
⟹ | Logical implication |
⟺ | If and only if |
∧ | Logical AND |
∨ | Logical OR |
¬ | Logical NOT |
∘ | Function composition |
≜ | Defined as |
| ` | S |
⊥ | Undefined / bottom (error state) |
Always define any non-standard notation locally.
Example (Illustrative — Domain is Arbitrary)
Task: Specify a content routing system. (Domain could be emails, support tickets, API calls, documents — the structure is what matters.)
## Specification: Content Router
### 1. Domain Model
Let M = set of all incoming messages (finite, non-empty)
Let C = {c₁, c₂, …, cₙ} = finite set of destination categories
Let R = set of routing rules, where each r ∈ R is a predicate r: M → Bool
Let priority: R → ℕ = total ordering on rules (lower = higher priority)
### 2. Functions / Operations
route: M → C ∪ {⊥}
Pre: m ∈ M, |R| ≥ 1
Post:
If ∃ r ∈ R such that r(m) = true:
route(m) = category associated with highest-priority matching r
Else:
route(m) = ⊥ [unrouted — must trigger fallback handler]
Inv: m is not modified by route(m)
### 3. Invariants
∀ m ∈ M: route(m) is deterministic (same input → same output)
∀ m ∈ M: at most one category is assigned (no split routing)
If route(m) = ⊥, an alert must be emitted
### 4. Edge Cases
M = ∅ → route is never called; system is idle (valid state)
R = ∅ → route(m) = ⊥ for all m (all messages unrouted)
|C| = 1 → route(m) = c₁ for all matched m (trivial routing)
Two rules match → highest priority(r) wins; tie-break by rule index
### 5. Composition
filter ∘ route:
filter: M → M' removes malformed messages before routing
Pre of route is satisfied by Post of filter
Composition valid iff filter guarantees m' ∈ M for all outputs
### 6. Open Questions
- How are rules added/removed at runtime? (Mutation spec not defined here)
- What is the SLA on route latency? (Performance spec out of scope)
Anti-Patterns to Avoid
| Anti-Pattern | Problem | Fix |
|---|---|---|
| "It should handle all cases" | Not falsifiable — not a spec | List every case explicitly |
| "Usually returns X" | Probabilistic without quantification | State P(returns X) or define when it doesn't |
| Defining only the happy path | Collapses on edge cases | Always specify ∅, ⊥, and boundary inputs |
| Natural language for constraints | Ambiguous, multi-interpretable | Restate as predicate logic or structured form |
| Composing without domain/codomain check | Silent type errors at system boundaries | Verify f ∘ g explicitly before combining |
Quality Checklist
Before delivering any math-spec-driven output, verify:
- • Every set is named and defined
- • Every function has a signature (domain → codomain)
- • Every function has preconditions and postconditions
- • At least one invariant is stated
- • Edge cases (∅, ⊥, boundary) are explicitly handled
- • Compositions are verified for domain/codomain alignment
- • Open questions are listed — not silently omitted
- • Notation is consistent throughout