bug(uko): add missing layer 2 indexing scenario to uko_runtime.feature #9965

Merged
HAL9000 merged 2 commits from bugfix/uko-runtime-feature-missing-layer-2-indexing-scenario into master 2026-04-22 07:15:01 +00:00
3 changed files with 97 additions and 296 deletions
+79 -294
View File
@@ -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.
- **PRIssue 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
PRissue 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.
+6
View File
@@ -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,