generated from Labyricorn/labyricorn-project-template
- src/validation.js: add validateSurfaceCatalog() implementing Contract 5.3 §§31.2-31.5 normative validation order (validate individuals -> discard invalids -> evaluate primary invariant against working set) - src/host.js: emit xzbt:5.3 advisory (§6.5); store contractMinor; add surfaces=[] to resetView(); parse surfaces in refresh(true) - src/ui.js: add buildSurfaces() for generic descriptor-driven surface display; integrate renderedSurfaces tracking into render() - public/index.html: subtitle updated to Contract 5.2/5.3; add surfaces-section with surfaces div - public/style.css: add .surface, .surface-badge, .surface-meta styles - tests/surface-validation.test.js: 45 new tests covering all Part 8 malformed surface cases, lifecycle, registry refresh, 5.2 regression - docs/reference/XZBT-NGN-Step6.3-Surface-Discovery-Verification.md Test results: 88/88 pass (43 pre-existing + 45 new) Genericity scan: zero matches in src/, public/, server/ git diff --check: clean