khyari hamza
493e5cf8a1
fix(security): wire read_only through ExecuteStubActor and replace stubs with real tests
...
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 20s
CI / lint (pull_request) Successful in 20s
CI / build (pull_request) Successful in 28s
CI / security (pull_request) Successful in 33s
CI / typecheck (pull_request) Successful in 34s
CI / integration_tests (pull_request) Successful in 3m38s
CI / benchmark-regression (pull_request) Successful in 26m8s
CI / unit_tests (pull_request) Successful in 29m12s
CI / docker (pull_request) Successful in 1m2s
CI / coverage (pull_request) Successful in 50m23s
- Add read_only kwarg to ExecuteStubActor.execute(), propagated to
ChangeSetCapture; PlanExecutor._run_execute_with_stub passes
plan.read_only through the execution path (P1 #2 fix)
- Replace CLI fail-fast and Action-Skill stub scenarios with real
ExecuteStubActor spy test and SkillContext.enforce_write_guard
integration tests (P2 #1 fix)
- Update docs: remove unimplemented Layer 5 (Action-Skill), add
ExecuteStubActor wiring description, fix test command (P2 #2 fix)
ISSUES CLOSED : #322
2026-02-26 20:33:20 +00:00
khyari hamza
2b09568cfa
feat(security): enforce read-only actions
...
Tighten ToolRuntime._enforce_capabilities() to block ANY tool with
writes=True when plan_read_only is set, removing the not-cap.read_only
loophole that allowed certain write tools through. Tool name is now
always included in the ToolAccessDeniedError message.
Add read_only flag to ChangeSetCapture with ReadOnlyViolationError
raised when write-capable tools are wrapped on a read-only plan.
Add CLI fail-fast guards on plan execute and plan apply commands that
abort before calling the service layer if plan.read_only is True.
SkillContext.enforce_write_guard() already included tool name
correctly and required no changes.
Includes 18 Behave scenarios (90 steps), Robot integration tests,
ASV benchmarks, and docs/reference/read_only_actions.md.
ISSUES CLOSED : #322
2026-02-26 20:33:20 +00:00
freemo
4ed057fa58
Docs: Fixed refs in docs
CI / lint (push) Successful in 25s
CI / quality (push) Successful in 27s
CI / security (push) Successful in 49s
CI / typecheck (push) Successful in 1m1s
CI / benchmark-regression (push) Has been skipped
CI / build (push) Successful in 24s
CI / integration_tests (push) Successful in 4m59s
CI / benchmark-publish (push) Successful in 15m36s
CI / unit_tests (push) Successful in 19m44s
CI / docker (push) Successful in 40s
CI / coverage (push) Successful in 1h33m28s
2026-02-26 14:40:17 -05:00
freemo
c88b432beb
Docs: Daily timeline update
CI / lint (push) Successful in 15s
CI / build (push) Successful in 24s
CI / quality (push) Successful in 31s
CI / security (push) Successful in 37s
CI / typecheck (push) Successful in 1m5s
CI / benchmark-regression (push) Has been skipped
CI / integration_tests (push) Successful in 4m52s
CI / benchmark-publish (push) Has been cancelled
CI / unit_tests (push) Has been cancelled
CI / coverage (push) Has been cancelled
CI / docker (push) Has been cancelled
2026-02-26 14:32:59 -05:00
brent.edwards
1ec2200e34
test(e2e): verify M6 success criteria — Firefox-scale autonomous porting
...
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / build (pull_request) Successful in 16s
CI / quality (pull_request) Successful in 19s
CI / security (pull_request) Successful in 30s
CI / typecheck (pull_request) Successful in 34s
CI / integration_tests (pull_request) Successful in 4m18s
CI / unit_tests (pull_request) Successful in 12m21s
CI / docker (pull_request) Successful in 15s
CI / benchmark-regression (pull_request) Successful in 25m32s
CI / coverage (pull_request) Successful in 40m18s
Robot Framework E2E test suite exercising the complete M6 success
criteria verification sequence:
- Porting action creation from YAML config via CLI
- Plan use + execute via CLI with mocked lifecycle service
- Hierarchical decomposition: 4+ levels (root + L1-L4 = 21+ plans)
- Decision correction recomputes only affected subtree (CorrectionImpact)
- Parallel execution scales to 15 concurrent subplans (10+ required)
- Realistic porting task: full ACTION → STRATEGIZE → EXECUTE → APPLY
lifecycle with 10 subplans completing autonomously
- Plan apply transitions to APPLIED terminal state
- SubplanFailureHandler retry/stop-others logic verification
- SubplanConfig supports all execution modes and merge strategies
- Decision tree structure: PROMPT_DEFINITION root with
SUBPLAN_PARALLEL_SPAWN children and superseded_by flow
Ten subcommands in the Python helper, each printing a sentinel
string on success. All subcommands verified passing locally.
Closes #407
2026-02-26 19:27:53 +00:00
brent.edwards
93f2d396a1
Merge pull request 'test: consolidated Brent QA batch — issues #179 , #180 , #404 , #405 , #187 ' ( #442 ) from develop-brent-5 into master
...
CI / lint (push) Successful in 22s
CI / quality (push) Successful in 24s
CI / typecheck (push) Successful in 39s
CI / security (push) Successful in 53s
CI / build (push) Successful in 15s
CI / benchmark-regression (push) Has been skipped
CI / integration_tests (push) Successful in 6m6s
CI / benchmark-publish (push) Successful in 11m51s
CI / unit_tests (push) Successful in 24m50s
CI / docker (push) Successful in 8s
CI / coverage (push) Successful in 1h23m59s
Reviewed-on: #442
Reviewed-by: Jeffrey Phillips Freeman <jeffrey.freeman@cleverthis.com >
2026-02-26 16:54:21 +00:00
brent.edwards
fd1612c38f
test(e2e): verify M5 success criteria — ACMS and large-project context
...
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 17s
CI / lint (pull_request) Successful in 21s
CI / quality (pull_request) Successful in 20s
CI / security (pull_request) Successful in 54s
CI / typecheck (pull_request) Successful in 56s
CI / integration_tests (pull_request) Successful in 4m21s
CI / unit_tests (pull_request) Successful in 10m21s
CI / docker (pull_request) Successful in 39s
CI / benchmark-regression (pull_request) Successful in 22m20s
CI / coverage (pull_request) Successful in 1h5m5s
Robot Framework E2E test suite exercising the complete M5 success
criteria verification sequence:
- Large project creation with 10,000+ simulated files
- Resource registration and linking to a project
- Indexing verification (resource linked, project shows correctly)
- Context tier management (hot/warm/cold) via ContextConfig
- ACMS v1 context policy set/show with persistence round-trip
- Phase view inheritance (default → strategize → execute → apply)
- Scoped context output per ACMS phase with narrowing size limits
- Policy clear and inheritance fallback
- ContextView validation rules (size limits, VALID_PHASES)
Nine subcommands in the Python helper, each printing a sentinel
string on success. All subcommands verified passing locally.
Closes #406
2026-02-26 16:32:01 +00:00
brent.edwards
ffdd2f2b19
Merge branch 'master' into develop-brent-5
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / build (pull_request) Successful in 20s
CI / quality (pull_request) Successful in 29s
CI / typecheck (pull_request) Successful in 36s
CI / security (pull_request) Successful in 54s
CI / integration_tests (pull_request) Successful in 4m9s
CI / unit_tests (pull_request) Successful in 10m36s
CI / docker (pull_request) Successful in 39s
CI / benchmark-regression (pull_request) Successful in 26m16s
CI / coverage (pull_request) Successful in 39m2s
2026-02-26 16:14:07 +00:00
brent.edwards
32b81793a2
refactor(test): rename decision persistence files to avoid conflict with master
...
Rename our serialization-focused decision persistence suites to
*_serialization to avoid add/add conflicts with the repository-based
decision persistence suites that landed on master independently:
- decision_persistence.feature -> decision_persistence_serialization.feature
- decision_persistence_steps.py -> decision_persistence_serialization_steps.py
- decision_persistence_bench.py -> decision_persistence_serialization_bench.py
- decision_persistence.robot -> decision_persistence_serialization.robot
- helper_decision_persistence.py -> helper_decision_persistence_serialization.py
Updated robot helper path, step docstring, and testing.md references.
2026-02-26 16:13:44 +00:00
hamza.khyari
074f884f14
Merge pull request 'fix(security): close async resources and leaks' ( #435 ) from feature/m4-security-async-cleanup into master
...
CI / lint (push) Successful in 15s
CI / quality (push) Successful in 35s
CI / typecheck (push) Successful in 43s
CI / benchmark-regression (push) Has been skipped
CI / security (push) Successful in 1m4s
CI / build (push) Successful in 53s
CI / integration_tests (push) Successful in 4m19s
CI / benchmark-publish (push) Successful in 16m1s
CI / unit_tests (push) Successful in 35m8s
CI / docker (push) Successful in 39s
CI / coverage (push) Has been cancelled
Reviewed-on: #435
2026-02-26 15:19:16 +00:00
aditya
76db58414a
Merge branch 'master' into feature/m3-agent-skills-loader
CI / lint (pull_request) Successful in 22s
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 29s
CI / build (pull_request) Successful in 27s
CI / security (pull_request) Successful in 55s
CI / typecheck (pull_request) Successful in 1m1s
CI / integration_tests (pull_request) Successful in 4m35s
CI / unit_tests (pull_request) Successful in 23m50s
CI / docker (pull_request) Successful in 50s
CI / benchmark-regression (pull_request) Successful in 26m46s
CI / coverage (pull_request) Successful in 55m34s
2026-02-26 14:51:41 +00:00
aditya
f8bc02869a
Merge branch 'master' into feature/m3-agent-skills-loader
CI / lint (pull_request) Successful in 24s
CI / quality (pull_request) Successful in 33s
CI / benchmark-publish (pull_request) Has been skipped
CI / security (pull_request) Successful in 59s
CI / typecheck (pull_request) Successful in 1m1s
CI / build (pull_request) Successful in 28s
CI / coverage (pull_request) Has been cancelled
CI / integration_tests (pull_request) Has been cancelled
CI / unit_tests (pull_request) Has been cancelled
CI / benchmark-regression (pull_request) Has been cancelled
CI / docker (pull_request) Has been cancelled
2026-02-26 14:43:52 +00:00
aditya
d0337a0881
fix(skill): eliminate Any from agent_skills_loader type signatures
...
Replace dict[str, Any] with a private _YamlMapping type alias
(dict[str, object]) in AgentSkillSpec Pydantic fields and all
internal helper function signatures. Add isinstance guard for
allowed-tools list iteration to satisfy pyright.
Refs: #160
2026-02-26 14:40:44 +00:00
khyari hamza
c406781b86
fix(security): address PR #435 review feedback
...
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / quality (pull_request) Successful in 17s
CI / build (pull_request) Successful in 20s
CI / typecheck (pull_request) Successful in 41s
CI / security (pull_request) Successful in 57s
CI / integration_tests (pull_request) Successful in 2m53s
CI / unit_tests (pull_request) Successful in 19m17s
CI / docker (pull_request) Successful in 1m1s
CI / benchmark-regression (pull_request) Successful in 26m11s
CI / coverage (pull_request) Successful in 47m20s
P0: reject register() after close_all() with RuntimeError.
P1: catch CancelledError in close_all(), use WeakKeyDictionary for
cancellation_reasons to prevent memory leak, guard StateManager
update_state/reset/load_checkpoint/time_travel after close().
P2: contextlib.suppress in __del__ for partial construction, re-cancel
pending tasks in cleanup_tasks_async, handle late tasks added during
await window, guard AcpEventQueue.publish() after close with _is_closed
flag and is_closed property, fix ASV TimeRegisterBatch crash.
Tests: 5 new Behave scenarios (T1-T4 + is_closed), log handler and
event loop cleanup in after_scenario (T5-T6).
Docs: async_safety.md updated for register-after-close and state
mutation guards.
ISSUES CLOSED : #321
2026-02-26 14:30:43 +00:00
khyari hamza
5d5d3fde2c
fix(security): close async resources and leaks
...
Add AsyncResourceTracker (core/async_cleanup.py) providing a central
registry for async resources with timeout-bounded close_all(), async
context manager support, and a __del__ finalizer that logs leaked
resources by name.
Enhance LangGraphBridge with cleanup_tasks_async() that awaits
in-flight tasks with a deadline instead of fire-and-forget cancel().
Add cancellation_reasons dict to trace why tasks were cancelled.
Add StateManager.close() to properly release checkpoint file handles
and complete the RxPY BehaviorSubject. Add AcpEventQueue.close() to
dispose all subscriptions.
Includes 14 Behave scenarios (67 steps), Robot integration tests,
ASV benchmarks, and docs/reference/async_safety.md.
ISSUES CLOSED : #321
2026-02-26 14:30:43 +00:00
aditya
7ad9f2bf4a
chore: update CHANGELOG for feat(skill): add agent skills loader
...
ISSUE CLOSED #160
2026-02-26 14:28:09 +00:00
hamza.khyari
db58a3bb62
Merge pull request 'feat(decision): add decision persistence layer' ( #131 ) from feature/m4-decision-persistence into master
...
CI / lint (push) Successful in 15s
CI / build (push) Successful in 21s
CI / quality (push) Successful in 23s
CI / security (push) Successful in 33s
CI / typecheck (push) Successful in 43s
CI / benchmark-regression (push) Has been skipped
CI / integration_tests (push) Successful in 2m56s
CI / benchmark-publish (push) Successful in 14m45s
CI / unit_tests (push) Successful in 17m58s
CI / docker (push) Successful in 26s
CI / coverage (push) Has been cancelled
Reviewed-on: #131
Reviewed-by: Brent Edwards <brent.edwards@cleverthis.com >
2026-02-26 14:25:27 +00:00
khyari hamza
7f2b1c61fc
fix(decision): rebase migration onto merged changeset head
...
CI / lint (pull_request) Successful in 15s
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 28s
CI / typecheck (pull_request) Successful in 34s
CI / build (pull_request) Successful in 23s
CI / security (pull_request) Successful in 54s
CI / integration_tests (pull_request) Successful in 5m18s
CI / unit_tests (pull_request) Successful in 19m34s
CI / docker (pull_request) Successful in 1m4s
CI / benchmark-regression (pull_request) Successful in 24m59s
CI / coverage (pull_request) Successful in 44m0s
After rebasing onto master, m4_001_decision_tables and
d0_002_merge_changeset_and_locks were both leaf heads. Update
down_revision so the decision migration chains after the merge
migration, restoring a single Alembic head.
ISSUES CLOSED : #171
2026-02-26 13:40:07 +00:00
khyari hamza
27bef69ddd
feat(decision): add decision persistence
...
Add decision persistence layer with DecisionRepository, DecisionModel,
and Alembic migration. Includes tree queries (BFS traversal via deque,
path-to-root), superseded lookup, ordered decision path retrieval,
concrete Decision type annotations (via TYPE_CHECKING), and comprehensive
test coverage (Behave BDD, Robot Framework, ASV benchmarks). Updated
database_schema.md, CHANGELOG.md, and CONTRIBUTORS.md.
ISSUES CLOSED : #171
2026-02-26 13:40:07 +00:00
aditya
595cfd172f
Merge branch 'master' into feature/m3-mcp-adapter
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 18s
CI / build (pull_request) Successful in 16s
CI / lint (pull_request) Successful in 21s
CI / typecheck (pull_request) Successful in 37s
CI / security (pull_request) Successful in 53s
CI / integration_tests (pull_request) Successful in 5m11s
CI / unit_tests (pull_request) Successful in 20m32s
CI / docker (pull_request) Successful in 1m2s
CI / benchmark-regression (pull_request) Successful in 22m28s
CI / coverage (pull_request) Successful in 54m49s
2026-02-26 13:30:29 +00:00
aditya
e05afdcd27
Merge pull request 'feature/m2-actor-yaml' ( #432 ) from feature/m2-actor-yaml into master
...
CI / lint (push) Successful in 15s
CI / quality (push) Successful in 18s
CI / typecheck (push) Successful in 34s
CI / benchmark-regression (push) Has been skipped
CI / build (push) Successful in 33s
CI / security (push) Successful in 58s
CI / integration_tests (push) Successful in 4m35s
CI / benchmark-publish (push) Successful in 14m53s
CI / unit_tests (push) Successful in 22m0s
CI / docker (push) Successful in 1m12s
CI / coverage (push) Successful in 45m11s
Reviewed-on: #432
Reviewed-by: Luis Mendes <luis.mendes@cleverthis.com >
2026-02-26 13:19:00 +00:00
aditya
b25a886df8
feat(skill): add MCP refresh hooks
...
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 20s
CI / lint (pull_request) Successful in 24s
CI / build (pull_request) Successful in 27s
CI / typecheck (pull_request) Successful in 34s
CI / security (pull_request) Successful in 1m11s
CI / integration_tests (pull_request) Successful in 4m40s
CI / unit_tests (pull_request) Successful in 9m55s
CI / docker (pull_request) Successful in 1m0s
CI / benchmark-regression (pull_request) Successful in 25m30s
CI / coverage (pull_request) Successful in 1h11m59s
Implement SkillRegistry.refresh(name) and refresh_all() to recompute
flattened tool sets on demand. Wire MCPToolAdapter.dispatch_notification()
to MCPRefreshHook, which debounces rapid notifications/tools/list_changed
bursts into a single refresh_all() call (default 0.5 s window).
Add safeguard that skips tool-ref validation when no ToolRegistry is
configured, emitting a single WARNING with recovery steps. Introduce
immutable SkillRefreshResult (refreshed/failed/skipped counts) with
to_summary() and merge() for CLI and log output.
New files:
- src/cleveragents/skills/refresh.py (SkillRefreshResult)
- src/cleveragents/mcp/refresh_hook.py (MCPRefreshHook)
- features/skill_refresh.feature (19 Behave scenarios)
- features/steps/skill_refresh_steps.py
- robot/skill_refresh.robot (10 Robot tests)
- robot/helper_skill_refresh.py
- benchmarks/skill_refresh_bench.py (ASV benchmarks)
- docs/reference/skill_refresh.md
Modified:
- src/cleveragents/skills/registry.py (refresh, refresh_all)
- src/cleveragents/mcp/adapter.py (notification listener API)
- src/cleveragents/skills/__init__.py (export SkillRefreshResult)
- src/cleveragents/mcp/__init__.py (export MCPRefreshHook)
- CHANGELOG.md
ISSUES CLOSED #168
2026-02-26 12:29:49 +00:00
aditya
c40ea014dc
feat(cli): add skill tools and refresh commands
...
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 16s
CI / build (pull_request) Successful in 17s
CI / quality (pull_request) Successful in 19s
CI / security (pull_request) Successful in 32s
CI / typecheck (pull_request) Successful in 37s
CI / integration_tests (pull_request) Successful in 2m46s
CI / unit_tests (pull_request) Successful in 9m40s
CI / docker (pull_request) Successful in 39s
CI / benchmark-regression (pull_request) Successful in 20m53s
CI / coverage (pull_request) Successful in 34m31s
Implemented agents skill refresh command to recompute tool flattening and sync
MCP-backed skills. Enhanced skill list/show/tools outputs with capability
summary fields.
- agents skill refresh <name>|--all to recompute flattening
- Enhanced skill list/show/tools with capability summary and tool counts
- Added --format json/yaml schemas for refresh output
- CLI errors for nonexistent skills and MCP sync failures
- Behave tests (skill_cli.feature), Robot tests (skill_cli.robot)
- ASV benchmarks (skill_cli_bench.py) for CLI overhead baseline
- Updated docs/reference/skill_cli.md with refresh command examples
- Documented refresh side effects and caching behavior
ISSUES CLOSED : #167
2026-02-26 10:57:07 +00:00
aditya
cb82fc51df
feat(skill): add agent skills loader
...
Implemented AgentSkillSpec loader that parses SKILL.md frontmatter and
progressive disclosure sections (discover/activate/deactivate) into
structured SkillStep objects with stable 1-based ordering.
Mapped Agent Skills to AgentSkillToolDescriptor with namespaced naming
(namespace/short_name), source="agent_skill", read-only defaults, and
AgentSkillResourceSlot bindings for scripts/, references/, and assets/
directories. All resource slots are unconditionally read_only.
Added explicit validation for missing frontmatter fields (name,
description) and invalid namespace format with actionable error messages.
Added docs/reference/agent_skills.md covering folder layout, SKILL.md
parsing rules, progressive disclosure model, and tool mapping.
Added Behave scenarios covering valid/invalid SKILL.md parsing,
namespaced naming, step ordering, missing frontmatter errors, progressive
disclosure lifecycle, tool mapping, and resource binding slots.
Added Robot Framework integration tests using the deploy-to-staging
example skill folder (robot/agent_skills_loader.robot).
Added ASV benchmarks for parsing throughput, folder load, progressive
disclosure lifecycle, and resource listing
(benchmarks/agent_skills_loader_bench.py).
ISSUES CLOSED : #160
2026-02-26 09:10:35 +00:00
aditya
519e26fb02
Merge branch 'master' into feature/m3-mcp-adapter
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 21s
CI / lint (pull_request) Successful in 21s
CI / build (pull_request) Successful in 21s
CI / security (pull_request) Successful in 50s
CI / typecheck (pull_request) Successful in 59s
CI / integration_tests (pull_request) Successful in 4m18s
CI / unit_tests (pull_request) Successful in 10m11s
CI / docker (pull_request) Successful in 59s
CI / benchmark-regression (pull_request) Successful in 20m36s
CI / coverage (pull_request) Successful in 36m7s
2026-02-26 06:44:38 +00:00
aditya
b8d7c4c893
Merge branch 'master' into feature/m2-actor-yaml
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 15s
CI / build (pull_request) Successful in 16s
CI / quality (pull_request) Successful in 44s
CI / typecheck (pull_request) Successful in 44s
CI / security (pull_request) Successful in 47s
CI / integration_tests (pull_request) Successful in 3m17s
CI / unit_tests (pull_request) Successful in 20m41s
CI / docker (pull_request) Successful in 1m2s
CI / benchmark-regression (pull_request) Successful in 23m40s
CI / coverage (pull_request) Successful in 35m33s
2026-02-26 06:21:39 +00:00
brent.edwards
c53b880a5e
Merge branch 'master' into develop-brent-5
CI / lint (pull_request) Successful in 23s
CI / typecheck (pull_request) Successful in 56s
CI / security (pull_request) Successful in 57s
CI / quality (pull_request) Successful in 32s
CI / integration_tests (pull_request) Successful in 5m30s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 27s
CI / unit_tests (pull_request) Successful in 32m48s
CI / docker (pull_request) Successful in 14s
CI / benchmark-regression (pull_request) Successful in 24m15s
CI / coverage (pull_request) Successful in 1h8m22s
2026-02-26 03:44:19 +00:00
freemo
e3fcce413b
feat(changeset): persist changesets and diff artifacts
...
CI / lint (pull_request) Successful in 24s
CI / typecheck (pull_request) Successful in 59s
CI / security (pull_request) Successful in 53s
CI / quality (pull_request) Successful in 36s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 27s
CI / integration_tests (pull_request) Successful in 5m30s
CI / benchmark-regression (pull_request) Successful in 25m38s
CI / unit_tests (pull_request) Successful in 36m51s
CI / docker (pull_request) Successful in 1m3s
CI / coverage (pull_request) Successful in 1h48m49s
CI / lint (push) Successful in 22s
CI / security (push) Successful in 58s
CI / typecheck (push) Successful in 1m3s
CI / quality (push) Successful in 46s
CI / build (push) Successful in 23s
CI / integration_tests (push) Successful in 5m23s
CI / benchmark-regression (push) Has been skipped
CI / benchmark-publish (push) Successful in 15m5s
CI / unit_tests (push) Successful in 20m1s
CI / docker (push) Successful in 1m0s
CI / coverage (push) Successful in 1h45m36s
Add SQLite persistence for ChangeSet entries and ToolInvocation records
via new changeset_repository module implementing the ChangeSetStore protocol.
- Alembic migration d0_001 creates changeset_entries and tool_invocations tables
- SqliteChangeSetStore, ChangeSetEntryRepository, ToolInvocationRepository
- PlanApplyService.cleanup_changeset() for cancel/failure cleanup
- Behave tests (17 scenarios), Robot tests (5 cases), ASV benchmarks
- Reference documentation in docs/reference/changeset.md
Closes #163
2026-02-26 02:47:14 +00:00
brent.edwards
cf59f285fd
Merge feature/m4-correction-subplan-smoke into develop-brent-5
CI / lint (pull_request) Successful in 22s
CI / typecheck (pull_request) Successful in 1m2s
CI / quality (pull_request) Successful in 29s
CI / security (pull_request) Successful in 49s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 22s
CI / integration_tests (pull_request) Successful in 4m55s
CI / unit_tests (pull_request) Successful in 30m41s
CI / benchmark-regression (pull_request) Successful in 26m32s
CI / docker (pull_request) Successful in 15s
CI / coverage (pull_request) Has been cancelled
2026-02-26 02:15:24 +00:00
brent.edwards
a00c33c4c6
Merge test/m4-e2e-verification into develop-brent-5
2026-02-26 02:15:19 +00:00
brent.edwards
2e2ae3b9b8
Merge test/m3-e2e-verification into develop-brent-5
2026-02-26 02:15:14 +00:00
brent.edwards
3d3c8fda33
Merge feature/m4-decision-tests into develop-brent-5
2026-02-26 02:15:01 +00:00
brent.edwards
b3f126b147
Merge feature/m3-decision-validation-smoke into develop-brent-5
2026-02-26 02:14:14 +00:00
brent.edwards
3c9a3efdf1
fix(test): correct mock targets, method names, ULIDs, and CLI args in M4 smoke suite
...
CI / lint (pull_request) Successful in 22s
CI / typecheck (pull_request) Successful in 55s
CI / security (pull_request) Successful in 48s
CI / quality (pull_request) Successful in 28s
CI / integration_tests (pull_request) Successful in 5m6s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 23s
CI / unit_tests (pull_request) Successful in 34m47s
CI / benchmark-regression (pull_request) Successful in 25m45s
CI / docker (pull_request) Successful in 1m15s
CI / coverage (pull_request) Has been cancelled
- Patch CorrectionService at its module path, not the local-import site
- Use request_correction/execute_correction/analyze_impact (real API)
- Replace invalid 27-char subplan_id values with valid 26-char ULIDs
- Add required --guidance flag to dry-run CLI invocation
- Fix feature file assertions to match actual CLI output
Resolves CI failures in unit_tests (job 4) and coverage (job 6) for
run 645 on PR #441 .
2026-02-26 02:01:47 +00:00
brent.edwards
4f079c20ea
fix(test): route M3 E2E subcommands through CLI rendering path
...
CI / lint (pull_request) Successful in 24s
CI / typecheck (pull_request) Successful in 1m2s
CI / security (pull_request) Successful in 1m1s
CI / quality (pull_request) Successful in 42s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 25s
CI / integration_tests (pull_request) Successful in 5m18s
CI / unit_tests (pull_request) Successful in 30m5s
CI / docker (pull_request) Successful in 15s
CI / benchmark-regression (pull_request) Successful in 26m25s
CI / coverage (pull_request) Has been cancelled
- decision-tree-view, decision-explain, and decision-tree-persistence
now invoke 'plan status --format plain' via mocked lifecycle service
so regressions in CLI rendering/serialization are caught
- plan-generates-decisions now asserts use_action was called by the CLI
and verifies plan status renders the strategize phase after creation
- Updated robot test case documentation to reflect CLI integration
2026-02-26 01:26:02 +00:00
brent.edwards
b99510d016
fix(test): derive decision type count from enum instead of hard-coding 11
...
CI / lint (pull_request) Successful in 21s
CI / typecheck (pull_request) Successful in 55s
CI / security (pull_request) Successful in 51s
CI / quality (pull_request) Successful in 32s
CI / integration_tests (pull_request) Successful in 5m12s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 24s
CI / unit_tests (pull_request) Successful in 33m37s
CI / benchmark-regression (pull_request) Successful in 26m3s
CI / docker (pull_request) Successful in 1m1s
CI / coverage (pull_request) Has been cancelled
Replace hard-coded '11 decision types' with dynamic len(DecisionType) in
the assertion and remove the literal from scenario names, step patterns,
docstrings, and docs so the tests stay correct when new DecisionType
values are added.
2026-02-26 01:19:28 +00:00
brent.edwards
93730067a2
fix(test): address review findings in M3 smoke tests
...
CI / lint (pull_request) Successful in 24s
CI / typecheck (pull_request) Successful in 55s
CI / security (pull_request) Successful in 47s
CI / quality (pull_request) Successful in 28s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 23s
CI / integration_tests (pull_request) Successful in 5m7s
CI / unit_tests (pull_request) Successful in 20m55s
CI / benchmark-regression (pull_request) Successful in 25m40s
CI / docker (pull_request) Successful in 14s
CI / coverage (pull_request) Successful in 1h48m41s
- Replace dead after_scenario() hook with context.add_cleanup() calls
so patchers are properly stopped (Behave only runs hooks from
environment.py)
- Fix invalid ULID constants: pad DECISION/CORRECTION to 26 chars,
replace invalid 'I' with 'J' in INVARIANT_ULID
- Add temp file cleanup for NamedTemporaryFile(delete=False) via
context.add_cleanup() in behave steps and try/finally in robot helper
- Remove decision-persistence doc sections from testing.md that belong
in PR #438 , not this PR
2026-02-26 01:13:16 +00:00
brent.edwards
ef58883f7a
fix(test): harden retry_patterns feature against flaky CI failures
...
CI / lint (pull_request) Successful in 16s
CI / typecheck (pull_request) Successful in 37s
CI / quality (pull_request) Successful in 24s
CI / security (pull_request) Successful in 51s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 19s
CI / integration_tests (pull_request) Successful in 4m37s
CI / unit_tests (pull_request) Successful in 12m10s
CI / docker (pull_request) Successful in 16s
CI / benchmark-regression (pull_request) Successful in 27m0s
CI / coverage (pull_request) Successful in 1h51m34s
The jitter-spread scenario used millisecond-bucketed wall-clock
timestamps to assert that retried operations did not cluster. On busy
CI runners — especially when a preceding scenario's time.sleep patch
leaked through a late cleanup — tenacity's retry waits became no-ops
and all five operations landed in the same millisecond bucket, tripping
the max_in_bucket <= 3 assertion.
Three hardening changes:
1. Jitter test: switch from time.time() to time.monotonic_ns() and
replace the fragile bucket assertion with a unique-timestamp count
(>= 2 distinct readings among 5 sequential operations).
2. Timeout test: eagerly restore time.sleep in a try/finally block so
subsequent scenarios never observe the patched no-op, regardless of
behave's cleanup ordering.
3. Async circuit breaker: lower recovery_timeout from 0.2 s to 0.1 s
(the sleep step already waits 0.2 s) to give a wider safety margin
on slow CI machines.
2026-02-26 00:51:11 +00:00
freemo
3a2b134f3c
test(coverage): add Behave scenarios for remaining under-tested modules
...
CI / lint (pull_request) Successful in 14s
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 27s
CI / typecheck (pull_request) Successful in 37s
CI / security (pull_request) Successful in 39s
CI / build (pull_request) Successful in 29s
CI / integration_tests (pull_request) Successful in 5m51s
CI / benchmark-regression (pull_request) Successful in 22m39s
CI / unit_tests (pull_request) Successful in 29m35s
CI / docker (pull_request) Successful in 13s
CI / coverage (pull_request) Successful in 2h3m1s
CI / lint (push) Successful in 21s
CI / typecheck (push) Successful in 57s
CI / security (push) Successful in 51s
CI / quality (push) Successful in 27s
CI / integration_tests (push) Successful in 4m59s
CI / build (push) Successful in 23s
CI / benchmark-publish (push) Successful in 14m39s
CI / benchmark-regression (push) Has been skipped
CI / unit_tests (push) Successful in 29m48s
CI / docker (push) Successful in 15s
CI / coverage (push) Successful in 1h45m42s
Added Behave BDD feature files and step definitions targeting coverage
gaps in six modules:
- container.py: exercise get_database_url env-var fallback, AI provider
None path, cached container singleton, override_providers edge cases
(lines 66-69, 125-130; branches at 51, 57, 82, 87, 256, 284-288)
- correction_service.py: exercise exception-handling paths in
execute_revert and execute_append via monkeypatched analyze_impact
and ULID failures (lines 254-262, 320-328)
- plan_lifecycle_service.py: exercise _persisted UoW commit paths,
InvalidPhaseTransitionError custom message branch, non-reusable
action archive, and error_details merge logic (branches at 100,
216, 237, 327, 461, 570, 576, 607)
- plan.py (CLI): exercise spec-dict optional field branches,
_print_lifecycle_plan conditional rendering, use_action argument
parsing, auto-resolve paths, legacy wrappers, and validation
error branches across 66 scenarios
- skill.py (CLI): exercise singleton cache, timestamp-absent show,
no-tools MCP, add/remove/list/show format and error branches
across 26 scenarios
- models.py (DB): exercise to_domain/from_domain None-field branches
in SkillModel, SessionModel, ToolModel, LifecycleActionModel,
LifecyclePlanModel, NamespacedProjectModel, and SessionMessageModel
across 41 scenarios
All 302 features, 6503 scenarios, 28271 steps pass (nox -e unit_tests).
ISSUES CLOSED : #446
2026-02-25 19:38:43 -05:00
brent.edwards
c80cda2590
Merge feature/m4-correction-subplan-smoke into develop-brent-5
CI / lint (pull_request) Successful in 23s
CI / typecheck (pull_request) Successful in 1m7s
CI / security (pull_request) Successful in 1m0s
CI / quality (pull_request) Successful in 28s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 25s
CI / integration_tests (pull_request) Successful in 5m50s
CI / unit_tests (pull_request) Failing after 32m24s
CI / docker (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Successful in 25m44s
CI / coverage (pull_request) Failing after 1h28m6s
2026-02-25 22:11:33 +00:00
brent.edwards
a2b0611722
Merge branch 'test/m4-e2e-verification' into develop-brent-5
2026-02-25 22:10:46 +00:00
brent.edwards
49f097472a
Merge branch 'test/m3-e2e-verification' into develop-brent-5
2026-02-25 22:10:42 +00:00
brent.edwards
5a212481e1
Merge branch 'feature/m4-decision-tests' into develop-brent-5
2026-02-25 22:10:38 +00:00
brent.edwards
22986aaaf9
fix(test): correct dry-run assertion in M3 decision validation smoke
...
CI / lint (pull_request) Successful in 24s
CI / typecheck (pull_request) Successful in 58s
CI / security (pull_request) Successful in 56s
CI / quality (pull_request) Successful in 42s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 25s
CI / integration_tests (pull_request) Successful in 5m7s
CI / unit_tests (pull_request) Successful in 25m18s
CI / benchmark-regression (pull_request) Successful in 26m14s
CI / docker (pull_request) Successful in 16s
CI / coverage (pull_request) Successful in 1h40m20s
The CLI plain format output does not include the literal text "Dry Run"
(that string only appears in the Rich panel title). Assert against
"risk_level" which is present in the dry-run impact output instead.
2026-02-25 22:09:26 +00:00
brent.edwards
55df1915f1
fix(test): correct patch targets and ULID validation in M4 smoke helper
...
CI / lint (pull_request) Successful in 23s
CI / typecheck (pull_request) Successful in 59s
CI / security (pull_request) Successful in 51s
CI / quality (pull_request) Successful in 35s
CI / benchmark-publish (pull_request) Has been skipped
CI / build (pull_request) Successful in 30s
CI / integration_tests (pull_request) Successful in 5m11s
CI / unit_tests (pull_request) Failing after 25m35s
CI / docker (pull_request) Has been skipped
CI / benchmark-regression (pull_request) Successful in 26m22s
CI / coverage (pull_request) Failing after 1h27m30s
- Patch CorrectionService at its definition site instead of the lazy
import location in plan.py (same fix as M3 helper)
- Replace hardcoded fake subplan/correction IDs with real ULIDs
generated via ulid.ULID() to satisfy Pydantic pattern validation
- Add missing --guidance flag to correction dry-run CLI invocation
- Fix subplan-status-sequential assertion to check for plan_id
(subplan_count is not part of the status JSON output)
2026-02-25 22:06:45 +00:00
brent.edwards
2e53caaef1
fix(test): correct patch target for CorrectionService in M3 e2e helper
...
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 20s
CI / quality (pull_request) Successful in 20s
CI / build (pull_request) Successful in 26s
CI / typecheck (pull_request) Successful in 57s
CI / security (pull_request) Successful in 1m2s
CI / integration_tests (pull_request) Successful in 4m16s
CI / unit_tests (pull_request) Successful in 23m40s
CI / benchmark-regression (pull_request) Successful in 25m34s
CI / docker (pull_request) Successful in 15s
CI / coverage (pull_request) Successful in 1h40m2s
The CorrectionService import in plan.py is a lazy import inside the
correct() function body, so it does not exist as a module-level attribute.
Patch the class at its definition site instead:
cleveragents.application.services.correction_service.CorrectionService
Fixes CI integration_tests failure for PR #439 .
2026-02-25 22:00:39 +00:00
brent.edwards
917c2bc546
test(e2e): add M4 correction + subplan suites
2026-02-25 21:51:26 +00:00
brent.edwards
cfc319ad27
test(e2e): verify M4 success criteria — subplans and parallel execution
CI / lint (pull_request) Successful in 23s
CI / quality (pull_request) Successful in 30s
CI / benchmark-publish (pull_request) Has been skipped
CI / security (pull_request) Successful in 44s
CI / typecheck (pull_request) Successful in 44s
CI / build (pull_request) Successful in 24s
CI / integration_tests (pull_request) Successful in 5m18s
CI / unit_tests (pull_request) Successful in 21m31s
CI / benchmark-regression (pull_request) Successful in 26m33s
CI / docker (pull_request) Successful in 1m1s
CI / coverage (pull_request) Failing after 1h29m10s
2026-02-25 21:46:58 +00:00
brent.edwards
ace7311de4
test(e2e): add M3 decision + validation suites
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 16s
CI / quality (pull_request) Successful in 19s
CI / build (pull_request) Successful in 20s
CI / security (pull_request) Successful in 55s
CI / typecheck (pull_request) Successful in 1m5s
CI / integration_tests (pull_request) Successful in 4m4s
CI / benchmark-regression (pull_request) Successful in 22m21s
CI / unit_tests (pull_request) Failing after 34m7s
CI / docker (pull_request) Has been skipped
CI / coverage (pull_request) Has been cancelled
2026-02-25 21:26:19 +00:00
brent.edwards
f4c4884d03
test(persistence): add decision persistence suites
...
CI / lint (pull_request) Successful in 21s
CI / typecheck (pull_request) Successful in 40s
CI / security (pull_request) Successful in 41s
CI / benchmark-publish (pull_request) Has been skipped
CI / quality (pull_request) Successful in 37s
CI / build (pull_request) Successful in 32s
CI / integration_tests (pull_request) Successful in 4m46s
CI / unit_tests (pull_request) Successful in 10m36s
CI / docker (pull_request) Successful in 1m2s
CI / benchmark-regression (pull_request) Successful in 22m26s
CI / coverage (pull_request) Successful in 1h55m50s
Add comprehensive persistence test suites for the Decision domain model
covering serialization round-trips (model_dump/model_validate, JSON),
context-snapshot persistence, correction-chain reconstruction, and
decision-tree reconstruction from serialized data.
Deliverables:
- Behave: 21 scenarios in features/decision_persistence.feature
- Robot Framework: 7 integration tests in robot/decision_persistence.robot
- ASV benchmarks: 4 suites (17 benchmarks) in benchmarks/decision_persistence_bench.py
- Documentation: Updated docs/development/testing.md
ISSUES CLOSED : #180
2026-02-25 21:19:57 +00:00