Skip to content

🧪 test(ci): harden Cucumber reliability#581

Merged
scttbnsn merged 1 commit into
mainfrom
fix/cucumber-reliability
Jul 22, 2026
Merged

🧪 test(ci): harden Cucumber reliability#581
scttbnsn merged 1 commit into
mainfrom
fix/cucumber-reliability

Conversation

@scttbnsn

@scttbnsn scttbnsn commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Audit all 761 retained CI Verify runs and every rerun history, classifying all 30 Cucumber failures by root cause.
  • Reuse the exact QA image from the build gate; remove redundant app/browser bootstrap and blanket scenario retries from Cucumber.
  • Gate readiness on a checked six-fixture manifest, restore scenario-mutated state, and publish structured reports plus failure diagnostics.
  • Keep browser rendering in Playwright with direct-route coverage and first-failure traces, screenshots, video, and logs—without whole-test retries.
  • Fix the targeted watch endpoint stale-object bug exposed by the health-transition test.
  • Give only the ephemeral QA stack explicit API/icon traffic budgets and make remote fixture seeding bounded-retry and fail-closed.

Verification

  • 123/123 repository script tests
  • 45/45 workflow invariant tests
  • 13/13 Cucumber support tests
  • Cucumber dry-run: 50 scenarios, 402 steps
  • Docker-backed Cucumber: 50/50 scenarios, 402/402 steps
  • Playwright discovery: 33 tests across 12 files
  • Targeted full-stack Playwright Native Auto-Heal / Self-Healing Orchestration for Unhealthy Containers #198: 2/2 tests with the pinned CI browser image
  • Full pre-push gate: 100% app/UI coverage, builds, type-checking, Biome, Qlty, and secret checks

The historical evidence, failure taxonomy, reliability policy, and follow-up threshold are in docs/cucumber-reliability.md.

Changelog

  • ✨ Added manifest-based Cucumber fixture readiness checks with exact missing-field diagnostics (via scripts/start-drydock.sh + e2e/config/cucumber-core-fixtures.txt).
  • ✨ Added Drydock reliability audit + reliability policy documentation (docs/cucumber-reliability.md) based on retained CI Verify runs.
  • ✨ Added Cucumber state snapshot/restore support for mutable domains (container, settings, notification rules) via @restores_container_state / @restores_settings_state / @restores_notification_state.
  • ✨ Added Node test coverage for state restoration behavior + API request timeout/abort semantics (e2e/tests/state-restoration.test.js + supporting runner/tests).
  • ✨ Added structured Cucumber reporting + enriched failure/cancellation diagnostics/artifact uploads (JSON/JUnit/HTML + expanded diagnostics on failure/cancel).
  • ✨ Added Playwright direct-route rendering coverage using main[data-route-name] (and updated layout/unit tests accordingly).
  • ✨ Added Playwright health-preference improvement to actively refresh fixture health until the expected state is observed.
  • ✨ Added QA Compose + release-gate robustness improvements: explicit traffic budgets, hardened remote bootstrap image pull/retry/save/load, and improved health-transition unhealthy detection.
  • ✨ Added CI workflow invariants/tests for Cucumber browser-free execution and SHA-specific release-gate gating (release source SHA + fixed e2e-playwright.yml workflow file).
  • 🔧 Changed ci-verify to run Cucumber browser-free: use a QA-provisioned Drydock image artifact (no pinned Playwright Docker image; no docker run for Cucumber).
  • 🔧 Changed ci-verify dependency installation to use bounded retries (nick-fields/retry) only around dependency install/setup steps (not blanket scenario retries).
  • 🔧 Changed Drydock startup to parameterize the prebuilt image via DD_E2E_IMAGE, support build-skipping with image existence checks, and gate readiness via fixture identity + required image metadata fields.
  • 🐛 Fixed a stale-object bug in the targeted watch endpoint by refreshing containers from getContainers() before calling watchContainer.
  • 🔧 Changed watcher/failure behavior by ensuring diagnostics collection is conditional and includes per-container fixture state/logs + health/containers API outputs.
  • 🔧 Changed fixture contracts/data to align with readiness expectations (e.g., cucumber-core-fixtures.txt adds core fixtures; /api/v1/containers minimum length updated; v1.4 scenarios tagged for state restoration).
  • 🔧 Changed release gating to require “successful Playwright on release source SHA” using the exact configured workflow file (e2e-playwright.yml).
  • 🗑️ Removed the Cucumber UI step-definition wiring (e2e/features/step_definitions/ui.js) and eliminated prior blanket --retry 1 scenario behavior.
  • 🐛 Fixed Cucumber reliability by removing browser navigation/text assertions from Cucumber and strengthening setup/diagnostics so failures are attributable.
  • 🔒 Security: added tests asserting start-drydock.sh readiness logic doesn’t embed PEM-shaped private-key material (and uses safe dummy/private-key templating paths).

