Phase 7b: page render plans — per-page boundary optimizer

Add page-render-plan to deps.sx: given page source + env + IO names,
computes a dict mapping each needed component to "server" or "client",
with server/client lists and IO dep collection. 5 new spec tests.

Integration:
- PageDef.render_plan field caches the plan at registration
- compute_page_render_plans() called from auto_mount_pages()
- Client page registry includes :render-plan per page
- Affinity demo page shows per-page render plans

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-08 00:02:53 +00:00
parent a70ff2b153
commit 2da80c69ed
14 changed files with 214 additions and 5 deletions

View File

@@ -738,6 +738,15 @@ def _build_pages_sx(service: str) -> str:
stream = "true" if page_def.stream else "false"
# Render plan: which components render where
plan = page_def.render_plan
if plan:
server_sx = "(" + " ".join(_sx_literal(n) for n in plan.get("server", [])) + ")"
client_sx = "(" + " ".join(_sx_literal(n) for n in plan.get("client", [])) + ")"
render_plan_sx = "{:server " + server_sx + " :client " + client_sx + "}"
else:
render_plan_sx = "{:server () :client ()}"
entry = (
"{:name " + _sx_literal(page_def.name)
+ " :path " + _sx_literal(page_def.path)
@@ -746,6 +755,7 @@ def _build_pages_sx(service: str) -> str:
+ " :stream " + stream
+ " :layout " + _sx_literal(layout_id)
+ " :io-deps " + io_deps_sx
+ " :render-plan " + render_plan_sx
+ " :content " + _sx_literal(content_src)
+ " :deps " + deps_sx
+ " :closure " + closure_sx + "}"