Steps 6.4-6.7B — Local surfaces, reference-exhibit validation, SciFi Observation surface

One commit for the work accumulated in the working tree since Step 6.3,
which had never been split into per-step commits:

- src/local-surfaces.js + src/surface-url.js (new); src/ui.js,
  src/validation.js, src/connection.js and public/index.html updated for
  local-surface hosting and generic surface rendering
- tests: local-surfaces (20), scifi-surfaces (24) and postmessage-interop (7)
  new; connection/museum-gallery/surface-validation suites updated
- reference exhibits: shared/contract-core.js defaults to Contract 5.3
  (major 5, minor 3, xzbt 5.3); museum-gallery advertises its surface
  catalog; aquarium/haunted-house/planetarium adapters updated
- SciFi-XZBT (Step 6.7A/6.7B): surface-mode.js + surface-bus.js,
  Observation-surface boot branch, local-change hooks, view.pillars /
  view.warp-flight targets; fixture byte-identical to G:/.vibe/SciFi-XZBT
- SciFi-XZBT contract adapter handshake fix: the inbound bridge filter no
  longer gates on an exact advisory xzbt value (Contract 5.3 §6.5), only on
  its presence/type, matching the host's own envelope validation; the
  adapter now advertises contract minor 3 / version 5.3.0, which it already
  implemented via the 5.3 surfaces field. Root cause of the five failing
  postmessage-interop tests (host hello was silently dropped).
- docs: architecture 6.4 and 6.7A, reference 6.6 and 6.7; evidence logs;
  test-fixtures/PROVENANCE.md resync record

Test results: NGN 154/154 (was 149/154); postmessage-interop 7/7 (was 2/7);
SciFi contract harness 21/21, real-adapter suite 32/32. git diff --check
clean for changed files; two pre-existing trailing-whitespace lines remain
in test-fixtures/reference-exhibits/scifi/index.html, copied verbatim from
the authoritative SciFi source.

