SYNTHETIC RESEARCH PROTOTYPE

Failure Capsules

Share an incident as a small, schema-checked JSON capsule plus a seeded recipe that regenerates an artificial replay, instead of shipping the original measurements. This page was generated at build time by the same standard-library Python code as the command-line tool (version 0.1.0, schema 1.0).

1. The example capsule

Valid, exit code 0. Every value in it is synthetic. Note what is absent: no incident identifier, no device serial, no samples.

Show examples/example_capsule.json
{
  "schema_version": "1.0",
  "software": {
    "name": "sample-monitor",
    "version": "2.4.1"
  },
  "configuration": {
    "version": "profile-r7"
  },
  "timestamp_policy": {
    "policy": "relative_offset_seconds",
    "value": 0
  },
  "device_channel_group": {
    "device_category": "wearable",
    "channel_group_category": "inertial"
  },
  "event_class": "threshold-transition",
  "coarse_features": {
    "duration_bucket": "1-2s",
    "peak_level_bucket": "high",
    "trend_bucket": "rising"
  },
  "replay": {
    "generator": "synthetic-linear-drift-v1",
    "seed": 417,
    "recipe": {
      "points": 32,
      "baseline": 100.0,
      "noise_stddev": 0.25,
      "drift_start": 20,
      "drift_per_step": 1.0
    }
  },
  "behavior": {
    "expected": "The alert remains clear while the synthetic baseline is stable.",
    "observed": "The alert changes state as the synthetic drift increases."
  },
  "reproducibility_checklist": {
    "software_version_recorded": true,
    "configuration_version_recorded": true,
    "synthetic_recipe_and_seed_recorded": true,
    "expected_and_observed_behavior_written": true,
    "independent_replay_completed": false
  }
}

2. Its replay, regenerated from the recipe

Generator synthetic-linear-drift-v1, seed 417, points=32, baseline=100.0, noise_stddev=0.25, drift_start=20, drift_per_step=1.0. The same recipe and seed produce the same values on CPython 3.x. These numbers are invented by the generator; they are not a recording of any device.

SYNTHETIC replay, 32 pointsFlat synthetic baseline near 100.4 with small noise, then a linear drift starting at point 20, ending at 111.4.drift_start = 20point 0point 31point 0: 100.40791point 1: 99.8113point 2: 99.987953point 3: 99.929558point 4: 99.71914point 5: 100.238632point 6: 100.027112point 7: 100.008028point 8: 99.584359point 9: 100.100623point 10: 100.192604point 11: 100.103669point 12: 100.103232point 13: 100.003375point 14: 99.993674point 15: 100.224647point 16: 100.233417point 17: 99.842272point 18: 100.324066point 19: 100.054257point 20: 99.964421point 21: 100.884031point 22: 101.734373point 23: 102.979471point 24: 103.970244point 25: 104.861793point 26: 105.73547point 27: 107.150684point 28: 108.177859point 29: 108.903522point 30: 109.705877point 31: 111.369991
Show all 32 SYNTHETIC values
SYNTHETIC replay values
PointValue
0100.40791
199.8113
299.987953
399.929558
499.71914
5100.238632
6100.027112
7100.008028
899.584359
9100.100623
10100.192604
11100.103669
12100.103232
13100.003375
1499.993674
15100.224647
16100.233417
1799.842272
18100.324066
19100.054257
2099.964421
21100.884031
22101.734373
23102.979471
24103.970244
25104.861793
26105.73547
27107.150684
28108.177859
29108.903522
30109.705877
31111.369991

3. What the validator refuses

Each card below is the example capsule with one deliberate mistake. The messages are the validator's own output, captured when this page was built.

Original samples smuggled in

A known raw-data key name (samples) anywhere in the capsule is rejected.

Rejected, exit code 1

  • $.replay.samples: forbidden raw-measurement/data key
  • replay.samples is not allowed by schema

An extra identifier field

Unknown fields are rejected, so additions are visible and need a schema change.

Rejected, exit code 1

  • $.incident_id is not allowed by schema

Numbers disguised as a category

Feature values that look like a list of numbers are rejected (a heuristic, not a guarantee).

Rejected, exit code 1

  • coarse_features.peak_level_bucket looks like a list of numbers, not a categorical value

A timestamp more precise than its policy

A rounded-hour policy must carry a timestamp at the start of an hour.

Rejected, exit code 1

  • rounded_hour_utc timestamps must be at the start of an hour

An unbounded replay recipe

Recipe values are bounded so every replay stays small and finite.

Rejected, exit code 1

  • replay.recipe.points must be an integer from 1 through 10000
  • replay.recipe.noise_stddev must not be negative

Limits