Concerns

  • Verify docs/cucumber-reliability.md statistics/taxonomy/policy claims still match the intended retained CI Verify dataset and lenses.
  • Confirm scripts/start-drydock.sh readiness checks (default manifest + required image metadata fields like image.registry.url / image.tag.value) remain aligned with the currently active Cucumber fixture contracts.
  • Validate the state-restoration capture/restore targets (hub_nginx_120, notification rule update-available) and whitelisted mutable fields still match the current API shape for all scenarios using @restores_*.
  • Ensure workflow invariant tests (ci-verify-workflow.test.ts, release-cut-retry-workflow.test.ts) match actual step names/conditions and diagnostics/artifact paths (e.g., e2e/reports).
  • Double-check the “no fail-open” behavior of remote fixture seeding: remote-bootstrap pull/save/load should hard-fail when retries exhaust, rather than allowing partially-bootstrapped runs.
  • Confirm Playwright retries are intentionally disabled (retries: 0) and CI trace retention is sufficient to diagnose single amplified failures.
  • Validate traffic-budget expectations and env plumbing: DD_SERVER_RATELIMIT_MAX=10000 and DD_ICON_PROXY_RATE_LIMIT_MAX=1000 should be applied only to the intended ephemeral/QA release-gate stack.

@vercel

vercel Bot commented Jul 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
drydock-website Ready Ready Preview, Comment Jul 22, 2026 6:13pm
drydockdemo-website Ready Ready Preview, Comment Jul 22, 2026 6:13pm

@coderabbitai

coderabbitai Bot commented Jul 22, 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: CHILL

Plan: Pro Plus

Run ID: 331bae26-1e24-4724-9a70-ec8f8dc6b377

📥 Commits

Reviewing files that changed from the base of the PR and between efb1159 and 91b5641.

⛔ Files ignored due to path filters (1)
  • CHANGELOG.md is excluded by !CHANGELOG.md
📒 Files selected for processing (33)
  • .github/tests/ci-verify-workflow.test.ts
  • .github/tests/e2e-playwright-workflow.test.ts
  • .github/tests/release-cut-retry-workflow.test.ts
  • .github/workflows/ci-verify.yml
  • .gitignore
  • CONTRIBUTING.md
  • app/api/api.test.ts
  • app/api/api.ts
  • app/api/container.test.ts
  • app/api/container/handlers/actions.ts
  • app/configuration/index.test.ts
  • app/configuration/index.ts
  • content/docs/current/configuration/server/index.mdx
  • docs/cucumber-reliability.md
  • e2e/config/cucumber-core-fixtures.txt
  • e2e/features/api-container.feature
  • e2e/features/api-v14.feature
  • e2e/features/step_definitions/ui.js
  • e2e/features/support/init.js
  • e2e/features/support/state-restoration-hooks.js
  • e2e/features/support/state-restoration.js
  • e2e/features/ui.feature
  • e2e/package.json
  • e2e/playwright.config.ts
  • e2e/playwright/navigation.spec.ts
  • e2e/playwright/v16-health-preferences.spec.ts
  • e2e/tests/state-restoration.test.js
  • scripts/cucumber-scope.test.mjs
  • scripts/start-drydock.sh
  • scripts/start-drydock.test.mjs
  • test/qa-compose.yml
  • ui/src/layouts/AppLayout.vue
  • ui/tests/layouts/AppLayout.spec.ts
