bug(uko): add missing layer 2 indexing scenario to uko_runtime.feature #9965
+79
-294
@@ -5,80 +5,17 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Added
|
||||
|
||||
- Added E2E test for Workflow Example 10: Full-Auto Batch Operations.
|
||||
Robot Framework test (`robot/e2e/wf10_batch.robot`) exercises batch
|
||||
formatting across a monorepo with 3 badly-formatted Python packages
|
||||
using the `full-auto` automation profile. Creates badly-formatted
|
||||
Python packages, plus a deliberately broken action (non-existent LLM
|
||||
actor) for error handling. Registers resources and projects with
|
||||
dynamic branch detection, launches plans in full-auto mode with dynamic
|
||||
actor selection (OpenAI/Anthropic), and verifies batch results via
|
||||
`plan list --state applied` and `--state errored` filters.
|
||||
Demonstrates batch error handling when one plan fails. Zero mocking —
|
||||
real CLI, real LLM API keys. Tagged `E2E`, skips gracefully when API
|
||||
keys are absent. (#756)
|
||||
|
||||
- **Plan diff shows worktree branch changes** (#9231): `plan diff` now detects
|
||||
the worktree branch `cleveragents/plan-<id>` created during `plan execute`
|
||||
and runs `git diff HEAD...<branch>` to display actual file changes. Falls
|
||||
back to changeset-based diff when no worktree branch exists. Git operations
|
||||
delegated to `GitWorktreeSandbox.diff_against_head()` in the Infrastructure
|
||||
layer.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Stale worktree branch cleanup on re-execute** (#7271): Re-executing a plan
|
||||
after a failed attempt or diff review crashed with `fatal: a branch named
|
||||
'cleveragents/plan-<id>' already exists`. Added `GitWorktreeSandbox.cleanup_stale()`
|
||||
classmethod that idempotently removes stale worktree directories and branches
|
||||
before creating a fresh sandbox.
|
||||
- **UKO Runtime Layer 2 (Paradigm) Indexing** (#9351): Added missing `rdf:type
|
||||
uko-oo:Class` triple emission in `PythonAnalyzer._extract_class()` so that
|
||||
Python class definitions are now correctly classified at layer 2 (paradigm/OO)
|
||||
in addition to layer 3 (technology). Added the corresponding Behave scenario
|
||||
`Indexing a Python file populates layer 2 (paradigm)` to
|
||||
`features/uko_runtime.feature`, completing four-layer guarantee verification
|
||||
for the UKO runtime.
|
||||
|
||||
- **Worktree sandbox cleanup on plan cancel** (#9230): `plan cancel` now removes
|
||||
the git worktree branch and directory created during execute, preventing resource
|
||||
leaks from dangling worktrees. Delegates to `GitWorktreeSandbox.cleanup_stale()`
|
||||
in the infrastructure layer.
|
||||
|
||||
- **`plan apply` merge conflict cleanup** (#7250): When `git merge` fails due to
|
||||
a conflict during `plan apply`, the apply command now reads the actual conflict
|
||||
detail from `CalledProcessError.stdout` (git writes conflict info to stdout, not
|
||||
stderr), runs `git merge --abort` to restore the repo to a clean state, transitions
|
||||
the plan to `constrained` state per spec §18334-18336 (may revert to Strategize
|
||||
for re-planning), and prints user-friendly guidance. Also handles
|
||||
`subprocess.TimeoutExpired` on both merge and abort calls. Previously, merge
|
||||
conflicts left conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`) in project files
|
||||
and the plan remained in `apply/queued` indefinitely.
|
||||
|
||||
- **Actor v3 YAML Schema Validation in CLI** (#5869): The `agents actor add --config`
|
||||
command now validates v3 YAML files using `ActorConfigSchema`, ensuring proper
|
||||
schema compliance including cycle detection for GRAPH actors, required field
|
||||
validation, and enum validation. v3 YAML is detected by the presence of ANY
|
||||
`type` field (any value — invalid type values are then rejected by schema
|
||||
validation) or a `version` field whose string value starts with `"3"` (e.g.
|
||||
`"3"`, `"3.0"`, `"3.0.0"`). Configs with `type: null` are not treated as v3.
|
||||
Invalid v3 actors are rejected with clear error messages before registration.
|
||||
|
||||
- **Alembic Files Missing from Wheel Distribution** (#4180): Alembic configuration
|
||||
(`alembic.ini`) and migration files are now part of the Python package structure
|
||||
at `src/cleveragents/infrastructure/database/migrations/`. Previously, when
|
||||
`agents init` was run in Docker containers or any wheel-based installation,
|
||||
`FileNotFoundError` was raised because alembic files were stored at the
|
||||
repository root and excluded from the wheel distribution. Now alembic files
|
||||
follow standard Python packaging conventions and are automatically included.
|
||||
`MigrationRunner._find_alembic_ini()` has been updated to search the new package
|
||||
location as the primary anchor point. This fix enables `agents init` to work
|
||||
correctly in all deployment modes: Docker containers, local pip installs
|
||||
(wheel or editable), and development environments.
|
||||
- **TDD Non-AssertionError Guard Visibility** (#8294): `apply_tdd_inversion` in
|
||||
- **bug-hunt-pool-supervisor Non-Blocking Tracking** (#8835): The automation-tracking-manager
|
||||
call in step 5 was blocking the main loop indefinitely, causing 3+ consecutive initialization
|
||||
failures. Step 5 now explicitly marks tracking as best-effort -- if the call does not complete
|
||||
within a reasonable time or fails, it is skipped and the supervisor continues to the next
|
||||
cycle. A new Rule 9 reinforces that tracking must never block the main loop; core
|
||||
functionality (module mapping, worker dispatch, monitoring) takes priority over status
|
||||
reporting.
|
||||
|
||||
`features/environment.py` now emits its non-assertion exception guard warning to
|
||||
both the structured logger and `stderr` via a new `_warning_with_stderr` helper.
|
||||
This makes the guard firing visible in standard Behave console output and CI log
|
||||
@@ -96,7 +33,6 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
failure output significantly easier to spot in CI and local runs. A worker
|
||||
crash (unhandled exception) is detected via an all-zero summary and the
|
||||
captured traceback is always surfaced.
|
||||
- **Directory Clustering Absolute Path Fix** (#9401): Fixed `DecompositionService._directory_key` to correctly handle absolute file paths by computing relative paths before extracting directory keys. Previously, the function used a fixed depth of 2 path components, causing all absolute paths to collapse into a single bucket (e.g., `/home` for every file on the system), making directory-based clustering completely ineffective. The fix adds an optional `root` parameter to `_directory_key()` and `ClusteringStrategy.cluster_by_directory()`, and updates `DecompositionService._build_hierarchy()` to compute the common root and pass it through, ensuring directory clustering groups paths by their actual directory hierarchy in production use.
|
||||
|
||||
- **Automation Profile Silent Fallback** (#8232): `_resolve_profile_for_plan` in
|
||||
`PlanLifecycleService` now raises a clear `ValidationError` when a plan's
|
||||
@@ -106,38 +42,21 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
message listing available built-in profiles. The resolved profile name is also
|
||||
logged at debug level for observability.
|
||||
|
||||
- **CheckpointManager rollback_to always returned False** (#7488): Fixed a data
|
||||
integrity bug in `CheckpointManager.create_checkpoint()` where `sandbox_path`
|
||||
was computed from `sandbox.context.sandbox_path` but never stored in the
|
||||
checkpoint metadata. As a result, `rollback_to()` always found
|
||||
`checkpoint.metadata.get("sandbox_path")` returning `None` and silently
|
||||
skipped the rollback, returning `False`. The fix adds `sandbox_path` to the
|
||||
metadata dict before constructing the `SandboxCheckpoint`, enabling
|
||||
`rollback_to()` to correctly restore the sandbox filesystem state.
|
||||
|
||||
- **Strategy Actor Code Review Follow-ups** (#10267): Implemented comprehensive
|
||||
fixes for all 9 code review findings from PR #1175 strategy actor implementation:
|
||||
- Module-level imports: Moved `json` import to module-level in
|
||||
`plan_executor_coverage_steps.py` following Python conventions and ruff/isort
|
||||
standards.
|
||||
- Exception handling clarity: Removed redundant `json.JSONDecodeError` from
|
||||
exception clause (Exception already subsumes it).
|
||||
- Silent fallback logging: Added warning log when `actor.default.strategy` config
|
||||
resolution fails, providing operator visibility into configuration issues.
|
||||
- Structured content block handling: Enhanced `_extract_content()` in
|
||||
`strategy_actor.py` to properly extract text from LangChain `MessageContentBlock`
|
||||
dicts, preventing JSON parsing failures when structured message content is
|
||||
encountered.
|
||||
- Deduplicated constant: Removed local `_DEFAULT_ACTOR_NAME` definition from
|
||||
`strategy_actor.py` and imported from canonical source in `strategy_resolution.py`
|
||||
to prevent future drift.
|
||||
- Test decoupling: Added `strategy_tree: StrategyTree | None` field to
|
||||
`StrategizeResult` to allow tests to inspect the tree without calling private
|
||||
`_execute_with_llm()` method, eliminating divergent ULID generation from
|
||||
double-invocation pattern. Updated 6 step functions in `strategy_actor_llm_steps.py`
|
||||
to use the public API instead of coupling to private implementation details.
|
||||
|
||||
### Added
|
||||
- Wired `StrategyActor` into the real plan execution path: `_get_plan_executor`
|
||||
in `plan.py` now resolves the strategy actor via `resolve_strategy_actor()`
|
||||
(reading the `actor.default.strategy` config key) instead of always
|
||||
constructing `LLMStrategizeActor`. `run_strategize` in `PlanExecutor` now
|
||||
passes `resources` (derived from `plan.project_links`) and `project_context`
|
||||
to the actor so the LLM prompt receives full project context. Strategy
|
||||
decisions are serialised as JSON in `plan.error_details["strategy_decisions_json"]`
|
||||
so `_build_decisions` can reconstruct the full hierarchy (dependency ordering,
|
||||
parent/child structure) during Execute instead of rebuilding from
|
||||
`definition_of_done`. `StrategizeStubActor.execute` accepts `**kwargs` for
|
||||
forward-compatibility. Added BDD coverage for the stored-JSON path,
|
||||
corrupt-JSON fallback, resource-passing, and stub extra-kwargs scenarios.
|
||||
(#828)
|
||||
|
||||
|
||||
- **TDD Issue-Capture Test Activation** (#7025): Replaced 234 bare `@skip` tags
|
||||
across 82 Behave feature files with the correct `@tdd_expected_fail @tdd_issue
|
||||
@@ -178,10 +97,10 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
`new-issue-creator`, and `issue-state-updater` now delegate all label operations to this
|
||||
subagent.
|
||||
|
||||
- **PR–Issue Label Synchronization**: PRs now inherit `Priority/`, `MoSCoW/`, `Points/`,
|
||||
- **PR-Issue Label Synchronization**: PRs now inherit `Priority/`, `MoSCoW/`, `Points/`,
|
||||
and `State/` labels from their associated issues at creation time
|
||||
(`pr-api-creator`). The `backlog-groomer` adds a continuous Pass 19 for ongoing
|
||||
PR–issue label synchronization. The `issue-state-updater` syncs PR state labels whenever
|
||||
PR-issue label synchronization. The `issue-state-updater` syncs PR state labels whenever
|
||||
issue states change.
|
||||
|
||||
- **Automation Tracking Announcements**: Extended `automation-tracking-manager` with
|
||||
@@ -195,14 +114,14 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
the `*-pool-supervisor` naming pattern. New agents added: `pr-editor` (safe PR editing
|
||||
with description preservation), `pr-manager` (unified PR interface), and
|
||||
`pr-merge-pool-supervisor` (automated PR merging supervisor). Renamed:
|
||||
`pr-api-creator` → `pr-creator`, `pr-checker` → `pr-ci-test-fixer`,
|
||||
`pr-status-checker` → `pr-status-analyzer`, `pr-self-reviewer` → `pr-reviewer`,
|
||||
`pr-fix-orchestrator` → `pr-fix-pool-supervisor`.
|
||||
`pr-api-creator` to `pr-creator`, `pr-checker` to `pr-ci-test-fixer`,
|
||||
`pr-status-checker` to `pr-status-analyzer`, `pr-self-reviewer` to `pr-reviewer`,
|
||||
`pr-fix-orchestrator` to `pr-fix-pool-supervisor`.
|
||||
|
||||
- **Automated PR Merging** (`pr-merge-pool-supervisor`): New supervisor continuously
|
||||
monitors for merge-ready PRs and merges them automatically when all criteria are met
|
||||
(approvals, CI passing, no conflicts). Supports both formal reviews and comment-based
|
||||
approvals (LGTM, ✅, "ready to merge", etc.).
|
||||
approvals (LGTM, ready to merge, etc.).
|
||||
|
||||
- **Implementation Worker Workflow Completion**: `implementation-worker` now implements
|
||||
work claiming protocols with conflict detection, comprehensive review feedback handling
|
||||
@@ -232,6 +151,13 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
`docs/development/automation-tracking.md` and the new
|
||||
`docs/development/docs-writer.md` reference.
|
||||
|
||||
- **ACMS / UKO API Documentation** (`docs/api/acms.md`): Added comprehensive API
|
||||
reference for the `cleveragents.acms` package covering the four-layer UKO ontology
|
||||
hierarchy, `VocabularyRegistry`, `ProvenanceInfo`, `UKOClass`, `UKOProperty`,
|
||||
`UKOVocabulary`, `Layer2Dependency`, `ParadigmVocabulary`, `DetailLevelMapBuilder`,
|
||||
and all Layer 3 language vocabulary types (Python, TypeScript, Rust, Java).
|
||||
The new page is linked from the API Reference index and the MkDocs navigation.
|
||||
|
||||
### Changed
|
||||
|
||||
- **Decision Tree Full ULID Display** (#5825): The `agents plan tree` command now
|
||||
@@ -247,7 +173,7 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
|
||||
- **PR Review Policy**: Reduced PR review requirement from 2 approvals to 1. Self-approval
|
||||
is now permitted including for automated bot PRs. Approval can be a formal review OR an
|
||||
approval comment (LGTM, Approved, ✅, "ready to merge").
|
||||
approval comment (LGTM, Approved, ready to merge).
|
||||
|
||||
- **Label Delegation Enforcement**: `automation-tracking-manager` now enforces delegation
|
||||
to `forgejo-label-manager` for all label operations, preventing "invalid label ID" errors
|
||||
@@ -265,22 +191,33 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
|
||||
### Fixed
|
||||
|
||||
- **Path Traversal Sandbox Escape via Prefix Collision** (#7558): Fixed
|
||||
`validate_path()` in `file_tools.py` using `str.startswith()` for sandbox
|
||||
containment, which allowed sibling directories with a matching name prefix
|
||||
(e.g. `/tmp/sandbox-escape/` bypassing `/tmp/sandbox/`) to escape the
|
||||
sandbox. Replaced with `Path.relative_to()` which performs a proper path
|
||||
prefix check using OS path separators. Added regression test tagged
|
||||
`@tdd_issue_7558`.
|
||||
- **Plan Concurrency Race Condition** (#7989): Fixed critical race condition in `execute_plan()` and
|
||||
`apply_plan()` where concurrent CLI/worker sessions could simultaneously modify the same plan,
|
||||
corrupting plan state. `LockService` is now wired into the plan lifecycle with plan-level advisory
|
||||
locking. Each invocation generates a unique caller identity (UUID) to prevent re-entrant lock
|
||||
acquisition by concurrent sessions on the same plan. Concurrent attempts now raise `LockConflictError`
|
||||
instead of silently racing. Lock is acquired before phase transition and released in a `finally`
|
||||
block to ensure cleanup even on error.
|
||||
|
||||
- **File Edit Encoding Parameter** (#7559): `_handle_file_edit()` now correctly
|
||||
respects the `encoding` parameter when reading and writing files. Previously the
|
||||
function ignored the caller-supplied encoding and fell back to the platform default,
|
||||
causing data corruption with non-UTF-8 files. The fix extracts `encoding` from the
|
||||
tool inputs (defaulting to `"utf-8"`) and passes it to both `path.read_text()` and
|
||||
`path.write_text()`. The `FILE_EDIT_SPEC` input schema was updated to declare the
|
||||
`encoding` field. BDD scenarios were added to cover explicit encoding and the
|
||||
UTF-8 default.
|
||||
- **`--format color` ANSI Output** (#7910): Fixed `format_output` routing the `color` format
|
||||
option to `_format_plain`, which produced plain uncoloured text instead of ANSI escape
|
||||
sequences. The `color` format is now routed to `format_output_session` which uses the
|
||||
`ColorMaterializer` to emit proper ANSI-coloured output. `--format plain` and all other
|
||||
formats remain unaffected.
|
||||
|
||||
- **ContextTierService Thread Safety** (#7547): Added `threading.RLock` to
|
||||
`ContextTierService` to prevent `RuntimeError: dictionary changed size during
|
||||
iteration` and data corruption under concurrent plan execution. All public
|
||||
methods (`store`, `get`, `promote`, `demote`, `evict_lru`, `enforce_staleness`,
|
||||
`get_metrics`, `get_all_fragments`, `get_hot_fragments`, `get_for_actor`,
|
||||
`get_scoped_view`, `get_scoped_by_resource`, `get_scoped_metrics`) now acquire
|
||||
the reentrant lock before accessing the hot/warm/cold tier dicts. The service
|
||||
was previously documented as single-threaded but registered as a DI Singleton,
|
||||
causing potential data corruption when parallel subplans shared the same
|
||||
instance. The `TierRuntimeMixin.enforce_staleness()` and
|
||||
`ScopedTierMixin.get_scoped_by_resource()` / `get_scoped_metrics()` methods
|
||||
are also protected. The DI container registration as `providers.Singleton`
|
||||
is now correct and safe.
|
||||
|
||||
- **Validation Gate Empty-Run Guard** (#7508): Fixed `ApplyValidationSummary.all_required_passed`
|
||||
returning `True` when zero validations were run, silently bypassing the apply gate. The property
|
||||
@@ -302,6 +239,16 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
`sandbox_root=.cleveragents/sandbox/`, so LLM file output (`FILE:` blocks)
|
||||
is written to disk during the execute phase. (#4222)
|
||||
|
||||
- **SubplanExecutionService fail_fast cancellation** (#7582): Fixed a race condition where
|
||||
already-running parallel subplans were not cancelled when `fail_fast` fired. Previously,
|
||||
`Future.cancel()` only prevented queued futures from starting but had no effect on
|
||||
in-flight futures that completed after `stop_flag` was set -- their `COMPLETE` results
|
||||
were incorrectly included in the merge output. The fix adds a post-completion guard that
|
||||
overrides any non-`ERRORED`/non-`CANCELLED` result to `CANCELLED` when `stop_flag` is
|
||||
active, and clears the associated output to prevent it from entering the merge. Also
|
||||
replaces the O(n) linear `status` lookup in the `as_completed()` loop with an O(1)
|
||||
`status_map` dict pre-computed before the executor block.
|
||||
|
||||
- **Robot Framework TDD Listener Guards** (#5436): Added three guard conditions to the
|
||||
`tdd_expected_fail_listener` `end_test()` function to prevent blindly inverting ALL test
|
||||
failures to passes, which was masking infrastructure errors and causing flaky CI behavior.
|
||||
@@ -310,6 +257,11 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
e2e test files and removed `tdd_expected_fail` from 4 context assembly e2e tests where
|
||||
bugs were already fixed.
|
||||
|
||||
- **PluginLoader entry point prefix validation** (#7476): Parse entry point targets before
|
||||
import, enforce the module allowlist ahead of loading, and add Behave plus Robot Framework
|
||||
regression coverage to ensure disallowed prefixes never execute untrusted module-level code
|
||||
in either unit or integration flows.
|
||||
|
||||
- **`issue-state-updater` Bash Script Errors**: Removed problematic bash script examples
|
||||
that tried to invoke `task forgejo-label-manager` as a bash command (the Task tool cannot
|
||||
be invoked from bash). Replaced with clear step-by-step operational instructions and
|
||||
@@ -329,18 +281,9 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
a `sqlite3.IntegrityError: UNIQUE constraint failed` crash when `agents plan use` was
|
||||
called on an action that already had arguments registered via `action create`. (#4197)
|
||||
|
||||
- Fixed CheckpointManager not wired into PlanExecutor — checkpoints were
|
||||
never created during plan execution because `_get_plan_executor()` in
|
||||
the CLI constructed PlanExecutor without a CheckpointManager (defaulted
|
||||
to None, silently skipping all checkpoint hooks). `_get_plan_executor()`
|
||||
now resolves the container singleton so CLI `plan execute` and `plan
|
||||
rollback` share the same registry, and `_try_create_checkpoint()` raises
|
||||
`PlanError` if checkpoint metadata cannot be persisted. Writable sandboxable
|
||||
resources and write-capable tools now default to `checkpointable=True`, and
|
||||
new Behave scenarios cover DI wiring, rollback, and capability defaults. (#1253)
|
||||
---
|
||||
|
||||
## [3.8.0] — 2026-04-05
|
||||
## [3.8.0] -- 2026-04-05
|
||||
|
||||
### Added
|
||||
|
||||
@@ -351,171 +294,13 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
`INVARIANT_VIOLATED` events. Post-correction reconciliation runs
|
||||
via `CORRECTION_APPLIED` event subscription (best-effort). Added
|
||||
`InvariantService` Singleton provider in the DI container.
|
||||
- **TUI — Shell danger detection**: The TUI shell mode (`!` prefix) now detects
|
||||
- **TUI -- Shell danger detection**: The TUI shell mode (`!` prefix) now detects
|
||||
dangerous command patterns before execution. A configurable pattern registry
|
||||
classifies commands by danger level (warning, critical) and surfaces a user
|
||||
warning overlay before proceeding. Patterns cover destructive filesystem
|
||||
operations, privilege escalation, network exfiltration, and more. (#1003)
|
||||
|
||||
- **TUI — Permission Question Widget**: A new inline `PermissionQuestionWidget`
|
||||
- **TUI -- Permission Question Widget**: A new inline `PermissionQuestionWidget`
|
||||
renders permission requests directly in the conversation stream for single-file
|
||||
operations. Users can allow/reject with single-key shortcuts (`a`/`A`/`r`/`R`),
|
||||
navigate with arrow keys, confirm with `Enter`, or press `v` to open the full
|
||||
permissions screen. (#1004)
|
||||
|
||||
- **TUI — Actor thought blocks**: Expandable reasoning trace widgets rendered
|
||||
inline in the conversation stream with muted styling. Collapsed by default;
|
||||
expand with `Space` or click. (#1005)
|
||||
|
||||
- **UKO provenance tracking**: Every typed triple now carries `sourceResource`,
|
||||
`validFrom`, and `isCurrent` metadata. A revision chain enables temporal
|
||||
queries and point-in-time ontology state reconstruction.
|
||||
|
||||
- **JSON-RPC 2.0 A2A wire format**: `A2aRequest`/`A2aResponse` fields renamed to
|
||||
standard JSON-RPC 2.0 names (`method`, `id`, `result`, `error`). The
|
||||
`A2aVersionNegotiator` handles backward compatibility.
|
||||
|
||||
- **Database resource handler**: Full CRUD and checkpoint/rollback support for
|
||||
SQLite, PostgreSQL, MySQL, and DuckDB resources via the resource DAG.
|
||||
|
||||
- **Estimation lifecycle hook**: `actor.default.estimation` config key wires an
|
||||
estimation actor into the Strategize-to-Estimate lifecycle hook.
|
||||
|
||||
- **Persona system**: YAML-backed personas bind actors, argument presets, and scope
|
||||
references to named identities; persisted in `~/.config/cleveragents/personas/`.
|
||||
|
||||
- **Session management**: Create, list, export, and import conversation sessions;
|
||||
full JSON export/import for portability; Markdown transcript export
|
||||
(`--format md`) for human-readable sharing.
|
||||
|
||||
- **First-run experience**: `ActorSelectionOverlay` guides new users to pick an
|
||||
actor on first TUI launch; creates a `"default"` persona automatically.
|
||||
|
||||
- **Server mode**: `agents server connect` configures a remote CleverAgents server;
|
||||
Kubernetes Helm chart in `k8s/` for production deployment.
|
||||
|
||||
- **A2A integration**: Agent-to-Agent protocol facade wires CLI and TUI to live
|
||||
application services (session, plan, registry, event).
|
||||
|
||||
- **Permissions screen**: TUI overlay for reviewing tool permission requests with
|
||||
unified, side-by-side, and context diff views; session-scoped allow/reject decisions.
|
||||
|
||||
- **Inline permission questions**: `PermissionQuestionWidget` renders single-file
|
||||
permission requests directly in the conversation stream with single-key shortcuts.
|
||||
|
||||
- **Invariant reconciliation**: `InvariantReconciliationActor` runs automatically at
|
||||
every plan phase transition; failures block the transition and emit `INVARIANT_VIOLATED`.
|
||||
|
||||
- **UKO runtime**: Universal Knowledge Ontology query interface, inference engine, and
|
||||
graph persistence for ACMS context strategies.
|
||||
|
||||
### Fixed
|
||||
|
||||
- `LangChainChatProvider.name` and `model_id` are now mutable properties with setters,
|
||||
fixing an `AttributeError` when `PlanService` attempted to resolve provider names after
|
||||
instantiation. (#1553)
|
||||
|
||||
---
|
||||
|
||||
## [3.7.0] — 2026-03-15
|
||||
|
||||
### Added
|
||||
|
||||
- **Interactive TUI** (`agents tui`) — full-screen Textual app with multi-session tabs,
|
||||
persona switching, slash commands (67 commands across 14 groups), reference picker
|
||||
(`@`), shell mode (`!`), context-sensitive F1 help, and `Ctrl+T` argument preset cycling.
|
||||
- **Slash command system** — 67 commands across 14 groups accessible via `/` overlay.
|
||||
- **Reference picker** — `@` key opens a file/resource reference picker that inserts
|
||||
references into the input field.
|
||||
- **TUI persona system** — YAML-backed personas bind actors, argument presets, and scope
|
||||
references; persisted in `~/.config/cleveragents/personas/`.
|
||||
- **TUI session export/import** — full JSON round-trip and Markdown transcript export
|
||||
(`--format md`).
|
||||
|
||||
---
|
||||
|
||||
## [3.6.0] — 2026-02-28
|
||||
|
||||
### Added
|
||||
|
||||
- Advanced Context Management System (ACMS) with three-tier context strategy.
|
||||
- UKO Runtime (Universal Knowledge Ontology) with graph persistence and inference engine.
|
||||
- Implicit inference engine producing `uko:implicitSiblingOf`, `uko:implicitContains`,
|
||||
and `uko:implicitDependsOn` triples with confidence 0.7.
|
||||
|
||||
---
|
||||
|
||||
## [3.5.0] — 2026-02-14
|
||||
|
||||
### Added
|
||||
|
||||
- Autonomy hardening: advisory locking, validation pipeline, definition-of-done gating.
|
||||
- Resource DAG with dependency tracking and type hierarchy with multiple inheritance.
|
||||
- Container resource types (`container.docker`, `container.podman`).
|
||||
- LSP resource types (`lsp.*`).
|
||||
|
||||
---
|
||||
|
||||
## [3.4.0] — 2026-01-31
|
||||
|
||||
### Added
|
||||
|
||||
- ACMS v1 with context scaling strategies.
|
||||
- Resource type inheritance system (ADR-042).
|
||||
- Safety profile extraction (ADR-041).
|
||||
|
||||
---
|
||||
|
||||
## [3.3.0] — 2026-01-17
|
||||
|
||||
### Added
|
||||
|
||||
- Corrections and subplans support in plan lifecycle.
|
||||
- Checkpoint and rollback for all resource writes.
|
||||
- Decision tree versioning and history (ADR-034).
|
||||
- Decision tree rollback and replay (ADR-035).
|
||||
|
||||
---
|
||||
|
||||
## [3.2.0] — 2026-01-03
|
||||
|
||||
### Added
|
||||
|
||||
- Decisions, validations, and invariants in plan lifecycle.
|
||||
- Validation abstraction layer (ADR-013).
|
||||
- Invariant system (ADR-016).
|
||||
- Automation profiles (ADR-017).
|
||||
- Semantic error prevention (ADR-018).
|
||||
|
||||
---
|
||||
|
||||
## [3.1.0] — 2025-12-20
|
||||
|
||||
### Added
|
||||
|
||||
- MCP (Model Context Protocol) adapter and client (ADR-029).
|
||||
- LSP (Language Server Protocol) client integration (ADR-027).
|
||||
- Agent Skills Standard (AgentSkills.io) support (ADR-028).
|
||||
- Skill abstraction definition (ADR-030).
|
||||
|
||||
---
|
||||
|
||||
## [3.0.0] — 2025-12-06
|
||||
|
||||
### Added
|
||||
|
||||
- Initial public release of CleverAgents Core.
|
||||
- Unified `agents` / `cleveragents` CLI entry points.
|
||||
- Layered architecture: Entry Points → Application → Domain → Infrastructure → Integration → Core.
|
||||
- Actor system with YAML-defined LangGraph node graphs.
|
||||
- Tool system with four-stage lifecycle (activate → validate → execute → deactivate).
|
||||
- Skill system with three-tier progressive disclosure.
|
||||
- Resource system with DAG and type hierarchy.
|
||||
- A2A (Agent-to-Agent) protocol facade.
|
||||
- DI container (`cleveragents.application.container`).
|
||||
- LangChain/LangGraph integration (ADR-022).
|
||||
- Provider registry with fallback chain (OpenAI → Anthropic → Google → Azure → OpenRouter → Groq → Together → Cohere).
|
||||
- Observability: structured logging, metrics, audit trail, token/cost tracking.
|
||||
- BDD test suite (Behave + Robot Framework).
|
||||
- Nox automation for lint, typecheck, tests, docs, benchmarks.
|
||||
- MkDocs-powered documentation with CleverAgents branding.
|
||||
|
||||
@@ -51,6 +51,12 @@ Feature: UKO Runtime — Provenance Tracking, Temporal Versioning, and ACMS Inte
|
||||
When uko I index a Python resource "01HQ8ZDRX50000000000000006" with content "class Foo:\n pass"
|
||||
Then uko the graph has a predicate-object pair "uko:layer" "3"
|
||||
|
||||
Scenario: Indexing a Python file populates layer 2 (paradigm)
|
||||
Given uko a PythonAnalyzer is registered
|
||||
And uko a UKOIndexer with all backends
|
||||
When uko I index a Python resource "01HQ8ZDRX50000000000000012" with content "class Foo:\n pass"
|
||||
Then uko the graph has a predicate-object pair "uko:layer" "2"
|
||||
|
||||
# =================================================================
|
||||
# Implicit relationship inference
|
||||
# =================================================================
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Parses Python source into an ``ast`` tree and extracts:
|
||||
|
||||
- Module-level declarations (``uko-code:Module``).
|
||||
- Class definitions with docstrings (``uko-py:Class``).
|
||||
- Class definitions with docstrings (``uko-oo:Class``, ``uko-py:Class``).
|
||||
- Function and method definitions with docstrings (``uko-py:Function``).
|
||||
- Import statements (``uko:references``).
|
||||
- Module-level docstrings (``uko-doc:hasDocstring``).
|
||||
@@ -13,6 +13,7 @@ All extracted elements are represented as ``UKOTriple`` instances with
|
||||
|
||||
- Layer 0 core: ``uko:contains``, ``uko:references``
|
||||
- Layer 1 code: ``uko-code:Module``
|
||||
- Layer 2 paradigm/OO: ``uko-oo:Class``
|
||||
- Layer 3 Python-specific: ``uko-py:Class``, ``uko-py:Function``
|
||||
|
||||
Based on ``docs/specification.md`` ACMS Extensions — PythonAnalyzer.
|
||||
@@ -166,7 +167,16 @@ class PythonAnalyzer:
|
||||
triples: list[UKOTriple] = []
|
||||
cls_uri = _class_uri(resource_uri, node.name)
|
||||
|
||||
# Type declaration
|
||||
# Layer 2 (paradigm/OO) type declaration - Python classes are OO constructs.
|
||||
triples.append(
|
||||
UKOTriple(
|
||||
subject_uri=cls_uri,
|
||||
predicate="rdf:type",
|
||||
object_uri="uko-oo:Class",
|
||||
)
|
||||
)
|
||||
|
||||
# Layer 3 (technology) type declaration
|
||||
triples.append(
|
||||
UKOTriple(
|
||||
subject_uri=cls_uri,
|
||||
|
||||
Reference in New Issue
Block a user