docs/waves/prd-waves-desktop-application-completion.md
PRD: Waves Desktop Application Completion
Status: decision-ready discovery and implementation plan
Last updated: 2026-07-30
Implementation checkpoint: origin/main 6cf1682a
Owner lane: browser, with explicit dependencies on engine-wasm, transport-rust, and the
public WAP lab program
1. Summary
Waves has a credible WAP/WML runtime, bounded transport/frame path, native shell and commands, versioned application-state foundation, local examples, Favorites domain, safe diagnostic projection, and bounded engine/host debug-session foundation. It does not yet provide the integrated organization, phase-aware recovery, or WAP-specific Inspector expected from a complete desktop application.
This plan turns Waves into a focused, single-session desktop WAP workbench. It prioritizes fast entry into useful WAP content, safe favorites and application state, truthful recovery, native desktop behavior, and a bounded WAP inspector without turning Waves into a modern HTML browser or moving WML/WBXML behavior into the wrong layer.
This document is a product and implementation-planning authority. It does not activate proposed work-item IDs or replace status in:
docs/waves/WORK_ITEMS.md;docs/waves/ENGINE_HOST_FRAME_WORK_ITEMS.md;docs/waves/ENGINE_DEBUG_CONNECTOR_PLAN.md;docs/waves/PUBLIC_WAP_LAB_PRERELEASE_PLAN.md; ordocs/waves/wap-1.2.1-compliance-program.json.
When a proposed slice is authorized, adopt it into the owning ledger rather than tracking its execution status here.
2. Contacts
| Contact | Role | Responsibility |
|---|---|---|
| Dylan Steele | Product owner and maintainer | Product decisions, release scope, public-service authorization, supported platforms |
| Browser product owner | To assign per slice | Shell, application state, favorites, settings, commands, accessibility |
| WaveNav engine owner | To assign per slice | Frame/input semantics, debug recorder, runtime parity |
| Lowband transport owner | To assign per slice | Request lifecycle, phase metadata, cancellation, WBXML/raw-payload boundaries |
| Public WAP lab owner | To assign before exposure | Service availability, security notice, publication gate, rollback |
| Release/QA owner | To assign before pre-release | Packaging, signing, end-to-end matrix, support artifacts |
3. Background
3.1 Product opportunity
Waves should feel like a deliberate native WAP/WML application rather than an emulator harness or a website inside a Tauri window. The central emulation surface should preserve period-constrained WML behavior while the host chrome provides modern reliability, accessibility, organization, and diagnostics.
The product opportunity is:
Help WAP/WML implementers, evaluators, preservationists, and learners discover, revisit, test, and diagnose authentic WAP content from a dependable desktop application without making them reconstruct configuration or interpret raw engine state on every launch.
3.2 Why now
The foundations required for application-quality work now exist:
- The Rust transport owns HTTP/WAP fetch, connectionless WSP, WBXML decode, error mapping, and request bounds.
- The engine owns deterministic deck/card navigation, focus, form editing, timers, scripts, and the canonical frame/affordance contract.
- The browser has a responsive shell, native menus, accessibility evidence, local examples, hybrid history, stable navigation coordination, and a collapsed diagnostic drawer.
- A private first-party WAP preview deployment and deterministic origin exist, although public publication remains gated.
- The generated bounded debug connector, engine recorder, host lifecycle, and read-only Inspector capture workflow are implemented; external tools and mutable debugger capabilities remain later.
These foundations make it possible to add application features without inventing parallel WML or transport behavior in the frontend.
3.3 Current-state inventory
| Capability | Implemented at the 2026-08-02 checkpoint | Gap |
|---|---|---|
| Desktop identity | Tauri identity and native menus plus one shared application-command registry, versioned native application-state store, asynchronous window restore, and crash marker | Production packaging/updater and user-facing import/export workflows |
| Browsing shell | Back, Reload, location, Go/Stop lifecycle, Local/Network, route/profile readouts, Canvas handset stage, status, Welcome/Help, and local examples | Integrated Home/Favorites/Services Library, visible history, recent locations, and Preferences surface |
| Runtime path | Transport-first engine load, deterministic session state, bounded single-pass frame output, Canvas rendering, cancellable navigation, and atomic committed-frame publication | F2 pointer/scroll/softkey cutover and final legacy-path removal |
| History | In-memory engine card history plus request-shaped host deck history | Persistence, search, retention policy, and duplicate same-card preservation across deck replacement (#450) |
| Diagnostics | Safe timeline projection plus bounded, masked D0-02 events/snapshots, D0-03 host sessions, and the D0-04 read-only Inspector/capture workflow | External tooling and any separately designed controlled replay |
| Settings | Versioned schema/store, native atomic backend, migration, reset/clear operations, memory test adapter, integrated Preferences, window restore, and safe-session recovery | Broader diagnostic/accessibility controls |
| Onboarding | Welcome/Help, tutorial deck, and migration of the isolated launch preference into versioned application state | Broader task progress and contextual onboarding remain later work |
| Public services | Live exact-host public deployment, deterministic first-party origin, bounded positive probes, safe Favorites/service-catalog domain, and publication-state model | Publication-governance reconciliation, guided entry, negative/operations evidence, and desktop release gates remain open |
3.4 Current overlap and blockers
At the synchronized 0028946e baseline:
- PRs
#502,#517through#536, and#538are merged. The redesigned shell, canonical Canvas/frame path, cancellation, bounded render/IPC surfaces, Favorites domain, application state, native command registry, safe diagnostic projection, truthful navigation errors, D0-03 debug host bridge, D0-04 Inspector, F2-01 click input, public-lab documentation, and selective CI/docs maintenance gates are the current integration baseline. The open/draft PR queue is empty at this checkpoint. - Issue
#450blocks persistent/searchable history because same-card entries can be lost across a deck boundary. - Issue
#504is resolved by bounded presenter/history state. The 32-entry host window does not fix#450; persistent/searchable history remains blocked on that separate identity correction.
Independent streams retain their own responsibilities:
- the landed visual/shell baseline owns shell structure and presentation only;
- browser resilience owns lockup, failure containment, and current correctness issues;
- the WAP testing CLI owns batch execution, corpus traversal, scripting, and conformance reporting;
- the public-service stream owns deployment, service content, publication state, and rollback; and
- frame migration owns engine-rendered presentation, hit regions, and typed input semantics.
3.5 Product and architecture constraints
- Waves is a WAP/WML browser and emulator, not a general modern browser.
- The browser must not parse WBXML, resolve WML tasks, or create a second WML DOM/runtime.
- The engine must not fetch network content.
- The transport must not own user-interface state or rendering.
- Browser-hosted WASM remains network-free.
- The first pre-release remains one browsing session in one primary application window.
- Public WAP service entry must remain disabled or clearly unavailable until publication gates authorize it.
- Credentials, authorization headers, cookies, sensitive form values, and POST bodies are not ordinary application state.
- Deterministic behavior and native/WASM parity outrank animation or decorative authenticity.
- New feature breadth must not displace active P0/P1 compliance work without an explicit priority decision in the canonical sprint plan.
4. Objective
4.1 Objective statement
Make the first Waves desktop pre-release useful as a daily WAP testing and exploration tool while preserving its protocol authenticity, retro-hybrid identity, deterministic runtime behavior, and strict layer ownership.
4.2 Key results
- A new user can open a working bundled deck and identify the navigation controls in under 60 seconds without external documentation.
- A returning user can reopen a favorite or recover a safe prior local/GET context within two actions after launch.
- A technical user can identify the failing layer and export a sanitized support artifact in under two minutes for the representative timeout, content/decode, invalid-deck, and script-trap cases.
- Every enabled browser-owned command is keyboard reachable, visibly focused, and produces the same application action as its menu/button equivalent.
- Slow or failed navigation always shows a truthful phase or layer, preserves the last committed frame when safe, and offers at least one valid recovery action.
- Corrupt, absent, or future-version application state never prevents the stable shell from appearing.
- Automated canary-secret tests find no credentials, sensitive headers, POST bodies, password/PIN values, or raw content in default persisted/exported artifacts.
- The browser continues to perform no WML parsing, navigation semantics, focus resolution, WBXML decode, or gateway protocol behavior.
4.3 Non-goals for the first pre-release
- modern HTML browsing;
- tabs or multiple concurrent engine sessions;
- cloud accounts or synchronized state;
- a remote or mutable debugger;
- a general automation/conformance runner in the UI;
- arbitrary third-party archive browsing;
- full device-profile catalog;
- automatic POST replay; and
- automatic updates before signing and update-channel ownership are mature.
5. Market segments
5.1 WAP/WML implementer or deck author
Job: load representative decks, inspect exact behavior, test forms/navigation/scripts, and explain failures without switching between many ad hoc tools.
Needs:
- quick access to examples and first-party services;
- route/profile visibility;
- trustworthy diagnostics;
- repeatable favorites and safe state; and
- no browser-host interpretation that hides engine or transport behavior.
5.2 Emulator evaluator or protocol engineer
Job: compare native/WASM/runtime/transport outcomes and create actionable bug artifacts.
Needs:
- correlated bounded events;
- raw transport metadata and optional bytes;
- decoded source and runtime state kept in distinct views;
- deterministic export; and
- clear compatibility-profile and network-route identity.
5.3 Preservationist or researcher
Job: study period interaction patterns and evidence-backed handset behavior without confusing a reference profile with a specific historical device.
Needs:
- authentic behavioral defaults;
- evidence-labeled device profiles later;
- safe first-party period-service demonstrations; and
- stable screenshots or diagnostic evidence.
5.4 Curious learner
Job: understand decks, cards, focus, forms, and the difference between Local and Network without reading repository documentation first.
Needs:
- a clear Home experience;
- bundled tutorial decks;
- plain-language errors; and
- optional help that does not obstruct returning users.
5.5 Preview maintainer or support tester
Job: reproduce a tester report, distinguish client/service/network failures, and collect useful evidence without receiving secrets.
Needs:
- versioned sanitized bundles;
- build/profile/route metadata;
- bounded logs and retention; and
- reproducible first-party scenarios.
6. Value propositions
| User need | Waves value | Differentiation |
|---|---|---|
| Reach authentic WAP content quickly | One Home surface for bundled examples, authorized first-party services, favorites, and safe recents | WAP-focused entry rather than a generic modern-browser new-tab page |
| Return to work safely | Versioned settings, window state, favorites, and policy-limited session recovery | Desktop continuity without automatically replaying unsafe requests |
| Explain WML/WBXML behavior | Network, bytes, decoded source, deck/card/frame, variables, timers, scripts, and errors remain distinct but correlated | A WAP-aware inspector rather than DOM-centric web DevTools |
| Trust failures and recovery | Stable phases, true cancellation, last-good-frame retention, layer-specific messages, safe next actions | Product behavior mirrors the real transport/engine pipeline |
| Use a native application | Platform menus, shortcuts, Preferences, About/support actions, native import/export | Native affordances backed by one command model, not web-only chrome |
| Preserve historical purpose | Reference-handset behavior remains engine-owned; later named profiles require evidence | Behavioral authenticity without pretending one handset defines WAP |
7. Solution
7.1 Experience model and surface decision
Use one primary application shell:
Waves window
|-- Native menu and shared application commands
|-- Navigation/location controls
|-- Main handset stage
|-- Library surface
| |-- Home
| |-- Favorites
| |-- Recent safe locations (later, after history policy)
| `-- Bundled and authorized first-party services
|-- Preferences sheet/panel
|-- Status and recovery presentation
`-- Separate Inspector drawer
|-- Network
|-- Bytes
|-- Source
|-- Deck/Runtime
|-- Events
`-- Errors/Export
Surface choices:
- Home, Favorites, bundled examples, and later safe recents belong in an integrated Library surface because they are ordinary browsing aids.
- Preferences belongs in an integrated sheet or panel opened from the native application menu. The current frontend has no router, so a web-style settings route adds state complexity without product value.
- Developer tools remain a separate top-level Inspector drawer so normal browsing never resembles a debug console. A detachable native Inspector window is a later option after host debug-session ownership is stable.
- Do not create several Tauri windows in the first release. The current application owns one in-process engine and one frontend lifecycle; multiple windows would require new synchronization, focus, session, and stale-state policy.
7.2 Opportunity Solution Tree
Outcome: Waves is a useful, trustworthy desktop WAP browser
|
|-- Opportunity: Reach meaningful content quickly
| |-- Bundled example and first-party service Home
| |-- Favorites with fragments and duplicate handling
| |-- Recent safe locations
| `-- Validate: first-deck and repeat-visit task timing
|
|-- Opportunity: Return without reconstructing the workspace
| |-- Versioned preferences
| |-- Window/display restoration
| |-- Safe local/GET session restore
| `-- Validate: restart, corrupted-state, and migration exercises
|
|-- Opportunity: Understand what a WAP deck and gateway did
| |-- Network/response/hex/decoded-source inspector
| |-- Deck/card/focus/variables/timers/script views
| |-- Correlated bounded timeline
| `-- Validate: diagnose seeded transport/runtime failures
|
|-- Opportunity: Recover confidently from failure
| |-- True cancellation and truthful phases
| |-- Last-good-frame retention
| |-- Layer-specific recovery actions
| `-- Validate: timeout/cancel/decode/trap fault injection
|
`-- Opportunity: Feel like a native desktop application
|-- Shared commands and platform menus/shortcuts
|-- Preferences and About/support actions
|-- Native open/save for import/export
`-- Validate: keyboard-only and platform-convention review
7.3 Product-trio idea set
Product Manager perspective
- Curated WAP Home combining bundled examples, authorized public-lab services, favorites, and safe recent locations.
- Safe favorites with fragments, duplicate resolution, versioned import/export, and explicit invalid-entry handling.
- Safe workspace continuity: settings, window state, and local/GET-only restore after exit or crash.
- WAP diagnostic bundles that make tester reports reproducible without manual log collection.
- Truthful navigation lifecycle with cancellation, phases, last-good-state retention, and actionable recovery.
- Profile-aware preferences that distinguish ordinary application choices from protocol-changing diagnostic overrides.
Product Designer perspective
- An integrated Library for Home, Favorites, safe Recents, and bundled examples that never appears inside the LCD.
- A separate Inspector with Network, Bytes, Source, Runtime, Events, and Errors views.
- A compact Preferences surface with Basic, Accessibility, Network, and Developer groups.
- Layer-specific recovery presentation that preserves the handset and offers Retry, Details, Change Route, or Return.
- A discoverable shortcut reference and native menu structure before a command palette.
- An optional accessible reading panel derived from the engine frame outside the emulation surface.
Software Engineer perspective
- Versioned host-managed application state with migration, corruption recovery, atomic writes, and browser/test adapters.
- A safe persistence projection that excludes secrets, POST bodies, sensitive headers, and raw diagnostic content.
- The engine-owned bounded debug recorder already designed by
D0-01. - Stable request identity, phases, and cancellation across Rust, generated contracts, Tauri, and navigation state.
- Shared command IDs used by native menus, frontend controls, and keyboard shortcuts.
- A typed service catalog containing availability, safety notice, required profile, and publication state.
- A sanitized
.waves-session.jsonformat usable by the Inspector and future WAP testing CLI.
7.4 Prioritized feature set
Scoring uses strategic alignment 30 percent, expected impact 30 percent, feasibility 20 percent, and differentiation 20 percent. Each input is rated from 1 to 5.
| Rank | Idea | Alignment | Impact | Feasibility | Differentiation | Weighted score |
|---|---|---|---|---|---|---|
| 1 | WAP Home and safe Favorites | 5 | 5 | 4 | 4 | 4.6 |
| 2 | WAP Inspector and safe diagnostic bundle | 5 | 5 | 2 | 5 | 4.4 |
| 3 | Truthful fetch lifecycle and recovery | 5 | 5 | 3 | 4 | 4.4 |
| 4 | Durable settings and safe workspace recovery | 5 | 5 | 3 | 3 | 4.2 |
| 5 | Native command surface | 4 | 4 | 4 | 3 | 3.8 |
Implementation order differs from value rank because application state, transport, and debug contracts are prerequisites.
7.5 WAP Home and safe Favorites
Value
Give Waves an immediately useful launch purpose and let users return to a precise card or deck without rebuilding context.
Version 1 behavior
- Use a flat, searchable list. Defer folders and tags until real collections show a need.
- Store a user title and target. Network URLs retain meaningful fragments.
- Support
wap:,waps:,http:,https:, and typed product-owned local-example targets. - Detect duplicates by canonical target plus any future explicit profile binding. Offer Replace, Keep Both, or Cancel rather than silently discarding either record.
- Keep invalid or unsupported imported records in a quarantined state with an explanation. Never navigate them automatically.
- Use versioned JSON import/export first. Generic browser bookmark formats are later work because they cannot preserve WAP-specific metadata reliably.
- Store URL/title only by default. Reserve an optional
profileIdfield for later evidence-backed device profiles, but do not expose it while only the Class C reference exists. - Never store headers, cookies, authorization, POST context, gateway credentials, form values, or runtime variables in a favorite.
- First-party public services remain disabled/unavailable until the public-lab publication gate enables them.
Assumptions
- Target users revisit a small number of decks often enough for favorites to matter.
- Flat search is adequate for the first 20 to 50 records.
- Bundled and first-party entry provides more initial value than generic open-web discovery.
Validation
Test three tasks with five to eight target users: open a bundled deck, save the active card, and return to it after restart. At least 80 percent should finish without external help.
7.6 WAP Inspector and diagnostic bundle
Value
Provide the product’s strongest differentiation: a WAP-aware explanation surface instead of a DOM-centric web inspector or a raw JSON dump.
Inspector views
Network: URL, method, resource target, gateway/route, selected profile, attempts, stable phase timings, response metadata, byte size, and correlation ID.Bytes: bounded hex view derived from raw bytes supplied by the transport. The frontend does not parse WBXML.Source: read-only WML already decoded by the transport.Deck: engine-provided deck/card/frame metadata, active card, focus, selection, logical affordances, and Back availability.Runtime: engine-masked variables, pending external intent, timers, form edit state, and script status.Events: correlated host, transport, engine, script, and render events with filters and bounded retention.Errors: stable layer/category, related request/card, last completed phase, and safe recovery.Export: versioned sanitized bundle. Raw bytes, decoded source, arbitrary response content, and form values are excluded by default.
Retention and performance
- Engine debug collection remains disabled and inert until local policy and an attached Inspector session enable it.
- Poll only while the Inspector is open.
- Preserve the
D0-01fixed-capacity, drop-oldest, cursor-based model. - Bound host/transport evidence by event count and byte budget; never retain unlimited response bodies.
- Inspector open/close and poll cadence must not change runtime event order or state.
Redaction
- Engine values are masked before entering debug DTOs.
- Transport/host headers and bodies are sanitized before entering an export DTO.
- Frontend masking is a defense-in-depth presentation step, not the primary security boundary.
- Raw/source inclusion requires an explicit per-export opt-in and warning because arbitrary content cannot be reliably made non-sensitive automatically.
Replay
Replay is a later, fixture-backed feature. It must not send arbitrary network traffic, replay POST bodies, or bypass normal engine/transport contracts. The WAP testing CLI may consume the same capture schema but retains batch/conformance execution ownership.
Validation
Seed timeout, unsupported content, WBXML decode, invalid WML, and script-trap cases. Target users should identify the correct failing layer in under two minutes without terminal access.
7.7 Truthful fetch lifecycle and recovery
Implement the existing WBP-10 and WBP-11 contracts rather than creating competing tickets.
Required behavior:
- A stable request identity and deterministic cancel/completion race.
- Truthful Preparing, Connecting, Gateway, Decode, Deck, and Card phases where supported by the owning layer.
- Go changes to Stop only when the underlying request is actually cancellable.
- The previous committed frame remains visible during a new load and recoverable failure.
- Errors identify the failing layer and correlation ID without injecting a fake WML card.
- Every error offers a valid action such as Retry, Change Route, Details, or Return.
- A stale/cancelled response cannot alter engine, history, status, diagnostics, or persisted state.
Validation uses fault injection at connect, gateway, WBXML decode, engine load, and script execution boundaries. Users should choose an accurate recovery action in at least 90 percent of cases.
7.8 Durable settings and safe workspace recovery
Versioned application state
Use one application-state envelope behind a host-capability interface:
schemaVersion
settings
onboarding
favorites
windowState
safeSession
diagnosticPreferences
The frontend depends on an ApplicationStateStore interface. Native Tauri uses a host-managed
application-data backend; ordinary-browser stories/tests use a memory adapter or a deliberately
scoped browser adapter. Backend selection between an official Tauri store facility and a small
repository-owned atomic host adapter remains an implementation decision, but the schema and safety
contract must not depend on the backend.
Persisted settings
- display scale;
- host theme/high contrast/reduced motion;
- default Local/Network mode and Home/start behavior;
- developer mode and bounded retention preferences;
- safe-session restore preference;
- window bounds validated against available monitors;
- favorites; and
- onboarding state.
Safe session
Safe automatic restoration is limited to:
- a product-owned local example plus fragment/card target; or
- a committed GET location without credentials or sensitive headers.
Never persist/replay:
- POST bodies or POST history for automatic restoration;
- credentials, cookies, authorization, password/PIN values, or secret query values;
- an in-flight request;
- raw WML/WBXML diagnostic content; or
- arbitrary gateway credentials.
A crash marker distinguishes ordinary startup from recovery. The shell paints before storage, decoder preflight, or network checks finish. Corrupt/unknown state offers a safe reset and preserves the bad artifact only when that can be done without exposing secrets.
Diagnostic overrides
Timeout, retry, size, route, and constrained-network controls belong in an Advanced/Diagnostic section with bounded values and a visible override indicator. They must not silently redefine the selected compatibility profile.
7.9 Native command surface
Define stable command IDs and route native menu actions, browser controls, and keyboard shortcuts through the same application handlers.
Recommended command groups:
File: Home/Library, Import Favorites, Export Favorites, Export Diagnostic Bundle, Close/Quit;Edit: native text-editing roles;View: Reload, Library, Inspector, display scale, Reset View;History: Back, later safe Recents, Clear History;Preferences: platform-appropriate Preferences/Settings command;Help: Help, Shortcut Reference, Check for Updates placeholder, About.
Recommended shortcuts include platform-appropriate forms of location focus, reload, add favorite, Preferences, Library, and Inspector. Shortcut routing must not steal text-entry or focused WML edit input.
Do not add a command palette until the final command count or usability evidence shows that menus and shortcuts are insufficient.
7.10 Privacy and security requirements
- Serialization uses allowlisted safe DTOs; it never serializes a live session object graph by default.
Authorization,Proxy-Authorization,Cookie,Set-Cookie, credential-bearing URL userinfo, and sensitive query keys are removed before persistence/export.- POST payloads, request-intent postfields, form drafts, variables derived from masked inputs, and password/PIN values are excluded or masked at the owning boundary.
- History, favorites, diagnostics, settings, and safe session use separate schemas and retention controls. Clearing one does not ambiguously clear or preserve the others.
- Reset-to-defaults explains what it will clear and does not silently delete imported/exported files.
- Gateway resource URI and gateway endpoint remain distinct concepts.
- The public-lab UI states that the preview is unencrypted, WTLS is unsupported, and users must not enter real credentials or personal data.
- No feature broadens the transport destination policy or creates an arbitrary WAP-to-web proxy.
The existing timeline export stores complete host session snapshots, while host history can contain headers and request policy including POST context. Sanitizing this path is a prerequisite for persisted history or expanded diagnostic export.
7.11 Accessibility requirements
- Preserve complete keyboard access and visible focus.
- Native menu, button, and shortcut forms of one command produce equivalent action results.
- Library, Preferences, recovery, and Inspector surfaces maintain WCAG 2.2 AA host-chrome goals.
- Status, failure, card change, recovery, import result, and reset result use the single live announcement path without duplicate announcements.
- Minimum target sizing, reduced motion, high contrast, default/minimum window evidence, and 200 percent zoom/reflow remain covered.
- Display scale changes pixels only. Engine-owned viewport/layout remains authoritative.
- A future accessible reading panel derives from the canonical engine frame and stable actions; it does not independently interpret WML.
7.12 Assumptions to validate
- Technical evaluators remain the primary launch segment.
- Users revisit enough locations to justify Favorites before full visible history.
- Flat Favorites search is sufficient for the first release.
- URL/title-only favorites are sufficient while only the Class C reference profile ships.
- Local automatic restore plus a network-restore prompt is safer and understandable.
- Users value an integrated Inspector more than an external debugger or richer CLI-only flow.
- Polling while open meets Inspector performance needs.
- Native menus and shortcuts provide enough command discovery without a palette.
- Public first-party services will be authorized and reachable in time for the desktop pre-release.
- A host-managed application-data store can satisfy atomicity, migration, and testability without introducing a broad framework.
8. Release and implementation plan
8.1 Entry gates
Before feature UI begins:
- Use the merged PR
#502shell as the integration baseline; do not fork a competing root shell. - Keep one shell integration owner for root template, controller, copy, and global-style edits.
- Sequence around
#450,#466, and#467;#434is resolved by PR#518. - Do not persist visible history until the request/history identity problem in
#450is fixed. - Do not expand diagnostic export until the safe projection/redaction boundary is implemented.
- Respect the canonical sprint plan’s P0/P1 WAP implementation priority and WIP limits.
8.2 Phase A: pre-release essentials
- F1 primary frame rendering and deterministic navigation publication are complete in PRs
#519,#520, and#526. - Cancellable/admission-controlled navigation,
WBP-11phase-aware recovery presentation, andWBP-12safe-session/crash recovery are complete; the packaged relaunch observation remains in the WBP-14 release matrix. - Versioned application state is complete in PR
#522; safe projection, integrated settings, window restore, and local/GET-safe recovery are integrated. User-facing import/export and the packaged crash-relaunch observation remain. - The safe Favorites/service-catalog domain is complete in PR
#517; WAP Home/Library UI remains. - Safe timeline/export projection is complete in PR
#532; the D0-04 Inspector consumer and its separately versioned bounded engine capture are complete in PR#536. - Shared native commands and platform shortcuts are complete in PR
#523. - Reconcile the now-live public lab with its publication evidence, then complete desktop profile/resource separation and guided safety messaging.
- Complete the packaged desktop success/failure matrix, signing, checksums, and install guidance.
8.3 Phase B: next application-quality increment
- preserve the completed D0-02 through D0-04 read-only Inspector path while deferring external and mutable debugger capabilities;
- add visible searchable history with explicit retention after
#450; - complete Favorites import/export UX;
- add broader Developer/Diagnostic preferences and redaction controls;
- add the semantic frame accessibility adapter and optional reading view; and
- promote native frontend E2E only after the scorecard’s four-run/21-day gate passes.
8.4 Phase C: later differentiators
- evidence-backed Nokia 7110 and one selected Openwave handset/browser profile;
- controlled fixture-backed diagnostic import/replay;
- screenshot/frame export with profile/build metadata;
- optional detachable Inspector window;
- constrained-network simulation presets;
- safe first-party synthetic period-service gallery; and
- narrowly justified per-site compatibility policy without credentials or general web permissions.
8.5 Explicitly deferred or rejected
| Candidate | Decision | Reason |
|---|---|---|
| Tabs/multiple sessions | Defer | Single-session lifecycle, persistence, and Inspector must stabilize first |
| Modern HTML browsing | Reject | Conflicts with product purpose and architecture |
| Favorites folders/tags | Defer | Flat search should be validated before adding organization cost |
| Cloud sync/accounts | Reject for pre-release | Privacy, infrastructure, and product value are unproven |
| Command palette | Defer | Native menus and shortcuts should be tested first |
| Auto-update | Defer | Signing and update-channel ownership are not mature |
| Remote/mutable debugger | Reject for MVP | Adds security and determinism risk; D0 is intentionally read-only/local |
| Browser-side WBXML/WML semantics | Reject | Violates layer ownership |
| UI conformance runner/crawler | Reject | Duplicates the WAP testing CLI |
| Third-party archive browser/open proxy | Reject without separate decision | Rights, abuse, authenticity, and security risks |
| Automatic POST/session replay | Reject | Unsafe and non-idempotent |
| JSON-stored gateway credentials | Reject | Secrets require a separately designed OS credential boundary |
8.6 First parallel-safe implementation batch
Checkpoint at 6cf1682a: APP-STATE-01 (#522), APP-FAV-01 (#517), APP-CMD-01
(#523), APP-PRIV-01/RSL-06 (#532), and D0-01 through D0-03 (#524, #531) are implemented.
APP-SHELL-01 is unblocked but remains sequenced around D0-04 because both integrate the shared
shell. The table is retained as the ownership map for completed and remaining slices.
| Slice | Initial owner | Sequence | Main output | High-conflict surfaces |
|---|---|---|---|---|
APP-STATE-01 Versioned desktop state |
browser/Tauri state owner | Wave A | Schema, store interface/backend, migration, reset, test adapter | Tauri command/capability files if host commands are used |
APP-PRIV-01 Safe-state/export projection |
browser security owner | Wave A | Allowlisted persistence/export DTOs and canary-secret tests | Timeline/session integration; avoid active navigation error fixes |
APP-FAV-01 Favorites/service-catalog domain |
browser product-model owner | Wave A | Favorite model, target validation, duplicates, import/export, publication metadata | New leaf modules; public catalog ownership |
APP-CMD-01 Shared application commands |
native-shell owner | Wave A | Stable command IDs, enabled state, menu/shortcut bridge | bootstrap.rs, menu constants, later shell handlers |
Existing D0-02 debug recorder |
engine owner | Wave A | Bounded engine events/snapshots and source masking | Sequence with #434; engine boundary/runtime files |
APP-SHELL-01 Library and Preferences integration |
one shell integrator | Wave B | User-facing Home/Favorites/Preferences and command integration | Merged #502 shell, copy, styles, and controller |
Merged #502 shell baseline ------------------------------------+
APP-STATE-01 ------------------+ |
APP-PRIV-01 -------------------+--> APP-SHELL-01 <--------------+
APP-FAV-01 --------------------+
APP-CMD-01 --------------------+
D0-02 --> D0-03 --> D0-04 (Phase B Inspector)
#450 --> persisted/searchable history (Phase B)
WBP-10 --> WBP-11 --> WBP-12 safe-session implementation --> packaged release matrix
8.7 Ticket-ready first-batch slices
APP-STATE-01 Versioned desktop application state
Owner:browser, Tauri host boundary.Depends On: the merged shell only for migration of its Welcome preference, not for core schema work.Build:- define schema version 1 and
ApplicationStateStore; - implement a native app-data backend with atomic replacement and a memory/test adapter;
- persist settings, onboarding, favorites, window state, safe session, and diagnostic preferences only through typed safe DTOs;
- migrate the isolated
waves.showWelcomeOnLaunchvalue when present; - handle absent, corrupt, and future versions without delaying shell paint;
- provide reset-to-defaults and component-specific clear operations.
- define schema version 1 and
Accept:- clean install, restart, v1 migration, corrupt file, future version, interrupted write, and removed-monitor fixtures pass;
- no failed read prevents startup;
- safe state contains no history request headers, POST context, raw payload, or runtime values;
- browser stories remain deterministic through the test adapter.
Risk: storage backend choice could leak into frontend types or introduce non-atomic writes.Validation: migration/corruption matrix plus ten repeated write/restart cycles.Suggested branch:codex/app-state-v1.Suggested PR title:feat(browser): add versioned safe application state.
APP-PRIV-01 Safe-state and diagnostic-export projection
Owner: browser security/application-state boundary.Depends On: none for serializer design; integration precedes persisted history or new export.Build:- replace whole live-session serialization with allowlisted persistence/export DTOs;
- redact sensitive headers, URL userinfo, credential-like query fields, POST payloads/postfields, password/PIN values, and masked-variable derivations;
- exclude raw bytes, decoded WML, response bodies, and arbitrary error internals by default;
- define a versioned minimal support-bundle schema with build/profile/route/correlation metadata;
- keep optional raw/source inclusion behind explicit per-export consent and size bounds.
Accept:- canary secrets inserted into every relevant live structure are absent from serialized text;
- exports remain useful for at least timeout, decode, invalid-deck, and script-trap cases;
- existing timeline chronology validation remains green;
- frontend-only masking is not the sole boundary for engine or transport secrets.
Risk: over-redaction can make reports useless; under-redaction exposes tester data.Validation: automated secret-canary suite plus review of five representative bundles.Suggested branch:codex/browser-state-redaction.Suggested PR title:fix(browser): sanitize persisted and exported state.Implementation note:RSL-06/ issue#506supplies the versioned allowlisted projection for the existing session, transport, runtime, timeline, detached-diagnostic, and timeline-export surfaces. Raw/source opt-in support remains excluded until its separate consent and byte-bound decision is implemented.
APP-FAV-01 Favorites and first-party service-catalog domain
Owner: browser product-model boundary.Depends On:APP-STATE-01for persistence integration; domain work may start in parallel.Build:- define favorite IDs, titles, typed targets, creation/update metadata, validation state, and a reserved optional profile identity;
- retain URL fragments and type local examples separately from network URLs;
- implement canonical duplicate detection and Replace/Keep Both/Cancel outcomes;
- implement versioned JSON import/export with invalid-record quarantine;
- define a typed first-party service catalog with publication state, security notice, required route/profile, and owner-provided availability;
- keep folders/tags and generic browser formats out of v1.
Accept:- valid WAP/HTTP targets round-trip without losing fragments;
- unsafe schemes, blank targets, credential-bearing URLs, malformed imports, and future schema versions fail safely;
- duplicates are never silently dropped;
- disabled/unpublished services cannot initiate navigation.
Risk: URL normalization can change WAP resource identity or erase meaningful fragments.Validation: property-style normalization/round-trip tests plus a 50-record import fixture.Suggested branch:codex/wap-favorites-model.Suggested PR title:feat(browser): define safe WAP favorites and service catalog.
APP-CMD-01 Shared native application command registry
Owner: browser native-shell boundary.Depends On: stable command names; visual integration uses the merged#502shell baseline.Build:- define stable command IDs and enabled/disabled projection;
- route native menu events, keyboard shortcuts, and frontend controls to the same handlers;
- cover location focus, reload, add favorite, Library, Preferences, Inspector, Help, import, and export without advertising unavailable commands as functional;
- preserve native text-editing roles and focused WML/host input behavior;
- add a shortcut reference derived from the command registry.
Accept:- every enabled menu item and shortcut invokes the same observable action path as its button;
- disabled commands cannot execute and communicate their state accessibly;
- macOS and Linux mappings follow platform conventions;
- no shortcut intercepts focused input/select/textarea editing incorrectly.
Risk: duplicated command logic or shortcut collisions create nondeterministic input behavior.Validation: keyboard-only command matrix on macOS and Linux plus unit tests for enabled state.Suggested branch:codex/native-command-registry.Suggested PR title:feat(browser): unify native menu and application commands.
D0-02 Engine event stream and snapshot emitter
Use the existing ticket and contract unchanged.
Owner:engine-wasm.Depends On: completedD0-01; sequence with issue#434where engine boundary files overlap.Build: fixed-capacity drop-oldest ring buffer, deterministic sequence/cursor/drop accounting, declared event emission, bounded snapshot, and source-level masking.Accept:- disabled/unattached execution is inert;
- native/WASM event/snapshot parity passes;
- consumer poll rate cannot affect runtime order;
- masked/omitted values never carry original or truncated secrets.
Validation: ordering, overflow, cursor recovery, masking, and no-debug performance tests.Suggested branch:codex/d0-02-debug-recorder.Suggested PR title:feat(engine): implement bounded debug recorder.
APP-SHELL-01 Integrated Library and Preferences
Status: done. The integrated shell uses the existing typed favorites, service-catalog,
application-state, and command contracts. Bundled examples and safe Favorites are actionable;
unpublished Services remain disabled with an explicit evidence explanation. Preferences affect
host presentation and future launch choices only, and the full reset requires an explicit second
confirmation while preserving the currently rendered deck.
Owner: one browser shell integrator.Depends On: merged shell baseline,APP-STATE-01,APP-PRIV-01,APP-FAV-01, andAPP-CMD-01.Build:- add the integrated Home/Favorites/Services Library;
- add Preferences for launch behavior, display scale, accessibility, safe restore, developer mode, and retention;
- wire add/remove/open/import/export/reset through shared commands;
- preserve normal navigation, route/profile truthfulness, and all existing shell landmarks;
- keep Inspector integration out of this slice.
Accept:- users can open a bundled example, add/open/remove a favorite, import/export favorites, change a preference, and reset safely using keyboard only;
- default/minimum windows and 200 percent zoom remain usable without overlap or horizontal scrolling;
- announcements occur once;
- no setting silently changes engine semantics or transport policy;
- unpublished public services remain disabled with accurate explanation.
Risk: shared-shell edits collide with the merged shell/Developer Tools baseline or D0-04 Inspector UI.Validation: rendered accessibility audit, task-based usability check, and all Waves stories.Suggested branch:codex/wap-library-preferences.Suggested PR title:feat(browser): add integrated favorites and preferences.
8.8 Parallel ownership and conflict controls
| Stream | Owns | Must not duplicate | Main interface |
|---|---|---|---|
| Visual refinement | Shell layout, visual hierarchy, tokens, responsive treatment | Bookmarks/settings models, engine behavior, transport behavior | Stable shell insertion points and IDs |
| Resilience/lockup | Blocking paths, panic containment, state/error correctness | Feature breadth or visual redesign | Typed failure and lifecycle behavior |
| WAP testing CLI | Batch/corpus/conformance execution, scripting, report generation | In-app interactive browsing/inspection UX | Sanitized capture schema and stable case IDs |
| Public services | Deployment, routes, content, publication state, safety evidence | Browser storage/navigation semantics | Typed service catalog/availability manifest |
| Frame migration | Frame rendering, hit regions, typed input, semantic adapter | Host bookmarks/settings/commands | Generated engine frame/input contract |
| Application completion | Favorites, settings, commands, safe state, Library, Inspector presentation | WML/WBXML/network semantics | Host capabilities and generated contracts |
Rules:
- One owner integrates root shell, controller, copy, and global styles.
- Frame and debug contract changes are sequenced; generated artifacts have one owner per migration.
- Persistence never serializes live transport/engine structures directly.
- Distinct domain modules and engine recorder work may proceed against the stable merged shell baseline.
- The service catalog consumes deployment-owned status rather than inferring availability.
- CLI and Inspector share artifacts, not control flow or feature ownership.
8.9 Release exit criteria
The desktop application-completion pre-release is ready when:
- The primary viewport uses the canonical engine frame path without deck-content HTML injection.
- Local and supported network navigation show truthful progress, real cancellation, and safe recovery.
- The shell paints and remains usable with absent, corrupt, or future-version application state.
- Settings, window state, onboarding, Favorites, and safe local/GET session recovery behave predictably.
- Public-service entries appear only under an authorized, tested publication state with explicit unencrypted/no-real-credentials messaging.
- Browser-owned commands work through native menus, keyboard, and visible controls without stealing WML edit input.
- Default support artifacts are bounded and pass the secret-canary suite.
- Host chrome remains keyboard accessible and passes the declared rendered accessibility checks.
- The packaged app passes representative bundled, public GET, supported POST, timeout, decode, invalid-deck, script-trap, cancellation, and recovery flows.
- No feature crosses engine, transport, browser, or public-service ownership boundaries.
8.10 Decisions to resolve with the product owner
| ID | Decision | Recommended default | Why it remains open |
|---|---|---|---|
DEC-APP-01 |
Native persistence backend | Host-managed app-data store behind ApplicationStateStore; choose official Tauri store vs. small atomic host adapter in a bounded spike |
Atomicity, migration control, dependency policy, and browser-test parity need comparison |
DEC-APP-02 |
Safe restore default | Restore local content automatically; prompt before restoring a network GET after crash | Balances continuity with unexpected network activity/privacy |
DEC-APP-03 |
Persistent history in first pre-release | Do not persist full history; ship Favorites plus safe last session first | #450 remains open and history carries sensitive request identity |
DEC-APP-04 |
Bookmark profile context | Reserve optional profileId in schema but do not expose it until a second profile exists |
Avoids premature UI while preserving migration room |
DEC-APP-05 |
Public service visibility before publication | Show only bundled content by default; optionally show disabled “Preview unavailable” entries | The public deployment is private and publication-gated |
DEC-APP-06 |
Engine debug enablement | Disabled by default; enable only while local Developer mode and Inspector session are active | Preserves determinism, performance, and privacy |
DEC-APP-07 |
Raw/source diagnostic export | Excluded by default; explicit one-export opt-in with warning and byte bound | Arbitrary content cannot be reliably sanitized |
DEC-APP-08 |
First supported desktop platforms | Owner must select before packaging work | Signing, notarization, QA matrix, and menu conventions depend on it |
DEC-APP-09 |
Command palette | Do not build until menu/shortcut usability shows a gap | Current command volume does not justify another interaction model |
DEC-APP-10 |
Favorites folders/tags | Flat list and search first | Need evidence from real collections before adding organization complexity |
8.11 Evidence reviewed
Active documents:
AGENTS.md;docs/agents/AGENT_STANDARDS.md;docs/waves/WAVES_DESKTOP_PRODUCT_DESIGN.md;docs/waves/WAVES_BROWSER_PRODUCT_IMPLEMENTATION_PLAN.md;docs/waves/WAVES_BROWSER_BASELINE.md;docs/waves/PUBLIC_WAP_LAB_PRERELEASE_PLAN.md;docs/waves/SPRINT_PLAN_2026-03_MASTER_PRIORITIZED.md;docs/waves/WAP_1_2_1_PLANNING_BASELINE.md;docs/waves/WORK_ITEMS.md;docs/waves/USABILITY_RESILIENCE_BACKLOG.md;docs/waves/USER_ONBOARDING_EXPERIENCE_PLAN.md;docs/waves/ENGINE_DEBUG_CONNECTOR_PLAN.md;docs/waves/ENGINE_DEBUG_CONNECTOR_RESEARCH.md;docs/waves/ENGINE_HOST_FRAME_MIGRATION_PLAN.md;docs/waves/ENGINE_HOST_FRAME_WORK_ITEMS.md;docs/waves/TRANSPORT_E2E_READINESS_SCORECARD.md;docs/waves/ARCHIVAL_WAP_SERVICE_INCORPORATION_PLAN.md;docs/waves/TECHNICAL_ARCHITECTURE.md;docs/browser-emulator/TAURI_PROFESSIONAL_POLISH_EXPLORATION.md; andbrowser/README.md.
Code and contracts:
- browser frontend bootstrap/application, shell and leaf templates, controller, presenter, navigation state, history, timeline, defaults/config, examples, keyboard routing, command/event bindings, scale control, styles/tokens, and package manifest;
- Tauri bootstrap, command adapters, configuration, Cargo manifest, capabilities, and generated command inventory;
- transport app/generated contracts, generated engine frame/debug DTOs, generated Tauri client,
and
engine-wasm/contracts/wml-engine.ts; and - merged PR
#502shell and Welcome-preference implementation.
Archive folders and date-stamped historical snapshots were excluded as normative sources.