💤 Files with no reviewable changes (2)
  • e2e/features/step_definitions/ui.js
  • e2e/features/ui.feature
🚧 Files skipped from review as they are similar to previous changes (24)
  • e2e/features/api-container.feature
  • e2e/features/support/state-restoration-hooks.js
  • e2e/config/cucumber-core-fixtures.txt
  • e2e/features/api-v14.feature
  • app/api/api.ts
  • .gitignore
  • scripts/cucumber-scope.test.mjs
  • e2e/features/support/init.js
  • ui/src/layouts/AppLayout.vue
  • app/configuration/index.ts
  • docs/cucumber-reliability.md
  • app/api/container.test.ts
  • app/configuration/index.test.ts
  • e2e/playwright/navigation.spec.ts
  • content/docs/current/configuration/server/index.mdx
  • app/api/api.test.ts
  • e2e/package.json
  • CONTRIBUTING.md
  • app/api/container/handlers/actions.ts
  • .github/tests/e2e-playwright-workflow.test.ts
  • .github/tests/ci-verify-workflow.test.ts
  • scripts/start-drydock.test.mjs
  • scripts/start-drydock.sh
  • .github/workflows/ci-verify.yml

📝 Walkthrough

Walkthrough

CI runs browser-free Cucumber against a QA-loaded Drydock image with manifest-based fixture readiness, retries, reports, and failure diagnostics. Tagged Cucumber scenarios now restore container, settings, and notification state. Browser route checks move to Playwright with route-name landmarks. The outer API rate limit accepts DD_SERVER_RATELIMIT_MAX, watch handlers use refreshed containers, and release-gate and QA-compose contracts gain validation tests.

Possibly related PRs

🚥 Pre-merge checks | ✅ 2
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/cucumber-reliability

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 Checkov (3.3.8)
.github/workflows/ci-verify.yml

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'

e2e/package.json

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'

test/qa-compose.yml

Traceback (most recent call last):
File "/usr/local/bin/checkov", line 2, in
from checkov.main import Checkov
ModuleNotFoundError: No module named 'checkov'


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: 4

🤖 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 @.github/workflows/ci-verify.yml:
- Around line 1151-1158: Add a finite --max-time limit to both diagnostic curl
invocations in the failure/cancellation diagnostics step, including the health
request and the containers request. Keep their existing URLs, headers, outputs,
and error redirections unchanged while ensuring stalled responses cannot consume
the remaining job budget.

In `@e2e/features/support/state-restoration.js`:
- Around line 33-53: Update createApiRequest to create an AbortController, pass
its signal to fetchImpl, and start an approximately 50-second timer that aborts
the request. Clear the timer in a finally block so it is released on success,
HTTP failure, parse failure, or fetch rejection, while preserving the existing
response handling and error messages.

In `@e2e/playwright/navigation.spec.ts`:
- Line 63: Update the visibility assertion using main.locator(':scope > *') so
it targets a single child element, using .first() if visibility of any child is
sufficient; otherwise assert the expected child count before checking
visibility.

In `@scripts/cucumber-scope.test.mjs`:
- Around line 36-37: Update the assertions in the navigation-spec test to verify
each path and routeName as a paired mapping within the same object entry, rather
than matching them independently across navigationSpec. Prefer matching the
complete serialized object or parsing the route map, while preserving the
existing path and routeName values.
🪄 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: CHILL

Plan: Pro Plus

Run ID: 2be41689-b7b3-4704-a9be-4e6dc3a52315

📥 Commits

Reviewing files that changed from the base of the PR and between 9e104b8 and ddb8335.

