test(e2e): update m1_acceptance.robot #1260
Labels
Clear labels
auto/needs-reevaluation
controller-managed
overdue
auto/blocked-by-deps
auto/ci-timeout
auto/claimed-implementer
auto/claimed-merge
auto/claimed-reviewer
auto/driver-down
auto/invariant-violation
auto/last-attempt-tier-0
auto/last-attempt-tier-1
auto/last-attempt-tier-2
auto/last-attempt-tier-min
Automation Tracking
auto/needs-conflict-resolution
auto/needs-implementer
auto/postmortem
auto/ready-to-merge
auto/restart-throttled
auto/revert
auto/sentinel
auto/stale-inactivity
auto/unstable
Blocked
Needs Feedback
Signed-off: Owner
Signed-off: Scrum Master
Signed-off: Tech Lead
Spike
Controller deferred this PR; awaiting Phase 6+ scope-evaluator or operator re-enablement.
Auto-agents controller manages this PR/issue (see tools/controller/deploy/RUNBOOK.md). Remove this label to abandon controller management.
PR blocked by an open issue dependency. Operator must close the dep (or remove the dependency link) before the merge driver can act. Auto-cleared by merge_drive when no open deps remain.
Most recent merge cycle hit CI timeout. Driver excludes this PR while last merge_cycle row is < 30 min old; label persists thereafter as visible history.
Currently being processed by an implementer worker.
Currently being processed by the merge driver.
Currently being processed by a reviewer worker.
Merge driver heartbeat stale; pipeline halted. Closed automatically on next clean tick.
Detected master commit violating the strict merge invariant. Tracked as an issue (not a PR label); kept here for label completeness.
In-cycle escalation: most recent attempt ran at the Tier 0 slot (`tier-0`). Slot's model defined in .opencode/models/tiers.yaml.
In-cycle escalation: most recent attempt ran at the Tier 1 slot (`tier-1`). Slot's model defined in .opencode/models/tiers.yaml.
In-cycle escalation: most recent attempt ran at the Tier 2 slot (`tier-2`). Slot's model defined in .opencode/models/tiers.yaml. Gated behind IMPLEMENTER_ESCALATION_TIER2_ENABLED.
In-cycle escalation: most recent attempt ran at the Tier -1 slot (`tier-min`). Slot's model defined in .opencode/models/tiers.yaml. Suffix is ``-min`` (not ``--1``) so the Forgejo UI reads naturally.
Tracking issues used by the AI Automation system for agents to communicate and report.
Rebase conflict needs LLM conflict-resolver.
Failing CI needs implementer attention.
Documenting a driver incident or rollback.
Reviewer has APPROVED this PR and no later REQUEST_CHANGES is outstanding. The merge driver requires this label to even consider a PR for merging. Set by the reviewer worker on APPROVE; cleared on REQUEST_CHANGES.
Train repeatedly lost master-tempo races. Driver excludes via merge_cycle until cooldown elapses; label persists as visible history.
Revert PR backing out an invariant violation. Fast-tracked through the merge driver.
Sentinel PR duplicated from upstream into a personal fork by tools/duplicate_prs_to_fork.py for pipeline testing. Lives only in the fork; the canonical pipeline never sees it.
No implementer activity for N days. Flagged for human review. Auto-cleared on next push to head branch.
Repeatedly fails on current master (>= 3 ci-fail-on-rebased-sha releases in 12 h). Excluded from driver until human triage.
A ticket in a blocked state and unable to complete until some other task is completed first.
Bounty
$100
A bounty of $100 for any open-source contributor who provides a MR that solves this issue
Bounty
$1000
A bounty of $1000 for any open-source contributor who provides a MR that solves this issue
Bounty
$10000
A bounty of $10000 for any open-source contributor who provides a MR that solves this issue
Bounty
$20
A bounty of $20 for any open-source contributor who provides a MR that solves this issue
Bounty
$2000
A bounty of $2000 for any open-source contributor who provides a MR that solves this issue
Bounty
$250
A bounty of $250 for any open-source contributor who provides a MR that solves this issue
Bounty
$50
A bounty of $50 for any open-source contributor who provides a MR that solves this issue
Bounty
$500
A bounty of $500 for any open-source contributor who provides a MR that solves this issue
Bounty
$5000
A bounty of $5000 for any open-source contributor who provides a MR that solves this issue
Bounty
$750
A bounty of $750 for any open-source contributor who provides a MR that solves this issue
MoSCoW
Could have
Could have feature in order to satisfy the epic/legendary.
MoSCoW
Must have
Must have feature in order to satisfy the epic/legendary.
MoSCoW
Should have
Should have feature in order to satisfy the epic/legendary.
There are questions in the ticket that can not be completed until the project owner provides clarity.
Points
1
1 man-hours worth of work for an expert with no learning curve.
Points
13
13 man-hours worth of work for an expert with no learning curve.
Points
2
2 man-hours worth of work for an expert with no learning curve.
Points
21
21 man-hours worth of work for an expert with no learning curve.
Points
3
3 man-hours worth of work for an expert with no learning curve.
Points
34
34 man-hours worth of work for an expert with no learning curve.
Points
5
5 man-hours worth of work for an expert with no learning curve.
Points
55
55 man-hours worth of work for an expert with no learning curve.
Points
8
8 man-hours worth of work for an expert with no learning curve.
Points
88
88 man-hours worth of work for an expert with no learning curve.
Priority
Backlog
This ticket has backlogged priority and is not to be worked on yet
Priority
CI Blocker
Critical priority issue that blocks CI/CD pipeline and prevents PR merges
Priority
Critical
The priority is critical
Priority
High
The priority is high
Priority
Low
The priority is low
Priority
Medium
The priority is medium
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
A ticket for learning a tool or technology that is needed to be able to do future planning and design.
State
Completed
The ticket has been fully implemented, completed, and merged with the source code. This label should only be applied once a ticket is closed.
State
Duplicate
A ticket that represents the same content as an existing ticket.
State
In Progress
A ticket that is actively being developed.
State
In Review
A ticket that has had some code completed to implement but is waiting to pass peer review and is not yet merged in.
State
Paused
This ticket's work started but wasn't finished. It's on hold (likely in a feature branch) and will be resumed later, either due to a blocker or a delay.
State
Unverified
All new tickets start in this state. A developer may set it to show the ticket is unverified. This means we haven't agreed to work on it. It will either move to a verified state or be closed as wontdo.
State
Verified
The issue has been verified by a developer as legitimate. It will be worked on and verified tickets are now considered part of the backlog.
State
Wont Do
This ticket has been decided it wont be done. This may mean the bug has been determined to not be real (cant verify) or the feature is one we have decided we dont want to adopt.
Type
Automation
Any edits or discussion about the AI automated coding system.
Type
Bug
Something that doesnt work as intended.
Type
Discussion
Anytime a ticket represents a discussion about a subject and doesnt fall into one of the other categories.
Type
Documentation
An error or improvement needed in the documentation.
Type
Epic
Any first tier epic. That is, an epic which contains only issues as children and will not have sub-epics.
Type
Feature
Some new functionality not present.
Type
Legendary
A type of Epic which will contain other Epics.
Type
Refactor
A code change that restructures existing code without changing its external behavior.
Type
Support
Someone needs help using the project.
Type
Task
A generic task that doesnt fit into the other type categories.
Type
Testing
Work exclusively focusing on fixing or expanding testing.
No Label
Type
Testing
Projects
Clear projects
No project
Assignees
aditya (Aditya Chhabra)
aleenaumair (Aleena Umair)
brent.edwards (Brent Edwards)
CoreRasurae (Luis Mendes)
drew (Drew Morris)
eugen.thaci (Eugen Thaci)
freemo (Jeffrey Phillips Freeman)
HAL9000 (HAL 9000)
HAL9001 (HAL9001)
hamza.khyari (Hamza Khyari)
hurui200320 (Rui Hu)
justin.morris
khird (Kyle Hird)
org.cleveragents
Clear assignees
No Assignees
freemo
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: cleveragents/cleveragents-core#1260
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "test/e2e-update-m1-acceptance"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Updates the M1 acceptance E2E test (
m1_acceptance.robot) to include comprehensive return code checks and expected output validation for every CLI step in the test lifecycle.Previously, many steps in the test either did not check CLI output at all or only verified that stdout was non-empty. This PR adds explicit
Should Be Equal As Integerschecks for return codes andOutput Should Containassertions for expected output strings across all eight CLI commands exercised by the test.tdd_expected_fail— sandbox_root wiring bug (#1313)This test is tagged
tdd_expected_failbecause investigation revealed a bug in the plan execute pipeline:_get_plan_executor()insrc/cleveragents/cli/commands/plan.pydoes not passsandbox_roottoPlanExecutor. This causesLLMExecuteActor._write_to_sandbox()to be silently skipped — the LLM generates file content (HELLO.md) but it is never written to disk.As a result, the following assertions will fail until #1313 is resolved:
Output Should Contain ${diff_result} HELLO— the diff should show HELLO.md changesShould Be True ${commit_lines} >= 2— apply should produce a second commitFile Should Exist ${repo_path}${/}HELLO.md— HELLO.md should exist after applyThe
tdd_expected_faillistener inverts the test result so CI passes while the bug exists. When #1313 is fixed, the tag must be removed and the test should pass normally.Steps updated:
action create— checks rc=0, action name, description, and stateresource add git-checkout— checks rc=0, resource name and typeproject create— checks rc=0, project namespaced_name and linked_resourcesplan use— checks rc=0, plan phase, action details, actor configplan execute(strategize) — checks rc=0, phase transition, processing state, project linksplan execute(execute) — checks rc=0, same state reporting as strategize (with explanatory comment)plan diff— checks rc=0, verifies diff contains HELLO.md (tdd_expected_fail)plan apply— checks rc=0, applied state, project links, action detailsReview fixes applied:
${git_log.rc}reference before definition (was guaranteed runtime crash) → replaced with${apply_result.rc}${exec2_result.rc}in diff section → replaced with${diff_result.rc}No changes in changeset.assertion; replaced with correctHELLOassertion### IMPORTANT QUESTION:block)action_name: local/test-actionassertion in plan use stepCloses #1249
Review: test(e2e): update m1_acceptance.robot
The intent of this PR is good — adding comprehensive return code checks and output validation to the M1 acceptance test is valuable. However, there are two critical variable-reference bugs that will cause the test to fail at runtime, plus several other issues that need attention before merging.
Critical Bugs (will cause test failure)
1. Step 10 (plan apply) — wrong variable in rc check
The line
Should Be Equal As Integers ${git_log.rc} 0references${git_log}, which is not defined until step 11. This should be${apply_result.rc}. Robot Framework will raise a variable-not-found error at runtime.2. Step 9 (plan diff) — wrong variable in rc check
The line
Should Be Equal As Integers ${exec2_result.rc} 0checks the return code of the previous execute step, not the diff step. This should be${diff_result.rc}.Questionable Assertion
3. Step 9 — "No changes in changeset" may be incorrect
The test creates a file (HELLO.md) via LLM execution. If the LLM succeeds, there should be changes in the changeset, making
Output Should Contain ${diff_result} No changes in changeset.incorrect. The author's own### IMPORTANT QUESTIONcomment suggests uncertainty here. This needs to be resolved — either the assertion is wrong, or the test's understanding of the expected behavior needs to be documented.Code Quality Issues
4. Debug comments left in code
The
### IMPORTANT QUESTIONblock (3 lines) should not be in production test code. Resolve the question and remove the comments.5. Inconsistent indentation
PR Metadata Issues
6. No milestone assigned — CONTRIBUTING.md requires PRs to be assigned to the same milestone as the linked issue. Issue #1249 is in milestone v3.0.0.
7. No Type/ label — CONTRIBUTING.md requires exactly one
Type/label. The issue hasType/Testing, so this PR should too.Summary
Please fix the two critical variable bugs, resolve the "No changes in changeset" question, remove debug comments, fix indentation, and add the missing milestone and label before re-requesting review.
@@ -81,3 +115,4 @@Log Execute phase rc=${exec2_result.rc}${exec2_combined}= Set Variable ${exec2_result.stdout}\n${exec2_result.stderr}Log Execute output: ${exec2_combined}BUG: Wrong variable reference. This checks
${exec2_result.rc}(the previous execute step's return code) instead of${diff_result.rc}(the diff step's return code). While it won't crash (exec2_result exists), it's validating the wrong command.Should be:
@@ -77,0 +106,4 @@Output Should Contain ${exec1_result} Strategy Actor: openai/gpt-4o-miniOutput Should Contain ${exec1_result} Execution Actor: openai/gpt-4o-miniOutput Should Contain ${exec1_result} Definition of Done:Output Should Contain ${exec1_result} Create a file called HELLO.md with a short greeting.Questionable assertion + debug comments. The
### IMPORTANT QUESTIONblock should not be in production test code. More importantly, if the LLM successfully creates HELLO.md during execution, thenNo changes in changeset.would be the wrong expected output — there should be changes. Please resolve this question and either:Also remove the
### IMPORTANT QUESTIONdebug comments.@@ -85,0 +128,4 @@Output Should Contain ${exec2_result} Execution Actor: openai/gpt-4o-miniOutput Should Contain ${exec2_result} Definition of Done:Output Should Contain ${exec2_result} Create a file called HELLO.md with a short greeting.BUG: Wrong variable reference. This checks
${git_log.rc}but${git_log}is not defined until step 11 (theRun Process git logcall below). This will cause a Robot Framework runtime error.Should be:
🔒 Claimed by pr-reviewer-5. Starting independent code review.
Independent Review Confirmation (pr-reviewer-5, second pass)
I've completed an independent review of the current state of this PR (SHA
d642cec8f0e50f5d91052c494e28fdc43945bbb3). The issues identified in the previous REQUEST_CHANGES review (review #3068) are still unresolved — no new commits have been pushed since that review.Outstanding Issues Summary
Critical bugs (will cause Robot Framework runtime errors):
Should Be Equal As Integers ${git_log.rc} 0references${git_log}which is not defined until step 11. Must be${apply_result.rc}.Should Be Equal As Integers ${exec2_result.rc} 0checks the wrong variable. Must be${diff_result.rc}.Questionable logic:
3. Step 9:
Output Should Contain ${diff_result} No changes in changeset.— If the LLM successfully creates HELLO.md during execution, there should be changes in the changeset. This assertion appears incorrect and needs resolution.Code quality:
4.
### IMPORTANT QUESTIONdebug comments (3 lines) must be removed from production test code.5. Step 7 comment has inconsistent indentation (5 spaces instead of 4).
PR metadata (CONTRIBUTING.md requirements):
6. No milestone assigned — should be v3.0.0 (matching issue #1249).
7. No
Type/label — should be Type/Testing (matching issue #1249).Decision
Cannot merge. The two critical variable-reference bugs will cause the test to fail at runtime. Please address all items above and push a fix commit.
d642cec8f0to214c74afdc214c74afdctobfb3286a35Response to Reviews (#3068 and independent confirmation #76859)
Thank you for the thorough reviews. All issues identified have been addressed, and investigation into the "Questionable Assertion" revealed a significant upstream bug.
Critical bugs — Fixed
Both variable-reference bugs were fixed in the earlier iteration:
${git_log.rc}→ replaced with${apply_result.rc}✅${exec2_result.rc}→ replaced with${diff_result.rc}✅"Questionable Assertion" — Root cause identified: sandbox_root wiring bug
Both reviews correctly flagged the
No changes in changeset.assertion as suspicious, noting that if the LLM creates HELLO.md, there should be changes. This was also the question behind the### IMPORTANT QUESTIONdebug comment.I investigated why HELLO.md is not being created despite the LLM being asked to create it. The root cause is a bug in the plan execute pipeline:
_get_plan_executor()insrc/cleveragents/cli/commands/plan.py(~line 1267) does not passsandbox_roottoPlanExecutor. The full chain:PlanExecutor.__init__()receivessandbox_root=NonePlanExecutor._run_execute_with_stub()passessandbox_root=NonetoLLMExecuteActor.execute()LLMExecuteActor.execute()(~line 354 inllm_actors.py) checksif sandbox_root is not None and not read_only:— this evaluates toFalse_write_to_sandbox()is never called — LLM-generated files are silently discardedThe LLM does run and does generate content (you can see it in DEBUG logs), but the files are never written to disk because
sandbox_rootisNone.Additionally,
plan applyonly transitions plan state metadata — it never callsGitWorktreeSandbox.commit()to merge sandbox changes into the target repo. The sandbox infrastructure exists and works in isolation tests, but is never wired into the CLI execute pipeline.Actions taken
Bug ticket created: #1313 —
fix(plan): wire sandbox_root into plan execute pipelinewith full root-cause analysis, code locations, and acceptance criteria.Test updated with correct assertions: Instead of the contradictory
No changes in changeset.assertion, the test now asserts what should happen:Output Should Contain ${diff_result} HELLO— diff must reference HELLO.mdShould Be True ${commit_lines} >= 2— apply must produce a real commitFile Should Exist ${repo_path}${/}HELLO.md— HELLO.md must exist post-applyTagged
tdd_expected_fail: The test is taggedtdd_expected_fail tdd_issue tdd_issue_1313so thetdd_expected_fail_listenerinverts the result — the test passes CI while the bug exists. When #1313 is fixed, the tag is removed and the test passes normally.Code quality issues — Fixed
PR metadata
Review claimed by reviewer pool instance reviewer-pool-1. Dispatching independent code review.
Independent Code Review — APPROVED
Reviewer: reviewer-pool-1 (second independent review)
Commit reviewed:
bfb3286a35b0ea2014810327d2cb7d2ef5a33bd8Summary
This PR updates the M1 acceptance E2E test (
m1_acceptance.robot) to add comprehensive return code checks and expected output validation for every CLI step in the test lifecycle. All issues from the previous REQUEST_CHANGES review (#3068) have been properly addressed.Review Checklist
✅ Previous Review Issues — All Resolved
${git_log.rc}bug → Fixed: now uses${apply_result.rc}in step 10${exec2_result.rc}bug → Fixed: now uses${diff_result.rc}in step 9No changes in changeset.assertion → Replaced with correctOutput Should Contain ${diff_result} HELLOassertion, properly taggedtdd_expected_failwith upstream bug #1313 filed✅ Specification Alignment
✅ Commit Message Format
test(e2e): update m1_acceptance.robot— valid Conventional Changelog formatISSUES CLOSED: #1249footer present✅ Test Quality
rc=0and checks meaningful output fields--format plainadded consistently to all commands for reliable output parsingtdd_expected_failtag properly documents the known sandbox_root wiring bug (#1313) — this is a correct TDD pattern for capturing known failures while keeping CI greentdd_expected_fail_listenerinversion mechanism is well-documented in the test's Documentation section✅ Correctness
${*_result.rc}matches its correspondingRun CleverAgents Commandassignment)phase: execute), execute completes (step 8 showsprocessing_state: complete), apply transitions tostate: appliedOutput Should Containkeyword (fromcommon_e2e.resource) is case-insensitive and checks both stdout and stderr — appropriate for CLI output validation✅ Code Quality
Extract Plan Idkeyword is well-documented with ULID pattern explanation✅ PR Metadata
Closes #1249✅Type/Testinglabel present ✅Minor Observations (non-blocking)
expected_rc=${0}(keyword argument) and a separateShould Be Equal As Integerscheck — slightly redundant but provides explicit documentation of the expectation- {"project_name": "local/test-project"}which is a specific plain-format representation — if the output format changes this would need updating, but that's expected for E2E testsDecision: APPROVED
All previous review issues are resolved. The code is clean, well-structured, and the tdd_expected_fail approach is a proper TDD pattern. Ready to merge.