Files
cleveragents-core/features/plan_lifecycle_cli_coverage.feature
freemo 02250473ad fix(ci): restore all CI quality gates to passing on master
Fix all failing CI quality gates (lint, unit_tests, format) without
suppressing any quality enforcement.

Root causes and fixes:

1. Format: features/steps/plan_namespaced_name_tdd_steps.py had trailing
   whitespace; fixed by running ruff format.

2. Unit tests - A2A JSON-RPC 2.0 migration (commit 9c6d6915) renamed
   A2aRequest fields (operation→method, request_id→id, a2a_version→jsonrpc)
   and A2aResponse fields (status+data→result, request_id→id) but did not
   update all step files and feature files:
   - a2a_jsonrpc_wire_format_steps.py: added use_step_matcher('re') and
     reset to 'parse' at end to prevent parallel test interference
   - a2a_facade_wiring_steps.py: updated operation= to method=, .status/.data
     to .result
   - a2a_facade_steps.py: updated request_id→id, a2a_version→jsonrpc,
     A2aResponse(request_id=..., status=...) to new API
   - m6_facade_steps.py: updated all old API usage
   - devcontainer_cleanup_steps.py: updated A2aRequest(operation=...)
   - plan_prompt_command_steps.py: updated A2aRequest(operation=...)
   - wf03_plan_prompt_confidence_steps.py: updated A2aRequest(operation=...)
   - consolidated_misc.feature: updated old A2aRequest/A2aResponse scenarios

3. Unit tests - Session CLI output changed (commit 0d5d9cf0 and others):
   - 'Session Created' → 'Session created' (lowercase)
   - 'Session Details' → 'Session Summary'
   - 'Sessions (N total)' → 'Sessions'
   - session list JSON: top-level 'total' → nested 'summary.total'
   - Fixed in: session_cli.feature, session_cli_coverage_boost.feature,
     session_cli_uncovered_branches.feature, session_list_error.feature,
     tdd_session_create_persist_steps.py

4. Unit tests - Plan list output changed (commit 1a07a891):
   - 'V3 Lifecycle Plans' → 'Plans'
   - 'Lifecycle Plans' → 'Plans'
   - Name column removed (restored in source)
   - Invariants column removed (restored in source)
   - Project truncation removed (restored in source)
   - Fixed in: plan_cli_cancel_revert_coverage.feature,
     plan_lifecycle_cli_coverage.feature, plan_cli_coverage_boost_steps.py,
     plan.py (source code restored)

5. Unit tests - Plan apply command now requires ULID (commit 300a5d6d):
   - plan_cli_coverage_r3.feature: updated 'PLAN-001' to valid ULID
   - plan_cli_coverage_r3_steps.py: added --yes flag, added new step for
     no-eligible-plans path

6. Unit tests - Various source code bugs:
   - ThoughtBlock: converted from @dataclass to Pydantic BaseModel
     (architecture test requires all dataclasses to use Pydantic)
   - session.py: added DatabaseError handling to export, import, tell commands
   - database.py: fixed rollback_to() to reuse checkpoint connection for writes
   - database.py: added _get_checkpoint_conn() helper
   - check-tls-cert.py: fixed SSLCertVerificationError.reason AttributeError

7. Unit tests - Test step bugs:
   - error_recovery_coverage_boost_steps.py: fixed invalid ULID _PLAN_ID
   - session_service_coverage_steps.py: fixed 'sha256:' prefix bug in checksum
   - database_models_new_coverage_steps.py: added 'name' field to session mock
   - async_audit_recording_steps.py: fixed Settings(audit_async=False) via env var
   - coverage_threshold_config_steps.py: added --coverage-min pattern support
   - m5_acms_smoke_steps.py: updated usage hint text
   - actor_cli_yaml_steps.py: updated 'Removed actor' → 'Actor removed'
   - aimodelscredentials_steps.py: set context.imported_class in import step
   - domain_base_model.feature: added missing 'When I examine model_config' step
   - tui_first_run_steps.py: fixed module reload to restore cleveragents.tui.*
     modules after test (prevented patch interference in subsequent tests)
   - tui_first_run_steps.py: added set_search('') step for empty string
   - resource_handler_base_coverage_r3_steps.py: use _MinimalHandler instead
     of DatabaseResourceHandler for NotImplementedError tests
   - resource_handler_crud.feature: updated to test new DatabaseHandler behavior
   - resource_handler_sandbox.feature: updated to test new DatabaseHandler behavior
   - tdd_json_decode_crash_persistence.feature: fixed @tdd_bug → @tdd_issue tags

8. Parallel test interference:
   - All step files using use_step_matcher('re') now reset to 'parse' at end
     to prevent global matcher state leaking to subsequent step files
2026-04-04 20:38:16 +00:00

165 lines
7.9 KiB
Gherkin

