opendevbrowser-best-practices
This is the primary battery pack for OpenDevBrowser operations.
OpenDevBrowser Best Practices
This is the primary battery pack for OpenDevBrowser operations.
Use this skill when you need:
- provider-oriented workflows (
web,community,social), - script-first runbooks,
- parity across
managed,extension,cdpConnect, - diagnostics for QA/debug (
console,network, trace context), - safe write flows with explicit policy notice.
For frontend, design-system, screenshot-to-code, or /canvas composition tasks, load opendevbrowser-design-agent immediately after this pack so the work is design-contract-first instead of operations-only.
Pack Contents
artifacts/provider-workflows.md- canonical provider execution flows.artifacts/parity-gates.md- mode/surface parity matrix and acceptance gates.artifacts/debug-trace-playbook.md- diagnostics workflow and trace bundle model.artifacts/fingerprint-tiers.md- hardening tiers and when to use each.artifacts/macro-workflows.md- macro design and expansion standards.artifacts/browser-agent-known-issues-matrix.md- known browser-agent failure modes mapped to required controls.artifacts/command-channel-reference.md- CLI/tool//ops//canvas//cdpsurface map plus cross-agent skill-sync targets.artifacts/canvas-governance-playbook.md-/canvaspreflight, blocker, and feedback-evaluation guidance.artifacts/skill-runtime-surface-matrix.md- canonical skill-pack and runtime-family inventory for real-task audits.assets/templates/mode-flag-matrix.json- mode + flag verification template.assets/templates/ops-request-envelope.json-/opsrequest envelope template.assets/templates/cdp-forward-envelope.json-/cdprelay envelope template.assets/templates/robustness-checklist.json- shared issue-status checklist for workflow robustness audits.assets/templates/surface-audit-checklist.json- docs/surface audit checklist template.assets/templates/skill-runtime-pack-matrix.json- machine-readable canonical skill/runtime matrix for the audit runner.assets/templates/canvas-handshake-example.json- canonical/canvashandshake example.assets/templates/canvas-generation-plan.v1.json- requiredcanvas.plan.setrequest skeleton.assets/templates/canvas-feedback-eval.json- target-attributed feedback evaluation checklist.assets/templates/canvas-blocker-checklist.json- machine-readable blocker and warning audit map.scripts/odb-workflow.sh- prints codified command sequences by workflow.scripts/run-robustness-audit.sh- validates workflow skill coverage against known issue IDs.scripts/validate-skill-assets.sh- validates required artifacts/templates.
Quick Start
- Validate the skill pack:
./skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh
- Pick a workflow:
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh provider-crawl
- Execute the printed sequence with session-specific values.
- Surface full controls directly from CLI help when auditing runtime accessibility:
npx opendevbrowser --help
npx opendevbrowser help
- Run robustness coverage checks across workflow skills:
./skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh
- Pair with the dedicated design pack for frontend work:
./skills/opendevbrowser-design-agent/scripts/validate-skill-assets.sh
./skills/opendevbrowser-design-agent/scripts/design-workflow.sh contract-first
Help-Led Surface Discovery
Start every surface audit with generated help so the capability map reflects the currently shipped runtime:
- Browser replay:
screencast-start,screencast-stop - Desktop observation:
desktop-status,desktop-windows,desktop-active-window,desktop-capture-desktop,desktop-capture-window,desktop-accessibility-snapshot - Desktop-assisted browser review:
review-desktop - Browser-scoped computer use:
--challenge-automation-mode off|browser|browser_with_helper,status-capabilities,session-inspector-plan,session-inspector-audit, plus manager-ownedreview,session-inspector, and workflow fallback metadata
Boundary rules:
- desktop observation is public and read-only
- the optional helper remains browser-scoped and is not a desktop agent
- generated help,
docs/CLI.md, anddocs/SURFACE_REFERENCE.mdmust stay aligned whenever this wording changes
Validated Capability Lanes
Load this section directly with:
opendevbrowser_skill_load opendevbrowser-best-practices "validated capability lanes"
Current reliable lanes:
- Public-first YouTube transcript retrieval.
node scripts/youtube-transcript-live-probe.mjs --url "https://www.youtube.com/watch?v=aircAruvnKk" --youtube-mode auto --out artifacts/capability-fix/youtube-transcript-auto.json
Rules:
- keep transcript runs public-first
- browser-assisted transcript fallback is opt-in only
- if browser fallback is enabled, use an isolated automation profile instead of a daily logged-in Google profile
- Generic topical research without shopping contamination.
npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --source-selection auto --mode json --output-format json
Rules:
- use
--source-selection autofor general research - use
--source-selection shoppingor explicit--sources ...shopping...only when the task is deliberately commercial - in the current contract,
autoandallboth resolve toweb,community, andsocial
- Deterministic shopping reruns with explicit providers.
npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --mode json --output-format json
npx opendevbrowser shopping run --query "27 inch 4k monitor" --providers shopping/bestbuy,shopping/ebay --budget 350 --sort lowest_price --browser-mode managed --mode json --output-format json
npx opendevbrowser shopping run --query "wireless earbuds" --providers shopping/amazon --region us --browser-mode managed --mode json --output-format json
Rules:
- use explicit providers plus
--browser-mode managedfor the most reproducible reruns - treat
--regionas advisory unlessmeta.selection.region_authoritative=true - inspect
meta.primaryConstraintSummaryfirst on no-offer runs - if
meta.primaryConstraint.guidanceis present, followmeta.primaryConstraint.guidance.reasonandmeta.primaryConstraint.guidance.recommendedNextCommands[] - if guidance is absent, inspect
meta.offerFilterDiagnosticsbefore calling a no-offer run a provider outage
- Design-contract synthesis with repeated public references.
npx opendevbrowser inspiredesign run --brief "Design a premium docs workspace" --url "https://example.com/reference-a" --url "https://example.com/reference-b" --capture-mode off --include-prototype-guidance --mode json --output-format json
Rules:
- keep inspiredesign references public-first unless the task explicitly requires deeper browser capture
- use repeated
--urlflags instead of packed URL strings - pair this lane with
opendevbrowser-design-agentwhen the brief moves from contract synthesis into implementation or/canvas
Agent Sync Targets
Skill-pack installation and discovery are synchronized for:
opencode(~/.config/opencode/skill, project./.opencode/skill)codex($CODEX_HOME/skillsfallback~/.codex/skills, project./.codex/skills)claudecode($CLAUDECODE_HOME/skillsfallback~/.claude/skills, project./.claude/skills)ampcli($AMP_CLI_HOME/skillsfallback~/.amp/skills, project./.amp/skills)
Install and update refresh managed copies of these canonical packs; uninstall removes managed canonical packs and only prunes empty legacy research or shopping leftovers.
Required Operating Rules
- Prefer refs from
opendevbrowser_snapshotover raw selectors. - Use one action per decision loop: snapshot -> action -> snapshot.
- Keep a single correlation context (
requestId,sessionId) across a run. - Run the same workflow shape across all three modes before claiming parity.
- Default to read/research workflows. Social posting probes remain disabled unless explicitly requested via direct-run opt-in (
--include-social-posts). - Apply rate-limit/backoff discipline (
Retry-Afteraware) whenever 429 pressure appears. - Re-check extension readiness on resume when a run crosses idle windows.
Parallel Operations (Reliable As-Is)
- Safe parallelism today is
session-per-worker(one session per page/tab command stream). - Keep each session single-writer for target/page actions; run commands serially inside that session.
- Do not run independent concurrent streams that alternate
target-usewithin one session. - Use default extension
/opsfor relay-backed concurrency; use/cdponly for legacy compatibility paths. - For managed parallel runs with persisted profiles, use unique profile paths per session (or disable persistence) to avoid profile lock collisions.
- Treat extension headless attempts (
--extension-only --headless) as expectedunsupported_mode; route headless workloads through managed/cdpConnect instead. - Before extension-mode runs, preflight
npx opendevbrowser status --daemonand requireextensionConnected=trueplusextensionHandshakeComplete=true.
Operational references:
artifacts/provider-workflows.md(see Workflow E)scripts/odb-workflow.sh parallel-multipage-safedocs/CLI.md(concurrency semantics)docs/SURFACE_REFERENCE.md(transport and policy constraints)docs/TROUBLESHOOTING.md(parallel crosstalk and profile-lock remediation)
Known-Issue Robustness Baseline
- Source matrix:
artifacts/browser-agent-known-issues-matrix.md - Reusable checklist:
assets/templates/robustness-checklist.json - Coverage validator:
scripts/run-robustness-audit.sh
Use issue IDs from the matrix in each workflow skill (ISSUE-01 ... ISSUE-12) so robustness checks stay machine-verifiable and DRY.
Provider Workflows (Codified)
Provider Search Workflow
Goal: deterministic query + extraction from one provider.
opendevbrowser_launch noExtension=true
opendevbrowser_goto sessionId="<session-id>" url="<provider-search-url>"
opendevbrowser_wait sessionId="<session-id>" until="networkidle"
opendevbrowser_snapshot sessionId="<session-id>" format="actionables"
# extract targeted results using refs
opendevbrowser_network_poll sessionId="<session-id>" max=50
Provider Crawl Workflow
Goal: multipage fetch + extraction with bounded depth.
opendevbrowser_launch noExtension=true
opendevbrowser_goto sessionId="<session-id>" url="<seed-url>"
opendevbrowser_wait sessionId="<session-id>" until="networkidle"
opendevbrowser_snapshot sessionId="<session-id>" format="actionables"
# capture links/data, enqueue next pages in host logic
opendevbrowser_scroll sessionId="<session-id>" dy=1000
opendevbrowser_wait sessionId="<session-id>" until="networkidle"
QA Debug Workflow
Goal: isolate frontend regressions quickly.
opendevbrowser_snapshot sessionId="<session-id>" format="outline"
opendevbrowser_console_poll sessionId="<session-id>" max=100
opendevbrowser_network_poll sessionId="<session-id>" max=100
opendevbrowser_screenshot sessionId="<session-id>"
Use browser replay when timing matters:
opendevbrowser_screencast_start sessionId="<session-id>" outputDir="./artifacts/qa-replay"
# run the suspect flow
opendevbrowser_screencast_stop sessionId="<session-id>" screencastId="<screencast-id>"
Read-Only Social Validation Workflow
Goal: validate authenticated read/search capability without posting.
- Connect and verify extension readiness (
extensionConnected+ handshake). - Navigate/search target social surface.
- Capture
debug-trace-snapshotandnetwork-pollevidence. - Record blocker/auth status only (no write action).
Workflow Router Script
Use the router script to avoid retyping flows:
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh provider-search
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh provider-crawl
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh inspiredesign
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh qa-debug
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh social-readonly-check
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh parity-check
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh release-direct-gates
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh surface-audit
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh ops-channel-check
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh cdp-channel-check
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh mode-flag-matrix
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh robustness-audit
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh canvas-preflight
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh canvas-feedback-eval
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh skill-runtime-audit
./skills/opendevbrowser-best-practices/scripts/odb-workflow.sh validated-capabilities
Modes and Surface Parity
Always run acceptance on:
- Modes:
managed,extension,cdpConnect - Surfaces: tool API, CLI, daemon RPC
Reference: artifacts/parity-gates.md
Parity gate test:
npm run test -- tests/parity-matrix.test.ts
Treat tests/parity-matrix.test.ts as contract coverage only. Live release proof comes from the direct-run harnesses below.
This pack is the canonical owner of direct-run release evidence policy; other docs and skill packs should point here instead of restating the full policy.
Real-world provider+mode scenario harness (soak replacement):
npm run build
node scripts/provider-direct-runs.mjs --out artifacts/provider-direct-realworld.json
node scripts/live-regression-direct.mjs --out artifacts/live-regression-direct.json
Surface inventory source of truth:
docs/SURFACE_REFERENCE.md(77 CLI commands, 70 tools, 59/opscommands, 35/canvascommands,/cdpenvelope contracts; mirrored bynpx opendevbrowser --helpandnpx opendevbrowser help)artifacts/command-channel-reference.md(skill-pack operational digest)artifacts/skill-runtime-surface-matrix.mdandassets/templates/skill-runtime-pack-matrix.json(canonical pack/runtime audit inventory)
Direct-run release note:
scripts/live-regression-direct.mjsis the preferred release harness for/canvas, annotate, and CLI smoke. It uses temporary managed profiles for managed probes, waits for/opsdrain before the legacy/cdpstep, and keeps manual annotation timeouts as explicitskippedboundaries in--release-gatemode.scripts/provider-direct-runs.mjs --use-global-env --include-high-friction --include-auth-gatedis the preferred provider release harness. Treatprovider-live-matrixandlive-regression-matrixas debug-only helpers, not refreshed release evidence.
Skill Runtime Audit and Realignment
This pack is the canonical owner of repo-local skill runtime audit policy and skill-pack runtime realignment.
Use these assets when the task is to inventory or validate the full OpenDevBrowser skill/runtime surface:
artifacts/skill-runtime-surface-matrix.mdassets/templates/skill-runtime-pack-matrix.jsonscripts/skill-runtime-audit.mjs
Audit runtime rule:
scripts/skill-runtime-audit.mjskeeps smoke mode isolated and reproducible with temp harnesses, but full mode must reuse the current configured daemon and environment forprovider-directandlive-regressionso extension state, cookies, and auth-backed scenarios are exercised for real when available.
Realignment rule:
- when a pack drifts behind current runtime behavior, update the skill to match the repo reality and strengthen the workflow guidance instead of making the pack merely stop failing validation.
Canvas Governance Handshake
Use the design-canvas surface when the workflow needs persisted design documents, explicit governance state, preview tabs, or overlay selection.
Recommended command order:
opendevbrowser_canvasoropendevbrowser canvas --command canvas.session.opento getcanvasSessionId,leaseId,preflightState,planStatus, governance block states, generation-plan requirements, andguidance.recommendedNextCommands.- Read the handshake before mutating. The handshake is the source of truth for:
planStatuspreflightStategovernanceRequirements.requiredBeforeMutationgovernanceRequirements.requiredBeforeSavegenerationPlanRequirements.requiredBeforeMutationgenerationPlanRequirements.allowedValuesgenerationPlanIssuesallowedLibrariesmutationPolicy.allowedBeforePlanguidance.recommendedNextCommandsguidance.reason- treat
allowedLibraries.components,allowedLibraries.icons, andallowedLibraries.stylingas separate policy lanes:
components are reusable UI adapters such as shadcn,
icons are approved icon families,
styling is for utility/theme adapters such as tailwindcss
- Require
preflightState="handshake_read"or inspect the returned invalid-plan state before moving on. If the response already carriesguidance.recommendedNextCommands, follow that list instead of guessing. - Submit
canvas.plan.setwith all required non-empty objects:
targetOutcomevisualDirectionlayoutStrategycontentStrategycomponentStrategymotionPostureresponsivePostureaccessibilityPosturevalidationTargets
Minimum nested fields that commonly cause generation_plan_invalid if omitted:
visualDirection.themeStrategylayoutStrategy.navigationModelcomponentStrategy.interactionStatesmotionPosture.reducedMotionresponsivePosture.requiredViewportsaccessibilityPosture.keyboardNavigationvalidationTargets.requiredThemesvalidationTargets.browserValidationvalidationTargets.maxInteractionLatencyMs
- Immediately inspect the
canvas.plan.setresponse.
- If
planStatus="accepted"orpreflightState="plan_accepted", follow the returnedguidance.recommendedNextCommands. - If the command fails with
generation_plan_invalid, inspectdetails.missingFields,details.issues, and the handshakegenerationPlanIssues, then optionally re-read withcanvas.plan.getorcanvas.capabilities.getbefore resubmitting.
- Only after the plan is accepted, call
canvas.document.patch. - After every successful
canvas.document.patch,canvas.preview.render,canvas.preview.refresh,canvas.feedback.poll,canvas.document.save, orcanvas.document.export, readguidance.recommendedNextCommandsandguidance.reasonbefore deciding the next command. - Use
canvas.preview.render,canvas.tab.open,canvas.overlay.mount, andcanvas.overlay.selectwhen a browser-backed live view is required. - Use
canvas.feedback.pollfor snapshot audits between mutation rounds. When the plan is still missing or invalid, expect a syntheticpreflight-blockeritem instead of normal stage feedback. Usecanvas.feedback.subscribe->canvas.feedback.next->canvas.feedback.unsubscribewhen a live pull-stream is needed. - Use
canvas.document.saveorcanvas.document.exportto persist artifacts.
Code-sync surface:
canvas.session.attachjoins an existing canvas session as anobserveror reclaims the write lease withattachMode=lease_reclaim.canvas.code.bind,canvas.code.unbind,canvas.code.pull,canvas.code.push,canvas.code.status, andcanvas.code.resolvemanage TSX-first document bindings when a canvas file is round-tripped to repo code.
Current /canvas parity notes:
- All 35 public
canvas.*commands are agent-callable throughopendevbrowser_canvasandopendevbrowser canvas --command .... canvas.feedback.subscribelive streaming is public through the CLI only: use--output-format stream-jsonfor the built-in polling bridge.- Tool-driven agents can achieve the same public streaming behavior by calling
canvas.feedback.subscribe, then repeatingcanvas.feedback.next, and finallycanvas.feedback.unsubscribe. canvas.tab.syncandcanvas.overlay.syncare internal extension runtime helpers, not public commands.canvas_htmlis still the default preview/export contract.bound_app_runtimeis opt-in and only valid when runtime preflight and app-side instrumentation succeed.- Component and icon libraries currently render semantically, not package-faithfully. Treat
shadcn,tailwindcss,tabler,microsoft-fluent-ui-system-icons,3dicons, and@lobehub/fluent-emoji-3das metadata and constrained render lanes, not as general library import/export parity. - Annotation remains a separate surface today, but popup and canvas both ship per-item and combined
Copy/Sendactions.Sendnow delivers directly into the active agent chat when scope is safe and degrades to stored-onlyannotate --storedretrieval when scope is missing, ambiguous, or relay enqueue fails.
Tailwind usage rule:
- When
allowedLibraries.stylingincludestailwindcss, use it for layout, spacing, responsive, and state styling over canonical tokens/theme variables. - Do not treat Tailwind as a component inventory source or invent generation-plan allowlists for it; keep styling policy in
allowedLibraries/libraryPolicy. - Preview/export should materialize a deterministic utility-class layer and stay self-contained; do not depend on a remote Tailwind CDN for canvas preview correctness.
Failure handling:
plan_required: immediately callcanvas.plan.set.generation_plan_invalid: resubmitcanvas.plan.setwith every required non-empty generation-plan block present, usinggenerationPlanIssuesplusdetails.missingFieldsanddetails.issuesas the repair checklist.revision_conflict: reload withcanvas.document.loadand replay the patch batch against the latest revision.unsupported_targetorrestricted_url: move the preview to a normal http(s) tab or fall back to managed mode.- If a freshly rebuilt unpacked extension still shows old
/canvasor popup behavior, reload the extension in Chrome before trusting the live result; stale MV3 runtime state can preserve old service-worker logic afternpm run extension:build.
Operational references:
artifacts/canvas-governance-playbook.mdassets/templates/canvas-handshake-example.jsonassets/templates/canvas-generation-plan.v1.jsonassets/templates/canvas-feedback-eval.jsonassets/templates/canvas-blocker-checklist.json
Diagnostics and Traceability
Current diagnostics tools:
opendevbrowser_session_inspector(session-first summary with relay health, target state, trace proof, and next-action guidance)opendevbrowser_console_pollopendevbrowser_network_pollopendevbrowser_debug_trace_snapshot(combined page + console + network + exception channels)
Reference: artifacts/debug-trace-playbook.md
Fingerprint Hardening
Apply the minimum tier that meets reliability goals.
- Tier 0: baseline deterministic automation.
- Tier 1: coherence profile (default recommended).
- Tier 2: runtime hardening.
- Tier 3: adaptive managed hardening (optional).
Reference: artifacts/fingerprint-tiers.md
Macro Guidance
Use macros as normalized entrypoints for provider workflows.
- Keep macro definitions declarative and typed.
- Expand macros to canonical provider queries.
- Emit provenance metadata (
macro,resolvedQuery,provider).
Reference: artifacts/macro-workflows.md
# Skill source cat skills/opendevbrowser-best-practices/SKILL.md