Changelog#
Written by release-please from
the conventional-commit subjects that land on main — see RELEASING.md. Do not
edit it by hand; the next release overwrites what you wrote.
New releases are inserted directly below this paragraph, so nothing may sit
between it and the first ## heading. The Keep a Changelog skeleton that used
to live here — a hand-maintained ## Unreleased block, and a comment
documenting the heading format — is what broke 0.0.0-alpha.1: that comment
contained a literal ## [X.Y.Z] heading, release-please inserts above the first
## it finds, and so the entire release landed inside the comment and rendered
nowhere.
0.0.0-alpha.57 (2026-09-01)#
Bug Fixes#
- program: a program describes a mathematical program rather than being one, and claims neither linearity nor a storage format (#315) (5dfa6be)
0.0.0-alpha.56 (2026-09-01)#
Features#
- program: the conjuncts of a where mask are the program's to give, not each consumer's to re-derive (#313) (db63d3c)
0.0.0-alpha.55 (2026-08-31)#
Documentation#
- ceiling: load-time unit checking has its own refusal, where the data-prep row used to answer for it (#272) (8dfd17d)
0.0.0-alpha.54 (2026-08-31)#
Documentation#
- drop the effects row from the PyPSA-1.3.0 parity table, a feature that release does not have (#305) (92e5ed8)
0.0.0-alpha.53 (2026-08-31)#
Documentation#
- a link's delivery lags its flow, wrapping or losing what is in transit at the horizon's edge (#300) (1d4f10f)
0.0.0-alpha.52 (2026-08-31)#
Documentation#
- examples: the PyPSA file states a constraint once where PyPSA builds one row set, rather than a block per regime (#257) (#292) (c35e637)
0.0.0-alpha.51 (2026-08-31)#
Features#
- a named expression may give a value per region, and no two regions may claim one coordinate (#168) (e12e7da)
0.0.0-alpha.50 (2026-08-31)#
Documentation#
0.0.0-alpha.49 (2026-08-31)#
Features#
Bug Fixes#
- examples: a committable modular unit that is not extendable gets the rows PyPSA builds for it (#271) (5af0ac8)
0.0.0-alpha.48 (2026-08-31)#
Features#
- language: which dims a mask reads is the language's answer, so two consumers cannot restrict one model differently (#269) (350b1ed)
0.0.0-alpha.47 (2026-08-28)#
Documentation#
0.0.0-alpha.46 (2026-08-28)#
Features#
- program: a piecewise assumption names the data it is about, and a derived parameter says how it is filled (#237) (48431b1)
0.0.0-alpha.45 (2026-08-28)#
Bug Fixes#
- language: a negative edge fill prints, the sign of a literal amount being folded once at resolution (#234) (d9303db)
0.0.0-alpha.44 (2026-08-28)#
Bug Fixes#
- language: a where mask is folded at resolution, so a typeset page and a program agree about it (#232) (553bda0)
0.0.0-alpha.43 (2026-08-28)#
Features#
- program: a parameter says which piecewise block derived it, and a label space keeps its dtype (#227) (515dbd5)
- program: a piecewise block is kept as facts — its breakpoints, its mask, and what it assumes of the data (#228) (2fdbd6f)
0.0.0-alpha.42 (2026-08-28)#
Bug Fixes#
- language: a negative sum_back width is refused at load rather than asserting in lowering (#223) (62e52eb), closes #222
0.0.0-alpha.41 (2026-08-28)#
Bug Fixes#
- language: a boolean literal in a where is decided at load wherever it stands (#216) (fab308f), closes #214
0.0.0-alpha.40 (2026-08-28)#
Refactoring#
- program: the declaration vocabularies have one home, so a program cannot spell one differently from the file (#219) (f7596d7), closes #209
0.0.0-alpha.39 (2026-08-28)#
Bug Fixes#
- advice: a model handed over as a program is advised of everything a file is (#217) (4fc50e6), closes #210
0.0.0-alpha.38 (2026-08-28)#
Features#
Bug Fixes#
- a file the language accepts is one every consumer can build, the edge rules being decided at load (#211) (a362ff0)
- program: a where mask cannot be rewritten under another consumer (#197) (ce406b0)
- program: an unknown dimension is refused rather than answered empty (#199) (96fdccf)
- program: every expression node answers fan_in (#202) (f5cc67d)
Refactoring#
- program: a program is built by keyword, so a new field cannot reorder an old call (#203) (214394a)
- program: a program's declarations are keyed by the name the file wrote (#205) (579264a)
- program: drop the two pieces of the program API nothing reaches (#204) (ca25fa5)
- program: expressions are the ones a row is built from, and the declared ones say so (#206) (81aaddd)
- program: the program module says what it promises, rather than offering its whole namespace (#208) (08d2f64)
0.0.0-alpha.37 (2026-08-28)#
Features#
- a model is checked from the shell, advice included, with no consumer installed (#192) (941126c)
- advice carries which pass said it and which declaration it is about, so a consumer can filter rather than parse (#195) (89408f6)
Refactoring#
0.0.0-alpha.36 (2026-08-28)#
Refactoring#
- a program is trusted by construction, so the language's rules are checked once, on the spec (#189) (45931b1)
0.0.0-alpha.35 (2026-08-28)#
Documentation#
0.0.0-alpha.34 (2026-08-28)#
Refactoring#
- two public states and a conversion to each, where the surface was seventy-seven names (#180) (718e2de)
0.0.0-alpha.33 (2026-08-28)#
Features#
- the notes a check prints are reachable, so a consumer surfaces them rather than re-deriving them (#184) (19ef814)
0.0.0-alpha.32 (2026-08-28)#
Features#
0.0.0-alpha.31 (2026-08-28)#
Documentation#
0.0.0-alpha.30 (2026-08-28)#
Documentation#
0.0.0-alpha.29 (2026-08-27)#
Features#
- language: dimension members and lookup maps come from the data, rather than from the file (#169) (f3c4e5f)
0.0.0-alpha.28 (2026-08-27)#
Bug Fixes#
0.0.0-alpha.27 (2026-08-27)#
Bug Fixes#
- the linearized rung states its three caps as rows and starts one unit cold, so every block it declares is built (#162) (cb4863f)
0.0.0-alpha.26 (2026-08-27)#
Features#
0.0.0-alpha.25 (2026-08-27)#
Features#
- rung 11 — PyPSA's ac-dc-meshed example, whole (#151) (a133044)
- rung 12 — linearized unit commitment, a file of its own (#152) (69b926e)
- rung 13 — transmission losses in tangent form, a file of its own (#153) (379ce23)
- rung 14 — two-stage stochastic with CVaR, a file of its own (#154) (41b427d)
- rung 15 — investment periods with a growth limit, a file of its own (#155) (285aac3)
0.0.0-alpha.24 (2026-08-26)#
Features#
- PyPSA in one file — every rung stated, shown beside its data, and solved to the same objective on both lanes (#122) (46544e3)
0.0.0-alpha.23 (2026-08-26)#
Bug Fixes#
- docs: the homepage feature cards render as cards rather than as loose rules and paragraphs (#145) (b88e5dc)
0.0.0-alpha.22 (2026-08-26)#
Features#
0.0.0-alpha.21 (2026-08-26)#
Documentation#
0.0.0-alpha.20 (2026-08-26)#
Documentation#
0.0.0-alpha.19 (2026-08-26)#
Bug Fixes#
0.0.0-alpha.18 (2026-08-26)#
Refactoring#
- parser: one number rule, one amount table, and a namespace nothing builds by hand (#106) (f775a07)
- schema: one wording for an undeclared dimension, and the front door validates once (#105) (69e42db)
- the stack's own additions say less and repeat nothing (#102) (119e588)
- typeset: Markdown is LaTeX's math with its own document layer, and a step merges itself (#107) (1ca9178)
0.0.0-alpha.17 (2026-08-25)#
Bug Fixes#
- language: a link takes any affine expression, an uncalled template hides no typo, and degree is decided at load (#91) (a653056)
- parser: a negation is over a power, a keyword is given once, and an amount is a number or a name (#88) (4bf994c)
- schema: every refusal of a malformed file is a SchemaError, and an empty declared map survives a round trip (#89) (ee07736)
- schema: two literal bounds that cross are refused at load (#97) (30589ba)
- typeset: a sum under its own dimension takes a fresh index, and prose escapes its markup (#92) (20c7076)
Refactoring#
0.0.0-alpha.16 (2026-08-25)#
Refactoring#
0.0.0-alpha.15 (2026-08-25)#
Documentation#
0.0.0-alpha.14 (2026-08-25)#
Documentation#
0.0.0-alpha.13 (2026-08-25)#
Bug Fixes#
0.0.0-alpha.12 (2026-08-25)#
Documentation#
0.0.0-alpha.11 (2026-08-25)#
Bug Fixes#
- enforce the two rules a named offset or width was always said to obey (#61) (5bd92dc), closes #58
- let sum_back stop at each group's edge, as its checks already assumed (#65) (cb58e88)
- refuse a negated named amount, and one read where there is no coordinate (#63) (15d9c25), closes #62
0.0.0-alpha.10 (2026-08-24)#
Features#
Refactoring#
- name the groups a pass asks about, and spell each operator once (#52) (e35c46c)
- the package is
typesetting, the function staystypeset(#54) (a1d9599)