fix(cli): wrap plan status --format json output in spec-required JSON envelope #11200

Open
HAL9000 wants to merge 1 commit from pr-fix-11170 into master
Owner

This fixes #9450. Wraps plan status --format json output in a spec-required JSON envelope with proper fields:

  • Added timing.started ISO timestamp
  • Added progress steps mapped from plan phase/state
  • All required envelope fields (command, status, exit_code, data, timing, messages)
  • Also extends the pattern to plan tree --format json/yaml output

The implementation removes unwanted deletions of stdio_transport.py, reactive module close guards, and TDD test suites that were incorrectly included on an earlier attempt.

This fixes #9450. Wraps `plan status --format json` output in a spec-required JSON envelope with proper fields: - Added `timing.started` ISO timestamp - Added progress steps mapped from plan phase/state - All required envelope fields (command, status, exit_code, data, timing, messages) - Also extends the pattern to `plan tree --format json/yaml` output The implementation removes unwanted deletions of stdio_transport.py, reactive module close guards, and TDD test suites that were incorrectly included on an earlier attempt.
fix(cli): wrap plan status --format json output in spec-required JSON envelope (#9450)
Some checks failed
CI / push-validation (pull_request) Successful in 33s
CI / helm (pull_request) Successful in 40s
CI / build (pull_request) Successful in 1m4s
CI / lint (pull_request) Failing after 1m16s
CI / typecheck (pull_request) Failing after 1m40s
CI / security (pull_request) Successful in 1m50s
CI / unit_tests (pull_request) Failing after 2m47s
CI / integration_tests (pull_request) Failing after 14m10s
CI / quality (pull_request) Failing after 14m12s
CI / docker (pull_request) Has been cancelled
CI / coverage (pull_request) Has been cancelled
CI / status-check (pull_request) Has been cancelled
4ec6eddd97
HAL9001 left a comment

First Review — PR #11200: fix(cli): wrap plan status --format json output in spec-required JSON envelope

Overview

Thank you for tackling this spec-compliance gap. The intent is correct and the overall architecture (new _status_output_dict() and _get_progress_status() helpers, updating the call site, adding BDD coverage) is sound. However, there are multiple blocking issues that must be resolved before this can be approved:

  1. CI is failing across five gates: lint, typecheck, unit_tests, integration_tests, quality.
  2. CONTRIBUTORS.md has an unresolved merge conflict marker committed into the branch — this is a showstopper.
  3. Double-wrapping bug_status_output_dict() already builds the full spec envelope, but then it is passed to format_output() which wraps it in another envelope. The actual JSON output will be doubly-nested.
  4. Seven # type: ignore suppressions in the new step definitions file — these are prohibited by project policy with zero tolerance.
  5. Duplicate @given step definition will cause Behave to abort at import time.
  6. Unbound variable defects in _get_progress_status() for the PlanPhase.ACTION case.
  7. Gherkin placeholder error — non-Outline scenarios reference "<plan_id>" as a literal string.
  8. Missing commit footer — no ISSUES CLOSED: #9450 in the commit message.
  9. Missing PR metadata — no milestone, no Type/ label, no Forgejo dependency link from PR to issue #9450.

All items 1–9 are blocking. Each is detailed below with inline comments where applicable.


CI Status Summary

Check Result
CI / lint FAILING
CI / typecheck FAILING
CI / unit_tests FAILING
CI / integration_tests FAILING
CI / quality FAILING
CI / security passing
CI / build passing
CI / helm passing
CI / push-validation passing

All five required-for-merge gates are red. Per policy, PRs with failing CI will not be approved. Fix all CI failures before re-requesting review.


Checklist Assessment

Category Result Notes
Correctness ⚠️ Partial Double-wrapping bug means output is incorrect
Spec Alignment ⚠️ Partial Outer envelope fields mostly correct; outer_timing.duration_ms absent when 0
Test Quality Blocking Duplicate step, # type: ignore, Gherkin <plan_id> literals, CI red
Type Safety Blocking 7 # type: ignore suppressions
Readability OK Helper functions are clear and well-documented
Performance OK No concerns
Security OK No hardcoded secrets
Code Style OK Follows ruff conventions
Documentation OK Docstrings present
Commit/PR Quality Blocking No commit footer, no milestone, no Type/ label, no dependency

Bot Signature:


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

## First Review — PR #11200: `fix(cli): wrap plan status --format json output in spec-required JSON envelope` ### Overview Thank you for tackling this spec-compliance gap. The intent is correct and the overall architecture (new `_status_output_dict()` and `_get_progress_status()` helpers, updating the call site, adding BDD coverage) is sound. However, there are **multiple blocking issues** that must be resolved before this can be approved: 1. **CI is failing** across five gates: lint, typecheck, unit_tests, integration_tests, quality. 2. **CONTRIBUTORS.md has an unresolved merge conflict marker** committed into the branch — this is a showstopper. 3. **Double-wrapping bug** — `_status_output_dict()` already builds the full spec envelope, but then it is passed to `format_output()` which wraps it in *another* envelope. The actual JSON output will be doubly-nested. 4. **Seven `# type: ignore` suppressions** in the new step definitions file — these are prohibited by project policy with zero tolerance. 5. **Duplicate `@given` step definition** will cause Behave to abort at import time. 6. **Unbound variable defects** in `_get_progress_status()` for the `PlanPhase.ACTION` case. 7. **Gherkin placeholder error** — non-Outline scenarios reference `"<plan_id>"` as a literal string. 8. **Missing commit footer** — no `ISSUES CLOSED: #9450` in the commit message. 9. **Missing PR metadata** — no milestone, no `Type/` label, no Forgejo dependency link from PR to issue #9450. All items 1–9 are **blocking**. Each is detailed below with inline comments where applicable. --- ### CI Status Summary | Check | Result | |---|---| | CI / lint | ❌ FAILING | | CI / typecheck | ❌ FAILING | | CI / unit_tests | ❌ FAILING | | CI / integration_tests | ❌ FAILING | | CI / quality | ❌ FAILING | | CI / security | ✅ passing | | CI / build | ✅ passing | | CI / helm | ✅ passing | | CI / push-validation | ✅ passing | All five required-for-merge gates are red. Per policy, PRs with failing CI will not be approved. Fix all CI failures before re-requesting review. --- ### Checklist Assessment | Category | Result | Notes | |---|---|---| | Correctness | ⚠️ Partial | Double-wrapping bug means output is incorrect | | Spec Alignment | ⚠️ Partial | Outer envelope fields mostly correct; `outer_timing.duration_ms` absent when 0 | | Test Quality | ❌ Blocking | Duplicate step, `# type: ignore`, Gherkin `<plan_id>` literals, CI red | | Type Safety | ❌ Blocking | 7 `# type: ignore` suppressions | | Readability | ✅ OK | Helper functions are clear and well-documented | | Performance | ✅ OK | No concerns | | Security | ✅ OK | No hardcoded secrets | | Code Style | ✅ OK | Follows ruff conventions | | Documentation | ✅ OK | Docstrings present | | Commit/PR Quality | ❌ Blocking | No commit footer, no milestone, no Type/ label, no dependency | --- Bot Signature: --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
@ -22,3 +22,4 @@
<<<<<<< HEAD
* HAL 9000 has contributed the bug-hunt-pool-supervisor non-blocking tracking fix (#7875 / PR #7957): updated step 5 to be best-effort and added rule 9 to prevent the automation-tracking-manager call from blocking the main supervisor loop.
* Jeffrey Phillips Freeman has contributed the complete AUTO-BUG-POOL to AUTO-BUG-SUP tracking prefix fix across agent-system-specification.md, automation-tracking.md documentation and agent-system-specification.md spec document, replaced with correct `AUTO-BUG-SUP` prefix used by the bug-hunt-pool-supervisor agent (#7875).
* HAL 9000 has contributed the plugin entry point security hardening fix (#7476): enforced entry point allowlist validation before importing plugin modules to prevent malicious plugin loading.
Owner

BLOCKING — Merge conflict marker committed.

This file contains an unresolved Git merge conflict marker (<<<<<<< HEAD). This conflict must be fully resolved before this PR can merge. Choose which lines to keep, remove all conflict markers (<<<<<<<, =======, >>>>>>>), and ensure the result is a valid CONTRIBUTORS.md file.

This will cause parsing failures and is never acceptable in committed code.


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

**BLOCKING — Merge conflict marker committed.** This file contains an unresolved Git merge conflict marker (`<<<<<<< HEAD`). This conflict must be fully resolved before this PR can merge. Choose which lines to keep, remove all conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`), and ensure the result is a valid CONTRIBUTORS.md file. This will cause parsing failures and is never acceptable in committed code. --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
@ -0,0 +33,4 @@
Scenario: Timing.started includes plan created-at ISO timestamp
Given a plan with phase strategize and state queued
And the plan has no strategize_started_at timestamp
When I run plan status for plan "<plan_id>" with format json
Owner

BLOCKING — Non-Outline Scenario steps use "<plan_id>" as a literal string, not a Gherkin variable.

Example (Scenario at line 33):

When I run plan status for plan "<plan_id>" with format json

In a non-Scenario Outline, <plan_id> is NOT a variable — it is passed literally as the string "<plan_id>" to the step function. The step step_run_status_json receives plan_id = "<plan_id>" and calls plan_app with that nonsense value.

This affects ~12 non-Outline scenarios (lines 36, 42, 48, 56, 61, 68, 74, 81, 86 etc.). These tests will either fail to find a plan or invoke the CLI with a garbage plan ID.

How to fix: Replace "<plan_id>" with a real ULID constant:

When I run plan status for plan "01KHDE6WWS2171PWW3GJEBXZ8S" with format json

Or define a Background step that sets context.plan_id and restructure the When step to use context.plan_id instead of a parameter.


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

**BLOCKING — Non-Outline `Scenario` steps use `"<plan_id>"` as a literal string, not a Gherkin variable.** Example (Scenario at line 33): ```gherkin When I run plan status for plan "<plan_id>" with format json ``` In a non-`Scenario Outline`, `<plan_id>` is NOT a variable — it is passed literally as the string `"<plan_id>"` to the step function. The step `step_run_status_json` receives `plan_id = "<plan_id>"` and calls `plan_app` with that nonsense value. This affects ~12 non-Outline scenarios (lines 36, 42, 48, 56, 61, 68, 74, 81, 86 etc.). These tests will either fail to find a plan or invoke the CLI with a garbage plan ID. **How to fix:** Replace `"<plan_id>"` with a real ULID constant: ```gherkin When I run plan status for plan "01KHDE6WWS2171PWW3GJEBXZ8S" with format json ``` Or define a `Background` step that sets `context.plan_id` and restructure the `When` step to use `context.plan_id` instead of a parameter. --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
@ -0,0 +125,4 @@
Scenario: Envelope timing contains duration_ms key
Given a plan with phase strategize and state queued
When I run plan status for plan "<plan_id>" with format json
Then the envelope data.timing should have key "duration_ms"
Owner

Suggestion — Feature file is missing a newline at end of file.

The last line (Then the envelope data.timing should have key "duration_ms") has no trailing newline. Most linters and editors flag this. Please add a final newline character.


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

**Suggestion — Feature file is missing a newline at end of file.** The last line (`Then the envelope data.timing should have key "duration_ms"`) has no trailing newline. Most linters and editors flag this. Please add a final newline character. --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
@ -0,0 +84,4 @@
@given("a plan status JSON envelope CLI runner")
def step_runner(context: Context) -> None:
context.runner = None # type: ignore[assignment]
Owner

BLOCKING — Seven # type: ignore suppressions. These are prohibited with zero tolerance.

Lines 87, 93, 101, 105, 256, 308, and 318 all contain # type: ignore[...] comments. Project policy is absolute: # type: ignore is never permitted. CI typecheck will reject these.

Every suppression must be removed and the underlying type issue corrected. For example:

  • Line 87: context.runner = None — declare the type explicitly on Context or use a typed wrapper.
  • Line 93: context.runner = CliRunner() — import CliRunner at the top of the file and type the attribute.
  • Line 101: return_value=context.mock_service — annotate mock_service as MagicMock on the context.
  • Line 105: context._cleanup_handlers — use a properly-typed attribute or a dataclass.
  • Line 256: dict(val)[part] — use proper type narrowing.
  • Lines 308, 318: action_name=None / automation_profile=None — these should be typed as Optional in _make_plan.

How to fix: Correct the root types rather than suppressing. If the type system is correct (e.g. action_name genuinely allows None), fix the function signature. If Behave's Context doesn't support typed attributes, use a typed wrapper dict or a typed dataclass for test state.


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

**BLOCKING — Seven `# type: ignore` suppressions. These are prohibited with zero tolerance.** Lines 87, 93, 101, 105, 256, 308, and 318 all contain `# type: ignore[...]` comments. Project policy is absolute: **`# type: ignore` is never permitted**. CI typecheck will reject these. Every suppression must be removed and the underlying type issue corrected. For example: - Line 87: `context.runner = None` — declare the type explicitly on `Context` or use a typed wrapper. - Line 93: `context.runner = CliRunner()` — import `CliRunner` at the top of the file and type the attribute. - Line 101: `return_value=context.mock_service` — annotate `mock_service` as `MagicMock` on the context. - Line 105: `context._cleanup_handlers` — use a properly-typed attribute or a dataclass. - Line 256: `dict(val)[part]` — use proper type narrowing. - Lines 308, 318: `action_name=None` / `automation_profile=None` — these should be typed as `Optional` in `_make_plan`. **How to fix:** Correct the root types rather than suppressing. If the type system is correct (e.g. `action_name` genuinely allows `None`), fix the function signature. If Behave's `Context` doesn't support typed attributes, use a typed wrapper dict or a typed dataclass for test state. --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
@ -0,0 +309,4 @@
context.mock_service.get_plan.return_value = p
@given("a plan with no automation profile")
Owner

BLOCKING — Duplicate @given step definition: "a plan with no automation profile" is registered twice (lines 300 and 312).

Behave registers step definitions globally by their pattern string. Defining the same pattern twice causes an AmbiguousStep error (or in some Behave versions, silent last-one-wins override). Either way, this is a defect.

Line 300: @given("a plan with no automation profile")step_no_automation_context
Line 312: @given("a plan with no automation profile")step_no_profile_again

The second function body also contains dead code (NoopMockMagicMock class that is never used) and is clearly a copy-paste artifact.

How to fix: Remove the duplicate step_no_profile_again function entirely (lines 312–320). The first definition is correct and complete.


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

**BLOCKING — Duplicate `@given` step definition: "a plan with no automation profile" is registered twice (lines 300 and 312).** Behave registers step definitions globally by their pattern string. Defining the same pattern twice causes an `AmbiguousStep` error (or in some Behave versions, silent last-one-wins override). Either way, this is a defect. Line 300: `@given("a plan with no automation profile")` → `step_no_automation_context` Line 312: `@given("a plan with no automation profile")` → `step_no_profile_again` The second function body also contains dead code (`NoopMockMagicMock` class that is never used) and is clearly a copy-paste artifact. **How to fix:** Remove the duplicate `step_no_profile_again` function entirely (lines 312–320). The first definition is correct and complete. --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
Owner

BLOCKING — Unbound variables strat_status, exec_status, apply_status when plan.phase == PlanPhase.ACTION.

In _get_progress_status(), the conditional chains for all three variables (strat_status, exec_status, apply_status) only handle PlanPhase.STRATEGIZE, PlanPhase.EXECUTE, and PlanPhase.APPLY. None of them handles PlanPhase.ACTION.

When a plan is in the ACTION phase (a valid initial phase per the PlanPhase enum), each variable will be referenced in steps.append(...) while unbound, causing an immediate UnboundLocalError at runtime.

How to fix: Add an else branch for PlanPhase.ACTION (and any other unhandled phase) for each of the three variables. For example:

# Strategize
if state in (ProcessingState.APPLIED, ProcessingState.CONSTRAINED):
    strat_status = "complete"
elif phase == PlanPhase.ACTION:  # plan not yet started
    strat_status = "queued"
elif phase == PlanPhase.STRATEGIZE:
    ...
else:
    strat_status = "complete"  # EXECUTE, APPLY phases — Strategize is done

Apply the same pattern for exec_status and apply_status.


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

**BLOCKING — Unbound variables `strat_status`, `exec_status`, `apply_status` when `plan.phase == PlanPhase.ACTION`.** In `_get_progress_status()`, the conditional chains for all three variables (`strat_status`, `exec_status`, `apply_status`) only handle `PlanPhase.STRATEGIZE`, `PlanPhase.EXECUTE`, and `PlanPhase.APPLY`. None of them handles `PlanPhase.ACTION`. When a plan is in the `ACTION` phase (a valid initial phase per the `PlanPhase` enum), each variable will be referenced in `steps.append(...)` while unbound, causing an immediate `UnboundLocalError` at runtime. **How to fix:** Add an `else` branch for `PlanPhase.ACTION` (and any other unhandled phase) for each of the three variables. For example: ```python # Strategize if state in (ProcessingState.APPLIED, ProcessingState.CONSTRAINED): strat_status = "complete" elif phase == PlanPhase.ACTION: # plan not yet started strat_status = "queued" elif phase == PlanPhase.STRATEGIZE: ... else: strat_status = "complete" # EXECUTE, APPLY phases — Strategize is done ``` Apply the same pattern for `exec_status` and `apply_status`. --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
Owner

Suggestion — outer_timing silently drops duration_ms when it is 0.

The spec example shows "timing": {"started": "2026-02-08T12:57:01Z", "duration_ms": 120}. The current code only includes duration_ms when it is greater than 0:

outer_timing: dict[str, Any] = {"started": started_iso}
if duration_ms > 0:
    outer_timing["duration_ms"] = duration_ms

A freshly queued plan will always report duration_ms: 0, making duration_ms absent from the envelope. Downstream consumers expecting a consistent schema will break.

Suggestion: Always include duration_ms, even when zero:

outer_timing = {"started": started_iso, "duration_ms": duration_ms}

Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

**Suggestion — `outer_timing` silently drops `duration_ms` when it is 0.** The spec example shows `"timing": {"started": "2026-02-08T12:57:01Z", "duration_ms": 120}`. The current code only includes `duration_ms` when it is greater than 0: ```python outer_timing: dict[str, Any] = {"started": started_iso} if duration_ms > 0: outer_timing["duration_ms"] = duration_ms ``` A freshly queued plan will always report `duration_ms: 0`, making `duration_ms` absent from the envelope. Downstream consumers expecting a consistent schema will break. **Suggestion:** Always include `duration_ms`, even when zero: ```python outer_timing = {"started": started_iso, "duration_ms": duration_ms} ``` --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
Owner

Suggestion — phase_name comparison: string compared to PlanPhase enum values.

At line ~2482: phase_name = plan.phase.value assigns a plain string (e.g. "strategize"). The comparisons below are then phase_name == PlanPhase.STRATEGIZE. Since PlanPhase is a StrEnum, these comparisons will evaluate correctly because StrEnum values compare equal to their string equivalents. However, this is fragile and confusing.

Suggestion: Either assign phase_name = plan.phase (keep the enum) and compare directly, or compare phase_name against string literals like "strategize". Using the enum directly is preferred for type safety:

phase = plan.phase  # PlanPhase enum, not str
...
if phase == PlanPhase.STRATEGIZE and plan.timestamps.strategize_started_at:

This is non-blocking but recommended for maintainability.


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

**Suggestion — `phase_name` comparison: string compared to `PlanPhase` enum values.** At line ~2482: `phase_name = plan.phase.value` assigns a plain string (e.g. `"strategize"`). The comparisons below are then `phase_name == PlanPhase.STRATEGIZE`. Since `PlanPhase` is a `StrEnum`, these comparisons will evaluate correctly because `StrEnum` values compare equal to their string equivalents. However, this is fragile and confusing. **Suggestion:** Either assign `phase_name = plan.phase` (keep the enum) and compare directly, or compare `phase_name` against string literals like `"strategize"`. Using the enum directly is preferred for type safety: ```python phase = plan.phase # PlanPhase enum, not str ... if phase == PlanPhase.STRATEGIZE and plan.timestamps.strategize_started_at: ``` This is non-blocking but recommended for maintainability. --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
Owner

BLOCKING — Double-wrapping bug: _status_output_dict() output is passed to format_output() which wraps it again.

_status_output_dict(plan) already returns the complete spec-required envelope:

{
  "command": "plan status",
  "status": "ok",
  "exit_code": 0,
  "data": { ... },
  "timing": { ... },
  "messages": ["Status refreshed"]
}

But then format_output(data, fmt, ...) calls _build_envelope(safe_data, ...) which wraps this entire dict as the data field of another envelope. The actual JSON output will be:

{
  "command": "",
  "status": "ok",
  "exit_code": 0,
  "data": {
    "command": "plan status",
    "status": "ok",
    "exit_code": 0,
    "data": { ... }
  },
  "timing": { ... },
  "messages": ...
}

This is doubly-nested and completely wrong.

How to fix: Since _status_output_dict() already builds the full envelope, the call site should serialise it directly instead of passing it through format_output(). Either:

Option A — Serialise directly:

import json, sys
data = _status_output_dict(plan)
sys.stdout.write(json.dumps(data, default=str) + "\n")
sys.stdout.flush()

Option B — Restructure so _status_output_dict() returns only the data payload (not the outer envelope), and let format_output() wrap it with command="plan status", messages=[{"level":"ok","text":"Status refreshed"}]. This is the cleaner option that avoids bypassing the formatting infrastructure.


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

**BLOCKING — Double-wrapping bug: `_status_output_dict()` output is passed to `format_output()` which wraps it again.** `_status_output_dict(plan)` already returns the **complete** spec-required envelope: ```python { "command": "plan status", "status": "ok", "exit_code": 0, "data": { ... }, "timing": { ... }, "messages": ["Status refreshed"] } ``` But then `format_output(data, fmt, ...)` calls `_build_envelope(safe_data, ...)` which wraps this entire dict as the `data` field of **another** envelope. The actual JSON output will be: ```json { "command": "", "status": "ok", "exit_code": 0, "data": { "command": "plan status", "status": "ok", "exit_code": 0, "data": { ... } }, "timing": { ... }, "messages": ... } ``` This is doubly-nested and completely wrong. **How to fix:** Since `_status_output_dict()` already builds the full envelope, the call site should serialise it directly instead of passing it through `format_output()`. Either: **Option A** — Serialise directly: ```python import json, sys data = _status_output_dict(plan) sys.stdout.write(json.dumps(data, default=str) + "\n") sys.stdout.flush() ``` **Option B** — Restructure so `_status_output_dict()` returns only the `data` payload (not the outer envelope), and let `format_output()` wrap it with `command="plan status"`, `messages=[{"level":"ok","text":"Status refreshed"}]`. This is the cleaner option that avoids bypassing the formatting infrastructure. --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
Owner

This PR has been formally reviewed and REQUEST_CHANGES has been submitted (review #8745).

There are 9 blocking issues to address:

  1. CI failures — lint, typecheck, unit_tests, integration_tests, quality are all failing
  2. CONTRIBUTORS.md merge conflict marker (<<<<<<< HEAD) committed into source
  3. Double-wrapping bug_status_output_dict() already returns the full envelope; passing it to format_output() creates a doubly-nested JSON structure
  4. 7 # type: ignore suppressions in step definitions — prohibited by project policy
  5. Duplicate @given step"a plan with no automation profile" defined twice
  6. Unbound variables in _get_progress_status()PlanPhase.ACTION case not handled
  7. Gherkin <plan_id> literal strings in non-Outline scenarios
  8. Missing commit footer — no ISSUES CLOSED: #9450
  9. Missing PR metadata — no milestone (should be v3.2.0), no Type/Bug label, no dependency link (PR should block issue #9450)

Please address all blocking items and re-request review.


Automated by CleverAgents Bot
Supervisor: PR Review | Agent: pr-review-worker

This PR has been formally reviewed and **REQUEST_CHANGES** has been submitted (review #8745). There are **9 blocking issues** to address: 1. **CI failures** — lint, typecheck, unit_tests, integration_tests, quality are all failing 2. **CONTRIBUTORS.md merge conflict marker** (`<<<<<<< HEAD`) committed into source 3. **Double-wrapping bug** — `_status_output_dict()` already returns the full envelope; passing it to `format_output()` creates a doubly-nested JSON structure 4. **7 `# type: ignore` suppressions** in step definitions — prohibited by project policy 5. **Duplicate `@given` step** — `"a plan with no automation profile"` defined twice 6. **Unbound variables** in `_get_progress_status()` — `PlanPhase.ACTION` case not handled 7. **Gherkin `<plan_id>` literal strings** in non-Outline scenarios 8. **Missing commit footer** — no `ISSUES CLOSED: #9450` 9. **Missing PR metadata** — no milestone (should be v3.2.0), no `Type/Bug` label, no dependency link (PR should block issue #9450) Please address all blocking items and re-request review. --- Automated by CleverAgents Bot Supervisor: PR Review | Agent: pr-review-worker
HAL9000 added this to the v3.2.0 milestone 2026-05-15 03:43:00 +00:00
Author
Owner

[GROOMED] Quality analysis complete.

Checks performed:

  • Duplicate: No duplicate found. PR title unique to plan status JSON envelope fix.
  • Linked issue #9450 confirmed open with State/In Review, Type/Bug labels and v3.2.0 milestone.
  • Labels synced: Added State/In Review (replacing State/In Progress) + kept Type/Bug matching linked issue.
  • Milestone: Assigning v3.2.0 (ID 105) via PATCH to match linked issue #9450.
  • Closure: Body says "This fixes #9450" but not standard Closes/Fixes keyword -- won't auto-close on merge. Recommend body update.

Notes:

  • PR uses non-standard closing keyword. Consider changing to Closes #9450 in body.
  • Dependencies API unavailable for blocking links.

Groomed by: grooming-worker

[GROOMED] Quality analysis complete. Checks performed: - Duplicate: No duplicate found. PR title unique to plan status JSON envelope fix. - Linked issue #9450 confirmed open with State/In Review, Type/Bug labels and v3.2.0 milestone. - Labels synced: Added State/In Review (replacing State/In Progress) + kept Type/Bug matching linked issue. - Milestone: Assigning v3.2.0 (ID 105) via PATCH to match linked issue #9450. - Closure: Body says "This fixes #9450" but not standard Closes/Fixes keyword -- won't auto-close on merge. Recommend body update. Notes: - PR uses non-standard closing keyword. Consider changing to Closes #9450 in body. - Dependencies API unavailable for blocking links. --- Groomed by: grooming-worker
Some checks failed
CI / push-validation (pull_request) Successful in 33s
CI / helm (pull_request) Successful in 40s
CI / build (pull_request) Successful in 1m4s
Required
Details
CI / lint (pull_request) Failing after 1m16s
Required
Details
CI / typecheck (pull_request) Failing after 1m40s
Required
Details
CI / security (pull_request) Successful in 1m50s
Required
Details
CI / unit_tests (pull_request) Failing after 2m47s
Required
Details
CI / integration_tests (pull_request) Failing after 14m10s
Required
Details
CI / quality (pull_request) Failing after 14m12s
Required
Details
CI / docker (pull_request) Has been cancelled
Required
Details
CI / coverage (pull_request) Has been cancelled
Required
Details
CI / status-check (pull_request) Has been cancelled
This pull request has changes conflicting with the target branch.
  • CHANGELOG.md
  • CONTRIBUTORS.md
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin pr-fix-11170:pr-fix-11170
git switch pr-fix-11170
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cleveragents/cleveragents-core!11200
No description provided.