Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ Four docs, kept short on purpose — **reference pages carry rules, design notes
- `docs/SPEC.md` — the language reference: what a YAML file may contain and what it means. It opens with **§0, the ten laws**; every section below elaborates one.
- `docs/ARCHITECTURE.md` — how it fits together, the hard rules, the module map. Update it in any PR that changes structure.
- `docs/design/ceiling.md` — what may enter the language: the two tiers, the admissibility test, why sink capability is a second axis.
- `docs/ROADMAP.md` — what we build toward and what we have decided never to build.
- `docs/ROADMAP.md` — why the project exists and where it is going. No work items: those are issues.

A PR that adds, renames, or retires a construct updates `docs/SPEC.md` — **§0 if it changes a law, the section if it changes a detail**. Rationale belongs in the PR description or a code comment, not in a new doc section; historical "this used to work differently" notes belong in git.

`docs/models/index.md` is the evidence page — what the language can say and how we know the answers are right. Both its tables are generated (`uv run python -m tools.constructs`), the reference table straight from `examples/ports/references.json`, so a published optimum cannot disagree with an asserted one.

Everything under `docs/` is also published as an mkdocs-material site (`mkdocs.yml`), built from those same files. Two rules: **a new page under `docs/` needs a `nav:` entry** or `mkdocs build --strict` fails in CI, and **a link to anything outside `docs/` is written as a full GitHub URL**, never as `../CONTRIBUTING.md` — the relative form resolves in the repo and 404s on the site, silently. Links inside `docs/` stay relative. `tests/test_docs_site.py` enforces both; see *the docs* in [CONTRIBUTING.md](CONTRIBUTING.md).

**Before proposing a new language feature**, triage it: **macro, primitive, or escape?** Most requests are compositions (macro, free); a genuinely new shape earns a primitive only if it clears the expressive ceiling in `docs/design/ceiling.md` (degree 1 ∩ relational ∩ local); unsayable math goes to a declared `escape:` island (#38) rather than into the language. Check the deliberate non-primitives in `docs/ROADMAP.md` first — parity with another tool is not by itself a reason to add anything.
**Before proposing a new language feature**, triage it: **macro, primitive, or escape?** Most requests are compositions (macro, free); a genuinely new shape earns a primitive only if it clears the expressive ceiling in `docs/design/ceiling.md` (degree 1 ∩ relational ∩ local); unsayable math goes to a declared `escape:` island (#38) rather than into the language. Check the deliberate non-primitives in `docs/design/ceiling.md` first — parity with another tool is not by itself a reason to add anything.

## Common Commands

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ declared `escape:` island rather than into the language.

Read, in order:

1. [the deliberate non-primitives in docs/ROADMAP.md](docs/ROADMAP.md) — parity with
1. [the deliberate non-primitives](docs/design/ceiling.md#deliberate-non-primitives) — parity with
another tool is not by itself a reason to add anything, and several
plausible-sounding features are refused there on purpose;
2. [the ceiling in docs/design/ceiling.md](docs/design/ceiling.md#two-tiers-and-the-ceiling) —
Expand Down
4 changes: 2 additions & 2 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ property makes everything else legal: the whole model can be compiled — to eag
xarray/linopy calls, or to a logical plan executed relationally and streamed to a
sink — with both paths provably meaning the same thing. Every rule below protects
it. (A *declared* memory ceiling is not something we have; see
[Track 4](ROADMAP.md#track-4--the-memory-axis).)
[the memory axis](ROADMAP.md#where-it-is-going).)

**Four directories, four fences.** One produces the AST; three consume it and
know nothing of each other. Each box below is a directory, and its subtitle is
Expand Down Expand Up @@ -367,7 +367,7 @@ streams and no more: `cols` (bounds, objective coefficients, integrality),
and `genconstr` — plus a semi-continuous threshold on `cols`. Unlike the three
that exist, those two would land *unevenly*, because the destinations differ
per sink (see "Capability is not the ceiling"); that unevenness is what
[Track 3](ROADMAP.md#track-3--capabilities-and-the-degree-line) exists to make declared rather
[Track 3](https://github.com/FBumann/lpspec/issues/472) exists to make declared rather
than discovered at solve time.

**A sink is one of two things, and the directory says which.** A **solver**
Expand Down
Loading