test(cli): add TDD failing tests for Container.resolve() crash #670
Closed
aditya
wants to merge 14 commits from
tdd/container-resolve-crash into master
pull from: tdd/container-resolve-crash
merge into: cleveragents:master
cleveragents:master
cleveragents:fix/config-service-remove-undocumented-local-scope
cleveragents:bugfix/validation-attach-named-option-format
cleveragents:docs/add-example-tool-and-validation-management
cleveragents:bugfix/project-show-resource-name
cleveragents:bugfix/backlog-resource-schema-missing-overlay-strategy
cleveragents:fix/action-argument-schema/misleading-error-message
cleveragents:fix/remove-executable-resource-type
cleveragents:fix/config-get-output-missing-origin-panel-and-envelope
cleveragents:fix/tui-help-command-full-catalog-listing
cleveragents:fix/a2a-plan-execute-full-lifecycle
cleveragents:fix/invariant-service-action-scope-effective
cleveragents:fix/plan-explain-rich-output-panels
cleveragents:fix/a2a-dispatch-not-found-error-response
cleveragents:fix/project-service-namespaced-project
cleveragents:fix/automation-profile-remove-rich-output-panel
cleveragents:fix/container-handler-module-missing
cleveragents:fix/format-output-rich-color-renderers
cleveragents:fix/type-safety-legacy-migrator-type-ignore
cleveragents:spec/update-sse-streaming-event-example
cleveragents:fix/acms-skeleton-compressor-signature
cleveragents:controller-state-machine
cleveragents:fix/skill-add-yaml-wrapper-key
cleveragents:fix/1476-tool-list-cols
cleveragents:bugfix/permissions-diff-mode-cycle
cleveragents:fix/1444-access-type
cleveragents:fix/1429-node-ref
cleveragents:fix/1443-tier-defaults
cleveragents:bugfix/session-export-format-flag
cleveragents:feature/aws-cloud-handler-sdk
cleveragents:feat/output-renderer-registry
cleveragents:fix/1432-lsp
cleveragents:bugfix/1039-missing-validation-unit-tests-yaml
cleveragents:feature/audit-preserve-event-timestamp
cleveragents:feature/m8-tui-materializer
cleveragents:tdd/m4-automation-profile-di-bypass
cleveragents:bugfix/m7-audit-session-race
cleveragents:fix/1441-ctrl-tab
cleveragents:feature/m9-entity-sync
cleveragents:feature/extract-cleveractors-library
cleveragents:feature/m9-agent-card
cleveragents:feature/m9-team-collab
cleveragents:feature/m7-postgresql-backend
cleveragents:feature/m9-container-lifecycle
cleveragents:fix/issue-11189-config-actor-format
cleveragents:bugfix/m5-actor-options-ignored
cleveragents:fix-11004-tui-suggestions
cleveragents:feature/9827-wrap-plan-status-json-envelope
cleveragents:fix/arg-swap-validation-attachment-8177
cleveragents:pr-fix/9663-hot-warm-cold-tier-reliability
cleveragents:pr_fix-11000-conflict-report
cleveragents:bugfix/m3.6.0-lsp-7044-subprocess-cleanup
cleveragents:fix/7478-file-ops-security-fix
cleveragents:impl-tui-materializer
cleveragents:test/hierarchical-plan-4phase-lifecycle
cleveragents:feature/security-fix-relpath-pr-11217
cleveragents:feature/m2-implementation-pool-supervisor-checklist
cleveragents:fix-file-tools-path-validation
cleveragents:bugfix/m8-tui-input-live-refresh
cleveragents:feature/9126-fix-action-scope-invariant-merge
cleveragents:bugfix/m7-tool-calling-llm-options
cleveragents:fix-7478-startswith-bypass
cleveragents:bugfix/m3-cleanup-subprocess-on-failed-init
cleveragents:bugfix/m8-tui-anthropic-model-name
cleveragents:feat/integrate-cleveractors
cleveragents:feature/m8-tui-llm-dispatch
cleveragents:bugfix/m3.6.0-lsp-transport-header-injection-ascii
cleveragents:fix-11175
cleveragents:fix/auto_debug-partial-state
cleveragents:fix/issue-9124-add-bdd-tags
cleveragents:pr-9673-budget-enforcement
cleveragents:fix/actor-loader-list-actors-race-condition
cleveragents:pr-9675
cleveragents:feat/v3.3.0-three-way-merge-engine
cleveragents:fix/issue-7478-inline-executor-startswith-bypass
cleveragents:fix/plan-apply-json-envelope
cleveragents:feat/v3.4.0-acms-storage-tiers
cleveragents:feat/tui-tuimat-5326
cleveragents:fix-9675-context-show-clear
cleveragents:agents/final-working
cleveragents:feat/v3.4.0-context-show-clear-cli
cleveragents:fix/10356-eventbus-unsubscribe
cleveragents:11229-fix-acms-hot-max-tokens-regression-tests
cleveragents:pr-fix-7801
cleveragents:pr-8701-invariant-model
cleveragents:pr-fix/10597-lsp-transport-cleanup
cleveragents:bugfix/m3.6.0-lsp-transport-resource-leak
cleveragents:bugfix/9558-plan-conflict-detection
cleveragents:pr-fix-9608
cleveragents:feat/v3.3.0-plan-correct-revert-append
cleveragents:dmpipeline-v2
cleveragents:pr-fix-10608-header-injection
cleveragents:pr-9827-fix
cleveragents:bugfix/7492-validation-attachment-argument-swap
cleveragents:pr-fix-11002
cleveragents:feat/v3.4.0-context-list-add-cli
cleveragents:fix/plan-status-json-envelope
cleveragents:feat/v370/multi-session-tabs
cleveragents:fix-branch
cleveragents:fix/project-show-missing-panels
cleveragents:AUTO-IMP/PR-10069-checklist
cleveragents:feature/m2-pr-compliance-checklist
cleveragents:feature/pr-10592-cloud-resource-types
cleveragents:fix-lsp-transport-cleanup
cleveragents:feat/v360/cloud-resource-types
cleveragents:feature/context-strategy-protocol
cleveragents:refactor/v3.6.0-acp-to-a2a-rename
cleveragents:fix/context-cli-consolidation
cleveragents:fix/10608-lsp-header-injection
cleveragents:feat/acms-context-index
cleveragents:fix/plan-status-missing-output-panels
cleveragents:pr/fix-arg-swap-validation-attachment-8177
cleveragents:feature/issue-4748-actor-context-list-show-clear
cleveragents:fix-cli-plan-status-envelope
cleveragents:fix/plan-tree-color-format-ansi-output
cleveragents:pr/9981
cleveragents:pr/11153-auto-debug-fix
cleveragents:pr/10589-tui-materializer
cleveragents:fix/validate_path_security
cleveragents:pr-fix-11177-status-check-native-expressions
cleveragents:bugfix/m6-validate-path-startswith
cleveragents:security/relpath-containment-fallback
cleveragents:a2a-materializer-pr-fix
cleveragents:pr-fix-10608
cleveragents:bugfix/9250-a2a-session-id-validation-before-cleanup
cleveragents:pr-fix-11053
cleveragents:fix/10496-auto-debug-node-state-mutation
cleveragents:feat/tui-v370/tui-materializer
cleveragents:fix/a2a-handle-session-close-missing-session-id
cleveragents:fix/validation-attachment-arg-swap-8177
cleveragents:pr-fix-11196-invariant
cleveragents:feat/v3.4.0-acms-budget-enforcement
cleveragents:pr-fix-11196
cleveragents:bugfix/m5-fix-hot-max-tokens-tier
cleveragents:pr-fix-9675
cleveragents:perf/acms-large-project-indexing-optimization
cleveragents:perf-fix
cleveragents:pr-9608
cleveragents:feature/ten-way-merge-engine
cleveragents:pr-fix-branch
cleveragents:pr-11217
cleveragents:bugfix/9608-three-way-merge-engine
cleveragents:11101-three-way-merge-engine
cleveragents:feat/v3.4.0/acms-context-policy
cleveragents:fix/remove-silent-argument-swap
cleveragents:fix-pr-11000-structured-conflict-report
cleveragents:pr-fix-11053-session-id-validation
cleveragents:agents/fix-eventbus-unsubscribe
cleveragents:pr-10356
cleveragents:fix/invariant-action-scope
cleveragents:bugfix/issue-8395-sanitise-db-url
cleveragents:bugfix/m3-fix-action-scope-invariant-merge
cleveragents:pr-9671
cleveragents:feature/wire-missing-event-emitters
cleveragents:bugfix/m3.6.0-lsp-transport-post-spawn-cleanup
cleveragents:dmpipeline
cleveragents:bugfix/m5-acms-project-budget-override
cleveragents:fix/iterate-all-actors
cleveragents:pr/11217-fix-prefix-collision-bypass
cleveragents:fix/pr-11011-subprocess-cleanup
cleveragents:pr-11217-fix
cleveragents:pr-11217-relpath-fix
cleveragents:feat/v3.6.0-context-strategy-protocol
cleveragents:bugfix/tui-actor-overlay-render-shadow
cleveragents:bugfix/m5-revert-acms-budget-assembler
cleveragents:fix/eventbus-unsubscribe
cleveragents:feature/pr-9981
cleveragents:fix/v3.7.0/actor-add-update-flag
cleveragents:agents/fix-invariant-persistence-8573
cleveragents:fix/invariant-database-persistence
cleveragents:feat/tui-materializer-a2a
cleveragents:fix/tui-tui-materializer-a2a-event-queue
cleveragents:fix/unsubscribe-eventbus
cleveragents:pr-11153
cleveragents:feature/11201
cleveragents:pr-fix-11153-patched
cleveragents:pr-branch
cleveragents:fix/10813-strategy-decision-persistence
cleveragents:fix-pr-11145-status-check
cleveragents:pr-11053
cleveragents:pr-fix-10597-subprocess-cleanup
cleveragents:bugfix/mcp-infer-resource-slots-null-properties
cleveragents:pr-11166
cleveragents:pr-9675-fix
cleveragents:feat/structural-component-output-validation
cleveragents:fix/invariant-service-thread-safety
cleveragents:pr-fix-8179-implementation
cleveragents:pr-fix-9313
cleveragents:cleveragents-pr-fix-11038
cleveragents:fix/m2-acceptance-test
cleveragents:fix/pr-11042-rename-render
cleveragents:fix/action-scope-inmerge
cleveragents:fix/wf12-oom-sigkill
cleveragents:fix/wf18-container-clone-e2e
cleveragents:tdd/mcp-client-timer-cancel-race
cleveragents:feature/auto-debug-nodes
cleveragents:feat/v3.2.0-decision-recording-persistence
cleveragents:bugfix/m6-actor-overlay-render-shadow
cleveragents:bugfix/m7-plan-strategy-decisions-json
cleveragents:fix/10911-tui-suggestions-query-extraction
cleveragents:fix/lsp-transport-subprocess-cleanup
cleveragents:pr-fix-8177-validation
cleveragents:bugfix/m3-plan-status-json-envelope
cleveragents:fix/invariant-persistence-8573
cleveragents:pr-fix-11037
cleveragents:pr-11015-fix
cleveragents:pr_fix_11015
cleveragents:fix/m1-security-fix-startswith-bypass
cleveragents:fix/automation-profile-gates-lifecycle
cleveragents:fix-status-check-brittle-pipeline-11212
cleveragents:feat/pr-10590-dual-capability-strategies
cleveragents:feat/structural-output-validation
cleveragents:bugfix/m2-ci-status-check-resilience
cleveragents:fix-sandbox-cache-invalidation
cleveragents:feature/acp-a2a-rename-fix
cleveragents:feature/m3-plan-correction-data-model
cleveragents:pr-fix-10356-unsubscribe
cleveragents:pr-fix-11011
cleveragents:pr_fix/lsp-transport-header-injection-ascii
cleveragents:fix-pr-11002-startswith-bypass-7478
cleveragents:bugfix/acms-project-budget-override
cleveragents:fix/ci-status-check-resilience
cleveragents:bugfix/pr-fix-10597-cleanup-subprocess-on-init-failure
cleveragents:bugfix/sandbox-reexecute-cleanup
cleveragents:pr-fix-8701-invariant-model
cleveragents:fix/test-dotdot-traversal-assertion
cleveragents:fix/cleanup-stale-preserve-commits
cleveragents:fix/10592-pr-compliance
cleveragents:fix/security-file-tools-path-traversal-7478
cleveragents:pr-11180-fix
cleveragents:fix-combined-format
cleveragents:fix-9131-invariant-propagation
cleveragents:fix/tui-actor-selection-overlay
cleveragents:pr-11201
cleveragents:merge/pr-11196-invariant-fix
cleveragents:fix/issue-10813-strategize-decision-persistence
cleveragents:pr-fix-11170
cleveragents:pr/11165
cleveragents:temp-pr-11174
cleveragents:feat/invariant-enforcement-validation-pipeline
cleveragents:pr-fix-10356-unsubscribe-eventbus
cleveragents:pr-fix-11156-python313-deprecation
cleveragents:feature/pr-7801-fix-validate-path-security
cleveragents:fix/11039-render-refresh
cleveragents:fix/tui-actor-selection-render-rename
cleveragents:pr-fix-11089-session-close-validation
cleveragents:pr-fix/11089-session-close-validation
cleveragents:pr-fix-11182
cleveragents:feature/7926-persist-decision-dependencies
cleveragents:bugfix/m3-rxpy-subject-close
cleveragents:test/restore-e2e-tests
cleveragents:feature/m694-tui-materializer-a2a-integration-layer
cleveragents:feature/issue-pr-9271-hot-max-tokens
cleveragents:pr-fix-8177
cleveragents:test/v360/e2e-project-plan-correction
cleveragents:bugfix/issue-8426-stdio-cleanup
cleveragents:feature/eventbus-unsubscribe
cleveragents:bugfix/m3-integrate-mcp-transport
cleveragents:fix/concurrent-stdout-restoration
cleveragents:feat/a2a-stdio-transport-fix-264
cleveragents:PR-fix-wf18
cleveragents:feature/sandbox-cache-invalidation
cleveragents:fix/issue-10496-auto-debug-state-mutation
cleveragents:fix/python-313-asyncio-deprecations
cleveragents:pr-11128
cleveragents:pr-11180
cleveragents:pr-11165
cleveragents:pr-practice
cleveragents:structural-output-validation
cleveragents:fix/status-check-native-expressions
cleveragents:feat/merge-conflict-detection
cleveragents:11036-fix-acms-hot-max-tokens
cleveragents:pr/11166
cleveragents:fix/ci-status-check-native-expressions
cleveragents:fix/stdlib-transport-cleanup
cleveragents:fix/11176-actor-selection-render
cleveragents:pr-fix-10597
cleveragents:feature/pr-compliance-pool-supervisor
cleveragents:fix/actor-add-update-enforcement-fix
cleveragents:pr_fix/8209
cleveragents:pr-10590
cleveragents:fix/python313-asyncio-get-event-loop-deprecation
cleveragents:pr-fix-#11053-session-id-validation
cleveragents:pr-fix-11042-renamed-render
cleveragents:feat/v360/acp-to-a2a-rename
cleveragents:fix-arg-swap-validation-attachment-8177
cleveragents:fix/asyncio-get-event-loop-deprecation
cleveragents:fix_8395_pr
cleveragents:pr-fix-11153-auto-debug-mutation
cleveragents:pr/11051-thread-safety-invariant
cleveragents:fix-plan-status-json-envelope
cleveragents:bugfix/pr-11015-pool-supervisor-checklist
cleveragents:feature/fix-7478-validate-path
cleveragents:feature/plans-conflict-detection
cleveragents:pr-11141-cleanup-stale-commits-beyond-head
cleveragents:fix/pyyaml-vulnerability-upgrade
cleveragents:pr-fix-9244
cleveragents:bugfix/m3-invariant-propagation
cleveragents:feature/issue-10480-fix-validation-bypass
cleveragents:feature/m3-invariant-enforcement-validation-pipeline
cleveragents:feat/invariant-enforcement-strategize-phase
cleveragents:bugfix/mcp-race-condition-start
cleveragents:fix/action-schema-argument-default-type-validation
cleveragents:issue-10438-fix
cleveragents:fix/mcp-timer-race-10516
cleveragents:fix/10480-validation-bypass-fix
cleveragents:fix/cli-session-tell-format-flag
cleveragents:feat/agents-invariant-add-list-remove-commands
cleveragents:restore-e2e-cleanup
cleveragents:fix/events-eventbus-unsubscribe
cleveragents:fix/issue-11120-cleanup-stale-preserve-artifacts
cleveragents:feature/fix-issue-11121-cleanup-stale-reinvoke
cleveragents:fix/issue-10480-plan-validation
cleveragents:feature/m5-tdd-quality-gate
cleveragents:bugfix/11121-fix-cleanup_stale-preserve-meaningful-changes
cleveragents:bugfix/m8-set-active-persona-preset-reset
cleveragents:feat/context-priority-strategy
cleveragents:feature/issue-4381-docs-api-and-module-guides
cleveragents:m7-opencode-ruff
cleveragents:bugfix/m3-wf18-oom-sigkill
cleveragents:bugfix/acms-dual-strategy-capabilities-incompatible-fields
cleveragents:feature/benchmark-scheduled-workflow
cleveragents:feature/m8-tui-mainscreen
cleveragents:feat/v3.4.0/acms-project-indexer
cleveragents:fix/10932-preserve-strategy-decisions-json
cleveragents:fix/data-integrity-session-rollback-7489
cleveragents:fix/issue-6329-resource-remove-edge-table
cleveragents:fix/issue-7524-invariant-service-thread-safety
cleveragents:pr-10932-fix-plan-strategy-decisions
cleveragents:pr-fix-9244-pyyaml-upgrade
cleveragents:refactor/noxfile-parallel-test-architecture
cleveragents:task/ci-matrix-strategy-python-versions
cleveragents:bugfix/m3.6.0-ci-pipeline-flakiness-stabilization
cleveragents:feat/v3.3.0-plan-rollback
cleveragents:refactor/auto-guard-1-cli-a2a-boundary
cleveragents:feature/issue-10755-redirect-rich-panels-to-stderr
cleveragents:pr10871
cleveragents:fix/10881-propagate-invariants-to-child-plans
cleveragents:feat/resources-extension-interface
cleveragents:pr-fix-10901
cleveragents:ci/optimize-benchmarks-regression
cleveragents:fix/tui-extract-at-token-suggestions
cleveragents:feat/acms-index-data-model
cleveragents:feature-10887-eventbus-unsubscribe
cleveragents:feature/m5-add-repo-indexing-showcase
cleveragents:PR-10910-a2a-json-rpc-routing
cleveragents:feature/milestone-based-pr-prioritization
cleveragents:bugfix/m3-issue-9055
cleveragents:auto-time-3-day106-cycle2
cleveragents:feature/m39-timeline-day106-cycle2-2026-04-16
cleveragents:timeline/day-106-cycle2-2026-04-16-auto-time-3
cleveragents:feat/issue-10921-a2a-http-transport
cleveragents:pr/fix-10842
cleveragents:feature/issue-10746-fix-agents-graphs-plan-generation-validate-always-passes-for-code-longer-than-10-characters-making-llm-validation-ineffective
cleveragents:agents/fix-10866-permissions-screen-to-textual-screen
cleveragents:pr-10886
cleveragents:bugfix/m3-session-tell-format
cleveragents:fix/pr-10890-shell-safety-integration
cleveragents:fix/session-delete-json-envelope
cleveragents:pr-10851
cleveragents:test/v3.8.0-ci-quality-execution-time
cleveragents:feature/m7-timeline-day-106-update
cleveragents:bugfix/context-remove-path-traversal-10924
cleveragents:pr-10876
cleveragents:fix/gemini-fallback-order
cleveragents:fix/trailing-comma-opencode-json
cleveragents:pr/fix/mcp-client-start-race-condition
cleveragents:fix/project-switch-command
cleveragents:fix-pr-4211
cleveragents:feat/three-way-merge-engine-9608
cleveragents:pr/9673
cleveragents:fix/1469-plan-execute-structured-panels
cleveragents:fix/actor-provider-validation
cleveragents:implement-pr-9442
cleveragents:cleveragents-push-23420b48
cleveragents:fix/validation-repo-silent-swap
cleveragents:feat/context-strategy-plugin-system
cleveragents:fix/startswith-bypass-7478
cleveragents:fix-plan-status-envelope-11034
cleveragents:fix/invariant-thread-safety
cleveragents:fix-thread-safety-invariant-service
cleveragents:fix/8284-warned-sessions-reset
cleveragents:docs/milestone-plan-navigation
cleveragents:feat/v3.3.0-checkpoint-creation
cleveragents:feature/implementor-notification-11032
cleveragents:task/ci-optimize-e2e-tests-execution-time
cleveragents:feature/pr-9599-plan-correct-correction-engine
cleveragents:pr-fix-10593
cleveragents:pr9452
cleveragents:fix/isolate-checkpoint-prune-test
cleveragents:pr/fix-9601
cleveragents:pr/9234-hardening-bdd-tags
cleveragents:bugfix/9673-acms-budget-enforcement
cleveragents:pr-8667
cleveragents:auto-arch/spec-pr-10451-test-coverage
cleveragents:fix/10954-security-scan-dockerfile
cleveragents:bugfix/9183-bdd-tag-enforcement
cleveragents:fix/7566-engine_cache-toctou-race
cleveragents:fix/10934-preserve-strategy-decisions-json
cleveragents:bugfix/10608-lsp-header-injection
cleveragents:bugfix/9981-acms-indexing-optimize
cleveragents:bugfix/11077-security-escape-bypass
cleveragents:fix/auto-rev-sup-tracking-prefix
cleveragents:fix-lsp-subprocess-cleanup-10597
cleveragents:improvement/agent-evolution-pool-supervisor-pr-metadata
cleveragents:fix/plan-tree-json-output-envelope
cleveragents:pr-9313-fix
cleveragents:bugfix/9244-pyyaml-security-upgrade
cleveragents:feature/issue-1925-add-asv-tests-for-domain-module
cleveragents:test/domain-asv-benchmarks
cleveragents:feature/9250-fix-a2a-session-close
cleveragents:fix/pr-10027-acms-default-pipeline
cleveragents:bugfix/m2-plan-explain-alternatives-format
cleveragents:fix-invalidate-sandbox-dirs-cache-after-purge-7527
cleveragents:pr-fix-10958-async-cleanup-tests
cleveragents:feat/adr-049-layer-boundary-enforcement
cleveragents:fix/action-list-table-columns
cleveragents:fix/issue-7478-validate-path-startswith-bypass
cleveragents:pr-fix-ci-11000
cleveragents:fix/agent-skill-multi-scope-discovery
cleveragents:pr_fix_8675_switch_project_command
cleveragents:feat/m6/devcontainer-clone-into-sandbox
cleveragents:fix/tui-keybinding-preset-persona-cycling
cleveragents:pr-fix-10982
cleveragents:bugfix/m3-invariant-service-thread-safety
cleveragents:pr-fix-10937-close-reactive-eventbus
cleveragents:pr-fix-7478-path-traversal
cleveragents:feature/benchmark-scheduled-workflow-fix
cleveragents:pr-9183-add-bdd-tags
cleveragents:pr/11029-review-started-notification
cleveragents:fix/pyyaml-security-upgrade
cleveragents:fix-plan-status-panels
cleveragents:fix-pr-11037
cleveragents:feat/v3.6.0-database-resource-types
cleveragents:pr-10591-checkout
cleveragents:pr-10979
cleveragents:fix/invariant-thread-safety-8209
cleveragents:pr-fix-11002-validate-path-bypass
cleveragents:fix/10597-lsp-proc-cleanup
cleveragents:fix/plan/tree-envelope-9313
cleveragents:fix-6568-push
cleveragents:fix/issue-6425-tui-persona-cycling-keybinding
cleveragents:pr/11044
cleveragents:feature/m6-reduce-redundant-ci-status-reporting
cleveragents:fix/11041-plan-tree-envelope
cleveragents:fix/ca-test-infra-improver-health-spam
cleveragents:agents/pr-6628-fix
cleveragents:docs/add-showcase-cli-basics
cleveragents:auto-time-1-day107-cycle
cleveragents:improvement/agent-uat-tester-parallel-docs-pr-fix
cleveragents:fix/issue-11047-actor-add-rename-from-config
cleveragents:fix/pr-11050-subprocess-cleanup
cleveragents:pr-6741
cleveragents:ci/cache-helm-binary-auto-inf-1
cleveragents:fix/8675-project-switch
cleveragents:fix/7527-sandbox-cache-invalidation
cleveragents:fix/issue-6319-project-context-set-output
cleveragents:pr/fix-9183-bdd-tags
cleveragents:fix/issue-6325-plan-explain-decision-id
cleveragents:fix/1422-docs
cleveragents:pr-fix-1485-updates
cleveragents:spec/subplan-system-v3.3.0
cleveragents:pr/6723-fix-session-create-json
cleveragents:improvement/agent-bug-hunt-pool-supervisor-tracking-prefix-complete
cleveragents:fix/pr-6695-session-list-empty-json
cleveragents:fix/file-tools-startswith-bypass
cleveragents:pr_fix_8256
cleveragents:pr-9663-fix
cleveragents:docs/add-example-resource-and-skill-management
cleveragents:feature/m39-cli-basics-showcase
cleveragents:pr-fix-7478-startswith-bypass
cleveragents:fix/issue-11047-actor-add-remove-positional-name
cleveragents:fix/gemini-fallback-order-fix-3
cleveragents:pr_fix_8179
cleveragents:fix/gemini-fallback-order-fix-2
cleveragents:fix/validation-list-command
cleveragents:fix/validation-list-command-clean
cleveragents:fix-pr7957-complete-tracking-prefix
cleveragents:pr-7922-fix-lint
cleveragents:fix/validation-swap-8177
cleveragents:add-plan-start-alias
cleveragents:feature/pr-8304-container-clone-into
cleveragents:fix-pyyaml-11012
cleveragents:pr-fix-9461
cleveragents:fix/pr-11004-tui-token-extraction
cleveragents:fix/invariant-scope-handling
cleveragents:feat/plan-correction-8531
cleveragents:pr/8685-correction-data-model-persistence
cleveragents:bugfix/lsp-stdio-transport-cleanup-10597
cleveragents:pr-8660
cleveragents:feat-scope-chain-resolution
cleveragents:chore/pyyaml-upgrade
cleveragents:fix/9250-session-id-validation-handle-session-close
cleveragents:fix/issue-7478-file-tools-validate-path
cleveragents:pr-fix-9442-tui-ctrltab
cleveragents:spec/update-cycle8-validation-gate-empty-run-guard
cleveragents:fix/tui-sqlite-session-persistence-10648
cleveragents:fix/8661-plan-start-alias
cleveragents:fix-10649
cleveragents:refactor/add-return-type-get-services
cleveragents:pr-fix-cache-init
cleveragents:pr9407-timeline
cleveragents:feat/tui-prompt-symbol
cleveragents:pr_fix_9407-plan-alternatives-structured
cleveragents:feat/automation-profile-precedence-chain
cleveragents:bugfix/8179-remove-session-rollback-calls
cleveragents:feat/v360/pluggable-scope-chain-api
cleveragents:pr-9246
cleveragents:refactor/agent-configurable-limits-context-analysis-plan-generation
cleveragents:fix/issue-6452-session-tell-output
cleveragents:fix/v370/quality-gates-command-injection
cleveragents:pr-fix-10635-fixed
cleveragents:pr-10069
cleveragents:pr/fix-9313
cleveragents:pr-10643
cleveragents:invariant-pr-8684-fix
cleveragents:pr-fix-6676-resource-remove-edge-table
cleveragents:refactor/v360/audit-rename-acp-imports
cleveragents:fix/issue-7623-validation-pipeline-stdout
cleveragents:fix/acms-consolidate-strategycapabilities
cleveragents:fix/issue-7604-a2a-event-queue-concurrency
cleveragents:pr-fix-8661
cleveragents:auto-arch/spec-clarifications-cycle-1
cleveragents:feat/pure-graph-bdd-coverage
cleveragents:fix/9250-validate-session-id-before-cleanup
cleveragents:feature/issue-9442-fix-tui-correct-preset-cycling-keybinding-to-ctrl-tab-and-add-persona-tab-cycling
cleveragents:bugfix/m6-file-tools-validate-path-bypass
cleveragents:fix/invariant-add-scope
cleveragents:bugfix/m3-shell-safety-service-tui
cleveragents:pr-8684-persist-invariants
cleveragents:pr-8209-fix
cleveragents:docs/v360/repl-actor-run-showcase
cleveragents:feat/v360/cost-session-budget
cleveragents:bugfix/8177-remove-silent-argument-swap
cleveragents:fix/plan-apply-rich-output-panels
cleveragents:pr-fix-11012
cleveragents:pr-fix-11012-pyyaml-upgrade
cleveragents:pr-fix-8667
cleveragents:pr/fix/11012-pyinsec
cleveragents:pr-fix-9407
cleveragents:pr-8853
cleveragents:test/cli-lifecycle-e2e-full-plan-lifecycle
cleveragents:bugfix/m3-evlv-9824-implementation-pool-compliance-checklist
cleveragents:pr/10069
cleveragents:docs/pr-creator-state-priority-labels
cleveragents:fix/1514-structured-panels
cleveragents:test/core-asv-benchmarks
cleveragents:fix-8640-remove-positional-name
cleveragents:pr-fix-10995
cleveragents:refactor/v3.6.0-acp-to-a2a-rename-push
cleveragents:pr-9663
cleveragents:bugfix/m3.6.0-lsp-discovery-resource-exhaustion-dos
cleveragents:8660-move-namespace-filter-inside-lock
cleveragents:pr-fix-work
cleveragents:test/plan-correct-json-output-tdd
cleveragents:pr-8304
cleveragents:feat/v3.2.0-invariant-data-model-db-schema
cleveragents:pr_fix_1514_v2
cleveragents:timeline-update-2026-04-19
cleveragents:pr-fix-9313-plan-tree-envelope
cleveragents:test/v3.6.0/advanced-context-strategies-tests
cleveragents:pr/11004-fix-tui-suggestions-query-extraction
cleveragents:pr-fix-9817
cleveragents:feat/9558-plan-conflict-detection
cleveragents:docs/timeline-day-101
cleveragents:fix/v360/plugin-loader-security
cleveragents:feat/acms-context-policy-fix-9671
cleveragents:pr-9817-plan-apply-json
cleveragents:pr-fix-9460
cleveragents:pr-fix-6722-prompt-symbol
cleveragents:pr/9671
cleveragents:pr-fix-9671
cleveragents:pr-10592-fix
cleveragents:fix/issue-7478-file-path-validation
cleveragents:pr-fix-7478-validatepath
cleveragents:feat/pr-10590-context-strategy-fix
cleveragents:bugfix/m6-acms-path-matching-absolute
cleveragents:bugfix/pr-9183-bdd-tags
cleveragents:fix-pr-10975-path-matching-normalize
cleveragents:pr_fix/lsp-transport-subprocess-cleanup
cleveragents:pr-8177-validation-fix
cleveragents:feat/acms-context-show-clear-cli
cleveragents:feat/v360/plugin-architecture
cleveragents:fix/invariant-add-scope-required
cleveragents:pr-fix-10590-context-strategy
cleveragents:pr-fix-10590-local
cleveragents:pr-8662-fix
cleveragents:pr/1485
cleveragents:bugfix/8660-move-namespace-filter-inside-lock
cleveragents:pr/9460-project-show-invariants-validations
cleveragents:pr-11013
cleveragents:fix-1469-impl
cleveragents:fix/1469-impl
cleveragents:fix/cleanup-service-sandbox-cache-invalidation
cleveragents:pr-8257
cleveragents:pr-3329
cleveragents:feat/v3.2.0-decision-recording-strategize
cleveragents:fix/strategize-full-context-snapshots
cleveragents:clone-verify-test
cleveragents:fix/issue-6316-session-list-json-empty-case
cleveragents:AUTO-IMP/PR-9672-context-list-add
cleveragents:AUTO-IMP/PR-9663-storage-tiers
cleveragents:fix/issue-pr-11002
cleveragents:fix/plan-lifecycle-prompt-decision
cleveragents:fix/gemini-fallback-order-10906
cleveragents:AUTO-IMP/PR-10583-a2a-rename
cleveragents:fix-check-same-thread-migration-runner
cleveragents:d2188407
cleveragents:fix/a2a-handle-session-close-missing-session-id-pr-9250
cleveragents:fix/invariant-merge-action-scope
cleveragents:pr-fix-8179
cleveragents:bugfix/report-number-of-actors
cleveragents:bugfix/m6-devcontainer-autodiscovery-wiring
cleveragents:fix-gemini-fallback-order-10906
cleveragents:bugfix/m5-event-bus-exception-swallow
cleveragents:pr/3458
cleveragents:acms-parallel-indexing-fix
cleveragents:bugfix/m3-error-handling-fileconfig-unhandled-exception
cleveragents:acms-parallel-indexing
cleveragents:fix/resource-removal-children-check-6886
cleveragents:pr/9451-fix-tui-thinking-effort-presets
cleveragents:pr-fix-10958
cleveragents:fix/8179-remove-session-rollback-calls
cleveragents:pr/9817-plan-apply-json-envelope
cleveragents:fix/lsp-context-enrichment-acms-wiring
cleveragents:fix/cli-remove-positional-name-from-actor-add
cleveragents:fix/acms-context-cli
cleveragents:fix/tui-permissions-screen-wrong-base-class
cleveragents:bugfix/m6-session-create-suppress-exception-logging
cleveragents:fix/plan-tree-json-missing-decision-id
cleveragents:fix/plan-start-spec-alignment
cleveragents:fix-10957
cleveragents:fix/6726-tui-persona-cycling-keybinding
cleveragents:feat/plan-rollback-cli-checkpoint-restore
cleveragents:pr-8661-plan-start-alias
cleveragents:pr/1486/resource-handler-return-type
cleveragents:feature/8667-add-validation-list-command
cleveragents:auto-docs-1-mkdocs-setup
cleveragents:fix/actor-add-positional-name
cleveragents:feat/v3.3.0-merge-strategy-config
cleveragents:fix/invariant-precedence-chain-action-scope
cleveragents:improvement/agent-pr-review-pool-supervisor-tracking-prefix-complete
cleveragents:pr/fix/actor-loader-list-actors-race-condition
cleveragents:bugfix/m4-lsp-context-enrichment-acms-wiring
cleveragents:docs/auto-docs-2-v320-v330-features
cleveragents:bugfix/m-error-suppression-reactive-registry-adapter-v2
cleveragents:fix/7501-plan-repository-success-derivation
cleveragents:pr-10492
cleveragents:pr-8225
cleveragents:fix/plan-artifacts-missing-validation-apply-summary
cleveragents:feature/m9-v3.8.0-v3.9.0-documentation
cleveragents:docs/fix-automation-profile-default-supervised
cleveragents:fix/context-analysis-agent-path-traversal
cleveragents:pr-9229-path-traversal-fix
cleveragents:pr-10975
cleveragents:pr-fix-10986
cleveragents:pr/1486/fix-resource-handler-return-type
cleveragents:feat/m8/tui-main-screen
cleveragents:pr-9257-fix
cleveragents:fix/9222-guard-integration-e2e-jobs
cleveragents:refactor/clarify-behave-robot-framework-roles
cleveragents:docs/reference-glossary
cleveragents:feat/9088-a2a-message-send-stream
cleveragents:bugfix/m6-gemini-fallback-order
cleveragents:fix/validation-list-command-fixed
cleveragents:fix-executable-resource
cleveragents:test/plan-tree-correction-visual-tdd
cleveragents:auto-time/timeline-update-2026-04-18
cleveragents:pr-8179
cleveragents:spec/auto-arch-24-a2a-boundary-enforcement-adr
cleveragents:pr/10988/head
cleveragents:fix/7566-engine-cache-toctou-race
cleveragents:feat/v3.6.0-llm-provider-abstraction
cleveragents:fix/concurrency-catalog-cache-lock-7590-cleandiff
cleveragents:chore/test-infra-broad-exception-lint
cleveragents:issue-7502-fix-get-for-plan
cleveragents:fix/1500-impl
cleveragents:feat/context-show-cli-commands
cleveragents:pr-fix-7527-cache-invalidation
cleveragents:pr-fix-9407-plan-explain-structured-alternatives
cleveragents:fix/multi-scope-skill-discovery-9369
cleveragents:pr_9454
cleveragents:feat/agent-switch-cmd
cleveragents:pr-9329
cleveragents:8661-plan-start-alias
cleveragents:feat/acms-context-analysis-summaries
cleveragents:fix/invariant-add-repeatable-plan-action
cleveragents:tdd/m6-session-create-suppress-exception
cleveragents:test-push-check-only
cleveragents:pr-10889
cleveragents:pr-10889-fix
cleveragents:feature/issue-10952-provider-integration-tests
cleveragents:pr/10879-benchmark-caching-parallelism
cleveragents:bugfix/m3-eventbus-unsubscribe
cleveragents:spec/add-deleted-at-field-to-project-delete
cleveragents:fix/issue-6500-actor-context-list-regex
cleveragents:tdd/m8-tui-sqlite-session-persistence
cleveragents:fix/issue-6464-resource-add-auto-discovery
cleveragents:fix/bug-hunt-supervisor-tracking-prefix
cleveragents:feat/v3.2.0-plan-tree-cli
cleveragents:fix/issue-6491-actor-remove-format-option
cleveragents:fix/issue-6457-json-envelope-messages-text
cleveragents:improvement/agent-ca-test-infra-improver-duplicate-avoidance
cleveragents:fix/boundary-cost-budget-warning-re-trigger-7525
cleveragents:bugfix/6879-cli-format-option
cleveragents:feat/jwt-token-refresh
cleveragents:auto-discovered-stale-conflicts-review-task
cleveragents:docs/add-example-audit-log-and-security
cleveragents:docs/v3.8.0-api-and-module-guides
cleveragents:fix/issue-9169
cleveragents:improvement/reduce-redundant-ci-status-reporting
cleveragents:feat/v3.4.0-acms-index-data-model-traversal
cleveragents:bugfix/m3-sqlite-check-same-thread
cleveragents:issue-1-conversation-state
cleveragents:bugfix/m3-evlv-implementation-pool-compliance-checklist
cleveragents:feature/m9-a2a-jsonrpc
cleveragents:bugfix/m6-plan-execute-rich-output
cleveragents:fix/uat-checkpoint-prune-test-isolation
cleveragents:feature/issue-4749-split-monolithic-specification
cleveragents:bugfix/m8-suggestions-query-extraction
cleveragents:bugfix/m6-session-delete-format-json-envelope
cleveragents:bugfix/m3-langgraph-disposables
cleveragents:timeline/day-104-2026-04-14-auto-time-2
cleveragents:docs/quickstart-guide
cleveragents:fix/plan-prompt-json-timing-started
cleveragents:feat/v3.6.0-virtual-resource-types
cleveragents:feat/tui-v370/persona-registry
cleveragents:fix/1431-subgraph
cleveragents:bugfix/7529-a2a-terminal-phase-guard
cleveragents:bugfix/m3-bdd-feature-file-tags
cleveragents:ci/v360/isolate-slow-e2e-tests
cleveragents:feature/m3-consolidate-documentation
cleveragents:feature/m7-user-driven-review-agent
cleveragents:feature/m9-a2a-http
cleveragents:fix/1423-refactor
cleveragents:fix/tui-mainscreen-3state-sidebar-adr044
cleveragents:task/v3.8.0-ci-reusable-workflows
cleveragents:testbed/m9-hello
cleveragents:docs/add-label-verification-to-new-issue-creator
cleveragents:bugfix/m3-database-migration-runner-check-same-thread
cleveragents:feature/m4-plan-correction-revert
cleveragents:improvement/agent-architecture-pool-supervisor-milestone-assignment
cleveragents:docs/changelog-unreleased-cycle7
cleveragents:feature/m9-changelog-unreleased-cycle7
cleveragents:fix/issue-10512-mcptooladapter-rlock
cleveragents:fix/data-integrity-llm-trace-repository-7505
cleveragents:agents/auto-working-new
cleveragents:fix/resource-removal-guard-linked-children
cleveragents:fix/1468-impl
cleveragents:feature/1915-timezone-aware-datetime
cleveragents:feature/issue-4381-docs-add-invariantreconciliationactor-api-docs-devcontainer-discovery-module-guide-and-mkdocs-nav
cleveragents:task/ci-actor-context-mgmt-test-optimization
cleveragents:fix/7619-git-tools-base-env-toctou
cleveragents:pr-fix-8661-updates
cleveragents:feature/issue-2798-chore-agents-improve-ca-test-infra-improver-strengthen-duplicate-avoidance
cleveragents:bugfix/m3-migration-runner-check-same-thread
cleveragents:feature/issue-10952-fix-database-migration-runner-check-same-thread
cleveragents:fix/dependency-security-aiohttp-cves
cleveragents:test/uko-persistence-coverage
cleveragents:fix/security-b608-sql-fstring-migration-plan-phases
cleveragents:fix/cli-legacy-removal
cleveragents:feature/m39-auto-arch-23-minor-clarifications
cleveragents:bugfix/m3-langgraph-execute-state-bypass
cleveragents:feat/issue-6370-actor-context-clear
cleveragents:feat/acms-hot-storage-tier-lru-cache
cleveragents:feature/m3111-milestone-based-pr-prioritization
cleveragents:bugfix/m3-actor-run-response
cleveragents:fix/issue-7524-invariant-service-thread-safety-v2
cleveragents:pr-fix-10746
cleveragents:fix/tui-auto-generate-presets-actor-schema
cleveragents:feat/agent-card-discovery
cleveragents:feature/pr-10916-close-reactive-event-bus
cleveragents:feature/issue-1917-optimize-robot-actor-context-management-tests
cleveragents:feature/issue-10803-fix-nox-sessions-use-uv-sync-frozen
cleveragents:feature/issue-1923-missing-test-levels-core-module
cleveragents:feature/1928-add-test-coverage-for-tui-module
cleveragents:chore/ci-dockerfile-server-security-scan
cleveragents:task/ci-centralize-tool-versions
cleveragents:feature/m9-langgraph-platform
cleveragents:bugfix/m5-validation-attach-output-format
cleveragents:test/ci-execution-time-optimize-benchmark-regression
cleveragents:feature/issue-3105-add-mandatory-labels-to-supervisor-tracking-issue-creation
cleveragents:feat/acms-context-policy-configuration-schema
cleveragents:feat/context-sliding-window-strategy
cleveragents:feature/issue-5163-align-checkpoint-trigger-names
cleveragents:feature/issue-4221-docs-add-showcase-example-for-audit-log-and-security-commands
cleveragents:bugfix/m3-output-plan-results
cleveragents:fix/action-archive-output-panels
cleveragents:pr/9912-fix
cleveragents:fix/concurrency-catalog-cache-lock-7590
cleveragents:bugfix/executor-error-details-overwrite-mini-max
cleveragents:fix-10866-permissions-screen
cleveragents:feature/issue-7957-bug-hunt-pool-supervisor-tracking-prefix
cleveragents:fix-pr-10852
cleveragents:fix/10922-conversation-state-mgmt
cleveragents:pr-check
cleveragents:bugfix/10931-preserve-strategy-decisions-json
cleveragents:fix/10903-nox-showcase-docs
cleveragents:pr/10885-pyyaml-upgrade
cleveragents:pr-fix-10931
cleveragents:bugfix/executor-error-details-overwrite-qwen
cleveragents:fix-orchestrator-scaling-32-workers
cleveragents:fix-pr-1107-asgi-uvicorn
cleveragents:feature/m9-timeline-day-99
cleveragents:feat/issue-6369-actor-context-show
cleveragents:improvement/agent-label-compliance
cleveragents:fix-9912-branch
cleveragents:bugfix/10821-fix-tui-keybinding
cleveragents:feat/issue-6450-tui-escape-cascade
cleveragents:bugfix/m8-shell-safety-service-integration
cleveragents:fix/redaction-pattern-exception-handling
cleveragents:bugfix/m8-tui-on-input-changed
cleveragents:fix/action-schema-env-var-exfiltration
cleveragents:feature/spec-timeline-6003
cleveragents:feature/spec-timeline-6008
cleveragents:feature/issue-4746-update-spec-agents-diagnostics-all-9-providers
cleveragents:feat/v3.6.0/gemini-provider
cleveragents:pr/8194
cleveragents:tdd/prompt-input-textarea
cleveragents:feat/v3.6.0/cost-reporting-cli
cleveragents:fix/lsp-transport-security
cleveragents:feat/v3.6.0/semantic-context-strategy
cleveragents:feature/issue-10820-chore-agents-fix-bug-hunt-pool-supervisor-tracking-prefix-auto-bug-pool-to-auto-bug-sup-complete-fix
cleveragents:tdd/mN-registry-thread-safety
cleveragents:fix/v360/remove-acp-module
cleveragents:temp-squash
cleveragents:fix/v360/lsp-runtime-instantiation
cleveragents:feat/690-jsonrpc-routing
cleveragents:feat/v3.6.0-anthropic-gemini-backends
cleveragents:build/agents-system-rewrite
cleveragents:feat/v3.3.0-plan-rollback-cli
cleveragents:feat/v3.3.0-parallel-subplan-scheduler
cleveragents:feature/issue-10846-optimize-benchmark-regression-test-suite
cleveragents:feature/issue-10826-docs-spec-align-checkpoint-trigger-names-and-config-key-path-with-implementation
cleveragents:feature/issue-10744-fix-tui-convert-permissionsscreen-from-static-widget-to-proper-textual-screen-subclass
cleveragents:feature/issue-10794-feat-a2a-implement-a2a-http-transport-for-server-mode
cleveragents:fix/tui-preset-cycling
cleveragents:pr-10820
cleveragents:feature/696-implement-a2a-http-transport-for-server-mode
cleveragents:feature/issue-10792-feat-server-langgraph-platform-remotegraph-integration
cleveragents:feature/issue-1486-fix-v3-7-0-resourcehandler-return-type-1444
cleveragents:feature/issue-1488-fix-v3-7-0-resolve-issue-1432
cleveragents:bugfix/m1-plan-execute-sandbox-root
cleveragents:feature/issue-4663-day-97-schedule-adherence-update
cleveragents:feature/issue-10858-devops-run-linter
cleveragents:docs/milestone-v3.6.0-v3.7.0
cleveragents:feature/issue-10835-add-milestone-based-pr-prioritization
cleveragents:pr-8701-head
cleveragents:fix/7927-apply-phase-dod-gating
cleveragents:fix/sse-formatter-json-rpc-2.0
cleveragents:feat/v3.6.0/scope-chain-assembler-integration
cleveragents:fix/tui-bindings-block-cursor-navigation
cleveragents:fix/v360/compute-actor-impact-exceptions
cleveragents:feat/v360/openrouter-provider
cleveragents:docs/v360/cli-version-info-diagnostics
cleveragents:feat/context-semantic-chunking-strategy
cleveragents:feat/acms-cli-context-show-clear
cleveragents:feature/m7-actor-management-showcase-metadata
cleveragents:feature/m6-4213-resource-skill-showcase
cleveragents:feat/v360/anthropic-gemini-backends
cleveragents:feat/v3.6.0/safety-profile-enforcement
cleveragents:feat/context-dynamic-budget-allocation
cleveragents:refactor/v360/unify-error-handling-cli
cleveragents:fix/v370/tui-materializer-a2a
cleveragents:fix/auto-debug-agent-prompt-injection
cleveragents:refactor/v360/unify-api-naming
cleveragents:test/cli-docstring-example-validation
cleveragents:fix/v360/resource-kind-field
cleveragents:feat/v3.6.0/context-relevance-scoring
cleveragents:fix/v360/plugin-state-executing
cleveragents:fix/v360/lsp-path-traversal-file-reading
cleveragents:feat/acms-semantic-chunking-context-strategy
cleveragents:refactor/v360/unify-service-initialization
cleveragents:bugfix/m3.6.0-lsp-server-dos-message-read-timeout
cleveragents:feat/v360/pluggable-scope-chain-api-v2
cleveragents:docs/v360/actor-management-showcase
cleveragents:docs/v360/actor-removal-impact
cleveragents:docs/v360/align-depth-reduction-devcontainer
cleveragents:tdd/issue-10413-dollar-prefix-shell-mode
cleveragents:fix/issue-10503-session-export-json-stdout
cleveragents:fix/pr-10755
cleveragents:feat/v370/tui-web-mode
cleveragents:feat/v360/plugin-cli-discovery
cleveragents:fix/v360/llm-trace-latency-type
cleveragents:feat/v3.6.0/ollama-mistral-providers
cleveragents:feat/v3.6.0/adaptive-context-selector
cleveragents:feat/tui-v370/persona-registry-merge-v2
cleveragents:feat/v3.6.0/cost-tracker
cleveragents:fix/v360/resource-type-cycle-detection
cleveragents:refactor/auto-guard-1-address-todo-fixme-comments
cleveragents:feat/v3.6.0/pluggable-scope-chain
cleveragents:fix/v360/scope-chain-resolver-registration
cleveragents:test/v360/e2e-a2a-context-management
cleveragents:fix/v360/lsp-env-var-injection
cleveragents:feature/m6-sandbox-correction-invariant-docs
cleveragents:feature/m3-timeline-day97-update
cleveragents:fix/10480-validate-logic-error
cleveragents:feat/acms-cli-context-add
cleveragents:feat/acms-core-pipeline-components
cleveragents:feature/m4652-module-guides
cleveragents:feature/m5-extend-agents-diagnostics-example
cleveragents:feature/m5832-add-unreleased-changelog-entries
cleveragents:docs/add-repo-indexing-showcase
cleveragents:improvement/agent-pr-self-reviewer-blocking-vs-nonblocking
cleveragents:feature/issue-8225-validation-gate-empty-summary
cleveragents:spec/resource-type-yaml-format-canonical-5622
cleveragents:bugfix/m8179-fix-data-integrity-remove-session-rollback-calls-from-projectrepository
cleveragents:feat/v3.6.0/context-policy-strategy-config
cleveragents:test/v3.6.0/a2a-rename-regression-tests
cleveragents:fix/plan-lifecycle-root-decision-type
cleveragents:bugfix/cancel-worktree-cleanup
cleveragents:pr-10586
cleveragents:pr-9215
cleveragents:feat/issue-6357-tui-loading-states
cleveragents:temp-bug2-combined
cleveragents:timeline/day-105-2026-04-15-auto-time-1-v2
cleveragents:docs/consolidated-all-documentation
cleveragents:bugfix/m6-sandbox-reexecute-cleanup
cleveragents:fix/issue-9963-memory-service-timestamp-guards
cleveragents:docs/context-management-deep-dive-v2
cleveragents:docs/context-management-deep-dive
cleveragents:docs/agent-development-guide
cleveragents:feature/10008-file-level-correction-diff
cleveragents:feat/acms-scope-resolution-context-inheritance
cleveragents:docs/a2a-protocol-guide
cleveragents:fix/tui-bindings-reload-settings
cleveragents:docs/tui-user-guide-keybindings
cleveragents:fix/plan-generation-validate-logic
cleveragents:bugfix/issue-10408-dollar-prefix-shell-mode
cleveragents:test/issue-10500-persona-state-reset-tdd
cleveragents:docs/getting-started-tutorial
cleveragents:test/tdd-session-create-suppress-exception
cleveragents:fix/issue-10485-fallback-selector-budget-limits
cleveragents:docs/error-codes-guide
cleveragents:docs/common-tasks-recipes-guide
cleveragents:bugfix/mN-registry-thread-safety
cleveragents:test/migration-runner-sqlite-threading
cleveragents:docs/configuration-reference
cleveragents:pr-10678
cleveragents:pr-10681
cleveragents:test/issue-10510-mcptooladapter-rlock-tdd
cleveragents:feature/tui-screens-directory
cleveragents:fix/issue-10511-suppress-runtimeerror
cleveragents:pr-10676
cleveragents:fix/tui-block-cursor-bindings
cleveragents:pr-10680
cleveragents:test/issue-10502-session-export-json-tdd
cleveragents:fix/issue-10507-sqlite-check-same-thread
cleveragents:docs/installation-setup
cleveragents:test/v3.6.0/scope-chain-integration-tests
cleveragents:fix/v370/loading-throbber-restore
cleveragents:feat/v370/tui-settings-sessions-screens
cleveragents:fix/v370/tui-session-persistence
cleveragents:fix/v360/context-strategy-unification
cleveragents:fix/v370/shell-safety-regex
cleveragents:feat/v370/tui-rebase-merge
cleveragents:feat/v370/tui-complete-squashed
cleveragents:fix/v370/tui-shell-async
cleveragents:feat/v3.6.0/budget-enforcement
cleveragents:refactor/v360/decouple-cli-services
cleveragents:feat/v370/tui-session-persistence
cleveragents:auto-arch-1-spec-module-definitions
cleveragents:docs/v3.6.0-v3.7.0-updates
cleveragents:auto-time/timeline-update-2026-04-18-c3
cleveragents:auto-docs-2/add-changelog-contributing
cleveragents:auto-time/timeline-update-2026-04-18-c2
cleveragents:auto-docs-1/fix-mkdocs-nav-and-links
cleveragents:pr-5968
cleveragents:docs/timeline-day-107-2026-04-17
cleveragents:fix/issue-6323-project-context-show-output
cleveragents:improvement/agent-bug-hunt-pool-supervisor-tracking-prefix
cleveragents:auto-time/update-2026-04-17
cleveragents:docs/auto-docs-8-a2a-rename-documentation
cleveragents:auto-docs-3-v340-v350
cleveragents:docs/timeline-update-2026-04-15
cleveragents:auto-docs/initial-documentation-assessment
cleveragents:feature/m1-initial-documentation
cleveragents:fix/agent-task-list-memory-leak
cleveragents:bugfix/m4-plan-diff-correction-stub
cleveragents:pr-9247
cleveragents:docs/timeline-update-2026-04-17
cleveragents:timeline/day-106-2026-04-17-auto-time-1
cleveragents:fix/quality-gates-click82-compat
cleveragents:auto-arch-14/spec-anonymous-tool-enforcement
cleveragents:fix/issue-6441-session-create-json-output
cleveragents:fix/issue-6331-invariant-add-scope
cleveragents:timeline/day-106-2026-04-16-auto-time-1-v2
cleveragents:spec/auto-arch-23-minor-clarifications
cleveragents:timeline/day-106-2026-04-16-auto-time-2
cleveragents:docs/auto-docs-2-v380-v390
cleveragents:timeline/day-104-2026-04-14-auto-time-1
cleveragents:bugfix/m3-actor-add-v3-schema-validation
cleveragents:timeline/day-106-2026-04-16-auto-time-1
cleveragents:auto-docs/changelog-architecture-readme
cleveragents:spec/auto-arch-21-v350-autonomy-hardening
cleveragents:chore/timeline-day-105-2026-04-15
cleveragents:docs/timeline-update-2026-04-15-auto-time-1
cleveragents:timeline/day-105-2026-04-15-auto-time-1
cleveragents:benchmark-ci
cleveragents:fix/plan-phase-migration-raw-sql-root-plan-id
cleveragents:auto-arch-12/spec-acms-context-tier-hydrator
cleveragents:timeline/day-106-2026-04-15-auto-time-1
cleveragents:feat/invariant-enforcement-strategize
cleveragents:feat/plan-tree-decision-rendering
cleveragents:feat/plan-correct-revert-append-modes
cleveragents:docs/auto-docs-4-fix-conflicts
cleveragents:docs/auto-docs-1-milestone-docs-v3.0.0-v3.1.0
cleveragents:feat/v3.4.0-acms-lifecycle-policy
cleveragents:pr-9220
cleveragents:fix/a2a-facade-optional-param-validation
cleveragents:feat/ci-guard-llm-secrets
cleveragents:pr-9214
cleveragents:feat/v3.3.0-subplan-status-tracking
cleveragents:feat/v3.3.0-merge-conflict-detection
cleveragents:uat/checkpoint-rollback-merge-tests
cleveragents:fix/pr-review-pool-supervisor-prefix-mismatch
cleveragents:feat/v3.3.0-spawn-subplan-step
cleveragents:auto-time-1-day103-cycle1-session6
cleveragents:feat/v3.8.0-agent-card-endpoint
cleveragents:docs/auto-docs-cycle-24-showcase-nav
cleveragents:auto-inf-3-consolidate-behave-fixtures
cleveragents:fix/issue-7663-docs-writer-missing
cleveragents:auto-time-1-day103-cycle2
cleveragents:docs/timeline-day-104-auto-time-1
cleveragents:auto-arch-16/spec-xml-prompt-injection-mitigation
cleveragents:bugfix/m4-invariant-persistence
cleveragents:uat-a2a-facade-tests-v350
cleveragents:bugfix/m3-behave-parallel-failed-chunk-logs
cleveragents:bugfix/7664-automation-tracking-label-requirements
cleveragents:docs/auto-time-1-timeline-update-2026-04-14
cleveragents:docs/auto-docs-1-milestone-v3-updates
cleveragents:fix/issue-6344-plan-execute-rich-output
cleveragents:docs/action-config-schema-api
cleveragents:fix/bug-hunt-supervisor-nonexistent-file-preflight
cleveragents:fix/retry-policy-model-missing-fields
cleveragents:docs/validation-gate-empty-run-guard
cleveragents:auto-arch-15/spec-retry-policy-canonical-fields
cleveragents:docs/lockservice-advisory-locking
cleveragents:docs/changelog-plan-fix-4197
cleveragents:spec/milestone-plan-section
cleveragents:docs/update-changelog-recent-features
cleveragents:fix/test-infra-remove-redundant-python-variable-robot-files
cleveragents:timeline/day-104-2026-04-14-cycle2
cleveragents:fix/bdd-feature-file-tags
cleveragents:auto-arch-13/spec-default-automation-profile
cleveragents:docs/auto-docs-cycle-1-2026-04-12
cleveragents:docs/cycle-1-git-worktree-sandbox
cleveragents:spec/architecture-critical-gap-fixes
cleveragents:docs/timeline-day-104-auto-time-2
cleveragents:auto-arch-1/add-v380-v390-milestone-plan
cleveragents:docs/developer-setup-guide
cleveragents:fix/auto-profile-spec-prose-description
cleveragents:auto-arch-10/spec-tui-a2a-integration-layer
cleveragents:spec/resource-event-types-clarification
cleveragents:auto-docs-4/changelog-and-observability
cleveragents:auto-arch-4/adr-049-layered-boundary-enforcement
cleveragents:docs/a2a-protocol-autonomy-hardening
cleveragents:auto-arch-9/spec-v3.8.0-milestone-plan
cleveragents:docs/auto-docs-3-reference-index
cleveragents:auto-arch-7/spec-apply-git-worktree
cleveragents:docs/timeline-day104-cycle1-auto-time-4
cleveragents:docs/auto-docs-cycle-1-changelog-updates
cleveragents:auto-arch-6/adr-049-spec-restructuring
cleveragents:docs/auto-docs-1-v340-acms-context-management
cleveragents:docs/auto-docs-1-v320-v330-cli-reference
cleveragents:auto-arch-5/v3.9.0-milestone-plan
cleveragents:test/create-scripts
cleveragents:auto-time-1-day104
cleveragents:timeline/day-104-2026-04-14
cleveragents:docs/auto-time-4-day103-cycle5
cleveragents:auto-time-3-day103-cycle4
cleveragents:auto-docs-5-architecture-overview
cleveragents:spec/three-way-merge-strategy-v3.3.0
cleveragents:spec/checkpoint-system-v3.3.0
cleveragents:auto-docs-4-api-docs-update
cleveragents:auto-docs-1-changelog-expansion
cleveragents:spec/invariant-management-system-v3.2.0
cleveragents:pr-8289
cleveragents:spec/plan-correction-engine-v3.2.0
cleveragents:spec/layered-architecture-boundary-policy
cleveragents:spec/tui-materializer-a2a-integration-v3.7.0
cleveragents:spec/decision-recording-system-v3.2.0
cleveragents:docs/auto-docs-1-milestone-overview
cleveragents:pr-7484
cleveragents:pr-4212
cleveragents:auto-arch-3/v3.8.0-milestone-plan
cleveragents:auto-docs-6/troubleshooting-and-config
cleveragents:auto-time-1-day103-session5
cleveragents:auto-docs-5/contributor-guide-and-readme
cleveragents:docs/plan-tree-ulid-examples
cleveragents:docs/m3-spec-clarify-path-datetime-plugin-contracts
cleveragents:docs/auto-docs-cycle-10-diagnostics-ref
cleveragents:auto-docs-3/user-guide-and-architecture
cleveragents:docs/cycle-7-changelog-update
cleveragents:spec/reconciliation-failure-behavior
cleveragents:auto-docs-2/api-documentation
cleveragents:auto-arch-2/adr-053-repositories-decomposition
cleveragents:auto-docs-1/release-notes-v3.0-v3.1
cleveragents:spec/update-validation-attach-project-delete
cleveragents:spec/architecture-cycle2-impl-clarifications
cleveragents:auto-arch-1/adr-049-052-violations
cleveragents:auto-time-1-day103
cleveragents:docs/auto-docs-cycle-13-updates
cleveragents:docs/timeline-day-102-auto-time
cleveragents:timeline/day-103-2026-04-13
cleveragents:spec/arch-invariant-cli-completeness
cleveragents:spec/update-cycle1-validation-attach-project-delete
cleveragents:docs/add-session-management-showcase
cleveragents:spec/arch-sandbox-path-correction-cycle9
cleveragents:spec/architecture-v380-milestone-plan
cleveragents:docs/auto-docs-cycle-12-updates
cleveragents:docs/cycle-1-validation-gate-fix
cleveragents:docs/2026-04-08-unreleased-changelog
cleveragents:docs/auto-docs-cycle-2-2026-04-10
cleveragents:docs/session-4615-2026-04-08-cycle1
cleveragents:feat/issue-6361-shell-safety-service-tui
cleveragents:spec/architecture-cycle-25-new-features
cleveragents:fix/issue-6345-automation-profile-add-output
cleveragents:docs/timeline-day-102-2026-04-12
cleveragents:docs/cycle-2-git-worktree-acms-hydrator
cleveragents:spec/arch-sandbox-cleanup-discovery
cleveragents:docs/timeline-day96-2026-04-08
cleveragents:docs/auto-docs-cycle-11
cleveragents:spec/fix-sandbox-strategy-protocol-name
cleveragents:spec/arch-acms-tier-hydration
cleveragents:fix/v3.4.0/context-settings-defaults
cleveragents:docs/add-example-repl-and-actor-run
cleveragents:docs/auto-docs-cycle-10-updates
cleveragents:docs/session-4-2026-04-08-updates
cleveragents:docs/showcase-all-examples-consolidated
cleveragents:docs/timeline-day-97
cleveragents:docs/acms-context-hydrator-cycle2
cleveragents:docs/add-example-output-format-flags
cleveragents:spec/arch-failfast-cancel-semantics
cleveragents:timeline/day-101-2026-04-11
cleveragents:docs/timeline-day99-2026-04-09-v2
cleveragents:docs/auto-docs-cycle-2-worktree-acms
cleveragents:spec/architecture-v3.8.0-milestone-plan
cleveragents:docs/api-lsp-acms-reference
cleveragents:improvement/agent-bug-hunt-pool-supervisor-yaml-syntax-fix
cleveragents:spec/project-delete-deleted-at-field
cleveragents:spec/architecture-provider-registry-tui-materializer
cleveragents:spec/document-reconciliation-blocked-error-5942
cleveragents:fix/issue-7482-git-log-injection
cleveragents:spec/devcontainer-auto-discovery-schema
cleveragents:feat/issue-6350-conversation-content-pruning
cleveragents:docs/update-module-guides-2026-04-10
cleveragents:timeline/day-100-2026-04-10-auto-time-cycle1
cleveragents:timeline/day-99-2026-04-09-auto-time-v2
cleveragents:docs/cycle-3-module-guides
cleveragents:timeline/day-99-2026-04-09-auto-time
cleveragents:pr-4226
cleveragents:spec/additional-llm-providers-gemini-groq-cohere-together-ollama-mistral
cleveragents:spec/document-context-tier-hydrator-6175
cleveragents:docs/timeline-day99-2026-04-09
cleveragents:spec/invariant-cli-clarifications
cleveragents:docs/add-example-project-init-and-context-management
cleveragents:spec/reconciliation-blocked-error-documentation
cleveragents:spec/fix-invariant-precedence-reference-5861
cleveragents:spec/fix-plan-correct-accepts-plan-id-5558
cleveragents:spec/fix-validation-attach-synopsis-5328
cleveragents:docs/timeline-day-99-cycle-1
cleveragents:docs/timeline-day-99-cycle-2
cleveragents:fix/actor-context-list-regex-arg
cleveragents:docs/timeline-day-99-cycle-3
cleveragents:spec/arch-security-mode-init
cleveragents:docs/auto-docs-cycle-9-updates
cleveragents:fix-resource-fix-resource-remove-to-check-correct-edge-table
cleveragents:feat/issue-6434-tui-env-var-expansion
cleveragents:fix/issue-6321-plan-prompt-timing-field
cleveragents:fix/issue-6322-resource-add-url-flag
cleveragents:feat/issue-6348-sessions-screen
cleveragents:spec/plan-show-command
cleveragents:temp
cleveragents:feat/harden-label-restrictions-1775753628
cleveragents:spec/invariant-reconciliation-failure-behavior
cleveragents:spec/add-reconciliation-failure-behavior-5942
cleveragents:spec/architecture-corrections-cycle3
cleveragents:spec/checkpoint-trigger-names-and-config-key-fix
cleveragents:spec/fix-ai-provider-interface-5801
cleveragents:spec/azure-api-version-default-update
cleveragents:docs/auto-docs-writer-cycle1-labels
cleveragents:spec/fix-resource-type-yaml-format-5622
cleveragents:spec/add-plan-revert-resume-commands-5574
cleveragents:docs/auto-docs-cycle-1-2026-04-09
cleveragents:spec/plan-correct-plan-id-or-decision-id-5558
cleveragents:spec/fix-subgraph-node-actor-ref-field-5427
cleveragents:issue/5284-master-ci-fix
cleveragents:timeline/day-99-2026-04-09-v2
cleveragents:merge-me
cleveragents:docs/session-3377-initial-docs-update
cleveragents:fix/llm-provider-subpackage-exports
cleveragents:spec/arce-acronym-and-tui-keybinding-fixes
cleveragents:spec/architecture-corrections-cycle2
cleveragents:spec/architecture-corrections-cycle1
cleveragents:docs/cycle-1-updates
cleveragents:spec/tui-clarifications-session-export-persona
cleveragents:docs/session-4940-2026-04-08-cycle1
cleveragents:spec/architecture-milestone-plan-v3.2-v3.7
cleveragents:docs/session-4743-2026-04-08-cycle1
cleveragents:docs/timeline-day-98
cleveragents:fix/plan-lifecycle-service-rollback-method
cleveragents:docs/timeline-day98-2026-04-08-v2
cleveragents:docs/add-example-action-and-plan-management
cleveragents:docs/session-2026-04-06-updates
cleveragents:docs/ca-docs-writer-v3.8.1-2026-04-05
cleveragents:fix/session-tell-stub-missing-panels-and-actor-execution
cleveragents:improvement/agent-arch-guard-clone-failure-handling
cleveragents:improvement/agent-test-infra-health-spam-fix-v2
cleveragents:fix-tdd-invert-non-assertion-exceptions
cleveragents:improvement/agent-arch-guard-clone-failure
cleveragents:bugfix/3472-fix-tdd-inversion-logic
cleveragents:bugfix/989-fix-persistence-json-decode-error
cleveragents:improvement/agent-supervisor-tracking-labels-v2
cleveragents:docs/timeline-day95-v2
cleveragents:docs/timeline-day95-final
cleveragents:docs/update-lsp-api-and-changelog
cleveragents:fix/lsp-resource-handler-module-missing
cleveragents:docs/timeline-day95-final-2026-04-05
cleveragents:fix/a2a-plan-correct-rollback-wiring
cleveragents:docs/add-lsp-api-and-changelog-2026-04-05
cleveragents:fix/tool-registry-validation-type-discriminator
cleveragents:docs/v3.7.0-documentation-update
cleveragents:docs/ca-docs-writer-2026-04-05-cycle2
cleveragents:fix/invariant-set-merge-action-scope
cleveragents:docs/unreleased-feature-docs
cleveragents:fix/concurrency-cost-tracker-record-usage-race-condition
cleveragents:improvement/agent-ca-test-infra-improver-failure-handling
cleveragents:docs/update-changelog-mcp-plan-ci-2026-04-05
cleveragents:improvement/agent-pr-reviewer-milestone-prioritization
cleveragents:docs/timeline-day95-refresh-2026-04-05
cleveragents:improvement/agent-mandatory-labels-tracking-issues
cleveragents:docs/api-domain-providers-changelog-2026-04-05
cleveragents:docs/ca-docs-writer-2026-04-05
cleveragents:docs/timeline-day95-refresh
cleveragents:fix/skill-add-include-validation
cleveragents:docs/timeline-day-95-2026-04-05-update3
cleveragents:docs/timeline-day-95-2026-04-05-update2
cleveragents:docs/ci-incident-runbook-2597
cleveragents:improvement/agent-ca-test-infra-improver-worker-api-mode
cleveragents:docs/shell-safety-api-and-readme-highlights
cleveragents:docs/timeline-day-55-2026-04-04-v2
cleveragents:docs/timeline-day-55-2026-04-04
cleveragents:docs/timeline-day54-update3
cleveragents:improvement/agent-ca-test-infra-improver-fixes
cleveragents:spec/restructure-monolithic-to-split
cleveragents:docs/timeline-day54-update-v2
cleveragents:docs/timeline-day54-update
cleveragents:fix-agents
cleveragents:docs/shell-safety-and-domain-base-model
cleveragents:fix/1452-impl
cleveragents:fix/1473-plan-cancel
cleveragents:fix/1425-test
cleveragents:fix/1426-config
cleveragents:fix/1421-perf
cleveragents:fix/1424-impl
cleveragents:test/int-wf16-devcontainer
cleveragents:feature/m8-tui-persona-export
cleveragents:feature/m7-post-resource-equivalence
cleveragents:test/e2e-m4-acceptance
cleveragents:feature/m6-tantivy-backend
cleveragents:feature/m6-estimation
cleveragents:feature/m6-estimation-report-model
cleveragents:feature/observability-prometheus-audit
cleveragents:feat/server-auth-namespace
cleveragents:feature/m8-session-editing
cleveragents:feature/llm-actor-subplan-wiring
cleveragents:feature/m8-tui-first-run-actor-selection
cleveragents:feature/m8-tui-conversation-block-catalog
cleveragents:feature/m8-tui-settings-screen
cleveragents:feature/m7-e2e-porting
cleveragents:feature/m6-estimation-historical-stats
cleveragents:feature/m8-tui-persona-export-import
cleveragents:feature/m8-tui-sessions-screen
cleveragents:feature/m7-graph-backend
cleveragents:feature/m8-tui-block-context-menu
cleveragents:feature/m8-tui-tool-call-expand
cleveragents:feature/m4-missing-builtin-tools
cleveragents:docs/v3.7.0-release-docs
cleveragents:feature/m8-tui-session-export
cleveragents:test/e2e-wf15-disaster-recovery
cleveragents:test/e2e-wf03-refactoring
cleveragents:test/e2e-m3-acceptance
cleveragents:feature/m8-tui-prompt-history
cleveragents:feature/m8-tui-actor-thought-block-rendering
cleveragents:bugfix/m6-build-hierarchy-child-ids
cleveragents:feature/resource-inheritance-wiring
cleveragents:test/e2e-wf09-session
cleveragents:test/e2e-wf06-doc-generation
cleveragents:test/e2e-wf08-cloud-infra
cleveragents:test/e2e-wf02-test-generation
cleveragents:test/e2e-wf13-custom-profile
cleveragents:test/e2e-wf11-graph-actor
cleveragents:test/e2e-wf01-hello-world
cleveragents:test/int-wf17-explicit-container
cleveragents:test/int-wf12-hierarchical
cleveragents:test/int-wf15-disaster-recovery
cleveragents:test/int-wf13-custom-profile
cleveragents:test/int-wf03-refactoring
cleveragents:test/int-wf11-graph-actor
cleveragents:test/int-wf10-batch
cleveragents:test/int-wf09-session
cleveragents:feature/m3-tdd-issue-consistency-gate
cleveragents:feature/m3-invariant-enforcement-strategize
cleveragents:test/int-wf18-container-clone
cleveragents:test/int-wf01-hello-world
cleveragents:feature/m6-diagnostic-dashboard-health-categories
cleveragents:feature/m6-cli-polish
cleveragents:fix/e2e-db-isolation
cleveragents:feature/m7-post-tui
cleveragents:feature/m9-asgi-endpoint
cleveragents:feature/m7-post-server
cleveragents:tdd/m7-audit-session-race
cleveragents:tdd/m3-skill-add-regression
cleveragents:feature/m9-remote-repos
cleveragents:feature/fs-mount-file-types
cleveragents:test/e2e-m1-acceptance
cleveragents:test/e2e-m2-acceptance
cleveragents:eugen.thaci-patch-3
cleveragents:eugen.thaci-patch-2
cleveragents:eugen.thaci-patch-1
cleveragents:aditya-fix-latest
cleveragents:feature/m4-secret-masking-llm-context
cleveragents:aditya-fix
cleveragents:refactor/m3-replace-mktemp
cleveragents:refactor/m3-remove-unittest-mock-integration
cleveragents:refactor/m3-remove-robot-mock-imports
cleveragents:refactor/m3-remove-mock-llm-integration
cleveragents:docs/improved-menu-adr
cleveragents:feature/m7-post-auth
cleveragents:feature/m3-fix-resource-bootstrap
cleveragents:feature/post-safety-profile-tests
cleveragents:integration/batch-2026-03-02
cleveragents:feat/slipcover
cleveragents:docs/safety-profile-spec-composition
cleveragents:integrate/freemo-batch-1
cleveragents:feature/m4-error-recovery
cleveragents:feature/m4-security-template
cleveragents:feature/m3-validation-pipeline
cleveragents:develop-aditya-2
cleveragents:feature/m3-diff-review
cleveragents:feature/m3-validation-apply
cleveragents:feature/m6-acp-stubs
cleveragents:feature/m4-correction-flows
cleveragents:feature/m1-plan-execute-runtime
cleveragents:feature/m4-security-exceptions
cleveragents:feature/m4-definition-of-done
cleveragents:feature/m4-correction-model
cleveragents:feature/m1-apply-pipeline
cleveragents:feature/m5-automation-profiles
cleveragents:feature/m2-lsp-stubs
cleveragents:feature/m3-invariants
cleveragents:feature/m1-actor-runtime
cleveragents:feature/docs-v2-restore
cleveragents:feature/m6-perf-scale
cleveragents:feature/m6-validation-edge
cleveragents:feature/m3-session-cli
cleveragents:feature/m1-persistence-tests-robot
cleveragents:feature/m3-config-cli
cleveragents:feature/m1-cli-tests-robot
cleveragents:feature/m5-subplan-tests
cleveragents:feature/m6-review-playbook
cleveragents:feature/aditya-m3-actor-loader
cleveragents:feature/m3-skill-protocol
cleveragents:feature/m4-automation-legacy-cleanup
cleveragents:feature/m3-change-model
cleveragents:feature/m3-skill-git
cleveragents:feature/m3-skill-registry
cleveragents:feature/m4-security-eval
cleveragents:fix/robot-tests
cleveragents:feature/m3-actor-registry
cleveragents:feature/m3-tool-cli
cleveragents:feature/m4-automation-profiles-cli
cleveragents:feature/m2-resource-cli-extensions
cleveragents:feature/m3-actor-loader
cleveragents:feature/m3-tool-domain-robot
cleveragents:feature/m3-skill-domain-robot
cleveragents:feature/m3-skill-cli
cleveragents:feature/m1-resource-db-robot-tests
cleveragents:feature/m3-session-domain-robot
cleveragents:feature/m1-persistence-tests
cleveragents:feature/m1-cli-tests
cleveragents:ten-branches-backup
cleveragents:feature/m3-skill-schema
cleveragents:feature/m3-session-persistence
cleveragents:feature/automation-profiles-and-resource-dag
cleveragents:feature/m1-plan-repo
cleveragents:feature/m1-db-plan-phase-rebaseline
cleveragents:feat/B4-sandbox
cleveragents:feat/B2-cli-wiring
cleveragents:feat/B5-project-persistence
cleveragents:feat/B1-project-data-models
cleveragents:feat/b1-data-models
cleveragents:feat-repo-manager-and-sourcegraph-support
cleveragents:feat/actor-schema
cleveragents:fix/component-isolation-security-fix
cleveragents:feat/ontology-agent
cleveragents:fix/error-handling-security-fix
cleveragents:fix/concurrency-security-fix
cleveragents:fix/serialization-security-fix
cleveragents:fix/server-side-request-forgery-security-fix
cleveragents:fix/file-system-security
cleveragents:fix/template-injection-fix
cleveragents:fix/data-injection-fix
cleveragents:tests/unit-tests
cleveragents:latest/poetry-generator
cleveragents:poetry-generator
cleveragents:config/contract-metadata-extractor
cleveragents:docs/readme-yaml-syntax
cleveragents:config/memory-yaml
cleveragents:fix/double-response
cleveragents:brent-additions
cleveragents:intel_2_demo
No reviewers
Labels
Clear labels
auto/needs-reevaluation
Controller deferred this PR; awaiting Phase 6+ scope-evaluator or operator re-enablement.
controller-managed
Auto-agents controller manages this PR/issue (see tools/controller/deploy/RUNBOOK.md). Remove this label to abandon controller management.
auto/blocked-by-deps
PR blocked by an open issue dependency. Operator must close the dep (or remove the dependency link) before the merge driver can act. Auto-cleared by merge_drive when no open deps remain.
auto/ci-timeout
Most recent merge cycle hit CI timeout. Driver excludes this PR while last merge_cycle row is < 30 min old; label persists thereafter as visible history.
auto/claimed-implementer
Currently being processed by an implementer worker.
auto/claimed-merge
Currently being processed by the merge driver.
auto/claimed-reviewer
Currently being processed by a reviewer worker.
auto/driver-down
Merge driver heartbeat stale; pipeline halted. Closed automatically on next clean tick.
auto/invariant-violation
Detected master commit violating the strict merge invariant. Tracked as an issue (not a PR label); kept here for label completeness.
auto/last-attempt-tier-0
In-cycle escalation: most recent attempt ran at the Tier 0 slot (`tier-0`). Slot's model defined in .opencode/models/tiers.yaml.
auto/last-attempt-tier-1
In-cycle escalation: most recent attempt ran at the Tier 1 slot (`tier-1`). Slot's model defined in .opencode/models/tiers.yaml.
auto/last-attempt-tier-2
In-cycle escalation: most recent attempt ran at the Tier 2 slot (`tier-2`). Slot's model defined in .opencode/models/tiers.yaml. Gated behind IMPLEMENTER_ESCALATION_TIER2_ENABLED.
auto/last-attempt-tier-min
In-cycle escalation: most recent attempt ran at the Tier -1 slot (`tier-min`). Slot's model defined in .opencode/models/tiers.yaml. Suffix is ``-min`` (not ``--1``) so the Forgejo UI reads naturally.
Automation Tracking
Tracking issues used by the AI Automation system for agents to communicate and report.
auto/needs-conflict-resolution
Rebase conflict needs LLM conflict-resolver.
auto/needs-implementer
Failing CI needs implementer attention.
auto/postmortem
Documenting a driver incident or rollback.
auto/ready-to-merge
Reviewer has APPROVED this PR and no later REQUEST_CHANGES is outstanding. The merge driver requires this label to even consider a PR for merging. Set by the reviewer worker on APPROVE; cleared on REQUEST_CHANGES.
auto/restart-throttled
Train repeatedly lost master-tempo races. Driver excludes via merge_cycle until cooldown elapses; label persists as visible history.
auto/revert
Revert PR backing out an invariant violation. Fast-tracked through the merge driver.
auto/sentinel
Sentinel PR duplicated from upstream into a personal fork by tools/duplicate_prs_to_fork.py for pipeline testing. Lives only in the fork; the canonical pipeline never sees it.
auto/stale-inactivity
No implementer activity for N days. Flagged for human review. Auto-cleared on next push to head branch.
auto/unstable
Repeatedly fails on current master (>= 3 ci-fail-on-rebased-sha releases in 12 h). Excluded from driver until human triage.
Blocked
A ticket in a blocked state and unable to complete until some other task is completed first.
Bounty
$100
A bounty of $100 for any open-source contributor who provides a MR that solves this issue
Bounty
$1000
A bounty of $1000 for any open-source contributor who provides a MR that solves this issue
Bounty
$10000
A bounty of $10000 for any open-source contributor who provides a MR that solves this issue
Bounty
$20
A bounty of $20 for any open-source contributor who provides a MR that solves this issue
Bounty
$2000
A bounty of $2000 for any open-source contributor who provides a MR that solves this issue
Bounty
$250
A bounty of $250 for any open-source contributor who provides a MR that solves this issue
Bounty
$50
A bounty of $50 for any open-source contributor who provides a MR that solves this issue
Bounty
$500
A bounty of $500 for any open-source contributor who provides a MR that solves this issue
Bounty
$5000
A bounty of $5000 for any open-source contributor who provides a MR that solves this issue
Bounty
$750
A bounty of $750 for any open-source contributor who provides a MR that solves this issue
MoSCoW
Could have
Could have feature in order to satisfy the epic/legendary.
MoSCoW
Must have
Must have feature in order to satisfy the epic/legendary.
MoSCoW
Should have
Should have feature in order to satisfy the epic/legendary.
Needs Feedback
There are questions in the ticket that can not be completed until the project owner provides clarity.
Points
1
1 man-hours worth of work for an expert with no learning curve.
Points
13
13 man-hours worth of work for an expert with no learning curve.
Points
2
2 man-hours worth of work for an expert with no learning curve.
Points
21
21 man-hours worth of work for an expert with no learning curve.
Points
3
3 man-hours worth of work for an expert with no learning curve.
Points
34
34 man-hours worth of work for an expert with no learning curve.
Points
5
5 man-hours worth of work for an expert with no learning curve.
Points
55
55 man-hours worth of work for an expert with no learning curve.
Points
8
8 man-hours worth of work for an expert with no learning curve.
Points
88
88 man-hours worth of work for an expert with no learning curve.
Priority
Backlog
This ticket has backlogged priority and is not to be worked on yet
Priority
CI Blocker
Critical priority issue that blocks CI/CD pipeline and prevents PR merges
Priority
Critical
The priority is critical
Priority
High
The priority is high
Priority
Low
The priority is low
Priority
Medium
The priority is medium
Signed-off: Owner
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
Signed-off: Scrum Master
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
Signed-off: Tech Lead
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
Spike
A ticket for learning a tool or technology that is needed to be able to do future planning and design.
State
Completed
The ticket has been fully implemented, completed, and merged with the source code. This label should only be applied once a ticket is closed.
State
Duplicate
A ticket that represents the same content as an existing ticket.
State
In Progress
A ticket that is actively being developed.
State
In Review
A ticket that has had some code completed to implement but is waiting to pass peer review and is not yet merged in.
State
Paused
This ticket's work started but wasn't finished. It's on hold (likely in a feature branch) and will be resumed later, either due to a blocker or a delay.
State
Unverified
All new tickets start in this state. A developer may set it to show the ticket is unverified. This means we haven't agreed to work on it. It will either move to a verified state or be closed as wontdo.
State
Verified
The issue has been verified by a developer as legitimate. It will be worked on and verified tickets are now considered part of the backlog.
State
Wont Do
This ticket has been decided it wont be done. This may mean the bug has been determined to not be real (cant verify) or the feature is one we have decided we dont want to adopt.
Type
Automation
Any edits or discussion about the AI automated coding system.
Type
Bug
Something that doesnt work as intended.
Type
Discussion
Anytime a ticket represents a discussion about a subject and doesnt fall into one of the other categories.
Type
Documentation
An error or improvement needed in the documentation.
Type
Epic
Any first tier epic. That is, an epic which contains only issues as children and will not have sub-epics.
Type
Feature
Some new functionality not present.
Type
Legendary
A type of Epic which will contain other Epics.
Type
Refactor
A code change that restructures existing code without changing its external behavior.
Type
Support
Someone needs help using the project.
Type
Task
A generic task that doesnt fit into the other type categories.
Type
Testing
Work exclusively focusing on fixing or expanding testing.
No labels
auto/needs-reevaluation
controller-managed
auto/blocked-by-deps
auto/ci-timeout
auto/claimed-implementer
auto/claimed-merge
auto/claimed-reviewer
auto/driver-down
auto/invariant-violation
auto/last-attempt-tier-0
auto/last-attempt-tier-1
auto/last-attempt-tier-2
auto/last-attempt-tier-min
Automation Tracking
auto/needs-conflict-resolution
auto/needs-implementer
auto/postmortem
auto/ready-to-merge
auto/restart-throttled
auto/revert
auto/sentinel
auto/stale-inactivity
auto/unstable
Blocked
Bounty
$100
Bounty
$1000
Bounty
$10000
Bounty
$20
Bounty
$2000
Bounty
$250
Bounty
$50
Bounty
$500
Bounty
$5000
Bounty
$750
MoSCoW
Could have
MoSCoW
Must have
MoSCoW
Should have
Needs Feedback
Points
1
Points
13
Points
2
Points
21
Points
3
Points
34
Points
5
Points
55
Points
8
Points
88
Priority
Backlog
Priority
CI Blocker
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Signed-off: Owner
Signed-off: Scrum Master
Signed-off: Tech Lead
Spike
State
Completed
State
Duplicate
State
In Progress
State
In Review
State
Paused
State
Unverified
State
Verified
State
Wont Do
Type
Automation
Type
Bug
Type
Discussion
Type
Documentation
Type
Epic
Type
Feature
Type
Legendary
Type
Refactor
Type
Support
Type
Task
Type
Testing
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
6 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Blocks
#648 TDD: Write failing test for #647 — Container.resolve() crash in plan tree/explain/correct
cleveragents/cleveragents-core
Reference
cleveragents/cleveragents-core!670
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "tdd/container-resolve-crash"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Container.resolve()crash path inplan tree,plan explain, andplan correct).get_container()MagicMock masking).@tdd_bugand@tdd_bug_647.Important Timeline Note
Bug #647 was fixed on
masterbefore this PR landed on the branch.Because of that, these tests now run as post-fix regression guards on current branch state.
@tdd_expected_failis intentionally absent in current code.@tdd_expected_failnow would invert passing behavior and fail CI.Key Changes
features/container_resolve_crash.featurefeatures/steps/container_resolve_crash_steps.pyrobot/container_resolve_crash.robotrc == 2failure handling for unexpected errors.robot/helper_container_resolve_crash.py_run_and_verify(...).run_cli) and real settings.Collateral Stabilization Changes
robot/helper_e2e_common.pyOPENAI_API_KEYinjection.robot/helper_m1_e2e_verification.pysrc/cleveragents/config/settings.pySettings.reset()helper for safe singleton reset in tests.Testing (Targeted)
nox -s unit_tests-> passednox -s integration_tests-> passednox -s coverage_report-> passednox -s format-> passednox -s lint-> passedCloses #648
Review: Request Changes
The PR correctly reproduces bug #647 using a real DI container (not MagicMock), which is the core goal. The test structure (feature file + step definitions + robot tests + helper) follows the project's conventions. However, there are several issues that should be addressed before merge.
1. Dead Code: Unused Module-Level ULIDs (High)
File:
features/steps/container_resolve_crash_steps.py:28-30These three ULIDs are generated at import time but never referenced anywhere. The actual decision IDs come from
decision_svc.record_decision()return values and are stored oncontext.cr647_root_id,context.cr647_child_id, andcontext.cr647_grandchild_id(lines 131-133). Only_PLAN_ID(line 27) is actually used.Fix: Remove
_ROOT_ID,_CHILD_ID,_GRANDCHILD_ID.2. Branch Naming Convention Violation (High)
The branch is
tdd/container-resolve-crash. Per CONTRIBUTING.md (Bug Fix Workflow > Branch Naming):This should be
tdd/m3-container-resolve-crash. Note the corresponding bug #647 usesbugfix/m3-container-resolve(with milestone prefix), so the pair is inconsistent. The ticket #648 metadata also specifies the non-compliant name, so both need updating.Fix: Rename branch to
tdd/m3-container-resolve-crashand update ticket metadata.3. Robot Tests Missing stdout/stderr Logging (Medium)
File:
robot/container_resolve_crash.robot:23-41The test cases do not log
${result.stdout}or${result.stderr}before assertions. The established convention in peer files (e.g.,m3_e2e_verification.robotand ~95 other robot files) is:This makes debugging significantly easier when tests fail.
Fix: Add
Logstatements for both stdout and stderr before theShould Be Equal/Should Containassertions in each test case.4. No Resource Cleanup in Robot Helper (Medium)
File:
robot/helper_container_resolve_crash.py_setup_decisions()setsos.environ["CLEVERAGENTS_DATABASE_URL"](line 86) and populates theMEMORY_ENGINEScache but never cleans up. The BDD step file correctly usescontext.add_cleanup()(lines 140-143) for this purpose. Each subcommand function should clean up after itself.Fix: Wrap subcommand logic in try/finally that removes the env var and calls
reset_container(), or add a_cleanup()helper called at the end of each subcommand.5. Global Mutable State in Robot Helper (Medium)
File:
robot/helper_container_resolve_crash.py:55-57,88These are mutated via
globalkeyword inside_setup_decisions(). While functionally harmless (each subcommand runs as a separate process), this is a code smell that makes the code harder to follow and test.Fix: Have
_setup_decisions()return aNamedTupleor dataclass with the IDs, and pass them to the subcommand functions.6. Robot Helper Variable Naming (Low)
File:
robot/container_resolve_crash.robot:19Most robot files use
${HELPER}with${CURDIR}prefix (e.g.,${HELPER} ${CURDIR}/helper_container_resolve_crash.py). This file uses a different variable name and a relative path without${CURDIR}.Fix: Use
${HELPER} ${CURDIR}/helper_container_resolve_crash.pyfor consistency.7. Note: Assertion Direction Compromise (Non-blocking)
The BDD scenarios and Robot helpers assert buggy behavior (checking for
AttributeErroraboutresolve) rather than correct behavior (command succeeds). CONTRIBUTING.md's TDD Bug Test Tags example shows asserting correct behavior, with the@tdd_expected_failtag inverting the result.This is a known compromise because the
@tdd_expected_failhandler is not yet implemented (#627/#628). Asserting correct behavior today would fail CI with no inversion mechanism. The current approach keeps CI green.Request: Add a brief code comment in the feature file and robot helper noting this compromise, so the bug fix developer (#647) and handler implementer (#627/#628) know the assertions need rewriting when either of those lands. For example:
Acceptance Criteria Check
@tdd_bug @tdd_bug_647 @tdd_expected_failAttributeErroronresolve()@ -0,0 +14,4 @@@tdd_expected_failScenario: plan tree command crashes with container.resolve()When cr647- I invoke the plan tree CLI command with a real containerNote: These assertions check for buggy behavior (AttributeError) rather than correct behavior (command succeeds), which is inverted from the CONTRIBUTING.md TDD pattern. This is an acceptable compromise since the
@tdd_expected_failhandler (#627/#628) is not yet implemented. Please add a comment noting this, so the bug fix developer and handler implementer know the assertions need rewriting later.@ -0,0 +13,4 @@from __future__ import annotationsimport osfrom typing import TYPE_CHECKINGDead code:
_ROOT_ID,_CHILD_ID,_GRANDCHILD_IDare generated here but never referenced. The actual decision IDs come fromdecision_svc.record_decision()return values stored on context (lines 131-133). Only_PLAN_IDis used. Remove the three unused constants.@ -0,0 +16,4 @@*** Variables ***${HELPER_SCRIPT} robot/helper_container_resolve_crash.pyConvention: most robot files use
${HELPER} ${CURDIR}/helper_container_resolve_crash.py(with${CURDIR}prefix and the variable name${HELPER}). Using a relative path without${CURDIR}may break if the working directory changes.@ -0,0 +21,4 @@Plan Tree Command Crashes With Container.resolve()[Documentation] TDD test: plan tree calls container.resolve() which doesn't exist[Tags] tdd_bug tdd_bug_647 tdd_expected_fail${result}= Run Process ${PYTHON} ${HELPER_SCRIPT} plan-tree-crash cwd=${WORKSPACE} timeout=120sMissing
Log ${result.stdout}andLog ${result.stderr}before assertions. The established convention in peer files (e.g.,m3_e2e_verification.robot) logs both for debuggability.@ -0,0 +53,4 @@_CHILD_ID: str = ""_GRANDCHILD_ID: str = ""Global mutable state: consider having
_setup_decisions()return a NamedTuple/dataclass with the IDs instead of mutating module-level globals via theglobalkeyword.@ -0,0 +83,4 @@# Reset container to ensure clean statereset_container()# Create UnitOfWork and initialize databaseNo cleanup:
os.environ["CLEVERAGENTS_DATABASE_URL"]is set here but never removed. The BDD step file handles this correctly withcontext.add_cleanup(). Wrap subcommand logic in try/finally that callsreset_container()and removes the env var.Applied all review feedback from hurui200320: - Remove dead code: unused _ROOT_ID, _CHILD_ID, _GRANDCHILD_ID constants - Add Log statements to Robot tests for stdout/stderr debugging - Refactor global mutable state to use DecisionIDs NamedTuple pattern - Add cleanup function with try/finally blocks in Robot helper - Fix Robot variable naming: ${HELPER_SCRIPT} -> ${HELPER} with ${CURDIR} - Add comments explaining assertion direction compromise (no @tdd_expected_fail handler yet) All tests passing: - 3 Behave BDD scenarios pass - 3 Robot Framework tests pass - Linting passes (ruff) ISSUES CLOSED: #648Review Response #57760 - Issue #648
Thank you @hurui200320 for the thorough review. All actionable items have been addressed.
Summary of Fixes
_ROOT_ID,_CHILD_ID,_GRANDCHILD_IDconstants from step fileLog ${result.stdout}andLog ${result.stderr}to all 3 Robot tests_cleanup()function with try/finally blocks in all subcommandsDecisionIDsNamedTuple pattern, removedglobalkeyword${HELPER_SCRIPT}→${HELPER}with${CURDIR}prefixFile Changes
features/container_resolve_crash.featurefeatures/steps/container_resolve_crash_steps.pyrobot/container_resolve_crash.robotrobot/helper_container_resolve_crash.pyTest Results ✅
Ready for Merge
All technical issues resolved. Code quality and test coverage maintained.
Code Review Report -- PR #670 (TDD: Container.resolve() crash)
Reviewed: Commits
2927f22and5df4330by Aditya Chhabra on branchtdd/container-resolve-crashScope: Test coverage, test flaws, bug detection, performance, security, spec/process compliance
Method: 3 full review cycles across all categories; findings deduplicated and consolidated below
Reference: Issue #648, Bug #647,
docs/specification.md,CONTRIBUTING.mdTDD Bug Fix WorkflowThe PR correctly identifies and reproduces bug #647 using a real DI container instead of MagicMock, and the previous review by @hurui200320 was properly addressed. However, three additional review cycles reveal issues -- most notably latent bugs that will surface the moment bug #647 is fixed and the tests need to serve as regression guards.
Summary Table
MEMORY_ENGINEScache not cleared -- cross-scenario data contaminationisinstancecheck -- assertion accepts wrong exception types_PLAN_IDshared across scenarios, compounds finding #1tdd/container-resolve-crashviolatestdd/mN-conventionP1 -- High Severity (Must Fix)
1.
MEMORY_ENGINEScache not cleared between Behave scenariosFiles:
features/steps/container_resolve_crash_steps.py:141-143The cleanup function resets the container and pops the env var, but does not clear the
MEMORY_ENGINESdict incleveragents.infrastructure.database.engine_cache. Perunit_of_work.py:68-78,UnitOfWork("sqlite:///:memory:")caches its engine inMEMORY_ENGINES["sqlite:///:memory:"]. When the BackgroundGivenstep runs for a subsequent scenario:reset_container()sets_container = None-- but the cached engine persistsUnitOfWork("sqlite:///:memory:")at line 63 reuses the cached engineuow.init_database()callsBase.metadata.create_all()which is idempotent (tables already exist)decision_svc.record_decision()adds 3 new decisions into the same in-memory DBCombined with the shared
_PLAN_ID(finding #5), scenario 2 sees 6 decisions under the same plan, and scenario 3 sees 9. This doesn't affect the current crash tests (crash occurs before DB access), but becomes a data corruption bug the moment bug #647 is fixed and the tests run as regression guards.Fix: Add engine cache cleanup to the cleanup function:
Note: The Robot helper (
helper_container_resolve_crash.py:78-83) has the same gap, but each Robot test is a separate process, so the cache is naturally cleared. Still worth adding for consistency.2. Assertion accepts wrong exception types -- no
isinstancecheckFiles:
features/steps/container_resolve_crash_steps.py:262,robot/helper_container_resolve_crash.py:224-226, 279-281, 339-341The assertion logic is:
str(result.exception)for anAttributeErrorreturns only the message (e.g.,"'Container' object has no attribute 'resolve'"), not the type name"AttributeError". So the"attributeerror"branch will almost always fail on the exception string alone. The test falls through to"attribute" in combined.lower(), which is dangerously broad.Any exception whose message contains both "resolve" and "attribute" would pass -- for example:
TypeError("cannot resolve the attribute binding")KeyError("attribute_resolve")RuntimeError("Failed to resolve attribute from registry")Fix: Add an explicit type check as the primary assertion:
3. Assertions verify bug behavior instead of correct behavior
Files:
features/container_resolve_crash.feature:20-33,features/steps/container_resolve_crash_steps.py:232-265The CONTRIBUTING.md TDD Bug Test Tags section (lines 1192-1208) provides an explicit example:
The
@tdd_expected_failtag inverts the result: the test passes CI because the assertion fails (proving the bug exists). When the fix lands, removing@tdd_expected_failmakes the test pass normally.This PR's tests instead assert bug behavior directly (
Then the command should fail with AttributeError on resolve). The feature file comment (lines 12-15) acknowledges this is because the@tdd_expected_failhandler (#627/#628) is not yet implemented.Impact: This creates a two-step problem for the bug #647 fixer:
Recommendation (non-blocking but important): Add a comment block in the step file showing the intended post-fix assertion, so the bug fixer has a clear template. For example:
P2 -- Medium Severity (Should Fix)
4. Error source not verified in assertion
Files:
features/steps/container_resolve_crash_steps.py:257-265,robot/helper_container_resolve_crash.py:214-231The acceptance criteria in issue #648 specifies:
But the assertions only check for "resolve" and "attribute" in the error string. They don't verify that the error originates from the
Container/DynamicContainerclass. If a future code change causes a different object to raise anAttributeErrorabout "resolve" (e.g., a resolver service), the test would pass incorrectly.Fix: Add a check for the container class name:
5. Module-level
_PLAN_IDshared across all scenariosFiles:
features/steps/container_resolve_crash_steps.py:28,robot/helper_container_resolve_crash.py:56_PLAN_ID = str(ULID())is computed once at import time and reused across all three Behave scenarios. Combined with finding #1, all scenarios seed decisions under the same plan ID into the same (uncleaned) in-memory database, causing cumulative data contamination.Fix: Generate the plan ID per-scenario inside the
Givenstep:6. Branch naming convention violation
Already flagged by @hurui200320 in round 1. The branch should be
tdd/m3-container-resolve-crashper CONTRIBUTING.md line 1117. Response was "Source branch immutable in Forgejo after PR creation." While technically branches can be renamed (new branch + new PR), this is acknowledged as a process gap. Noting for completeness.P3 -- Low Severity / Informational (Nit)
7. Module-level heavy imports in Robot helper
File:
robot/helper_container_resolve_crash.py:41-52All heavy imports (
DecisionService,plan_app,Settings, domain models,UnitOfWork) are at module level. The Behave steps file correctly defers these to function bodies (lines 43-52, 161, 180, 205). If any import fails, the helper exits with an opaqueImportErrorinstead of a clear test failure.Fix: Move lines 44-52 into
_setup_decisions()and the individual test functions.8. Elaborate decision tree setup is more than needed
Files:
features/steps/container_resolve_crash_steps.py:74-129,robot/helper_container_resolve_crash.py:117-172The three-level decision tree with full
ContextSnapshotobjects (~80 lines per file) is elaborate for a crash reproduction test. The crash occurs atcontainer.resolve(DecisionService)before any decision data is accessed. A single decision (or even zero decisions) would suffice. The elaborate setup adds maintenance burden without providing value for the current test scope.Note: This becomes relevant when the test transitions to a regression guard post-fix, but at that point the assertions will need rewriting anyway (finding #3).
9. Robot test timeout of 120s is excessive
File:
robot/container_resolve_crash.robot:29, 39, 49The tests reproduce a crash that occurs immediately when the CLI command starts. A 120-second timeout means a hanging test takes 2 minutes to detect. 30s would be more appropriate and consistent with the expected execution time.
10. No ASV benchmarks
CONTRIBUTING.md says "Include ASV benchmarks for performance-sensitive code." Other PRs in this repo (including TDD and bug fix PRs) include ASV benchmarks. This PR doesn't have any. However, crash reproduction tests are arguably not performance-sensitive, so this is a judgment call.
Acceptance Criteria Status
@tdd_bug @tdd_bug_647 @tdd_expected_failAttributeErroronresolve()Conclusion
The PR achieves its primary goal of reproducing bug #647 with a real container. However, three high-severity issues (#1, #2, #3) should be addressed before merge:
Requesting changes for P1 items. P2/P3 items are recommended but not blocking.
@ -0,0 +25,4 @@cli_runner = CliRunner()_PLAN_ID = str(ULID())P2-5: Module-level
_PLAN_IDshared across all scenarios.This ULID is generated once at import time and reused by all three scenarios. Combined with the MEMORY_ENGINES cache issue (#1), decisions accumulate under the same plan ID across scenarios.
Fix: Generate per-scenario inside the
Givenstep:@ -0,0 +138,4 @@context.cr647_container = get_container()# Store cleanup handlerdef cleanup():P1-1: MEMORY_ENGINES cache not cleared.
The cleanup removes the env var and resets the container, but does not clear
MEMORY_ENGINES["sqlite:///:memory:"]fromengine_cache.py. SinceUnitOfWorkreuses the cached engine (unit_of_work.py:68-78), the in-memory SQLite database persists across scenarios. Combined with the shared_PLAN_IDat line 28, each subsequent scenario sees cumulative decision data (3, 6, 9 decisions).This is currently masked because the crash occurs before DB access, but becomes a data corruption bug when #647 is fixed.
Fix:
@ -0,0 +259,4 @@f"Exception: {exception_str}\nOutput: {output_str}")assert "attributeerror" in combined.lower() or "attribute" in combined.lower(), (P1-2: Assertion accepts wrong exception types.
str(result.exception)forAttributeErrorreturns only the message (e.g.,"'Container' object has no attribute 'resolve'"), not the type name"AttributeError". So the"attributeerror" in combined.lower()branch fails on the exception string, and the test relies entirely on"attribute" in combined.lower()-- which would match any exception mentioning "attribute".Fix: Add
isinstancecheck:@ -0,0 +26,4 @@Plan Tree Command Crashes With Container.resolve()[Documentation] TDD test: plan tree calls container.resolve() which doesn't exist[Tags] tdd_bug tdd_bug_647 tdd_expected_fail${result}= Run Process ${PYTHON} ${HELPER} plan-tree-crash cwd=${WORKSPACE} timeout=120sP3-9: 120s timeout is excessive for a crash test.
The crash occurs immediately when the CLI command starts. 30s would be sufficient and would detect a hanging test much faster.
@ -0,0 +41,4 @@from typer.testing import CliRunnerfrom ulid import ULIDfrom cleveragents.application.services.decision_service import DecisionServiceP3-7: Module-level heavy imports.
All heavy imports (DecisionService, plan_app, Settings, domain models, UnitOfWork) are at module level. The Behave steps file correctly defers these into function bodies. If any import fails here, the helper exits with an opaque ImportError.
Recommendation: Move these into
_setup_decisions()and the individual test functions.PM Compliance Update (Day 31):
Fixed by PM:
Type/TestinglabelCloses #648to PR bodyCRITICAL: This is the only mergeable PR in the repository. It has
REQUEST_CHANGESfrom @hurui200320 (7 findings) and @CoreRasurae (10 findings).Action required: @aditya — this is your #1 priority. Address the review findings and push fixes immediately. Bug #647 (assigned to @hurui200320) is blocked until this merges.
Blocking chain: PR #670 → #648 closes → #647 unblocked → Rui can fix → M3 bug count drops to 2.
PM Review — Day 31 (Specification Update)
This PR is mergeable and is the ONLY mergeable TDD PR in the repository.
CRITICAL PATH
Blocking chain:
PR #670 → #648 closes → #647 unblocked → bug fix → M3 bug count dropsSpec Alignment Check
TDD test for Container.resolve crash is NOT impacted by protocol or TUI changes.
Status
Action Required
@hurui200320 @CoreRasurae — Please re-review and approve. @aditya has resolved all findings.
@aditya — This remains your #1 priority. If reviewers approve, this can merge immediately.
PM Status — Day 31 (2026-03-11)
This PR is the #1 priority for the entire project. It is the only merge-conflict-free PR on the critical path and blocks the M3 closure chain: PR #670 → #648 → #647 → M3.
Review Status
5df4330. Needs re-review.MEMORY_ENGINEScache not cleared between scenarios → data contamination riskisinstancecheck on exception type → wrong exceptions pass silentlyAction Required
Current M3 forecast: Day 33 (2026-03-13) — contingent on this PR merging by Day 32.
PR #670 - Response to Coree Review Comments #57919
Resolution Summary
MEMORY_ENGINEScache not cleared in Behave cleanupMEMORY_ENGINES.pop("sqlite:///:memory:")+engine.dispose()).isinstance)result.exception is not Noneandisinstance(result.exception, AttributeError)before message checks.@tdd_expected_failhandler implementation, and added explicit post-fix assertion template/comments for bug-fix handoff.DynamicContainer)"container"and"no attribute"+"resolve"), while avoiding brittle exact-string matching._PLAN_IDshared across scenariosplan_idper setup execution and storing on context / returned IDs.tdd/mN-)CONTRIBUTING.md(imports at top of file).120sto30s.Files Updated
features/steps/container_resolve_crash_steps.pyrobot/helper_container_resolve_crash.pyrobot/container_resolve_crash.robotValidation Run
nox -s unit_tests-> Passednox -s integration_tests-> Passednox -s coverage_report-> Passed (98.4%, threshold97%)nox -s benchmark-> Executed as project benchmark session (ASV)Notes
@tdd_expected_failworkflow limitation and now includes explicit post-fix guidance so bug #647 fix work can cleanly convert these tests into normal regression assertions.Code Review — PR #670
Verdict: REQUEST_CHANGES
Blocking
M-1:
@tdd_expected_failcan mask unrelated failuresSeverity: Major — TEST
Files:
features/steps/container_resolve_crash_steps.py:210-218,robot/helper_container_resolve_crash.py:172-183Assertions only check
exit_code == 0andexception is None. Any crash — not just the expectedAttributeErrorfromcontainer.resolve()— triggers@tdd_expected_failinversion and silently passes. An import error, DB failure, or config issue would be hidden.Fix — add a guard before the success assertion in the Behave step:
Apply the same in all 3 Robot helper functions, using exit code 2 for unexpected errors so the listener doesn't invert them.
M-2:
_cleanup()does not resetSettings._instancesingletonSeverity: Major — BUG
File:
robot/helper_container_resolve_crash.py:77-85This is a known bug class that was explicitly fixed in other TDD helpers (
helper_tdd_session_di_common.py:48). OmittingSettings._instance = Noneleaks the test'sdatabase_urlvia the stale singleton.Fix — one line:
Recommended
M-3: Feature file NOTE block is stale
File:
features/container_resolve_crash.feature:12-15Says assertions "check for the buggy AttributeError" and the handler "is not yet implemented." Both are false after commit
246f48fd— assertions check for success, and the handler is implemented. Misleads future readers.Fix:
M-4: Files missing
tdd_naming prefixFiles: All 4 PR files
Recent TDD features use the
tdd_prefix (tdd_session_create_di.feature,tdd_actor_list_validation.feature, etc.). This PR doesn't. Some older TDD files also lack it, so the codebase is partially inconsistent, but the newer convention is clear. Rename totdd_container_resolve_crash.*.M-5: Missing CHANGELOG entry
File:
CHANGELOG.mdPrior TDD PRs (#630, #631) added entries. CONTRIBUTING.md requires it.
M-6:
ISSUES CLOSED: #648vs bug #647 — needs verificationEvery commit footer says
ISSUES CLOSED: #648, but all code artifacts reference bug#647. If #648 is the TDD companion issue this is correct — please confirm on Forgejo.M-7: Hardcoded DB URL in cleanup diverges from setup
File:
robot/helper_container_resolve_crash.py:81vs:101_cleanup()hardcodes"sqlite:///:memory:"independently from_setup_decisions(). If one changes the other must too. Extract to module constant_DATABASE_URL.M-8: Degenerate single-node tree + dead fields
Files: Steps
:97-99, Helper:57-63,143-148Only one decision is seeded.
child_idandgrandchild_idaliasroot_id.grandchild_idis never read by any test.context.cr647_containeris stored but never used. Simplify theDecisionIDsNamedTuple or seed a real multi-node tree for post-fix regression value.M-9: In-memory SQLite: seeded data unreachable post-fix
File:
features/steps/container_resolve_crash_steps.py:60-103After the bug fix, the CLI creates its own
UnitOfWorkon a fresh:memory:connection — seeded data is invisible (in-memory SQLite is per-connection). Tests still pass on exit code alone, but have zero functional regression value post-fix. Switch to a file-based temp DB when removing@tdd_expected_fail.M-10: No negative assertions for post-fix output
No check that output should NOT contain
AttributeErrortraces after a successful fix. A command could exit 0 while still printing error traces to output.M-11:
_fail()usesraise SystemExit(1)vs conventionsys.exit(1)File:
robot/helper_container_resolve_crash.py:71-74Existing helpers use
sys.exit(1). This one usesraise SystemExit(1). Functionally equivalent but inconsistent.Nits
robot/helper_container_resolve_crash.py:95-96—Returnsdocstring omits theplan_idfield.features/steps/container_resolve_crash_steps.py:105— nestedcleanup()function has no docstring; every other function in the file does.features/steps/container_resolve_crash_steps.py:99,102—cr647_grandchild_idandcr647_containerare set but never read.Review Summary — PR #670 (TDD: Container.resolve() crash)
Reviewer: OpenCode automated review
Commit:
bc1f7ceScope: 4 new files, ~602 lines added
Files Changed
features/container_resolve_crash.featurefeatures/steps/container_resolve_crash_steps.pyrobot/container_resolve_crash.robotrobot/helper_container_resolve_crash.pyPrior Review Status
@hurui200320 (Review #2087 — 7 findings): ALL ADDRESSED
The review is stale (code updated since). All 7 findings were resolved:
_cleanup()+MEMORY_ENGINES.pop()DecisionIDsNamedTuple${HELPER}+${CURDIR})@CoreRasurae (Review #2095 — 10 findings): ALL ADDRESSED
The review is stale (code updated since). All 10 findings were resolved:
MEMORY_ENGINEScache cleanup added (P1)@tdd_expected_failinversion (P1)@hamza.khyari (Review #2157 — 14 findings): UNADDRESSED (CURRENT)
This review is on the latest commit (
bc1f7ce) and is not stale. It has 2 blocking findings that still need resolution:Blocking:
@tdd_expected_failcan mask unrelated failures — assertions only checkexit_code == 0andexception is None, so any crash (ImportError, DB failure, config issue) gets silently inverted. Needs a guard that validates the failure is specifically anAttributeErrorfromcontainer.resolve()before allowing the inversion._cleanup()does not resetSettings._instancesingleton — a known bug class explicitly fixed in other TDD helpers (e.g.,helper_tdd_session_di_common.py:48). Omitting this leaks the test'sdatabase_urlvia the stale singleton.Recommended (non-blocking but valuable):
tdd_naming prefix (newer convention)grandchild_idandcr647_containerare set but never read (dead fields)AttributeErrortraces post-fixVerdict
The PR is NOT yet ready to merge. While @hurui200320's and @CoreRasurae's prior findings have all been addressed (both reviews are stale), the latest review from @hamza.khyari has 2 legitimate blocking findings on the current commit that remain unresolved:
@tdd_expected_failmasking issue (M-1) is a real correctness concern — any unrelated exception would be silently swallowed.Settings._instance = Nonereset (M-2) is a known singleton leak pattern that other helpers explicitly guard against.Recommended action for @aditya: Address M-1 and M-2 from @hamza.khyari's review, then request re-review. The M-3 stale NOTE fix is also trivial and should be included. Once those are resolved, this PR should be ready for approval.
PM Status — Day 33 (2026-03-13)
This PR remains the #1 project priority. It has been 24+ hours since @hamza.khyari's review with 2 blocking findings (M-1 and M-2), and there has been no response from @aditya.
Blocking Chain (unchanged)
PR #670 → #648 closes → #647 unblocked → Rui fixes → M3 Critical bug count dropsOutstanding Items
@tdd_expected_failmasks unrelated failures — addisinstance(AttributeError)guardSettings._instance = Nonemissing from_cleanup()— known singleton leakTotal estimated fix time: ~20 minutes.
Action Required
@aditya — IMMEDIATE: These are 3 trivial fixes totaling ~20 minutes of work. Push the fix commit NOW and request re-review. Every hour of delay pushes M3 closure further.
@hamza.khyari — STANDBY: Once Aditya pushes fixes, please re-review and approve promptly. Your review was thorough and the 2 blocking findings are legitimate.
@hurui200320 @CoreRasurae — FYI: Your prior reviews are stale (findings all addressed). Once hamza's blocking items are resolved, please dismiss or re-approve so this can merge.
5 new TDD issues created today
As a reminder, 5 TDD counterpart issues have been created for the remaining unaddressed bugs: #838 (bug #823), #839 (bug #822), #840 (bug #821), #841 (bug #797), #842 (bug #783). These are all Priority/Critical per CONTRIBUTING.md and are assigned to their respective TDD owners.
PM Escalation — Final Response Deadline
@aditya — This is a formal escalation. This PR has been in review since it was opened and currently has only 2 trivial blocking findings remaining from @hamza.khyari's latest review. You have been non-responsive for over 24 hours.
Why This Is Critical
This PR is the #1 project blocker right now. The blocking chain is:
Remaining Findings
Hamza's review has 2 remaining items — both are minor/trivial fixes. This should take less than 30 minutes to address.
Deadline
If there is no response or updated push by end of Day 34 (2026-03-14 EOD), this PR will be reassigned to another developer to unblock the chain. We cannot allow a single unresponsive PR to hold up milestone progress.
Please acknowledge this message and provide an ETA for the fixes.
PM Escalation — Day 34 EOD Deadline (2026-03-14)
@aditya — This PR is the #1 project-wide blocker. The blocking chain is:
PR #670 (this PR) → #648 (TDD issue) → #647 (bug fix) → Rui unblocked → M3 closure
Status
@tdd_expected_failtag masking issue, M-2: missingSettings._instancereset). Estimated ~20 minutes of work.Required Action
Fix the 2 remaining findings and push by EOD today (2026-03-14). If no update is received by EOD, the PM recommends Jeff reassign this PR to ensure M3 is not further delayed.
This PR has been open for 4 days with a 24+ hour gap since the last activity. The fixes are trivial. Please prioritize immediately.
PM status comment — Day 34 schedule adherence
PM Escalation — EOD Day 34 Deadline Reached
@freemo — The EOD Day 34 deadline for this PR has passed with no response from @aditya on the 2 blocking findings from @hamza.khyari's review (M-1:
@tdd_expected_failmasking, M-2: missingSettings._instancereset).Timeline of Non-Response
aditya-fix-latestbranch) — does not address #670Key Concern
Aditya logged in today and opened PR #956 (an ad-hoc branch with simulation outputs and lifecycle wiring) instead of addressing the 2 trivial fixes (~20 min) on the project's #1 blocker. This suggests either miscommunication about priorities or a decision to work on other items.
PM Recommendation
Reassign PR #670 to Jeff (@freemo) or Rui (@hurui200320). The remaining fixes are trivial (add
isinstance(AttributeError)guard + addSettings._instance = Noneto cleanup). Either developer can complete them in under 30 minutes. The blocking chainPR #670 → #648 → #647 → M3cannot tolerate further delay.This decision is Jeff's to make as CTO. Awaiting direction.
PM status — Day 34 EOD escalation
PR #670 - Response to Hamza’s Review Comments
Resolution Summary
@tdd_expected_failcan mask unrelated failuresAttributeErrorfailures are treated as unexpected (Robot uses distinct failure path with exit code2)._cleanup()missingSettings._instanceresetSettings._instance = Nonein cleanup to prevent singleton leakage across test runs.tdd_filename prefix convention#647TDD regression coverage and issue#648follow-ups.ISSUES CLOSED: #648vs bug#647#648is the TDD companion issue; tests reference bug#647behavior by design._DATABASE_URLconstant and reused it in setup/cleanup paths.AttributeError/resolvecrash traces on success path._fail()style inconsistency (SystemExitvssys.exit)sys.exit(...)for consistency with existing helpers.plan_idreturn detailplan_idmetadata.cleanup()missing docstring in Behave stepscr647_grandchild_id,cr647_container)Files Updated
features/container_resolve_crash.featurefeatures/steps/container_resolve_crash_steps.pyrobot/container_resolve_crash.robotrobot/helper_container_resolve_crash.pyCHANGELOG.mdValidation Run
Notes
tdd_expected_failtags were removed from these regression scenarios after the bug behavior was no longer reproducing; tests now run as normal regression checks.tdd_file renames) were intentionally not mixed into this issue-specific fix set.PM Review — Day 36 Status Update
PR #670: TDD failing tests for Container.resolve() crash (bug #647)
Status Assessment
tdd/container-resolve-crash— correcttdd/prefix for TDD PRDay 36 Update
@aditya finally responded on Day 36 (after 5-day delay and formal escalation on Day 34). Per the latest comment, all 14 items from Hamza's review have been addressed:
Action required:
master.TDD PR Verification Checklist
tdd/prefix@tdd_bug,@tdd_bug_647,@tdd_expected_failPriority: CRITICAL. Target merge: Day 37 (2026-03-17).
PR #670 — Structured Review (Test Review + Architecture Review)
Overview
This PR adds TDD regression tests for bug #647 (
Container.resolve()crash inplan tree,plan explain,plan correct). It introduces 4 new files (Behave feature + steps, Robot suite + helper) and modifies 9 existing files. The core test design is sound — it uses a real DI container to catch the exact MagicMock masking problem described in #647. However, there are compliance and scoping issues that need attention before merge.P0 — Must Fix Before Merge
P0-1: Missing
@tdd_expected_failtag — PR description claims it's present, code doesn't have itCONTRIBUTING.md §Workflow Steps, step 2 requires TDD test PRs to include
@tdd_expected_failon all scenarios. The PR body explicitly states:But the actual code only has:
And the Robot file:
No
@tdd_expected_failanywhere.Mitigating context: I verified that
container.resolve()no longer exists on master — it's been replaced withcontainer.decision_service()at lines 2605, 3019, 3154 ofplan.py. So the bug IS fixed. Adding@tdd_expected_failnow would actually break CI (tests pass → inversion → forced failure). The feature file's NOTE acknowledges this: "Bug #647 appears fixed; these scenarios now run as normal regression checks."Required actions:
@tdd_expected_failis present, and explain that the tag was omitted because the bug was fixed before this TDD PR was merged.@tdd_expected_failwas intentionally omitted. This avoids confusion for future readers looking at the workflow.P0-2: Branch naming violates CONTRIBUTING.md convention
CONTRIBUTING.md §Branch Naming states:
Current branch:
tdd/container-resolve-crashExpected:
tdd/m3-container-resolve-crash(this is milestone v3.2.0 / M3)This is a minor naming issue but a documented convention violation.
P1 — Should Fix Before Merge
P1-1: PR scope creep — 9 existing files modified in a "test-only" TDD PR
This PR modifies:
features/devcontainer_cleanup.feature— assertion text changerobot/cli_plan_context_commands.robot— unique test dir setuprobot/core_cli_commands.robot— unique test dir setuprobot/helper_e2e_common.py— env var hardening, newis_known_provider_auth_failure(),OPENAI_API_KEYplaceholderrobot/helper_m1_e2e_verification.py— auth failure tolerancerobot/helper_m2_e2e_verification.py— auth failure tolerancerobot/helper_m3_e2e_verification.py— auth failure tolerancerobot/helper_m6_e2e_verification.py— auth failure tolerancerobot/skill_discovery.robot— Variables → ResourceThese are infrastructure fixes unrelated to bug #647. The
is_known_provider_auth_failureadditions andsetdefault→ assignment changes are useful but belong in a separate PR. A TDD test PR should be narrowly focused on the test deliverable.Recommendation: Split the collateral fixes into a separate PR, or at minimum clearly call out in the PR description that these are included as pre-requisite stabilization changes, with justification for each.
P1-2: Robot helper has significant code duplication (3× ~50-line blocks)
robot/helper_container_resolve_crash.pyfunctionsplan_tree_crash(),plan_explain_crash(), andplan_correct_crash()share ~80% identical logic:_setup_decisions()_fail_unexpected/_fail/ output checks)This should be refactored to a shared
_run_and_verify(label: str, cli_args: list[str])function. The helper is 359 lines — it could be under 200 with this deduplication.P2 — Suggested Improvements
P2-1: Behave step THEN assertion has dead
@tdd_expected_failreference logiccontainer_resolve_crash_steps.pyline 176-183:The comment references "expected-fail inversion" but
@tdd_expected_failis not present. This guard only makes sense if the tag were active and inversion were happening. With the bug fixed and no inversion tag, this is dead logic — ifexit_code != 0and the exception is NOT an AttributeError, the test still falls through to theassert result.exit_code == 0line immediately after, which will fail anyway. The guard provides no additional value.Recommendation: Remove the guard block and its misleading comment, or update the comment to explain it's a defense-in-depth check (not inversion-related).
P2-2:
env.setdefault("OPENAI_API_KEY", "test-openai-key")inhelper_e2e_common.pyThis uses
setdefault(preserving existing env values) while the three lines above it were explicitly changed FROMsetdefaultTO direct assignment with a comment explaining why:The OPENAI_API_KEY line contradicts the rationale stated 3 lines above it. If the pattern was changed to assignment for consistency/reliability, this line should follow the same pattern, or the comment should explain why it's an exception.
P3 — Nitpicks
P3-1: Feature file docstring says "REAL DI container (not MagicMock)" — accurate but mildly misleading
The test does use
create_autospec(Settings)for the Settings object. The container and CLI paths are real, but Settings is mocked. The docstring could be more precise: "Uses a real DI container with autospec'd Settings."P3-2: Stale docstrings in step definitions
Step function docstrings still say "will crash with AttributeError" (future tense, bug-present language):
Since the bug is fixed and the tag is absent, these docstrings should use present tense describing the regression test purpose.
Checklist Summary
@tdd_expected_failmissing; PR description claims it's presentcreate_autospecis lightweight; consistent with codebase patternscr647-prefix,context.add_cleanup()get_container(), not MagicMock. Only Settings is autospec'dVerdict: Request Changes
The core test implementation is well-crafted — real container usage, proper isolation, good assertion quality. The two P0 items are documentation/description accuracy issues (not code correctness), and the P1 scope issue is a process concern. Fix the PR description to match reality, and consider splitting the unrelated infrastructure changes.
@ -0,0 +1,28 @@@tdd_bug @tdd_bug_647P0-1: Missing
@tdd_expected_failtag. CONTRIBUTING.md §Workflow Steps step 2 requires it on all TDD test PRs. The PR body claims it's present but it's not.I verified that
container.resolve()no longer exists on master (replaced withcontainer.decision_service()at plan.py:2605, 3019, 3154), so the bug IS fixed and adding the tag would break CI. This is a valid reason to omit it, but the PR description must be updated to accurately reflect this and explain the workflow anomaly.@ -0,0 +10,4 @@get_container() with MagicMock, which auto-creates any attribute.NOTE: Bug #647 appears fixed; these scenarios now run as normalregression checks for correct command behavior.P3-2: This NOTE is the accurate explanation for why
@tdd_expected_failis absent. Good. But the PR body still claims the tag is present — those need to be reconciled.@ -0,0 +115,4 @@# ---------------------------------------------------------------------------# WHEN — Invoke CLI commands with real container# ---------------------------------------------------------------------------P3-2: Docstring says "will crash with AttributeError" (future tense, bug-present language). Since the bug is fixed and
@tdd_expected_failis absent, update to describe the regression test purpose: e.g., "Invoke plan tree command to verify container.resolve() crash (bug #647) does not regress."@ -0,0 +175,4 @@# Do NOT mock get_container() — let it use the real containercontext.cr647_result = cli_runner.invoke(plan_app,[P2-1: This guard block references "expected-fail inversion" but
@tdd_expected_failis not present on the feature. Without the inversion tag, this block is dead logic — if the exception isn't an AttributeError, the test falls through toassert result.exit_code == 0which fails anyway. Either remove the guard or update the comment to reflect its actual purpose (defense-in-depth).@ -0,0 +163,4 @@While bug #647 exists, this check fails and is inverted by thetdd_expected_fail listener."""P1-2: The three command functions (
plan_tree_crash,plan_explain_crash,plan_correct_crash) share ~80% identical logic — same setup, same 3-tier error checking, only CLI args differ. Extract a shared_run_and_verify(label: str, cli_args: list[str])function. This would reduce the file from 359 to ~200 lines and eliminate the maintenance burden of keeping three copies in sync.@ -48,0 +49,4 @@env["NO_COLOR"] = "1"# Some E2E helper scenarios intentionally reference openai/* actors.# Provide a deterministic placeholder key so provider resolution does# not fail early with "Provider openai is not configured".P2-2: This uses
setdefaultwhile the 3 lines above were explicitly changed FROMsetdefaultTO direct assignment, with a comment explaining why (setdefaultcauses flaky pabot runs). The OPENAI_API_KEY line contradicts that rationale. Either use direct assignment for consistency, or add a comment explaining why this is an intentional exception.Second-Pass Review — PR #670
Focus: Issues the first pass likely missed. Covers test validity, correctness of claims, scope, and subtle edge cases.
Summary Table
@tdd_expected_failtag is present, but it is NOT in the feature fileis_known_provider_auth_failure()is overly broad — can mask non-provider crashesOPENAI_API_KEYinjected into ALL E2E helpers viasetdefaultP1 — Critical (Must Fix / Clarify)
1. Tests cannot prove bug #647 ever existed on this branch
This is the central issue with this PR, and no prior review caught it.
The original codebase (commit
e58717d1) had the bug — three plan commands calledcontainer.resolve(_DS):This was fixed in commit
5e625b22(merged to master 2026-03-12), which changed all three call sites tocontainer.decision_service():Since the PR branch was merged with master on 2026-03-16 (commits
d7066620,4a1125db), the fix is now in the branch. The tests assert success (exit_code == 0, exception is None), and they pass — but they would pass identically on any working codebase, whether or not bug #647 ever existed.The TDD workflow requires: write test that fails → prove bug exists → fix bug → test passes. This PR skips step 1 because the fix landed on master before the branch was last synced. The test never demonstrated a failing state on the current codebase.
Impact: The test has regression value (it verifies the commands work), but it does NOT satisfy the TDD requirement of "proving the bug exists before fixing it." The PR title "add TDD failing tests" is inaccurate for the current state.
Ask: Either:
(a) Acknowledge in the PR description that these are now post-fix regression tests (not TDD-first tests), update the title, or
(b) If TDD provenance matters, show evidence that the tests did fail on the pre-fix commit (e.g., a CI run from before the master merge).
2. PR body claims
@tdd_expected_failtag, but it's absent from the feature fileThe PR description states:
The PM review (#2241) also marks "Tests tagged with @tdd_bug, @tdd_bug_647, @tdd_expected_fail" as PASS.
But the actual feature file only has:
No
@tdd_expected_failanywhere. The Robot tests also lack it ([Tags] tdd_bug tdd_bug_647).This is consistent with finding #1 — the tag was likely removed because the bug is already fixed and the inversion would cause false failures. But the PR body and PM checklist were never updated to reflect this.
Fix: Update the PR body to remove the claim about
@tdd_expected_fail. Note that these are regression tests for the already-fixed bug.P2 — High (Should Fix)
3. Significant scope creep — 10 unrelated files modified
This PR modifies 14 files. Only 4 are the core bug #647 test files. The other 10 are unrelated changes:
features/devcontainer_cleanup.featurerobot/cli_plan_context_commands.robotrobot/core_cli_commands.robotrobot/skill_discovery.robotVariables→Resourcerobot/helper_e2e_common.pyrobot/helper_m1_e2e_verification.pyrobot/helper_m2_e2e_verification.pyrobot/helper_m3_e2e_verification.pyrobot/helper_m6_e2e_verification.pyThese changes (unique temp dirs, env force-assignment,
is_known_provider_auth_failure,OPENAI_API_KEYinjection) are CI stabilization work unrelated to bug #647. They should be in a separate PR, or at minimum documented in the PR description under a "Collateral fixes" section.None of the 3 prior reviews flagged this. The CHANGELOG entry also doesn't mention these changes.
4.
is_known_provider_auth_failure()is overly broadThe string
"authenticationerror"matches ANY authentication error, not just AI provider auth. If a database auth error, LDAP auth error, or any other system produces a traceback containing "AuthenticationError", the M1-M6 helpers will suppress it:A crash with
sqlalchemy.exc.AuthenticationError+ traceback would be silently ignored.Fix: Make patterns more specific — e.g.,
"openai" in lowered and "authenticationerror" in lowered, or match the full exception class name"openai.AuthenticationError".P3 — Medium/Low
5. Robot helper still has heavy module-level imports
CoreRasurae's review (finding #7) flagged that
robot/helper_container_resolve_crash.pyimportsDecisionService,plan_app,Settings, domain models, andUnitOfWorkat module level (lines 41-52). The Behave steps file correctly defers these to function scope.The current code still has them at module level. If any import fails (e.g., a missing native dependency for
ulid), all three Robot test cases fail with an opaqueModuleNotFoundErrortraceback instead of a clear per-test failure.6. Robot exit code distinction (1 vs 2) is invisible to the runner
The helper defines
_fail()(exit 1) for expected failures and_fail_unexpected()(exit 2) for unexpected errors. But the Robot test only checks:Both codes produce the same "0 != 1" or "0 != 2" assertion failure. The diagnostic value of the distinction is only available by manually reading
${result.stderr}in the log. Consider adding:7. Dummy
OPENAI_API_KEYleaks into all E2E helpersThis is set in
run_cli()which is called by ALL E2E test helpers (M1-M6). If any test accidentally bypasses mock AI (e.g.,CLEVERAGENTS_TESTING_USE_MOCK_AIis somehow unset), a real HTTP request will be sent toapi.openai.comwith the dummy key. Minor concern but noteworthy becausesetdefault(not direct assignment like the other three vars) means a real key in the outer env takes precedence — inconsistent with the "force deterministic" comment above it.Answers to Specific Review Questions
Q1: Does the test actually prove bug #647 exists?
No. The fix (
container.resolve()→container.decision_service()) was merged into this branch from master. The tests pass because the fixed code is present, not because they ever demonstrated a failing state. See finding #1.Q2: Security concerns with container instantiation?
The Container is instantiated via
get_container()which eagerly wires theAuditEventSubscriber. In the test context this triggers a warning log (DB not initialized for audit) but no security issue. Thecreate_autospec(Settings)mock is only used for seeding data and doesn't affect the Container's real Settings resolution. No security concerns found.Q3: Does the Robot helper handle all edge cases?
Partially. It distinguishes crash (exit 1) from unexpected failure (exit 2), but the Robot test treats them identically. A config error, ImportError, or DB failure that isn't an
AttributeErrorcorrectly exits with code 2, but the test just reports "rc != 0" with no differentiation.Q4: Is the PR description accurate?
No. Two specific inaccuracies:
@tdd_expected_failtag is present (it isn't)Q5: Subtle issues with fixture setup/teardown?
The Behave
context.add_cleanup()correctly handlesMEMORY_ENGINES,Settings._instance,reset_container(), and env var cleanup. The Robot helper's_cleanup()intry/finallyis equivalent. No gaps found — this was properly fixed per earlier reviews.Q6: Does the test correctly use
reset_global_state()?Yes. Both Behave and Robot paths call
reset_container(), clearSettings._instance, dispose the cached engine viaMEMORY_ENGINES.pop(), and removeCLEVERAGENTS_DATABASE_URLfrom env. The cleanup is thorough.@ -0,0 +1,28 @@@tdd_bug @tdd_bug_647The
@tdd_expected_failtag is absent here, but the PR body and the PM review checklist both claim it is present. Either add the tag (if the TDD inversion workflow is intended) or update the PR description to remove the claim. Since the bug fix is already merged into this branch,@tdd_expected_failwould actually cause these tests to FAIL (success gets inverted to failure), so leaving it off is correct — but the PR description is misleading.@ -0,0 +1,28 @@@tdd_bug @tdd_bug_647Feature: Container.resolve() crash in plan tree/explain/correct commandsTDD test for bug #647: three CLI commands (plan tree, plan explain,plan correct) call container.resolve(DecisionService), but theThis description says the commands "call
container.resolve(DecisionService)" — but on the current branch (after merging master), the actual code inplan.pycallscontainer.decision_service(). The bug was fixed in commit5e625b22which is now part of this branch. The feature description describes the historical bug, not the current state of the code being tested.@ -0,0 +123,4 @@"""Invoke plan tree command through CliRunner.The command will call get_container() which returns the realcontainer, and then call container.resolve(DecisionService),Docstring says commands "call container.resolve(DecisionService), which will crash with AttributeError" — but on this branch, the CLI code calls
container.decision_service()(the fix from commit5e625b22is merged in). This docstring describes the pre-fix behavior and is now stale.@ -0,0 +28,4 @@Log ${result.stdout}Log ${result.stderr}# Helper exits 0 only when command behaves correctly.Should Be Equal As Integers ${result.rc} 0The test checks
rc == 0but the helper distinguishes between expected failure (exit 1 from_fail()) and unexpected failure (exit 2 from_fail_unexpected()). Consider adding a targeted assertion like:This surfaces the diagnostic distinction that the helper already computes.
@ -48,0 +49,4 @@env["NO_COLOR"] = "1"# Some E2E helper scenarios intentionally reference openai/* actors.# Provide a deterministic placeholder key so provider resolution does# not fail early with "Provider openai is not configured".This
setdefaultis inconsistent with the three lines above it (which use direct assignmentenv[...] = ...). The comment says "Force deterministic mock-AI behavior" but OPENAI_API_KEY usessetdefault, meaning it does NOT force — it defers to the outer environment. If the intent is to force deterministic behavior, use direct assignment. If the intent is to allow real keys, then the comment is misleading.Also: this change affects ALL E2E helpers (M1-M6), not just bug #647 tests. It belongs in a separate PR or should be called out in the PR description.
@ -118,0 +130,4 @@or "invalid_api_key" in loweredor "authenticationerror" in lowered)"authenticationerror"is too broad — it matches any authentication error from any system, not just AI provider auth. Asqlalchemy.exc.AuthenticationErroror LDAPAuthenticationErrorin a traceback would cause this function to return True, suppressing a real crash in the M1-M6 helpers. Consider matching the provider name alongside the error, e.g."openai" in lowered and "authenticationerror" in lowered.Code Review — PR #670
test(cli): add TDD failing tests for Container.resolve() crashReviewer: @brent.edwards | Size: M (~400 lines new test code + ~637 lines unrelated changes) | Focus: TDD test correctness, process compliance
P0:blocker (1)
1. Tests do not prove bug #647 exists — TDD "failing test first" requirement unmet
Bug #647 (
Container.resolve()crash) was fixed in commit5e625b22on master, which replacedcontainer.resolve(DecisionService)withcontainer.decision_service(). This branch merged master on Mar 16, so the fix is present. The tests assert success and pass — but they'd pass on any working codebase. They prove the fix works, not that the bug exists. The TDD workflow requires the test to fail before the fix is applied. Either the@tdd_expected_failtag must be present (so the test-pass-after-fix inverts to green), or the PR description must be updated to reflect that this is now a regression guard, not a TDD failing test.The PR body falsely claims
@tdd_expected_failtags are present — they are not in the feature file or robot file. This is inaccurate documentation.P1:must-fix (2)
2. Scope creep: 10 unrelated files modified
The diff includes ~637 lines of changes unrelated to the Container.resolve() bug:
helper_e2e_common.py: unique temp dir naming,OPENAI_API_KEYinjectionhelper_m1_e2e_verification.pythroughhelper_m6_e2e_verification.py: newis_known_provider_auth_failure()function, env hardeningskill_discovery.robot: resource path fixdevcontainer_cleanup.feature: string fixNone of these are documented in the PR description. Per CONTRIBUTING.md, a commit should address a single concern. These changes should be in separate PRs or at minimum documented.
3.
is_known_provider_auth_failure()matches too broadlyThe function checks
"authenticationerror" in loweron the combined stdout+stderr string. This would match any exception class containing "authenticationerror" — includingsqlalchemy.exc.AuthenticationErrorfrom database auth failures, not just LLM provider auth failures. This could mask real database connection crashes in M1-M6 E2E tests.Fix: Check for provider-specific patterns:
"openai" in lower and "auth" in loweror match against specific exception class names.P2:should-fix (3)
4. Robot helper has 3× duplicated ~50-line blocks
helper_container_resolve_crash.pycontains three nearly identical functions (cr647_plan_tree,cr647_plan_explain,cr647_plan_correct) that differ only in the CLI command invoked. Extract a shared_run_plan_command(cmd, plan_id, ...)helper.5. Dead
@tdd_expected_failguard logic in THEN stepcontainer_resolve_crash_steps.pyhas conditional logic checking forcontext.expected_errorthat was designed for the@tdd_expected_failpath. Since the tag isn't present, this code is dead.6.
setdefaultvs direct assignment inconsistencyhelper_e2e_common.pyusesos.environ.setdefault("OPENAI_API_KEY", ...)(won't overwrite) alongsideos.environ["CLEVERAGENTS_..."] = ...(always overwrites) for other env vars. The semantics differ — document the intent or use a consistent pattern.P3:nit (2)
7. PR description says "Tests tagged with @tdd_bug @tdd_bug_647 @tdd_expected_fail" — only the first two are actually present. Update description.
8. Docstrings still use present tense ("reproduce the crash") rather than past tense. Since the bug is fixed, update to "verify the fix for" or "regression guard for."
Summary
Verdict: REQUEST_CHANGES — The core test implementation (real DI container, proper isolation, correct Given/When/Then) is solid. The main issues are process: the TDD claim is inaccurate (bug is already fixed on the branch), the PR includes significant unrelated changes, and the broad auth failure matcher could mask real crashes.
Code Review Round 2 — PR #670
test(cli): add TDD failing tests for Container.resolve() crashReviewer: @brent.edwards | Focus: Items missed in Round 1
Round 1 findings (P0-1, P1-2/3, P2-4/5/6, P3-7/8) remain outstanding. This covers NEW issues only.
P1:must-fix (3)
9. Robot helper uses
create_autospec— violates no-mocks-in-integration-tests policyhelper_container_resolve_crash.py:33usescreate_autospec(Settings)in a robot helper. CONTRIBUTING.md: "Integration tests must exercise real services, real endpoints, and real dependencies — mocking of any kind is strictly prohibited in integration tests." This is the only robot helper in the codebase that usescreate_autospec. All others (m1-m6) construct real Settings objects.Fix: Construct a real
Settingsinstance by setting required env vars.10. Robot helper uses in-process
CliRunnerinstead of subprocesshelper_container_resolve_crash.py:40,54uses Typer'sCliRunner(in-process invocation), while all 4 existing robot helpers usesubprocess.run()viarun_cli(). In-process invocation shares module-level state, skips real process startup, and doesn't exercise the env→Settings→container wiring path. This makes the robot tests unit tests wearing integration-test clothing.Fix: Replace
CliRunner.invoke()withrun_cli()fromhelper_e2e_common.11. Fake
OPENAI_API_KEYinjected globally into all E2E helpershelper_e2e_common.py:53:env.setdefault("OPENAI_API_KEY", "test-openai-key")injects a fake key into every E2E subprocess across all milestone helpers. This contradicts theis_known_provider_auth_failure()function added in the same PR (which was designed to handle auth errors). Any future test that setsMOCK_AI=falsewill silently get a garbage key, causing401 Unauthorizedinstead of clean "not configured" errors.Fix: Remove global injection. If specific tests need it, pass via
env_extra.P2:should-fix (3)
12.
Settings._instance = Nonein both step and robot files — fragile private accessBoth
container_resolve_crash_steps.py:106andhelper_container_resolve_crash.py:87directly null the private_instance. No public reset API exists.Fix: Add
Settings.reset()classmethod.13.
_fail_unexpected()exit code 2 is a dead APIThe helper distinguishes exit 1 (expected failure) from exit 2 (unexpected failure), but the Robot test only checks
rc == 0. Exit codes 1 and 2 produce identical failure messages.Fix: Add differentiated handling in the
.robotfile, or collapse into_fail().14. File-level
# ruff: noqa: E402is overly broadhelper_container_resolve_crash.py:24blanket-suppresses all import-order violations for the 359-line file. Three of four existing helpers use targeted per-line# noqa: E402. A file-level directive masks future import-order bugs.Fix: Use per-line suppressions on the specific post-
sys.pathimport lines.P3:nit (1)
15. Robot suite doesn't call
Setup Database Isolationcontainer_resolve_crash.robot:17only callsSetup Test Environment. Thecommon.resourcedocs say suites running helpers viaRun Processshould also callSetup Database Isolation.Summary (Round 2)
Combined with Round 1: 1 P0 + 5 P1 + 6 P2 + 3 P3 = 15 total findings.
Third-Pass Review — PR #670 (
tdd/container-resolve-crash)Focused on four narrow angles after 15 prior findings. 3 genuinely new issues found.
Finding 1 — P2: THEN assertions verify "no crash" but not "correct behavior" (Angle 1)
Files:
features/steps/container_resolve_crash_steps.py:196-220,robot/helper_container_resolve_crash.py:170-194The
step_cr647_command_should_succeed(and equivalent robot helper checks) assert:exit_code == 0exception is None"attributeerror"in output"has no attribute 'resolve'"in outputWhat they do NOT assert: that the command produced any meaningful output. For example:
plan tree <plan_id> --format json— the test never verifies the JSON output contains the seeded decision. Iflist_decisions()returns[](e.g., because the DB wasn't shared correctly), the command prints"No decisions found for plan '...'"and exits 0. Test passes.plan explain <decision_id> --format json— ifget_decision()raisesDecisionNotFoundError, the command prints an error and callstyper.Exit(1). That would be caught. But if some future refactor makes the command catch this more broadly and return 0, the test is blind to it.plan correct --dry-run— never verifies the impact analysis output exists.Why this matters: The stated purpose is to verify
container.decision_service()works through real DI wiring. But the assertions only prove the command didn't crash — they don't prove the DI-resolved service returned data. A completely emptyDecisionServicestub that returns[]for every query would pass all three scenarios.Suggested fix: Add at least one positive assertion per scenario, e.g.:
Finding 2 — P2:
is_known_provider_auth_failurecan mask genuine crashes (Angle 4)File:
robot/helper_e2e_common.py:124-131, used inhelper_m1_e2e_verification.py:380-383,helper_m2_e2e_verification.py:275-277,helper_m3_e2e_verification.py:316-318,helper_m6_e2e_verification.py:223-225The crash-detection logic changed from:
to:
is_known_provider_auth_failuredoes substring matching on the full combined stdout+stderr:Problem: If a real, unrelated crash produces a traceback that happens to include the word
"authenticationerror"anywhere in the stack trace (e.g., in a module path, an error-chain, or in a log line printed before the real crash), the crash is silently suppressed. The check matches on the entire output, not on the specific exception type.Combined with the
run_clichange that now forcesOPENAI_API_KEY=test-openai-keyandCLEVERAGENTS_TESTING_USE_MOCK_AI=true, auth failures should ideally never occur. If they still do, it indicates incomplete mock coverage — theis_known_provider_auth_failurefilter treats the symptom rather than the cause.Finding 3 — P3: Auth failure filter applied inconsistently within same test function (Angle 4)
File:
robot/helper_m1_e2e_verification.py:376-397In
plan_full_lifecycle(), the auth failure filter is applied only toplan execute(step 4), but not toplan diff(step 5) orplan lifecycle-apply(step 6), which immediately follow in the same function with the same environment:If the intent is to tolerate auth failures in CI, the inconsistent application means
plan executeauth failures pass butplan diffauth failures (using the same subprocess environment) still fail. This creates flaky-test whack-a-mole where the next auth failure that surfaces inplan difforplan lifecycle-applyrequires another targeted suppression.Angles with no new findings
Angle 2 (Decision seeding correctness): The seeding is correct. The test's
UnitOfWork("sqlite:///:memory:")triggers engine caching inMEMORY_ENGINES. The container-createdDecisionService(a Factory) gets a freshUnitOfWorkthat reuses the same cached engine.list_decisionsandget_decisionboth query the database (not in-memory cache) when_persistedis True, so seeded data is visible to CLI commands.Angle 3 (Cleanup correctness): The cleanup in both behave (
context.add_cleanup) and robot (_cleanup()in finally block) correctly handles:Settings._instance = None,MEMORY_ENGINES.pop()+engine.dispose(),reset_container(), andos.environ.pop(). The behave step correctly capturesdatabase_urlin the closure scope. No new issues found.@ -0,0 +217,4 @@assert result.exit_code == 0, (f"Expected exit code 0, got {result.exit_code}. "f"Output: {result.output}\nException: {result.exception}"P2 — Weak assertion. This THEN step verifies the command didn't crash (exit_code 0, no exception, no attributeerror text) but never verifies the command produced correct output. For example,
plan tree --format jsonreturns exit 0 with"No decisions found"if the DI-resolved DecisionService can't see the seeded data — and this test would still pass.Consider adding at least one positive assertion per scenario, e.g.:
@ -118,0 +130,4 @@or "invalid_api_key" in loweredor "authenticationerror" in lowered)P2 — Overly broad suppression. This function matches substrings against the entire combined stdout+stderr output. A genuine crash whose traceback incidentally contains
"authenticationerror"(e.g., in a module path or chained exception context) would be silently suppressed.Consider either (a) matching only against the final exception line rather than the full output, or (b) removing this filter entirely since
run_clinow forcesCLEVERAGENTS_TESTING_USE_MOCK_AI=trueandOPENAI_API_KEY=test-openai-key, which should prevent auth failures at the source.@ -380,1 +380,4 @@if ("INTERNAL" in combined4 or "Traceback" in combined4) and not is_known_provider_auth_failure(combined4):_fail(f"plan execute crashed:\n{combined4}")P3 — Inconsistent filter application. The
is_known_provider_auth_failureguard is applied here (step 4,plan execute) but not to the immediately followingplan diff(step 5, line 389) orplan lifecycle-apply(step 6, line 395) which run in the same subprocess environment. If auth failures are expected in this context, they would also surface in steps 5/6 and cause the test to fail despite the step 4 suppression.Code Review Round 3 — PR #670
test(cli): add TDD failing tests for Container.resolve() crashReviewer: @brent.edwards | Third-pass deep dive
No genuinely new findings. The third pass confirmed that:
MEMORY_ENGINEScache properly shares the in-memory SQLite between the seedUnitOfWorkand the container-createdDecisionService.Settings._instance, dispose cached engines, reset the container, and remove env vars.Combined total across 3 rounds: 1 P0 + 5 P1 + 6 P2 + 3 P3 = 15 findings. All actionable. No further review rounds planned.
PR #670 - Response to Brent Review Comments
Resolution Summary
@tdd_expected_failis presentis_known_provider_auth_failure()too broadcreate_autospec(Settings)with realSettings(...)object construction.CliRunnerrun_cli(...)path.OPENAI_API_KEYinjection in shared helperenv.setdefault("OPENAI_API_KEY", "test-openai-key")fromrobot/helper_e2e_common.py.helper_container_resolve_crash.py_run_and_verify(...)with command-specific wrappers.setdefaultvs assignment inconsistencyOPENAI_API_KEYsetdefault usage; deterministic env semantics now consistent.Settings._instance = NoneSettings.reset()classmethod and updated callers to use it.rc == 2with targeted message.# ruff: noqa: E402noqaon post-path imports.Setup Test Environment+Setup Database Isolation.Files Updated
features/container_resolve_crash.featurefeatures/steps/container_resolve_crash_steps.pyrobot/container_resolve_crash.robotrobot/helper_container_resolve_crash.pyrobot/helper_e2e_common.pyrobot/helper_m1_e2e_verification.pysrc/cleveragents/config/settings.pyValidation Run (Targeted Only)
nox -s unit_tests-> passednox -s integration_tests-> passednox -s coverage_report-> passednox -s format-> passednox -s lint-> passed@brent.edwards quick confirmation request:
I can’t edit the source branch on Forgejo for this PR.
To align with the
tdd/mN-...naming convention, should I proceed with this flow?tdd/m3-container-resolve-crashmasterPlease confirm if you want me to proceed this way.
PR Review: !670 (Ticket #648)
Verdict: Request Changes
This PR fulfills all functional acceptance criteria from ticket #648 — all three commands (
plan tree,plan explain,plan correct) are tested in both Behave and Robot using real DI containers, TDD traceability tags are correctly applied, and the regression-guard approach is properly justified. All tests pass (3 Behave scenarios, 3 Robot tests). Linting, type checking, and formatting all pass clean.However, there are 2 critical git hygiene violations, 7 major issues, and numerous minor/nit findings that must be addressed before merge.
Critical Issues
C-1: Merge commits violate rebase-only policy
tdd/container-resolve-crash(7 merge commits)Merge branch 'master' into tdd/container-resolve-crashcommits. CONTRIBUTING.md requires rebase-only history.origin/masterto eliminate all merge commits.C-2: Non-atomic commit history — 6 fixup commits must be squashed
tdd/container-resolve-crash(7 content commits)fix(test):commits addressing review feedback — all for the same #648.test(cli): add TDD failing tests for Container.resolve() crashand footerISSUES CLOSED: #648.Major Issues
M-1: Branch name does not follow
tdd/mN-conventiontdd/container-resolve-crashtdd/m3-container-resolve-crashfor milestone v3.2.0 (M3). Author proposed (comment #66172) pushing a renamed branch and opening a new PR.tdd/m3-container-resolve-crash, open a new PR, close this one. Combine with C-1/C-2 rebase/squash.M-2: Scope creep — unrelated changes bundled into a TDD test PR
features/devcontainer_cleanup.feature(line 69) — assertion text changerobot/skill_discovery.robot(line 6) — Variables→Resource switchrobot/cli_plan_context_commands.robot/robot/core_cli_commands.robot— unique temp dir setuprobot/helper_m1/m2/m3/m6_e2e_verification.py— auth failure guardsM-3: Cleanup functions are not fault-tolerant — one failure skips subsequent steps
features/steps/container_resolve_crash_steps.py, lines 96–104robot/helper_container_resolve_crash.py, lines 101–109try/exceptguards. A failure in one step (e.g.,engine.dispose()) skips all subsequent cleanup, leaking env vars, stale singletons, or engine entries.contextlib.suppress(Exception)block.M-4: Robot helper
MEMORY_ENGINES.pop()is dead code — engine never disposedrobot/helper_container_resolve_crash.py, lines 103–105_cleanup()pops fromMEMORY_ENGINESusing a file-based URL (e.g.,sqlite:///tmp/cr647_xyz.db), butMEMORY_ENGINESonly caches:memory:URLs. The pop always returnsNone. The actual file-based SQLAlchemy engine is never explicitly disposed, leaving file handles potentially open whenunlink()is called.UnitOfWorkinDecisionContextand calluow.engine.dispose()in cleanup, or remove the misleading pop.M-5:
Settings.reset()— new production API with no dedicated testsrc/cleveragents/config/settings.py, lines 633–640Settings.reset()clears the singleton andget_settings()produces a fresh instance.M-6:
plan correctpositive assertion is vacuous — always passes regardless of database statefeatures/steps/container_resolve_crash_steps.py, lines 226–231robot/helper_container_resolve_crash.py, lines 133–138"correction_id"or'"affected_decisions"'in the output, but both keys are always present in--dry-run --format jsonoutput regardless of whether seeded data was read.correction_idis auto-generated by adefault_factory, andaffected_decisionsis always a key (even as[]). This means thecorrecttest would pass even if the DI container saw an empty database — it does not actually prove the DI→DB resolution path works for this command.context.cr647_child_id(the seeded decision ID) appears in the output, matching whattreeandexplaintests already do.M-7:
plan correcttests use--planoption that does not exist in the specificationfeatures/steps/container_resolve_crash_steps.py, lines 162–163robot/helper_container_resolve_crash.py, lines 216–217--plan <PLAN_ID>toplan correct. The spec defines the signature as:agents plan correct --mode (revert|append) (--guidance|-g) <GUIDANCE> [--dry-run] [--yes|-y] <DECISION_ID>— no--planoption. The implementation adds--planas a non-spec extension. Tests are fragile to any future spec-alignment refactor.--planfrom test invocations and arrange for a "latest active plan" in the test context, or add an inline comment acknowledging this is an implementation extension.Minor Issues
m-1: Stale section comment "THEN — Verify AttributeError"
features/steps/container_resolve_crash_steps.py, line 173# THEN — Verify successful command execution.m-2: CHANGELOG entry references stale "expected-fail" concept
CHANGELOG.md, lines 5–8m-3: Robot test names and documentation are stale/misleading
robot/container_resolve_crash.robot, lines 24–25, 35–36, 46–47m-4: Cleanup order creates stale-singleton resurrection window
features/steps/container_resolve_crash_steps.py, lines 98–104Settings.reset()is called last, after env vars are cleaned.m-5:
is_known_provider_auth_failure()only covers OpenAIrobot/helper_e2e_common.py, lines 120–128m-6:
setdefault→ assignment is an undocumented API contract changerobot/helper_e2e_common.py, lines 44–49run_cli()docstring to document that mock AI is now always forced.m-7: Feature file THEN steps are generic — Gherkin readability suffers
features/container_resolve_crash.feature, lines 16–26m-8: Nested subprocess timeout mismatch
robot/container_resolve_crash.robot(30s) vshelper_e2e_common.py(120s default)run_cli()calls.m-9: Missing docstrings in Robot helper
robot/helper_container_resolve_crash.py_setup_decisions,_cleanup,_run_and_verify, etc.).m-10: Incorrect fallback assertion key
"chosen_option"— should be"chosen"features/steps/container_resolve_crash_steps.py, lines 220–225robot/helper_container_resolve_crash.py, line 126'"chosen_option"'but the actual CLI JSON output (from_build_explain_dictinplan.py) uses the key"chosen". The fallback is dead code — always evaluates toFalse. Masked today because"A REST API"matches the primary check.'"chosen_option"'to'"chosen"'in both locations.m-11: CONTRIBUTORS.md not updated
CONTRIBUTORS.mdm-12: Ticket #648 not transitioned to
State/In reviewState/In reviewwhen a PR is submitted. Issue #648 is stillState/Verified. This is a documented merge prerequisite.State/VerifiedtoState/In review.m-13:
is_known_provider_auth_failure()can mask real crashes AND has zero test coveragerobot/helper_e2e_common.py, lines 120–128if (...) and not is_known_provider_auth_failure(combined)means if a real crash output coincidentally contains an OpenAI auth string alongside the genuine traceback, the real crash is silently suppressed. This function is used across M1/M2/M3/M6 helpers and has zero test coverage.m-14: Behave CliRunner invokes
plan_appsub-app directly, bypassing main app callbackfeatures/steps/container_resolve_crash_steps.py, lines 117, 133, 153from cleveragents.cli.commands.plan import app as plan_appand invokes the sub-app directly. This bypasses the main app's callback (which calls_register_subcommands()). If the main callback ever adds initialization the plan commands depend on, Behave tests would pass while real CLI usage would fail.m-15: In-memory SQLite engine sharing relies on implicit
StaticPooldefaultsrc/cleveragents/infrastructure/database/unit_of_work.py, lines 71–77create_engine("sqlite:///:memory:", ...)doesn't explicitly specifypoolclass=StaticPool. SQLAlchemy 2.0 defaults toStaticPoolfor:memory:URLs, but adding pool config parameters would silently switch toQueuePool, breaking the shared-engine assumption the tests rely on.poolclass=StaticPoolexplicitly for:memory:URLs.m-16:
Settings.reset()not migrated to existing callerssrc/cleveragents/config/settings.py, lines 634–640reset()method exists, but 20+ existing callsites still useSettings._instance = Nonedirectly. This creates an inconsistency.reset(), and file a follow-up ticket to migrate existing callers.Nits
n-1: Defense-in-depth assertion has misleading error message
features/steps/container_resolve_crash_steps.py, lines 184–186n-2:
_assert_tree_outputfallback weaker than Behave counterpartrobot/helper_container_resolve_crash.py, lines 112–117'"decision_id"'fallback; require specific ID.n-3:
catch_exceptions=Truewarrants a code commentfeatures/steps/container_resolve_crash_steps.py, lines 120, 133, 153n-4: Single-node tree limits tree rendering coverage
n-5: PR carries
State/Unverifiedlabel — misleading for a PR under active reviewState/Unverifiedlabel from the PR.n-6:
Settings.reset()docstring is narrowly test-focusedsrc/cleveragents/config/settings.py, lines 635–639get_settings()call."n-7: Temp SQLite cleanup doesn't remove WAL/SHM companion files
robot/helper_container_resolve_crash.py, lines 101–109glob.glob(f"{ctx.db_path}*")to clean companion files.n-8: Seed data duplication between Behave steps and Robot helper
container_resolve_crash_steps.pyandhelper_container_resolve_crash.pySummary
The PR delivers correct, passing regression tests for all three
planCLI commands through real DI containers — the core functional mission is achieved. However, the review surfaces:plan correct, and use of a non-spec--planoptionThe recommended path forward is:
tdd/m3-container-resolve-crashplan correctassertion (M-6), the--plandeviation (M-7), cleanup fault-tolerance (M-3), dead MEMORY_ENGINES code (M-4), and add aSettings.reset()test (M-5)PM Status — Day 37
Status: IN PROGRESS — @aditya responded (Day 36-37) addressing Hamza's 14 findings and Brent's 15 findings. Activity has resumed after the Day 34 escalation.
Latest activity:
tdd/m3-*conventionBlocking chain (unchanged): PR #670 → #648 → #647 → M3 closure
Action items:
Risk: If not merged by Day 38 EOD, reassignment proceeds per CTO directive.
PM status comment — Day 37
Response to Rui Review Comments (PR #670 -> PR #1053)
Context / Workflow Updates
CONTRIBUTING.md:tdd/m3-container-resolve-crashM-2were removed from the new PR scope.#648-scoped work (TDD regression guard for bug#647) plus required review fixes tied to that scope.Critical Issues
Major Issues
tdd/mN-...tdd/m3-container-resolve-crash.suppress) in both Behave and Robot helper paths.MEMORY_ENGINES.pop()dead codeSettings.reset()lacks dedicated testplan correctassertion is vacuous--plandeviation from specMinor Issues
Settings.reset()is invoked last in teardown ordering.is_known_provider_auth_failure()OpenAI-onlyM-2scope cleanup (collateral helper changes removed).setdefault-> assignment contract undocumentedM-2scope cleanup."chosen_option"should be"chosen"CONTRIBUTORS.mdnot updatedM-2split.:memory:engine relies on implicitStaticPoolSettings.reset()not migrated globally#648scope.Nits
catch_exceptions=Trueneeds commentSettings.reset()docstring too test-focusedCollateral Scope Clarification (from M-2)
The following previously bundled collateral stabilization files were removed from the replacement PR scope:
features/devcontainer_cleanup.featurerobot/skill_discovery.robotrobot/cli_plan_context_commands.robotrobot/core_cli_commands.robotrobot/helper_e2e_common.pyrobot/helper_m1_e2e_verification.pyrobot/helper_m2_e2e_verification.pyrobot/helper_m3_e2e_verification.pyrobot/helper_m6_e2e_verification.pyThis keeps PR #1053 aligned with issue
#648andCONTRIBUTING.mdatomicity expectations.Validation Performed
nox -e unit_tests-> Passednox -e integration_tests-> Passednox -e lint-> Passednox -e typecheck-> Passednox -e coverage_report-> PassedPlanning Review — Superseded PR
This PR appears to be superseded by PR #1053, which states: "This PR supersedes #670, which was raised from the older branch." Please confirm whether this PR should be closed in favor of #1053.
This PR has been superseded by PR #1053 which addresses the same TDD issue (#648 — TDD for bug #647). Recommending closure.
Day 43 Planning Review — Recommend Closure
This PR has been superseded by PR #1053 (which addresses the same issue #648 with a cleaner implementation on the correctly-named branch
tdd/m3-container-resolve-crash).Per the comment history:
Recommendation: Close this PR as superseded. All review energy should focus on PR #1053.
@aditya: Please close this PR and add a comment linking to PR #1053 as the replacement.
Pull request closed