Skip to content

docs(ceiling): the plan cannot loop, the process can — scope the refusal - #378

Merged
FBumann merged 1 commit into
mainfrom
docs/roadmap-rung-1
Jul 31, 2026
Merged

docs(ceiling): the plan cannot loop, the process can — scope the refusal#378
FBumann merged 1 commit into
mainfrom
docs/roadmap-rung-1

Conversation

@FBumann

@FBumann FBumann commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Rebased. The window-family / quadratic-sequencing / REPL commit that opened this PR reached main by another route — it was swept into 792861b and merged as #377 — so the rebase dropped it as already upstream. What remains is the second commit only.

docs/design/ceiling.md and docs/ROADMAP.md contradicted each other, and the contradiction was hiding a claim worth making.

The contradiction

ceiling.md put "lazy cut generation, a solve loop" outside the closure, "because there is no 'before' for it to happen in." ROADMAP Track 2c says value-only re-solve is in scope — "which is what rolling horizon, sweeps and Benders need."

Both cannot stand.

The resolution

The refusal is about the symbolic plan, not the engine. A plan cannot contain a loop; a process may loop over plans, each with its shape fixed before its own data. Rolling horizon is already that shape and already in scope. ceiling.md now says so and stops, instead of reading as a claim about what the engine can do.

Appending also costs less than the label contract suggests. var_label is a ROW_NUMBER() over the rows surviving the where mask, so adding rows moves no column and renumbers no existing rowprimal and dual keep working across cuts. Removal and reindexing are what the contract refuses, and decomposition needs neither. addRows is already the call sinks/highs.py:135 makes to feed the initial build, so appending a cut is that code path rather than a new one.

New Track 2d

States the positive claim, because the opposite is the natural assumption: an architecture whose model is sparse triplets plus label tables suits decomposition better than an array-based layer, since each step is a query rather than a scatter.

What is missing is small and already tracked: #204 for the session, an addRows on it, and #39.

Also notes that sinks/highs.py:119 already calls changeColsIntegrality, so the relax item added in #377 is a flag on the session rather than a new path.

The open question, now stated in both places

Not feasibility — who writes the cut. Rule 6 refuses a Python modeling API, so either a decomposition driver ships reading the model frames, or the narrow seam that composition already forces gets blessed. Same question arriving from a second direction; filed separately.


mkdocs build --strict passes, tests/test_docs_site.py green, the new cross-anchor into ceiling.md resolves in the built site.

🤖 Generated with Claude Code

@read-the-docs-community

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

Copy link
Copy Markdown

Documentation build overview

📚 lpspec | 🛠️ Build #33849491 | 📁 Comparing 9c91e93 against latest (e67be40)

  🔍 Preview build  

4 files changed
± ARCHITECTURE/index.html
± ROADMAP/index.html
± changelog/index.html
± design/ceiling/index.html

@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: 4 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: 46ca5615-3985-4919-9154-7dbbfb26ad08

📥 Commits

Reviewing files that changed from the base of the PR and between 7a194c3 and 9c91e93.

📒 Files selected for processing (2)
  • docs/ROADMAP.md
  • docs/design/ceiling.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.

ceiling.md put "lazy cut generation, a solve loop" outside the closure because
there is no "before" for them to happen in, while ROADMAP Track 2c says
value-only re-solve is in scope and names Benders as what it is for. Both cannot
stand. The refusal is about the symbolic plan, not the engine: a plan cannot
contain a loop, but a process may loop over plans, each with its shape fixed
before its own data. Rolling horizon is already that shape.

Appending also costs less than the label contract suggests. var_label is a
ROW_NUMBER() over the rows surviving the where mask, so adding rows moves no
column and renumbers no existing row — primal and dual keep working across cuts.
Removal and reindexing are what the contract refuses, and decomposition needs
neither. addRows is already the call the direct sink makes to feed the initial
build, so appending a cut is that code path, not a new one.

New Track 2d states the positive claim, since the opposite is the natural
assumption: an architecture whose model *is* sparse triplets plus label tables
suits decomposition better than an array-based layer, because each step is a
query rather than a scatter — the master/sub split is a GROUP BY over A (#39),
cut coefficients are a join against duals that already read back, and var_label
is the solver column index with no remapping. What is missing is #204, an
addRows on it, and #39.

Both places now leave the same open question, which is scope rather than
ceiling: rule 6 refuses a Python modeling API, so either a decomposition driver
ships reading the frames, or the seam composition already forces gets blessed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@FBumann
FBumann force-pushed the docs/roadmap-rung-1 branch from 63d7649 to 9c91e93 Compare July 31, 2026 09:16
@FBumann FBumann changed the title docs(roadmap): price the window family, sequence quadratic, name the REPL gap docs(ceiling): the plan cannot loop, the process can — scope the refusal Jul 31, 2026
@FBumann

FBumann commented Jul 31, 2026

Copy link
Copy Markdown
Owner Author

Follow-ups filed: #380 (label budget as a general mechanism), #381 (who may emit math from Python — the open question this PR states in both places), #382 (warm starts), #383 (semi_continuous), #384 (cumsum over data). Plus addRows and relax as comments on #204.

@FBumann
FBumann merged commit 55d238c into main Jul 31, 2026
5 checks passed
@FBumann
FBumann deleted the docs/roadmap-rung-1 branch July 31, 2026 10:47
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