Skip to content

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.70 (2026-09-02)#

Documentation#

  • language: only a dimension some declaration reaches needs a source (#378) (b3b9549)

0.0.0-alpha.69 (2026-09-02)#

Bug Fixes#

  • the docstrings no longer point a consumer at the package-private expression tree (#351) (15b1985)

Refactoring#

  • the expression parser is package-private, and the parsed tree is named apart from the program's (#342) (55ff525)

0.0.0-alpha.68 (2026-09-02)#

Documentation#

  • language: the rules binding obeys belong to the language, not to whichever engine reads the data (#242) (c05da6a)

0.0.0-alpha.67 (2026-09-02)#

Refactoring#

  • a built-in's one positional argument is stated once, and a degree question names the tree it walks (#364) (556af30)
  • every rule two passes shared has one home, and a docstring says what a caller needs rather than why (#363) (f24ddd3)
  • model: each cross-declaration rule is one method, so a refusal names the rule that raised it (#369) (b25a602)
  • piecewise: one block expands itself, holding its names, frame and mask once (#367) (537eadf)
  • resolution is one method per node kind, and each operator's dim rule is one function (#368) (c7c2833)
  • typesetting: the legend reads what the equations returned rather than state left on the walk (#366) (db96a54)

0.0.0-alpha.66 (2026-09-01)#

Performance#

  • a model loads, lowers and typesets three to eight times faster (#357) (ea6fe79)

0.0.0-alpha.65 (2026-09-01)#

Refactoring#

  • language: a translation policy and a bound's side name the values they can be, rather than being a string (#354) (d212157)
  • typesetting: a format spells the operators the language names, rather than any string a walk happens to ask for (#352) (12b4041)

0.0.0-alpha.64 (2026-09-01)#

Features#

  • parser: a refused where string names the rewrite for pandas and C connective habits (#346) (3dbd9b2)

0.0.0-alpha.63 (2026-09-01)#

Refactoring#

  • language: an operator, a declaration kind and a notation name the values they can be, rather than being a string (#345) (3f3f858)

0.0.0-alpha.62 (2026-09-01)#

Bug Fixes#

  • language: a declaration named what no expression could write is refused, rather than loading unreferenceable (#340) (b865bc1)

0.0.0-alpha.61 (2026-09-01)#

Performance#

  • program: a mask walks its leaves once and every question reads that walk (#338) (337d169)

0.0.0-alpha.60 (2026-09-01)#

Bug Fixes#

  • language: the language reference states which case arms are refused, and the refusal says what actually breaks (#336) (01920d1)

0.0.0-alpha.59 (2026-09-01)#

Bug Fixes#

  • parser: a parsed expression cannot be rewritten under another pass (#329) (fcfb7b8)

0.0.0-alpha.58 (2026-09-01)#

Features#

  • program: a resolved where is a first-class Mask whose leaves carry their dims, and the where grammar is package-private (#327) (53cc352)

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#

  • language: a label space may group a position, though not a reduction or a walk (#281) (00be0cb)

0.0.0-alpha.49 (2026-08-31)#

Features#

  • examples: a link delivers to as many buses as its data declares, not two (#273) (0ece0d8)

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#

  • the README's example of reading a loaded model runs as written (#240) (304a233)

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#

  • program: a program says which of the language's constructs it uses (#207) (4e55a15)

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#

  • one call returns every note the language can give without data (#191) (2face7a)

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#

  • the style guide's front-door example is the function it quotes (#187) (5dbed70)

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#

  • a program is the second public state, and one call reaches it (#177) (c9ee1ab)

0.0.0-alpha.31 (2026-08-28)#

Documentation#

  • agents: the cheap gates run here, and CI is reported rather than watched (#175) (78e3d80)

0.0.0-alpha.30 (2026-08-28)#

Documentation#

  • the absence rules cover every operator, not the three they named (#173) (3266a5b)

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#

  • the ac-dc-meshed rung states its network, so the reference run needs no download (#166) (abf734c)

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#

  • a snapshot is a timestamp, in the file and in every rung's network (#159) (dd5122e)

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#

  • a piecewise method answers which curvature it is exact for (#135) (6f0fff1)

0.0.0-alpha.21 (2026-08-26)#

Documentation#

  • language: the absence page is half the length and shows each rule on a model (#127) (147788a)

0.0.0-alpha.20 (2026-08-26)#

Documentation#

  • the language knows nothing about sinks (#118) (886a854)

0.0.0-alpha.19 (2026-08-26)#

Bug Fixes#

  • typeset: a string value in a where clause prints as a quoted label (#114) (9be22c1)

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#

  • the tree describes this package, not the project it was cut from (#94) (9673f9a)

0.0.0-alpha.16 (2026-08-25)#

Refactoring#

  • dead branches, an unused depth cap and prose about a parent project are gone (#86) (f31f3b0)

0.0.0-alpha.15 (2026-08-25)#

Documentation#

  • the title rules are written for the changelog reader (#79) (fdb52e4)

0.0.0-alpha.14 (2026-08-25)#

Documentation#

  • AGENTS.md says what a change here is held to (#76) (5e142f5)

0.0.0-alpha.13 (2026-08-25)#

Bug Fixes#

  • refuse a str or bool parameter where arithmetic wants a number (#71) (9b320fd)

0.0.0-alpha.12 (2026-08-25)#

Documentation#

  • a named offset needs no edge=, the limitation it named is gone (#68) (d91a0c3), closes #64

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#

  • pin the eight names that keep this package and its consumer in step (#51) (15a354b)

Refactoring#

  • name the groups a pass asks about, and spell each operator once (#52) (e35c46c)
  • the package is typesetting, the function stays typeset (#54) (a1d9599)

0.0.0-alpha.9 (2026-08-23)#

Features#

  • position(dim) replaces index(dim, i), converting on the left (#31) (8f78ac5)

0.0.0-alpha.8 (2026-08-23)#

Features#

  • upright is what the model is given, italic is what the solver chooses (#44) (cbccc68)

0.0.0-alpha.7 (2026-08-23)#

Bug Fixes#

  • the notation page is generated again, and something says so (#41) (3dad75e)

0.0.0-alpha.6 (2026-08-23)#

Documentation#

  • an Examples section, each model beside the math it prints (#38) (66bfae4)

0.0.0-alpha.5 (2026-08-22)#

Bug Fixes#

  • to_markdown printed TeX's em-dash ligature, not an em dash (#34) (226407a)

0.0.0-alpha.4 (2026-08-21)#

Refactoring#

  • extract the language and typeset from lpspec (#17) (b997193)

0.0.0-alpha.3 (2026-08-21)#

Bug Fixes#

  • stop prettier rewriting what release-please generates (#27) (7486555)

0.0.0-alpha.2 (2026-08-21)#

Bug Fixes#

  • the release notes landed inside an HTML comment (#25) (c33dc24)

0.0.0-alpha.1 (2026-08-21)#

Bug Fixes#

  • stop the release build silently shipping a 0.0.0 wheel (#23) (a801b00)