Skip to content

Architecture Case Study

FlowTrace

Deterministic regression recording and replay engine for dynamic enterprise web apps like Oracle Fusion ERP. Solves brittle selector failures across quarterly vendor updates using a two-tier verification engine (Chrome MV3 + headless Node.js Playwright daemon) with 4-step self-healing fallbacks.

PlaywrightTypeScriptNode.jsChrome MV3Enterprise ERPLive Deployment ↗

1. The Situation

Large enterprise applications (Oracle Fusion ERP, SAP) regenerate DOM element IDs across sessions and break brittle E2E tests on quarterly vendor patches. Manual regression verification costs ~20 minutes per business flow.

2. The Constraint & Tension

Enterprise ERP systems regenerate DOM element IDs across sessions and quarterly patches (`#btn-submit-8942` → `#btn-submit-3180`). Standard test runners break immediately or report false greens without validating that the business operation succeeded.

3. The Architecture Decision

Built a two-tier verification engine combining Chrome MV3 telemetry with a headless Node.js Playwright daemon. Designed a 4-step self-healing fallback (ARIA accessibility tree → contextual parent attributes → action text) with state mutation assertions (verifying modal dismissals and network responses before confirming step execution).

Consequence & Verified Outcome

45 defect-specific behavioral checks. Verified capture of confirmation dialogs before dismissal. The recorder and replayer share zero code at runtime, communicating solely via the recording JSON contract.

4. System Architecture

FlowTrace Architecture PipelineTwo-Tier Engine
MV3 ExtensionVendored Selector EngineZero chrome.debuggerRecording ContractStrict JSON (shared = 0)Self-Healing ReplayerIndependent AssertionsWrites fix back to file
Hover steps to inspect boundary contracts

5. Verbatim Code Evidence

Artifact Excerptflowtrace/README.md:84-85
// The recorder and replayer share no code and never run together.
// The recording file is the entire contract between them.
Artifact Excerptflowtrace/recorder/scripts/vendor-injected.mjs:2-3
// vendor-injected.mjs — extract Playwright's injected script from the shipped
// playwright-core bundle and vendor it as a pinned build artifact.

6. Trade-offs & What's Left

Extracting Playwright's internal selector generator requires marker-based string extraction of bundled source during build, which requires pinned dependencies and strict CI validation against Playwright upgrades.

Active Roadmap

  • Headless PDF regression visual diffing
  • Multi-tenant cloud replayer workers