diff --git a/CHANGELOG.md b/CHANGELOG.md index 63174cd08..173b46046 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,42 +2,44 @@ ## Unreleased -<<<<<<< HEAD - Implemented `--mount` flag on `resource add container-instance`. Supports resource-reference mounts (`--mount local/api-repo:/workspace`) and host-path mounts (`--mount /var/config:/config:ro`). Multiple `--mount` flags can be specified. Mount info is persisted as JSON in resource properties and displayed by `resource show`. (#1078) +- Added TDD bug-capture tests for #1078 — resource add container-instance + missing --mount flag. Three Behave scenarios prove the --mount flag is not + recognised. Uses @tdd_expected_fail until fix is merged. (#1099) - Added TDD bug-capture tests for bug #1076 — `use_action()` does not - propagate `automation_profile` to Plan. Three Behave BDD scenarios + propagate `automation_profile` to Plan. Three Behave BDD scenarios (`@tdd_bug @tdd_bug_1076 @tdd_expected_fail`) verify the full precedence chain (action, project-scoped config, global default) for automation - profile resolution at `plan use` time. Tests prove the bug exists: the + profile resolution at `plan use` time. Tests prove the bug exists: the Plan's `automation_profile` is always `None` regardless of the Action's - profile, project config, or global default. The `@tdd_expected_fail` tag - inverts this to a CI pass until the fix is merged. (#1098) + profile, project config, or global default. The `@tdd_expected_fail` tag + inverts this to a CI pass until the fix is merged. (#1098) - Added TDD bug-capture tests for bug #1022 — InvariantService in-memory - storage only. Four Behave BDD scenarios and three Robot Framework + storage only. Four Behave BDD scenarios and three Robot Framework integration tests verify invariant persistence across simulated CLI - process restarts. Tests use `@tdd_expected_fail` until bug #1022 is - fixed. (#1032) + process restarts. Tests use `@tdd_expected_fail` until bug #1022 is + fixed. (#1032) - Added TDD bug-capture test for bug #988 — ReactiveEventBus.emit() swallows - exception details. Behave BDD scenario (`@tdd_bug @tdd_bug_988 - @tdd_expected_fail`) captures the missing exception message and traceback in - the emit() exception handler. The test subscribes a handler that raises + exception details. Behave BDD scenario (`@tdd_bug @tdd_bug_988 +@tdd_expected_fail`) captures the missing exception message and traceback in + the emit() exception handler. The test subscribes a handler that raises ValueError with a distinctive message and asserts the message appears in the - structlog warning log — which currently fails, confirming the bug. The + structlog warning log — which currently fails, confirming the bug. The `@tdd_expected_fail` tag inverts this to a CI pass until the fix is merged. (#1093) - Added ResourceHandler sandbox and checkpoint lifecycle methods: `create_sandbox` (idempotent, delegates to SandboxManager), - `create_checkpoint`, `rollback_to`, and `project_access`. Frozen + `create_checkpoint`, `rollback_to`, and `project_access`. Frozen dataclass result types (SandboxResult, CheckpointResult, RollbackResult, - AccessResult) added to the handler protocol. GitCheckoutHandler uses + AccessResult) added to the handler protocol. GitCheckoutHandler uses `git tag` for checkpoint and `git checkout` for rollback. FsDirectoryHandler uses `shutil.copytree` snapshot and clear-and-restore. Default `project_access` delegates to PermissionService (local mode = - always permit). (#836) + always permit). (#836) - Added 5 missing LSP capabilities to `LspCapability` enum: `HOVER`, `DEFINITIONS`, `SIGNATURE_HELP`, `DOCUMENT_SYMBOLS`, `WORKSPACE_SYMBOLS`. Renamed `TYPE_INFO` -> `HOVER`, `SYMBOLS` -> `DOCUMENT_SYMBOLS`, @@ -47,21 +49,21 @@ Extended `initialize()` to advertise all 11 capabilities. Fixed `workspace_symbols` runtime handler to accept query-only input. (#834) - Added TDD bug-capture E2E tests for bug #1028 — ACMS indexing pipeline not - wired into CLI. Four Robot Framework E2E tests prove ContextTierService starts - empty on every CLI invocation. Tests use ``@tdd_expected_fail`` until the bug - fix is merged. (#1029) + wired into CLI. Four Robot Framework E2E tests prove ContextTierService starts + empty on every CLI invocation. Tests use `@tdd_expected_fail` until the bug + fix is merged. (#1029) - 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 - registration per ADR-003, and structured logging via ``structlog``. + 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 + registration per ADR-003, and structured logging via `structlog`. (#583) - Added LSP resource types: `executable`, `lsp-server`, `lsp-workspace`, `lsp-document` with parent/child hierarchy, auto-discovery rules, and @@ -75,53 +77,53 @@ 4-layer detection (extension, shebang, UKO, project config). Includes 27 Behave BDD scenarios and 6 Robot integration tests. (#826) - Added ResourceHandler CRUD and discovery methods: read, write, delete, - list_children, diff, and discover_children. Frozen dataclass result types + list_children, diff, and discover_children. Frozen dataclass result types (Content, WriteResult, DeleteResult, DiffResult) added to the handler - protocol. GitCheckoutHandler implements all six methods via git plumbing - and filesystem operations. FsDirectoryHandler implements all six via - pathlib/os/difflib. DevcontainerHandler implements read, write, and - discover_children via `devcontainer exec`. DatabaseResourceHandler - inherits NotImplementedError stubs pending connection management. (#827) + protocol. GitCheckoutHandler implements all six methods via git plumbing + and filesystem operations. FsDirectoryHandler implements all six via + pathlib/os/difflib. DevcontainerHandler implements read, write, and + discover_children via `devcontainer exec`. DatabaseResourceHandler + inherits NotImplementedError stubs pending connection management. (#827) - Implemented ACMS context tier runtime promotion/demotion/eviction: auto-promotion on access with configurable threshold (default: 5), time-based staleness enforcement (hot/warm TTL, default: 24h each), budget-based LRU eviction on hot-tier overflow, and tier transition event emission (TIER_PROMOTED, TIER_DEMOTED, TIER_EVICTED) via - EventBus. Added `context_tier_promotion_threshold`, + EventBus. Added `context_tier_promotion_threshold`, `context_tier_hot_ttl_hours`, and `context_tier_warm_ttl_hours` settings with DI wiring of event_bus into ContextTierService. Oversized fragments that exceed the entire hot-tier budget are now - redirected to the warm tier with a TIER_DEMOTED event. Promotion + redirected to the warm tier with a TIER_DEMOTED event. Promotion to hot falls back to warm when the promoted fragment is evicted by - budget enforcement. Event emission is best-effort; a failing event - bus no longer breaks tier operations. Added `CLEVERAGENTS_CTX_HOT_HOURS` + budget enforcement. Event emission is best-effort; a failing event + bus no longer breaks tier operations. Added `CLEVERAGENTS_CTX_HOT_HOURS` env var alias for `context_tier_hot_ttl_hours` for consistency with - the warm-tier alias. Demotion now resets `access_count` to zero so + the warm-tier alias. Demotion now resets `access_count` to zero so that demoted fragments must accumulate fresh accesses before re-promotion, preventing staleness enforcement from being immediately - undone by a single access. (#821) + undone by a single access. (#821) - Added byte-size budget enforcement for the ACMS context assembly - pipeline. `enforce_size_budget()` filters context fragments against + pipeline. `enforce_size_budget()` filters context fragments against `max_file_size` (per-fragment) and `max_total_size` (cumulative) - limits defined in a `ContextView`. New domain models + limits defined in a `ContextView`. New domain models `BudgetViolation` and `BudgetEnforcementResult` provide structured - violation reporting. Pipeline integration in `ACMSPipeline.assemble()` + violation reporting. Pipeline integration in `ACMSPipeline.assemble()` applies enforcement as a pre-filter when a `context_view` is - provided. (#847) + provided. (#847) - Aligned plan lifecycle model with specification: ERRORED is now terminal in `is_terminal`, per-phase state validation enforces APPLIED/CONSTRAINED to APPLY-only and COMPLETE to STRATEGIZE/EXECUTE-only via model validator, COMPLETE docstring - clarified as phase-level terminal. Added defensive coercion in + clarified as phase-level terminal. Added defensive coercion in database deserialization for legacy invalid phase/state - combinations with warning-level logging. Fixed assignment ordering + combinations with warning-level logging. Fixed assignment ordering in `execute_plan()` for consistency with phase-state validator. Updated `PlanResumeService` docstring to reflect ERRORED - terminality. (#918) + terminality. (#918) - Fixed `shell=True` subprocess usage in `cli_coverage_steps.py` by replacing with `shlex.split()` and `shell=False` for defense-in-depth command injection prevention, consistent with the existing pattern in - `cli_plan_context_commands_steps.py`. (#734) + `cli_plan_context_commands_steps.py`. (#734) - Added ACMS Backend Abstraction Layer (BAL) protocol definitions and in-memory stub implementations. Defines `TextBackend`, `VectorBackend`, and `GraphBackend` protocols with frozen result dataclasses (`TextResult`, @@ -132,13 +134,13 @@ `override_providers()`. Includes Behave BDD tests (35 scenarios), Robot Framework smoke tests, ASV benchmarks, and reference documentation. (#498) - Added TDD bug-capture tests for #1024 — SQLite DB URL resolves to CWD - instead of CLEVERAGENTS_HOME. Behave BDD scenarios + instead of CLEVERAGENTS_HOME. Behave BDD scenarios (`@tdd_bug @tdd_bug_1024 @tdd_expected_fail`) verify that the default `database_url` resolves inside `CLEVERAGENTS_HOME`, not the current - working directory. Includes Robot Framework integration tests with a - helper script exercising the same resolution path via subprocess. (#1034) + working directory. Includes Robot Framework integration tests with a + helper script exercising the same resolution path via subprocess. (#1034) - Added integration Robot Framework test for Specification Workflow Example 7: - CI/CD Integration — Automated PR Review and Fix. Exercises the `ci` + CI/CD Integration — Automated PR Review and Fix. Exercises the `ci` automation profile (headless, non-interactive) covering: ci-profile configuration (automation-profile, format, log level), idempotent resource and project registration with duplicate-detection assertions, @@ -150,19 +152,19 @@ path checks, and JSON output structure verification including `plan_id`, `phase`, `state`, `action`, `projects`, and `arguments` fields. - (`robot/wf07_cicd_integration.robot`, `robot/helper_wf07_cicd.py`) (#771) + (`robot/wf07_cicd_integration.robot`, `robot/helper_wf07_cicd.py`) (#771) - Added integration Robot Framework test for Specification Workflow Example 14: - Server Mode — Team Collaboration. Exercises server mode configuration, + Server Mode — Team Collaboration. Exercises server mode configuration, config-registry diagnostics, namespace management, action publishing with namespaced actor references and supervised profile metadata, shared action consumption via `use_action()` with required arguments and project links, and namespace + phase plan monitoring using mocked LLM providers and in-memory domain services (`CLEVERAGENTS_TESTING_USE_MOCK_AI=true`). (`robot/wf14_server_mode_integration.robot`, - `robot/helper_wf14_server_mode.py`) (#778) + `robot/helper_wf14_server_mode.py`) (#778) - Added volatile in-memory `audit_log` to `ReactiveEventBus` — every emitted `DomainEvent` is appended to a volatile in-memory log accessible via the - `audit_log` property (defensive copy). Emit ordering now follows the + `audit_log` property (defensive copy). Emit ordering now follows the specification: RxPY stream push, then audit append, then handler dispatch. Reactive and logging event buses now isolate stream/handler failures so one subscriber cannot block audit recording or downstream subscribers. The @@ -170,23 +172,23 @@ `on_next()` bypass), and `ReactiveEventBus` supports explicit in-memory retention controls via `max_audit_log_size` and `clear_audit_log()`. Includes expanded Behave and Robot integration coverage, 5 ASV benchmark suites, and - `vulture_whitelist.py` entry. (#587) + `vulture_whitelist.py` entry. (#587) - **Breaking (CLI):** `agents actor run` now takes positional `` and `` arguments, aligning the command signature with the specification. - The previous `--prompt/-p` option is removed. `--config/-c` is preserved as + The previous `--prompt/-p` option is removed. `--config/-c` is preserved as an optional fallback that overrides registry-based name resolution (spec - deviation documented in `_resolve_actor.py`). Shared resolution logic + deviation documented in `_resolve_actor.py`). Shared resolution logic extracted to `_resolve_actor.py` with `yaml.safe_dump`, early name validation, input sanitisation, resilient `atexit`-based temp file cleanup, and graceful error handling for missing actors, empty config data, and non-serialisable config blobs (without exposing serializer internals in - user-facing errors). Comprehensive BDD and Robot Framework - tests cover all resolution paths and edge cases. (#901) + user-facing errors). Comprehensive BDD and Robot Framework + tests cover all resolution paths and edge cases. (#901) - Fixed `list_actions()` to query the database when persistence is enabled - so that actions created by previous CLI invocations are visible. Falls + so that actions created by previous CLI invocations are visible. Falls back to the in-memory cache on database errors or when no Unit of Work - is wired. Added `ActionRepository.list_all()` for unfiltered action - listing. (#760) + is wired. Added `ActionRepository.list_all()` for unfiltered action + listing. (#760) - Added BuiltinAdapter class and MCP automatic resource slot creation. BuiltinAdapter wraps register_file_tools/register_git_tools/register_subplan_tool into a unified adapter interface. McpAdapter.infer_resource_slots() analyzes @@ -202,32 +204,32 @@ constants), centralized errors.py (cli_error, cli_not_found, cli_warning), and completion command for shell tab-completion generation. (#861) - Added tool-level execution environment preferences with NONE, REQUIRED, - PREFERRED, and SPECIFIC modes. ToolRunner routes tool execution based on - preference mode with caller-override precedence. (#879) + PREFERRED, and SPECIFIC modes. ToolRunner routes tool execution based on + preference mode with caller-override precedence. (#879) - Added Robot Framework integration test suite for Specification Workflow Example 4: Multi-Project Dependency Update. 8 test cases exercising supervised automation profile with 4 projects, child plan spawning, dependency-ordered execution, and coordinated apply. Uses mocked LLM providers via `CLEVERAGENTS_TESTING_USE_MOCK_AI`. (#768) - Added TDD bug-capture tests for #969 — `plan correct` expects `decision_id` - but M3 acceptance test passes `plan_id`. Behave BDD scenarios (revert and + but M3 acceptance test passes `plan_id`. Behave BDD scenarios (revert and append modes) and Robot Framework integration tests verify that `request_correction` is called with the root decision ID when a plan_id is - given as the first positional argument. Tests use `@tdd_expected_fail` until - the bug fix is merged. Shared mock fixtures extracted to - `features/mocks/tdd_plan_correct_plan_id_fixtures.py`. (#979) -- Added TDD bug-capture tests for bug #968: ``plan explain`` expects a - decision_id but the M3 acceptance test passes a plan_id. Two Behave BDD - scenarios (``@tdd_bug @tdd_bug_968 @tdd_expected_fail``) verify the fixed - behaviour — ``plan explain `` succeeds (rc=0) and displays - decision details. Includes Robot Framework integration tests with a + given as the first positional argument. Tests use `@tdd_expected_fail` until + the bug fix is merged. Shared mock fixtures extracted to + `features/mocks/tdd_plan_correct_plan_id_fixtures.py`. (#979) +- Added TDD bug-capture tests for bug #968: `plan explain` expects a + decision_id but the M3 acceptance test passes a plan_id. Two Behave BDD + scenarios (`@tdd_bug @tdd_bug_968 @tdd_expected_fail`) verify the fixed + behaviour — `plan explain ` succeeds (rc=0) and displays + decision details. Includes Robot Framework integration tests with a helper script exercising the same CLI path via subprocess, and step - definitions following established patterns. (#978) + definitions following established patterns. (#978) - Added TDD bug-capture tests for bug #967 — `plan execute` phase processing. Tests exercise the CLI orchestration layer via CliRunner (Behave) and replicated CLI logic (Robot) to verify that `plan execute` correctly handles plans in Strategize/QUEUED state by running `run_strategize()` - before transitioning. Includes four Behave scenarios and four Robot + before transitioning. Includes four Behave scenarios and four Robot integration test cases covering CLI execute from QUEUED, full lifecycle orchestration, positive control, and auto-discovery of QUEUED plans. (`features/tdd_plan_execute_phase_processing.feature`, @@ -235,18 +237,18 @@ - **Breaking (behavioral):** `resource_selection` decision type reclassified from Execute-only to phase-agnostic (valid in both Strategize and Execute). `DecisionType.RESOURCE_SELECTION` now appears in both `STRATEGIZE_TYPES` and - `EXECUTE_TYPES`. Code relying on `is_strategize_type` or `is_execute_type` + `EXECUTE_TYPES`. Code relying on `is_strategize_type` or `is_execute_type` returning `False` for `resource_selection` will see different results. Reclassification aligns with ADR-007 L72 and ADR-033 L74 which permit - resource selection during planning. (#931) + resource selection during planning. (#931) - Added ResourceHandler CRUD and discovery methods: read, write, delete, - list_children, diff, and discover_children. Frozen dataclass result types + list_children, diff, and discover_children. Frozen dataclass result types (Content, WriteResult, DeleteResult, DiffResult) added to the handler - protocol. GitCheckoutHandler implements all six methods via git plumbing - and filesystem operations. FsDirectoryHandler implements all six via - pathlib/os/difflib. DevcontainerHandler implements read, write, and - discover_children via `devcontainer exec`. DatabaseResourceHandler - inherits NotImplementedError stubs pending connection management. (#827) + protocol. GitCheckoutHandler implements all six methods via git plumbing + and filesystem operations. FsDirectoryHandler implements all six via + pathlib/os/difflib. DevcontainerHandler implements read, write, and + discover_children via `devcontainer exec`. DatabaseResourceHandler + inherits NotImplementedError stubs pending connection management. (#827) - Added E2E test for Workflow Example 5: Database Schema Migration with Safety Nets (review automation profile). Exercises custom resource type registration (`resource type add`), custom skill creation with spec-aligned database tools @@ -263,29 +265,29 @@ - Enhanced `CorrectionService` subtree isolation: `analyze_impact()` now populates `excluded_decisions` and `rollback_tier_depth`; added `compute_rollback_tier()`, `validate_subtree_isolation()`, and dry-run - report enhancements with tier-0 root-targeted warnings. Fixed status + report enhancements with tier-0 root-targeted warnings. Fixed status state-machine regression in `execute_revert()` where `analyze_impact()` overwrote status back to ANALYZING; `execute_revert()` now transitions through ANALYZING before EXECUTING for correct lifecycle ordering. Fixed `validate_subtree_isolation()` to check structural-only BFS for sibling invariant so influence-DAG-caused sibling reachability is not - misreported as a violation. Fixed false-positive cycle-detection warnings + misreported as a violation. Fixed false-positive cycle-detection warnings from convergent (diamond) topologies by using a global enqueued set in - BFS instead of per-node seen_this_round. Added `dry_run` enforcement + BFS instead of per-node seen_this_round. Added `dry_run` enforcement guard in `_assert_executable()` to prevent execution of dry-run-only - corrections per spec (§ plan correct --dry-run). Added terminal-state + corrections per spec (§ plan correct --dry-run). Added terminal-state guard in `analyze_impact()` to reject re-analysis after execution. Added mode validation in `execute_revert()`/`execute_append()` to - prevent mode-mismatched execution. Fixed `generate_dry_run_report()` - to preserve request status (dry-run is non-mutating). Fixed tier-0 + prevent mode-mismatched execution. Fixed `generate_dry_run_report()` + to preserve request status (dry-run is non-mutating). Fixed tier-0 warning to only trigger when target is genuinely in the structural - tree. Fixed `_collect_all_decisions()` to always include the target - decision in the universe. Improved cycle-detection log message - accuracy. Extracted cost/time estimation constants. Fixed + tree. Fixed `_collect_all_decisions()` to always include the target + decision in the universe. Improved cycle-detection log message + accuracy. Extracted cost/time estimation constants. Fixed `generate_dry_run_report()` to use try/finally for status restoration so that an exception during `analyze_impact()` does not leave the - request stuck in ANALYZING status. Promoted terminal-status set to - a module-level `_TERMINAL_STATUSES` frozenset constant. Review-cycle + request stuck in ANALYZING status. Promoted terminal-status set to + a module-level `_TERMINAL_STATUSES` frozenset constant. Review-cycle fixes: fixed `generate_dry_run_report()` to also restore `_impacts` dict (not only status) so dry-run is fully non-mutating; fixed tier-0 warning to compare against the actual root via `_find_root()` rather @@ -302,14 +304,14 @@ emission (`_emit_correction_applied`) now includes `attempt_id` and logs failures at error level; added `max_length=10000` to `CorrectionRequest.guidance` field; moved status transition after - attempt creation in both execution paths. Includes Behave BDD + attempt creation in both execution paths. Includes Behave BDD scenarios (influence DAG, append mode, negative isolation validation, dry-run enforcement, execute-revert end-to-end, status guard, mode mismatch, single-node tree, terminal state guard, exact-match affected count, convergent diamond DAG topology, dry-run exception recovery, execute-revert with influence edges, DAG-only nodes in excluded set), Robot Framework integration tests, and updated - dry-run report model fields. (#845) + dry-run report model fields. (#845) - Added deferred physical resource types for git object taxonomy (`git`, `git-remote`, `git-branch`, `git-tag`, `git-commit`, `git-tree`, `git-tree-entry`, `git-stash`, `git-submodule`) and filesystem link types @@ -320,21 +322,21 @@ - Added TDD bug-capture tests for #932 (plan apply missing --yes flag). (#950) - Modified `auto_progress()` to complete the Apply phase immediately after transitioning from Execute to Apply, since Apply is a metadata transition - with no LLM processing. This ensures `plan execute` drives the plan to + with no LLM processing. This ensures `plan execute` drives the plan to the terminal `applied` state when the automation profile permits (ci, full-auto profiles with `auto_apply < 1.0`). Extracted `_complete_apply_if_queued()` helper that consolidates the Apply-completion pattern (start_apply + complete_apply) into a single method with error recovery (calls `fail_apply` on failure) and async-job guard (skips inline completion when async execution is enabled to avoid - orphaning enqueued jobs). Used by `auto_progress()`, + orphaning enqueued jobs). Used by `auto_progress()`, `lifecycle_apply_plan()`, and `try_auto_run()`. Added `PlanLifecycleService.try_auto_run()` that drives plans through all lifecycle phases (Strategize → Execute → Apply) when automation-profile thresholds allow automatic progression; a threshold of 1.0 stops the plan at that phase boundary for human approval. Fixed `lifecycle-apply` CLI leaving plans stuck in `apply/queued` without - completing. The command now calls `_complete_apply_if_queued()` when the + completing. The command now calls `_complete_apply_if_queued()` when the plan is in Apply/queued, driving it to the terminal `applied` state. Fixed stale RICH output in `lifecycle_apply_plan` that printed "Plan is now in Apply phase (queued)" after the plan had already reached @@ -349,14 +351,14 @@ (`src/cleveragents/application/services/plan_lifecycle_service.py`, `src/cleveragents/cli/commands/plan.py`, `src/cleveragents/infrastructure/database/repositories.py`, - `docs/reference/plan_cli.md`) (#753) + `docs/reference/plan_cli.md`) (#753) - Fixed `plan execute` CLI failing with "Plan is not in an executable state (current: strategize/queued)" after strategize completed successfully. Root cause: `_get_plan_executor()` created a second `PlanLifecycleService` - Factory instance with its own in-memory `_plans` cache. After the executor's + Factory instance with its own in-memory `_plans` cache. After the executor's `run_strategize()` advanced the plan to `execute/queued` (via `auto_progress`), the CLI handler's separate service instance returned stale `strategize/queued` - state from its cache. Fix: `_get_plan_executor()` now accepts an optional + state from its cache. Fix: `_get_plan_executor()` now accepts an optional `lifecycle_service` parameter; the `plan execute` handler passes its own service instance so both share the same cache. (`src/cleveragents/cli/commands/plan.py`) @@ -371,45 +373,45 @@ - Added M5 (v3.4.0) E2E acceptance test suite `robot/e2e/m5_acceptance.robot` with 21 zero-mock test cases covering context assembly, context policy configuration, budget enforcement, context analysis, 10,000+ file scaling, - and plan execution with real LLM calls (`openai/gpt-4o-mini`). (#745) + and plan execution with real LLM calls (`openai/gpt-4o-mini`). (#745) - Fixed `project context set` writing policy changes via `session.flush()` instead of `session.commit()`, causing silently lost data on - `session.close()`. (#745) + `session.close()`. (#745) - Added `session_factory` DI provider to `Container` for CLI project-context - commands. The four `project context` subcommands (`set`, `show`, `inspect`, + commands. The four `project context` subcommands (`set`, `show`, `inspect`, `simulate`) previously called `container.session_factory()` which did not - exist, causing `AttributeError` at runtime. (#745) + exist, causing `AttributeError` at runtime. (#745) - Added Google/Gemini API key pattern (`AIzaSy...`) to secret redaction in - `redaction.py`. (#745) + `redaction.py`. (#745) - Added `--skill ` repeatable flag to `agents actor run` and - `actor-run` CLI commands. The flag resolves named skills from the + `actor-run` CLI commands. The flag resolves named skills from the Skill Registry at runtime and merges their tools into agents that already have configured tools, enabling ad-hoc skill injection - without modifying YAML configuration. Skill resolution uses the + without modifying YAML configuration. Skill resolution uses the DI-provided `SkillService` singleton; unknown or invalid skill names - produce a clear error and exit code 2. (#887) + produce a clear error and exit code 2. (#887) - Added `--execution-env-priority` flag to `agents plan use` command, accepting `fallback` (default) or `override` to control execution environment routing - precedence per ADR-043. Includes `ExecutionEnvPriority` StrEnum on the domain + precedence per ADR-043. Includes `ExecutionEnvPriority` StrEnum on the domain model, domain-level model validation (priority requires environment), `as_cli_dict()` support for both `execution_environment` and `execution_env_priority`, database persistence via new columns on `LifecyclePlanModel` with Alembic migration, and a `save_plan()` service - method to re-persist CLI overrides after plan creation. (#886) + method to re-persist CLI overrides after plan creation. (#886) - Added estimation actor support and role-aware actor validation for issue #650. - - **Schema/validation:** introduced `role_hint` and `response_format` fields, - plus role-aware compatibility warnings through shared validation helpers. - - **Preflight/CLI wiring:** aligned actor registration and preflight warning - paths to use the same warning logic and resolved estimation actor configs - before preflight compatibility checks. - - **Examples/docs/tests:** added `examples/actors/estimator.yaml`, updated - actor example docs, and expanded Behave/Robot coverage for estimator schema - and warning scenarios. - - **E2E helper behavior:** aligned M1/M2/M3/M6 integration helper handling so - missing OpenAI provider keys in local environments are controlled non-crash - outcomes while tracebacks/unexpected internal failures still fail. - - Runtime enforcement of `response_format` in provider invocation remains - planned and tracked via TODO comments in runtime code. (#650) + - **Schema/validation:** introduced `role_hint` and `response_format` fields, + plus role-aware compatibility warnings through shared validation helpers. + - **Preflight/CLI wiring:** aligned actor registration and preflight warning + paths to use the same warning logic and resolved estimation actor configs + before preflight compatibility checks. + - **Examples/docs/tests:** added `examples/actors/estimator.yaml`, updated + actor example docs, and expanded Behave/Robot coverage for estimator schema + and warning scenarios. + - **E2E helper behavior:** aligned M1/M2/M3/M6 integration helper handling so + missing OpenAI provider keys in local environments are controlled non-crash + outcomes while tracebacks/unexpected internal failures still fail. + - Runtime enforcement of `response_format` in provider invocation remains + planned and tracked via TODO comments in runtime code. (#650) - Added interactive TUI persona and input-mode support with a dedicated `agents tui` entry point and Textual app scaffolding. Personas are now managed as local YAML configs with per-session binding/state, and input @@ -423,53 +425,53 @@ Behave and Robot. Added regression-guard assertions, cache/singleton cleanup hardening, and targeted issue-648 review follow-ups. (#648) - Added four CLI-based integration test cases to M5 E2E verification suite - for v3.4.0 milestone acceptance criteria validation. Tests exercise + for v3.4.0 milestone acceptance criteria validation. Tests exercise `project create`, `resource add git-checkout`, `project link-resource`, and `project show` via real subprocess calls to `python -m cleveragents` with - per-test workspace isolation. (#496) + per-test workspace isolation. (#496) - Fixed `ProjectResourceLinkRepository.create_link()` and `remove_link()` only calling `session.flush()` without `session.commit()`, causing linked - resource data to be lost between sessions. Added `finally: session.close()` + resource data to be lost between sessions. Added `finally: session.close()` to both methods to match the session-factory lifecycle pattern used by all - other mutating repository methods. (#496) + other mutating repository methods. (#496) - Fixed `agents plan execute` always using local-only stub actors that returned - empty changesets instead of invoking real LLM providers. The CLI command only + empty changesets instead of invoking real LLM providers. The CLI command only performed phase transitions (Strategize → Execute) without ever running the - ``PlanExecutor`` to drive the strategize or execute actors. Added - ``_get_plan_executor()`` helper that resolves ``ProviderRegistry`` from the DI - container and constructs ``LLMStrategizeActor`` / ``LLMExecuteActor`` for real - LLM calls. Updated ``execute_plan`` CLI to detect plan phase/state and + `PlanExecutor` to drive the strategize or execute actors. Added + `_get_plan_executor()` helper that resolves `ProviderRegistry` from the DI + container and constructs `LLMStrategizeActor` / `LLMExecuteActor` for real + LLM calls. Updated `execute_plan` CLI to detect plan phase/state and automatically invoke the appropriate actor: strategize actor when the plan is - in ``Strategize/queued``, phase transition for ``Strategize/complete``, and - execute actor for ``Execute/queued``. Existing mock-based tests remain - backward-compatible via duck-typing fallback. New ``llm_actors.py`` module - provides ``LLMStrategizeActor`` (task decomposition) and ``LLMExecuteActor`` - (code generation) that resolve ``provider/model`` actor names to LangChain LLM - instances. ``PlanExecutor.__init__`` now accepts optional ``strategize_actor`` - and ``execute_actor`` parameters with stub defaults. (#960) -- Fixed `agents action create` missing the `--format`/`-f` flag. All other + in `Strategize/queued`, phase transition for `Strategize/complete`, and + execute actor for `Execute/queued`. Existing mock-based tests remain + backward-compatible via duck-typing fallback. New `llm_actors.py` module + provides `LLMStrategizeActor` (task decomposition) and `LLMExecuteActor` + (code generation) that resolve `provider/model` actor names to LangChain LLM + instances. `PlanExecutor.__init__` now accepts optional `strategize_actor` + and `execute_actor` parameters with stub defaults. (#960) +- Fixed `agents action create` missing the `--format`/`-f` flag. All other action subcommands (`list`, `show`, `archive`) already accepted `--format` and routed through `_print_action()`, but `create` was the only one omitted. Running `action create --config action.yaml --format plain` previously failed - with a Typer unrecognized-option error. Added the `fmt` parameter to the - `create()` function signature and wired it to `_print_action()`. (#959) + with a Typer unrecognized-option error. Added the `fmt` parameter to the + `create()` function signature and wired it to `_print_action()`. (#959) - Added E2E acceptance test for M2 (v3.1.0): Actor Compiler + Full LLM - Integration. Robot Framework test suite ``robot/e2e/m2_acceptance.robot`` + Integration. Robot Framework test suite `robot/e2e/m2_acceptance.robot` exercises actor YAML compilation into functional graphs, skill registry, tool lifecycle, and plan execution with a custom actor using real LLM API - keys. Test flow: create temp git repo → register custom actor → register + keys. Test flow: create temp git repo → register custom actor → register resource and project → create action → run full plan lifecycle (use → execute strategize → execute → diff → apply) → verify actor compilation - and plan integrity. Uses ``[Tags] E2E``, ``Skip If No LLM Keys``, and - flexible structural assertions with ``expected_rc=None`` for LLM-dependent - commands. (#742) + and plan integrity. Uses `[Tags] E2E`, `Skip If No LLM Keys`, and + flexible structural assertions with `expected_rc=None` for LLM-dependent + commands. (#742) - Fixed `plan execute` failing with `Error [500] INTERNAL` when run in a - separate CLI process from `plan use`. Root cause: `start_strategize()` + separate CLI process from `plan use`. Root cause: `start_strategize()` built its action registry from the in-memory `_actions` dict only, - missing DB-persisted actions created by prior CLI invocations. The + missing DB-persisted actions created by prior CLI invocations. The preflight guardrail then rejected the plan with a `PreflightRejection` that escaped the CLI error handler (extends bare `Exception`, not - `CleverAgentsError`). Fixes: (1) `start_strategize()` now loads the + `CleverAgentsError`). Fixes: (1) `start_strategize()` now loads the plan's action from the persistence layer before preflight checks, (2) `execute_plan` CLI catches `PreflightRejection` for user-friendly errors, (3) `plan execute` runs the execute phase inline so the plan @@ -477,19 +479,19 @@ invocation, (4) `lifecycle-apply` handles plans already auto-progressed to apply/queued by `complete_execute()`. (`src/cleveragents/application/services/plan_lifecycle_service.py`, - `src/cleveragents/cli/commands/plan.py`) (#746) + `src/cleveragents/cli/commands/plan.py`) (#746) - Added E2E Robot Framework acceptance test for M6 (v3.5.0) autonomy hardening - milestone. Exercises session CRUD lifecycle, automation-profile list/show/set, + milestone. Exercises session CRUD lifecycle, automation-profile list/show/set, project init with git-checkout resource, A2A plan lifecycle (use, lifecycle-list, status, execute, lifecycle-apply), guard enforcement via automation profiles, and a full autonomy acceptance flow — all via real CLI - invocations. LLM-dependent tests skip gracefully when API keys are absent. + invocations. LLM-dependent tests skip gracefully when API keys are absent. Hardened shared E2E keywords: safe JSON parsing with multi-object fallback, git return-code checks, special-character-safe API-key detection, `IF`/`ELSE` migration from deprecated `Run Keyword If`, per-test teardowns, and - `Force Tags`. Profile list now verifies all 8 built-in profiles. Session - delete confirms removal via re-list. Apply step verifies phase transition. - Execute step asserts plan_id in output. JSON-quoted assertions for short + `Force Tags`. Profile list now verifies all 8 built-in profiles. Session + delete confirms removal via re-list. Apply step verifies phase transition. + Execute step asserts plan_id in output. JSON-quoted assertions for short profile names (`"ci"`, `"auto"`) prevent false-positive substring matches. Added four new E2E tests covering remaining acceptance criteria: guard enforcement with custom profile (denylist, budget caps, tool-call limits), @@ -497,19 +499,19 @@ pub/sub via plan lifecycle state transitions, and hierarchical decomposition verification via `plan tree`. Post-review hardening (PR #803): LLM-dependent tests now Fail instead of - Skip when API keys are present but `plan use` returns non-zero. Event Queue + Skip when API keys are present but `plan use` returns non-zero. Event Queue test (AC-3) uses hard assertions for state transition verification. Hierarchical Decomposition test (AC-6) asserts at least one decision node - exists after execution. Guard Enforcement Assertions verify the resolved - profile name matches the expected value. Extracted `Setup Plan Test - Resources` keyword to eliminate repeated boilerplate and bring the file - under the 500-line limit. `Verify Plan In List` and `Full Flow Apply Step` - keywords use hard assertions instead of WARN fallbacks. Profile Precedence + exists after execution. Guard Enforcement Assertions verify the resolved + profile name matches the expected value. Extracted `Setup Plan Test +Resources` keyword to eliminate repeated boilerplate and bring the file + under the 500-line limit. `Verify Plan In List` and `Full Flow Apply Step` + keywords use hard assertions instead of WARN fallbacks. Profile Precedence test documents that action > global precedence requires production wiring not yet present in `PlanLifecycleService.use_action`. - (`robot/e2e/m6_acceptance.robot`, `robot/e2e/common_e2e.resource`) (#746) + (`robot/e2e/m6_acceptance.robot`, `robot/e2e/common_e2e.resource`) (#746) - Added E2E Robot Framework test for Specification Workflow Example 7: CI/CD - Integration — Automated PR Review and Fix. Exercises the `ci` automation + Integration — Automated PR Review and Fix. Exercises the `ci` automation profile (headless, non-interactive) with JSON output and log-level configuration, idempotent resource and project registration with `--branch` and `--description` flags, three-validation registration (source/mode/code) @@ -519,55 +521,55 @@ `plan execute` for lifecycle progression, `plan status` terminal-state assertion, plan diff JSON validation, and JSON output verification. Resource/project naming follows spec convention (`local/ci-workspace` project, - `local/ci-main` resource). Entity creation commands tolerate "already - exists" for CI re-runnability. `Extract JSON Field` keyword handles CLI + `local/ci-main` resource). Entity creation commands tolerate "already + exists" for CI re-runnability. `Extract JSON Field` keyword handles CLI debug log lines preceding JSON via `JSONDecoder.raw_decode(strict=False)`. Fail-fast `expected_rc` only where the spec mandates error suppression (`2>/dev/null || true`); first `resource add` and `project create` now - assert `expected_rc=${0}`. Config assertions use stdout-only matching and - exact equality for the `ci` profile value. Project idempotency verified - with occurrence count. Empty plan-diff stdout logged as warning. + assert `expected_rc=${0}`. Config assertions use stdout-only matching and + exact equality for the `ci` profile value. Project idempotency verified + with occurrence count. Empty plan-diff stdout logged as warning. Validation naming aligned with spec (`local/ci-lint` per §Example 7). All `Run Process` calls include `on_timeout=kill` per codebase CI - stability standard. Added `on_timeout=kill` to `Run CleverAgents - Command` and `Create Temp Git Repo` keywords in `common_e2e.resource` + stability standard. Added `on_timeout=kill` to `Run CleverAgents +Command` and `Create Temp Git Repo` keywords in `common_e2e.resource` for consistent timeout handling across all E2E suites. Dynamic actor selection based on available API keys (same pattern as `m6_acceptance.robot`) avoids runtime failure when only one provider - key is set. `Poll Plan Until Terminal` keyword now integrated into - the CI Plan Launch test case per spec Step 3 polling loop. Replaced + key is set. `Poll Plan Until Terminal` keyword now integrated into + the CI Plan Launch test case per spec Step 3 polling loop. Replaced local `Extract JSON Field` with shared `Safe Parse Json Field` from - `common_e2e.resource`. Added `Force Tags E2E` and per-test - `[Teardown]` blocks. Added `WF07 Suite Setup` keyword for database + `common_e2e.resource`. Added `Force Tags E2E` and per-test + `[Teardown]` blocks. Added `WF07 Suite Setup` keyword for database initialisation. Added `robot/common_vars.py` module placeholder for shared Robot Framework variables. (`robot/e2e/wf07_cicd.robot`, `robot/e2e/common_e2e.resource`, - `robot/common_vars.py`) (#753) + `robot/common_vars.py`) (#753) - Added E2E Robot Framework test for Specification Workflow Example 14: Server - Mode — Team Collaboration. Exercises server mode configuration (server URL, + Mode — Team Collaboration. Exercises server mode configuration (server URL, token, namespace), diagnostics, action publishing to team namespace with namespace-scoped listing, actor registration, plan list smoke test, and `supervised` automation profile verification with threshold field assertions - via real CLI with zero mocking. (`robot/e2e/wf14_server_mode.robot`) (#760) + via real CLI with zero mocking. (`robot/e2e/wf14_server_mode.robot`) (#760) - Fixed `agents session list`, `agents session create`, and other session subcommands raising `AttributeError: 'DynamicContainer' object has no - attribute 'db'` after `agents init`. Root cause: `_get_session_service()` - called `container.db()` but no `db` provider existed. Added a +attribute 'db'` after `agents init`. Root cause: `_get_session_service()` + called `container.db()` but no `db` provider existed. Added a `session_service` DI provider in `container.py` that builds the engine, - sessionmaker, and auto-committing repositories. Rewrote + sessionmaker, and auto-committing repositories. Rewrote `_get_session_service()` to resolve via the container with module-level - caching. Added `auto_commit` parameter to `SessionRepository` and + caching. Added `auto_commit` parameter to `SessionRepository` and `SessionMessageRepository` to prevent resource leaks in CLI context while - preserving Unit-of-Work semantics. Unified error handling across all 7 - session subcommands. Includes Behave BDD regression scenarios, Robot + preserving Unit-of-Work semantics. Unified error handling across all 7 + session subcommands. Includes Behave BDD regression scenarios, Robot Framework integration smoke tests, and structlog isolation for parallel - test execution. (#554, #570, #680) + test execution. (#554, #570, #680) - Added Robot Framework E2E acceptance test for M1 (v3.0.0) milestone. Tests the complete plan lifecycle (action create → resource add → project create → plan use → plan execute strategize → plan execute → plan diff → - plan apply) with real LLM API keys and no mocking. Gracefully skips when - API keys are absent. (#741) + plan apply) with real LLM API keys and no mocking. Gracefully skips when + API keys are absent. (#741) - Added dedicated E2E test infrastructure: new `nox -s e2e_tests` session running Robot Framework with `--include E2E` tag filter against `robot/e2e/` directory, dedicated CI job with real LLM API key secrets, graceful skip @@ -575,28 +577,28 @@ test session. Includes a minimal smoke test exercising `agents --version` and `agents --help`. (#740) - Implemented `tdd_expected_fail` tag handling in Robot Framework via a Listener v3 - module (`robot/tdd_expected_fail_listener.py`). Tests tagged `tdd_expected_fail` + module (`robot/tdd_expected_fail_listener.py`). Tests tagged `tdd_expected_fail` that fail have their result inverted to pass (expected failure); tests that - unexpectedly pass are reported as failed with guidance to remove the tag. Tag - validation enforces `tdd_bug` + `tdd_bug_` prerequisites. Includes + unexpectedly pass are reported as failed with guidance to remove the tag. Tag + validation enforces `tdd_bug` + `tdd_bug_` prerequisites. Includes idempotency guard against double-invocation, explicit SKIP status handling, - and a `close()` hook for clean teardown. Listener is registered in the nox - `integration_tests` and `slow_integration_tests` sessions. Fixture files are - excluded from the main pabot runner via `tdd_fixture` tag. Includes 9 Robot - Framework integration test cases. (#628) + and a `close()` hook for clean teardown. Listener is registered in the nox + `integration_tests` and `slow_integration_tests` sessions. Fixture files are + excluded from the main pabot runner via `tdd_fixture` tag. Includes 9 Robot + Framework integration test cases. (#628) - Added TDD-style failing Behave BDD tests for the session list DI container - missing `db` provider bug. Three scenarios exercise `session list`, + missing `db` provider bug. Three scenarios exercise `session list`, `_get_session_service()`, and `session list --format json` through the real - DI path. Includes Robot Framework smoke tests and ASV benchmarks. Tests - are intentionally failing (``@tdd_expected_fail``) until the bug fix for - #554 is applied. (#631) + DI path. Includes Robot Framework smoke tests and ASV benchmarks. Tests + are intentionally failing (`@tdd_expected_fail`) until the bug fix for + #554 is applied. (#631) - Added TDD-style failing Behave BDD tests for the session create DI container - missing `db` provider bug. Three scenarios exercise `session create`, + missing `db` provider bug. Three scenarios exercise `session create`, `session create --actor`, and `session create --format json` through the - real DI path. Includes Robot Framework smoke tests and ASV benchmarks. - Tests are intentionally failing (``@tdd_expected_fail``) until the bug fix - for #570 is applied. (#630) + real DI path. Includes Robot Framework smoke tests and ASV benchmarks. + Tests are intentionally failing (`@tdd_expected_fail`) until the bug fix + for #570 is applied. (#630) - Implemented UKO Layer 2 paradigm vocabulary specializations: Object-Oriented (`uko-oo:`), Functional (`uko-func:`), and Procedural (`uko-proc:`). Added OWL/Turtle class and property definitions for all three paradigms in @@ -619,15 +621,15 @@ insertions. Includes OWL/Turtle ontology files, ProvenanceInfo model with 2 required fields (source_resource, source_path) and 3 defaulted fields (source_range, valid_from, is_current), build_detail_level_map/resolve_detail_level - utilities, and full Behave BDD tests (78 scenarios, 200 steps). (#576) + utilities, and full Behave BDD tests (78 scenarios, 200 steps). (#576) - Added `RepoIndexingService` for repository file indexing with incremental refresh, extension-based language detection, SHA-256 content hashing, and - token estimation. Supports policy enforcement via include/exclude globs, + token estimation. Supports policy enforcement via include/exclude globs, max file size, and max total size limits from project `ContextConfig`. Persists index metadata and per-file records to SQLite via `RepoIndexModel` - and `IndexedFileModel`. Domain models (`IndexStatus`, `FileRecord`, + and `IndexedFileModel`. Domain models (`IndexStatus`, `FileRecord`, `IndexMetadata`, `RepoIndex`) are frozen Pydantic v2 with ULID IDs and UTC - datetimes. Wired into the DI container. Includes 28 Behave BDD scenarios, + datetimes. Wired into the DI container. Includes 28 Behave BDD scenarios, 3 Robot Framework integration tests, ASV benchmarks (5 time + 2 track), and reference documentation. (#195) - Wired retry policies and circuit breakers into the service layer. @@ -659,7 +661,7 @@ as failed with guidance to remove the tag. Tag validation enforces `@tdd_bug` + `@tdd_bug_` prerequisites. Implemented via `Scenario.run()` monkey-patch in `before_all`. Includes 34 Behave BDD scenarios (19 tag-validation, 14 infrastructure, and - 1 demo) and 12 Robot Framework integration test cases. (#627) + 1 demo) and 12 Robot Framework integration test cases. (#627) - Wired `AuditService.record()` into domain services via EventBus auto-dispatch. Created `AuditEventSubscriber` that subscribes to 9 security-relevant event types (`plan_applied`, `plan_cancelled`, `resource_modified`, `correction_applied`, @@ -681,8 +683,8 @@ 23 Behave BDD scenarios, 5 Robot Framework integration tests, and ASV benchmarks. (#581) - ### Added + - Resource type single-inheritance via `inherits` field (ADR-042) (#513) - Inheritance chain resolution, field merging, and polymorphic type matching - `ToolRegistry.find_tools_for_resource()` for polymorphic tool binding @@ -692,57 +694,57 @@ - Fixed `agents actor list` raising a validation error on fresh projects. `ActorRegistry._actor_name()` built names via `f"{provider}/{model}"`, which produced names with 2+ slashes when providers had models containing - `/` (e.g. OpenRouter's `anthropic/claude-sonnet-4-20250514`). Now sanitises + `/` (e.g. OpenRouter's `anthropic/claude-sonnet-4-20250514`). Now sanitises both provider and model names by replacing `/` with `-` and lowercasing to - satisfy the spec pattern. **Note:** provider/model names are now lowercased; + satisfy the spec pattern. **Note:** provider/model names are now lowercased; existing mixed-case built-in actors will be superseded by lowercased versions on the next `ensure_built_in_actors()` call. Includes Behave BDD regression scenarios, Robot Framework integration - smoke tests, and ASV benchmarks. (#592) + smoke tests, and ASV benchmarks. (#592) - Added TDD regression tests for `agents session list` DI container wiring - error (bug #554). `_get_session_service()` calls `container.db()` but the - `Container` class has no `db` provider, raising `AttributeError`. Includes + error (bug #554). `_get_session_service()` calls `container.db()` but the + `Container` class has no `db` provider, raising `AttributeError`. Includes 10 Behave BDD scenarios (`@tdd_bug @tdd_bug_554 @tdd_expected_fail`) covering empty list, empty-list format validation (JSON/YAML/plain), init-then-list lifecycle, post-create list, rich/JSON/plain/YAML output - formats, and stderr error-path assertions. Robot Framework integration - smoke tests and ASV service-layer benchmarks. Implements + formats, and stderr error-path assertions. Robot Framework integration + smoke tests and ASV service-layer benchmarks. Implements `@tdd_expected_fail` infrastructure (Behave `after_scenario` hook and Robot listener) and migrates 18 existing TDD scenarios from `@tdd @bugNNN` to - `@tdd_bug @tdd_bug_NNN` convention. (#554) + `@tdd_bug @tdd_bug_NNN` convention. (#554) - Added TDD regression tests for `agents session create` DI container wiring - error (bug #570). `_get_session_service()` calls `container.db()` but the - `Container` class has no `db` provider, raising `AttributeError`. Same root - cause as #554. Includes 4 Behave BDD scenarios + error (bug #570). `_get_session_service()` calls `container.db()` but the + `Container` class has no `db` provider, raising `AttributeError`. Same root + cause as #554. Includes 4 Behave BDD scenarios (`@tdd_bug @tdd_bug_570 @tdd_expected_fail`), Robot Framework integration - smoke tests, and ASV service-layer benchmarks. Tests exercise the real DI + smoke tests, and ASV service-layer benchmarks. Tests exercise the real DI path with `_service = None` and a file-based SQLite database. Also implements the `@tdd_expected_fail` inversion infrastructure: a Behave `after_scenario` hook in `features/environment.py` that flips pass/fail for `@tdd_expected_fail` scenarios, and a Robot Framework Listener API v3 plugin (`robot/tdd_expected_fail_listener.py`) with - identical semantics. Migrates 18 existing TDD scenarios from the old + identical semantics. Migrates 18 existing TDD scenarios from the old `@tdd @bugNNN` convention to standardised `@tdd_bug @tdd_bug_NNN` tags. (#570) - Fixed intermittent race condition in M4 validation integration tests when - running under pabot. Root cause was three-pronged: shared SQLite DB URL, + running under pabot. Root cause was three-pronged: shared SQLite DB URL, shared CLEVERAGENTS_HOME directory, and singleton leaks in chained CLI - helper invocations. Introduced composable `Setup Database Isolation` + helper invocations. Introduced composable `Setup Database Isolation` keyword in `common.resource`, per-suite temp directories, and centralised - `reset_global_state()` in `robot/helpers_common.py`. Added `timeout=30s` - to all `Run Process` calls in `m4_e2e_verification.robot`. (#563) + `reset_global_state()` in `robot/helpers_common.py`. Added `timeout=30s` + to all `Run Process` calls in `m4_e2e_verification.robot`. (#563) - Fixed `agents project show` not finding a project immediately after creation. Extended the `session.commit()` fix from #589 to also cover `update()` and `delete()` in `NamespacedProjectRepository`, and updated the class docstring to reflect that all mutating methods now commit within their own session. Includes 3 Behave BDD regression scenarios, Robot Framework integration - smoke tests, and ASV benchmarks. (#590) + smoke tests, and ASV benchmarks. (#590) - Fixed `agents project create` not persisting projects to the database. `NamespacedProjectRepository.create()` called `session.flush()` but never `session.commit()`, so projects were invisible to subsequent - `agents project list` calls. Added `session.commit()` and a `finally: - session.close()` guard. Includes 4 Behave BDD regression scenarios, - Robot Framework integration smoke tests, and ASV benchmarks. (#589) + `agents project list` calls. Added `session.commit()` and a `finally: +session.close()` guard. Includes 4 Behave BDD regression scenarios, + Robot Framework integration smoke tests, and ASV benchmarks. (#589) - Added TDD-style Behave BDD tests for the built-in `git-checkout` resource type bootstrap. Three scenarios: one failing TDD test reproducing bug #524 (no bootstrap called during init), and two regression tests verifying `bootstrap_builtin_types()` @@ -847,12 +849,12 @@ Added CLI-exercising integration tests for `plan use`, `plan execute`, and `plan tree` commands to verify the milestone success criteria through actual Typer CLI invocations. Split 1074-line helper into six focused modules (`_common`, `_domain`, `_merge`, `_cli`, - `_cli_errors`, dispatcher) under the 500-line limit. Added CLI error-path tests for + `_cli_errors`, dispatcher) under the 500-line limit. Added CLI error-path tests for read-only plan execute, unavailable action, missing changeset, and empty decision tree. Extracted `_make_subplan_status` factory, `_assert_exit_code` and `_assert_mock_called_once*` wrappers, frozen timestamp constant, and `shutil.which` - git pre-check. Removed tautological domain assertions in `plan_tree` and - `parallel_max`. Fixed CONTRIBUTORS.md alphabetical ordering. (#495) + git pre-check. Removed tautological domain assertions in `plan_tree` and + `parallel_max`. Fixed CONTRIBUTORS.md alphabetical ordering. (#495) - Added minimal LSP server stub with `agents lsp serve` CLI command supporting the `initialize`, `shutdown`, and `exit` lifecycle handshake over JSON-RPC stdin/stdout transport with Content-Length header framing. Unsupported methods return `MethodNotFound` @@ -865,9 +867,9 @@ `docs/reference/lsp_stub.md`. (#203) - Validated M3 acceptance criteria for v3.2.0 milestone closure. All 10 E2E verification tests pass against the final implementation, exercising real - CLI command paths (``plan use``, ``plan execute``, ``plan tree``, - ``plan explain``, project-scoped ``invariant add/list``, dry-run and live - ``plan correct``), database-backed persistence, context snapshots, and + CLI command paths (`plan use`, `plan execute`, `plan tree`, + `plan explain`, project-scoped `invariant add/list`, dry-run and live + `plan correct`), database-backed persistence, context snapshots, and invariant enforcement during strategize. Added acceptance criteria tags and milestone documentation to the robot suite. (#494) - Added scoped backend view filtering for project-resource isolation in ACMS. @@ -918,7 +920,7 @@ `StrategyRegistry` supports config-driven registration, per-strategy timeout/max-fragment limits, per-project enable/disable overrides, plugin discovery from `"module:ClassName"` strings, and validation - that strategies declare supported resource types. (#191) + that strategies declare supported resource types. (#191) - Fixed `context inspect` to display project-scoped tier fragment counts instead of global counts. Added `ContextTierService.get_scoped_metrics()` which returns fragment population counts filtered to the target project while keeping hit/miss counters as global service @@ -929,7 +931,7 @@ - Wired project context CLI stubs (`inspect`, `simulate`, `set`, `show`) to live ACMS pipeline services. `context inspect` queries `ContextTierService` for tier metrics and per-project fragments with optional filtering by strategy, focus area, breadth, and depth. `context - simulate` performs dry-run context assembly using CRP models with configurable token budget +simulate` performs dry-run context assembly using CRP models with configurable token budget and assembly strategies. `context set` gains 12 ACMS pipeline options (`hot_max_tokens`, `warm_max_decisions`, `cold_max_decisions`, `summary_max_tokens`, `temporal_scope`, `auto_refresh`, `focus_area`, `breadth`, `depth`, `assembly_strategy`, `retrieval_strategy`, @@ -1049,7 +1051,7 @@ tool. (#482) - Added checkpointing and rollback with `CheckpointService` for creating, listing, pruning, and deleting sandbox snapshots, and restoring sandbox state via `plan rollback - ` CLI command. Checkpoint domain models (`Checkpoint`, `CheckpointMetadata`, +` CLI command. Checkpoint domain models (`Checkpoint`, `CheckpointMetadata`, `CheckpointRetentionPolicy`, `RollbackResult`) store sandbox refs, decision alignment, checkpoint type (`pre_write`, `post_step`, `manual`), filesystem path, size, and structured audit metadata (reason, source tool, phase). Retention policy auto-prunes oldest interior @@ -1087,19 +1089,19 @@ schemas for refresh output. Updated CLI reference documentation with refresh examples and caching behavior. (#167) - Added UKO Layer 0-3 ontology scaffolding (RDF/TTL) aligned with specification - Section 14. Layer 0 (`uko:`) defines InformationUnit, Container, Atom, + Section 14. Layer 0 (`uko:`) defines InformationUnit, Container, Atom, Annotation, Boundary plus contains/references/dependsOn relationships, content properties (hasRendering, renderingDepth, hasFullContent), provenance properties (sourceResource, sourcePath, sourceRange), and temporal properties (validFrom, validUntil, isCurrent, isRevisionOf). Layer 1 (`uko-code:`) defines Module, Callable, TypeDefinition, TestCase, - Import plus hasReturnType/hasParameters/testsCallable. Layer 2 (`uko-oo:`) + Import plus hasReturnType/hasParameters/testsCallable. Layer 2 (`uko-oo:`) defines Class, Interface, Method, Attribute plus inheritsFrom/implements - with `rdfs:subPropertyOf`. Layer 3 is reserved for DetailLevelMap - insertions. Loader supports semantic domain prefixes, hyphenated prefix + with `rdfs:subPropertyOf`. Layer 3 is reserved for DetailLevelMap + insertions. Loader supports semantic domain prefixes, hyphenated prefix names, full-URI layer detection, multi-parent `rdfs:subClassOf` (DAG traversal via BFS), `rdfs:domain`/`rdfs:range`/`rdfs:subPropertyOf` - resolution, and non-existent parent validation. (#189) + resolution, and non-existent parent validation. (#189) - Added ACMS v1 context assembly pipeline with UKO and CRP integration, three fusion strategies (relevance, recency, tiered), budget-constrained assembly, and extensible strategy registration. (#188) @@ -1132,6 +1134,7 @@ `get_role_bindings()`. ### feat(actor): extend hierarchical actor YAML schema and loader + - Extended actor YAML schema with hierarchical graph support: per-node LSP bindings (`lsp_binding`), tool-source references (`tool_sources`), and subgraph `actor_ref`. - Added graph reachability validation — all nodes must be reachable from `entry_node` via edges or conditional routing targets. - Improved loader error reporting with YAML line/column positions and Pydantic field-path hints.