Step 6.7 live verification (browser Observation, packaged standalone) is
still pending and is not claimed here.
This commit is contained in:
2026-09-14 19:45:27 -07:00
parent ed76cf6189
commit 745912e451
40 changed files with 5346 additions and 210 deletions
@@ -0,0 +1,172 @@
- banner:
- heading "XZBT-NGN Exhibit Engine" [level=1]
- paragraph: Contract 5.2/5.3 · One exhibit at a time
- main:
- heading "Connection" [level=2]
- generic: Exhibit URL (same origin)
- textbox "Exhibit URL (same origin)":
- /placeholder: /public/exhibits/example/index.html
- text: http://127.0.0.1:4173/test-fixtures/reference-exhibits/museum-gallery/control.html
- button "Load exhibit"
- button "Reconnect"
- button "Disconnect"
- paragraph: Enter a trusted exhibit's local served path or a URL on this origin. Load exhibit also switches exhibits. Reconnect starts a new session, or reloads the last exhibit after disconnect.
- status: connected · synchronized
- paragraph: Museum Gallery · 0.1.0 · Contract 5.3
- paragraph: "Exhibit location: http://127.0.0.1:4173/test-fixtures/reference-exhibits/museum-gallery/control.html"
- iframe:
- banner:
- heading "Museum Gallery — Control Room" [level=1]
- generic: Primary surface · Contract 5.3 · standalone-capable
- generic: host attached
- main:
- paragraph: The Orrery
- paragraph: "Lighting: 60%"
- paragraph: "Rotation: 0.4x"
- paragraph: "Labels: ON"
- paragraph: "Attached non-primary surfaces: 0"
- complementary:
- heading "Artifact" [level=2]
- generic: Selected artifact
- combobox "Selected artifact":
- option "The Orrery" [selected]
- option "Star Map"
- option "Meteorite Fragment"
- heading "Environment" [level=2]
- generic: Lighting level
- generic: 60%
- slider "Lighting level 60%"
- generic: Rotation speed
- generic: 0.4x
- slider "Rotation speed 0.4x"
- generic: Labels enabled
- button "Toggle" [pressed]
- heading "Actions" [level=2]
- button "Flash spotlight"
- contentinfo:
- generic: Control Room
- generic: Control Room standing by.
- heading "Exhibit controls (5)" [level=2]
- generic "Capabilities"
- paragraph: Reported values are authoritative. New values are drafts; select Set or Invoke to submit. Rediscovery resets drafts.
- heading "gallery" [level=3]
- article:
- heading "Selected Artifact" [level=3]
- code: artifact.selected
- paragraph: selection · readable · writable
- status: "Reported value: \"the-orrery\""
- generic "Target descriptor"
- paragraph
- text: New value
- combobox "New value":
- option "The Orrery" [selected]
- option "Star Map"
- option "Meteorite Fragment"
- button "Set"
- article:
- heading "Lighting Level" [level=3]
- code: lighting.level
- paragraph: range · readable · writable
- status: "Reported value: 0.6"
- generic "Target descriptor"
- paragraph
- text: New value
- spinbutton "New value": "0.6"
- button "Set"
- article:
- heading "Rotation Speed" [level=3]
- code: rotation.speed
- paragraph: range · readable · writable
- status: "Reported value: 0.4"
- generic "Target descriptor"
- paragraph
- text: New value
- spinbutton "New value": "0.4"
- button "Set"
- article:
- heading "Labels Enabled" [level=3]
- code: labels.enabled
- paragraph: state · readable · writable
- status: "Reported value: true"
- generic "Target descriptor"
- paragraph
- text: New value
- checkbox "New value" [checked]
- button "Set"
- heading "action" [level=3]
- article:
- heading "Spotlight Flash" [level=3]
- code: action.spotlight-flash
- paragraph: impulse · not readable · not writable
- status: No persistent value reported.
- generic "Target descriptor"
- paragraph
- button "Invoke"
- heading "Presentation surfaces (3)" [level=2]
- paragraph: Open Contract 5.3 presentation surfaces locally below. URLs resolve against the supplying exhibit. Disconnecting or switching exhibits closes these views. Remote/cast displays remain deferred.
- article:
- heading "Control Room" [level=3]
- code: surface.control
- generic: Primary
- generic: "Role: control"
- paragraph: "URL: control.html"
- status: Open in the authoritative control frame. Use Connection controls to reload or disconnect.
- button "Open" [disabled]
- button "Reload" [disabled]
- button "Close" [disabled]
- article:
- heading "Artifact Display" [level=3]
- code: surface.artifact
- generic: Non-primary
- generic: "Role: ambient"
- paragraph: "URL: artifact.html"
- status: open
- button "Open" [disabled]
- button "Reload"
- button "Close"
- iframe:
- banner:
- heading "Museum Gallery — Artifact Display" [level=1]
- generic: Non-primary surface · attaches to the Control Room
- generic: surface
- main:
- paragraph: The Orrery
- paragraph: "Lighting: 60%"
- paragraph: "Rotation: 0.4x"
- paragraph:
- button "Cycle artifact"
- paragraph: Attached to Control Room.
- contentinfo:
- generic: Artifact Display
- generic: Waiting for shared state.
- article:
- heading "Information Wall" [level=3]
- code: surface.info-wall
- generic: Non-primary
- generic: "Role: information"
- paragraph: "URL: info-wall.html"
- status: open
- button "Open" [disabled]
- button "Reload"
- button "Close"
- iframe:
- banner:
- heading "Museum Gallery — Information Wall" [level=1]
- generic: Non-primary surface · attaches to the Control Room
- generic: surface
- main:
- paragraph: The Orrery
- paragraph: "Labels: ON"
- paragraph:
- button "Toggle labels"
- paragraph: Attached to Control Room.
- contentinfo:
- generic: Information Wall
- generic: Waiting for shared state.
- heading "State and metadata" [level=2]
- button "Refresh state"
- generic "Session and exhibit metadata"
- generic "Current persistent state"
- heading "Protocol diagnostics" [level=2]
- generic "Incoming events"
- generic "Protocol and errors"