TyperGroup.parse_args is typed against typer._click.core.Context (the
vendored click), which is not assignable to click.Context or
typer.Context (typer.models.Context). Use Any for the ctx parameter to
satisfy the override constraint without depending on typer's private
_click module path.
ISSUES CLOSED: #6879
When a global short option like -f (for --format) appears after a subcommand
as a standalone token (e.g., 'agents info -f json'), it was not being promoted
because the code only handled fused forms like '-fjson'.
This fix adds a check for standalone short options in _GLOBAL_VALUE_SHORT_OPTIONS
that consume the following argument, allowing 'agents info -f json' to work
correctly in addition to 'agents info -fjson'.
Replace five # type: ignore comments with setattr() calls (for module
attribute monkey-patching) and an Any return type (for _get_memory_engines),
eliminating all type suppressions per project zero-tolerance policy.
Fix ruff format violations: collapse @when decorator to one line, reformat
raise...from split, and reformat assert message wrapping.
ISSUES CLOSED: #7566
Add MEMORY_ENGINES_LOCK to engine_cache.py and wrap the check-and-set
in UnitOfWork.engine with it to prevent concurrent threads from creating
duplicate in-memory SQLite engines. Also fix cache-hit bug where
self._engine was never assigned on a cache hit.
Closes#7566
`_evaluate_dod` called `self._commit_plan(plan)` which does not exist,
causing an AttributeError at runtime for any plan with DoD criteria and
a Pyright error during typecheck. The correct public method is
`self.commit_plan(plan)` (defined at line 792), which persists the
updated plan when a UnitOfWork is wired and is a no-op in in-memory
mode — matching the pattern used in `apply_plan` and `execute_plan`.
ISSUES CLOSED: #7927
The test scenario 'validation_summary is populated after DoD evaluation'
was expecting 'total' and 'required_passed' keys which are not added by
the DoD evaluation. These keys are only present when the plan goes through
the Execute phase validation gate. The DoD evaluation only adds
'dod_evaluated', 'dod_all_passed', and 'dod' keys.
Updated the test to check for the 'dod' key instead, which correctly
reflects the structure of the validation_summary after DoD evaluation.
ISSUES CLOSED: #7927
Update integration test helpers to use definition_of_done values that
satisfy the new TextMatchEvaluator gate (criterion text must appear as
a substring of a plan argument key or value). Also fix _evaluate_dod
to merge DoD metadata into plan.validation_summary without overwriting
Execute-phase validation counts, preserving the coverage/tool-validation
gate used by apply_with_validation_gate. Update CONTRIBUTORS.md.
Fixes: wf02, wf04, wf06, wf07 integration test suites.
ISSUES CLOSED: #7927
Before transitioning to the Apply phase, PlanLifecycleService.apply_plan
now evaluates the plan's definition_of_done criteria using DoDEvaluator
(TextMatchEvaluator). If any required criteria fail, a DoDGatingError is
raised and the plan remains in Execute/COMPLETE state. The evaluation
result is stored in plan.validation_summary with dod_evaluated=True and
dod_all_passed reflecting the outcome. Plans with no DoD text skip
evaluation and proceed normally.
Adds DoDGatingError exception class and _evaluate_dod() helper method.
Adds BDD feature file and step definitions for DoD gating scenarios.
ISSUES CLOSED: #7927
The typing.cast import was placed after third-party imports (behave),
violating ruff/isort PEP 8 ordering enforced by CI lint. Move it into
the stdlib block before the blank-line separator from third-party.
Fixes CI / lint failure on this branch. Closes#8588
Fixes a race condition (TOCTOU) in ActorLoader.list_actors() where the namespace
filter was applied outside the threading lock, creating a window for concurrent
dictionary modifications. Moving the filter inside the with self._lock: block
ensures atomic reads and filtering.
- Move namespace filtering inside the RLock in list_actors()
- Add concurrency BDD test (threading.Barrier) for list_actors + clear race condition
- Update CHANGELOG.md with fix entry (closes#8588)
- Update CONTRIBUTORS.md with contribution details
ISSUES CLOSED: #8588
- Add missing @tdd_issue companion tag to @tdd_issue_7623 scenario;
before_scenario hook raised ValueError causing hook_error on every run
- Apply ruff format to validation_pipeline.py and
validation_pipeline_concurrency_steps.py (2 files reformatted)
- Add use_step_matcher("parse") reset at end of concurrency steps
to match convention in validation_pipeline_steps.py
ISSUES CLOSED: #7623
Address all 4 remaining blocking issues from PR #7811 review:
- Delete duplicate _validation_pipeline_mock.py in features/steps/
(the inline MockValidationExecutor is kept where it belongs)
- Replace # type: ignore[return-value] with cast(dict[str, Any], ...)
to satisfy the zero-type-suppressions policy for test additions
- Add @tdd_issue_7623 regression tag on concurrency scenario
- Remove unreachable dead-code RuntimeError guard in
_install_thread_local_streams() (constructors never return None)
All CI lint checks now pass. Source files remain within line limits.
The relative import from ._validation_pipeline_mock causes behave-parallel's
module loader to create globals without '__name__', raising a KeyError during
load_step_modules(). Restoring the inline definition resolves the crash.
Closes#7811
Updated docs/specification.md to document the correct JSON/YAML output structure
for the project delete command, replacing the legacy deletion_summary object with
the deleted, success, and deleted_at fields that match the actual implementation
introduced in PR #6639. Added BDD feature file and step definitions to validate
the output format.
ISSUES CLOSED: #7872
Wrapped the `fileConfig()` call in `src/cleveragents/infrastructure/database/migrations/env.py`
with a `try/except` block that catches malformed INI logging configuration and emits
a clear, user-actionable error message to stderr before exiting with code 1.
Includes:
- Error handling guard around fileConfig() in env.py (fileConfig can raise
configparser.Error, KeyError, ValueError on malformed logging config)
- BDD/Behave feature file with 4 scenarios under `features/`
- Step definitions in `features/steps/` for isolated test coverage
- CHANGELOG.md entry under [Unreleased] Fixed section
- CONTRIBUTORS.md update for HAL 9000
ISSUES CLOSED: #7874
Signed-off-by: CleverThis <hal9000@cleverthis.com>
Implementation of the four-level automation profile precedence chain
(plan > action > project > global) as defined in the v3.5.0 specification.
Core implementation (src/):
- PrecedenceSource StrEnum with PLAN, ACTION, PROJECT, GLOBAL levels
- PrecedenceResolution frozen dataclass capturing full resolution state
- resolve_precedence_chain() with plan > action > project > global logic
- _resolve_global_profile() with explicit > env var > default fallback
- Comprehensive debug logging for observability
BDD tests (features/):
- automation_profile_precedence_chain.feature: 30 scenarios covering all
16 combinations of plan/action/project/global configurations plus edge
cases, logging verification, enum values, env var override, and custom registry
- step definitions with proper log handler cleanup via context._cleanup_handlers
CI compliance fixes (bd8b6748):
- ruff format applied to step definitions (fixes CI lint gate)
- CHANGELOG.md updated with accurate 4-level chain description
- test_reports/ artifacts removed; directory added to .gitignore
- tdd_a2a_sdk_dependency.feature reverted to use correct Client import
ISSUES CLOSED: #8234
Added missing CHANGELOG.md entry under [Unreleased] > Fixed section documenting
the AUTO-REV-POOL to AUTO-REV-SUP tracking prefix alignment for the
pr-review-pool-supervisor agent.
Added CONTRIBUTORS.md entry crediting HAL 9000 for the tracking prefix
documentation fix (#7891).
ISSUES CLOSED: #7891
- Updated pr-review-pool-supervisor.md tracking prefix from AUTO-REV-POOL to AUTO-REV-SUP
- Updated automation-tracking.md table and search query to use AUTO-REV-SUP
- Updated agent-system-specification.md all references from AUTO-REV-POOL to AUTO-REV-SUP
- Aligns documentation with actual production tracking prefix
ISSUES CLOSED: #7891
The step "I initialise the overlay with real slash command specs"
was calling set_commands("", ...) which triggers the hide-on-empty-query
early return, leaving _text empty and failing all four assertions in
the "Overlay uses real slash_command_specs from catalog" scenario.
Use query "se" instead: all session:* entries (9) plus settings (1)
start with "se", giving 10 matches within the 12-entry display cap,
so both " /session:create" / "Create a new session tab" and
" /settings" / "Open settings" appear in the rendered overlay.
ISSUES CLOSED: #6450
The test at line 35-39 was checking that descriptions are NOT shown in the
slash overlay, which was the old behavior before implementing ADR-046. Now
that descriptions are correctly implemented and displayed, this regression
test fails as expected. Remove it since the feature is complete.
Also remove @tdd_expected_fail tag from the real slash_command_specs test
since it now passes consistently.
ISSUES CLOSED: #6450
The step that loads test commands into the overlay was directly assigning
_commands and _visible without ensuring selected_index was initialized.
This caused navigate_down tests to fail because selected_index might not
be properly reset for each scenario.
Fixes: features/tdd_slash_overlay_keyboard_nav.feature:30,55
Replace getattr(tui_app_module, '_strip_pending_reference_token')
with direct attribute access. Ruff B009 flags this as unnecessary
because the attribute is a compile-time constant — normal access
is equally safe and preferred.
The previous attempt left three CI-breaking issues:
- features/steps/config_cli_safety_net_coverage_steps.py imported
_env_var_for_key/_normalize_key from config.py, but those helpers
moved to _config_helpers.py and were never re-exported. Import
from _config_helpers directly (matches where the symbols live).
- features/steps/config_get_spec_output_steps.py defined two when-
steps whose default-parse {key} placeholders made the longer step
ambiguous against the shorter one (behave raised AmbiguousStep on
load). Switch those two patterns to the re matcher with [^"]+ so
the quoted argument can't swallow ` with format "..."`.
- The same step file cached parsed JSON on context._spec_json with
no invalidation. Behave layers context attributes — a value set at
one scenario's layer remained visible to later scenarios, so the
assertion read stale JSON from an earlier scenario's get. Parse
fresh each call.
- src/cleveragents/cli/commands/config.py built a spec-correct JSON
envelope and then passed it through format_output, which wraps its
input in another envelope — the outer envelope's data field was
the inner envelope, so data.type / data.source / data.overridden
were absent. Emit the manually-built envelope directly via
json.dumps / yaml.safe_dump so the started timing field and all
spec data fields appear at the correct depth.
ISSUES CLOSED: #3423
- Import _env_var_for_key from _config_helpers (where it was moved
during refactor) instead of config module, fixing ImportError that
blocked all unit_tests from running
- Restore --verbose / -v as a deprecated no-op parameter on config_get
so existing tests and user scripts that pass --verbose continue to work;
resolution chain is always shown per spec regardless of the flag
- Fix CliRunner(mix_stderr=False) in config_get_spec_output_steps.py to
CliRunner() — mix_stderr is not accepted by this version of Typer
ISSUES CLOSED: #3423
Implements all spec-required output for `agents config get`:
Rich output:
- Rename panel title from 'Configuration Value' to 'Config' per spec
- Add 'Overridden' field to the Config panel
- Add 'Origin' panel showing File, Line, and Default fields
- Add 'Resolution Chain' panel (always shown, not just with --verbose)
- Add 'Winner' indicator to the Resolution Chain panel
- Use spec-required type strings (string/boolean/integer) instead of
Python type names (str/bool/int)
- Add '✓ OK Config read' confirmation message
JSON output:
- Wrap result in standard envelope (command, status, exit_code, data,
timing, messages)
- Add 'overridden' field to data
- Add 'origin' nested object (file, line, default)
- Add 'winner' nested object (source, level)
- Use human-readable source names (CLI flag, Env var, Config file,
Default) instead of internal enum values
- Add 'started' timestamp to timing
BDD:
- Add features/config_get_spec_output.feature with 20 scenarios
covering all Rich panels and JSON envelope fields
- Update existing tests to match new spec-compliant output
ISSUES CLOSED: #3423
integration_tests was throttled to `min(2, _default_processes())` (commit
92e258535, a flaky-stabilization measure). Evidence from a cached CI run shows
the suite does ~47min of work serialized through 2 pabot lanes on a 32-core
runner -> ~24min wall (exactly 2x == 2 lanes), the chronic ~21-30min seen
across recent runs. It is linearly parallelism-bound.
Raise the cap to `min(6, _default_processes())`: ~4x more lanes -> projected
~6-8min wall, while staying well short of per-core fan-out (the runner reports
32 cores; behave already uses all of them). The cap is kept (not removed)
because the suite makes live LLM calls — ~149 HTTP 429 rate-limit responses
were observed even at 2-way, and unbounded fan-out would spike 429/OOM flakes
(the exact failure 92e258535 was masking). 6 is a deliberate middle ground;
TEST_PROCESSES / --processes still override.
Updates the now-stale "<=2 processes" docstrings on integration_tests and
slow_integration_tests. Behave/unit_tests parallelism (_default_processes(),
uncapped) is unchanged.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>