📒 Files selected for processing (22)
  • .github/tests/ci-verify-workflow.test.ts
  • .github/tests/release-cut-retry-workflow.test.ts
  • .github/workflows/ci-verify.yml
  • .gitignore
  • CONTRIBUTING.md
  • docs/cucumber-reliability.md
  • e2e/config/cucumber-core-fixtures.txt
  • e2e/features/api-container.feature
  • e2e/features/api-v14.feature
  • e2e/features/step_definitions/ui.js
  • e2e/features/support/init.js
  • e2e/features/support/state-restoration-hooks.js
  • e2e/features/support/state-restoration.js
  • e2e/features/ui.feature
  • e2e/package.json
  • e2e/playwright/navigation.spec.ts
  • e2e/tests/state-restoration.test.js
  • scripts/cucumber-scope.test.mjs
  • scripts/start-drydock.sh
  • scripts/start-drydock.test.mjs
  • ui/src/layouts/AppLayout.vue
  • ui/tests/layouts/AppLayout.spec.ts
💤 Files with no reviewable changes (2)
  • e2e/features/step_definitions/ui.js
  • e2e/features/ui.feature

Comment thread .github/workflows/ci-verify.yml
Comment thread e2e/features/support/state-restoration.js Outdated
Comment thread e2e/playwright/navigation.spec.ts Outdated
Comment thread scripts/cucumber-scope.test.mjs Outdated

@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: 2

🧹 Nitpick comments (1)
app/api/container.test.ts (1)

2686-2699: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Cover the refreshed-container not-found branch.

Add a case where getContainers() returns an empty list, then assert a 404 response and that watchContainer is not called.

🤖 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 `@app/api/container.test.ts` around lines 2686 - 2699, Add a test case around
callWatchContainer where mockWatcher.getContainers returns an empty list; assert
the response status is 404 and verify mockWatcher.watchContainer is not called,
while preserving the existing refreshed-container success case.
🤖 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 `@app/api/container/handlers/actions.ts`:
- Around line 226-244: Update the watcher handling around getContainers and
watchContainer so watchContainer is never called without first obtaining a fresh
enumerable container list. Require getContainers as part of the handled watcher
contract, or route providers lacking it through an equivalent fresh-list path,
while preserving the existing 404 response when the requested container is
absent and passing the refreshed container to watchContainer.

In `@app/configuration/index.test.ts`:
- Around line 601-608: Update the test suite around getServerConfiguration to
add shared afterEach cleanup that unconditionally removes
configuration.ddEnvVars.DD_SERVER_RATELIMIT_MAX. Remove the test-local delete
and preserve the existing override assertion, ensuring cleanup runs even when
the test fails.

---

Nitpick comments:
In `@app/api/container.test.ts`:
- Around line 2686-2699: Add a test case around callWatchContainer where
mockWatcher.getContainers returns an empty list; assert the response status is
404 and verify mockWatcher.watchContainer is not called, while preserving the
existing refreshed-container success case.
🪄 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: CHILL

Plan: Pro Plus

Run ID: ddebc2eb-70b3-42cb-83fa-976ccebfb4ae

📥 Commits

Reviewing files that changed from the base of the PR and between ddb8335 and 466b443.

⛔ Files ignored due to path filters (1)
  • CHANGELOG.md is excluded by !CHANGELOG.md
📒 Files selected for processing (32)
  • .github/tests/ci-verify-workflow.test.ts
  • .github/tests/e2e-playwright-workflow.test.ts
  • .github/tests/release-cut-retry-workflow.test.ts
  • .github/workflows/ci-verify.yml
  • .gitignore
  • CONTRIBUTING.md
  • app/api/api.test.ts
  • app/api/api.ts
  • app/api/container.test.ts
  • app/api/container/handlers/actions.ts
  • app/configuration/index.test.ts
  • app/configuration/index.ts
  • content/docs/current/configuration/server/index.mdx
  • docs/cucumber-reliability.md
  • e2e/config/cucumber-core-fixtures.txt
  • e2e/features/api-container.feature
  • e2e/features/api-v14.feature
  • e2e/features/step_definitions/ui.js
  • e2e/features/support/init.js
  • e2e/features/support/state-restoration-hooks.js
  • e2e/features/support/state-restoration.js
  • e2e/features/ui.feature
  • e2e/package.json
  • e2e/playwright/navigation.spec.ts
  • e2e/playwright/v16-health-preferences.spec.ts
  • e2e/tests/state-restoration.test.js
  • scripts/cucumber-scope.test.mjs
  • scripts/start-drydock.sh
  • scripts/start-drydock.test.mjs
  • test/qa-compose.yml
  • ui/src/layouts/AppLayout.vue
  • ui/tests/layouts/AppLayout.spec.ts
