Conversation
Documentation build overview
40 files changed ·
|
FBumann
marked this pull request as draft
August 29, 2026 14:17
This was referenced Aug 29, 2026
FBumann
force-pushed
the
claude/data-rules-in-the-language
branch
from
August 30, 2026 18:19
a0cc2d4 to
1e2b8a9
Compare
FBumann
force-pushed
the
claude/parameter-coverage
branch
from
August 30, 2026 18:19
92c8b6e to
9a8045c
Compare
FBumann
force-pushed
the
claude/data-rules-in-the-language
branch
from
August 31, 2026 18:29
1e2b8a9 to
33b7db7
Compare
FBumann
force-pushed
the
claude/parameter-coverage
branch
from
August 31, 2026 18:29
9a8045c to
981aa95
Compare
FBumann
added a commit
that referenced
this pull request
Aug 31, 2026
…bproblem is a call rather than a second file A myopic pathway, a rolling horizon and a Benders subproblem share one move: a variable stops being a decision and becomes a number somebody else chose. fix takes every name in one call and validates once at the end. Two translations are decisions, not copies: a where-masked variable becomes coverage: masked, and a binary or integer variable becomes an int parameter — never a float, never a bool that would read as a mask. Rebased onto the parameter-coverage branch (#243) it needs for Coverage, off the closed #247/#248 stack it was authored on; only the fix additions are kept. Co-Authored-By: Claude <noreply@anthropic.com>
FBumann
marked this pull request as ready for review
August 31, 2026 20:46
FBumann
force-pushed
the
claude/data-rules-in-the-language
branch
from
September 2, 2026 08:28
33b7db7 to
f488380
Compare
FBumann
force-pushed
the
claude/parameter-coverage
branch
from
September 2, 2026 08:28
003ea7c to
200b831
Compare
…oordinate, so a row lost in preparation is not read as a mask A table short of a coordinate and a table that never had one are identical in the data and mean opposite things. `coverage:` says which was meant, and a parameter declaring itself a mask is refused as a bound or a divisor — the two positions where absence has no reading — before any data arrives. Co-Authored-By: Claude <noreply@anthropic.com> (cherry picked from commit 9a8045c)
The absence-reading guard walked the variable lower/upper nodes twice — once into the pool it scans for divisors, once to find the bound parameters — and carried a module constant nothing read. Name the bound nodes once and drop the constant. No observable change; both symbols are private. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011UmU9E9JpW14mNh2CrRMor
FBumann
force-pushed
the
claude/parameter-coverage
branch
from
September 2, 2026 08:44
200b831 to
4ada6e5
Compare
Contributor
Author
|
Note The following content was generated by AI. Closed in favour of #245, which now carries both halves of #296 as one PR. #296 proposes No coverage is lost: the commit from this branch is unchanged in #245 ( Branch |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
The following content was generated by AI.
What this changes
parameters:takescoverage: total | masked, defaulttotal. A parameter declaring itself a mask is refused as a bound or a divisor — the two positions rule 8 gives absence no reading — before any data arrives.Why
A table short of a coordinate and a table that never had one are identical in the data and mean opposite things. lpspec says so, and says it cannot decide:
That is a precise statement that the information is not in the file. Rule 8 gives absence a reading; nothing gave it a permission. This is the permission, and once declared the reporting can start judging.
What lpspec removes or changes
The one of the three with real downstream work.
sources.pyrefuses atotalparameter short of a coordinate its dims reach — aDataErrornaming parameter and coordinate. Today that is countable, not reportable.diagnostics().sparse_parametersnarrows and loses its caveat. The "could be either" sentence is exactly what this key removes. It stays useful formaskedparameters; fortotalones the row becomes an error.examples/ports/*.yamlanddifferential/pypsa/needcoverage: masked, as this PR does to math-spec's own examples. Mechanical — they are the ones whose descriptions already say "no value means …".curves.py, shape recognition, both lanes' compilers.Verified
Toolchain reconstructed at the versions
pixi.tomlpins, run on this branch:ruff format --check/ruff check(0.16.1, pinned) clean;pyrefly(1.2.0, pinned) 0 errors;reusecompliant;typosclean;prettierclean;pytest -q -n auto837 passed, 1 skipped (829 on the base — 8 new);mkdocs build --strictbuilds, and Read the Docs built the PR for real.schema/math-spec.schema.jsonregenerated withpython -m tools.schema(+9 lines);test_schema.pygreen.Not run:
zizmor,taplo(neither's files changed),compile-tex—coverageis not a rendered attribute and the golden typesetter tests are green, so this branch's LaTeX is byte-identical to its base's.Mutation table
Both guards deleted in turn on a clean tree, restored with
git checkout --,__pycache__dropped both sides.tools/mutate.pyexpresses neither (a deleted call; a deleted dict update), so both were taken by hand.The second is the one that matters: bounds are the obvious position, divisors the one a reader forgets, so a guard catching only the first would look right.
The permissive half is tested too —
maskedas a coefficient, a term and awhereall still load. A guard refusing those would refuse the construct the declaration exists to describe.The decision worth arguing about
The default.
totalbreaks nothing here (this repo binds no data) and is what the other rules assume — but it is the whole downstream cost, and reversing it later is not free: shipmaskedas the default and every existing model silently means "sparsity allowed", after whichtotalcan only arrive as a per-file opt-in forever. One line inmodel.pyplus eight example declarations if you want it the other way. Worth settling before there is a corpus, which is why it is here rather than buried in the diff.Stack: second of three, on #242.
Relates to #296 (parameter coverage; #245 covers lookups)