Skip to content

docs(architecture): the consumers diagram carries the shape, not the list - #377

Merged
FBumann merged 4 commits into
mainfrom
docs/consumers-diagram
Jul 31, 2026
Merged

docs(architecture): the consumers diagram carries the shape, not the list#377
FBumann merged 4 commits into
mainfrom
docs/consumers-diagram

Conversation

@FBumann

@FBumann FBumann commented Jul 31, 2026

Copy link
Copy Markdown
Owner

The last commit of #375 raced the merge and did not land — this is that commit, rebased onto main. The nine-box diagram is what is on main today.

The problem

The consumers diagram had three subgraphs of three unconnected nodes each. With no edges between them direction TB does nothing, so mermaid laid them out horizontally: nine boxes wide. And once #375 put the API names in the leaves, those leaves duplicated the table sitting directly below them.

Stacking the nodes with invisible links (~~~) fixes the width, but trades it for height — very tall, with large gaps — and does nothing about the duplication.

The fix

A diagram should carry what is actually shaped: the narrow waist and the fan-out. A list of twelve capabilities is not shaped, it is a list — and it now has a table.

your math ──▶ the whole model ──┬──▶ show it
                                ├──▶ check it
                                └──▶ run it ──▶ your answers

Five boxes, one line. The twelve leaves fold into the Python-surface table as rows, which is where the names already were.

"Ships today vs. cheap to build" was a line style the caption had to explain ("solid is what ships; dashed is what the shape makes cheap"). It is now an italic row in that table, sitting next to the thing it is a variant of.

Net −33 lines.

Re-rendered through mermaid-cli to confirm.

Verification

709 passed / 4 skipped / 1 xfailed · ruff check clean · mkdocs build --strict clean. Documentation only — no source change.

🤖 Generated with Claude Code

…list

Three subgraphs of three unconnected nodes each: mermaid laid them out nine
boxes wide, and the leaves duplicated the table directly below them.

A diagram should carry what is actually shaped — the waist and the fan-out —
so it is now five boxes on one line, and the twelve leaves fold into the
Python-surface table as rows. That table gains a "you want to" column and the
planned entries the dashed boxes used to hold, so solid-vs-dashed becomes an
italic row rather than a line style a caption has to explain.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@FBumann, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 13 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 79ddffc1-d2aa-4c63-84d6-be0db423b290

📥 Commits

Reviewing files that changed from the base of the PR and between e67be40 and c41ec3e.

📒 Files selected for processing (2)
  • docs/ARCHITECTURE.md
  • docs/ROADMAP.md

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@read-the-docs-community

read-the-docs-community Bot commented Jul 31, 2026

Copy link
Copy Markdown

Documentation build overview

📚 lpspec | 🛠️ Build #33849353 | 📁 Comparing c41ec3e against latest (e67be40)

  🔍 Preview build  

2 files changed
± ARCHITECTURE/index.html
± ROADMAP/index.html

FBumann and others added 3 commits July 31, 2026 10:59
Two things went vague when the consumers diagram lost its subgraph titles.

The contract: the waist box now names itself (MathSchema) and says what it
guarantees — names typed, dims checked, degree judged — and `check it` says
what it does rather than asking a question, since parse → expand → validate →
lower IS the answer to "will this build".

Where data enters: the "no data, no solver" / "the only part that touches your
data" distinction was carried by the old subgraph titles and had simply gone.
It is back as an arrow — one, into `run it` — which is stronger, because the
boundary is a shape rather than a caption. The surface table gains a `data?`
column for the same reason, plus a paragraph on what the mapping must contain:
binding is by name at both levels, with one narrow positional fallback for an
unnamed pandas index, which is documented because renaming named levels would
transpose data silently.

In the pipeline diagram, `lowering.py` and `sources.py` move out of the
relational/ box. Both are flat modules, so drawing them inside a box captioned
"imports nothing from the package but errors.py" was false — both read the
schema. Outside and dashed, they read as what they are: the seam, and the
place data arrives.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The data cylinder fed only sources.py, which said the linopy lane builds
models out of nothing. It takes data= and coerces it in linopy/loader.py —
a separate path that never calls tidy_sources, because one lane wants tidy
polars frames and the other an xr.Dataset.

Drawn as a second, dotted arrow, matching the AST's own opt-in edge into that
lane: both the math and the data reach it only if you ask for it. The prose
names the split and the one thing the lanes do share — the convex: curvature
guard, which needs values rather than a schema, which is why it sits with the
data where both can call it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Listing pandas as an input shape on the pipeline diagram contradicts the
dependency story three sections below it — pandas is a bridge *out*, shipped
with the [linopy] extra, and the bare-install job runs the suite without it.

It was never needed on the label either: a pandas frame is accepted because it
exports the Arrow PyCapsule protocol, so "any Arrow table" already covers it.
Both cylinders now read parquet · polars · any Arrow table.

The remaining pandas mention is the unnamed-index positional fallback, which
is genuinely pandas-specific and stays.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@FBumann
FBumann merged commit fb06b82 into main Jul 31, 2026
4 checks passed
@FBumann
FBumann deleted the docs/consumers-diagram branch July 31, 2026 10:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant