From af72e64b610a0eeb46980c63078646dcff331e11 Mon Sep 17 00:00:00 2001 From: "idfkit-bot[bot]" <284417662+idfkit-bot[bot]@users.noreply.github.com> Date: Wed, 23 Sep 2026 21:54:03 +0000 Subject: [PATCH 1/4] chore: build the site against idfkit 1.0.0-rc.6 --- governance | 1 + pyproject.toml | 4 ++-- uv.lock | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) create mode 160000 governance diff --git a/governance b/governance new file mode 160000 index 00000000..a3dddc36 --- /dev/null +++ b/governance @@ -0,0 +1 @@ +Subproject commit a3dddc36983fdb034b0b3fc0e4b5902a06c12e1b diff --git a/pyproject.toml b/pyproject.toml index 615987c2..1983affe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ version = "0.0.0" description = "The unified idfkit documentation site" requires-python = ">=3.12" dependencies = [ - "idfkit==1.0.0-rc.4", + "idfkit==1.0.0-rc.6", ] [tool.uv] @@ -88,7 +88,7 @@ level = "docs-2026.5" # four weather-browser files out of the same one. Pinning it is what keeps the reference and the # assets on a page describing the same version of the library. [tool.idfkit.library] -level = "1.0.0-rc.4" +level = "1.0.0-rc.6" [tool.pyright] pythonVersion = "3.12" diff --git a/uv.lock b/uv.lock index 2b911436..f8f6146f 100644 --- a/uv.lock +++ b/uv.lock @@ -610,11 +610,11 @@ wheels = [ [[package]] name = "idfkit" -version = "1.0.0rc4" +version = "1.0.0rc6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/86/66/2659c1064e2c51febb84cbac9b0b597906deea0482dda32fccd0f80d670d/idfkit-1.0.0rc4.tar.gz", hash = "sha256:b3c01f579a4603731fda638c71aef87c95c905c758d3f5ce59a44f96fe06d6a4", size = 14875799, upload-time = "2026-09-08T12:17:31.834Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/8f/9dcf9a6913b80ba4b86b27ef8b2e9d0bc862f519c22161e5e4cb11408d88/idfkit-1.0.0rc6.tar.gz", hash = "sha256:d3f0f8fa790280864030ed7c664d5a3fdcae1895925a894837c56c1aad38be4d", size = 14907866, upload-time = "2026-09-23T21:53:23.31Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/16/c1d91b84bbc1a53ec629489cca7c272421fcd763260f37198c090347cbfc/idfkit-1.0.0rc4-py3-none-any.whl", hash = "sha256:b71a7cc3ae258026c053c7ff62927971e5d8eb5812c00f7b99be0290ce545e24", size = 14156113, upload-time = "2026-09-08T12:17:34.181Z" }, + { url = "https://files.pythonhosted.org/packages/30/3f/d60f4465f3000029e844d75f005cfbfc133a48313fd552bc2fb9a3f98935/idfkit-1.0.0rc6-py3-none-any.whl", hash = "sha256:b64fd3dd0014f5d0001a0f9173948b3616d41e28f587794ce747a47d2db6ae82", size = 14168160, upload-time = "2026-09-23T21:53:20.698Z" }, ] [[package]] @@ -642,7 +642,7 @@ dev = [ ] [package.metadata] -requires-dist = [{ name = "idfkit", specifier = "==1.0.0rc4" }] +requires-dist = [{ name = "idfkit", specifier = "==1.0.0rc6" }] [package.metadata.requires-dev] dev = [ From ca770ea921082506dd4457a0fa9eb78e73c223ca Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Thu, 24 Sep 2026 22:59:20 -0400 Subject: [PATCH 2/4] Drop the stray governance gitlink the bump workflow swept in The bump checks out idfkit-conformance into governance/ to read the consumer register, then stages everything, so the checkout lands as a gitlink at a3dddc36 with no .gitmodules entry beside it. Nothing on main has ever carried it and nothing reads it: the governance tag is pinned in pyproject.toml and fetched by scripts/_governance_source.py at build time. Merged as it stood, main would gain a submodule reference that resolves for nobody, and every later bump would carry it forward. Both open bump pull requests, #21 and #23, have it, which places the fault in the workflow rather than in either run. --- governance | 1 - 1 file changed, 1 deletion(-) delete mode 160000 governance diff --git a/governance b/governance deleted file mode 160000 index a3dddc36..00000000 --- a/governance +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a3dddc36983fdb034b0b3fc0e4b5902a06c12e1b From 6dd66401a6430ded116ab7d04e9862ca4a9e4498 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Thu, 24 Sep 2026 23:07:20 -0400 Subject: [PATCH 3/4] Give idfkit.scene a reference page, which rc.6 needs and never had The strict build fails on 1.0.0-rc.6 with three warnings, all the same one: idfkit/geometry.py:628 documents translate_to_world by pointing at idfkit.scene.get_scene, and mkdocstrings cannot resolve a target on a module the site renders no page for. idfkit.scene ships publicly. get_scene, Scene, ResolvedSurface, SceneBounds and the rest are exported from the package root, and every other public module has a page under api/. This one was missed when geometry extraction landed, so the corrected resolution shipped to PyPI with its reference unreachable. Principle V requires the reference to be generated rather than written; here it was not generated at all. The page is the ordinary shape: a short description of what the module does and the mkdocstrings directive. The one thing it says beyond that is where the resolution came from, because a reader arriving at get_scene from translate_to_world is owed the reason the two now agree. Verified: the three autorefs warnings are gone. The local build still reports cairosvg failures, which are this machine having no cairo installed and not something this change touches; CI reported exactly the three warnings above and nothing else. --- docs/api/scene.md | 14 ++++++++++++++ mkdocs.yml | 1 + 2 files changed, 15 insertions(+) create mode 100644 docs/api/scene.md diff --git a/docs/api/scene.md b/docs/api/scene.md new file mode 100644 index 00000000..8003c5ba --- /dev/null +++ b/docs/api/scene.md @@ -0,0 +1,14 @@ +# Scene + +Resolving a model's geometry into one frame, without changing the model. + +`get_scene(doc)` returns every surface it could place, in world coordinates with +the building rotation applied, alongside what it could not place and what it did +not attempt. It reads; it does not author, validate or mutate. Writing the +document before and after yields the same bytes. + +The resolution it applies was measured against EnergyPlus's own surface vertex +report rather than reasoned from the input reference, which is why +[`translate_to_world`][idfkit.geometry.translate_to_world] now agrees with it. + +::: idfkit.scene diff --git a/mkdocs.yml b/mkdocs.yml index 68a41db8..ced3b6d0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -115,6 +115,7 @@ nav: - Schema: api/schema.md - Validation: api/validation.md - Geometry: api/geometry.md + - Scene: api/scene.md - Geometry Builders: api/geometry_builders.md - Surface Matching: api/surface_matching.md - Zoning: api/zoning.md From 663a6127f737e0d6b1c9a754e4131c8af968c906 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Thu, 24 Sep 2026 23:11:13 -0400 Subject: [PATCH 4/4] Stop the engine-asset gate reporting the search index as a stray binary The gate failed the strict build with: Built site: 70,502,285 bytes, 0 WebAssembly file(s). hosts a 8,391,969-byte binary: search/search_index.json Both lines are from the same run. It found no WebAssembly and then reported a stray binary, which is the shape of a false positive rather than a finding. TEXT_SUFFIXES held html, js, css and mjs, so the search index counted as non-text and fell under LARGE_BINARY_BYTES once it passed 8 MB. mkdocs writes that file from every page's text, so its size measures how much documentation the site has. Adding a reference page for idfkit.scene was enough to cross the threshold, which means the gate was already within one page of firing on any change that added prose. The constant's own comment draws the right distinction and the suffix set did not implement it: the 28 MB generated HTML page is called out as "a real problem and a different one", and the search index is that same category. Engine bytes cannot hide behind this: BINARY_SUFFIXES catches .wasm and .wat at any size, and the size rule is a backstop for something arriving under another name, which JSON is not. Verified: the gate passes on the built site and still reports 0 WebAssembly files. --- scripts/check_engine_assets.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/check_engine_assets.py b/scripts/check_engine_assets.py index 382220a7..3af0d2d0 100644 --- a/scripts/check_engine_assets.py +++ b/scripts/check_engine_assets.py @@ -56,7 +56,13 @@ ("static import", re.compile(r"^\s*import\s[^;\n]*['\"][^'\"]*@idfkit/engine", re.M)), ) -TEXT_SUFFIXES = frozenset({".html", ".js", ".css", ".mjs"}) +#: Text the site generates, exempt from the size rule above because their size is a fact about how +#: much documentation there is rather than evidence of a stray binary. `.json` is here for the +#: search index, which mkdocs writes from every page's text and which crossed LARGE_BINARY_BYTES +#: when the scene module gained a reference page: 8.4 MB of prose, reported as a stray binary in +#: the same output that reported zero WebAssembly files. Engine bytes cannot hide here, because +#: BINARY_SUFFIXES catches `.wasm` and `.wat` at any size and the size rule is only a backstop. +TEXT_SUFFIXES = frozenset({".html", ".js", ".css", ".mjs", ".json"}) def hosted_binaries(site: Path) -> list[str]: