Skip to content

fix(reborn): stabilize Reborn Playwright nightly matrix - #6777

Merged
italic-jinxin merged 8 commits into
mainfrom
issue-6765-stabilize-playwright
Jul 29, 2026
Merged

italic-jinxin merged 8 commits into
mainfrom
issue-6765-stabilize-playwright

Conversation

@italic-jinxin

Copy link
Copy Markdown
Contributor

Summary

  • Fixes typed request dispatch for Trace Commons hold authorization.
  • Updates stale Reborn Playwright assertions for extension lifecycle, settings search, structured errors, iteration-limit warning turns, and workspace tree behavior.
  • Isolates Reborn server workspaces and preserves server logs, traces, screenshots, and videos for failed nightly shards.
  • Removes the remaining restart-approval quarantine after making its permission precondition explicit.

Linked Issue

Closes #6765

Validation

  • cargo fmt --all -- --check
  • cargo clippy -p ironclaw_product --all-targets -- -D warnings
  • cargo build -p ironclaw --bin ironclaw
  • cargo test -p ironclaw_product --test reborn_services_contract — 246 passed
  • Reborn Playwright target shards — 167 passed
  • Remaining shared-harness shards — 46 passed
  • Target shards repeated locally for determinism
  • scripts/ci/check-e2e-matrix-files.sh .github/workflows/reborn-playwright.yml

Security Impact

None. Trace authorization remains scoped to the authenticated tenant and user. The change only corrects typed input decoding.

Database Impact

None.

Blast Radius

Limited to the Trace Commons hold-authorization product command and the shared Reborn Playwright harness/nightly workflow.

Rollback Plan

Revert the E2E commit to restore the previous nightly harness behavior, and revert the product commit independently if the trace authorization dispatch change causes a regression.


Review track: C

@italic-jinxin italic-jinxin added size: L 200-499 changed lines risk: low Changes to docs, tests, or low-risk modules contributor: core 20+ merged PRs labels Jul 28, 2026
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-6777 July 28, 2026 10:42 Destroyed
@github-actions github-actions Bot added scope: ci CI/CD workflows scope: docs Documentation size: S 10-49 changed lines risk: medium Business logic, config, or moderate-risk modules and removed size: L 200-499 changed lines risk: low Changes to docs, tests, or low-risk modules labels Jul 28, 2026
@coderabbitai

coderabbitai Bot commented Jul 28, 2026 •

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5aeacd77-d7f5-40ee-a2ea-07dd0e0c332c

📥 Commits

Reviewing files that changed from the base of the PR and between 7bd96a1 and 85f2016.

📒 Files selected for processing (1)
  • tests/e2e/CLAUDE.md

📝 Walkthrough

Summary by CodeRabbit

  • Bug Fixes

    • Improved trace-hold authorization by decoding typed requests and returning field-level validation errors for invalid submission_id.
    • Updated WebUI E2E assertions and retry/edge-case behaviors (including legacy settings search and pending-message error text).
  • Tests

    • Added typed contract coverage for trace-hold request decoding/validation.
    • Expanded Playwright harness artifact-budget/diagnostics tests and WebUI legacy search scenarios.
  • New Features / Diagnostics

    • Enabled optional per-run Playwright diagnostics recording with automatic screenshot/video/trace capture and artifact-size budgeting/pruning.
    • Updated sharded runs to use per-group artifact limits and upload richer “diagnostics” bundles on failure.
  • Documentation

    • Clarified E2E workflow coverage ownership and diagnostics preservation instructions.

Walkthrough

The PR adds typed Trace Hold authorization input handling and contract coverage, bounded Reborn Playwright diagnostics, workflow updates, deterministic scenario setup, and refreshed WebUI E2E assertions.

Changes

Reborn authorization and Playwright coverage