💤 Files with no reviewable changes (2)
  • e2e/features/step_definitions/ui.js
  • e2e/features/ui.feature
🚧 Files skipped from review as they are similar to previous changes (19)
  • e2e/features/api-container.feature
  • ui/src/layouts/AppLayout.vue
  • e2e/features/support/state-restoration-hooks.js
  • e2e/package.json
  • .github/tests/release-cut-retry-workflow.test.ts
  • docs/cucumber-reliability.md
  • scripts/cucumber-scope.test.mjs
  • e2e/config/cucumber-core-fixtures.txt
  • e2e/features/support/init.js
  • e2e/features/api-v14.feature
  • .gitignore
  • e2e/tests/state-restoration.test.js
  • e2e/features/support/state-restoration.js
  • scripts/start-drydock.sh
  • scripts/start-drydock.test.mjs
  • CONTRIBUTING.md
  • e2e/playwright/navigation.spec.ts
  • .github/tests/ci-verify-workflow.test.ts
  • .github/workflows/ci-verify.yml

Comment thread app/api/container/handlers/actions.ts
Comment thread app/configuration/index.test.ts

@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: 2

🤖 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 @.github/tests/ci-verify-workflow.test.ts:
- Around line 184-192: Update the workflow.jobs?.e2e assertion to enforce the
complete permissions allowlist rather than allowing additional keys: replace the
partial toMatchObject assertion with an exact equality assertion while
preserving the expected timeout-minutes, actions: read, and contents: read
values.

