fix(plan): output plan results
CI / helm (pull_request) Successful in 42s
CI / build (pull_request) Successful in 1m12s
CI / lint (pull_request) Successful in 1m26s
CI / quality (pull_request) Successful in 1m38s
CI / typecheck (pull_request) Successful in 1m59s
CI / security (pull_request) Successful in 2m15s
CI / integration_tests (pull_request) Successful in 3m47s
CI / push-validation (pull_request) Successful in 20s
CI / unit_tests (pull_request) Successful in 6m57s
CI / docker (pull_request) Successful in 1m37s
CI / coverage (pull_request) Successful in 12m1s
CI / status-check (pull_request) Successful in 3s

ISSUES UPDATED: #10878
This commit is contained in:
2026-05-13 16:14:43 -07:00
parent d64825bfc6
commit 5775b9d464
+136 -87
View File
@@ -2,6 +2,55 @@
All notable changes to this project will be documented in this file.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
Changed `wf10_batch.robot` to be less likely to create files, and
`plan_generation_graph.robot` to give more test answers.
- Hardened the TDD bug-fix quality gate for issue #629: PR parsing now
requires whole-word closing keywords (avoids false positives like
"prefixes #12"), TDD bug tag discovery now uses exact token matching
(avoids `@tdd_bug_42` matching `@tdd_bug_420`), and gate evaluation now
requires expected-fail tag removal to be present in the PR diff. CI
integration now fetches the PR base branch for diff analysis and includes
`tdd_quality_gate` in `status-check` requirements for pull requests.
Review-round fixes: `check_expected_fail_removed` now uses word-boundary
matching via `_contains_tag_token` (avoids false positives on partial tag
names); diff expected-fail removal detection now tracks flags at file level
instead of per-hunk (fixes false negatives when tags span different hunks);
`parse_bug_refs` filters out issue number zero; redundant double error
reporting eliminated; regex compilation cached via `lru_cache`; nox session
no longer installs the full project (script uses stdlib only); CI checkout
uses `fetch-depth: 0` for reliable merge-base resolution.
Review-round 2 fixes: diff expected-fail removal detection now requires the
removed line to contain both the expected-fail tag and the specific bug tag
(fixes false positives when two bugs' TDD tests reside in the same file);
`check_expected_fail_removed` error messages now use the correct tag prefix
per file type (`@tdd_bug_N` for `.feature`, `tdd_bug_N` for `.robot`);
`bool` values are now rejected by bug-number validation guards; file-read
error handling in `find_tdd_tests` and `check_expected_fail_removed` now
catches `UnicodeDecodeError` (root-safe unreadable-file handling); temp
directory cleanup added to `after_scenario` hook; 8 new Behave scenarios
covering bool guards, co-located bug false-positive, `run_quality_gate`
argument validation, and `main()` CLI entry point.
Review-round 3 fixes: synthetic PR diff helper now auto-detects `.robot`
vs `.feature` file type and generates the matching diff format (fixes
under-tested robot-format diff code path); `check_expected_fail_removed`
test step now filters files by bug tag via `find_tdd_tests` before
checking (matches the production code path); `after_scenario` temp
directory cleanup no longer sets `context.temp_dir = None` (fixes
cleanup conflict with `cli_init_yes_flag_steps.py`); 2 new Behave
scenarios covering multi-line PR description parsing and non-string
`pr_diff` type guard.
- Added Fix-then-Revalidate orchestration loop for required validations:
bounded retry with configurable limits (0--100 per Safety Profile),
strategy revision escalation via `auto_strategy_revision` float
threshold, user escalation via `needs_user_escalation` result flag,
and domain events (`VALIDATION_FIX_ATTEMPTED`, `VALIDATION_FIX_SUCCEEDED`,
`VALIDATION_FIX_EXHAUSTED`). Validation errors are treated as required
failures regardless of mode. Includes `auto_validation_fix` threshold,
per-resource retry tracking, early-exit signalling via `None` return from
`FixCallback`, event bus circuit breaker with lock-protected failure
counter, spec-required `validation_summary` and
`final_validation_results` fields on the result model, DI container
## [Unreleased]
@@ -15,13 +64,13 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- **`agents session tell` invokes real LLM orchestrator actor** (#5784): Replaced the
M3 echo-stub with real actor invocation via `SessionWorkflow`, routing through
`LangChainSessionCaller``ToolCallingRuntime.run_tool_loop()`. The user prompt
`LangChainSessionCaller``ToolCallingRuntime.run_tool_loop()`. The user prompt
is sent to the session's bound orchestrator actor (or `--actor` override), the
assistant's response is persisted via `SessionService.append_message()`, and token
usage is tracked via `SessionService.update_token_usage()`. Output includes a
usage is tracked via `SessionService.update_token_usage()`. Output includes a
**Usage** panel (Rich/Plain) or `usage` object (JSON/YAML) with input tokens,
output tokens, estimated cost, and duration. The `--stream` flag produces real
LLM streaming output. A `SessionActorNotConfiguredError` is raised with exit
output tokens, estimated cost, and duration. The `--stream` flag produces real
LLM streaming output. A `SessionActorNotConfiguredError` is raised with exit
code 1 when no actor is configured.
### Added
@@ -72,12 +121,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
scenario was previously fixed in #4300; the test ensures the fix remains
in place and prevents future regressions.
- **Actor configuration validation incorrectly requires top-level provider field** (#4300):
Actor configuration in V3 is now obtained from the nested configuration
parameter, according to the specification.
Removed the legacy V2 fallback support and the tests affected by that
removal. Mocked existing steps to allow remaining V2 features to be
covered/tested.
- **Actor configuration validation incorrectly requires top-level provider field** (#4300):
Actor configuration in V3 is now obtained from the nested configuration
parameter, according to the specification.
Removed the legacy V2 fallback support and the tests affected by that
removal. Mocked existing steps to allow remaining V2 features to be
covered/tested.
- **TUI Prompt Symbol Mode Awareness** (#6431): The prompt widget now displays a
mode-dependent symbol (`` normal, `/` command, `$` shell, `` multi-line),
@@ -86,47 +135,47 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
available, and a `_FallbackPromptInput` otherwise. Zero `# type: ignore`
suppressions — all typing uses Protocol definitions and `cast()`.
- **Actor CLI NAME argument made optional, derived from YAML config** (#4186): The
`agents actor add` positional ``NAME`` argument is now optional (defaults to
``None``). When omitted, the actor name is derived from the ``name`` field in
the config file. Raises ``BadParameter`` if neither the argument nor the config
``name`` field is provided. Updated docstring signature to
``agents actor add [--config|-c <FILE>] [<NAME>]`` and added config-only usage
examples. Added Behave scenario for the ``BadParameter`` error path
(``actor add without NAME and without config name field raises BadParameter``)
in ``features/actor_add_name_positional.feature`` with corresponding step
`agents actor add` positional `NAME` argument is now optional (defaults to
`None`). When omitted, the actor name is derived from the `name` field in
the config file. Raises `BadParameter` if neither the argument nor the config
`name` field is provided. Updated docstring signature to
`agents actor add [--config|-c <FILE>] [<NAME>]` and added config-only usage
examples. Added Behave scenario for the `BadParameter` error path
(`actor add without NAME and without config name field raises BadParameter`)
in `features/actor_add_name_positional.feature` with corresponding step
definition. Updated step definitions in
``features/steps/actor_add_update_enforcement_steps.py`` and
``features/steps/actor_add_name_positional_steps.py`` to pass ``context.actor_name``
`features/steps/actor_add_update_enforcement_steps.py` and
`features/steps/actor_add_name_positional_steps.py` to pass `context.actor_name`
as a positional argument for compatibility.
- **Improved parallel test suite isolation** (#4186): Replaced deprecated
``tempfile.mktemp`` with ``tempfile.mkstemp`` in ``features/environment.py``
`tempfile.mktemp` with `tempfile.mkstemp` in `features/environment.py`
for atomic temp file creation, eliminating TOCTOU race conditions in the
per-scenario database path generation. Added ``fcntl.flock`` file locking to
``_ensure_template_db()`` to prevent race conditions when multiple
``behave-parallel`` workers attempt to create the template database
per-scenario database path generation. Added `fcntl.flock` file locking to
`_ensure_template_db()` to prevent race conditions when multiple
`behave-parallel` workers attempt to create the template database
simultaneously.
- **Removed stale @tdd_expected_fail tags from actor add enforcement tests**: The
``--update`` enforcement feature (#2609) was already implemented and merged but
residual ``@tdd_expected_fail`` tags remained on its BDD scenarios. These tags
were cleaned up in ``features/actor_add_update_enforcement.feature`` so the
`--update` enforcement feature (#2609) was already implemented and merged but
residual `@tdd_expected_fail` tags remained on its BDD scenarios. These tags
were cleaned up in `features/actor_add_update_enforcement.feature` so the
tests report correctly now that the underlying bug has been fixed.
- **Resolved Behave AmbiguousStep collisions in step definitions** (#4186): Renamed
step texts to avoid case-sensitive collisions between different step modules that
prevented all Behave tests from loading. Renamed steps in
``edge_case_plan_steps.py``, ``plan_executor_coverage_boost_steps.py``,
``plan_explain_steps.py``, ``plan_model_steps.py``, ``project_repository_steps.py``,
``service_retry_wiring_steps.py``, and ``session_model_steps.py``.
Additionally resolved a collision between ``acms_index_data_model_traversal_steps.py``
and ``security_audit_steps.py`` for ``Then the count should be``, and fixed
``pr_compliance_checklist_steps.py`` project-root resolution (``parents[3]`` →
``parents[2]``). Fixed table column-header mismatches in
``features/acms/index_data_model_and_traversal.feature`` and guarded
``cli_init_yes_flag_steps.py`` cleanup against ``None`` temp_dir. Annotated
``features/architecture.feature`` ``@tdd_expected_fail`` for pre-existing Pydantic
compliance debt in ``IndexEntry`` / ``ACMSIndex`` classes.
`edge_case_plan_steps.py`, `plan_executor_coverage_boost_steps.py`,
`plan_explain_steps.py`, `plan_model_steps.py`, `project_repository_steps.py`,
`service_retry_wiring_steps.py`, and `session_model_steps.py`.
Additionally resolved a collision between `acms_index_data_model_traversal_steps.py`
and `security_audit_steps.py` for `Then the count should be`, and fixed
`pr_compliance_checklist_steps.py` project-root resolution (`parents[3]` →
`parents[2]`). Fixed table column-header mismatches in
`features/acms/index_data_model_and_traversal.feature` and guarded
`cli_init_yes_flag_steps.py` cleanup against `None` temp_dir. Annotated
`features/architecture.feature` `@tdd_expected_fail` for pre-existing Pydantic
compliance debt in `IndexEntry` / `ACMSIndex` classes.
- **Cross-actor subgraph cycle detection reads actor_ref field** (#1431): Fixed
`_detect_subgraph_cycles()`, `_map_node()`, and the `compile_actor()` main loop
@@ -251,7 +300,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
flags as B608 (SQL injection risk). The constant is hardcoded and safe, but
the f-string pattern blocks tightening the bandit severity gate from HIGH to
MEDIUM (issue #9945). Replaced with `"INSERT INTO _v3_plans_new (" +
_ALL_DATA_COLUMNS + ") " "SELECT " + _ALL_DATA_COLUMNS + " FROM v3_plans"`.
_ALL_DATA_COLUMNS + ") " "SELECT " + _ALL_DATA_COLUMNS + " FROM v3_plans"`.
- **Diagnostics spec examples expanded to all 9 providers** (#5320): Updated the
`agents diagnostics` command examples in the specification to show all 9 supported
@@ -300,15 +349,15 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
:mod:`cleveragents.shared.redaction`, and transaction-based sandbox strategy using
BEGIN/COMMIT/ROLLBACK wrappers for safe, isolated database operations. SQLite-specific
checkpoint and rollback support with SAVEPOINT semantics. Support for multiple backends (PostgreSQL, SQLite, MySQL, DuckDB) via unified "DatabaseResourceHandler" and type-specific routing. BDD test
coverage in ``features/database_resources.feature`` (connection validation, CRUD workflows,
coverage in `features/database_resources.feature` (connection validation, CRUD workflows,
transaction/rollback behavior, error handling, credential masking verification) and
Robot Framework integration tests in ``robot/database_resources.robot``.
Robot Framework integration tests in `robot/database_resources.robot`.
- **TransactionSandbox infrastructure for database resource isolation** (#8608):
Implemented ``TransactionSandbox`` class with BEGIN/COMMIT/ROLLBACK lifecycle
management for transaction-based sandbox strategy. Wired into ``SandboxFactory``
as the strategy resolver for database resource types. Added ``database`` resource type
registration in bootstrap builtin types and updated ``_resource_registry_data.py``
Implemented `TransactionSandbox` class with BEGIN/COMMIT/ROLLBACK lifecycle
management for transaction-based sandbox strategy. Wired into `SandboxFactory`
as the strategy resolver for database resource types. Added `database` resource type
registration in bootstrap builtin types and updated `_resource_registry_data.py`
to recognize database resource categories.
### Fixed
@@ -343,9 +392,9 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
between the class docstring ("Callers are responsible for commit") and the implementation.
Input validation for the `trace` argument was also added. Two new BDD scenarios verify
the session contract: `Repository save() calls flush not commit` and `LLM trace rolled
back when UnitOfWork transaction rolls back`.
back when UnitOfWork transaction rolls back`.
- **git_tools._get_base_env() TOCTOU Race Condition** (#7619): Fixed a
- **git_tools.\_get_base_env() TOCTOU Race Condition** (#7619): Fixed a
Time-Of-Check-To-Time-Of-Use race condition in `git_tools._get_base_env()`
where two concurrent threads could both observe `_BASE_ENV is None`, both
snapshot `os.environ`, and write potentially different snapshots. The fix
@@ -360,26 +409,26 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- **Unified provider factory: eliminate divergence between `create_llm()` and `create_ai_provider()`** (#10949):
Introduced `_create_provider_instance()` as the single internal factory so that
both public methods delegate to one place. Creating a new provider now
both public methods delegate to one place. Creating a new provider now
requires changes in exactly one method.
- **Fixed API key regression**: the unified factory now explicitly passes
the validated API key to all LangChain constructors (OpenAI, Anthropic,
Google / Gemini, Azure, Groq, Together, Cohere, and OpenRouter). Users
who configure providers via `CLEVERAGENTS_`-prefixed variables are no
longer silently failed when LangChain falls back to raw environment
variable lookup. Pre-validated keys are forwarded through the
`api_key` kwarg to avoid a second settings lookup in the factory
closure. (Closes #10949)
- **Fixed mock provider accessibility in production**: `ProviderType.MOCK`
is now gated by the `CLEVERAGENTS_ALLOW_MOCK_PROVIDER=true` sentinel
environment variable. Without this flag, both `create_llm()` and
`create_ai_provider()` raise `ValueError` when MOCK is requested,
preventing accidental or malicious use of the fake LLM in production.
`resolve_provider_by_name("mock")` now also respects the guard and
`is_provider_configured(ProviderType.MOCK)` returns `True` as expected.
- **Fixed type annotation**: `create_llm()` now declares `**kwargs: Any`
instead of `**kwargs: object`, restoring correct Pyright inference for
forwarded keyword arguments.
- **Fixed API key regression**: the unified factory now explicitly passes
the validated API key to all LangChain constructors (OpenAI, Anthropic,
Google / Gemini, Azure, Groq, Together, Cohere, and OpenRouter). Users
who configure providers via `CLEVERAGENTS_`-prefixed variables are no
longer silently failed when LangChain falls back to raw environment
variable lookup. Pre-validated keys are forwarded through the
`api_key` kwarg to avoid a second settings lookup in the factory
closure. (Closes #10949)
- **Fixed mock provider accessibility in production**: `ProviderType.MOCK`
is now gated by the `CLEVERAGENTS_ALLOW_MOCK_PROVIDER=true` sentinel
environment variable. Without this flag, both `create_llm()` and
`create_ai_provider()` raise `ValueError` when MOCK is requested,
preventing accidental or malicious use of the fake LLM in production.
`resolve_provider_by_name("mock")` now also respects the guard and
`is_provider_configured(ProviderType.MOCK)` returns `True` as expected.
- **Fixed type annotation**: `create_llm()` now declares `**kwargs: Any`
instead of `**kwargs: object`, restoring correct Pyright inference for
forwarded keyword arguments.
- **`create_llm()` raises `Unsupported provider type: openrouter`** (#10948): Fixed
`ProviderRegistry._create_provider_llm()` missing an `OPENROUTER` branch, which
@@ -440,7 +489,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
`agents actor run` silently returning empty output for v3 `type:llm` actors.
`_build_from_v3()` and `_build()` now synthesise a default single-node
graph route when agents are created without explicit routes, ensuring
`run_single_shot()` can invoke the LLM via `GraphExecutor`. The nested
`run_single_shot()` can invoke the LLM via `GraphExecutor`. The nested
`actors:` map format also translates the v3 `actor: "provider/model"` key
into separate `provider` and `model` keys so the correct LLM provider is
instantiated.
@@ -456,7 +505,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
YAML values (e.g. `unsafe: "no"`) from being treated as unsafe.
- **UKO Runtime Layer 2 (Paradigm) Indexing** (#9351): Added missing `rdf:type
uko-oo:Class` triple emission in `PythonAnalyzer._extract_class()` so that
uko-oo:Class` triple emission in `PythonAnalyzer._extract_class()` so that
Python class definitions are now correctly classified at layer 2 (paradigm/OO)
in addition to layer 3 (technology). Added the corresponding Behave scenario
`Indexing a Python file populates layer 2 (paradigm)` to
@@ -465,10 +514,10 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- **Actor CLI v3 YAML Schema Support** (#6283): Fixed three components to add
full v3 `ActorConfigSchema` support to the actor CLI registration and
execution paths. `ActorConfiguration.from_blob()` now detects v3 format
execution paths. `ActorConfiguration.from_blob()` now detects v3 format
(top-level `type` key of `llm`/`graph`/`tool`) and correctly extracts
provider, model, and graph descriptors — including `type: tool` actors
without a `model` field. `ActorRegistry.add()` validates against the full
without a `model` field. `ActorRegistry.add()` validates against the full
Pydantic v2 schema, persists `skills`/`lsp`/`description` in the config
blob, and compiles graph actors with proper metadata.
`ReactiveConfigParser._build_from_v3()` now uses correct `source`/`target`
@@ -477,9 +526,9 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
`env_vars`/`response_format`/`lsp_capabilities`/`lsp_context_enrichment`
into agent configs, and validates `entry_node` against the nodes map.
Exception handling narrowed from broad `except Exception` to specific
`NotFoundError` and `ActorCompilationError`. v3 registration logic
`NotFoundError` and `ActorCompilationError`. v3 registration logic
extracted to `v3_registry.py` to keep `registry.py` under the 500-line
limit. 19 BDD scenarios cover all v3 paths including tool actors,
limit. 19 BDD scenarios cover all v3 paths including tool actors,
update mode, LSP dict bindings, and field propagation.
- **TDD Non-AssertionError Guard Visibility** (#8294): `apply_tdd_inversion` in
@@ -496,8 +545,8 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- **Parallel Behave Runner Log Noise Reduction** (#8351): The parallel behave
runner now suppresses captured stdout/stderr for passing worker chunks and
only replays diagnostics for failed, errored, or crashed chunks. This makes
failure output significantly easier to spot in CI and local runs. A worker
only replays diagnostics for failed, errored, or crashed chunks. This makes
failure output significantly easier to spot in CI and local runs. A worker
crash (unhandled exception) is detected via an all-zero summary and the
captured traceback is always surfaced.
@@ -568,14 +617,14 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- Wired `StrategyActor` into the real plan execution path: `_get_plan_executor`
in `plan.py` now resolves the strategy actor via `resolve_strategy_actor()`
(reading the `actor.default.strategy` config key) instead of always
constructing `LLMStrategizeActor`. `run_strategize` in `PlanExecutor` now
constructing `LLMStrategizeActor`. `run_strategize` in `PlanExecutor` now
passes `resources` (derived from `plan.project_links`) and `project_context`
to the actor so the LLM prompt receives full project context. Strategy
to the actor so the LLM prompt receives full project context. Strategy
decisions are serialised as JSON in `plan.error_details["strategy_decisions_json"]`
so `_build_decisions` can reconstruct the full hierarchy (dependency ordering,
parent/child structure) during Execute instead of rebuilding from
`definition_of_done`. `StrategizeStubActor.execute` accepts `**kwargs` for
forward-compatibility. Added BDD coverage for the stored-JSON path,
`definition_of_done`. `StrategizeStubActor.execute` accepts `**kwargs` for
forward-compatibility. Added BDD coverage for the stored-JSON path,
corrupt-JSON fallback, resource-passing, and stub extra-kwargs scenarios. (#828)
- **Decision Recording Hook in Strategize Phase** (#8522): Implemented
@@ -593,15 +642,15 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- **TDD Issue-Capture Test Activation** (#7025): Replaced 234 bare `@skip` tags
across 82 Behave feature files with the correct `@tdd_expected_fail @tdd_issue
@tdd_issue_<N>` tag system. Scenarios whose referenced bugs were already fixed
@tdd_issue_<N>` tag system. Scenarios whose referenced bugs were already fixed
had `@tdd_expected_fail` removed and now run as permanent regression guards.
Net result: 629 features active in CI (up from ~545), zero `@skip` tags remain.
- **Git Worktree Sandbox Apply** (#4454): The `plan apply` command now merges
LLM-generated changes via `git merge` from an isolated worktree branch
instead of flat `shutil.copy2`. Displays spec-aligned Apply Summary
instead of flat `shutil.copy2`. Displays spec-aligned Apply Summary
(plan ID, artifacts, insertions/deletions, project, timestamp), Sandbox
Cleanup panel, and `✓ OK Changes applied` footer. Non-git projects fall
Cleanup panel, and `✓ OK Changes applied` footer. Non-git projects fall
back to the original flat file copy.
- **Context Hydration Fix** (#4454): Fixed `ContextFragment` metadata types
@@ -679,7 +728,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- **Documentation Writer Tracking** (`docs-writer`): The documentation writer now
participates in the automation tracking system by creating individual `[AUTO-DOCS]
Documentation Report (Cycle N)` issues every 10 cycles (~3.3 hours). The manager applies
Documentation Report (Cycle N)` issues every 10 cycles (~3.3 hours). The manager applies
the mandatory `Automation Tracking` label automatically, while teams may add additional
workflow labels as needed. See `docs/development/automation-tracking.md` and the new
`docs/development/docs-writer.md` reference.
@@ -787,7 +836,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- **ContextTierService Thread Safety** (#7547): Added `threading.RLock` to
`ContextTierService` to prevent `RuntimeError: dictionary changed size during
iteration` and data corruption under concurrent plan execution. All public
iteration` and data corruption under concurrent plan execution. All public
methods (`store`, `get`, `promote`, `demote`, `evict_lru`, `enforce_staleness`,
`get_metrics`, `get_all_fragments`, `get_hot_fragments`, `get_for_actor`,
`get_scoped_view`, `get_scoped_by_resource`, `get_scoped_metrics`) now acquire
@@ -881,6 +930,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
Workers now dispatch and verify correctly, preventing incorrect session deletion.
---
### Fixed
- **CLI (`agents actor remove`)** (#6491): Restores output parity with the
@@ -897,10 +947,10 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- Wired Invariant Reconciliation Actor auto-invocation into
`PlanLifecycleService` phase transitions (`start_strategize`,
`execute_plan`, `apply_plan`). Reconciliation failures now block
`execute_plan`, `apply_plan`). Reconciliation failures now block
the transition with `ReconciliationBlockedError` and emit
`INVARIANT_VIOLATED` events. Post-correction reconciliation runs
via `CORRECTION_APPLIED` event subscription (best-effort). Added
`INVARIANT_VIOLATED` events. Post-correction reconciliation runs
via `CORRECTION_APPLIED` event subscription (best-effort). Added
`InvariantService` Singleton provider in the DI container.
- **TUI -- Shell danger detection**: The TUI shell mode (`!` prefix) now detects
dangerous command patterns before execution. A configurable pattern registry
@@ -912,4 +962,3 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
renders permission requests directly in the conversation stream for single-file
operations. Users can allow/reject with single-key shortcuts (`a`/`A`/`r`/`R`),
navigate with arrow keys, confirm with `Enter`, or press `v` to open the full