{"ok":true,"service":"static-page-budget-policy","mode":"static-page-budget-policy-layer","timestamp":"2026-06-26T15:03:11.448Z","dependencies":{"dynamicReadinessHubRenderer":"ready-summary","readinessManifestRegistry":"ready-summary","buildRegressionForensicGate":"ready-summary","readinessRouteConsolidationPlan":"ready-summary"},"summary":{"totalClasses":8,"classFoundationReady":6,"classReviewRequired":2,"totalLimits":6,"limitFoundationReady":5,"limitReviewRequired":1,"totalRules":8,"ready":8,"reviewRequired":0,"blocked":0,"staticPageBudgetPolicyReady":true,"staticConversionRuntimeEnabled":false,"routeRedirectEnabled":false,"routeDeletionEnabled":false,"cssDeletionEnabled":false,"providerUpgradeRequired":false,"productionMutation":false,"reason":"Static Page Budget Policy is active as a non-destructive build governance layer. TheoB can define static page classes, dynamic requirements, manifest-render preferences, build budgets, CSS budgets, and static route approval rules, but it cannot convert routes, redirect routes, delete routes, delete CSS, upgrade providers, or mutate production yet."},"budgetClasses":[{"classId":"public-static-allowed","status":"foundation-ready","purpose":"Allow public-facing core entry pages to remain static when they provide user-facing value and fast first load.","examples":["/","/watch","/observatory","/cacao","/village","/academy","/world","/vault","/join"],"safeguard":"Static pages should be public doors, not internal machinery."},{"classId":"marketing-static-allowed","status":"foundation-ready","purpose":"Allow lightweight marketing, onboarding, demo, and public story pages to remain static when they do not hydrate heavy internal registries.","examples":["/founder","/brand-blueprint","/theob-design-language","/demo-flow"],"safeguard":"Marketing pages must stay light."},{"classId":"tool-static-review","status":"review-required","purpose":"Review tools one by one. Simple tools may remain static; dynamic tools or tools with state, APIs, user input, or heavy dependencies should be dynamic.","examples":["/tools","/tools/apps","/tools/calculator","/tools/measurement"],"safeguard":"A calculator is not the same as a live operating cockpit."},{"classId":"internal-dynamic-required","status":"foundation-ready","purpose":"Require internal readiness, registry, gate, layer, foundation, queue, receipt, provider, telemetry, governance, and system routes to be dynamic or manifest-rendered.","examples":["*-readiness-layer","*-registry","*-gate","*-foundation","*-layer","*-queue","*-receipt"],"safeguard":"Internal machinery should not be prebuilt like a public landing page."},{"classId":"manifest-render-preferred","status":"foundation-ready","purpose":"Prefer manifest records rendered through dynamic hubs for internal concepts instead of one route per concept.","examples":["/readiness-hub/[recordId]","/dynamic-readiness-hub-renderer"],"safeguard":"One renderer, many records."},{"classId":"api-dynamic-required","status":"foundation-ready","purpose":"API routes, live routes, status routes, provider routes, and telemetry routes remain dynamic.","examples":["/api/live/*","/api/*"],"safeguard":"Live data is not static wallpaper."},{"classId":"dynamic-route-review","status":"foundation-ready","purpose":"Dynamic app routes with params should be reviewed for whether they need static params, dynamic rendering, or manifest lookup.","examples":["/invite/[slug]","/readiness-hub/[recordId]"],"safeguard":"Parameterized routes need explicit rendering posture."},{"classId":"archive-candidate","status":"review-required","purpose":"Pages with no public value, no traffic, repeated UI, and manifest parity should become archive or redirect candidates.","examples":["old standalone internal readiness pages after hub parity"],"safeguard":"Archive only after traffic review and visual parity."}],"budgetLimits":[{"budgetId":"total-static-pages-budget","status":"foundation-ready","target":"under 80 static pages","currentProblem":"recent builds generated about 193 static pages after partial dynamic conversion","action":"Reduce static pages by converting internal and repeated system routes to dynamic or hub-rendered records."},{"budgetId":"page-data-collection-budget","status":"foundation-ready","target":"under 60 seconds","currentProblem":"recent page data collection has taken multiple minutes","action":"Remove top-level heavy page calculations and reduce static route graph pressure."},{"budgetId":"production-deploy-budget","status":"foundation-ready","target":"under 4 minutes before public launch","currentProblem":"production deploy still sits near 13 minutes","action":"Collapse internal routes, reduce CSS, and use manifest-rendered hubs before considering provider upgrades."},{"budgetId":"globals-css-budget","status":"foundation-ready","target":"under 8,000 lines in phase one, under 4,000 later","currentProblem":"globals.css has exceeded 20,000 lines","action":"Migrate repeated page shells to shared utilities and delete old CSS only after visual parity."},{"budgetId":"new-route-budget","status":"foundation-ready","target":"zero new standalone internal readiness routes by default","currentProblem":"new concepts were historically added as full routes","action":"New internal concept must first become a manifest record."},{"budgetId":"public-page-budget","status":"review-required","target":"public pages may expand only when tied to user acquisition, onboarding, education, or core product value","currentProblem":"public and internal route types are mixed together","action":"Separate public route strategy from internal architecture route strategy."}],"readinessRules":[{"rule":"Public Static, Internal Dynamic","status":"ready","purpose":"Public entry pages may be static; internal system pages should be dynamic or manifest-rendered.","safeguard":"Do not make the build carry the whole operating system."},{"rule":"Manifest Record Before New Internal Route","status":"ready","purpose":"Any new internal readiness, registry, gate, layer, or foundation concept must first be added to a manifest registry.","safeguard":"No more one-page-per-thought architecture."},{"rule":"Static Pages Need Budget Approval","status":"ready","purpose":"New static pages need a reason: user acquisition, onboarding, education, SEO, or core public product value.","safeguard":"Static is not free just because it works."},{"rule":"Page Data Collection Is A Budget","status":"ready","purpose":"Page data collection time must be tracked like infrastructure cost.","safeguard":"Slow builds are product debt."},{"rule":"CSS Weight Counts Against The Feature","status":"ready","purpose":"A feature that adds unique CSS, repeated shell patterns, or heavy visual blocks must justify that build and maintenance cost.","safeguard":"Pretty clutter is still clutter."},{"rule":"Redirect Only After Hub Parity","status":"ready","purpose":"Old routes can only redirect after manifest record exists, hub renderer works, visual parity is checked, and traffic review passes.","safeguard":"No broken deep links."},{"rule":"Provider Upgrade Comes After Code Fix","status":"ready","purpose":"Vercel or CI upgrades can help later, but route and static generation pressure should be reduced first.","safeguard":"Do not pay more to carry avoidable weight."},{"rule":"No Production Mutation","status":"ready","purpose":"Static Page Budget Policy defines rules only and does not convert, delete, redirect, or mutate routes.","safeguard":"No writes. No sync. No surprise."}],"futureStaticPageBudgetReportShape":{"staticPageBudgetReportId":"stable static page budget report id","pageRoutes":"number","staticPagesGenerated":"number","dynamicPages":"number","apiRoutes":"number","publicStaticPages":"array of approved public static routes","internalStaticViolations":"array of internal routes that should be dynamic or manifest-rendered","manifestEligibleRoutes":"array of routes eligible for hub rendering","topLevelGetCallPages":"array of pages with top-level get calls","pageDataCollectionTime":"measured time","staticGenerationTime":"measured time","productionDeployTime":"measured time","globalCssLines":"number","recommendedAction":"keep-static/force-dynamic/manifest-record/redirect-review/archive-review/css-migrate","productionMutation":"false"},"allowedNow":["Render Static Page Budget Policy.","Define public static page classes.","Define internal dynamic requirements.","Define manifest-render preference.","Define page-data and production deploy budgets.","Define CSS budget targets.","Keep conversion, redirects, deletion, and provider upgrades disabled."],"notAllowedYet":["Convert routes automatically.","Redirect routes.","Delete routes.","Delete CSS.","Upgrade deployment providers.","Mutate build configuration automatically.","Mutate production."],"nextStructuralLayers":["Static Page Budget Policy final audit","Static Budget Scanner Script","Internal Route Dynamic Conversion Batch","Readiness Redirect Review Gate","Strategic Retrieval Location Registry"],"safeguard":"Static Page Budget Policy is read-only and non-destructive. It does not convert routes, delete pages, redirect paths, delete CSS, change deployment settings, expose secrets, or mutate production."}