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

@@ -881,9 +881,10 @@ async def _streaming_demo_data():
def _affinity_demo_data() -> dict:
"""Return affinity analysis for the demo components."""
"""Return affinity analysis for the demo components + page render plans."""
from shared.sx.jinja_bridge import get_component_env
from shared.sx.types import Component
from shared.sx.pages import get_all_pages
env = get_component_env()
demo_names = [
@@ -904,4 +905,20 @@ def _affinity_demo_data() -> dict:
"io-refs": sorted(val.io_refs),
"is-pure": val.is_pure,
})
return {"components": components}
# Collect render plans from all sx service pages
page_plans = []
for page_def in get_all_pages("sx").values():
plan = page_def.render_plan
if plan:
page_plans.append({
"name": page_def.name,
"path": page_def.path,
"server-count": len(plan.get("server", [])),
"client-count": len(plan.get("client", [])),
"server": plan.get("server", []),
"client": plan.get("client", []),
"io-deps": plan.get("io-deps", []),
})
return {"components": components, "page-plans": page_plans}