Skip to content

What is not finished

The two libraries now share a vocabulary, a conformance corpus, a parity ledger and a documentation site. Several things were deliberately not closed along the way. This page is the list, so that none of them is discovered as a surprise.

Two other pages cover neighbouring ground and are not repeated here. Capability parity lists every capability and its state in each language. How conformance is established covers what the corpus does and does not prove about agreement.

The second and third tiers stay single-language

First-tier capabilities exist in both languages: parsing, the object model, references, writers, schema access, validation, introspection, documentation addresses, generated object types, parse diagnostics, the weather station index, weather file retrieval, and geocoding.

Everything above that tier is Python-only, and that was the plan rather than the remainder. Geometry authoring, surface matching, zoning, thermal properties, schedule evaluation, output-variable selection, design-day sizing, version migration, the command line, schema compatibility checking and result plotting are roughly ten times the work of the first tier, and porting them without first fixing the shared vocabulary would have meant renaming them afterwards.

They are on the ledger as absent with absence_kind = "not-yet" and a tracking issue each, which is the difference between a gap and an omission. A few capabilities are never instead, and those are permanent: driving a locally installed EnergyPlus needs a subprocess a browser does not have, and running EnergyPlus in a browser needs a WebAssembly build Python has no use for. Neither is a deficiency in the other language.

The TypeScript reference needs a shim, and will for a while

The TypeScript half of the API reference is generated by TypeDoc in idfkit-js, published as a pinned artifact, and rendered here through mkdocstrings-typescript. Two things about that toolchain are worked around rather than solved, both in docs/hooks/typedoc_shim.py:

griffe-typedoc is described by its own author as a prototype, and its model was written against an earlier TypeDoc. It decodes strictly, so current TypeDoc output kills the build on the first unmodelled key or type kind. The shim coerces what it cannot model and drops keys nothing renders. The alternative was pinning TypeDoc, and with it TypeScript, which the packages track closely.

mkdocstrings-typescript also regenerates the JSON by shelling out to a typedoc executable on every build, with no option to hand it a file. This site must build with no Node toolchain, so the shim replaces that call with a read of the pinned artifact.

Both go away when the upstream tools catch up. The signal that the first one has started costing something is the reference losing detail: a type rendered as M[K] rather than as a cross-linked structure is the shim doing its job.

The live runner is not verified by CI

The browser-simulation how-to embeds a runner that downloads a WebAssembly EnergyPlus and executes it in the reader's tab. It runs the same file CI type-checks, so a renamed engine method breaks the documentation checks.

Nothing in CI runs EnergyPlus in a browser. A change that type-checks and produces wrong output would ship, and the reader pressing the button is the only thing that would notice. That is why the page calls it a demonstration and this site does not present it as evidence.

The site will move, and it is built so that moving is a move

The documentation lives in the idfkit repository today, which is convenient while the Python library is the larger of the two and inconvenient afterwards: one library's repository hosting the site that teaches both invites its pages to drift towards that library.

It is meant to become idfkit/idfkit-developers, with idfkit a pinned PyPI dependency of the site build in exactly the way the TypeDoc artifact is already a pinned dependency of it. The extraction is out of scope for this work, and nothing here waits on it.

What makes it a move rather than a rewrite is a build check that already runs. The portable job copies docs/ and mkdocs.yml to a scratch directory outside the repository, installs idfkit from a built wheel rather than resolving it out of src/, and runs the same strict build there. An include, a hook path or a template directory that reaches outside the documentation tree fails on the day it is introduced instead of on extraction day. It found one such coupling already and it is empty now.

So the remaining work is a git mv, a repository, and deleting one line of paths: from mkdocs.yml.