Feature: Plan lifecycle CLI coverage
As a developer
I want to exercise v3 plan lifecycle CLI commands
So that plan lifecycle branches in plan.py are covered
Background:
Given a plan lifecycle CLI runner
And a mocked lifecycle service for plan commands
Scenario: Plan use parses typed arguments
When I run plan lifecycle use with parsed arguments
Then the plan lifecycle command should succeed
And the plan lifecycle use should pass parsed arguments
And the plan lifecycle output should contain "Strategize phase"
Scenario: Plan use rejects invalid argument format
When I run plan lifecycle use with invalid argument "badarg"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Invalid argument format"
Scenario: Plan use handles action not available errors
When I run plan lifecycle use causing "action not available"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Action not available"
Scenario: Plan use handles validation errors
When I run plan lifecycle use causing "validation error"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Validation Error"
Scenario: Plan use handles general errors
When I run plan lifecycle use causing "general error"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Error"
Scenario: Plan execute aborts when no plans are ready
When I run plan execute without a plan id with 0 complete plans
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "No plans ready for execution"
Scenario: Plan execute aborts when multiple plans are ready
When I run plan execute without a plan id with 2 complete plans
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Multiple plans ready for execution"
Scenario: Plan execute runs when one plan is ready
When I run plan execute without a plan id with 1 complete plans
Then the plan lifecycle command should succeed
And the execute command should run the single ready plan
And the plan lifecycle output should contain "Plan Executed"
Scenario: Plan execute handles invalid phase transition
When I run plan execute for plan id "01ARZ3NDEKTSV4RRFFQ69G5FAV" causing "invalid transition"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Invalid transition"
Scenario: Plan execute handles plan not ready
When I run plan execute for plan id "01ARZ3NDEKTSV4RRFFQ69G5FAW" causing "plan not ready"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Plan not ready"
Scenario: Plan execute handles general errors
When I run plan execute for plan id "01ARZ3NDEKTSV4RRFFQ69G5FAX" causing "general error"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Error"
Scenario: Plan lifecycle apply aborts when no plans are ready
When I run plan lifecycle apply without a plan id with 0 complete plans
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "No plans ready for apply"
Scenario: Plan lifecycle apply aborts when multiple plans are ready
When I run plan lifecycle apply without a plan id with 2 complete plans
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Multiple plans ready for apply"
Scenario: Plan lifecycle apply runs when one plan is ready
When I run plan lifecycle apply without a plan id with 1 complete plans
Then the plan lifecycle command should succeed
And the lifecycle apply command should run the single ready plan
And the plan lifecycle output should contain "Apply phase"
Scenario: Plan lifecycle apply handles invalid phase transition
When I run plan lifecycle apply for plan id "01ARZ3NDEKTSV4RRFFQ69G5FAY" causing "invalid transition"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Invalid transition"
Scenario: Plan lifecycle apply handles plan not ready
When I run plan lifecycle apply for plan id "01ARZ3NDEKTSV4RRFFQ69G5FAZ" causing "plan not ready"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Plan not ready"
Scenario: Plan lifecycle apply handles general errors
When I run plan lifecycle apply for plan id "01ARZ3NDEKTSV4RRFFQ69G5FB0" causing "general error"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Error"
Scenario: Plan status shows no plans
When I run plan status without a plan id and 0 plans exist
Then the plan lifecycle command should succeed
And the plan lifecycle output should contain "No v3 lifecycle plans found"
Scenario: Plan status lists active plans
When I run plan status without a plan id and 2 plans exist
Then the plan lifecycle command should succeed
And the plan lifecycle output should contain "Active Plans"
Scenario: Plan status falls back for legacy plan
When I run plan status for legacy plan id "01ARZ3NDEKTSV4RRFFQ69G5FB1"
Then the plan lifecycle command should succeed
And the plan lifecycle output should contain "Plan: legacy-plan"
Scenario: Plan status handles general errors
When I run plan status causing a general error
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Error"
Scenario: Plan lifecycle list rejects invalid phase
When I run plan lifecycle list with invalid phase "notaphase"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Invalid phase"
Scenario: Plan lifecycle list shows no plans
When I run plan lifecycle list with no plans
Then the plan lifecycle command should succeed
And the plan lifecycle output should contain "No plans found"
Scenario: Plan lifecycle list shows project summaries
When I run plan lifecycle list with plans and phase "execute"
Then the plan lifecycle command should succeed
And the plan lifecycle output should contain "Plans"
And the plan lifecycle output should contain "proj-2"
And the plan lifecycle output should contain "more"
Scenario: Plan lifecycle list handles general errors
When I run plan lifecycle list causing a general error
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Error"
Scenario: Plan cancel reports cancellation with reason
When I run plan cancel for plan id "01ARZ3NDEKTSV4RRFFQ69G5FB2" with reason "User requested"
Then the plan lifecycle command should succeed
And the plan lifecycle output should contain "Plan cancelled"
And the plan lifecycle output should contain "Reason: User requested"
Scenario: Plan cancel reports cancellation without reason
When I run plan cancel for plan id "01ARZ3NDEKTSV4RRFFQ69G5FB3" without reason
Then the plan lifecycle command should succeed
And the plan lifecycle output should contain "Plan cancelled"
And the plan lifecycle output should not contain "Reason:"
Scenario: Plan cancel handles plan errors
When I run plan cancel for plan id "01ARZ3NDEKTSV4RRFFQ69G5FB4" causing "plan error"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Cannot cancel"
Scenario: Plan cancel handles general errors
When I run plan cancel for plan id "01ARZ3NDEKTSV4RRFFQ69G5FB5" causing "general error"
Then the plan lifecycle command should abort
And the plan lifecycle output should contain "Error"
Scenario: Plan execute shares lifecycle service instance with executor
When I run plan execute verifying lifecycle service sharing
Then the plan executor should receive the same lifecycle service instance