# kausalflow/homeostat > Homeostat: process-industry time series with full ground truth, from a declarative scenario Version 1, digest sha256:555280ad1dd39cabd2d022db7c3737b4961d859ef36a5ffea4939df3e183f33b. 56 obligations (46 decided, 8 default, 2 open) · 6 assumptions (3 monitored) · 242/242 checks trace to an obligation. ## Build this pack For coding agents whose user shared https://symbola.sh/packs/kausalflow/homeostat/ and wants it built. Run these steps yourself; ask the user only for the language if they have not named one. 1. Install the Symbola CLI (Python 3.11+): `uv tool install symbola` (or `pipx install symbola`). Not `pip install symbolon`: that PyPI name is another project. 2. Download the pack: `symbola pull kausalflow/homeostat --dest spec`. 3. Read `spec/AGENTS.md` and follow it. Build only from `spec/`: don't look for the original product's source, the registry repository (it holds holdout tests) or other builds. Packs released before the rename say `symbolon `: run `symbola ` instead. 4. Build each component in its own folder and run its checks as you go, fixing what fails: symbola impl-init impl/cli-contract --contract spec/components/cli-contract/versions/1 symbola test spec/components/cli-contract/versions/1 impl/cli-contract In Python, define `run(input)` in `impl.py`: it takes and returns a dict, and raises `ValueError` for input the contract rejects. Pin third-party packages with `==` in `requirements.lock`. In another language, set `language = "command"` and `command = [...]` in `symbolon-impl.toml`; the program reads one JSON input per line on stdin and writes `{"output": ...}` per line. 5. When every component passes, run `symbola keygen` once, then for each component `symbola attest spec/components/cli-contract/versions/1 impl/cli-contract -o attestations/cli-contract.json`. On macOS, attest needs Docker running and accepts Python, Node or a static Linux binary (for Go, `GOOS=linux`); `symbola test` runs the same checks without it. You are done when attest reports PASSED for every component. Write open questions and the readings you chose in `NOTES.md`. Every command is described at https://kausalflow.github.io/symbola/cli/. Components: - `cli-contract`: `spec/components/cli-contract/versions/1` - `run-series`: `spec/components/run-series/versions/1` - `scenario-issues`: `spec/components/scenario-issues/versions/1` - `scenario-truth`: `spec/components/scenario-truth/versions/1` ## Read it online Start with https://symbola.sh/packs/kausalflow/homeostat/pack.md (brief, assumptions, obligations, and links to one file per component under https://files.symbola.sh/packs/kausalflow/homeostat/parts/), or download https://symbola.sh/packs/kausalflow/homeostat/latest.tar.gz. ## Files - [AGENTS.md](https://files.symbola.sh/packs/kausalflow/homeostat/files/AGENTS.md) - [BRIEF.md](https://files.symbola.sh/packs/kausalflow/homeostat/files/BRIEF.md) - [assumptions/process-library-is-installed.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/assumptions/process-library-is-installed.toml) - [assumptions/same-numpy-version.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/assumptions/same-numpy-version.toml) - [assumptions/scenario-sizes-are-sane.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/assumptions/scenario-sizes-are-sane.toml) - [assumptions/time-is-simulated.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/assumptions/time-is-simulated.toml) - [assumptions/trusted-plugins-and-snapshots.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/assumptions/trusted-plugins-and-snapshots.toml) - [assumptions/yaml-reads-the-scenario-as-written.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/assumptions/yaml-reads-the-scenario-as-written.toml) - [components/cli-contract/versions/1/examples.jsonl](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/examples.jsonl) - [components/cli-contract/versions/1/mutants/_oracle.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/mutants/_oracle.py) - [components/cli-contract/versions/1/mutants/diagnose_failure_is_one.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/mutants/diagnose_failure_is_one.py) - [components/cli-contract/versions/1/mutants/json_failures_on_stderr.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/mutants/json_failures_on_stderr.py) - [components/cli-contract/versions/1/mutants/lanes_share_files.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/mutants/lanes_share_files.py) - [components/cli-contract/versions/1/mutants/summary_is_always_present.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/mutants/summary_is_always_present.py) - [components/cli-contract/versions/1/mutants/text_failures_on_stdout.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/mutants/text_failures_on_stdout.py) - [components/cli-contract/versions/1/mutants/usage_error_is_one.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/mutants/usage_error_is_one.py) - [components/cli-contract/versions/1/mutants/warnings_fail_validate.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/mutants/warnings_fail_validate.py) - [components/cli-contract/versions/1/properties.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/properties.py) - [components/cli-contract/versions/1/schema.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/schema.py) - [components/cli-contract/versions/1/schema/input.json](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/schema/input.json) - [components/cli-contract/versions/1/schema/output.json](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/schema/output.json) - [components/cli-contract/versions/1/symbolon.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/cli-contract/versions/1/symbolon.toml) - [components/run-series/versions/1/examples.jsonl](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/examples.jsonl) - [components/run-series/versions/1/mutants/_oracle.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/mutants/_oracle.py) - [components/run-series/versions/1/mutants/euler_first_order.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/mutants/euler_first_order.py) - [components/run-series/versions/1/mutants/noise_key_ignored.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/mutants/noise_key_ignored.py) - [components/run-series/versions/1/mutants/ou_std_is_a_diffusion_constant.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/mutants/ou_std_is_a_diffusion_constant.py) - [components/run-series/versions/1/mutants/streams_keyed_by_position.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/mutants/streams_keyed_by_position.py) - [components/run-series/versions/1/properties.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/properties.py) - [components/run-series/versions/1/schema.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/schema.py) - [components/run-series/versions/1/schema/input.json](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/schema/input.json) - [components/run-series/versions/1/schema/output.json](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/schema/output.json) - [components/run-series/versions/1/symbolon.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/run-series/versions/1/symbolon.toml) - [components/scenario-issues/versions/1/examples.jsonl](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/examples.jsonl) - [components/scenario-issues/versions/1/mutants/_oracle.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/mutants/_oracle.py) - [components/scenario-issues/versions/1/mutants/fix_missing.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/mutants/fix_missing.py) - [components/scenario-issues/versions/1/mutants/keeps_going_after_a_stage.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/mutants/keeps_going_after_a_stage.py) - [components/scenario-issues/versions/1/mutants/loop_starts_at_largest_id.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/mutants/loop_starts_at_largest_id.py) - [components/scenario-issues/versions/1/mutants/no_suggestions.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/mutants/no_suggestions.py) - [components/scenario-issues/versions/1/mutants/schema_errors_have_no_location_detail.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/mutants/schema_errors_have_no_location_detail.py) - [components/scenario-issues/versions/1/mutants/unused_regime_ignores_transitions.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/mutants/unused_regime_ignores_transitions.py) - [components/scenario-issues/versions/1/mutants/warn_only_after_end.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/mutants/warn_only_after_end.py) - [components/scenario-issues/versions/1/properties.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/properties.py) - [components/scenario-issues/versions/1/schema.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/schema.py) - [components/scenario-issues/versions/1/schema/input.json](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/schema/input.json) - [components/scenario-issues/versions/1/schema/output.json](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/schema/output.json) - [components/scenario-issues/versions/1/symbolon.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-issues/versions/1/symbolon.toml) - [components/scenario-truth/versions/1/examples.jsonl](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/examples.jsonl) - [components/scenario-truth/versions/1/mutants/_oracle.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/mutants/_oracle.py) - [components/scenario-truth/versions/1/mutants/before_ignores_ramps.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/mutants/before_ignores_ramps.py) - [components/scenario-truth/versions/1/mutants/every_edge_is_instantaneous.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/mutants/every_edge_is_instantaneous.py) - [components/scenario-truth/versions/1/mutants/manual_output_is_observed.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/mutants/manual_output_is_observed.py) - [components/scenario-truth/versions/1/mutants/promotes_every_parameter.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/mutants/promotes_every_parameter.py) - [components/scenario-truth/versions/1/mutants/rounds_event_times.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/mutants/rounds_event_times.py) - [components/scenario-truth/versions/1/mutants/stages_are_measured.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/mutants/stages_are_measured.py) - [components/scenario-truth/versions/1/mutants/timeline_not_clipped.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/mutants/timeline_not_clipped.py) - [components/scenario-truth/versions/1/mutants/transitions_before_interventions.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/mutants/transitions_before_interventions.py) - [components/scenario-truth/versions/1/properties.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/properties.py) - [components/scenario-truth/versions/1/schema.py](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/schema.py) - [components/scenario-truth/versions/1/schema/input.json](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/schema/input.json) - [components/scenario-truth/versions/1/schema/output.json](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/schema/output.json) - [components/scenario-truth/versions/1/symbolon.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/components/scenario-truth/versions/1/symbolon.toml) - [obligations.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/obligations.toml) - [symbolon-pack.toml](https://files.symbola.sh/packs/kausalflow/homeostat/files/symbolon-pack.toml)