Layer / File(s) Summary
Typed Trace Hold authorization
crates/ironclaw_product/src/reborn_services/product_capability_handlers.rs, crates/ironclaw_product/tests/reborn_services_contract.rs
TraceHoldAuthorize decodes typed input and forwards submission_id; contract coverage validates invalid identifiers and validation metadata.
Playwright diagnostics pipeline
.github/workflows/*, tests/e2e/reborn_webui_harness.py, tests/e2e/conftest.py, tests/e2e/CLAUDE.md, tests/e2e/scenarios/test_reborn_webui_harness_artifacts.py
Shards configure bounded artifact capture, the harness records browser and server diagnostics, pytest finalizes outcomes, and documentation describes storage and retention.
Deterministic E2E scenarios
.github/workflows/reborn-playwright.yml, tests/e2e/scenarios/test_reborn_webui_v2_legacy_extensions.py, tests/e2e/scenarios/test_reborn_webui_v2_legacy_tool_permissions.py
Catalog failures target only extension requests, restart setup explicitly uses ask_each_time, and the restart scenario is included in its matrix shard.
WebUI regression assertions
tests/e2e/scenarios/test_reborn_*.py
Assertions now match current tree selection, extension lifecycle, inline errors, retry behavior, bounded tool loops, and language search behavior.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant PlaywrightWorkflow
  participant RebornWebUIHarness
  participant BrowserContext
  participant RebornServer
  participant ArtifactUpload
  PlaywrightWorkflow->>RebornWebUIHarness: set artifact directory and byte budget
  RebornWebUIHarness->>RebornServer: start server with workspace and logs
  RebornWebUIHarness->>BrowserContext: capture screenshots, trace, and video
  RebornServer->>RebornWebUIHarness: write stdout and stderr logs
  PlaywrightWorkflow->>ArtifactUpload: upload shard diagnostics
Loading

Possibly related issues

  • nearai/ironclaw#6765 — Directly covers stabilizing the affected Reborn Playwright shards and preserving failure diagnostics.
  • nearai/ironclaw#6771 — Relates to Reborn Playwright server startup and diagnostic artifact handling.
  • nearai/ironclaw#2828 — Relates to organizing and strengthening E2E harness coverage and diagnostics.

Possibly related PRs

Suggested reviewers: serrrfirat

🚥 Pre-merge checks | ✅ 3 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The Trace Commons hold-authorization product changes and contract test are outside #6765's Reborn Playwright stabilization scope. Split the Trace Commons dispatch fix into a separate PR or add a linked issue; keep this PR focused on the Reborn browser/nightly stabilization work.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed Conventional Commits style matches the main change: Reborn Playwright nightly stabilization.
Description check ✅ Passed The description covers summary, linked issue, validation, impact, blast radius, rollback, and review track; only some template sections are omitted.
Linked Issues check ✅ Passed The Reborn workflow, harness, artifact retention, and flaky test updates align with #6765's stability and failure-artifact goals.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/e2e/scenarios/test_reborn_webui_v2_legacy_pending_messages.py`:
- Around line 867-872: Update the retry assertions in the test around
_submitted_response() to verify the expected successful WebUI state after
clicking “Retry message.” Retain the existing checks that the failed message is
resolved, but also assert the rendered content or state produced by
_submitted_response() so a different terminal error cannot satisfy the test.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e1223989-3099-474e-a961-b3ed87d055d8

📥 Commits

Reviewing files that changed from the base of the PR and between 676908a and 8d51edd.

📒 Files selected for processing (12)
  • .github/workflows/README.md
  • .github/workflows/reborn-playwright.yml
  • crates/ironclaw_product/src/reborn_services/product_capability_handlers.rs
  • crates/ironclaw_product/tests/reborn_services_contract.rs
  • tests/e2e/reborn_webui_harness.py
  • tests/e2e/scenarios/test_reborn_v2_file_download.py
  • tests/e2e/scenarios/test_reborn_webui_v2_extensions_api.py
  • tests/e2e/scenarios/test_reborn_webui_v2_legacy_extensions.py
  • tests/e2e/scenarios/test_reborn_webui_v2_legacy_pending_messages.py
  • tests/e2e/scenarios/test_reborn_webui_v2_legacy_settings_search.py
  • tests/e2e/scenarios/test_reborn_webui_v2_legacy_tool_execution.py
  • tests/e2e/scenarios/test_reborn_webui_v2_legacy_tool_permissions.py

Comment thread tests/e2e/scenarios/test_reborn_webui_v2_legacy_pending_messages.py
@ironloopai

ironloopai Bot commented Jul 28, 2026 •

Copy link
Copy Markdown
Contributor

🔎 Review · PR #6777

⚫ Cancelled · Target changed

The target changed before this Run could finish.

Automatic · PR opened · attempt 0 of 3 · cancelled after 1s

Run details
  • Repository: nearai/ironclaw
  • Base: main at 676908a
  • Head: issue-6765-stabilize-playwright at 8d51edd
  • Created: Jul 28, 2026, 10:47 AM UTC
  • Updated: Jul 28, 2026, 10:47 AM UTC
  • Run: 3797e8f9-6680-4f21-8b6a-88d5aa340d78

@italic-jinxin

Copy link
Copy Markdown
Contributor Author

@claude review

@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-6777 July 28, 2026 10:51 Destroyed
@claude

This comment was marked as resolved.

@railway-app

railway-app Bot commented Jul 28, 2026 •

Copy link
Copy Markdown

🚅 Deployed to the ironclaw-pr-6777 environment in ironclaw-ci-preview

Service Status Web Updated (UTC)
ironclaw ✅ Success (View Logs) Web Jul 29, 2026 at 9:39 am

@github-actions

github-actions Bot commented Jul 28, 2026 •

Copy link
Copy Markdown
Contributor

Coverage ratchet

Ratchet mode: ENFORCING

RATCHET PASS: global
  observed: 85.73% (313854 / 366095 lines)
  floor:    80.81% (tolerance 0.5pp -> effective floor 80.31%)
  denominator: 366095 lines now vs 377084 at floor capture (-10989 lines, -2.91%) — not a material change

⚠️ 2 Reborn crate(s) have 0 int-tier coverage (target: 0) — ironclaw_prompt_envelope, ironclaw_scripts

Reborn integration-tier coverage

Line coverage (Reborn crates): 85.73% — 313854 / 366095 lines

Per-crate breakdown (60 crates, lowest-covered first)
Crate Line % Covered / Total
ironclaw_prompt_envelope 0% 0 / 88
ironclaw_scripts 0% 0 / 345
ironclaw_process_sandbox 33.91% 118 / 348
ironclaw_host_ingress 42.5% 17 / 40
ironclaw_event_projections 43.71% 684 / 1565
ironclaw_observability 61.54% 16 / 26
ironclaw_authorization 62.98% 609 / 967
ironclaw_memory 64.41% 959 / 1489
ironclaw_telegram_v2_adapter 69.69% 731 / 1049
ironclaw_trust 73.21% 664 / 907
ironclaw_wasm_limiter 74.6% 47 / 63
ironclaw_filesystem 74.64% 4829 / 6470
ironclaw_extractors 74.72% 538 / 720
ironclaw_capabilities 75.41% 2879 / 3818
ironclaw_projects 76.48% 400 / 523
ironclaw_mcp 76.6% 779 / 1017
ironclaw_reborn_cli 78.36% 10782 / 13760
ironclaw_wasm 79.72% 735 / 922
ironclaw_llm 80.04% 22094 / 27603
ironclaw_memory_native 81.02% 3299 / 4072
ironclaw_auth 81.88% 6679 / 8157
ironclaw_first_party_extensions 82.38% 6682 / 8111
ironclaw_events 82.56% 1600 / 1938
ironclaw_processes 83.3% 933 / 1120
ironclaw_host_api 83.66% 9697 / 11591
ironclaw_reborn_identity 83.8% 450 / 537
ironclaw_operator 84.41% 5561 / 6588
ironclaw_secrets 84.53% 2797 / 3309
ironclaw_telegram_extension 84.54% 1230 / 1455
ironclaw_reborn_config 85.23% 2101 / 2465
ironclaw_skills 85.27% 4493 / 5269
ironclaw_extension_host 85.34% 19110 / 22393
ironclaw_run_state 85.77% 458 / 534
ironclaw_reborn_composition 85.81% 24634 / 28709
ironclaw_triggers 85.92% 2783 / 3239
ironclaw_network 85.97% 913 / 1062
ironclaw_reborn_event_store 86.17% 1246 / 1446
ironclaw_webui 86.37% 11171 / 12934
ironclaw_hooks 86.72% 9949 / 11472
ironclaw_common 86.99% 1772 / 2037
ironclaw_approvals 87.07% 1542 / 1771
ironclaw_extensions 87.24% 4798 / 5500
ironclaw_threads 87.39% 4914 / 5623
ironclaw_product 87.48% 20324 / 23233
ironclaw_reborn_traces 88.13% 11987 / 13601
ironclaw_turns 88.44% 14453 / 16342
ironclaw_slack_extension 88.53% 1969 / 2224
ironclaw_host_runtime 88.93% 19947 / 22429
ironclaw_reborn_openai_compat 89.32% 3780 / 4232
ironclaw_conversations 90.01% 3164 / 3515
ironclaw_resources 90.84% 4474 / 4925
ironclaw_event_streams 91.24% 1063 / 1165
ironclaw_runner 91.34% 17354 / 19000
ironclaw_loop_host 91.93% 16577 / 18032
ironclaw_attachments 93.06% 630 / 677
ironclaw_outbound 93.91% 4101 / 4367
ironclaw_agent_loop 94.56% 9994 / 10569
ironclaw_safety 95.28% 3858 / 4049
ironclaw_first_party_extension_ports 95.62% 3672 / 3840
ironclaw_runtime_policy 96.56% 814 / 843

This table itself is informational and never gates the PR on its own — not the percentage, not the per-crate holes, not the 0-coverage callout. A separate coverage ratchet (dry-run until enforce=true; see tests/integration/coverage-floor.toml) can fail the build on specific configured floors.

Exemptions (3 entry/entries excluded from the accounting above)
Module / Crate Reason Issue
crate: ironclaw_embeddings v1-only: consumed only by root ironclaw (src/app.rs, src/tools/builtin/memory.rs, src/workspace/mod.rs, src/config/{mod,embeddings}.rs); no crates/* dependents. Covered by "Tests (Legacy)". #5657
crate: ironclaw_gateway v1-only: consumed only by root ironclaw (src/channels/web/platform/static_files.rs, src/channels/web/handlers/frontend.rs); no crates/* dependents. Covered by "Tests (Legacy)". #5657
crate: ironclaw_tui v1-only: consumed only by root ironclaw (src/main.rs, src/channels/tui.rs); no crates/* dependents. Crate's own doc comment confirms it bridges INTO v1, not Reborn. Covered by "Tests (Legacy)". #5657

@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-6777 July 28, 2026 11:19 Destroyed
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-6777 July 28, 2026 11:22 Destroyed
@italic-jinxin italic-jinxin self-assigned this Jul 28, 2026
…playwright

# Conflicts:
#	crates/ironclaw_product/tests/reborn_services_contract.rs
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-6777 July 29, 2026 07:41 Destroyed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
crates/ironclaw_product/tests/reborn_services_contract.rs (1)

2330-2360: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Cover successful submission-ID forwarding.

This test proves malformed input is rejected, but not that request.submission_id reaches authorize_trace_hold; an implementation that drops the field and supplies another invalid value could produce the same assertion. Keep this validation case and add a valid-ID caller test that verifies the authorization result or captures the forwarded argument through a test seam.

As per path instructions, changed production-wired behavior requires a caller-level regression test that exercises the affected behavior, not only validation failure.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/ironclaw_product/tests/reborn_services_contract.rs` around lines 2330
- 2360, Add a caller-level success test alongside
trace_hold_authorize_capability_decodes_typed_product_input that supplies a
valid submission_id, invokes ProductSurface through RebornServices, and verifies
the authorization result or captured argument passed to authorize_trace_hold.
Preserve the existing malformed-input validation test and use a test seam or
fake to confirm the exact request.submission_id is forwarded.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@crates/ironclaw_product/tests/reborn_services_contract.rs`:
- Around line 2330-2360: Add a caller-level success test alongside
trace_hold_authorize_capability_decodes_typed_product_input that supplies a
valid submission_id, invokes ProductSurface through RebornServices, and verifies
the authorization result or captured argument passed to authorize_trace_hold.
Preserve the existing malformed-input validation test and use a test seam or
fake to confirm the exact request.submission_id is forwarded.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1e439e8a-7d25-4070-b2d1-e4c8172b62d5

📥 Commits

Reviewing files that changed from the base of the PR and between ad39219 and 5c99d19.

📒 Files selected for processing (2)
  • crates/ironclaw_product/src/reborn_services/product_capability_handlers.rs
  • crates/ironclaw_product/tests/reborn_services_contract.rs

@hanakannzashi hanakannzashi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Static review only; tests were not run.

Comment thread tests/e2e/reborn_webui_harness.py
@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-6777 July 29, 2026 09:16 Destroyed

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tests/e2e/reborn_webui_harness.py (1)

259-271: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Anchor the phase-suffix split instead of splitting on the first " (".

node_id is derived by taking everything before the first " (" in PYTEST_CURRENT_TEST. If a parametrize id contains " (", this truncates to the wrong value and no longer matches item.nodeid used by conftest.py's pytest_runtest_makereport. The bundle then never gets located by _mark_registered_artifact_bundles_failed/_finalize_registered_artifact_bundles, so its pending sentinel is never cleared — it stays budget-protected forever for the rest of the shard run. Pytest's own docs on this variable are explicit: "the actual format can be changed between releases (even bug fixes) so it shouldn't be relied on for scripting or automation."

Anchor the split on the known phase suffix instead of the first occurrence:

🔧 Proposed fix
-        node_id = os.environ.get("PYTEST_CURRENT_TEST", "browser-context").split(
-            " (", 1
-        )[0]
+        raw_node_id = os.environ.get("PYTEST_CURRENT_TEST", "browser-context")
+        node_id = re.sub(r" \((?:setup|call|teardown)\)$", "", raw_node_id)
#!/bin/bash
# Check whether any parametrize ids in tests/e2e embed a space followed by "(",
# which would break the current-first-occurrence split.
rg -n 'pytest\.mark\.parametrize' -A5 tests/e2e | rg -n 'ids='
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/e2e/reborn_webui_harness.py` around lines 259 - 271, Update the node_id
parsing in the artifact-registration flow to remove only pytest’s known phase
suffix, rather than splitting at the first " (". Preserve any " (" text
contained in parametrization IDs so the resulting value matches conftest.py’s
item.nodeid and remains discoverable by _mark_registered_artifact_bundles_failed
and _finalize_registered_artifact_bundles.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@tests/e2e/reborn_webui_harness.py`:
- Around line 259-271: Update the node_id parsing in the artifact-registration
flow to remove only pytest’s known phase suffix, rather than splitting at the
first " (". Preserve any " (" text contained in parametrization IDs so the
resulting value matches conftest.py’s item.nodeid and remains discoverable by
_mark_registered_artifact_bundles_failed and
_finalize_registered_artifact_bundles.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: facb03e0-c910-43ce-bd9f-8d075c247f6f

📥 Commits

Reviewing files that changed from the base of the PR and between 5c99d19 and 7bd96a1.

📒 Files selected for processing (4)
  • tests/e2e/CLAUDE.md
  • tests/e2e/conftest.py
  • tests/e2e/reborn_webui_harness.py
  • tests/e2e/scenarios/test_reborn_webui_harness_artifacts.py

@railway-app
railway-app Bot temporarily deployed to ironclaw-ci-preview / ironclaw-pr-6777 July 29, 2026 09:27 Destroyed

@hanakannzashi hanakannzashi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Static re-review complete; prior comments are addressed. Approved without running tests, per request.

@italic-jinxin
italic-jinxin added this pull request to the merge queue Jul 29, 2026
Merged via the queue into main with commit 56cc03d Jul 29, 2026
63 checks passed
@italic-jinxin
italic-jinxin deleted the issue-6765-stabilize-playwright branch July 29, 2026 14:27
l3ocifer pushed a commit to l3ocifer/frick-ironclaw that referenced this pull request Sep 3, 2026
* fix(product): decode trace hold authorization input

* test(playwright): stabilize Reborn nightly matrix

* test(playwright): harden nightly diagnostics

* fix(e2e): preserve failed artifact bundles

This branch was successfully deployed

No deployments
ironclaw-ci-preview / ironclaw-pr-6777 — 85f20169 Deployed Jul 29, 2026 by railway-app[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

contributor: core 20+ merged PRs risk: medium Business logic, config, or moderate-risk modules scope: ci CI/CD workflows scope: docs Documentation size: S 10-49 changed lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Test] Stabilize Reborn Playwright UI and browser smoke coverage

2 participants