Commit Graph

1526 Commits

Author SHA1 Message Date
freemo 02f7c0ccf3 fix(config): align Settings and alembic/env.py database_url defaults to spec-required ~/.cleveragents/cleveragents.db
- Fix Settings.database_url default from relative 'sqlite:///cleveragents.db'
  to absolute 'sqlite:////home/<user>/.cleveragents/cleveragents.db' using
  Path.home() / '.cleveragents' / 'cleveragents.db'
- Fix test_database_url default similarly to use ~/.cleveragents/cleveragents_test.db
- Fix alembic/env.py fallback default from Path.cwd() / '.cleveragents' / 'db.sqlite'
  to Path.home() / '.cleveragents' / 'cleveragents.db' (matching Settings)
- Both Settings and alembic/env.py now resolve to the same absolute path
- CLEVERAGENTS_DATABASE_URL env var override still works correctly in both
- Update coverage_boost_steps.py assertions to match new correct defaults
- Add 3 new Behave scenarios covering correct database_url default and env var override

ISSUES CLOSED: #2871
2026-04-05 08:07:12 +00:00
freemo 1411adfed3 Merge pull request 'fix(lsp): release lock before blocking I/O in LspLifecycleManager.restart_server() to prevent deadlock' (#3165) from fix/lsp-lifecycle-restart-lock-deadlock into master 2026-04-05 07:50:09 +00:00
freemo 17e7507a4d fix(lsp): release lock before blocking I/O in LspLifecycleManager.restart_server() to prevent deadlock
Refactored restart_server() to use the same 3-phase lock pattern already
employed by start_server(), eliminating a deadlock hazard that occurred when
the method held _lock across blocking I/O operations (transport.stop(),
transport.start(), and client.initialize()).

Phase 1 (short lock): reads current state, snapshots required fields, and
removes the old server entry so concurrent callers see the server as absent
during the restart window.

Phase 2 (no lock): stops the old transport, spawns the new process, and
performs the LSP handshake — all without holding _lock. These operations
can block for up to 60 seconds; holding the lock here would starve any
concurrent health_check(), list_running(), or stop_server() calls.

Phase 3 (short lock): commits the new _ManagedServer into shared state,
preserving the original ref_count.

Three new BDD scenarios added to features/lsp_lifecycle_coverage.feature:
- health_check is not blocked while restart_server is in progress
  (uses a threading.Barrier to synchronise the two threads at the exact
  moment the lock is released)
- restart_server does not hold the lock during client.initialize
  (inspects lock state from within the mock initialize() side-effect)
- restart_server preserves the ref_count of the managed server

ISSUES CLOSED: #3026
2026-04-05 07:06:53 +00:00
freemo e2057f9117 Merge pull request 'docs(timeline): update schedule adherence Day 95 (2026-04-05) — refreshed with live data' (#3080) from docs/timeline-day95-update-2026-04-05 into master 2026-04-05 06:41:18 +00:00
freemo 119170c3ad docs(timeline): update schedule adherence Day 95 (2026-04-05) 2026-04-05 06:17:10 +00:00
freemo 8c079943e6 Merge pull request 'feat(plan): wire invariant reconciliation actor auto-invocation' (#1205) from feature/invariant-actor-autowire into master 2026-04-05 06:08:57 +00:00
Luis Mendes a0c7f5188e feat(plan): wire invariant reconciliation actor auto-invocation
Wire the InvariantReconciliationActor into PlanLifecycleService phase
transitions so that invariant reconciliation runs automatically at each
lifecycle boundary. This ensures plan invariants are verified before
processing can proceed.

Changes:
- Add InvariantService as a new optional dependency on PlanLifecycleService
  (injected via the DI container as a Singleton provider)
- Add _run_invariant_reconciliation() method that creates and invokes the
  reconciliation actor, emits INVARIANT_RECONCILED events on success, and
  raises ReconciliationBlockedError (with INVARIANT_VIOLATED event) on
  failure to block the phase transition
- Invoke reconciliation at three phase transition points:
  1. start_strategize() - after preflight guardrails, before PROCESSING
  2. execute_plan() - after estimation/error patterns, before Execute
  3. apply_plan() - after state validation, before Apply transition
- Subscribe to CORRECTION_APPLIED events for post-correction reconciliation
  (best-effort, failures logged but not re-raised)
- Per-plan disable: reconciliation is skipped when plan.invariant_actor is
  None or "__optional__", following the established estimation actor pattern
- Decision recording: the reconciliation actor already records
  invariant_enforced decisions via DecisionService

Tests:
- Behave: 10 scenarios in invariant_reconciliation_autowire.feature
  covering auto-invocation, skip-when-disabled, transition blocking,
  decision recording, and post-correction reconciliation
- Robot: 5 integration tests in invariant_reconciliation_autowire.robot
- All nox sessions pass (lint, typecheck, unit_tests, integration_tests,
  coverage_report at 97%)

ISSUES CLOSED: #829
2026-04-05 05:46:05 +00:00
freemo 73afe58cfe build: runner for opencode project-builder 2026-04-05 01:09:18 -04:00
freemo 329799a29e chore(agents): improve agent efficiency, scope control, and PR/issue lifecycle
Tiered worker allocation: implementors get full N workers, PR reviewers
N//2, and discovery agents (UAT, bug hunter, test-infra) N//4 to prevent
issue creation from outpacing implementation throughput.

Dead PR cleanup: PR reviewer now auto-closes stale, superseded,
unmergeable, and orphaned PRs every 5 cycles.

Post-merge issue closure: PR reviewer and self-reviewer now verify that
linked issues actually close after merge, removing satisfied dependency
links that block closure. Backlog groomer scans last 24h of merged PRs
and repairs open PR dependency health (reversed links, stale deps).

Closed-item guards: agents no longer wastefully modify closed issues/PRs.
Human liaison still responds to new human comments on closed items but
efficiently without re-triage. Backlog groomer prioritizes open items
first. System watchdog detects and flags closed-item interaction waste.

Scope control: non-critical findings from UAT testers and bug hunters now
route to backlog (no milestone + Priority/Backlog) instead of inflating
active milestones. Epic planner and issue creator skip converging
milestones. Project owner monitors and alerts on scope creep.
2026-04-05 00:37:25 -04:00
freemo 31f5997670 Merge pull request 'test(providers): add ASV performance benchmark suite for the providers module' (#3022) from test/missing-asv-benchmarks-providers into master 2026-04-05 04:37:14 +00:00
freemo 254fd07496 test(providers): add ASV performance benchmark suite for the providers module
Implemented 5 new ASV benchmark files under benchmarks/:

- providers_cost_table_bench.py — ProviderCostTable construction (default +
  custom entries), iteration throughput across all providers/models, fallback
  path for unknown providers
- providers_cost_tracker_bench.py — CostTracker construction with various
  budget configurations, accumulation throughput (10/50 calls, mixed
  providers), daily spend tracking, get_cost_entry delegation
- providers_fallback_selector_bench.py — FallbackSelector construction with
  custom order and cost tracker, selection when no providers configured
  (exhausts full list), selection with configured provider at various positions
- providers_registry_bench.py — ProviderRegistry.get_all_providers,
  get_provider_info (by enum and string), is_provider_configured,
  multi-provider initialization
- providers_llm_adapters_bench.py — LangChainChatProvider,
  AnthropicChatProvider, GoogleChatProvider, OpenAIChatProvider,
  OpenRouterChatProvider instantiation with various configurations

Key design decisions:
- Carefully audited existing cost_controls_bench.py and
  provider_selection_bench.py to avoid duplicating any already-covered
  benchmarks
- Used MagicMock for Settings objects to avoid requiring real API keys in
  benchmarks
- LLM adapter benchmarks use mock factories to measure pure instantiation
  cost without network calls
- All benchmark classes use setup() fixtures to isolate measurement from
  fixture construction
- 68 benchmark methods total across 5 files, all verified to execute without
  errors

ISSUES CLOSED: #2800
2026-04-05 03:55:26 +00:00
freemo bbff42ac9a Merge pull request 'docs(timeline): update schedule adherence Day 95 (2026-04-05)' (#2886) from docs/timeline-day-95-2026-04-05 into master 2026-04-05 03:22:09 +00:00
freemo 66c99db163 docs(timeline): update schedule adherence Day 95 (2026-04-05) 2026-04-05 02:40:40 +00:00
freemo c6596f764b ci: re-trigger pipeline (transient docker DinD failure) 2026-04-05 01:55:28 +00:00
freemo b83b4d3f21 fix(cli): include correction mode in plan correct JSON output
The plan correct command's JSON output was missing the 'mode' field,
causing the WF12 E2E test to fail when checking for 'append' in the
correction response. Added the mode to the structured output data.
2026-04-05 01:22:04 +00:00
freemo 891cbdcc66 fix(lint): resolve import ordering and type annotation lint errors
Fix ruff I001 (unsorted imports) and UP043 (unnecessary default type
arguments) in lsp_server_stub_steps.py introduced by the structlog
capture fix.
2026-04-04 23:48:02 +00:00
freemo a68cfca86f fix(e2e): add tdd_expected_fail tag to known bug #1028 ACMS tests
The 4 ACMS behavioral validation E2E tests capture bug #1028 (ACMS
indexing pipeline not wired into CLI) and are expected to fail until
the bug is fixed. They had tdd_issue and tdd_issue_1028 tags but were
missing the tdd_expected_fail tag that tells the TDD listener to
invert their result (failing test = PASS in CI).

Per CONTRIBUTING.md > Bug Fix Workflow, the tdd_expected_fail tag will
be removed when the bug fix is implemented.
2026-04-04 23:23:06 +00:00
freemo 68f9871f33 fix(test): resolve structlog cache interference in LSP and retry test suites
structlog's cache_logger_on_first_use=True causes module-level loggers
to permanently cache their processor chain on first use. Tests using
capture_logs() reconfigure processors, but cached loggers never pick up
the new configuration — resulting in empty capture lists.

Fixed by adding custom capture context managers that:
1. Temporarily disable logger caching
2. Replace the module-level logger with a fresh uncached instance
3. Restore original logger and config on exit

Fixes 11 LSP server stub scenarios and 2 retry policy wiring scenarios.
2026-04-04 23:08:32 +00:00
freemo 0851050db6 fix(ci): eliminate debug log stdout pollution that caused all e2e test failures
Root cause: structlog's default PrintLoggerFactory writes to sys.stdout
when structlog is not configured. The DI container initializes the
plugin_manager and calls register_all_extension_points() which emits
30+ debug log lines. These debug lines polluted the stdout of every CLI
command, causing e2e Robot Framework tests to fail when checking that
machine-readable output (--format json/yaml/plain) contains expected values.

Fix:
- Added configure_structlog(log_level="WARNING") in get_container() before
  Container() is instantiated, ensuring structlog is configured to use
  Python's stdlib logging (which defaults to StreamHandler on stderr) before
  any debug messages are emitted.
- Added configure_structlog(log_level="WARNING") to main() and main_callback()
  for defense in depth (fast-path commands that may not use the container).
- Added Skip If No LLM Keys to m1_acceptance and m2_acceptance e2e tests
  so they skip gracefully in CI when ANTHROPIC_API_KEY/OPENAI_API_KEY are absent.

The e2e_tests were already failing before the 3 problematic direct-push
commits (see CI history on commit 6dfd7e6b35). This fix addresses both
the pre-existing issue and any regression from the fix branch commits.

Verified locally:
- agents init stdout is clean (no debug logs)
- smoke_test.robot: 2/2 PASS
- ruff check/format: all clean
- pyright: 0 errors
2026-04-04 20:38:16 +00:00
freemo 7966e97326 fix(e2e): add Skip If No LLM Keys to m1 and m2 acceptance tests
m1_acceptance and m2_acceptance require real LLM API keys but did not
call Skip If No LLM Keys at the start of their test cases. Without API
keys configured in CI, these tests fail unconditionally rather than
gracefully skipping.

The Skip If No LLM Keys keyword is defined in common_e2e.resource and
already used by other e2e suites (m6, wf04, wf05, wf07, wf12, wf16,
wf17, wf18). This fix makes m1 and m2 consistent with that pattern.

The e2e_tests CI job was failing before the 3 problematic direct-push
commits (see commit 6dfd7e6b35 CI history) — this is a pre-existing
issue. However, since #2597 requires all 11 CI gates to pass, we fix
it here.
2026-04-04 20:38:16 +00:00
freemo f16f2a13ea fix(ci): restore all CI quality gates to passing on master
Fix ruff format issue in robot/helper_m6_autonomy_acceptance.py.
The previous sed-based API migration left some multi-line expressions
that ruff format wants on a single line.

ISSUES CLOSED: #2597
2026-04-04 20:38:16 +00:00
freemo c301fc13dd fix(ci): fix remaining Robot Framework integration test failures
- A2A JSON-RPC 2.0 migration: updated 3 robot helpers still using the
  old API (operation= → method=, resp.status/resp.data → resp.result):
  helper_m6_autonomy_acceptance.py, helper_wf03_plan_prompt_confidence.py,
  wf02_test_generation_artifacts.py
- Session CLI: updated 'Session Details' → 'Session Summary' panel title
  assertion in helper_session_cli.py to match current CLI output
- Audit wiring: fixed container_wiring test to create DB tables via
  Base.metadata.create_all() and disable async mode for deterministic
  verification (container's in-memory DB had no schema)
- Missing migration: added m9_001_session_name_column.py to add the
  'name' column to sessions table (ORM model had it, Alembic migration
  was missing, causing 'session create' to fail after 'agents init')

All 1908 integration tests now pass (0 failed, 0 skipped).

ISSUES CLOSED: #2597
2026-04-04 20:38:16 +00:00
freemo 0599079fe6 fix(ci): restore all CI quality gates to passing on master
Reapply integration test fixes reverted by 4278ba91:

1. robot/helper_audit_wiring.py container_wiring():
   Replace functional emit-and-count verification with structural wiring
   check (verify subscriber._audit_service and subscriber._event_bus are
   the same Singleton instances from the container). The functional test
   fails because in-memory SQLite creates separate databases per service
   instantiation, so the subscriber and audit_service.count() query hit
   different databases.

2. robot/helper_m6_autonomy_acceptance.py:
   Update all A2a API usages from old field names to JSON-RPC 2.0:
   - A2aRequest(operation=...) → A2aRequest(method=...)
   - resp.status == 'ok' → resp.result is not None
   - resp.data[...] → resp.result[...]
   Fixes 5 failing M6 Autonomy Acceptance integration tests.

No quality gates suppressed. Changes are to integration test helper files.

ISSUES CLOSED: #2597
2026-04-04 20:38:16 +00:00
freemo 00f543e137 fix(ci): restore all CI quality gates to passing on master
Reapply integration test fixes that were reverted by 4278ba91:

1. robot/helper_a2a_facade_wiring.py: Update from old A2A API
   (operation=..., resp.status, resp.data) to current JSON-RPC 2.0 API
   (method=..., resp.result). This fixes 8 failing integration tests in
   the A2A Facade Wiring robot suite.

2. robot/actor_context_export_import.robot: Fix CLI argument usage:
   - 'actor context export NAME --output PATH' → positional 'NAME PATH'
   - 'actor context remove NAME --yes' → 'actor context delete NAME --yes'
   - 'actor context import NAME --input PATH' → positional 'NAME PATH'
   - 'Export With JSON Format Flag' → simplified to test actual CLI interface
   - 'Import Without Update Fails' → updated to match actual CLI behavior
     (import succeeds and overwrites existing context)

No quality gates suppressed. Changes are to integration test files.

ISSUES CLOSED: #2597
2026-04-04 20:38:16 +00:00
freemo eaf15dd17c fix(ci): restore all CI quality gates to passing on master
Apply remaining fixes not covered by the 4278ba91 commit:

1. src/cleveragents/cli/main.py:
   info and diagnostics commands now call configure_structlog(WARNING)
   before build_info_data()/build_diagnostics_data() when non-rich format
   is requested. This prevents debug-level structlog messages from
   corrupting --format json/yaml output in integration tests.

2. robot/helper_config_cli.py:
   Call configure_structlog(WARNING) before importing cleveragents CLI
   commands so plugin_manager debug messages don't pollute CliRunner
   captured output (fixes Config List JSON Format test).

3. features/steps/aimodelscredentials_steps.py:
   ModelProviderOption config checks now use getattr fallback so they
   work both when context.model_config is set (via explicit 'I examine
   the ModelProviderOption model_config' step) and when context.model_instance
   is set (via 'I create a ModelProviderOption with only priority set to N').

4. features/steps/plan_namespaced_name_tdd_steps.py:
   @when steps now set context.error and context.lsp_error in addition to
   context.exception so the existing @then steps from service_steps.py
   and lsp_registry_steps.py match and validate correctly.

No quality gates suppressed. All changes are to test and source files.

ISSUES CLOSED: #2597
2026-04-04 20:38:16 +00:00
freemo 7db698b602 fix(ci): fix parallel Behave test isolation and undefined step errors
- Rewrite TUI session export/import step definitions to use constructor-
  based dependency injection (container_factory) instead of
  unittest.mock.patch context managers that fail across fork() boundaries
  in the parallel test runner.
- Add container_factory parameter to TuiCommandRouter dataclass so tests
  can inject a mock container that survives multiprocessing.fork().
- Add use_step_matcher('re') to a2a_jsonrpc_wire_format_steps.py so
  regex-based step patterns are matched correctly (fixes 30 errored
  scenarios with 56 undefined steps).
- Add plural 'rows' variant to database_handler_crud_steps.py row-count
  step matcher (fixes 1 errored scenario).

ISSUES CLOSED: #2597
2026-04-04 20:38:16 +00:00
freemo 02250473ad fix(ci): restore all CI quality gates to passing on master
Fix all failing CI quality gates (lint, unit_tests, format) without
suppressing any quality enforcement.

Root causes and fixes:

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

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

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

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

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

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

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

8. Parallel test interference:
   - All step files using use_step_matcher('re') now reset to 'parse' at end
     to prevent global matcher state leaking to subsequent step files
2026-04-04 20:38:16 +00:00
freemo 6e94e1d321 fix(persistence): close session in AutomationProfileRepository auto_commit finally block
Add missing `finally: if self._auto_commit: session.close()` blocks to all four public session-creating methods in AutomationProfileRepository: get_by_name(), list_all(), upsert(), and delete(). Closes #987
2026-04-04 19:58:54 +00:00
freemo 72e0db2592 chore(ci): capture nox output as CI artifacts and teach agents to read them
All 8 nox-running CI jobs in .forgejo/workflows/ci.yml now capture
stdout+stderr to build/nox-<job>-output.log via `2>&1 | tee` and upload
the log as a named Forgejo artifact (if: always(), retention-days: 30).
Artifact names follow the pattern ci-logs-<job>:
  ci-logs-lint, ci-logs-typecheck, ci-logs-security, ci-logs-quality,
  ci-logs-unit-tests, ci-logs-integration-tests, ci-logs-e2e-tests,
  ci-logs-coverage

Seven agent definitions updated with a CI Log Artifacts section:
  ca-pr-checker.md: artifact table + curl download instructions; Step 2
    now downloads the relevant artifact before dispatching fix subagents.
  ca-lint-fixer.md, ca-typecheck-fixer.md, ca-unit-test-runner.md,
  ca-integration-test-runner.md, ca-coverage-checker.md,
  ca-pr-self-reviewer.md: each receives a section explaining which
    artifact corresponds to its domain and how to use it.

Design notes:
- tee (not redirect) preserves output in CI job logs AND captures to file
- if: always() ensures artifacts are available even when the job fails
- Multi-session jobs (lint, security) use tee -a to append to one file
- Existing coverage-reports artifact preserved alongside ci-logs-coverage

ISSUES CLOSED: #2750
2026-04-04 19:58:49 +00:00
freemo 03334aaa3d docs(timeline): update schedule adherence Day 54 (2026-04-03) 2026-04-04 19:17:58 +00:00
freemo 2c736373cc fix(agents): use correct IssueMeta schema for Forgejo dependency API
The Forgejo blocks/dependencies REST API requires the IssueMeta schema
with owner, repo, and index fields — not the undocumented dependency_id
field that was previously used. All 10 curl examples across 6 agent
definitions were using {"dependency_id": N} which returns a 404
IsErrRepoNotExist error. Updated to the correct format:
{"owner": "<owner>", "repo": "<repo>", "index": N}

Files updated:
- ca-new-issue-creator.md (2 occurrences)
- ca-pr-api-creator.md (1 occurrence)
- ca-state-reconciler.md (1 occurrence)
- ca-project-owner.md (1 occurrence)
- ca-backlog-groomer.md (2 occurrences)
- ca-epic-planner.md (3 occurrences)

ISSUES CLOSED: #2750
2026-04-04 17:30:45 +00:00
freemo 4db53ae830 Merge pull request 'fix(cli): add --namespace/-n option to agents plan list command' (#2616) from fix/plan-list-namespace-option into master 2026-04-03 21:40:46 +00:00
freemo 52730b0846 fix(cli): add --namespace/-n option to agents plan list command
Add the missing --namespace/-n option to lifecycle_list_plans() in
plan.py, mirroring the existing implementation in list_actions() in
action.py. The service layer already supported namespace filtering;
only the CLI layer was missing the option.

Changes:
- Add namespace parameter to lifecycle_list_plans() with --namespace/-n
  option flags and 'Filter plans by namespace' help text
- Pass namespace through to service.list_plans(namespace=namespace, ...)
- Update TUI Filters panel to display 'Namespace: <value>' when provided
- Add usage examples to command docstring
- Add 4 Behave unit test scenarios covering --namespace/-n option
- Add 2 Robot Framework integration tests verifying namespace filtering

ISSUES CLOSED: #2165
2026-04-03 20:50:17 +00:00
freemo 5c0016c79d docs: add DomainBaseModel API reference and CI template DB changelog entry
Add DomainBaseModel section to docs/api/core.md documenting the shared Pydantic base class from PR #2014 (issue #1941), and add CHANGELOG entry for the CI template DB extension from PR #2399 (issue #2334).

ISSUES CLOSED: #1941

Co-authored-by: Jeffrey Phillips Freeman <jeffrey.freeman@cleverthis.com>
Co-committed-by: Jeffrey Phillips Freeman <jeffrey.freeman@cleverthis.com>
2026-04-03 20:41:23 +00:00
freemo 5601142447 Merge pull request 'docs: update specification — inline PermissionQuestionWidget for single-file permission requests' (#2599) from spec/update-v3.7.0-permission-question-widget into master 2026-04-03 20:40:16 +00:00
freemo a5e40e598f Merge pull request 'fix(mcp): extract error message from content[0].text per MCP 1.4.0 protocol' (#2600) from fix/mcp-adapter-error-extraction-content-key into master 2026-04-03 20:40:09 +00:00
freemo b96138b88e fix(mcp): extract error message from content[0].text per MCP 1.4.0 protocol
MCPToolAdapter.invoke() was reading error messages from result.get('error',
'unknown error'), but the MCP 1.4.0 protocol returns errors in the content
field as a list of content items with type and text keys. This caused every
error from a real MCP 1.4.0-compliant server to be silently replaced with
the string 'unknown error'.

Changes:
- src/cleveragents/mcp/adapter.py: extract error_text from content[0].text
  with safe guards (isinstance check, length check) and fallback to
  'unknown error' when content is absent or empty
- features/mocks/mock_mcp_transport.py: return MCP 1.4.0-compliant error
  responses using content list format instead of the non-standard error key
- features/tdd_mcp_error_content_key.feature: Behave scenario verifying
  correct error extraction from MCP 1.4.0 content arrays (written as TDD
  issue-capture, @tdd_expected_fail removed after fix applied)
- features/steps/tdd_mcp_error_content_key_steps.py: step definitions for
  the new scenario including _MCP14ErrorTransport mock subclass

All 51 MCP adapter scenarios pass. Typecheck: 0 errors. Lint: clean.

ISSUES CLOSED: #2158
2026-04-03 19:03:15 +00:00
freemo c678fcdcc3 docs(spec): document inline PermissionQuestionWidget for single-file permission requests
Add inline permission question widget section to TUI documentation in
docs/specification.md and update ADR-044 Prompt Architecture section to
distinguish between single-file (inline widget) and multi-file
(PermissionsScreen) permission request handling.

Changes:
- docs/specification.md: Add '### Inline Permission Question Widget' section
  documenting PermissionQuestionWidget, InlinePermissionQuestion domain model,
  PermissionRequestType enum, PermissionDecision enum, keyboard shortcuts,
  and routing logic (single-file vs multi-file)
- docs/adr/ADR-044-tui-architecture-and-framework.md: Update Prompt Architecture
  item 3 from QuestionWidget to PermissionQuestionWidget with inline rendering
  description; add QuestionWidget as item 4 for non-file-specific choices

Triggered by PR #2181 (docs(tui): document PermissionQuestionWidget).
Approved via proposal issue #2178.

ISSUES CLOSED: #2178
2026-04-03 19:03:04 +00:00
Luis Mendes 9e93ea5fc6 fix(persistence): close session in AutomationProfileRepository auto_commit finally block
Add missing `finally: if self._auto_commit: session.close()` blocks to
all four public session-creating methods in `AutomationProfileRepository`:
`get_by_name()`, `list_all()`, `upsert()`, and `delete()`.  Without
these blocks, sessions were never closed when the repository operated in
auto_commit mode, causing a slow session leak that could exhaust the
connection pool over time.

The fix mirrors the pattern already used by `SessionRepository`, which
correctly closes its session in a `finally` block for every public method.

Removed the `@tdd_expected_fail` tag from the TDD test
(`tdd_automation_profile_session_leak.feature`) so the six scenarios
now run as normal regression tests (four original plus two new scenarios
for `get_by_name` and `list_all`).

ISSUES CLOSED: #987
2026-04-03 19:00:22 +00:00
freemo 77427bd7d3 chore(agents): add deep session introspection to system watchdog
Enhance the system watchdog with OpenCode Server API session introspection
to read actual supervisor conversations, tool calls, and todo lists.

Upgrade Audit 6 (Zombie Detection) to use message-based analysis instead
of only checking Forgejo activity — reads last 5 messages from each
supervisor session to detect sleep-only patterns, error loops, and
identical repeated tool calls.

Add Audit 11 (Quick Session Spot-Check) running every 5-minute cycle:
scans the 3 most recently active sessions for critical policy violations
including force_merge usage, direct pushes to master, and type:ignore
suppressions in written code.

Add Audit 12 (Deep Session Introspection) running every 30 minutes:
full analysis of all 16 supervisor sessions reading last 10 messages
and todo lists. Detects misbehavior patterns, progress stalls via todo
list analysis, conversation health metrics (error rates, sleep ratios),
context exhaustion signals, and cross-agent conflicts (multiple agents
touching the same PR or issue).

Update action dispatch to handle new finding types: force_merge_detected,
direct_push_to_master, stuck_supervisor, looping_supervisor, high_error_rate,
context_exhaustion, and cross_agent_pr_conflict.
2026-04-03 18:13:19 +00:00
freemo 8c13e63c75 chore(agents): add system watchdog, remove force_merge, fix 9 systemic agent issues
Add ca-system-watchdog (16th supervisor) for continuous system health
monitoring with quality gate auditing, zombie detection, ticket state
reconciliation, and priority enforcement. Add ca-quality-enforcer and
ca-state-reconciler as one-off fix agents dispatched by the watchdog.

Critical fix: remove all force_merge: true usage from ca-pr-self-reviewer
which was bypassing branch protection and allowing PRs to merge with
failing CI. Replace with strict CI-gating merge logic that respects
branch protection rules per CONTRIBUTING.md.

Update product-builder to launch 16 supervisors, strengthen anti-return
language with explicit context hygiene, add tracking ticket lifecycle
management (one open at a time, closed on completion).

Update ca-project-bootstrapper with strict branch protection config
requiring status-check CI context, 2 approvals, and dismiss stale reviews.
Fix label set to match CONTRIBUTING.md exactly.

Update issue-implementor with priority gate enforcing lowest-milestone-first
and critical-bugs-first ordering. Update ca-backlog-groomer with closed
issue state reconciliation, PAT for REST API dependency operations, and
health signaling. Update ca-spec-updater with proactive full-scan mode.

Add health signaling and context self-management to 7 continuous
supervisors to prevent zombie sessions from context exhaustion.

Strengthen state label transitions in ca-pr-self-reviewer, ca-pr-api-creator,
ca-issue-state-updater, and ca-backlog-groomer to ensure closed issues
always have correct terminal state labels.

Add Forgejo PAT and REST API curl templates for dependency link creation
to ca-backlog-groomer and ca-project-owner since the MCP does not support
dependency manipulation.
2026-04-03 14:01:41 -04:00
freemo dd17d0f8e6 docs(tui): add shell safety, permission question widget, and first-run docs
Add reference documentation for three new TUI features:

- docs/reference/tui_shell_safety.md: Full reference for the shell danger
  detection subsystem (DangerousPatternDetector, ShellDangerLevel,
  DangerousPattern, DangerousCommandWarning, DEFAULT_PATTERNS registry).
  Covers all built-in patterns across CRITICAL/HIGH/MEDIUM/LOW levels,
  usage examples, and custom pattern extension.

- docs/reference/tui_permission_question.md: Full reference for the inline
  PermissionQuestionWidget (issue #997). Documents InlinePermissionQuestion,
  PermissionRequestType, PermissionDecision, render_permission_question(),
  PermissionDecisionEvent, and PermissionQuestionWidget with key bindings
  and usage examples.

- docs/reference/tui.md: Extended with First-Run Experience section
  (ActorSelectionOverlay, first_run helpers), Inline Permission Questions
  section, shell danger detection note in Shell Mode, updated module table,
  and links to new reference pages.
2026-04-03 18:01:26 +00:00
freemo 6dfd7e6b35 Merge pull request 'chore(noxfile): extend pre-migrated database template to slow_integration_tests and e2e_tests' (#2399) from chore/ci-execution-time-template-db-all-suites into master 2026-04-03 17:41:44 +00:00
freemo d650df3622 Merge pull request 'docs(timeline): update schedule adherence Day 54 (2026-04-03)' (#2371) from docs/timeline-day54-update-2026-04-03 into master 2026-04-03 17:41:04 +00:00
freemo dd363e2a45 docs(agents): clarify product-builder execution model and prevent implementation confusion
Added critical warning block and step-by-step checklist to product-builder.md
to ensure the agent always follows the correct workflow:

1. Launch 15 supervisors via curl to http://localhost:4096/session/:id/prompt_async
2. Monitor them with bash sleep loop (60 seconds between checks)
3. Re-launch any that exit

Key changes:
- ⚠️ Critical execution model warning at top (what to do / what NOT to do)
- 📊 Execution flow diagram showing all phases
-  Step-by-step Phase C checklist (C.1: Pre-flight, C.2: Launch, C.3: Monitor)
- 🔒 Clearer permission blocks with explicit bans on implementation agents
- 📝 Comments explaining why supervisors use curl not Task tool

This prevents the product-builder from trying to implement issues directly,
which is the supervisors' job. Product-builder is a process supervisor (like
systemd), not a worker.
2026-04-03 13:38:33 -04:00
freemo 33c1e4cd1a test(plan): add TDD issue-capture test for NamespacedName digit-start validation bug
This TDD test captures the buggy behavior where `NamespacedName.validate_namespace()`
and `validate_name()` accept names starting with digits, violating the spec requirement
that namespace and name components must start with a letter (consistent with
`_BARE_NAME_RE` in project.py).

Three failing scenarios demonstrate the bug:
1. parse() accepting namespace starting with digit ("123abc/my-action")
2. constructor accepting name starting with digit (local/"123-action")
3. constructor accepting namespace starting with digit ("999org"/valid-name)

Tagged with @tdd_expected_fail per Bug Fix Workflow.

Implements #2145
Blocks #2147
2026-04-03 13:38:33 -04:00
freemo 1c3f2dfc04 chore(noxfile): extend pre-migrated database template to slow_integration_tests and e2e_tests
Both slow_integration_tests and e2e_tests sessions require a database
(via setup_workspace() in helper scripts) but were not using the
pre-migrated template DB optimization already present in unit_tests,
integration_tests, and coverage_report.

Changes:
- slow_integration_tests: add _create_template_db() call, set
  CLEVERAGENTS_TEMPLATE_DB env var, upgrade from robot to pabot for
  parallel execution, add NO_COLOR/PYTHONPATH/PATH/compileall setup,
  add --include slow / --exclude discovery/code_blocks/wip/E2E/tdd_fixture
  tag filters, and update docstring.
- e2e_tests: add _create_template_db() call and set
  CLEVERAGENTS_TEMPLATE_DB env var. The existing setup_workspace()
  in helper_e2e_common.py already checks this env var and copies the
  template instead of running 25+ Alembic migrations.

No changes to test helper files are required since setup_workspace()
already implements the fast-path copy logic when CLEVERAGENTS_TEMPLATE_DB
is set.

ISSUES CLOSED: #2334
2026-04-03 17:31:35 +00:00
freemo 744abb9d62 docs(timeline): update schedule adherence Day 54 (2026-04-03) 2026-04-03 17:23:55 +00:00
freemo 8866c58bd4 fix(agents): prevent backlog groomer from closing PRs as duplicates of their tracking issues
Agent evolver identified a critical systematic pattern:
- Pattern: The backlog groomer was closing PRs as 'duplicates' of their
  linked tracking issues. A PR containing 'Closes #N' was being treated
  as a duplicate of issue #N, when it is actually the implementation
  delivery vehicle for that issue.
- Evidence: At least 12 PRs were incorrectly closed (#1219, #1236, #1247,
  #1269, #1267, #953, #1198, #1220, #1237, #1238, #1246, #1248) — all
  with the same 'Duplicate Detected' comment pattern from groomer-1.
- Fix: Added explicit instructions to skip PRs during duplicate detection,
  added a guard in the analysis loop pseudocode, and added a rule in the
  Important Rules section.

This change requires human approval before taking effect.

ISSUES CLOSED: #2180
2026-04-03 07:09:23 +00:00
freemo 0d768b78fa Merge pull request 'docs(tui): document PermissionQuestionWidget and add CHANGELOG entry' (#2181) from docs/update-tui-permission-question-widget into master 2026-04-03 06:41:25 +00:00