What problem does it solve? You need to modify legacy code that has no tests, but refactoring without a safety net risks silently changing behavior. This Skill provides a disciplined method for pinning down what the code actually does today — not what it should do — so you can refactor with confidence and detect any unintended behavioral change. ## Core Features & Use Cases - Characterisation Algorithm: A five-step loop (use the code, write a failing dummy assertion, let the failure reveal actual behavior, record it, repeat) that turns the code itself into the specification. - Naming and Lifecycle Conventions: Enforces characterises test names, .characterisation.test.ts file suffixes, and header comments so these temporary scaffolding tests are never confused with permanent behavior-driven tests. - Async and Non-Determinism Handling: Covers characterising async functions, error paths, event emitters, timestamps, and random values using seams, fake timers, and Vitest snapshots. - Use Case: You must change a bonus-calculation function with zero tests and no documentation. Apply the algorithm to pin down its current outputs across tiers, boundaries, and edge cases, mark suspicious behavior explicitly, then refactor safely and replace the scaffolding with proper tests. ## Quick Start Ask the AI to write characterisation tests for the untested legacy function you are about to modify, documenting its actual current behavior before any refactoring.