# OPS-01 observability decision fixture

This fixture begins with one synthetic catalogue quote path and one stable
response contract. It compares a noisy uncorrelated bundle with a bounded
decision bundle, then retains exact correlation, cardinality, alert lifecycle,
and telemetry-pipeline failure controls.

The first checkpoint pins Node 24.12.0, Prometheus 3.12.0, and OpenTelemetry
Collector 0.155.0 by image digest. Run it with:

```sh
./run.sh
```

`results/profile.json` is checkpoint evidence. Drafting remains closed until
the source, disposition, mutation, provenance, exporter, real alert-state, and
clean-export gates in the OPS-01 evidence brief also pass.

The runner also retains the real `promtool` rule-test result and successful
OpenTelemetry Collector configuration validation. The profile's alert states
are checked again through a real Prometheus server: an isolated condition
reaches pending and clears without paging, while a sustained condition reaches
firing and resolves after the same user-visible symptom clears. Its 250 ms
evaluation interval and one-second hold exist only to exercise the local state
machine quickly; they are not production alert recommendations.

The runner fetches and hashes thirteen primary sources, audits the locked npm
tree, and retains eight operator-question rows plus explicit retain, aggregate,
sample, demote, redact, and discard decisions. These remain checkpoint
evidence until the mutation, provenance, exporter-failure, and clean-export
gates pass.

Twenty isolated mutations now protect response identity, symptom paging,
bounded labels, cardinality visibility, redaction, cross-signal correlation,
span usefulness, telemetry-pipeline distinctions, recovery, alternatives, and
runbook decisions. The runner retains each non-empty diff, validates the full
bundle semantically, and records a source manifest. Exporter behavior and clean
committed-tree reproduction still keep drafting closed.

The exporter control submits OTLP/HTTP JSON spans to the real Collector, which
accepts them while its declared downstream endpoint remains unreachable. The
fixture retains accepted, send-failed, and queue-backpressure counters. A
separate invalid configuration must fail Collector validation. These controls
keep application-request success, collector acceptance, downstream export,
backpressure, and configuration validity distinct.

The bounded aggregate now contains an exact request counter and duration
histogram over all nine scenarios. A two-span successful trace controls the
three-span failed trace, and the structured event's span identifier must
resolve to the failed dependency span rather than merely sharing a trace.

After committing the fixture, reproduce it without untracked workspace input:

```sh
./bin/run-clean-export.sh <commit>
```
