metamorphic-test-design
Use when designing metamorphic tests for oracle-poor behavior using invariants and input relations. Triggers:
What this skill does
# Metamorphic Testing Use this skill when a normal assertion is weak because the exact expected output is unavailable, too expensive to compute, or too brittle to maintain. The goal is to test relations between executions: if the input is transformed in a controlled way, the output must transform, remain stable, or preserve a property. Treat invariants as contracts about what must survive the transform. ## Inputs Collect the behavior under test, its input domain, known preconditions, available seed examples, and the risk you need evidence for. If an exact oracle exists for a narrow part of the domain, keep it as a calibration check, but do not make the plan depend on exact outputs everywhere. ## Relation Selection Choose relations that encode a real contract, not a convenient coincidence. Prefer relations that are explainable to a domain owner and cheap enough to run many times. Common relation families: - Invariance: formatting, ordering of independent inputs, or harmless metadata changes must not alter the relevant result. - Equivalence: two different representations of the same meaning must produce equivalent outputs. - Round trip or inverse: encode then decode, normalize then parse, or apply an inverse transform and recover the original property. - Monotonicity: increasing an input, permission, budget, or threshold cannot decrease a corresponding output property. - Decomposition and aggregation: solving parts independently and combining them must match solving the whole where the domain permits it. - Idempotence: applying normalization, repair, deduplication, or canonicalization twice must match applying it once. - Commutativity or associativity: operation order must not matter when the domain says it should not matter. - Scaling or shifting: numeric outputs should change predictably when units, offsets, or scale factors change. - Differential relation: two independent implementations, modes, or APIs must agree on a shared property even if their exact formats differ. Reject a relation if it depends on undocumented behavior, hides a known lossy step, or only passes because the generator avoids hard cases. ## Generator Design Start with seeds that cover normal, boundary, and historically broken inputs. Add transformations that preserve the chosen relation and state each transform's precondition. For each generator, define: - Seed source: fixtures, production-shaped examples, reduced bug cases, or structured random builders. - Transform: the exact mutation applied to the seed. - Guard: conditions that must hold before the relation is valid. - Observable: the output property compared across executions. - Shrink strategy: how to reduce a failing pair to the smallest seed and transform that still fails. Make generators produce paired or grouped cases, not isolated inputs. The harness should record the seed, transform, relation name, guard result, compared observables, and any tolerances used. ## Harness Pattern Structure each test as source execution, transformed execution, relation assertion. Keep relation logic separate from input generation so failed cases can be replayed deterministically. Recommended test shape: 1. Build or load a seed input. 2. Apply one named transform. 3. Skip only when the relation guard is false. 4. Execute both inputs through the same public behavior. 5. Compare the declared observable, using explicit tolerance for nondeterministic or numeric systems. 6. Persist the minimal failing seed and transform metadata when the assertion fails. ## Failure Triage When a relation fails, triage in this order: 1. Guard failure: the precondition was wrong or incomplete. 2. Generator failure: the transform created an invalid or unintended input. 3. Observation failure: the compared property is too broad, too narrow, or includes unstable data. 4. Tolerance failure: the relation needs an explicit numeric, timing, ordering, or concurrency tolerance. 5. Relation failure: the supposed invariant is not a product contract. 6. Product failure: the implementation violates a real relation and needs a fix. Record the decision. A fixed test should explain whether the change repaired the system, narrowed the generator, changed the guard, or replaced the relation. ## Output Format Return a concise test design with: - Risk statement: the behavior and why exact expected outputs are hard. - Relation matrix: relation name, input transform, guard, observable, assertion, and risk covered. - Generator plan: seed source, transform strategy, boundary cases, replay method, and shrink strategy. - Harness notes: framework hooks, determinism controls, tolerances, and artifact capture. - Failure triage rubric: how to classify relation failures before changing product code. ## Quality Bar A good metamorphic test fails for a meaningful contract violation, not for incidental representation differences. It runs often enough to find regressions, logs enough metadata to reproduce a failing relation, and keeps each relation narrow enough that one failure tells the maintainer what kind of contract broke.
Related in Design
contribute
IncludedLocal-only OSS contribution command center. Auto-refreshes the user's in-flight PR and issue state on invoke so conversations start with full context — no need to brief Claude on what's in flight. Helps the user find issues to contribute to on GitHub, builds per-repo dossiers of what each upstream expects (CLA, DCO, branch convention, AI policy, draft-first, review bots, issue templates), runs deterministic gates before any external action so AI-assisted contributions don't reach maintainers as slop. State is markdown-only: candidate files at ~/.contribute-system/candidates/, repo dossiers at ~/.contribute-system/research/, append-only event log at ~/.contribute-system/log.jsonl. No database, no cloud calls. Use when the user asks about their PRs / issues / contributions, wants to find new work to take on, claim an issue, build/refresh a repo's dossier, or draft a Design Issue or PR. Trigger with "/contribute", "what's my PR status", "find a contribution", "claim issue X", "draft a Design Issue for Y", "refresh dossier for Z".
architectural-analysis
IncludedUser-triggered deep architectural analysis of a codebase or scoped subtree across eight modes — information architecture, data flow, integration points, UI surfaces, interaction patterns, data model, control flow, and failure modes. This skill should be used when the user asks to "diagram this codebase," "map the architecture," "show the data flow," "give me an ERD," "trace control flow," "find the integration points," "verify the layout pattern," "audit the UX architecture," or any similar request whose primary deliverable is mermaid diagrams plus cited reports under docs/architecture/. Dispatches haiku/sonnet sub-agents in parallel for per-mode exploration, then verifies every citation mechanically before any node lands in a diagram. Not for one-off prose explanations of code (use code-explanation) or for high-level system design from scratch (use system-design).
mcp
IncludedModel Context Protocol (MCP) server development and tool management. Languages: Python, TypeScript. Capabilities: build MCP servers, integrate external APIs, discover/execute MCP tools, manage multi-server configs, design agent-centric tools. Actions: create, build, integrate, discover, execute, configure MCP servers/tools. Keywords: MCP, Model Context Protocol, MCP server, MCP tool, stdio transport, SSE transport, tool discovery, resource provider, prompt template, external API integration, Gemini CLI MCP, Claude MCP, agent tools, tool execution, server config. Use when: building MCP servers, integrating external APIs as MCP tools, discovering available MCP tools, executing MCP capabilities, configuring multi-server setups, designing tools for AI agents.
react-native-skia
IncludedDesign, build, debug, and optimise high-polish animated graphics in React Native or Expo using @shopify/react-native-skia, Reanimated, and Gesture Handler. Use when the user wants canvas-driven UI, shaders, paths, rich text, image filters, sprite fields, Skottie, video frames, snapshots, web CanvasKit setup, or performance tuning for custom motion-heavy elements such as loaders, hero art, cards, charts, progress indicators, particle systems, or gesture-driven surfaces. Also use when the user asks for fluid, glow, glass, blob, parallax, 60fps/120fps, or GPU-friendly animated effects in React Native, even if they do not explicitly say "Skia". Do not use for ordinary form/layout work with standard views.
plaid
IncludedProduct Led AI Development — guides founders from idea to launched product. Six capabilities: Idea (discover a product idea), Validate (pressure-test the idea against fatal flaws, problem reality, competition, and 2-week MVP feasibility), Plan (vision intake + document generation), Design (translate image references into a design.md spec), Launch (go-to-market strategy), and Build (roadmap execution). Use when someone says "PLAID", "plaid idea", "help me find an idea", "product idea", "idea from my business", "idea from my expertise", "plaid validate", "validate my idea", "pressure-test", "is this idea good", "find fatal flaws", "validate the problem", "plan a product", "define my vision", "generate a PRD", "product strategy", "plaid design", "design from image", "translate image to design", "create design.md", "extract design tokens", "plaid launch", "go-to-market", "launch plan", "GTM strategy", "launch playbook", "plaid build", "build the app", "start building", or "execute the roadmap".
nextjs-framer-motion-animations
IncludedAdds production-safe Motion for React or Framer Motion animations to Next.js apps, including reveal, hover and tap micro-interactions, whileInView, stagger, AnimatePresence, layout and layoutId transitions, reorder, scroll-linked UI, and lightweight route-content transitions. Use when the user asks to add, refactor, or debug Motion or Framer Motion in App Router or Pages Router codebases, especially around server/client boundaries, reduced motion, LazyMotion, bundle size, hydration, or route transitions. Avoid for GSAP-style timelines, WebGL or 3D scenes, heavy scroll storytelling, or CSS-only effects unless Motion is explicitly requested.