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

@@ -198,6 +198,22 @@ def compute_all_io_refs(env: dict[str, Any], io_names: set[str]) -> None:
_compute_all_io_refs_fallback(env, io_names)
def page_render_plan(page_sx: str, env: dict[str, Any], io_names: set[str] | None = None) -> dict[str, Any]:
"""Compute the render plan for a page.
Returns dict with:
- "components": {name: "server"|"client", ...}
- "server": [names rendered server-side]
- "client": [names rendered client-side]
- "io-deps": [IO primitive names needed by server components]
"""
if io_names is None:
io_names = get_all_io_names()
from .ref.sx_ref import page_render_plan as _ref_prp
plan = _ref_prp(page_sx, env, list(io_names))
return plan
def get_all_io_names() -> set[str]:
"""Build the complete set of IO primitive names from all boundary tiers.