.claude/skills/property-based-testing/SKILL.md
fast-check patterns for JS/TS — 6 canonical property categories with worked examples targeting agent-studio utilities (path normalization, safe-json, glob-to-regex, routing logic)
npx skillsauth add oimiragieo/agent-studio property-based-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
fast-check patterns for JavaScript/TypeScript that find edge cases unit tests miss. Includes 6 canonical property categories with worked examples targeting agent-studio's own utilities.
import fc from 'fast-check';
// If you serialize then deserialize, you get back the original
fc.assert(
fc.property(fc.anything(), value => {
expect(deserialize(serialize(value))).toEqual(value);
})
);
// Applying a function twice gives same result as once
fc.assert(
fc.property(fc.string(), str => {
expect(normalize(normalize(str))).toEqual(normalize(str));
})
);
// Order of inputs shouldn't matter
fc.assert(
fc.property(fc.array(fc.integer()), arr => {
expect(sum(arr)).toEqual(sum([...arr].reverse()));
})
);
// Output always has certain structural properties
fc.assert(
fc.property(fc.string(), input => {
const result = parseArgs(input);
expect(result).toHaveProperty('args');
expect(Array.isArray(result.args)).toBe(true);
})
);
// Compare fast implementation against slow-but-correct reference
fc.assert(
fc.property(fc.array(fc.integer()), arr => {
expect(fastSort(arr)).toEqual(referenceSort(arr));
})
);
// If input changes in a known way, output changes in a predictable way
fc.assert(
fc.property(fc.array(fc.integer()), arr => {
const sorted = sort(arr);
const sortedWithExtra = sort([...arr, Number.MAX_SAFE_INTEGER]);
expect(sortedWithExtra[sortedWithExtra.length - 1]).toBe(Number.MAX_SAFE_INTEGER);
})
);
import fc from 'fast-check';
const { normalizePath } = require('.claude/lib/utils/path-constants.cjs');
// Property: normalized path never contains backslashes
fc.assert(
fc.property(fc.string(), path => {
expect(normalizePath(path)).not.toMatch(/\\/);
})
);
// Property: idempotent
fc.assert(
fc.property(fc.string(), path => {
expect(normalizePath(normalizePath(path))).toEqual(normalizePath(path));
})
);
const { safeParseJSON } = require('.claude/lib/utils/safe-json.cjs');
// Property: never throws, always returns { success, data }
fc.assert(
fc.property(fc.string(), input => {
const result = safeParseJSON(input, null);
expect(result).toHaveProperty('success');
expect(typeof result.success).toBe('boolean');
})
);
// Property: prototype pollution not possible
fc.assert(
fc.property(fc.string(), input => {
const before = Object.prototype.toString;
safeParseJSON(input, null);
expect(Object.prototype.toString).toBe(before);
})
);
// Property: patterns with **/dir/** match root-level dir
fc.assert(
fc.property(fc.constantFrom('foo', 'bar', 'baz'), dir => {
const pattern = `**/${dir}/**`;
const regex = globToRegex(pattern);
expect(`${dir}/file.js`).toMatch(regex); // root-level match
expect(`a/${dir}/file.js`).toMatch(regex); // nested match
})
);
// Property: routing is deterministic (same input -> same agent)
fc.assert(
fc.property(fc.string(), intent => {
expect(route(intent)).toEqual(route(intent));
})
);
// Property: routing never returns null/undefined
fc.assert(
fc.property(fc.string(), intent => {
expect(route(intent)).toBeTruthy();
})
);
pnpm add -D fast-check
# Run all property tests
node --test tests/**/*.property.test.cjs
# Run with verbose output (shows counterexamples on failure)
FAST_CHECK_VERBOSE=true node --test tests/**/*.property.test.cjs
fast-check automatically shrinks failing inputs to the minimal counterexample. Example:
"C:\\Users\\foo\\deep\\nested\\path""a\\b" (minimal backslash case)This makes debugging far faster than traditional fuzzing.
Before starting:
Read .claude/context/memory/learnings.md
After completing:
.claude/context/memory/learnings.md.claude/context/memory/issues.md.claude/context/memory/decisions.mdASSUME INTERRUPTION: If it's not in memory, it didn't happen.
tools
Comprehensive biosignal processing toolkit for analyzing physiological data including ECG, EEG, EDA, RSP, PPG, EMG, and EOG signals. Use this skill when processing cardiovascular signals, brain activity, electrodermal responses, respiratory patterns, muscle activity, or eye movements. Applicable for heart rate variability analysis, event-related potentials, complexity measures, autonomic nervous system assessment, psychophysiology research, and multi-modal physiological signal integration.
tools
Comprehensive toolkit for creating, analyzing, and visualizing complex networks and graphs in Python. Use when working with network/graph data structures, analyzing relationships between entities, computing graph algorithms (shortest paths, centrality, clustering), detecting communities, generating synthetic networks, or visualizing network topologies. Applicable to social networks, biological networks, transportation systems, citation networks, and any domain involving pairwise relationships.
data-ai
Molecular featurization for ML (100+ featurizers). ECFP, MACCS, descriptors, pretrained models (ChemBERTa), convert SMILES to features, for QSAR and molecular ML.
development
Run Python code in the cloud with serverless containers, GPUs, and autoscaling. Use when deploying ML models, running batch processing jobs, scheduling compute-intensive tasks, or serving APIs that require GPU acceleration or dynamic scaling.