Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate diverse synthetic test inputs via dimension-based tuple generation. Defines variation dimensions, enumerates combinations, filters for relevance, and produces labeled test cases. For LLM eval pipelines, training data augmentation, and stress testing. Triggers on: "synthetic data", "generate test data", "test inputs", "data generation", "augment data"
.claude/skills/miosa-osa-synthetic-data/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 883% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 41% | 0% |
> Generate diverse synthetic test inputs through dimension-based combinatorics.
Generate synthetic test inputs by defining variation dimensions (topic, difficulty, format, length, persona, edge case type, etc.), computing the combinatorial product, filtering for meaningful combinations, and producing labeled test cases. Ensures eval datasets cover the full capability surface rather than clustering around easy cases. Supports seeded generation for reproducibility.
bash# Generate from dimension spec /synthetic-data --dimensions dimensions.yaml --count 200 # Quick generation with inline dimensions /synthetic-data --dim "topic:math,science,history" --dim "difficulty:easy,medium,hard" --count 50 # Generate to fill gaps identified by eval-audit /synthetic-data --gaps eval-audit-report.md --count 100 # Generate with constraints /synthetic-data --dimensions dims.yaml --count 200 --constraint "not (topic=math and difficulty=easy)" # Append to existing dataset /synthetic-data --dimensions dims.yaml --count 50 --append evals/dataset.jsonl # Reproducible generation /synthetic-data --dimensions dims.yaml --count 200 --seed 42
| Flag | Type | Default | Description | |------|------|---------|-------------| | --dimensions | string | — | Path to YAML dimension specification file | | --dim | string] | — | Inline dimension definition (repeatable): "name:val1,val2,val3" | | --count | int | 100 | Number of test cases to generate | | --gaps | string | — | Path to eval-audit report to fill identified gaps | | --constraint | string | — | Boolean expression to exclude combinations | | --append | string | — | Append to existing dataset file | | --seed | int | random | Random seed for reproducible generation | | --output | string | synthetic-data.jsonl | Output file path | | --format | enum | jsonl | Output format: jsonl, yaml, csv, json | | --with-labels | flag | false | Generate expected output labels alongside inputs | | --validate | flag | false | Run deduplication and quality checks on output |
topic: [math, science, coding], difficulty: [easy, medium, hard], style: [formal, casual, terse].--append is set.--count, sample uniformly across dimensions to maintain diversity. Use stratified sampling to avoid dimension collapse.--with-labels is set, generate expected outputs for each input. Mark confidence level on each label.--validate is set, check for: near-duplicate inputs, dimension coverage uniformity, label consistency, and format correctness.yaml# dimensions.yaml dimensions: topic: values: [math, science, history, coding, creative-writing] weight: 1.0 difficulty: values: [easy, medium, hard, adversarial] weight: 1.2 # slightly oversample harder cases format: values: [question, instruction, conversation, document] length: values: [short, medium, long] edge_case: values: [none, ambiguous-input, multilingual, typos, contradictory] weight: 0.8
/synthetic-data --dimensions dimensions.yaml --count 50 --seed 42 --with-labels
## Synthetic Data Generation
- Dimension space: 5 x 4 x 4 x 3 x 5 = 1,200 possible tuples
- Requested: 50 samples
- Sampling: stratified across all dimensions
- Seed: 42
### Coverage Report
| Dimension | Values | Min samples | Max samples | Uniformity |
|-----------|--------|-------------|-------------|------------|
| topic | 5 | 9 | 11 | 0.96 |
| difficulty | 4 | 11 | 14 | 0.94 |
| format | 4 | 11 | 14 | 0.95 |
| length | 3 | 15 | 18 | 0.97 |
| edge_case | 5 | 8 | 12 | 0.91 |
### Sample outputs
{"id": "syn-001", "dims": {"topic": "math", "difficulty": "hard", "format": "question", "length": "short", "edge_case": "ambiguous-input"}, "input": "What's the value of x if x^2 = -1?", "expected": "No real solution; x = ±i in complex numbers"}jsonl{"id": "syn-001", "dims": {...}, "input": "...", "expected": "...", "confidence": 0.95} {"id": "syn-002", "dims": {...}, "input": "...", "expected": "...", "confidence": 0.90}
--dim flags)/eval-audit — Upstream skill that identifies coverage gaps/judge-prompt — Downstream if labels need validation| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-09 | fail→pass | 12,277 | 7,527 | -39% | 1 | 1 | 0% | 2,146 | 2,833 | +32% | 0 | 0 | — |
case-18 | pass→pass | 8,942 | 1,855 | -79% | 1 | 1 | 0% | 1,402 | 1,708 | +22% | 0 | 0 | — |
case-01 | fail→pass | 18,672 | 21,964 | +18% | 1 | 1 | 0% | 4,091 | 6,138 | +50% | 0 | 0 | — |
case-02 | fail→pass | 6,123 | 11,274 | +84% | 1 | 1 | 0% | 345 | 3,393 | +883% | 0 | 0 | — |
case-03 | fail→pass | 10,633 | 13,887 | +31% | 1 | 1 | 0% | 2,069 | 4,120 | +99% | 0 | 0 | — |
case-08 | pass→pass | 15,694 | 1,763 | -89% | 1 | 1 | 0% | 2,383 | 1,643 | -31% | 0 | 0 | — |
case-04 | fail→pass | 11,377 | 10,544 | -7% | 1 | 1 | 0% | 2,407 | 3,404 | +41% | 0 | 0 | — |
case-05 | fail→pass | 10,027 | 7,374 | -26% | 1 | 1 | 0% | 2,125 | 2,795 | +32% | 0 | 0 | — |
case-06 | fail→pass | 14,905 | 7,744 | -48% | 1 | 1 | 0% | 2,439 | 2,825 | +16% | 0 | 0 | — |
case-07 | fail→pass | 13,472 | 2,323 | -83% | 1 | 1 | 0% | 2,281 | 1,823 | -20% | 0 | 0 | — |
case-10 | pass→pass | 2,877 | 2,127 | -26% | 1 | 1 | 0% | 599 | 1,777 | +197% | 0 | 0 | — |
case-11 | fail→pass | 2,691 | 2,828 | +5% | 1 | 1 | 0% | 546 | 1,997 | +266% | 0 | 0 | — |
case-12 | pass→pass | 10,694 | 11,333 | +6% | 1 | 1 | 0% | 1,623 | 3,479 | +114% | 0 | 0 | — |
case-13 | fail→pass | 10,620 | 3,209 | -70% | 1 | 1 | 0% | 1,879 | 2,004 | +7% | 0 | 0 | — |
case-14 | fail→pass | 20,499 | 2,882 | -86% | 1 | 1 | 0% | 1,578 | 1,782 | +13% | 0 | 0 | — |
case-15 | pass→pass | 15,362 | 10,954 | -29% | 1 | 1 | 0% | 2,583 | 3,171 | +23% | 0 | 0 | — |
case-16 | pass→fail | 14,024 | 4,989 | -64% | 1 | 1 | 0% | 2,223 | 2,389 | +7% | 0 | 0 | — |
case-17 | fail→pass | 8,551 | 1,726 | -80% | 1 | 1 | 0% | 1,194 | 1,655 | +39% | 0 | 0 | — |
case-19 | fail→pass | 9,735 | 4,379 | -55% | 1 | 1 | 0% | 1,620 | 2,128 | +31% | 0 | 0 | — |
case-20 | pass→pass | 13,659 | 1,294 | -91% | 1 | 1 | 0% | 2,130 | 1,578 | -26% | 0 | 0 | — |
case-21 | fail→fail | 5,536 | 18,147 | +228% | 1 | 1 | 0% | 246 | 4,631 | +1783% | 0 | 0 | — |
case-22 | pass→pass | 14,057 | 14,107 | +0% | 1 | 1 | 0% | 2,364 | 3,938 | +67% | 0 | 0 | — |
case-23 | pass→pass | 15,181 | 10,577 | -30% | 1 | 1 | 0% | 2,933 | 3,343 | +14% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 21 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +52 percentage points is the difference between those two pass rates over the 21 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.