In @.github/tests/e2e-playwright-workflow.test.ts:
- Around line 52-69: Strengthen the test around the remote-bootstrap command in
Playwright QA so commented-out text cannot satisfy the assertions. Update the
checks in test('Playwright QA fails closed when required remote fixtures cannot
be seeded') to validate the shell entrypoint and require executable,
non-commented lines for set -eu and pull_with_retry, while preserving the
existing retry-limit assertion.
🪄 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: CHILL

Plan: Pro Plus

Run ID: 1b7b3220-9802-441f-a7c8-2d2ec2a669b3

📥 Commits

Reviewing files that changed from the base of the PR and between 466b443 and efb1159.

⛔ Files ignored due to path filters (1)
  • CHANGELOG.md is excluded by !CHANGELOG.md
📒 Files selected for processing (33)
  • .github/tests/ci-verify-workflow.test.ts
  • .github/tests/e2e-playwright-workflow.test.ts
  • .github/tests/release-cut-retry-workflow.test.ts
  • .github/workflows/ci-verify.yml
  • .gitignore
  • CONTRIBUTING.md
  • app/api/api.test.ts
  • app/api/api.ts
  • app/api/container.test.ts
  • app/api/container/handlers/actions.ts
  • app/configuration/index.test.ts
  • app/configuration/index.ts
  • content/docs/current/configuration/server/index.mdx
  • docs/cucumber-reliability.md
  • e2e/config/cucumber-core-fixtures.txt
  • e2e/features/api-container.feature
  • e2e/features/api-v14.feature
  • e2e/features/step_definitions/ui.js
  • e2e/features/support/init.js
  • e2e/features/support/state-restoration-hooks.js
  • e2e/features/support/state-restoration.js
  • e2e/features/ui.feature
  • e2e/package.json
  • e2e/playwright.config.ts
  • e2e/playwright/navigation.spec.ts
  • e2e/playwright/v16-health-preferences.spec.ts
  • e2e/tests/state-restoration.test.js
  • scripts/cucumber-scope.test.mjs
  • scripts/start-drydock.sh
  • scripts/start-drydock.test.mjs
  • test/qa-compose.yml
  • ui/src/layouts/AppLayout.vue
  • ui/tests/layouts/AppLayout.spec.ts
💤 Files with no reviewable changes (2)
  • e2e/features/step_definitions/ui.js
  • e2e/features/ui.feature
🚧 Files skipped from review as they are similar to previous changes (23)
  • e2e/config/cucumber-core-fixtures.txt
  • e2e/features/api-container.feature
  • content/docs/current/configuration/server/index.mdx
  • e2e/features/support/state-restoration-hooks.js
  • app/api/container/handlers/actions.ts
  • ui/tests/layouts/AppLayout.spec.ts
  • e2e/features/api-v14.feature
  • e2e/package.json
  • app/configuration/index.ts
  • .gitignore
  • docs/cucumber-reliability.md
  • app/configuration/index.test.ts
  • ui/src/layouts/AppLayout.vue
  • app/api/api.ts
  • e2e/playwright/v16-health-preferences.spec.ts
  • app/api/container.test.ts
  • scripts/cucumber-scope.test.mjs
  • CONTRIBUTING.md
  • e2e/playwright/navigation.spec.ts
  • app/api/api.test.ts
  • scripts/start-drydock.test.mjs
  • scripts/start-drydock.sh
  • .github/workflows/ci-verify.yml

Comment thread .github/tests/ci-verify-workflow.test.ts Outdated
Comment thread .github/tests/e2e-playwright-workflow.test.ts
@scttbnsn
scttbnsn force-pushed the fix/cucumber-reliability branch from efb1159 to 9cf689f Compare July 22, 2026 17:22

@biggest-littlest biggest-littlest left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Reviewed the Cucumber failure-history audit, reliability fixes, regression coverage, and exact-SHA CI. Cucumber 50/50 scenarios (402/402 steps) and Playwright 31 passed/2 skipped are green without blanket retries.

@ALARGECOMPANY ALARGECOMPANY left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Independent approval: the historical taxonomy, deterministic fixes, setup attribution, diagnostics, and repeated exact-SHA verification are complete. All required checks are green.

@scttbnsn
scttbnsn merged commit a07ced5 into main Jul 22, 2026
28 checks passed
@scttbnsn
scttbnsn deleted the fix/cucumber-reliability branch July 22, 2026 18:34
scttbnsn added a commit that referenced this pull request Jul 22, 2026
## Summary

Prepare **v1.6.0-rc.4** from the latest `main`.

rc.4 delta over rc.3:

- **#580 issue #498 visual follow-ups** - informational pinned
Major/Minor/Patch states, "Image update" vocabulary and explanation,
Host-first constrained layout, explicit Software Version metadata,
browser-managed grouping, docs, regression coverage, and desktop/mobile
visual QA.
- **#581 Cucumber reliability** - complete retained-run audit, exact
build-artifact reuse, six-fixture readiness manifest, scenario state
restoration, structured reports/diagnostics, no blanket
Cucumber/Playwright retries, fail-closed remote fixture seeding, and the
targeted health-refresh product/race fixes.
- Release identity advanced across the changelog, README, website/demo,
current docs, API examples, quickstart, and guard tests.

## Verification

- 123/123 repository script tests
- 45/45 workflow invariant tests
- 44/44 website script tests
- Full pre-push gate: 100% app/UI coverage, type-check, Biome, Qlty, and
app/UI builds
- Local prerelease precheck completed; its five unchecked "shipped in
v1.6.0" Discussion follow-ups remain GA closeout actions and are not RC
blockers

After merge: verify exact-`main` CI Verify and Playwright, then dispatch
`release-cut.yml` with `release_tag=v1.6.0-rc.4`.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Changelog

### 🔧 Changed
- Prepared release identity for `v1.6.0-rc.4` across README,
website/demo mocks, API documentation, Portwing examples, quickstart
materials, and release updates.
- Updated changelog comparison links and release identity guard tests
for `v1.6.0-rc.4`.
- Added release-gated Cucumber E2E failure-reporting highlights to the
updates page.

## Concerns
- Verify exact CI Verify and Playwright workflows after merge.
- Post the five tracked Discussion replies against the published release
candidate.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants