Skip to content

Completion Report: ANU-10 - Prove Anuva Bento Web Feasibility

Status: Ready for draft PR review.

Recommendation: proceed to ANU-11 contract work under the revised, Web-sufficient ANU-10 plan. This recommendation does not claim Unity/Vuplex compatibility or performance results.

Implementation summary

The spike preserves Bento v1.0.8 as the structured editor and rendering base, then adds an isolated Anuva adapter with:

  • a provisional versioned envelope containing independent Main, Companion, and transparent Emphasis documents plus one ordered timeline;
  • a versioned host/player protocol and same-origin message bridge;
  • a read-only player driven by reset, absolute seek, and external tick;
  • a three-iframe Web host that simulates the later authoritative Unity clock;
  • an editor entry that materializes external assets for editing and dehydrates them before serialization;
  • embedded font readiness and external image, SVG, chart-data, and media readiness;
  • an Anuva-only hard-offline build seam; and
  • semantic template reapplication with an explicit unsafe-mapping result.

The envelope, protocol, and restrictions are feasibility evidence only. ANU-11 must decide the production contract.

Provisional contract and API

The envelope identifies contract anuva/bento-presentation, contract version 1, runtime 1.0.8-anu10-spike, all three named surfaces, their viewports and transparency, external asset bindings, and one absolute-time event stream.

The protocol identifies anuva/bento-player, version 1. It exercises:

  • load, reset, seek, tick, show, hide, clear, and diagnostics;
  • ready, assets-ready, state-changed, animation-complete, and structured error events; and
  • request identity, exact protocol/runtime versions, same-origin validation, and parent-window source validation.

The read-only player is separate from the editor, Reveal presenter, update UI, speaker view, and collaboration session.

Asset and network evidence

Asset kind Serialized policy Runtime proof
Font Required binary embedded as data:font/...;base64 Fraunces WOFF2 loaded before assets-ready; no font request
Image External binding only Main photo loaded from the configured local asset URL
SVG External binding only; no inline markup External SVG materialized as a runtime image and restored to a payload-free binding
Chart Options may be embedded; dataset/snapshot may not External JSON merged for rendering and removed during dehydration
Media External binding only Companion audio referenced the generated external local WAV

Validation rejects non-font document assets, missing embedded font data, embedded image/audio/video URIs, inline SVG markup, embedded chart arrays, unsafe asset schemes, missing external bindings, and unsafe HTML.

The Anuva build defines hard offline mode before importing the editor. Both automatic and manual public update paths return before fetch, and the existing offline collaboration guard stays enabled. The request allowlist accepts only the player origin or exact configured asset URLs and rejects representative bento.page update and sync.bento.page collaboration endpoints. Web playback completed with local player resources and configured local external assets; it did not require a public Bento service.

Determinism and Web-host evidence

The player derives surface visibility, slide state, and enter progress from the absolute host time. The Web harness proved that:

  • asset readiness occurs before playback comparison;
  • sequential host ticks produce the same normalized state as reset followed by direct absolute seek;
  • reset restores Main and Companion at time 0 with Emphasis hidden;
  • arbitrary seek to the representative state checkpoint shows the expected Main content and Companion media state;
  • Emphasis is transparent, shows transient content at its timed checkpoint, and hides again; and
  • repeated checks across all three surfaces produce identical fingerprints.

The browser editor smoke loaded the existing Bento editor with representative intro and state slides, including text, image, chart, and SVG-derived content.

Template evidence

Compatible role/id mapping preserves representative title and body semantics, keeps user-owned extras, and fills layout-owned targets. A deliberately ambiguous mapping produces an explicit unsafe result rather than silently dropping content.

Acceptance evidence

Acceptance area Result Evidence
Reproducible baseline Pass npm ci, normal build, single-file build, and 45,362 sync checks
Maintainable boundary Pass Isolated slides/src/anuva/ source; one narrow existing-source seam in update.ts
Existing structured editor Pass Browser smoke loaded representative Main fixtures in the upstream editor
Shared Web player Pass Dedicated read-only entry rendered all three representative surfaces
External authoritative clock Pass for revised plan Web host simulated reset, arbitrary seek, and tick deterministically
Transparent Emphasis Pass Transparent surface showed and hid transient content at fixed checkpoints
Asset readiness Pass Embedded fonts and external image/SVG/chart/media gated assets-ready
Asset serialization policy Pass 29 checks reject embedded non-font payloads and missing embedded fonts
Offline behavior Pass Hard-offline build plus origin/asset allowlist; no public Bento service required
Semantic template reapplication Pass Compatible mapping preserved content; ambiguous mapping was unsafe
Upstream synchronization Pass Fetched 55e4d0f, zero-conflict disposable merge, all regression checks passed
Unity/Vuplex Deferred Explicitly removed from ANU-10 verification by approved plan
Performance/profiling Deferred Explicitly removed from ANU-10 verification by approved plan

Verification commands and results

Command Result
npm ci Passed; 0 reported vulnerabilities
npm run build Passed
Windows PowerShell single-file build equivalent Passed; 580 KB compressed shell
node ..\scripts\test-sync.ts Passed; 45,362 checks
npm run test:anuva Passed; 29 checks
npm run build:anuva Passed
Browser host self-test Passed
Browser editor smoke Passed
Disposable upstream rehearsal versions of the above builds/tests Passed
git diff --check Passed

Tool identity: Node v24.18.0, npm 10.9.2, Vite 7.3.6, and TypeScript 5.8.3.

Documentation and preview URLs

Every page below returned HTTP 200 and matched the fresh strict build:

Product Main synchronization

After this draft PR is reviewed and merged, Product Main should ingest this report, explicitly accept the two deferrals, and record the go decision before ANU-11 starts. This repository does not start a production issue or mark the parent change complete.

Remaining risks and skipped checks

  • Unity/Vuplex embedding, transparency, message transport, and capture behavior remain unverified.
  • Performance and profiling remain unmeasured.
  • The production contract must define supported seekable transitions, media behavior, chart schema, asset authentication, error taxonomy, and exact readiness semantics.
  • The provisional dehydrator's recursive chart-data stripping should be replaced with a final-schema-specific rule.
  • Upstream rewrote the v1.0.8 release commit on main; downstream must retain immutable commit provenance and use rehearsed merges.
  • The one non-Anuva source seam in slides/src/update.ts must be watched during future upstream syncs.