Files
XZBT-NGN/STEP5-MVP-COMPLETION-REPORT.md
T
2026-09-14 13:01:45 -07:00

395 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# A. Executive result
STEP 5 COMPLETE — NGN MVP COMPLETE — READY FOR STEP 6
Final closure on 2026-09-14: **27/27 automated tests**, **3/3 browser reference
checks**, Haunted House normal operator checks, both SciFi text invocations,
publishing validation, diff check, and genericity checks pass. The original SciFi
argument defect, Haunted House reporting defect, and malformed devlog structure
are resolved. Section R records the final results and evidence.
The existing NGN architecture and validation are unchanged by this closure pass.
No exhibit-specific host logic or Step 6 implementation was added. Earlier
failures and their evidence remain below as historical context, not current gates.
# B. Pre-Step-5 MVP state
Baseline: NGN HEAD `76928f7`, clean at initial inspection. Read the Contract 5.2,
Implementation Plan 5.2, Authoring Guide 5.2, Step 4 report/review, README/AGENTS,
source, fixtures and completion devlog. The owner supplied `docs/implementation_plan.md`
and `docs/walkthrough.md` during the run; these accepted triage/completion notes
were read and preserved. Their permissive metadata interpretation matches this
implementation. Their existing fixture copy notice was confirmed present.
The Step 4 UI already accepted same-origin paths without source edits. Its gaps
were rough presentation, absent loading timeout/status, disabled reconnect after
disconnect, and empty catalog text lost during initial rendering. Capabilities
and diagnostics were raw JSON beside the main workflow. README still contained
extensive starter-template identity/setup instructions.
Baseline `npm test`: 20/20. Initial sandbox execution failed with spawn EPERM;
execution with the required process permission passed. Baseline real browser:
Aquarium loaded through normal UI; the existing transport suite passed 3/3.
# C. Operator connection workflow
The normal URL/path form remains the single entry point. Load exhibit connects
or switches; invalid/off-origin/credential-bearing URLs are rejected before
removing the active frame. Loading is explicit and bounded by a 15-second document
load timer. A completed document without a responding contract uses the existing
5-second request timeout. The URL is remembered in memory for reconnect.
Disconnect cancels pending host work, removes the frame and clears session view.
Reconnect while attached negotiates a new session with the same exhibit instance.
Reconnect after disconnect reloads the remembered location as a new instance;
its initial values/revision need not equal those of the removed instance.
Stale frame load callbacks are ignored after switch/disconnect. No filesystem
picker, mount, remote transport, persistence, or exhibit-specific selector exists.
# D. Operator usability changes
Connection status, identity, version and negotiated contract are prominent.
Controls are grouped by discovered category, with Other as the missing/empty
category fallback. Capabilities are readable ID/state items. State/session data,
full descriptors, events and protocol logs remain available in expandable areas.
Disconnected states explain how to begin. Draft-versus-reported-value behavior is
explained. The latest diagnostic is visible near connection with its timestamp;
Clear log dismisses history. Existing colors and simple layout were retained.
# E. Canonical documentation ownership
README now describes NGN as the project, links canonical Contract/Authoring Guide/
Implementation Plan documents, identifies external SciFi-XZBT and reference
fixtures, and documents startup, workflow, verification and MVP limits. The root
AGENTS ownership paragraph matches the owner's updated instructions. Publishing
management is linked rather than presented as the identity of the application.
Authoritative specifications and external repository documentation were not edited.
The plan's historical roadmap numbering is distinguished from this Step 5 request.
# F. Descriptor validation changes
`validateCatalog` now checks supplied `restorable` values are boolean and supplied
`category` values are strings. Omission remains accepted, as required by the
accepted triage interpretation of Contract section 9's illustrative metadata.
Empty category strings are accepted and use the UI fallback. No new mandatory
fields, category vocabulary, restore behavior, or protocol semantics were added.
Tests cover omission, valid false/true/empty/custom values, and malformed types.
# G. SciFi-XZBT interoperability
Tested the real external working copy at `G:/.vibe/SciFi-XZBT`, HEAD
`179b9db715aaa92999c5bfef451b6877f30079fe`, including its pre-existing local changes
and untracked contract files. Copied only index.html, js/ and css/ unchanged into
ignored `test-fixtures/local/scifi/`. All 12 file hashes matched the source;
[evidence manifest](test-fixtures/evidence/step5-scifi-files.json) identifies the
actual tested contents. This is not a test of HEAD alone or a dist release.
All operations used the normal NGN URL form and descriptor-generated controls.
| Check | Observed result |
| --- | --- |
| Connect, hello/session, describe, state.get | Pass: SciFi-XZBT 5.2.0 / Contract 5.2, 61 targets, registry revision 1 |
| Range | Master Volume 0.75 to 0.42; reported value and event matched |
| Boolean/state | Master Mute false to true; matched |
| Selection/preset | Main Engineering selected; related state events shared revision 5 |
| Observation | true then false; matching state reports and events |
| Argumentless impulse | Comm Badge Chime accepted, action.executed received |
| Contextual unavailability | Demat in Starfleet returned CAPABILITY_UNAVAILABLE without deleting target |
| Universe | Whataverse selected; Demat then emitted action.executed |
| Text argument invoke | Initially failed with legacy args.text. Follow-up PASS: both expose arguments arrays and emit action.executed with exact submitted text; see section Q. |
| Incoming events | state.changed, selection.changed, capability.changed, action.executed observed, with source/correlation where supplied |
| stateRevision / sequence | Separate counters tracked; saved session ended at revision 6 / sequence 31 |
| Reconnect attached | New session, revision 6 preserved, sequence baseline null |
| Disconnect / reconnect again | Frame removed and URL reloaded; new session and fresh instance state, revision 0 |
[saved session evidence](test-fixtures/evidence/step5-scifi-session.json) contains
actual descriptors, events, metadata and errors. Per Contract section 9.5, missing
arguments metadata is tolerated as empty; NGN must not infer undocumented
arguments from the legacy field. The authorized correction and narrow normal-UI
rerun are now complete (section Q). Context-gated actions and a large fixed preset
list are conformant but can be awkward; no domain-specific UI logic was added.
Audible fidelity, optional AI model preparation, and all SciFi actions are not
certified by these representative checks.
# H. Reference exhibit regression (initial run; closure results in R)
| Exhibit | Normal operator checks | Result |
| --- | --- | --- |
| Aquarium (12 targets) | Population 16, Paused true, Blue Tang selection, Feed, reconnect, disconnect/reload | Pass; events/readback and new session observed |
| Planetarium (14 targets) | Azimuth 0.75, Sky frozen true, Cygnus, Advance time with minutes 30, reconnect | Pass; declared argument delivered and action event captured |
| Haunted House (13 targets) | Haunt level 0.5, Held true, Library, Manifest, reconnect | Writes/session pass; Manifest event received, but transient snapshot violates declared 0.01 step |
The earlier independent transport-style browser suite passed 3/3. The latest
rerun passes 2/3, failing Haunted House's haunt-level step validation. Source
inspection also corrects the earlier claim that the suite avoids Manifest: its
first impulse without capability requirements is `action.manifest`. The fixture
also drifts haunt level continuously before it is paused, so off-step snapshots
are not confined to that action. The earlier additional Manifest case exposed:
NGN reports INVALID_MESSAGE for room.haunt-level and preserves its previous cache
instead of accepting a value outside the descriptor's step. This is not a Step 5
host regression or a reason to weaken validation. No fixture source changed.
These are the previously corrected AbacusAI fixtures, not pristine upstream
implementations. Corrections remain documented in `test-fixtures/PROVENANCE.md`.
Neither 3/3 nor the operator checks certify every fixture action/state transition.
# I. Initial automated test results (final count in R)
`npm test`: **25 passed, 0 failed**, including all 20 existing tests and five
new connection/metadata tests. Coverage added: accepted/rejected URL forms,
invalid URL preserving a frame, stale loads after switching/disconnect,
reconnect with and without a frame, load timeout/recovery, optional metadata types.
Existing host tests cover invalid sessions, sequence/revision gaps, pending
snapshot races, stale sessions, transport origin/source and server boundaries.
`git diff --check`: passed after line-ending normalization of authored files.
`python devlog_editor.py --validate`: **failed on pre-existing content**:
`.labyricorn/devlog/post-step-4-completion/contents.lr: empty or malformed record block`.
The trailing separator is present in HEAD and that file is unchanged. Publishing
record repair was not included in this application milestone. Do not read the
historical Step 4 validation claim as a successful validation of the current tree.
# J. Browser/runtime verification
Local Codex in-app Chromium, 2026-09-14. Normal UI verified on loopback port 4173.
A new `npm start` process succeeded on 4175 (4173 was already occupied); final
reference suite ran against that fresh process and printed timestamped 3/3 output.
See [browser results](test-fixtures/evidence/step5-reference-suite.txt), the three
reference JSON snapshots and [operator screenshot](test-fixtures/evidence/step5-operator.jpg).
The missing-exhibit URL hit LOAD_TIMEOUT in this browser and a valid URL recovered
to connected/synchronized. Initial and disconnected views, loading, switching,
attached reconnect, disconnect/reload, discovery and real controls were checked.
A browser tab disappeared once during verification; a new tab resumed the remaining
checks, including a repeated successful SciFi disconnect/reload.
No separate pristine checkout was created. Startup and tests run directly from
current source, with no dependencies/build products or hidden source edits.
External SciFi assets must be supplied separately using the documented commands.
This is local Chromium evidence, not cross-browser or clean-checkout certification.
# K. Genericity verification
Case-insensitive scan of `src/`, `public/`, `server/` for
`scifi|aquarium|planetarium|haunted|tank\.|sky\.|room\.|universe|preset|speech|warp`
returned no matches. Diff review confirms controls depend on descriptors and
categories only. Exhibit names/paths are confined to documentation, tests and
ignored runtime copies. No transport architecture changes or Step 6 features
were introduced. No SciFi internals were used to infer NGN behavior.
# L. Files changed
- `.gitignore`: ignore locally supplied external exhibit copies.
- `AGENTS.md`, `README.md`: canonical ownership, operator instructions and boundaries.
- `src/connection.js` (new): URL/frame lifecycle helper.
- `src/ui.js`, `public/index.html`, `public/style.css`: connection and usability pass.
- `src/validation.js`: supplied optional metadata type checks.
- `tests/connection.test.js` (new): five focused tests.
- `test-fixtures/host-verification.js`: timestamped page/console output.
- `test-fixtures/STEP5-VERIFICATION.md` (new): repeatable operator and external setup checks.
- `test-fixtures/evidence/` (new): six JSON/text evidence files and one screenshot.
- `STEP5-MVP-COMPLETION-REPORT.md` (new): this report.
The owner's newly supplied `docs/implementation_plan.md` and `docs/walkthrough.md`
remain unmodified. Production host/session implementation, transport and server
were not changed during closure. The earlier follow-up changed only SciFi's
contract adapter externally; closure makes no external source changes. Section R
lists the final fixture, devlog, test, and evidence changes. Nothing was staged,
committed or pushed.
# M. Known limitations
The SciFi descriptor, Haunted House reporting, and publishing validation defects
are resolved. External source provenance is a working-copy hash manifest,
not a reproducible released commit. A fresh checkout was not independently tested.
One trusted same-origin exhibit only; last URL, cache and logs are in memory.
Disconnect destroys the exhibit instance. Drafts reset on rediscovery. Large
catalogs require scrolling; controls use numeric inputs. No idle polling or
complete cross-browser/audio certification. These limits are visible/documented,
not hidden by a host-specific workaround.
# N. Deferred roadmap features
No multi-surface presentation, casting/display endpoints, second-monitor output,
Google TV, MIDI, MCP, webhooks, scenarios, recording, telemetry acquisition,
multi-exhibit orchestration, remote automation, persisted operator configuration,
plugins, databases, accounts, cloud services, commercial licensing or production
branding. Nothing in the broader Implementation Plan makes these MVP features.
# O. Step 6 prerequisites
The Step 5 gate has passed with all three defects resolved, without waivers.
The next planned work is listed below. This closure pass stops here and does not
begin Step 6 implementation.
The owner's planned Step 6 sequence remains unimplemented:
6.1 Define the Multi-Surface Model
6.2 Build a Minimal Multi-Surface Reference Exhibit
6.3 Add Generic Surface Discovery to XZBT-NGN
6.4 Implement Local Multi-Surface Rendering
6.5 Prove Shared-State Synchronization
6.6 Validate the Reference Exhibit End-to-End
6.7 Adapt SciFi-XZBT Observation to the Surface Model
6.8 Test Multi-Surface Behavior Against SciFi-XZBT
6.9 Step 6 Conformance and Architecture Review
6.10 Step 6 Completion Gate
# P. Final verdict
STEP 5 COMPLETE — NGN MVP COMPLETE — READY FOR STEP 6
# Q. Historical descriptor follow-up and unsuccessful gate rerun
Date: 2026-09-14. This section records the resolved SciFi failure and the subsequent
2/3 gate failure; final closure in R supersedes its gate status. The broader operator checks in G/H/J are prior evidence;
this follow-up reran only the requested two SciFi targets and the acceptance checks.
## Patch and provenance
External file: `G:/.vibe/SciFi-XZBT/js/contract-adapter.js`. Both descriptors now
publish `arguments: [{ name: 'text', type: 'string', required: true, maxLength }]`,
with limits 2000 for speech and 512 for ticker. The validator consumes that array
for required, type, length and unknown-key checks. Invoke payloads correctly keep
the Contract's `args` object. No host fallback for legacy descriptors was added.
The source HEAD remains `179b9db715aaa92999c5bfef451b6877f30079fe`; the adapter is
an existing untracked working-copy file. A fresh ignored copy was created at
`test-fixtures/local/scifi-arguments/`. All 12 runtime files match source SHA-256
hashes in [the new manifest](test-fixtures/evidence/step5-scifi-arguments-files.json).
The original manifest and failing session evidence are retained unchanged.
The external packaging script also successfully generated `standalone.html` in
that ignored directory. It is a local working-copy build, not a released artifact;
offline packaged-runtime behavior was not separately certified in this narrow run.
## Normal operator UI results
A fresh `npm start` served port 4173. Local Chromium loaded the corrected source
copy through the URL form, negotiated Contract 5.2, and discovered 61 targets.
Both descriptor-generated text fields appeared. Clicking their Invoke buttons
produced the following incoming events in session `sess-inf3scqz`:
| Target | Submitted text | Result |
| --- | --- | --- |
| speech.say | NGN Step 5 speech interoperability check. | action.executed, sequence 1, correlationId ngn-2-4, source host |
| display.ticker | NGN Step 5 ticker interoperability check. | action.executed, sequence 2, correlationId ngn-2-6, source host |
Both events contain the exact submitted `args.text`. State revision remained 0,
as appropriate for these transient impulses. Speech then reported capability
ready at sequence 3. The protocol log contained only session establishment; the
browser reported no warning/error console entries at capture time. This verifies
invocation acceptance and events, not audible fidelity or AI preparation.
See [captured UI and descriptors](test-fixtures/evidence/step5-scifi-arguments-ui.json).
After preserving the adapter's original LF line endings, the fresh source copy
was reloaded and both operations were repeated. The manifest identifies this
final copy. In session `sess-igidi1h9`, speech succeeded at sequence 1 with
correlation `ngn-4-13`; ticker succeeded with the exact text at sequence 5 with
correlation `ngn-4-19`. Speech capability rediscovery cleared a draft during this
repeat, so an intervening ticker event contains an empty string; re-entering the
text and invoking again succeeded. This is the documented draft-reset behavior.
The later capture also includes a native `transport.playing` event with source
`ui`, revision 1, and speech capability transitions. Those are retained without
attributing the native state change to the transient text operation. See the
[final-source UI capture](test-fixtures/evidence/step5-scifi-arguments-ui-final.json).
## Acceptance results at the descriptor follow-up
| Check | Latest result |
| --- | --- |
| NGN npm test | PASS: 25/25 after permitting Node worker spawning (sandbox first returned EPERM) |
| External adapter syntax | PASS: node --check |
| Focused external adapter checks | PASS: metadata; missing/null/wrong-type/unknown/overlength rejection before execution; exact maximum length accepted; argumentless invocation preserved |
| Normal UI: speech.say and display.ticker | PASS: 2/2 |
| Reference browser suite | FAIL: 2/3; Aquarium and Planetarium pass, Haunted House reports off-step room.haunt-level |
| Publishing validation | FAIL: unchanged post-step-4-completion record has an empty/malformed trailing block |
| NGN git diff --check | PASS |
| Genericity scan of src/public/server | PASS: no exhibit-specific vocabulary matches |
The browser gate ran from `2026-09-14T19:41:45.445Z` to
`2026-09-14T19:41:45.575Z`; [actual output](test-fixtures/evidence/step5-acceptance-rerun-browser.txt)
is retained without replacing it with the earlier 3/3 result. The Haunted House
fixture files are unchanged. Its continuous drift and Manifest can produce
values that conflict with the descriptor's 0.01 step; NGN validation was not weakened.
Follow-up NGN changes: this report, README, STEP5-VERIFICATION, the optional
`test-fixtures/check-scifi-arguments.cjs` regression script, and new evidence
files. Run the external check with:
```powershell
node test-fixtures/check-scifi-arguments.cjs G:/.vibe/SciFi-XZBT/js/contract-adapter.js
```
At that point the SciFi fix was complete but Step 5 completion was withheld for
two remaining failures. The final authorized closure below resolves both.
# R. Final Step 5 closure
Date: 2026-09-14. Final browser suite ran at **19:55:22.193–19:55:22.342 UTC**;
operator verification continued through the SciFi text events at **19:57:23 UTC**.
These are new closure results, not historical counts copied forward.
## Minimal repairs
- `test-fixtures/reference-exhibits/haunted-house/exhibit.js`: its shared reader
now reports `Math.round(clamp(h.hauntLevel, 0, 1) * 100) / 100`. This uses integer
hundredths without cumulative rounding, conforms to the existing 0–1/0.01
descriptor, and leaves the internal continuous simulation untouched. Both
snapshots and mutation events use this reader. Manifest still reaches 1 and
the model resumes drifting when released.
- `.labyricorn/devlog/post-step-4-completion/contents.lr`: removed the final `---`
that created an empty record block. All meaningful content and fields remain
unchanged. Its source commit exists and retains the recorded 2026-09-14 date.
- `tests/haunted-house.test.js`: two focused regressions use the actual exhibit
and contract core, with canvas construction stubbed. They test bounds and
rounding, 600 simulation steps for each of 20 room/spirit combinations, full
snapshots during post-Manifest drift, mutation events, and Calm. They use
unchanged NGN reported-value validation and assert that reading does not
quantize the internal simulation.
## Final acceptance results
| Acceptance check | Final result | Evidence |
| --- | --- | --- |
| Automated tests | PASS: 27 tests, 0 failures (25 existing + 2 fixture regressions) | [Command output](test-fixtures/evidence/step5-closure-checks.json) |
| Browser reference suite | PASS: 3/3, Aquarium / Planetarium / Haunted House | [Timestamped output](test-fixtures/evidence/step5-closure-browser-suite.txt) |
| Haunted House normal UI | PASS: held true, haunt level 0.5, Library selection, Manifest reports 1, release and refresh report 0.93 then 0.26, reconnect synchronized | [Snapshots and events](test-fixtures/evidence/step5-closure-haunted-house.json) |
| Corrected SciFi text targets | PASS: both arrays/fields present; exact text accepted in action.executed | [Final UI capture](test-fixtures/evidence/step5-closure-scifi.json) |
| Publishing validation | PASS: `devlog-editor: devlog is valid` | [Command output](test-fixtures/evidence/step5-closure-checks.json) |
| git diff --check | PASS | Final review |
| Genericity scan | PASS: no matches in src/public/server for the vocabulary in K | Final review |
| Architecture and validation | Unchanged in this closure pass; no host workaround | Diff review |
| Step 6 features | None implemented | Diff review |
Haunted House session `sess-12844` recorded valid writes and Manifest, with no
protocol errors. Attached reconnect established `sess-29bfc`, preserving revision
4 and resetting the sequence baseline. The continuous visual model remains active;
refreshed reports conform to the descriptor. No additional invalid state was
observed in the focused model tests or normal operator checks.
SciFi session `sess-319js95v` accepted `Step 5 final closure ticker check.` at
sequence 1 / correlation `ngn-5-23` and `Step 5 final closure speech check.` at
sequence 2 / correlation `ngn-5-25`, both with source `host`. All 12 source and
served-file hashes still match the corrected manifest from Q. No external SciFi
file was changed in this pass. Audio fidelity and optional AI preparation remain
outside this narrow interoperability claim.
The browser used the running normal loopback server on port 4173. Automated
execution required the existing permission for Node worker spawning after a
sandbox EPERM. This is local Chromium and current-working-tree evidence; it does
not expand the cross-browser or released-artifact claims.
## Closure files and handoff
In addition to the two repairs and focused test file, closure updates
`test-fixtures/PROVENANCE.md`, `test-fixtures/STEP5-VERIFICATION.md`, `README.md`,
this report, and the four new `step5-closure-*` evidence files. Earlier failed and
corrected-follow-up evidence is preserved. Product code and the browser harness
remain unchanged during closure. Existing unrelated edits are preserved.
All nine acceptance criteria pass. The planned next work is the ten-item Step 6
sequence in O, starting with **6.1 Define the Multi-Surface Model**. No Step 6 work
has begun. No staging, commit, push, or publication was performed; public-site
synchronization was not checked.