validibot-shared 0.7.4__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/PKG-INFO +2 -2
  2. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/pyproject.toml +2 -2
  3. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/tests/test_evidence_manifest.py +3 -3
  4. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/energyplus/models.py +14 -6
  5. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/evidence/manifest.py +9 -10
  6. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/.gitignore +0 -0
  7. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/LICENSE +0 -0
  8. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/NOTICE +0 -0
  9. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/README.md +0 -0
  10. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/tests/__init__.py +0 -0
  11. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/tests/test_energyplus_envelopes.py +0 -0
  12. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/tests/test_energyplus_models.py +0 -0
  13. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/tests/test_fmu_envelopes.py +0 -0
  14. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/tests/test_fmu_models.py +0 -0
  15. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/tests/test_package_init.py +0 -0
  16. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/tests/test_validations_envelopes.py +0 -0
  17. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/__init__.py +0 -0
  18. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/energyplus/__init__.py +0 -0
  19. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/energyplus/envelopes.py +0 -0
  20. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/evidence/__init__.py +0 -0
  21. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/fmu/__init__.py +0 -0
  22. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/fmu/envelopes.py +0 -0
  23. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/fmu/models.py +0 -0
  24. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/py.typed +0 -0
  25. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/validations/__init__.py +0 -0
  26. {validibot_shared-0.7.4 → validibot_shared-0.8.0}/validibot_shared/validations/envelopes.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: validibot-shared
3
- Version: 0.7.4
3
+ Version: 0.8.0
4
4
  Summary: Shared library for data interchange between Validibot and validator containers
5
5
  Project-URL: Homepage, https://validibot.com
6
6
  Project-URL: Documentation, https://docs.validibot.com
@@ -27,7 +27,7 @@ Requires-Python: >=3.10
27
27
  Requires-Dist: pydantic<3.0,>=2.13
28
28
  Provides-Extra: dev
29
29
  Requires-Dist: pytest==9.0.3; extra == 'dev'
30
- Requires-Dist: ruff==0.15.12; extra == 'dev'
30
+ Requires-Dist: ruff==0.15.14; extra == 'dev'
31
31
  Description-Content-Type: text/markdown
32
32
 
33
33
  <div align="center">
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "validibot-shared"
7
- version = "0.7.4"
7
+ version = "0.8.0"
8
8
  description = "Shared library for data interchange between Validibot and validator containers"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -35,7 +35,7 @@ classifiers = [
35
35
  dependencies = ["pydantic>=2.13,<3.0"]
36
36
 
37
37
  [project.optional-dependencies]
38
- dev = ["pytest==9.0.3", "ruff==0.15.12"]
38
+ dev = ["pytest==9.0.3", "ruff==0.15.14"]
39
39
 
40
40
  [project.urls]
41
41
  Homepage = "https://validibot.com"
@@ -131,13 +131,13 @@ class TestOptionalFields:
131
131
  manifest = EvidenceManifest(**_minimal_manifest_kwargs())
132
132
  assert manifest.steps == []
133
133
 
134
- # ── Trust ADR P2 #2 (2026-05-03 review): manifest source field ──
134
+ # ── Manifest source field ───────────────────────────────────
135
135
  #
136
136
  # ``source`` documents which auth channel produced the run. It's
137
137
  # additive and optional — older producers set None, newer
138
138
  # producers populate it from the authenticated route (NOT from a
139
- # client header, see P1 #4). The schema-version contract still
140
- # reads ``v1`` because the change is purely additive.
139
+ # client header). The schema-version contract still reads ``v1``
140
+ # because the change is purely additive.
141
141
  def test_source_defaults_to_none(self):
142
142
  """Older producers and producers that don't track source leave it None."""
143
143
  manifest = EvidenceManifest(**_minimal_manifest_kwargs())
@@ -116,14 +116,22 @@ class EnergyPlusSimulationMetrics(BaseModel):
116
116
  peak_electric_demand_w: NonNegFloat | None = None
117
117
 
118
118
  # ==========================================================================
119
- # Building Characteristics (from IDF/SQL)
119
+ # Building Characteristics (simulation-derived)
120
+ #
121
+ # Per ADR-2026-05-22 (provenance rule): only simulation-derived metrics
122
+ # belong here. IDF-text-derived facts (idf_version, zone_count,
123
+ # north_axis_deg) are step inputs populated by the validator's parser
124
+ # and live in the i.* CEL namespace, not in this output envelope.
120
125
  # ==========================================================================
121
126
 
122
- # Total conditioned floor area
123
- floor_area_m2: NonNegFloat | None = None
124
-
125
- # Number of thermal zones
126
- zone_count: NonNegInt | None = None
127
+ # Total conditioned floor area as computed by EnergyPlus from the
128
+ # geometry the area EnergyPlus actually simulates conditioning
129
+ # for, which may differ from the design floor area input the
130
+ # author supplied. The name says "simulated" + "conditioned" to
131
+ # distinguish it from inputs the IDF declares; per ADR-2026-05-22
132
+ # the rename from the legacy ``floor_area_m2`` lands with this
133
+ # shared-package release.
134
+ simulated_conditioned_area_m2: NonNegFloat | None = None
127
135
 
128
136
  # ==========================================================================
129
137
  # Window / Envelope (from EnergyPlus output variables)
@@ -251,16 +251,15 @@ class EvidenceManifest(BaseModel):
251
251
  default_factory=ManifestPayloadDigests,
252
252
  description="Session A: empty. Session B: input + output hashes.",
253
253
  )
254
- # Trust ADR-2026-04-27 + 2026-05-03 review (P2 #2): the auth
255
- # channel that initiated the run. Pinning it in the manifest
256
- # lets verifiers answer "what surface produced this run?" without
257
- # consulting the producer database (the run row may be purged
258
- # under DO_NOT_STORE retention). Optional because (a) older
259
- # producers persist runs without populating ``source``, and
260
- # (b) the field is additive — a missing value preserves the v1
261
- # schema-version contract. Producers MUST derive this from the
262
- # authenticated route, NEVER from a caller-controlled header
263
- # (see Trust ADR P1 #4).
254
+ # The auth channel that initiated the run. Pinning it in the
255
+ # manifest lets verifiers answer "what surface produced this
256
+ # run?" without consulting the producer database (the run row
257
+ # may be purged under DO_NOT_STORE retention). Optional because
258
+ # (a) older producers persist runs without populating
259
+ # ``source``, and (b) the field is additive — a missing value
260
+ # preserves the v1 schema-version contract. Producers MUST
261
+ # derive this from the authenticated route, NEVER from a
262
+ # caller-controlled header.
264
263
  source: str | None = Field(
265
264
  default=None,
266
265
  description=(