Skip to content

ci(e2e): step 4+5 — push:main trigger + attn:e2e-failure surfacing + testing-strategy doc (#370) - #371

Merged
robotrocketscience merged 2 commits into
mainfrom
feat/issue-370-e2e-failure-surfacing
May 3, 2026
Merged

ci(e2e): step 4+5 — push:main trigger + attn:e2e-failure surfacing + testing-strategy doc (#370)#371
robotrocketscience merged 2 commits into
mainfrom
feat/issue-370-e2e-failure-surfacing

Conversation

@yoshi280

@yoshi280 yoshi280 commented May 3, 2026

Copy link
Copy Markdown
Collaborator

Closes #370. Lands the two acceptance items left over from umbrella #334 after it closed on the seed-scenario gate.

What changes

Commit 1 — ci(e2e): trigger on push:main + open attn:e2e-failure on failure

  • .github/workflows/e2e.yml: add push: { branches: [main] } trigger.
  • e2e job's if: now matches push OR labeled PR (was: labeled-PR-only).
  • New surface-failure job (needs: e2e, if: failure()):
    • PR fail → gh pr edit --add-label attn:e2e-failure.
    • push:main fail → gh issue create with attn:e2e-failure, referencing the failing SHA + run URL.
  • Permissions scoped: issues: write, pull-requests: write on the surface-failure job only; the e2e job stays contents: read.
  • attn:e2e-failure label created in the repo (was missing).

Commit 2 — docs(testing-strategy): document unit / integration / E2E split

Verification

  • python -c "import yaml; yaml.safe_load(open('.github/workflows/e2e.yml'))" — clean.
  • uvx zizmor .github/workflows/e2e.yml — no findings (5 suppressed, all pre-existing).
  • Discretion grep on the diff — clean.

Out of scope (explicitly deferred per #334)

  • Promotion to required-status-check (deferred 30 days post-flake-free).
  • Seed scenarios 4 (lock-survives-reopen) and 6 (aelf upgrade-advice) — additive follow-ups.

Summary by Sourcery

Extend the E2E workflow to run on main-branch pushes and surface failures via labels/issues, and document the testing-layer strategy for the project.

CI:

  • Run the E2E workflow on both labeled pull requests and pushes to main for post-merge regression catching.
  • Add a dedicated failure-surfacing job that labels failing PRs and opens tagged issues for E2E failures on main while keeping permissions scoped to that job.

Documentation:

  • Introduce a testing strategy document describing the unit, integration, and E2E test layers, their intended responsibilities, and guidance on choosing the appropriate layer for new tests.

Summary by CodeRabbit

  • Chores

    • Enhanced CI end-to-end testing workflow to run automatically on commits to the main branch in addition to pull requests. Improved failure notification by automatically labeling pull requests and creating issues for test failures.
  • Documentation

    • Added comprehensive testing strategy documentation outlining testing layers (unit, integration, and end-to-end), CI workflows, fixture constraints, and failure handling procedures.

Closes #334 step 4. Workflow now runs on every push to main as well as
labeled PRs. A new surface-failure job opens an attn:e2e-failure issue
on push:main failure (referencing the failing SHA + run URL) and adds
attn:e2e-failure to the PR on PR-level failure. Both routes feed
aelf-scan §1 so a downstream session picks up the regression.
Closes #334 step 5. Companion doc for the e2e workflow. Tells future
PR authors which layer a new test belongs in (decision tree at the
bottom), what regression class each seed E2E scenario catches, and
where the bench / flake budgets live.
@sourcery-ai

sourcery-ai Bot commented May 3, 2026

Copy link
Copy Markdown

Reviewer's Guide

Extends the E2E GitHub Actions workflow to run on pushes to main and adds a dedicated failure-surfacing job that labels failing PRs or opens issues for failing main runs, and introduces a testing strategy document that formalizes the unit/integration/E2E split and when to use each layer.

Sequence diagram for E2E workflow triggers and failure surfacing

sequenceDiagram
  actor Developer
  participant GitHub as GitHub_Actions
  participant e2e as e2e_job
  participant surf as surface_failure_job
  participant GHAPI as GitHub_CLI_API

  Developer->>GitHub: push_to_main
  GitHub->>e2e: start_job (event_name push)
  e2e-->>GitHub: job_status (success_or_failure)

  alt e2e_success_on_push
    GitHub-->>Developer: status_check_success
  else e2e_failure_on_push
    GitHub->>surf: start_job (needs e2e, if failure())
    surf->>GHAPI: gh_issue_create attn:e2e-failure with SHA and run_url
    GHAPI-->>surf: issue_created
    surf-->>Developer: new_issue_linked_to_failing_run
  end

  Developer->>GitHub: open_or_update_PR_with_e2e_label
  GitHub->>e2e: start_job (event_name pull_request)
  e2e-->>GitHub: job_status (success_or_failure)

  alt e2e_success_on_PR
    GitHub-->>Developer: status_check_success
  else e2e_failure_on_PR
    GitHub->>surf: start_job (needs e2e, if failure())
    surf->>GHAPI: gh_pr_edit add_label attn:e2e-failure
    GHAPI-->>surf: pr_labeled
    surf-->>Developer: PR_labeled_attn_e2e_failure
  end
Loading

Flow diagram for choosing test layer (unit, integration, E2E)

flowchart TD
  Start([New_test_needed])

  Q_binary{Behavior only observable\nwith installed_binary\nor install_method?}
  Q_db_contract{Requires_real_DB_and\ncontract_between_multiple_modules\nwhile staying_in_process?}

  Unit_layer[Layer 1 unit tests\nlocation: tests/test_*.py\nfast, module_isolation, mocks_ok]
  Integration_layer[Layer 2 integration tests\nlocation: tests/test_*.py real_store\nreal BeliefStore, no store/schema/migration mocks]
  E2E_layer[Layer 3 E2E tests\nlocation: tests/e2e/test_*.py\ninstalled aelf binary via subprocess,
no mocks, install_matrix]

  Start --> Q_binary
  Q_binary -->|yes| E2E_layer
  Q_binary -->|no| Q_db_contract
  Q_db_contract -->|yes| Integration_layer
  Q_db_contract -->|no| Unit_layer

  Unit_layer --> End([Test_layer_selected])
  Integration_layer --> End
  E2E_layer --> End
Loading

File-Level Changes

Change Details Files
Broaden E2E workflow triggers and gate conditions to cover both labeled PRs and pushes to main.
  • Update workflow header comments to describe both PR-label and push-to-main triggers plus failure surfacing behavior.
  • Add push trigger on the main branch alongside the existing pull_request trigger.
  • Adjust the e2e job condition so it runs for push events as well as PRs with the e2e label.
.github/workflows/e2e.yml
Add a failure-surfacing workflow job that reacts to E2E failures by labeling PRs or creating issues on main.
  • Define a surface-failure job that depends on the e2e job and runs only when the workflow has failed.
  • Scope job permissions to issues: write and pull-requests: write while keeping the main e2e job at contents: read.
  • On pull_request events, label the PR with attn:e2e-failure using gh pr edit.
  • On push events to main, create a new issue tagged attn:e2e-failure referencing the failing SHA and run URL, with guidance text for triage and flake handling.
.github/workflows/e2e.yml
Document the project’s test layering strategy and decision guidance for placing new tests.
  • Add a testing-strategy document that defines the three layers of tests (unit, integration, E2E) and their purposes, runtime expectations, and tooling constraints.
  • Provide examples of existing integration and E2E tests and the regression classes they are meant to catch, including a table mapping E2E scenarios to bug classes.
  • Include a decision tree for choosing the appropriate test layer and document performance, flake, and scope constraints for each layer and the overall system.
docs/testing-strategy.md

Assessment against linked issues

Issue Objective Addressed Explanation
#370 Update .github/workflows/e2e.yml so that the E2E job runs on every push to main, not only on PRs with the e2e label.
#370 Implement failure surfacing for the E2E workflow: on push: main failure, open an issue tagged attn:e2e-failure referencing the failing commit; on labeled-PR failure, add the attn:e2e-failure label to the PR.
#370 Add docs/testing-strategy.md documenting the unit / integration / E2E test layering and guidance for where new tests should be added.

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@yoshi280 yoshi280 added the attn:review Needs review (PR open, awaiting reviewer) label May 3, 2026
@coderabbitai

coderabbitai Bot commented May 3, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

The PR extends the E2E workflow to run on every main push (in addition to labeled PRs), adds failure-surfacing logic that labels failed PRs and creates issues for failed main runs, and introduces docs/testing-strategy.md to define the three-layer testing contract (unit / integration / E2E) and where new tests should live.

Changes

E2E Workflow Trigger and Failure Surfacing

Layer / File(s) Summary
Workflow Triggers
.github/workflows/e2e.yml
Added push: { branches: [main] } to trigger the workflow on every push to main, alongside existing PR events.
E2E Job Condition
.github/workflows/e2e.yml
Updated jobs.e2e.if to run on push events or PRs with the e2e label.
Failure Surfacing
.github/workflows/e2e.yml
New jobs.surface-failure job runs on jobs.e2e failure; labels failed PRs with attn:e2e-failure and creates GitHub issues (with short SHA and run URL) for failed main runs.

Testing Strategy Documentation

Layer / File(s) Summary
Testing Contract
docs/testing-strategy.md
Documents three test layers: unit tests (in-process, mocks), integration tests (real DB/schema), and E2E tests (installed binary, no mocks). Specifies where tests live, CI workflows for each layer, fixture constraints, failure surfacing behavior, and includes decision tree and time/flake budgets.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~15 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The PR title accurately and specifically describes the main changes: CI workflow expansion for push:main trigger, failure surfacing via attn:e2e-failure, and addition of testing-strategy documentation.
Description check ✅ Passed The description is comprehensive, structured well, includes linked issue reference, change details, verification steps, and notes on scope. All key template sections are appropriately covered.
Linked Issues check ✅ Passed All three acceptance criteria from #370 are met: e2e workflow triggers on push:main, failure surfacing implemented for both PR and push:main paths with attn:e2e-failure label/issue, and docs/testing-strategy.md created with test layering guidance.
Out of Scope Changes check ✅ Passed All changes are scoped to the PR objectives: workflow trigger/failure-surfacing modifications, new testing-strategy documentation, and label creation. No unrelated modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/issue-370-e2e-failure-surfacing

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
Review rate limit: 0/1 reviews remaining, refill in 60 minutes.

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

@sourcery-ai sourcery-ai 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.

Hey - I've found 2 issues, and left some high level feedback:

  • In the e2e job if: expression, consider guarding the label check by event type (e.g. github.event_name == 'push' || (github.event_name == 'pull_request' && contains(...))) so that github.event.pull_request.labels is never accessed on non-PR events.
  • For the surface-failure job, using an explicit needs check like if: needs.e2e.result == 'failure' is more robust and idiomatic than relying on if: failure() at the job level to detect the failing e2e job.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In the `e2e` job `if:` expression, consider guarding the label check by event type (e.g. `github.event_name == 'push' || (github.event_name == 'pull_request' && contains(...))`) so that `github.event.pull_request.labels` is never accessed on non-PR events.
- For the `surface-failure` job, using an explicit needs check like `if: needs.e2e.result == 'failure'` is more robust and idiomatic than relying on `if: failure()` at the job level to detect the failing `e2e` job.

## Individual Comments

### Comment 1
<location path=".github/workflows/e2e.yml" line_range="25-27" />
<code_context>
 jobs:
   e2e:
-    if: contains(github.event.pull_request.labels.*.name, 'e2e')
+    if: github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'e2e')
     runs-on: ubuntu-latest
     timeout-minutes: 8
</code_context>
<issue_to_address>
**suggestion (bug_risk):** Guard PR-specific context usage to avoid accessing pull_request fields on push events.

On `push` events, `github.event.pull_request` is undefined, and GitHub’s expression handling can be brittle when accessing missing properties. To avoid any chance of evaluation errors, scope the label check to PR events, e.g.

```yaml
if: github.event_name == 'push' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'e2e'))
```

```suggestion
  e2e:
    if: github.event_name == 'push' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'e2e'))
    runs-on: ubuntu-latest
```
</issue_to_address>

### Comment 2
<location path="docs/testing-strategy.md" line_range="82" />
<code_context>
+(install-time wiring, install-method-specific behavior, real subprocess)?
+  → Layer 3 (E2E).
+
+Does the test require a real DB and exercises a contract between
+two or more modules, but stays in-process?
+  → Layer 2 (integration), in tests/.
</code_context>
<issue_to_address>
**issue (typo):** Fix verb agreement in this question sentence.

For example, you could rewrite this as: "Does the test require a real DB and exercise a contract between ..." or "Does the test require a real DB, and does it exercise a contract between ..." to fix the verb agreement.

```suggestion
Does the test require a real DB and exercise a contract between
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread .github/workflows/e2e.yml
Comment on lines 25 to 27
e2e:
if: contains(github.event.pull_request.labels.*.name, 'e2e')
if: github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'e2e')
runs-on: ubuntu-latest

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

suggestion (bug_risk): Guard PR-specific context usage to avoid accessing pull_request fields on push events.

On push events, github.event.pull_request is undefined, and GitHub’s expression handling can be brittle when accessing missing properties. To avoid any chance of evaluation errors, scope the label check to PR events, e.g.

if: github.event_name == 'push' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'e2e'))
Suggested change
e2e:
if: contains(github.event.pull_request.labels.*.name, 'e2e')
if: github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'e2e')
runs-on: ubuntu-latest
e2e:
if: github.event_name == 'push' || (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'e2e'))
runs-on: ubuntu-latest

Comment thread docs/testing-strategy.md
(install-time wiring, install-method-specific behavior, real subprocess)?
→ Layer 3 (E2E).

Does the test require a real DB and exercises a contract between

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

issue (typo): Fix verb agreement in this question sentence.

For example, you could rewrite this as: "Does the test require a real DB and exercise a contract between ..." or "Does the test require a real DB, and does it exercise a contract between ..." to fix the verb agreement.

Suggested change
Does the test require a real DB and exercises a contract between
Does the test require a real DB and exercise a contract between

@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

🧹 Nitpick comments (3)
.github/workflows/e2e.yml (3)

69-72: ⚡ Quick win

Add a short timeout-minutes to the surface-failure job.

Without it, a hung gh CLI call (rate-limit backoff, transient API outage) burns the default 6-hour job timeout for what should be a sub-minute operation.

⏱ Proposed fix
   surface-failure:
     needs: e2e
     if: failure()
+    timeout-minutes: 5
     runs-on: ubuntu-latest
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/e2e.yml around lines 69 - 72, The surface-failure job
lacks a timeout and can hang; update the GitHub Actions job definition for
"surface-failure" to add a short timeout-minutes setting (e.g., timeout-minutes:
5) under the job block so the job will abort quickly on a hung gh CLI call;
locate the "surface-failure" job in the workflow and add the timeout-minutes key
alongside runs-on and needs.

14-15: cancel-in-progress: true silently drops failure surfacing for cancelled push:main runs.

The concurrency group for push events collapses to a single key (e2e-E2E-refs/heads/main). If commit A breaks e2e and commit B is pushed before A's run finishes, A's run is cancelled. surface-failure only fires on a failure result — a cancelled result is not failure(), so no issue is opened for commit A. The regression on A is silently lost if B's run passes.

For push:main regression detection you may want to set cancel-in-progress: false for push events, or use a per-SHA concurrency group:

⚙️ Option: per-SHA group for push:main, cancellable for PRs
 concurrency:
-  group: e2e-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
-  cancel-in-progress: true
+  group: e2e-${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
+  cancel-in-progress: ${{ github.event_name == 'pull_request' }}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/e2e.yml around lines 14 - 15, The workflow's concurrency
setting causes in-flight push: main jobs to be cancelled (cancel-in-progress:
true) which turns failures into cancelled results and prevents surface-failure
from opening issues; to fix, change the concurrency behavior for push: main by
either setting cancel-in-progress: false for the push concurrency group or
switch the group's key to a per-SHA value (e.g., use github.sha in the
concurrency.group) so only identical-SHA runs collide; update the concurrency
block where cancel-in-progress is defined and ensure surface-failure still
triggers on actual failure() results.

97-105: Each push:main failure opens a new issue — no deduplication guard.

If main stays broken across several commits (or while a fix PR is being reviewed), every push triggers another gh issue create, accumulating duplicate open issues. Consider searching for an existing open issue with the attn:e2e-failure label before creating a new one:

🔁 Option: skip creation if an open tracking issue already exists
         run: |
           short_sha="${SHA:0:7}"
+          existing=$(gh issue list \
+            --repo "$REPO" \
+            --label "attn:e2e-failure" \
+            --state open \
+            --json number \
+            --jq 'length')
+          if [ "$existing" -gt 0 ]; then
+            echo "Open attn:e2e-failure issue already exists; skipping creation."
+            exit 0
+          fi
           gh issue create \
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/e2e.yml around lines 97 - 105, Before running the gh issue
create step, query GitHub for an existing open issue with the attn:e2e-failure
label and only create a new issue if none exists; specifically, call the GitHub
CLI to list open issues for the same "$REPO" filtered by label
"attn:e2e-failure" (e.g., gh issue list --repo "$REPO" --label
"attn:e2e-failure" --state open) and conditionally execute the existing gh issue
create command when that list is empty, ensuring you preserve the same
title/body/labels and environ vars (short_sha, SHA, RUN_URL) used in the current
gh issue create invocation.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/testing-strategy.md`:
- Around line 77-88: The fenced code block that starts with "Is the test
behavior observable only when the binary is installed" is missing a language
specifier (MD040); update that triple-backtick fence to include a language token
(use "text") so the block becomes ```text to satisfy markdownlint-cli2 without
changing rendered output, targeting the fenced block containing the three Q/A
lines.

---

Nitpick comments:
In @.github/workflows/e2e.yml:
- Around line 69-72: The surface-failure job lacks a timeout and can hang;
update the GitHub Actions job definition for "surface-failure" to add a short
timeout-minutes setting (e.g., timeout-minutes: 5) under the job block so the
job will abort quickly on a hung gh CLI call; locate the "surface-failure" job
in the workflow and add the timeout-minutes key alongside runs-on and needs.
- Around line 14-15: The workflow's concurrency setting causes in-flight push:
main jobs to be cancelled (cancel-in-progress: true) which turns failures into
cancelled results and prevents surface-failure from opening issues; to fix,
change the concurrency behavior for push: main by either setting
cancel-in-progress: false for the push concurrency group or switch the group's
key to a per-SHA value (e.g., use github.sha in the concurrency.group) so only
identical-SHA runs collide; update the concurrency block where
cancel-in-progress is defined and ensure surface-failure still triggers on
actual failure() results.
- Around line 97-105: Before running the gh issue create step, query GitHub for
an existing open issue with the attn:e2e-failure label and only create a new
issue if none exists; specifically, call the GitHub CLI to list open issues for
the same "$REPO" filtered by label "attn:e2e-failure" (e.g., gh issue list
--repo "$REPO" --label "attn:e2e-failure" --state open) and conditionally
execute the existing gh issue create command when that list is empty, ensuring
you preserve the same title/body/labels and environ vars (short_sha, SHA,
RUN_URL) used in the current gh issue create invocation.
🪄 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

Run ID: b1aaca68-a44f-4afd-8416-4f74d2fee824

📥 Commits

Reviewing files that changed from the base of the PR and between 0ca4775 and a996dce.

📒 Files selected for processing (2)
  • .github/workflows/e2e.yml
  • docs/testing-strategy.md

Comment thread docs/testing-strategy.md
Comment on lines +77 to +88
```
Is the test behavior observable only when the binary is installed
(install-time wiring, install-method-specific behavior, real subprocess)?
→ Layer 3 (E2E).

Does the test require a real DB and exercises a contract between
two or more modules, but stays in-process?
→ Layer 2 (integration), in tests/.

Otherwise — single module, mocks acceptable?
→ Layer 1 (unit), in tests/.
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fenced code block is missing a language specifier (MD040).

markdownlint-cli2 flags this block. Adding text satisfies the rule with no rendering change.

📝 Proposed fix
-```
+```text
 Is the test behavior observable only when the binary is installed
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
```
Is the test behavior observable only when the binary is installed
(install-time wiring, install-method-specific behavior, real subprocess)?
→ Layer 3 (E2E).
Does the test require a real DB and exercises a contract between
two or more modules, but stays in-process?
→ Layer 2 (integration), in tests/.
Otherwise — single module, mocks acceptable?
→ Layer 1 (unit), in tests/.
```
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 77-77: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/testing-strategy.md` around lines 77 - 88, The fenced code block that
starts with "Is the test behavior observable only when the binary is installed"
is missing a language specifier (MD040); update that triple-backtick fence to
include a language token (use "text") so the block becomes ```text to satisfy
markdownlint-cli2 without changing rendered output, targeting the fenced block
containing the three Q/A lines.

@yoshi280

yoshi280 commented May 3, 2026

Copy link
Copy Markdown
Collaborator Author

[claim:review:Setr:2026-05-03T15:00:04Z]

@yoshi280

yoshi280 commented May 3, 2026

Copy link
Copy Markdown
Collaborator Author

[claim:review:Gylf:2026-05-03T15:00:35Z]

@yoshi280

yoshi280 commented May 3, 2026

Copy link
Copy Markdown
Collaborator Author

[release:review:Gylf:2026-05-03T15:00:40Z]

@robotrocketscience
robotrocketscience merged commit a996dce into main May 3, 2026
26 of 32 checks passed
@robotrocketscience
robotrocketscience deleted the feat/issue-370-e2e-failure-surfacing branch May 3, 2026 15:01
@yoshi280

yoshi280 commented May 3, 2026

Copy link
Copy Markdown
Collaborator Author

[release:review:Setr:2026-05-03T15:01:13Z]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

attn:review Needs review (PR open, awaiting reviewer)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ci(e2e): step 4+5 — push:main trigger, attn:e2e-failure surfacing, docs/testing-strategy.md

2 participants