exhibit

Exhibit Product and Technical Design

Status: Approved for implementation Date: 2026-07-25 Approval basis: The supplied “Exhibit — Full Product Plan” explicitly requests full autonomous implementation. This document makes implementation choices without changing that approved product scope.

1. Product

Exhibit is a local-first Chrome DevTools extension for QA engineers, developers, and support teams. A user opens DevTools on an authorized tab, starts recording, exercises the site, and gets an evidence-led explanation of every browser-visible API interaction.

Exhibit answers:

Exhibit never claims visibility into server-to-server traffic that Chrome did not receive.

2. Release Scope

Version 1 includes phases 1–4 of the supplied plan:

Explicitly deferred:

3. Architecture Decision

Selected: WXT + React + strict TypeScript

WXT provides Manifest V3 output, file-based extension entrypoints, React integration, test support, and reproducible packaging while retaining direct access to Chrome DevTools APIs. Domain logic remains framework-independent behind typed ports.

Rejected alternatives

  1. Raw Vite plus hand-maintained manifest: maximum control, but adds custom build, reload, manifest, and packaging plumbing without improving capture fidelity.
  2. Chrome Debugger Protocol or local proxy: richer low-level events, but chrome.debugger competes with an open DevTools session and a proxy violates the no-proxy product contract.

4. Runtime Components

DevTools bootstrap

Creates one “Exhibit” panel per inspected tab. It owns no product state and only registers the panel.

Panel application

Owns the recording lifecycle, network listener, session model, views, search, filters, export, settings, and accessibility behavior. It consumes the CaptureSource, SessionRepository, and InteractionSource ports.

Chrome capture adapter

Uses chrome.devtools.network.onRequestFinished, getHAR(), and Request.getContent(). It:

Interaction bridge

On Start, a background worker requests the current origin’s optional host permission from the user gesture, then injects a small isolated content script into the inspected tab. The script captures metadata—not field values—for clicks, submits, history navigation, and page navigation. Events are timestamped before page handlers run and relayed through a tab-scoped runtime port.

If permission is denied or the page is restricted, network capture still works and the UI clearly labels interaction grouping as unavailable.

Normalization and analysis pipeline

Each observed request passes through deterministic, separately testable stages:

  1. Convert HAR and response content into an immutable CapturedRequest.
  2. Apply size policy and content-state labels.
  3. Redact sensitive material before any repository write.
  4. Classify protocol and framework evidence with confidence and reasons.
  5. Correlate redirects, repeated calls, navigation, and interaction events.
  6. Produce plain-language explanation facts.
  7. Add the record to the bounded session ring.

No stage mutates raw Chrome objects.

Local repositories

5. Capture Contract and Honest Limits

Exhibit captures only browser-visible DevTools evidence. A request may lack a body because it is binary, streamed, cached, blocked, too large, canceled, compressed in an unsupported way, or unavailable through Chrome’s API.

The UI uses three confidence levels:

Specific rules:

6. Privacy and Permissions

Default redaction covers:

Redaction preserves structure and replaces values with stable [REDACTED] markers. It never logs the removed value.

7. Performance Policy

8. Domain Model

Core records:

IDs are generated locally. URLs retain origin and route while sensitive query values are redacted.

9. User Experience

Visual direction

“Calm forensic workspace”: dense enough for developers, legible enough for QA. Deep graphite and warm porcelain surfaces, electric-cyan live state, mint success, amber caution, and coral failure. Typography uses a bundled humanist sans for interface copy and bundled mono for evidence. No gradients, decorative dashboards, or generic card grids.

Layout

Empty and degraded states

Every non-happy path gets a designed state:

Accessibility

10. Explain and Inspect Behavior

Explain leads with one sentence: recent correlated interaction, request kind, outcome, duration, and confidence, without claiming causation. It then shows safe submitted fields, returned result summary, related calls, cache/repeat/redirect facts, and evidence-based next steps.

Inspect exposes normalized and raw evidence:

The same redacted domain record powers both views, preventing privacy drift.

11. Export

Sanitized HAR export:

QA report export:

12. Test Strategy

All implementation follows red → green → refactor.

Coverage gate

Vitest enforces at least 90% statements, branches, functions, and lines across substantive source code. Generated output, fixture applications, type declarations, and one-line entrypoint bootstraps are excluded; domain, adapters, state, exports, and UI behavior are not.

Unit and component tests

Integration fixtures

A local fixture server covers REST, GraphQL, fetch, XHR, forms, redirect, delay, cancellation, cache, service worker, CORS/CSP-like failures, upload, download, stream, binary, large bodies, and secrets. A minimal supported Next.js fixture covers API routes, Server Action success/failure, SSR navigation, and RSC/Flight responses.

Automatic browser E2E

Playwright launches its persistent Chromium build with the unpacked MV3 extension. Tests cover:

Google Chrome and Edge no longer permit Playwright’s command-line side-loading path. Therefore CI uses Playwright Chromium, as Playwright requires for extension automation. Final acceptance also performs a smoke test in installed Google Chrome 150 when local interactive loading is available.

Release gates

13. Error Handling

Every external boundary returns a typed result. Capture, permission, body retrieval, storage, decoding, clipboard, and download failures become recoverable UI notices with retry or fallback where useful. A single malformed request can never stop the recording loop. Global error boundaries preserve export/clear controls.

Storage writes are transactional or versioned. On quota or corruption, Exhibit keeps the in-memory session, disables persistence for that session, and explains the recovery path.

14. Packaging and Documentation

Deliverables:

15. Acceptance Criteria

Release is ready only when:

  1. A QA user can record an authorized workflow without site code changes.
  2. Exhibit correctly groups browser-visible calls and clearly labels uncertainty.
  3. Explain and Inspect answer the supplied success questions across required fixtures.
  4. Sensitive fixtures never expose secrets in storage, UI, clipboard, cURL, HAR, report, logs, or test artifacts.
  5. Session limits prevent unbounded memory/storage growth.
  6. Core workflow is keyboard accessible and responsive in narrow and wide DevTools panels.
  7. Production package loads in Chrome and requests only documented permissions.
  8. All quality gates pass, including ≥90% in all four coverage metrics and automatic E2E.