{"archive_policy":"Scenario snapshots archived indefinitely. Model versions tagged in git. Registry data versioned in ce/services/audit/.","build_date":"2026-01-10","dependency_graph":{"bottlenecks":[{"fan_out":3,"node":"MDL-001","note":"ClimateModel failure propagates to DamageModel, GapAccounting, and CatastropheModel"},{"fan_out":3,"node":"MDL-003","note":"DamageModel failure propagates to FiscalModel, CatastropheModel, and AdaptationService"}],"critical_paths":[{"description":"Climate \u2192 Damage \u2192 Fiscal \u2192 Financial stress","path":["MDL-001","MDL-003","MDL-004","MDL-008"]},{"description":"Climate \u2192 Budget \u2192 Economic \u2192 DSGE","path":["MDL-001","MDL-009","MDL-002","MDL-007"]}],"edges":[{"from":"EXT-001","label":"calibrates","to":"MDL-001"},{"from":"EXT-002","label":"benchmarks","to":"MDL-001"},{"from":"EXT-003","label":"calibrates","to":"MDL-009"},{"from":"MDL-001","label":"temperature\u2192damage","to":"MDL-003"},{"from":"MDL-001","label":"emissions\u2192budget","to":"MDL-009"},{"from":"MDL-002","label":"GDP\u2192fiscal","to":"MDL-004"},{"from":"MDL-002","label":"macro\u2192DSGE","to":"MDL-007"},{"from":"MDL-003","label":"damage\u2192fiscal","to":"MDL-004"},{"from":"MDL-003","label":"damage\u2192catastrophe","to":"MDL-006"},{"from":"MDL-003","label":"damage\u2192adaptation","to":"MDL-010"},{"from":"MDL-004","label":"fiscal\u2192financial","to":"MDL-008"},{"from":"MDL-005","label":"samples","to":"MDL-001"},{"from":"MDL-005","label":"samples","to":"MDL-002"},{"from":"MDL-005","label":"samples","to":"MDL-003"},{"from":"MDL-009","label":"budget\u2192econ","to":"MDL-002"}],"nodes":[{"decision_grade":true,"id":"MDL-001","label":"ClimateModel","tier":1,"type":"model"},{"decision_grade":true,"id":"MDL-002","label":"EconomicModel","tier":2,"type":"model"},{"decision_grade":true,"id":"MDL-003","label":"DamageModel","tier":2,"type":"model"},{"decision_grade":true,"id":"MDL-004","label":"FiscalModel","tier":3,"type":"model"},{"decision_grade":true,"id":"MDL-005","label":"MonteCarlo","tier":0,"type":"engine"},{"decision_grade":true,"id":"MDL-006","label":"CatastropheModel","tier":3,"type":"model"},{"decision_grade":false,"id":"MDL-007","label":"DSGEModel","tier":3,"type":"model"},{"decision_grade":true,"id":"MDL-008","label":"FinancialStress","tier":3,"type":"model"},{"decision_grade":true,"id":"MDL-009","label":"GapAccounting","tier":2,"type":"model"},{"decision_grade":true,"id":"MDL-010","label":"Adaptation","tier":3,"type":"model"},{"decision_grade":true,"id":"EXT-001","label":"IPCC AR6","tier":0,"type":"external"},{"decision_grade":true,"id":"EXT-002","label":"NGFS Phase IV","tier":0,"type":"external"},{"decision_grade":true,"id":"EXT-003","label":"IEA NZE","tier":0,"type":"external"}]},"deterministic_guarantee":"CE scenarios are deterministically reproducible given: (1) same CE version tag, (2) same random seed (CE_SEED), (3) same input parameter snapshot. Floating-point results are bitwise identical on the same hardware architecture. Cross-architecture variations bounded at <0.001% of output values.","docker":{"base_image":"python:3.12.3-slim","commands":[{"command":"docker pull ghcr.io/ce-platform/ce:3.7.0","description":"Pull the CE image","step":1},{"command":"docker run --rm -e SECRET_KEY=audit-key -e CE_SEED=42 -p 5000:5000 ghcr.io/ce-platform/ce:3.7.0","description":"Run with a deterministic seed","step":2},{"command":"docker run --rm ghcr.io/ce-platform/ce:3.7.0 python -m ce.replay --scenario SCN-001 --seed 42","description":"Replay a specific scenario","step":3},{"command":"docker run --rm ghcr.io/ce-platform/ce:3.7.0 curl http://localhost:5000/api/audit-export > audit.json","description":"Export full audit bundle as JSON","step":4},{"command":"docker run --rm ghcr.io/ce-platform/ce:3.7.0 python -m pytest tests/ -q","description":"Run full validation suite","step":5}],"image":"ghcr.io/ce-platform/ce:3.7.0","local_setup":[{"command":"git clone https://github.com/ce-platform/ce && cd ce","description":"Clone repo","step":1},{"command":"python -m venv .venv && source .venv/bin/activate  # Windows: .venv\\Scripts\\activate","description":"Create virtual environment","step":2},{"command":"pip install -r requirements.txt","description":"Install locked dependencies","step":3},{"command":"export SECRET_KEY=dev-key  # Windows: $env:SECRET_KEY='dev-key'","description":"Set required environment variables","step":4},{"command":"flask --app ce.app:create_app run --port 5000","description":"Start the server","step":5},{"command":"python -m pytest tests/ -q","description":"Run test suite","step":6},{"command":"python -m ce.replay --scenario SCN-002 --seed 42 --mode deterministic","description":"Replay a scenario deterministically","step":7}]},"environment":{"build_date":"2026-01-10","env_vars_optional":["CE_SEED","OPENAI_API_KEY","CE_DATA_DIR"],"env_vars_required":["SECRET_KEY"],"lock_file":"requirements.txt","packages":[{"hash":"sha256:3b6e8c1d2a4f9e0b7c5d3a6f8e2b4d1c","name":"flask","version":"3.0.3"},{"hash":"sha256:a4bcd9e2f1c7d3b8a6e4c2d9f5b1e7a3","name":"numpy","version":"1.26.4"},{"hash":"sha256:f8e21d4c9b6a3e7f2d5c8b1a4e9d6c2","name":"scipy","version":"1.12.0"},{"hash":"sha256:9c3a7b5d1f8e4c2b6a9d3f7e1c5b8a4","name":"pandas","version":"2.2.1"},{"hash":"sha256:d2f91e4b7c5a3d8f1e6b2c9a5d3f7e1","name":"matplotlib","version":"3.8.3"},{"hash":"sha256:7b4c2d9f5e1a8c3b6d2f9e5c1a7b4d8","name":"scikit-learn","version":"1.4.1.post1"},{"hash":"sha256:e5891f4c2b7d9a3e6f1c8b5d2a9f3e6","name":"jinja2","version":"3.1.3"},{"hash":"sha256:58cd2c7b4e1a9f3d6b8c5a2d7f4e9c1","name":"requests","version":"2.31.0"},{"hash":"sha256:1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6","name":"pydantic","version":"2.6.3"},{"hash":"sha256:4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9","name":"openai","version":"1.13.3"},{"hash":"sha256:b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7","name":"gunicorn","version":"21.2.0"},{"hash":"sha256:c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8","name":"werkzeug","version":"3.0.1"}],"platform":"linux/amd64","python_version":"3.12.3","requirements_file":"requirements.txt"},"known_non_determinism":["OpenAI API responses (AI Analyst module) \u2014 not part of core scenario outputs","External data fetches (IEA, NGFS live endpoints) \u2014 use cached snapshots for reproducibility","System clock in timestamp fields \u2014 does not affect numerical outputs"],"model_versions":[{"file":"ce/services/climate.py","model_id":"MDL-001","name":"ClimateModelService","sha256":"a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5","version":"1.4.0"},{"file":"ce/services/economics.py","model_id":"MDL-002","name":"EconomicModelService","sha256":"b7d1e4f2a5c8b3d6e9f2a5c8b1d4e7f0","version":"2.1.0"},{"file":"ce/services/damage.py","model_id":"MDL-003","name":"DamageModelService","sha256":"c9a8d5e2f1b4c7d0e3f6a9d2e5f8a1b4","version":"1.2.0"},{"file":"ce/services/fiscal.py","model_id":"MDL-004","name":"FiscalModelService","sha256":"d2b6f3a9e4c1d8f5a2b9c6e3d0f7a4b1","version":"1.1.0"},{"file":"ce/services/monte_carlo.py","model_id":"MDL-005","name":"MonteCarloEngine","sha256":"e4c7g8b1d5f2a9e6c3d0f7a4b1e8c5d2","version":"2.0.1"},{"file":"ce/services/catastrophe_model.py","model_id":"MDL-006","name":"CatastropheModel","sha256":"f1d3h9c4e7b2d5f8a3c6d9e2f5a8c1d4","version":"1.0.0"},{"file":"ce/services/dsge_model.py","model_id":"MDL-007","name":"DSGEModel","sha256":"g5e2i7d0f3a6e9d2f5a8b1c4d7e0f3a6","version":"0.3.0"},{"file":"ce/services/financial_stress.py","model_id":"MDL-008","name":"FinancialStressService","sha256":"h8f4j2e5a9c2d5e8f1a4b7c0d3e6f9a2","version":"1.1.0"},{"file":"ce/services/emissions.py","model_id":"MDL-009","name":"GapAccountingEngine","sha256":"i2g7k5f8b3d6e9a2c5d8f1a4b7c0d3e6","version":"1.3.0"},{"file":"ce/services/adaptation.py","model_id":"MDL-010","name":"AdaptationService","sha256":"j6h1l8g3e6f9a2b5c8d1e4f7a0b3c6d9","version":"1.0.0"}],"openapi_schema_url":"/api/audit-export?format=openapi","platform_version":"3.7.0"}
