fix: pre-PR review fixes for post-merge findings#183
Conversation
- Fix pre-flight check_can_execute skipping daily limit when total_monthly <= 0 (enforcer.py) - Replace module-level assert with RuntimeError for _ALERT_LEVEL_ORDER exhaustiveness check (enforcer.py) - Simplify redundant except clause (DailyLimitExceededError is subclass of BudgetExhaustedError) (enforcer.py) - Fix turn_range semantic inconsistency: use turn.turn_number for turn-based findings instead of raw enumerate index (detectors.py) - Update ErrorFinding.turn_range docstring to clarify position semantics across detector types (models.py) - Change MemoryBackend.backend_name return type to NotBlankStr (protocol.py) - Add MemoryNotFoundError docstring clarifying protocol vs impl usage (errors.py) - Add vector_store/history_store validation against known values (config.py) - Fix DESIGN_SPEC TOC ordering (7.4 before 7.5) - Fix ADR-001: add mem0ai to version table, fix Memari->Memary typo, fix YAML agents example (mapping->list), add RootConfig note - Add test for ClassificationResult._validate_findings_match_categories - Add Windows path traversal test cases for MemoryStorageConfig - Fix misleading docstring in integration test file
…ests Pre-reviewed by 9 agents, 16 findings addressed: - Fix DESIGN_SPEC/ADR/CLAUDE.md documentation drift (backend_name type, section references, missing classification events, LiteLLM candidate label) - Delete orphaned engine/validation.py (dead code, duplicate of _validation.py) - Align PersistenceBackend.backend_name to NotBlankStr (consistency with MemoryBackend protocol) - Normalize turn_range to 0-based indexing throughout detectors - Fix inaccurate enforcer comment about daily limit independence - Add builtin MemoryError (OOM) clarifying comments - Replace real vendor names in integration test data - Fix turn_range validator terminology (indices → positions) - Add test: daily limit enforcement when monthly disabled - Add test: turn_range index assertion for error finish reasons - Update README section header to reflect M5 progress - Consolidate test helpers in test_enforcer.py
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (8)
📝 WalkthroughSummary by CodeRabbit
WalkthroughStandardizes several backend/type APIs to use NotBlankStr, removes the engine pre-execution validation module, tightens budget enforcement logic, adds memory store-name validators, refactors classification detection, and updates docs/tests and small persistence/sandbox implementations accordingly. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
✨ Simplify code
Comment |
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request focuses on enhancing the robustness, consistency, and clarity of the codebase and its documentation. It addresses several findings from a pre-PR review, including correcting documentation drift, aligning type definitions across core protocols, and removing obsolete code. Furthermore, it improves the budget enforcement mechanism, refines error classification logic, and strengthens configuration validation, all while expanding the test suite to cover these critical updates. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Pull request overview
Aligns implementation, tests, and documentation after post-merge review findings—tightening type contracts (NotBlankStr), normalizing classification indices, improving budget enforcement behavior, and cleaning up drift across specs/docs.
Changes:
- Update
backend_namereturn types toNotBlankStracross memory/persistence protocols and implementations, and adjust corresponding tests. - Normalize/clarify
turn_rangesemantics to 0-based indices (message index vs. turns tuple index), and add model + detector tests to enforce invariants. - Improve budget enforcement behavior (daily limit independent of monthly disablement), refactor test helpers, and update multiple docs/spec references.
Reviewed changes
Copilot reviewed 20 out of 20 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/unit/persistence/test_protocol.py | Updates fake persistence backend to return NotBlankStr for backend_name. |
| tests/unit/memory/test_protocol.py | Updates fake memory backend to return NotBlankStr for backend_name. |
| tests/unit/memory/test_config.py | Adds Windows traversal cases + validates accepted/rejected store backend names. |
| tests/unit/engine/test_classification_models.py | Adds tests enforcing findings categories ⊆ categories_checked. |
| tests/unit/engine/test_classification_detectors.py | Adds assertions/tests for 0-based turn_range for finish-reason findings. |
| tests/unit/budget/test_enforcer.py | Refactors period patch helper; adds coverage for daily limit when monthly is disabled. |
| tests/integration/engine/test_error_taxonomy_integration.py | Replaces real vendor names in test conversation data. |
| src/ai_company/persistence/sqlite/backend.py | Returns NotBlankStr from backend_name. |
| src/ai_company/persistence/protocol.py | Changes PersistenceBackend.backend_name type to NotBlankStr. |
| src/ai_company/memory/protocol.py | Changes MemoryBackend.backend_name type to NotBlankStr. |
| src/ai_company/memory/errors.py | Clarifies intended usage of MemoryNotFoundError vs protocol behavior. |
| src/ai_company/memory/config.py | Adds explicit allowlists + validator for vector_store / history_store. |
| src/ai_company/engine/validation.py | Deletes now-orphaned validation module. |
| src/ai_company/engine/classification/models.py | Clarifies turn_range semantics + tweaks validation error message text. |
| src/ai_company/engine/classification/detectors.py | Normalizes finish-reason finding generation and turn_range indexing. |
| src/ai_company/budget/enforcer.py | Makes monthly preflight conditional; replaces assert with runtime check; adds OOM comments. |
| docs/decisions/ADR-001-memory-layer.md | Fixes protocol type drift + YAML example corrections + minor doc updates. |
| README.md | Updates capability snapshot header to reflect M5 progress. |
| DESIGN_SPEC.md | Fixes spec drift (types, structure listing, headings). |
| CLAUDE.md | Fixes persistence section reference pointer (§7.6). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| except BudgetExhaustedError: | ||
| raise | ||
| except MemoryError, RecursionError: | ||
| except MemoryError, RecursionError: # builtin MemoryError (OOM) |
There was a problem hiding this comment.
except MemoryError, RecursionError: uses Python 2 exception syntax and is a SyntaxError on Python 3. Use tuple syntax (and optionally bind as exc) e.g. except (MemoryError, RecursionError): so the module can import and the handler works as intended.
| except MemoryError, RecursionError: # builtin MemoryError (OOM) | |
| except (MemoryError, RecursionError): # builtin MemoryError (OOM) |
| start=period_start, | ||
| ) | ||
| except MemoryError, RecursionError: | ||
| except MemoryError, RecursionError: # builtin MemoryError (OOM) |
There was a problem hiding this comment.
except MemoryError, RecursionError: is invalid syntax in Python 3 (this file targets Python 3). Switch to except (MemoryError, RecursionError): (optionally as exc) so resolve_model() doesn't break module import.
| except MemoryError, RecursionError: # builtin MemoryError (OOM) | |
| except (MemoryError, RecursionError): # builtin MemoryError (OOM) |
| agent_id, | ||
| ) | ||
| except MemoryError, RecursionError: | ||
| except MemoryError, RecursionError: # builtin MemoryError (OOM) |
There was a problem hiding this comment.
except MemoryError, RecursionError: is Python 2 syntax and will raise SyntaxError under Python 3. Replace with except (MemoryError, RecursionError): (optionally binding the exception) to keep _compute_baselines_safe() valid.
| except MemoryError, RecursionError: # builtin MemoryError (OOM) | |
| except (MemoryError, RecursionError): # builtin MemoryError (OOM) |
There was a problem hiding this comment.
Code Review
This pull request delivers a comprehensive set of fixes and enhancements across documentation, application logic, and tests, including correcting documentation drift, standardizing on the NotBlankStr type, and improving the test suite. While it aims to fix a bug in budget enforcement, a critical security vulnerability was identified in the budget enforcer where Python 2-style exception handling is used. This could result in a syntax error in Python 3 and a potential logic flaw that bypasses budget enforcement. Additionally, a suggestion is included to further improve a startup validation check for greater robustness.
| except BudgetExhaustedError: | ||
| raise | ||
| except MemoryError, RecursionError: | ||
| except MemoryError, RecursionError: # builtin MemoryError (OOM) |
There was a problem hiding this comment.
The use of a comma to catch multiple exceptions (e.g., except MemoryError, RecursionError:) is Python 2 syntax and results in a SyntaxError in Python 3. Furthermore, even if it were valid, it would catch MemoryError and assign it to the variable name RecursionError, failing to catch actual RecursionError exceptions. In this context, an uncaught RecursionError would be caught by the subsequent except Exception: block, which logs the error and allows execution to proceed, effectively bypassing the budget enforcement check. Use parentheses to correctly catch multiple exceptions in Python 3.
except (MemoryError, RecursionError): # builtin MemoryError (OOM)| start=period_start, | ||
| ) | ||
| except MemoryError, RecursionError: | ||
| except MemoryError, RecursionError: # builtin MemoryError (OOM) |
There was a problem hiding this comment.
The use of a comma to catch multiple exceptions (e.g., except MemoryError, RecursionError:) is Python 2 syntax and results in a SyntaxError in Python 3. Furthermore, even if it were valid, it would catch MemoryError and assign it to the variable name RecursionError, failing to catch actual RecursionError exceptions. In this context, an uncaught RecursionError would be caught by the subsequent except Exception: block, which logs the error and allows execution to proceed, effectively bypassing the budget enforcement check. Use parentheses to correctly catch multiple exceptions in Python 3.
except (MemoryError, RecursionError): # builtin MemoryError (OOM)| agent_id, | ||
| ) | ||
| except MemoryError, RecursionError: | ||
| except MemoryError, RecursionError: # builtin MemoryError (OOM) |
There was a problem hiding this comment.
The use of a comma to catch multiple exceptions (e.g., except MemoryError, RecursionError:) is Python 2 syntax and results in a SyntaxError in Python 3. Furthermore, even if it were valid, it would catch MemoryError and assign it to the variable name RecursionError, failing to catch actual RecursionError exceptions. In this context, an uncaught RecursionError would be caught by the subsequent except Exception: block, which logs the error and allows execution to proceed, effectively bypassing the budget enforcement check. Use parentheses to correctly catch multiple exceptions in Python 3.
| except MemoryError, RecursionError: # builtin MemoryError (OOM) | |
| except (MemoryError, RecursionError): # builtin MemoryError (OOM) |
| if set(_ALERT_LEVEL_ORDER) != set(BudgetAlertLevel): | ||
| msg = ( | ||
| f"_ALERT_LEVEL_ORDER keys {set(_ALERT_LEVEL_ORDER)} do not match " | ||
| f"BudgetAlertLevel members {set(BudgetAlertLevel)}" | ||
| ) | ||
| raise RuntimeError(msg) |
There was a problem hiding this comment.
While converting the assert to an if/raise is a good improvement for robustness, the check itself could be more comprehensive. It currently verifies that the keys of _ALERT_LEVEL_ORDER match the members of BudgetAlertLevel, but it doesn't validate the dictionary's values.
To prevent future bugs if _ALERT_LEVEL_ORDER is modified, consider also verifying that its values are unique and form a contiguous sequence from 0.
You could add something like this after the current check:
if len(set(_ALERT_LEVEL_ORDER.values())) != len(BudgetAlertLevel):
msg = f"_ALERT_LEVEL_ORDER values must be unique, but got: {sorted(_ALERT_LEVEL_ORDER.values())}"
raise RuntimeError(msg)
expected_values = set(range(len(BudgetAlertLevel)))
if set(_ALERT_LEVEL_ORDER.values()) != expected_values:
msg = (
f"_ALERT_LEVEL_ORDER values must be a permutation of {expected_values}, "
f"but got: {set(_ALERT_LEVEL_ORDER.values())}"
)
raise RuntimeError(msg)
Greptile SummaryThis is a focused post-merge clean-up PR touching documentation, dead code removal, a logic bug fix in the budget enforcer, and type-system consistency improvements across protocols. Key changes:
Outstanding items: The budget enforcer exception handler syntax (lines 96, 205, 311) uses Python 2 style comma-separated exceptions instead of parenthesized tuples and should be updated for Python 3 clarity. Confidence Score: 4/5
Important Files Changed
Last reviewed commit: 571709f |
- Fix ADR-001 stale note: RootConfig.memory already exists in schema.py - Fix ADR-001 enum drift: level "full" → "persistent" to match MemoryLevel - Fix persistence docstrings: §7.5 → §7.6 after DESIGN_SPEC ToC reorder - Align SandboxBackend.get_backend_type() → NotBlankStr for cross-protocol consistency - Fix test docstring: clarify monthly-disabled test semantics - Clarify enforcer docstring: DailyLimitExceededError is subclass of BudgetExhaustedError - Enhance _ALERT_LEVEL_ORDER validation: add value uniqueness check
| except BudgetExhaustedError: | ||
| raise | ||
| except MemoryError, RecursionError: | ||
| except MemoryError, RecursionError: # builtin MemoryError (OOM) |
There was a problem hiding this comment.
Parentheses required for multi-exception handling in Python 3.
except MemoryError, RecursionError: is Python 2 syntax. In Python 2, the comma meant "bind the exception instance to the name RecursionError", not "catch both". In Python 3, this is ambiguous and should be explicitly parenthesized.
The same pattern appears at lines 205 and 311. All three should use except (MemoryError, RecursionError): for clear, unambiguous semantics.
| except MemoryError, RecursionError: # builtin MemoryError (OOM) | |
| except (MemoryError, RecursionError): # builtin MemoryError (OOM) |
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/ai_company/budget/enforcer.py
Line: 96
Comment:
Parentheses required for multi-exception handling in Python 3.
`except MemoryError, RecursionError:` is Python 2 syntax. In Python 2, the comma meant *"bind the exception instance to the name `RecursionError`"*, not "catch both". In Python 3, this is ambiguous and should be explicitly parenthesized.
The same pattern appears at lines 205 and 311. All three should use `except (MemoryError, RecursionError):` for clear, unambiguous semantics.
```suggestion
except (MemoryError, RecursionError): # builtin MemoryError (OOM)
```
How can I resolve this? If you propose a fix, please make it concise.| start=period_start, | ||
| ) | ||
| except MemoryError, RecursionError: | ||
| except MemoryError, RecursionError: # builtin MemoryError (OOM) |
There was a problem hiding this comment.
| except MemoryError, RecursionError: # builtin MemoryError (OOM) | |
| except (MemoryError, RecursionError): # builtin MemoryError (OOM) |
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/ai_company/budget/enforcer.py
Line: 205
Comment:
```suggestion
except (MemoryError, RecursionError): # builtin MemoryError (OOM)
```
How can I resolve this? If you propose a fix, please make it concise.| agent_id, | ||
| ) | ||
| except MemoryError, RecursionError: | ||
| except MemoryError, RecursionError: # builtin MemoryError (OOM) |
There was a problem hiding this comment.
| except MemoryError, RecursionError: # builtin MemoryError (OOM) | |
| except (MemoryError, RecursionError): # builtin MemoryError (OOM) |
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/ai_company/budget/enforcer.py
Line: 311
Comment:
```suggestion
except (MemoryError, RecursionError): # builtin MemoryError (OOM)
```
How can I resolve this? If you propose a fix, please make it concise.| @model_validator(mode="after") | ||
| def _validate_store_names(self) -> Self: | ||
| """Ensure vector_store and history_store are recognized values.""" | ||
| if self.vector_store not in self._VALID_VECTOR_STORES: | ||
| msg = ( | ||
| f"Unknown vector_store {self.vector_store!r}. " | ||
| f"Valid stores: {sorted(self._VALID_VECTOR_STORES)}" | ||
| ) | ||
| logger.warning( | ||
| CONFIG_VALIDATION_FAILED, | ||
| field="vector_store", | ||
| value=self.vector_store, | ||
| reason=msg, | ||
| ) | ||
| raise ValueError(msg) | ||
| if self.history_store not in self._VALID_HISTORY_STORES: | ||
| msg = ( | ||
| f"Unknown history_store {self.history_store!r}. " | ||
| f"Valid stores: {sorted(self._VALID_HISTORY_STORES)}" | ||
| ) | ||
| logger.warning( | ||
| CONFIG_VALIDATION_FAILED, | ||
| field="history_store", | ||
| value=self.history_store, | ||
| reason=msg, | ||
| ) | ||
| raise ValueError(msg) | ||
| return self |
There was a problem hiding this comment.
Consider design implications of hardcoded allowlist for an extensible protocol.
_VALID_VECTOR_STORES and _VALID_HISTORY_STORES are ClassVar constants baked into the model class — they cannot be overridden through configuration. Since MemoryBackend is a Protocol designed to support custom backends (per ADR-001 and module docstring), this validation approach creates a tight coupling:
- Users deploying custom backends (e.g.,
"chroma","pgvector","pinecone") will encounter hardValidationErrorat config parse-time, before any code runs. - Adding first-party stores requires updating this allowlist in addition to the backend implementation — easy to forget.
The pattern mirrors CompanyMemoryConfig._VALID_BACKENDS (line 149), which has the same constraint.
Suggestion: Either document clearly that new backends require a source code change here to register (update docstring), or consider a warn-only approach (log WARNING for unrecognized stores and continue) to preserve the extensibility contract of the Protocol design.
Prompt To Fix With AI
This is a comment left during a code review.
Path: src/ai_company/memory/config.py
Line: 58-85
Comment:
Consider design implications of hardcoded allowlist for an extensible protocol.
`_VALID_VECTOR_STORES` and `_VALID_HISTORY_STORES` are `ClassVar` constants baked into the model class — they cannot be overridden through configuration. Since `MemoryBackend` is a Protocol designed to support custom backends (per ADR-001 and module docstring), this validation approach creates a tight coupling:
1. Users deploying custom backends (e.g., `"chroma"`, `"pgvector"`, `"pinecone"`) will encounter hard `ValidationError` at config parse-time, before any code runs.
2. Adding first-party stores requires updating this allowlist in addition to the backend implementation — easy to forget.
The pattern mirrors `CompanyMemoryConfig._VALID_BACKENDS` (line 149), which has the same constraint.
**Suggestion**: Either document clearly that new backends *require* a source code change here to register (update docstring), or consider a warn-only approach (log WARNING for unrecognized stores and continue) to preserve the extensibility contract of the Protocol design.
How can I resolve this? If you propose a fix, please make it concise.🤖 I have created a release *beep* *boop* --- ## [0.1.1](ai-company-v0.1.0...ai-company-v0.1.1) (2026-03-10) ### Features * add autonomy levels and approval timeout policies ([#42](#42), [#126](#126)) ([#197](#197)) ([eecc25a](eecc25a)) * add CFO cost optimization service with anomaly detection, reports, and approval decisions ([#186](#186)) ([a7fa00b](a7fa00b)) * add code quality toolchain (ruff, mypy, pre-commit, dependabot) ([#63](#63)) ([36681a8](36681a8)) * add configurable cost tiers and subscription/quota-aware tracking ([#67](#67)) ([#185](#185)) ([9baedfa](9baedfa)) * add container packaging, Docker Compose, and CI pipeline ([#269](#269)) ([435bdfe](435bdfe)), closes [#267](#267) * add coordination error taxonomy classification pipeline ([#146](#146)) ([#181](#181)) ([70c7480](70c7480)) * add cost-optimized, hierarchical, and auction assignment strategies ([#175](#175)) ([ce924fa](ce924fa)), closes [#173](#173) * add design specification, license, and project setup ([8669a09](8669a09)) * add env var substitution and config file auto-discovery ([#77](#77)) ([7f53832](7f53832)) * add FastestStrategy routing + vendor-agnostic cleanup ([#140](#140)) ([09619cb](09619cb)), closes [#139](#139) * add HR engine and performance tracking ([#45](#45), [#47](#47)) ([#193](#193)) ([2d091ea](2d091ea)) * add issue auto-search and resolution verification to PR review skill ([#119](#119)) ([deecc39](deecc39)) * add memory retrieval, ranking, and context injection pipeline ([#41](#41)) ([873b0aa](873b0aa)) * add pluggable MemoryBackend protocol with models, config, and events ([#180](#180)) ([46cfdd4](46cfdd4)) * add pluggable MemoryBackend protocol with models, config, and events ([#32](#32)) ([46cfdd4](46cfdd4)) * add pluggable PersistenceBackend protocol with SQLite implementation ([#36](#36)) ([f753779](f753779)) * add progressive trust and promotion/demotion subsystems ([#43](#43), [#49](#49)) ([3a87c08](3a87c08)) * add retry handler, rate limiter, and provider resilience ([#100](#100)) ([b890545](b890545)) * add SecOps security agent with rule engine, audit log, and ToolInvoker integration ([#40](#40)) ([83b7b6c](83b7b6c)) * add shared org memory and memory consolidation/archival ([#125](#125), [#48](#48)) ([4a0832b](4a0832b)) * design unified provider interface ([#86](#86)) ([3e23d64](3e23d64)) * expand template presets, rosters, and add inheritance ([#80](#80), [#81](#81), [#84](#84)) ([15a9134](15a9134)) * implement agent runtime state vs immutable config split ([#115](#115)) ([4cb1ca5](4cb1ca5)) * implement AgentEngine core orchestrator ([#11](#11)) ([#143](#143)) ([f2eb73a](f2eb73a)) * implement basic tool system (registry, invocation, results) ([#15](#15)) ([c51068b](c51068b)) * implement built-in file system tools ([#18](#18)) ([325ef98](325ef98)) * implement communication foundation — message bus, dispatcher, and messenger ([#157](#157)) ([8e71bfd](8e71bfd)) * implement company template system with 7 built-in presets ([#85](#85)) ([cbf1496](cbf1496)) * implement conflict resolution protocol ([#122](#122)) ([#166](#166)) ([e03f9f2](e03f9f2)) * implement core entity and role system models ([#69](#69)) ([acf9801](acf9801)) * implement crash recovery with fail-and-reassign strategy ([#149](#149)) ([e6e91ed](e6e91ed)) * implement engine extensions — Plan-and-Execute loop and call categorization ([#134](#134), [#135](#135)) ([#159](#159)) ([9b2699f](9b2699f)) * implement enterprise logging system with structlog ([#73](#73)) ([2f787e5](2f787e5)) * implement graceful shutdown with cooperative timeout strategy ([#130](#130)) ([6592515](6592515)) * implement hierarchical delegation and loop prevention ([#12](#12), [#17](#17)) ([6be60b6](6be60b6)) * implement LiteLLM driver and provider registry ([#88](#88)) ([ae3f18b](ae3f18b)), closes [#4](#4) * implement LLM decomposition strategy and workspace isolation ([#174](#174)) ([aa0eefe](aa0eefe)) * implement meeting protocol system ([#123](#123)) ([ee7caca](ee7caca)) * implement message and communication domain models ([#74](#74)) ([560a5d2](560a5d2)) * implement model routing engine ([#99](#99)) ([d3c250b](d3c250b)) * implement parallel agent execution ([#22](#22)) ([#161](#161)) ([65940b3](65940b3)) * implement per-call cost tracking service ([#7](#7)) ([#102](#102)) ([c4f1f1c](c4f1f1c)) * implement personality injection and system prompt construction ([#105](#105)) ([934dd85](934dd85)) * implement single-task execution lifecycle ([#21](#21)) ([#144](#144)) ([c7e64e4](c7e64e4)) * implement subprocess sandbox for tool execution isolation ([#131](#131)) ([#153](#153)) ([3c8394e](3c8394e)) * implement task assignment subsystem with pluggable strategies ([#172](#172)) ([c7f1b26](c7f1b26)), closes [#26](#26) [#30](#30) * implement task decomposition and routing engine ([#14](#14)) ([9c7fb52](9c7fb52)) * implement Task, Project, Artifact, Budget, and Cost domain models ([#71](#71)) ([81eabf1](81eabf1)) * implement tool permission checking ([#16](#16)) ([833c190](833c190)) * implement YAML config loader with Pydantic validation ([#59](#59)) ([ff3a2ba](ff3a2ba)) * implement YAML config loader with Pydantic validation ([#75](#75)) ([ff3a2ba](ff3a2ba)) * initialize project with uv, hatchling, and src layout ([39005f9](39005f9)) * initialize project with uv, hatchling, and src layout ([#62](#62)) ([39005f9](39005f9)) * Litestar REST API, WebSocket feed, and approval queue (M6) ([#189](#189)) ([29fcd08](29fcd08)) * make TokenUsage.total_tokens a computed field ([#118](#118)) ([c0bab18](c0bab18)), closes [#109](#109) * parallel tool execution in ToolInvoker.invoke_all ([#137](#137)) ([58517ee](58517ee)) * testing framework, CI pipeline, and M0 gap fixes ([#64](#64)) ([f581749](f581749)) * wire all modules into observability system ([#97](#97)) ([f7a0617](f7a0617)) ### Bug Fixes * address Greptile post-merge review findings from PRs [#170](https://github.com/Aureliolo/ai-company/issues/170)-[#175](https://github.com/Aureliolo/ai-company/issues/175) ([#176](#176)) ([c5ca929](c5ca929)) * address post-merge review feedback from PRs [#164](https://github.com/Aureliolo/ai-company/issues/164)-[#167](https://github.com/Aureliolo/ai-company/issues/167) ([#170](#170)) ([3bf897a](3bf897a)), closes [#169](#169) * enforce strict mypy on test files ([#89](#89)) ([aeeff8c](aeeff8c)) * harden Docker sandbox, MCP bridge, and code runner ([#50](#50), [#53](#53)) ([d5e1b6e](d5e1b6e)) * harden git tools security + code quality improvements ([#150](#150)) ([000a325](000a325)) * harden subprocess cleanup, env filtering, and shutdown resilience ([#155](#155)) ([d1fe1fb](d1fe1fb)) * incorporate post-merge feedback + pre-PR review fixes ([#164](#164)) ([c02832a](c02832a)) * pre-PR review fixes for post-merge findings ([#183](#183)) ([26b3108](26b3108)) * strengthen immutability for BaseTool schema and ToolInvoker boundaries ([#117](#117)) ([7e5e861](7e5e861)) ### Performance * harden non-inferable principle implementation ([#195](#195)) ([02b5f4e](02b5f4e)), closes [#188](#188) ### Refactoring * adopt NotBlankStr across all models ([#108](#108)) ([#120](#120)) ([ef89b90](ef89b90)) * extract _SpendingTotals base class from spending summary models ([#111](#111)) ([2f39c1b](2f39c1b)) * harden BudgetEnforcer with error handling, validation extraction, and review fixes ([#182](#182)) ([c107bf9](c107bf9)) * harden personality profiles, department validation, and template rendering ([#158](#158)) ([10b2299](10b2299)) * pre-PR review improvements for ExecutionLoop + ReAct loop ([#124](#124)) ([8dfb3c0](8dfb3c0)) * split events.py into per-domain event modules ([#136](#136)) ([e9cba89](e9cba89)) ### Documentation * add ADR-001 memory layer evaluation and selection ([#178](#178)) ([db3026f](db3026f)), closes [#39](#39) * add agent scaling research findings to DESIGN_SPEC ([#145](#145)) ([57e487b](57e487b)) * add CLAUDE.md, contributing guide, and dev documentation ([#65](#65)) ([55c1025](55c1025)), closes [#54](#54) * add crash recovery, sandboxing, analytics, and testing decisions ([#127](#127)) ([5c11595](5c11595)) * address external review feedback with MVP scope and new protocols ([#128](#128)) ([3b30b9a](3b30b9a)) * expand design spec with pluggable strategy protocols ([#121](#121)) ([6832db6](6832db6)) * finalize 23 design decisions (ADR-002) ([#190](#190)) ([8c39742](8c39742)) * update project docs for M2.5 conventions and add docs-consistency review agent ([#114](#114)) ([99766ee](99766ee)) ### Tests * add e2e single agent integration tests ([#24](#24)) ([#156](#156)) ([f566fb4](f566fb4)) * add provider adapter integration tests ([#90](#90)) ([40a61f4](40a61f4)) ### CI/CD * add Release Please for automated versioning and GitHub Releases ([#278](#278)) ([a488758](a488758)) * bump actions/checkout from 4 to 6 ([#95](#95)) ([1897247](1897247)) * bump actions/upload-artifact from 4 to 7 ([#94](#94)) ([27b1517](27b1517)) * harden CI/CD pipeline ([#92](#92)) ([ce4693c](ce4693c)) * split vulnerability scans into critical-fail and high-warn tiers ([#277](#277)) ([aba48af](aba48af)) ### Maintenance * add /worktree skill for parallel worktree management ([#171](#171)) ([951e337](951e337)) * add design spec context loading to research-link skill ([8ef9685](8ef9685)) * add post-merge-cleanup skill ([#70](#70)) ([f913705](f913705)) * add pre-pr-review skill and update CLAUDE.md ([#103](#103)) ([92e9023](92e9023)) * add research-link skill and rename skill files to SKILL.md ([#101](#101)) ([651c577](651c577)) * bump aiosqlite from 0.21.0 to 0.22.1 ([#191](#191)) ([3274a86](3274a86)) * bump pyyaml from 6.0.2 to 6.0.3 in the minor-and-patch group ([#96](#96)) ([0338d0c](0338d0c)) * bump ruff from 0.15.4 to 0.15.5 ([a49ee46](a49ee46)) * fix M0 audit items ([#66](#66)) ([c7724b5](c7724b5)) * pin setup-uv action to full SHA ([#281](#281)) ([4448002](4448002)) * post-audit cleanup — PEP 758, loggers, bug fixes, refactoring, tests, hookify rules ([#148](#148)) ([c57a6a9](c57a6a9)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
🤖 I have created a release *beep* *boop* --- ## [0.1.0](v0.0.0...v0.1.0) (2026-03-11) ### Features * add autonomy levels and approval timeout policies ([#42](#42), [#126](#126)) ([#197](#197)) ([eecc25a](eecc25a)) * add CFO cost optimization service with anomaly detection, reports, and approval decisions ([#186](#186)) ([a7fa00b](a7fa00b)) * add code quality toolchain (ruff, mypy, pre-commit, dependabot) ([#63](#63)) ([36681a8](36681a8)) * add configurable cost tiers and subscription/quota-aware tracking ([#67](#67)) ([#185](#185)) ([9baedfa](9baedfa)) * add container packaging, Docker Compose, and CI pipeline ([#269](#269)) ([435bdfe](435bdfe)), closes [#267](#267) * add coordination error taxonomy classification pipeline ([#146](#146)) ([#181](#181)) ([70c7480](70c7480)) * add cost-optimized, hierarchical, and auction assignment strategies ([#175](#175)) ([ce924fa](ce924fa)), closes [#173](#173) * add design specification, license, and project setup ([8669a09](8669a09)) * add env var substitution and config file auto-discovery ([#77](#77)) ([7f53832](7f53832)) * add FastestStrategy routing + vendor-agnostic cleanup ([#140](#140)) ([09619cb](09619cb)), closes [#139](#139) * add HR engine and performance tracking ([#45](#45), [#47](#47)) ([#193](#193)) ([2d091ea](2d091ea)) * add issue auto-search and resolution verification to PR review skill ([#119](#119)) ([deecc39](deecc39)) * add mandatory JWT + API key authentication ([#256](#256)) ([c279cfe](c279cfe)) * add memory retrieval, ranking, and context injection pipeline ([#41](#41)) ([873b0aa](873b0aa)) * add pluggable MemoryBackend protocol with models, config, and events ([#180](#180)) ([46cfdd4](46cfdd4)) * add pluggable MemoryBackend protocol with models, config, and events ([#32](#32)) ([46cfdd4](46cfdd4)) * add pluggable output scan response policies ([#263](#263)) ([b9907e8](b9907e8)) * add pluggable PersistenceBackend protocol with SQLite implementation ([#36](#36)) ([f753779](f753779)) * add progressive trust and promotion/demotion subsystems ([#43](#43), [#49](#49)) ([3a87c08](3a87c08)) * add retry handler, rate limiter, and provider resilience ([#100](#100)) ([b890545](b890545)) * add SecOps security agent with rule engine, audit log, and ToolInvoker integration ([#40](#40)) ([83b7b6c](83b7b6c)) * add shared org memory and memory consolidation/archival ([#125](#125), [#48](#48)) ([4a0832b](4a0832b)) * design unified provider interface ([#86](#86)) ([3e23d64](3e23d64)) * expand template presets, rosters, and add inheritance ([#80](#80), [#81](#81), [#84](#84)) ([15a9134](15a9134)) * implement agent runtime state vs immutable config split ([#115](#115)) ([4cb1ca5](4cb1ca5)) * implement AgentEngine core orchestrator ([#11](#11)) ([#143](#143)) ([f2eb73a](f2eb73a)) * implement AuditRepository for security audit log persistence ([#279](#279)) ([94bc29f](94bc29f)) * implement basic tool system (registry, invocation, results) ([#15](#15)) ([c51068b](c51068b)) * implement built-in file system tools ([#18](#18)) ([325ef98](325ef98)) * implement communication foundation — message bus, dispatcher, and messenger ([#157](#157)) ([8e71bfd](8e71bfd)) * implement company template system with 7 built-in presets ([#85](#85)) ([cbf1496](cbf1496)) * implement conflict resolution protocol ([#122](#122)) ([#166](#166)) ([e03f9f2](e03f9f2)) * implement core entity and role system models ([#69](#69)) ([acf9801](acf9801)) * implement crash recovery with fail-and-reassign strategy ([#149](#149)) ([e6e91ed](e6e91ed)) * implement engine extensions — Plan-and-Execute loop and call categorization ([#134](#134), [#135](#135)) ([#159](#159)) ([9b2699f](9b2699f)) * implement enterprise logging system with structlog ([#73](#73)) ([2f787e5](2f787e5)) * implement graceful shutdown with cooperative timeout strategy ([#130](#130)) ([6592515](6592515)) * implement hierarchical delegation and loop prevention ([#12](#12), [#17](#17)) ([6be60b6](6be60b6)) * implement LiteLLM driver and provider registry ([#88](#88)) ([ae3f18b](ae3f18b)), closes [#4](#4) * implement LLM decomposition strategy and workspace isolation ([#174](#174)) ([aa0eefe](aa0eefe)) * implement meeting protocol system ([#123](#123)) ([ee7caca](ee7caca)) * implement message and communication domain models ([#74](#74)) ([560a5d2](560a5d2)) * implement model routing engine ([#99](#99)) ([d3c250b](d3c250b)) * implement parallel agent execution ([#22](#22)) ([#161](#161)) ([65940b3](65940b3)) * implement per-call cost tracking service ([#7](#7)) ([#102](#102)) ([c4f1f1c](c4f1f1c)) * implement personality injection and system prompt construction ([#105](#105)) ([934dd85](934dd85)) * implement single-task execution lifecycle ([#21](#21)) ([#144](#144)) ([c7e64e4](c7e64e4)) * implement subprocess sandbox for tool execution isolation ([#131](#131)) ([#153](#153)) ([3c8394e](3c8394e)) * implement task assignment subsystem with pluggable strategies ([#172](#172)) ([c7f1b26](c7f1b26)), closes [#26](#26) [#30](#30) * implement task decomposition and routing engine ([#14](#14)) ([9c7fb52](9c7fb52)) * implement Task, Project, Artifact, Budget, and Cost domain models ([#71](#71)) ([81eabf1](81eabf1)) * implement tool permission checking ([#16](#16)) ([833c190](833c190)) * implement YAML config loader with Pydantic validation ([#59](#59)) ([ff3a2ba](ff3a2ba)) * implement YAML config loader with Pydantic validation ([#75](#75)) ([ff3a2ba](ff3a2ba)) * initialize project with uv, hatchling, and src layout ([39005f9](39005f9)) * initialize project with uv, hatchling, and src layout ([#62](#62)) ([39005f9](39005f9)) * Litestar REST API, WebSocket feed, and approval queue (M6) ([#189](#189)) ([29fcd08](29fcd08)) * make TokenUsage.total_tokens a computed field ([#118](#118)) ([c0bab18](c0bab18)), closes [#109](#109) * parallel tool execution in ToolInvoker.invoke_all ([#137](#137)) ([58517ee](58517ee)) * testing framework, CI pipeline, and M0 gap fixes ([#64](#64)) ([f581749](f581749)) * wire all modules into observability system ([#97](#97)) ([f7a0617](f7a0617)) ### Bug Fixes * address Greptile post-merge review findings from PRs [#170](https://github.com/Aureliolo/ai-company/issues/170)-[#175](https://github.com/Aureliolo/ai-company/issues/175) ([#176](#176)) ([c5ca929](c5ca929)) * address post-merge review feedback from PRs [#164](https://github.com/Aureliolo/ai-company/issues/164)-[#167](https://github.com/Aureliolo/ai-company/issues/167) ([#170](#170)) ([3bf897a](3bf897a)), closes [#169](#169) * enforce strict mypy on test files ([#89](#89)) ([aeeff8c](aeeff8c)) * harden Docker sandbox, MCP bridge, and code runner ([#50](#50), [#53](#53)) ([d5e1b6e](d5e1b6e)) * harden git tools security + code quality improvements ([#150](#150)) ([000a325](000a325)) * harden subprocess cleanup, env filtering, and shutdown resilience ([#155](#155)) ([d1fe1fb](d1fe1fb)) * incorporate post-merge feedback + pre-PR review fixes ([#164](#164)) ([c02832a](c02832a)) * pre-PR review fixes for post-merge findings ([#183](#183)) ([26b3108](26b3108)) * resolve circular imports, bump litellm, fix release tag format ([#286](#286)) ([a6659b5](a6659b5)) * strengthen immutability for BaseTool schema and ToolInvoker boundaries ([#117](#117)) ([7e5e861](7e5e861)) ### Performance * harden non-inferable principle implementation ([#195](#195)) ([02b5f4e](02b5f4e)), closes [#188](#188) ### Refactoring * adopt NotBlankStr across all models ([#108](#108)) ([#120](#120)) ([ef89b90](ef89b90)) * extract _SpendingTotals base class from spending summary models ([#111](#111)) ([2f39c1b](2f39c1b)) * harden BudgetEnforcer with error handling, validation extraction, and review fixes ([#182](#182)) ([c107bf9](c107bf9)) * harden personality profiles, department validation, and template rendering ([#158](#158)) ([10b2299](10b2299)) * pre-PR review improvements for ExecutionLoop + ReAct loop ([#124](#124)) ([8dfb3c0](8dfb3c0)) * split events.py into per-domain event modules ([#136](#136)) ([e9cba89](e9cba89)) ### Documentation * add ADR-001 memory layer evaluation and selection ([#178](#178)) ([db3026f](db3026f)), closes [#39](#39) * add agent scaling research findings to DESIGN_SPEC ([#145](#145)) ([57e487b](57e487b)) * add CLAUDE.md, contributing guide, and dev documentation ([#65](#65)) ([55c1025](55c1025)), closes [#54](#54) * add crash recovery, sandboxing, analytics, and testing decisions ([#127](#127)) ([5c11595](5c11595)) * address external review feedback with MVP scope and new protocols ([#128](#128)) ([3b30b9a](3b30b9a)) * expand design spec with pluggable strategy protocols ([#121](#121)) ([6832db6](6832db6)) * finalize 23 design decisions (ADR-002) ([#190](#190)) ([8c39742](8c39742)) * update project docs for M2.5 conventions and add docs-consistency review agent ([#114](#114)) ([99766ee](99766ee)) ### Tests * add e2e single agent integration tests ([#24](#24)) ([#156](#156)) ([f566fb4](f566fb4)) * add provider adapter integration tests ([#90](#90)) ([40a61f4](40a61f4)) ### CI/CD * add Release Please for automated versioning and GitHub Releases ([#278](#278)) ([a488758](a488758)) * bump actions/checkout from 4 to 6 ([#95](#95)) ([1897247](1897247)) * bump actions/upload-artifact from 4 to 7 ([#94](#94)) ([27b1517](27b1517)) * bump anchore/scan-action from 6.5.1 to 7.3.2 ([#271](#271)) ([80a1c15](80a1c15)) * bump docker/build-push-action from 6.19.2 to 7.0.0 ([#273](#273)) ([dd0219e](dd0219e)) * bump docker/login-action from 3.7.0 to 4.0.0 ([#272](#272)) ([33d6238](33d6238)) * bump docker/metadata-action from 5.10.0 to 6.0.0 ([#270](#270)) ([baee04e](baee04e)) * bump docker/setup-buildx-action from 3.12.0 to 4.0.0 ([#274](#274)) ([5fc06f7](5fc06f7)) * bump sigstore/cosign-installer from 3.9.1 to 4.1.0 ([#275](#275)) ([29dd16c](29dd16c)) * harden CI/CD pipeline ([#92](#92)) ([ce4693c](ce4693c)) * split vulnerability scans into critical-fail and high-warn tiers ([#277](#277)) ([aba48af](aba48af)) ### Maintenance * add /worktree skill for parallel worktree management ([#171](#171)) ([951e337](951e337)) * add design spec context loading to research-link skill ([8ef9685](8ef9685)) * add post-merge-cleanup skill ([#70](#70)) ([f913705](f913705)) * add pre-pr-review skill and update CLAUDE.md ([#103](#103)) ([92e9023](92e9023)) * add research-link skill and rename skill files to SKILL.md ([#101](#101)) ([651c577](651c577)) * bump aiosqlite from 0.21.0 to 0.22.1 ([#191](#191)) ([3274a86](3274a86)) * bump pyyaml from 6.0.2 to 6.0.3 in the minor-and-patch group ([#96](#96)) ([0338d0c](0338d0c)) * bump ruff from 0.15.4 to 0.15.5 ([a49ee46](a49ee46)) * fix M0 audit items ([#66](#66)) ([c7724b5](c7724b5)) * **main:** release ai-company 0.1.1 ([#282](#282)) ([2f4703d](2f4703d)) * pin setup-uv action to full SHA ([#281](#281)) ([4448002](4448002)) * post-audit cleanup — PEP 758, loggers, bug fixes, refactoring, tests, hookify rules ([#148](#148)) ([c57a6a9](c57a6a9)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Signed-off-by: Aurelio <19254254+Aureliolo@users.noreply.github.com>
Summary
MemoryBackend.backend_namereturn typestr→NotBlankStrin specs/ADRevents/classification.pyto §15.3 Project Structureengine/validation.py(dead code, duplicate of_validation.py)PersistenceBackend.backend_nametoNotBlankStr(consistency withMemoryBackend)turn_rangeto 0-based indexing throughout detectors (fix dual-semantics issue)MemoryError(OOM) clarifying commentsTest plan
Review coverage
Pre-reviewed by 9 agents (code-reviewer, python-reviewer, pr-test-analyzer, silent-failure-hunter, comment-analyzer, type-design-analyzer, logging-audit, resilience-audit, docs-consistency). 16 findings addressed, 0 skipped.
🤖 Generated with Claude Code