Add parent-first-child top and parent-last-child bottom margin collapsing using a two-level approach (Level A shifts child inside parent, Level B adjusts grandparent for effective collapsed margin). Fix pre-existing bug in shift_subtree_x that incorrectly skipped absolute/fixed children. Extract shared MARGIN_EPSILON constant, add 9 unit tests and 4 golden tests (209-212), promote 31 WPT tests to pass. Includes code review fixes: pub(crate) visibility for is_root_element, known-limitation docs, and inline-content shift test coverage. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
34 KiB
assessmentDate, project, stepsCompleted, inputDocuments, missingDocuments, assessmentStatus, assessor
| assessmentDate | project | stepsCompleted | inputDocuments | missingDocuments | assessmentStatus | assessor | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-03-12 | rust_browser |
|
|
|
NOT READY | Codex |
Implementation Readiness Assessment Report
Date: 2026-03-12 Project: rust_browser
Document Discovery
PRD Files Found
Whole Documents:
prd.md(33,750 bytes, modified 2026-03-12 18:46:44)
Related but not treated as the PRD source document:
prd-validation-report.md(23,077 bytes, modified 2026-03-12 18:35:55)
Sharded Documents:
- None found
Architecture Files Found
Whole Documents:
architecture.md(32,737 bytes, modified 2026-03-12 17:19:07)
Sharded Documents:
- None found
Epics & Stories Files Found
Whole Documents:
epics.md(79,568 bytes, modified 2026-03-12 19:58:35)
Sharded Documents:
- None found
UX Design Files Found
Whole Documents:
- None found
Sharded Documents:
- None found
Issues Found
- Warning: No UX design document found
- No duplicate whole versus sharded document formats were found
Documents Selected For Assessment
- PRD:
/_bmad-output/planning-artifacts/prd.md - Architecture:
/_bmad-output/planning-artifacts/architecture.md - Epics/Stories:
/_bmad-output/planning-artifacts/epics.md
PRD Analysis
Functional Requirements
FR1: The browser parses HTML documents and constructs a DOM tree from arbitrary web content. Acceptance: all WPT tree-construction tests pass.
FR2: The browser parses CSS stylesheets (inline, embedded, and external) and computes styles for all DOM nodes. Acceptance: computed style output matches WPT expectations for supported properties.
FR3: The browser performs layout computation for block, inline, flexbox, table, and positioned elements. Acceptance: golden test output matches expected layout trees for each layout mode.
FR4: The browser generates a display list from the layout tree and rasterizes it to pixels. Acceptance: golden test pixel output matches expected display list dumps.
FR5a: The browser selects the correct font based on CSS font-family, font-weight, and font-style declarations. Acceptance: golden tests with multiple font stacks render the expected glyphs.
FR5b: The browser performs line breaking per UAX#14 and renders text with correct line-height, font-size, and baseline alignment. Acceptance: golden tests with multi-line text match expected output.
FR6: The browser renders images in PNG, JPEG, GIF, WebP, and SVG formats as both inline content and CSS background-image. Acceptance: golden tests with each format produce correct visual output.
FR7a: The browser renders CSS backgrounds (color, image, repeat, position, attachment) and borders (all border-style values including double, groove, ridge, inset, outset). Acceptance: WPT background/border tests pass.
FR7b: The browser renders box-shadow, CSS gradients (linear-gradient, radial-gradient), and opacity. Acceptance: golden tests for each effect match expected output.
FR8: [P2] The browser renders CSS generated content (::before, ::after) with content property values including strings, attr(), and counter(). Acceptance: WPT generated-content tests pass.
FR9: The browser performs CSS selector matching with full specificity calculation and cascade resolution per CSS 2.1 sections 6 and 6.4. Acceptance: WPT cascade/specificity tests pass.
FR10: [P2] The browser resolves CSS inheritance, initial values, and inherit/initial/unset keywords for all CSS 2.1 properties. Acceptance: WPT inheritance tests pass for each supported property.
FR11: The browser parses and executes JavaScript programs. Acceptance: Test262 pass rate reaches 95%+ against the full tc39/test262 suite (50,000+ tests).
FR12: The browser executes scripts from inline <script> elements and external script resources, including deferred and asynchronous loading. Acceptance: WPT script-loading tests pass for each loading mode.
FR13: The browser exposes DOM manipulation APIs to JavaScript: getElementById, querySelector, querySelectorAll, createElement, appendChild, removeChild, insertBefore, replaceChild, classList, and style property access. Acceptance: WPT DOM manipulation tests pass for each listed API.
FR14: The browser dispatches events to JavaScript listeners with capture, target, and bubble phases per the DOM Events specification. Acceptance: WPT event dispatch tests pass including stopPropagation and preventDefault.
FR15: The browser executes microtasks (Promise.then), macrotasks (setTimeout, setInterval), and requestAnimationFrame callbacks in spec-defined order. Acceptance: event loop ordering tests produce correct execution sequences.
FR16: The browser exposes these Web APIs to JavaScript: console (log/warn/error), JSON (parse/stringify), fetch, localStorage, sessionStorage, and all DOM/event APIs listed in FR13-FR14. Acceptance: each API has at least one integration test verifying correct behavior.
FR17: The browser catches JavaScript runtime errors (TypeError, ReferenceError, SyntaxError) without crashing and reports them to console.error. Acceptance: a test script with each error type runs without process termination and produces console output.
FR18: The user enters a URL in the address bar and the browser navigates to it. Acceptance: URL entry triggers resource fetch and page render within the performance bounds defined in NFR1.
FR19: The browser loads resources over HTTP, HTTPS, file://, and data: URI schemes. Acceptance: integration tests verify successful resource loading for each scheme.
FR20a: The browser follows HTTP 301, 302, 303, 307, and 308 redirects up to a maximum of 20 hops. Acceptance: redirect chain tests verify correct final destination and hop limit enforcement.
FR20b: The browser displays HTTP error responses (4xx, 5xx) to the user with the status code and a descriptive message. Acceptance: error page tests verify status code display for 404 and 500 responses.
FR21: [P1 -- done] The browser manages cookies per RFC 6265: domain scoping, path matching, Secure/HttpOnly flags, and Max-Age/Expires expiry. Acceptance: cookie integration tests verify correct set/send behavior for each attribute.
FR22: [P1 -- done] The browser caches HTTP responses using ETag and Last-Modified headers, sends conditional requests (If-None-Match, If-Modified-Since), and honors Cache-Control directives (max-age, no-cache, no-store). Acceptance: caching integration tests verify 304 responses and cache hit/miss behavior.
FR23: [P1 -- done] The browser maintains cookie-based session state across navigations within a browsing session: cookies set on page A are sent with requests to the same domain on page B. Acceptance: a multi-navigation test verifies session cookie persistence across 3+ page loads.
FR24: The user navigates forward and backward through browsing history. Acceptance: history navigation tests verify correct page restoration for 3+ history entries.
FR25: The browser resolves relative URLs against the document base URL (including <base href> if present). Acceptance: URL resolution tests cover relative paths, query strings, fragments, and base element override.
FR26: The user interacts with form controls: text inputs, buttons, checkboxes, radio buttons, select menus, and textareas. Acceptance: integration tests verify user input produces correct form control state for each control type.
FR27: The browser submits forms via GET and POST with application/x-www-form-urlencoded encoding. [P2] multipart/form-data encoding for file uploads. Acceptance: form submission tests verify correct request body encoding for each method and encoding type.
FR28: [P2] The browser performs client-side form validation for required, pattern, min, max, minlength, maxlength, and type-based constraints (email, url, number). Acceptance: validation tests verify correct constraint enforcement and user-visible error indication for each constraint type.
FR29: The user interacts with the page via click, keyboard input, and scroll. Acceptance: input event tests verify correct event dispatch and default behavior for each input type.
FR30: The browser manages focus state and supports keyboard navigation (Tab/Shift+Tab) between focusable elements in document order. Acceptance: focus management tests verify correct tab order across form controls, links, and elements with tabindex.
FR31: The user views and edits the current URL in an address bar that updates on navigation. Acceptance: address bar reflects the current page URL after each navigation.
FR32: [P3] The user opens new tabs, switches between tabs, and closes tabs. Each tab maintains independent navigation history, DOM state, and scroll position. Acceptance: multi-tab tests verify independent state across 3+ tabs.
FR33: The user scrolls page content vertically and horizontally when content exceeds the viewport. Acceptance: scroll tests verify content accessibility for pages taller and wider than the viewport.
FR34: The browser displays a loading indicator during page load and clears it on completion or failure. Acceptance: loading state tests verify indicator visibility during fetch and removal after load/error events.
FR35: The user reloads the current page (re-fetches all resources) and stops a loading navigation (cancels pending fetches). Acceptance: reload/stop tests verify correct behavior for each action.
FR36: The browser renders a chrome UI containing the address bar, navigation buttons (back/forward/reload/stop), and a tab bar (Phase 3). Acceptance: chrome UI renders correctly at window widths from 800px to 2560px.
FR37: [P3] The browser blocks tracker and advertisement requests by matching URLs against a bundled blocklist (e.g., EasyList format). Acceptance: blocking tests verify that requests matching 10+ known tracker patterns are prevented, and non-matching requests proceed normally.
FR38: The browser enforces same-origin policy: JavaScript on origin A cannot read DOM content, cookies, or network responses from origin B (where A and B differ in scheme, host, or port). Acceptance: cross-origin access tests verify blocked read access for each resource type.
FR39: The browser blocks top-level navigation to javascript: URIs and data: URIs. Sub-resource loading of data: URIs is permitted. Acceptance: navigation blocking tests verify blocked and permitted cases.
FR40: [P3] The browser persists cookies and session data to disk and restores them on application restart. Acceptance: restart persistence tests verify cookie availability after process termination and relaunch.
FR41: [P1 -- done] The browser serves previously cached HTTP responses when the origin server is unreachable, subject to Cache-Control freshness rules. Acceptance: offline tests verify cached page display when network requests fail.
FR42: [P2] The browser provides localStorage (persistent, 5MB per origin) and sessionStorage (per-tab, cleared on tab close) to JavaScript. Acceptance: Web Storage tests verify getItem/setItem/removeItem/clear behavior, storage limits, and cross-origin isolation.
FR43: [P3] The browser discovers and uses OS-installed fonts on macOS (Core Text) and Linux (fontconfig), falling back to bundled Noto Sans. Acceptance: font discovery tests verify at least 3 system fonts are available beyond the bundled set on each supported platform.
FR44: [P3] The user copies selected text to the system clipboard and pastes text from the clipboard into form inputs. Acceptance: clipboard tests verify round-trip copy/paste of plain text content.
FR45: [P3] The browser presents native file dialogs for file upload (<input type="file">) and download (Content-Disposition: attachment). Acceptance: file dialog tests verify dialog presentation and correct file data transfer.
FR46: [P3] The browser registers as the default URL handler on macOS and Linux so that clicking links in other applications opens rust_browser. Acceptance: URL handler registration tests verify correct launch from an external link on each platform.
FR47: [P2] The browser passes 90%+ of CSS 2.1 Web Platform Tests as measured by the WPT harness in CI.
FR48: [P2] The browser passes 95%+ of the full tc39/test262 ECMAScript conformance suite (50,000+ tests) as measured by the Test262 harness.
FR49: [P2] The browser passes 90%+ of HTML5 Web Platform Tests as measured by the WPT harness in CI.
FR50: The browser handles malformed HTML, CSS, and JavaScript input without crashing. Acceptance: fuzz tests and malformed-input test suites covering each parser run without panics.
Total FRs: 50
Non-Functional Requirements
NFR1: Page load and first paint for a content-heavy site (CNN, Hacker News) completes within 3 seconds on an M1 MacBook or equivalent. Measured by timing from navigation start to first paint event in debug logs.
NFR2: Scrolling maintains 30+ frames per second on pages with up to 500 DOM elements. Measured by frame timing instrumentation in the render loop.
NFR3: No single JavaScript task blocks the rendering thread for more than 100ms. Measured by task duration logging in the event loop.
NFR4: The browser starts up and displays the address bar ready for URL input within 2 seconds from process launch. Measured by startup timing instrumentation.
NFR5: Resident memory usage does not grow by more than 50MB after navigating to 20 different pages and returning to the first. Measured by RSS sampling before and after the navigation sequence.
NFR6: All parsers (HTML, CSS, JavaScript) handle malformed and adversarial input without panics or undefined behavior. Verified by fuzz test suites covering each parser with 10,000+ random inputs without crashes.
NFR7: The unsafe keyword is forbidden in all crates except the two designated platform-integration crates. Verified by an automated CI check that scans source files and fails the build on violations.
NFR8: JavaScript on origin A cannot read DOM content, cookies, or fetch responses from origin B (different scheme, host, or port). Verified by cross-origin integration tests covering each resource type.
NFR9: Top-level navigation to javascript: and data: URIs is blocked; sub-resource data: URIs are permitted. Verified by navigation tests for each URI scheme.
NFR10: The browser binary contains zero telemetry, analytics, or tracking code. Verified by code audit: no outbound network requests are made except those explicitly initiated by page content or user navigation.
NFR11: The browser does not crash on any valid or malformed web content. Parser, layout, and render failures produce user-visible error messages instead of panics. Verified by running the full WPT and Test262 suites plus malformed-input tests without process termination.
NFR12: The CI gate passes on every merged change, covering formatting, linting, all test suites, safety policy, and metrics. Verified by CI pass/fail status on every merge.
NFR13: Every bug fix includes at least one regression test that reproduces the bug and verifies the fix. Verified by code review policy.
NFR14: Conformance test suites (golden tests, WPT, Test262) run on every CI build. Any test that previously passed and now fails blocks the merge. Verified by CI harness exit codes.
NFR15: The browser displays a user-visible error page (not a blank screen or hang) within 10 seconds of a network failure (timeout, DNS error, connection refused). Verified by network failure integration tests with simulated failures.
NFR16: No crate in a lower architectural layer depends on a crate in a higher layer. Verified by an automated dependency check in CI that parses Cargo.toml files and fails on violations.
NFR17: Each crate has a single documented responsibility. No crate's public API surface exceeds 50 exported items. Verified by periodic API surface audit.
NFR18: No source file exceeds 1,000 lines. Verified by an automated file-size check in CI.
NFR19: New external dependencies require documented rationale and workspace-level version pinning. Verified by code review policy.
NFR20: Implementation of non-obvious spec behavior includes a comment citing the relevant spec section (e.g., CSS 2.1 section 8.3.1). Verified by code review policy.
NFR21: The total crate count does not exceed 30 and total source file count does not exceed 500. Verified by periodic metrics collection in CI.
Total NFRs: 21
Additional Requirements
- Project classification: desktop application, general systems software, high complexity, brownfield context.
- Platform scope: macOS and Linux are current targets; Windows is deferred.
- Source-only distribution is current for Phases 1-2; packaged distribution is a future Phase 3 evaluation item.
- Offline capability scope includes current
file://support and HTTP caching, with Service Workers deferred to Phase 3. - All OS integrations must flow through
crates/platform/; system font integration must use the existingFontProvidertrait incrates/fonts/. - Clipboard and file dialog integration should prefer cross-platform Rust crates to preserve the layering model.
- New system integrations and all new dependencies require explicit rationale per project policy.
- Explicitly out of scope: mobile platforms and a browser extensions/add-on system.
- Sequencing constraint: Phase 2 proceeds CSS 2.1 -> HTML5 -> ECMAScript, with interleaving only when dependencies or testing needs require it.
- Risk constraints captured in the PRD: JS engine compliance remains a high-severity effort; CSS 2.1 and HTML5 parser long-tail items are medium-severity execution risks; single-person throughput is a medium resource risk.
PRD Completeness Assessment
- The PRD is structurally complete and unusually specific: it contains explicit success metrics, phased scope, 50 functional requirements, 21 non-functional requirements, acceptance criteria for each FR, and clear out-of-scope boundaries.
- Traceability is strong at the PRD level because user journeys map to FR/NFR ranges and phase tags identify when deferred requirements are expected to land.
- The main completeness gap is the absence of a separate UX design artifact, which may reduce implementation readiness for browser-shell interactions and future tabbed UI work even though the PRD does describe the shell requirements.
- Several FRs bundle multiple sub-capabilities under one ID (
FR5,FR7,FR20), which is workable for product definition but may complicate one-to-one epic/story traceability if the epics are not decomposed at the same granularity.
Epic Coverage Validation
Epic FR Coverage Extracted
FR1: Covered in Epic 2 FR2: Covered in Epic 1 FR3: Covered in Epic 1 FR4: Covered in Epic 1 FR5a: Covered in Epic 1 FR5b: Covered in Epic 1 FR6: Covered in Epic 2 FR7a: Covered in Epic 1 FR7b: Covered in Epic 1 FR8: Covered in Epic 1 FR9: Covered in Epic 1 FR10: Covered in Epic 1 FR11: Covered in Epic 3 FR12: Covered in Epic 2 FR13: Covered in Epic 2 and Epic 3 FR14: Covered in Epic 3 FR15: Covered in Epic 3 FR16: Covered in Epic 3 FR17: Covered in Epic 3 FR18: Covered in Epic 5 FR19: Covered in Epic 5 FR20a: Covered in Epic 5 FR20b: Covered in Epic 5 FR21: Covered in Epic 5 FR22: Covered in Epic 5 FR23: Covered in Epic 5 FR24: Covered in Epic 5 FR25: Covered in Epic 2 FR26: Covered in Epic 4 FR27: Covered in Epic 4 FR28: Covered in Epic 4 FR29: Covered in Epic 4 FR30: Covered in Epic 4 FR31: Covered in Epic 5 FR32: Not covered in epics FR33: Covered in Epic 5 FR34: Covered in Epic 5 FR35: Covered in Epic 5 FR36: Covered in Epic 5 FR37: Not covered in epics FR38: Covered in Epic 6 FR39: Covered in Epic 6 FR40: Not covered in epics FR41: Covered in Epic 5 FR42: Covered in Epic 6 FR43: Not covered in epics FR44: Not covered in epics FR45: Not covered in epics FR46: Not covered in epics FR47: Covered in Epic 1 FR48: Covered in Epic 3 FR49: Covered in Epic 2 FR50: Covered in Epic 6
Total FRs in epics: 43
Coverage Matrix
| FR Number | PRD Requirement | Epic Coverage | Status |
|---|---|---|---|
| FR1 | Parse HTML into DOM tree | Epic 2 | Covered |
| FR2 | Parse CSS and compute styles | Epic 1 | Covered |
| FR3 | Layout for block/inline/flex/table/positioned | Epic 1 | Covered |
| FR4 | Display list generation and rasterization | Epic 1 | Covered |
| FR5a | Font selection | Epic 1 | Covered |
| FR5b | Line breaking and text rendering | Epic 1 | Covered |
| FR6 | Image rendering across formats | Epic 2 | Covered |
| FR7a | Backgrounds and borders | Epic 1 | Covered |
| FR7b | Box-shadow, gradients, opacity | Epic 1 | Covered |
| FR8 | Generated content | Epic 1 | Covered |
| FR9 | Selector matching and cascade | Epic 1 | Covered |
| FR10 | CSS inheritance and initial/unset handling | Epic 1 | Covered |
| FR11 | JavaScript parsing and execution | Epic 3 | Covered |
| FR12 | Inline/external/async/defer script loading | Epic 2 | Covered |
| FR13 | DOM APIs exposed to JavaScript | Epic 2 and Epic 3 | Covered |
| FR14 | Event dispatch phases | Epic 3 | Covered |
| FR15 | Microtasks, macrotasks, animation frame ordering | Epic 3 | Covered |
| FR16 | Console/JSON/fetch/storage/DOM web APIs | Epic 3 | Covered |
| FR17 | JS runtime error handling without crash | Epic 3 | Covered |
| FR18 | URL entry and navigation | Epic 5 | Covered |
| FR19 | HTTP/HTTPS/file/data resource loading | Epic 5 | Covered |
| FR20a | Redirect following | Epic 5 | Covered |
| FR20b | HTTP error page display | Epic 5 | Covered |
| FR21 | RFC6265 cookie handling | Epic 5 | Covered |
| FR22 | HTTP caching and conditional requests | Epic 5 | Covered |
| FR23 | Session state across navigations | Epic 5 | Covered |
| FR24 | Back/forward history | Epic 5 | Covered |
| FR25 | Relative URL and <base href> resolution |
Epic 2 | Covered |
| FR26 | Form control interaction | Epic 4 | Covered |
| FR27 | Form submission and multipart uploads | Epic 4 | Covered |
| FR28 | Client-side validation | Epic 4 | Covered |
| FR29 | Click/keyboard/scroll interaction | Epic 4 | Covered |
| FR30 | Focus and keyboard navigation | Epic 4 | Covered |
| FR31 | Address bar display and editing | Epic 5 | Covered |
| FR32 | Tab creation/switch/close with isolated state | Not found | Missing |
| FR33 | Vertical and horizontal scrolling | Epic 5 | Covered |
| FR34 | Loading indicator lifecycle | Epic 5 | Covered |
| FR35 | Reload and stop navigation | Epic 5 | Covered |
| FR36 | Browser chrome UI including future tab bar | Epic 5 | Covered |
| FR37 | Tracker/ad blocking | Not found | Missing |
| FR38 | Same-origin policy enforcement | Epic 6 | Covered |
| FR39 | Block top-level javascript: and data: navigation |
Epic 6 | Covered |
| FR40 | Persist cookies/session state across restart | Not found | Missing |
| FR41 | Offline cached response serving | Epic 5 | Covered |
| FR42 | localStorage and sessionStorage | Epic 6 | Covered |
| FR43 | OS-installed font discovery | Not found | Missing |
| FR44 | System clipboard integration | Not found | Missing |
| FR45 | Native file dialogs | Not found | Missing |
| FR46 | Default URL handler registration | Not found | Missing |
| FR47 | CSS 2.1 WPT 90%+ | Epic 1 | Covered |
| FR48 | Test262 95%+ | Epic 3 | Covered |
| FR49 | HTML5 WPT 90%+ | Epic 2 | Covered |
| FR50 | Malformed input resilience | Epic 6 | Covered |
Missing Requirements
Critical Missing FRs
FR32: [P3] The user opens new tabs, switches between tabs, and closes tabs. Each tab maintains independent navigation history, DOM state, and scroll position.
- Impact: This is a core Phase 3 daily-driver capability and is explicitly referenced by the PRD journey for real browser use.
- Recommendation: Add a dedicated Phase 3 epic for tabbed browsing or extend Epic 5 with a clearly deferred Phase 3 section and stories.
FR37: [P3] The browser blocks tracker and advertisement requests by matching URLs against a bundled blocklist.
- Impact: This is the primary privacy feature in the product vision; leaving it out breaks traceability to the stated privacy-first positioning.
- Recommendation: Add a Phase 3 privacy epic or an Epic 6 extension for network request filtering and rule management.
FR40: [P3] The browser persists cookies and session data to disk and restores them on application restart.
- Impact: Daily-driver continuity across restarts is not planned in the current epic set, weakening the Daily Driver journey.
- Recommendation: Add storage persistence stories under Epic 5 or Epic 6 with explicit restart-validation tests.
FR43: [P3] The browser discovers and uses OS-installed fonts on macOS and Linux, falling back to bundled Noto Sans.
- Impact: This affects rendering fidelity on real sites and is called out in both PRD and architecture constraints.
- Recommendation: Add a platform/system integration epic or Epic 1 follow-on stories for system font discovery.
FR44: [P3] The user copies selected text to the system clipboard and pastes text from the clipboard into form inputs.
- Impact: Missing clipboard support undermines normal desktop-browser usability.
- Recommendation: Add desktop integration stories under a new Phase 3 system-integration epic.
FR45: [P3] The browser presents native file dialogs for file upload and download.
- Impact: File upload/download workflows remain incomplete for real-world web apps.
- Recommendation: Add platform dialog integration stories under a Phase 3 system-integration epic.
FR46: [P3] The browser registers as the default URL handler on macOS and Linux.
- Impact: This blocks a key desktop integration expectation in the PRD’s daily-driver vision.
- Recommendation: Add packaging/OS registration stories under a Phase 3 distribution/system-integration epic.
Coverage Statistics
- Total PRD FRs: 50
- FRs covered in epics: 43
- Coverage percentage: 86%
- Uncovered FRs: FR32, FR37, FR40, FR43, FR44, FR45, FR46
- Observation: the uncovered set exactly matches the epics document's declared
scopeExclusionsfor Phase 3 requirements.
UX Alignment Assessment
UX Document Status
Not found.
Alignment Issues
- UX is clearly implied by the PRD because this is a user-facing desktop browser with explicit requirements for address bar editing, navigation controls, loading indicators, scrolling behavior, forms, focus navigation, error pages, and a future tabbed interface.
- The architecture does account for many of those UX-facing capabilities at a systems level:
- Browser shell and UI responsibilities are assigned to
browser_runtimeandapp_browser. - Tab isolation and future multi-process evolution are described.
- Clipboard and file dialog integration are explicitly routed through
crates/platform/. - Performance constraints that affect UX responsiveness are acknowledged in the architecture.
- Browser shell and UI responsibilities are assigned to
- The main alignment gap is that there is no artifact translating these product and architectural capabilities into explicit UX flows, interaction states, visual behavior, or edge-case handling for the browser chrome and desktop integration features.
- This gap is most visible around Phase 3 features: tabs, loading-state presentation, clipboard behavior, file dialogs, and URL-handler/system integration are architecturally mentioned but not represented as UX decisions.
Warnings
- Warning: UX documentation is missing for a user-facing desktop application with substantial browser-shell interaction requirements.
- Warning: Epic 5 covers browser chrome behavior functionally, but without a UX artifact there is no documented source of truth for interaction details such as control states, loading affordances, tab behaviors, and error/retry flows.
- Warning: The lack of UX documentation increases implementation risk for future Phase 3 daily-driver features because the architecture can support them, but no validated user interaction model has been captured.
Epic Quality Review
Critical Violations
-
Epic 2 and Epic 3 are framed primarily as technical milestones rather than user-value outcomes.
- Epic 2 title:
Document Completeness -- HTML5 Full Support - Epic 3 title:
Interactive Web -- JavaScript Engine Maturity - Why this is a defect: the user value is implicit, but the epic framing is implementation-centric (
HTML5 Full Support,Engine Maturity) rather than describing a user-visible capability that can be consumed independently. - Remediation: rename and restate these epics around user outcomes, for example "Real Sites Parse and Load Correctly" and "JS-Driven Sites Behave Correctly", while preserving the existing story set.
- Epic 2 title:
-
The epic set is not fully implementation-ready against the full PRD because the document explicitly excludes all Phase 3 FRs instead of representing them as deferred epics.
- Evidence:
scopeExclusionsremoves FR32, FR37, FR40, FR43, FR44, FR45, FR46. - Why this is a defect: the workflow goal is implementation readiness across planning artifacts; excluded PRD requirements mean the plan is only partially ready.
- Remediation: add explicit deferred epics for the Phase 3 set so the plan remains complete even if execution order is later.
- Evidence:
-
Story 5.1 conflicts with Story 6.2 and with PRD FR39 on top-level
data:URI navigation.- Story 5.1 says top-level navigation to a
data:URI should decode and render. - Story 6.2 says top-level navigation to a
data:URI must be blocked. - Why this is a defect: contradictory acceptance criteria make independent implementation impossible and create a direct forward conflict between epics.
- Remediation: align Story 5.1 with FR39 by restricting allowed
data:usage to sub-resources only, or revise FR19/FR39 if the product decision has changed.
- Story 5.1 says top-level navigation to a
Major Issues
-
Epic 1 appears twice with duplicate headings and duplicated overview content.
- Why this matters: it introduces ambiguity about whether the first short Epic 1 block and the second full Epic 1 block are separate planning objects or accidental duplication.
- Remediation: collapse to one Epic 1 definition.
-
Epic independence is mostly sequential rather than independently valuable.
- Epic 1, 2, and 3 are ordered logically, but a user cannot realize much of the stated value from Epic 3 without Epic 2 and Epic 5 being present; similarly some Epic 5 value depends on prior form, DOM, and JS work.
- Why this matters: for a browser engine this may be practical, but it still weakens the "each epic stands alone" standard the workflow demands.
- Remediation: explicitly state the dependency ladder and phrase each epic as a usable increment at the current maturity stage, not as an isolated final-user outcome.
-
Some stories are epic-sized implementation slices rather than tightly bounded increments.
- Examples: Story 2.1 (all tokenizer states), Story 2.2 (all insertion modes), Story 3.5 (full Array/String/Object built-in completeness), Story 3.6 (full Date/RegExp/Map/Set completeness).
- Why this matters: these are likely too large for predictable completion and verification in one story.
- Remediation: split by feature family or spec subsection into smaller, independently verifiable stories.
-
Several acceptance criteria are strong on happy-path behavior but thin on explicit negative/error cases.
- Examples: Story 2.6 does not cover script load failures; Story 2.8 does not cover iframe load failure or cross-origin constraints; Story 5.6 does not cover disabled-state behavior for navigation controls.
- Remediation: add explicit error-state and edge-case ACs where browser behavior is user-visible.
Minor Concerns
- The document uses a mix of epic framing styles: some are clearly user-facing (
User Input & Forms), while others emphasize internal implementation goals (JavaScript Engine Maturity). - Story formatting is generally consistent BDD, but some stories end with generalized "checklist updated and
just cipasses" clauses that are process requirements rather than user-facing acceptance behavior. - The brownfield context is handled correctly overall; there is no inappropriate greenfield setup story, which is a positive compliance point.
Best Practices Compliance Checklist
- Epic delivers user value: Partial
- Epic can function independently: Partial
- Stories appropriately sized: Partial
- No forward dependencies: Failed
- Database tables created when needed: Not applicable
- Clear acceptance criteria: Mostly pass
- Traceability to FRs maintained: Pass for included scope, fail for excluded Phase 3 scope
Recommendations
- Convert the excluded Phase 3 FR set into explicit deferred epics instead of omitting them from planning.
- Resolve the
data:URI contradiction between Story 5.1, Story 6.2, and PRD FR39 before implementation begins. - Reframe technical epics around user-visible outcomes and split the largest spec-compliance stories into smaller increments.
- Remove duplicate Epic 1 scaffolding and tighten acceptance criteria around failure modes for browser-visible behaviors.
Summary and Recommendations
Overall Readiness Status
NOT READY
Critical Issues Requiring Immediate Action
- The epics document does not cover 7 PRD functional requirements: FR32, FR37, FR40, FR43, FR44, FR45, FR46.
- UX documentation is missing even though the product is a user-facing desktop browser with substantial shell and interaction requirements.
- Story 5.1 and Story 6.2 directly contradict each other on top-level
data:URI navigation, and Story 5.1 conflicts with PRD FR39. - Two epics are still framed as technical milestones rather than clean user-value increments, weakening implementation readiness and sequencing clarity.
Recommended Next Steps
- Revise
epics.mdto add explicit deferred Phase 3 epics covering FR32, FR37, FR40, FR43, FR44, FR45, and FR46. - Create a UX design artifact for browser chrome, loading/error states, tab behavior, and desktop integration interactions, then re-run readiness validation.
- Resolve the
data:URI policy contradiction and de-duplicate Epic 1 before implementation starts. - Re-scope the largest stories into smaller increments and reframe Epic 2 and Epic 3 around user-visible outcomes rather than internal implementation maturity.
Final Note
This assessment identified 10 substantive issues across 4 categories: coverage gaps, UX documentation, epic/story quality, and internal consistency. Address the critical issues before proceeding to implementation. The current artifacts are strong at the PRD and architecture level, but the planning set as a whole is not yet implementation-ready.