ci: split vulnerability scans into critical-fail and high-warn tiers#277
ci: split vulnerability scans into critical-fail and high-warn tiers#277
Conversation
- Split Trivy into two steps per job: CRITICAL (exit-code 1) and HIGH (exit-code 0, warn only) — both reference .trivyignore.yaml - Change Grype severity-cutoff from high to critical - Add .trivyignore.yaml with CVE-2026-22184 (disputed zlib untgz demo vuln, not core zlib — upstream disputes CVE validity) - Add .grype.yaml with matching ignore entry for Grype parity This unblocks the Docker workflow which was failing on the web image due to the disputed CVE-2026-22184 in Alpine's zlib package.
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
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 refines the CI/CD vulnerability scanning process to prevent build failures caused by disputed or non-critical vulnerabilities. By introducing distinct critical-fail and high-warn tiers for Trivy scans and adjusting Grype's severity cutoff, the system now intelligently filters out false positives like CVE-2026-22184, which was previously blocking web image builds. This change aims to improve the efficiency of the development workflow by ensuring that only genuinely critical and relevant security issues halt the build process, without compromising overall security posture. Highlights
Changelog
Ignored Files
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
|
|
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 (3)
📝 WalkthroughSummary by CodeRabbit
WalkthroughSplits Trivy scans in CI into two steps (critical = fail, high = warn) and adds synchronized ignore configs for CVE-2026-22184; updates Grype severity cutoff to critical and applies changes to backend and web workflows. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant GH as GitHub Actions Runner
participant TrC as Trivy (critical)
participant TrH as Trivy (high)
participant Gr as Grype
participant GHCR as GHCR (registry)
GH->>TrC: Run Trivy scan (severity=CRITICAL, exit-code=1)
TrC-->>GH: Report findings (fail pipeline if CRITICAL found)
alt no critical findings
GH->>TrH: Run Trivy scan (severity=HIGH, exit-code=0, warn-only)
TrH-->>GH: Report findings (warnings)
GH->>Gr: Run Grype scan (severity-cutoff=CRITICAL)
Gr-->>GH: Report findings (fail if critical)
alt scans pass
GH->>GHCR: Push images
end
end
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes 🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Comment |
There was a problem hiding this comment.
Code Review
This pull request intends to refine the vulnerability scanning process by distinguishing between critical and high-severity vulnerabilities and ignoring a specific CVE. While no new vulnerabilities were introduced by these changes, a critical typo in the CVE identifier (CVE-2026-22184 instead of CVE-2022-37434) in both .grype.yaml and .trivyignore.yaml will prevent the ignore rules from functioning as intended. Please correct the CVE identifier in both configuration files to ensure the desired vulnerability is properly ignored.
| # Kept in sync with .trivyignore.yaml. | ||
|
|
||
| ignore: | ||
| - vulnerability: CVE-2026-22184 |
There was a problem hiding this comment.
There appears to be a typo in the CVE identifier. Based on the context and the links provided in the PR description, the correct identifier should be CVE-2022-37434, not CVE-2026-22184. With the current typo, Grype will not ignore the intended vulnerability, and the build may continue to fail.
- vulnerability: CVE-2022-37434| # Trivy CVE ignore list — structured YAML format | ||
|
|
||
| vulnerabilities: | ||
| - id: CVE-2026-22184 |
Greptile SummaryThis PR refines the Docker CI vulnerability scanning strategy by splitting Trivy scans into a hard-failing CRITICAL tier and a warn-only HIGH tier, lowering Grype's severity cutoff to
Confidence Score: 4/5
Important Files Changed
Sequence DiagramsequenceDiagram
participant GHA as GitHub Actions
participant Trivy_C as Trivy (CRITICAL)
participant Trivy_H as Trivy (HIGH)
participant Grype as Grype
participant GHCR as GHCR
GHA->>Trivy_C: Scan image — severity: CRITICAL, exit-code: 1
Trivy_C-->>GHA: Reads .trivyignore.yaml
alt CRITICAL found (not ignored)
Trivy_C-->>GHA: exit 1 → workflow FAILS
else No blocking CRITICALs
Trivy_C-->>GHA: exit 0 → continue
GHA->>Trivy_H: Scan image — severity: HIGH, exit-code: 0, continue-on-error: true
Trivy_H-->>GHA: Reads .trivyignore.yaml
Trivy_H-->>GHA: exit 0 (warn in logs, never blocks)
GHA->>Grype: Scan image — severity-cutoff: critical, config: .grype.yaml
Grype-->>GHA: Reads .grype.yaml (ignores CVE-2026-22184)
alt CRITICAL found (not ignored)
Grype-->>GHA: fail-build: true → workflow FAILS
else No blocking CRITICALs
Grype-->>GHA: pass → continue
GHA->>GHCR: Push image + sign with cosign
end
end
Last reviewed commit: 0db2bd2 |
| - id: CVE-2026-22184 | ||
| statement: >- | ||
| Disputed zlib vulnerability affecting only the untgz demo utility | ||
| in contrib/, not core zlib compression. Our images do not ship or | ||
| invoke untgz. Upstream disputes CVE validity: | ||
| https://github.com/madler/zlib/issues/1148 | ||
| nginx-unprivileged maintainer closed as not-zlib: | ||
| https://github.com/nginx/docker-nginx-unprivileged/issues/381 |
There was a problem hiding this comment.
No expiry date on CVE suppression
Trivy's structured YAML ignore format supports an expiry-date field. Without it, this entry will silently suppress CVE-2026-22184 indefinitely — even after Alpine rebuilds its base image with a patched zlib. If the patch lands before the ignore entry is manually reviewed, future scans would still mask it with no alert.
Consider adding an expiry date (e.g. 90 days out) so the entry automatically becomes actionable if the upstream situation hasn't resolved by then:
| - id: CVE-2026-22184 | |
| statement: >- | |
| Disputed zlib vulnerability affecting only the untgz demo utility | |
| in contrib/, not core zlib compression. Our images do not ship or | |
| invoke untgz. Upstream disputes CVE validity: | |
| https://github.com/madler/zlib/issues/1148 | |
| nginx-unprivileged maintainer closed as not-zlib: | |
| https://github.com/nginx/docker-nginx-unprivileged/issues/381 | |
| vulnerabilities: | |
| - id: CVE-2026-22184 | |
| expiry-date: "2026-06-10" | |
| statement: >- | |
| Disputed zlib vulnerability affecting only the untgz demo utility | |
| in contrib/, not core zlib compression. Our images do not ship or | |
| invoke untgz. Upstream disputes CVE validity: | |
| https://github.com/madler/zlib/issues/1148 | |
| nginx-unprivileged maintainer closed as not-zlib: | |
| https://github.com/nginx/docker-nginx-unprivileged/issues/381 |
Prompt To Fix With AI
This is a comment left during a code review.
Path: .trivyignore.yaml
Line: 4-11
Comment:
**No expiry date on CVE suppression**
Trivy's structured YAML ignore format supports an `expiry-date` field. Without it, this entry will silently suppress CVE-2026-22184 **indefinitely** — even after Alpine rebuilds its base image with a patched zlib. If the patch lands before the ignore entry is manually reviewed, future scans would still mask it with no alert.
Consider adding an expiry date (e.g. 90 days out) so the entry automatically becomes actionable if the upstream situation hasn't resolved by then:
```suggestion
vulnerabilities:
- id: CVE-2026-22184
expiry-date: "2026-06-10"
statement: >-
Disputed zlib vulnerability affecting only the untgz demo utility
in contrib/, not core zlib compression. Our images do not ship or
invoke untgz. Upstream disputes CVE validity:
https://github.com/madler/zlib/issues/1148
nginx-unprivileged maintainer closed as not-zlib:
https://github.com/nginx/docker-nginx-unprivileged/issues/381
```
How can I resolve this? If you propose a fix, please make it concise.There was a problem hiding this comment.
Pull request overview
This PR adjusts the Docker image security scanning workflow to fail builds only on CRITICAL vulnerabilities while still surfacing HIGH findings in logs, and adds scanner-specific ignore configurations for a disputed CVE.
Changes:
- Split Trivy scanning into CRITICAL (hard-fail) and HIGH (warn-only) steps for both backend and web images, both using
.trivyignore.yaml. - Lower Grype gating from
hightocriticalviaseverity-cutoff: critical. - Add
.trivyignore.yamland.grype.yamlwith an ignore entry for CVE-2026-22184.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
.github/workflows/docker.yml |
Splits Trivy scans by severity and changes Grype cutoff to CRITICAL for backend and web jobs. |
.trivyignore.yaml |
Adds Trivy YAML ignore entry for CVE-2026-22184 with rationale/links. |
.grype.yaml |
Adds Grype ignore entry for CVE-2026-22184 to mirror Trivy’s ignore list. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| image: ${{ steps.scan-ref.outputs.ref }} | ||
| fail-build: true | ||
| severity-cutoff: high | ||
| severity-cutoff: critical |
There was a problem hiding this comment.
.grype.yaml is added in this PR, but the Grype scan step doesn’t explicitly reference it (no config/args pointing to .grype.yaml). If anchore/scan-action doesn’t automatically discover repo-local config in its execution environment, the CVE ignore won’t apply and the job can still fail on CVE-2026-22184. Consider passing the config explicitly (or adding a note/assertion in the workflow logs) so it’s unambiguous that Grype is using the intended ignore list.
| severity-cutoff: critical | |
| severity-cutoff: critical | |
| grype-config: .grype.yaml |
| image: ${{ steps.scan-ref.outputs.ref }} | ||
| fail-build: true | ||
| severity-cutoff: high | ||
| severity-cutoff: critical |
There was a problem hiding this comment.
.grype.yaml is added in this PR, but the Grype scan step doesn’t explicitly reference it (no config/args pointing to .grype.yaml). If anchore/scan-action doesn’t automatically discover repo-local config in its execution environment, the CVE ignore won’t apply and the job can still fail on CVE-2026-22184. Consider passing the config explicitly (or adding a note/assertion in the workflow logs) so it’s unambiguous that Grype is using the intended ignore list.
| severity-cutoff: critical | |
| severity-cutoff: critical | |
| grype-config: .grype.yaml |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.github/workflows/docker.yml:
- Around line 108-115: The Trivy step named "Trivy scan (high — warn only)"
currently sets exit-code: "0" but can still fail the job on unexpected errors;
update that job step to include continue-on-error: true so the workflow treats
this scan as a non-blocking warning. Locate the step with name "Trivy scan (high
— warn only)" (uses: aquasecurity/trivy-action@...) and add continue-on-error:
true alongside the existing with/exit-code and severity settings to make the
intent explicit and resilient.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 990890a9-ef9f-40b8-98ba-76aef2ffa787
📒 Files selected for processing (3)
.github/workflows/docker.yml.grype.yaml.trivyignore.yaml
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: Agent
- GitHub Check: Greptile Review
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: Aureliolo/ai-company PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-10T18:49:27.779Z
Learning: Use `/aurelio-review-pr` to handle external reviewer feedback after PR exists
🔇 Additional comments (5)
.github/workflows/docker.yml (3)
208-224: Web job scan configuration mirrors backend — good consistency.The identical scan configuration between backend and web jobs ensures uniform security posture across both images.
99-122: Backend scan configuration is well-structured.The dual-scan pattern correctly separates concerns:
- CRITICAL vulnerabilities block the build (exit-code: "1")
- HIGH vulnerabilities are reported but don't fail (exit-code: "0")
The
trivyignores: .trivyignore.yamlparameter is correct for trivy-action v0.35.0. Both Trivy steps and Grype are aligned on the critical-only blocking policy.
117-122: No action required — auto-detection will work correctly.The
.grype.yamlat the repository root will be picked up automatically byanchore/scan-actionsince the action does not override Grype's config auto-discovery. Grype's default behavior checks for./.grype.yamlfirst, which matches your repository structure..grype.yaml (1)
1-8: Configuration is correct and properly placed.The
.grype.yamlfile is correctly positioned at the repository root for auto-detection by the Grype scanner. The YAML syntax is valid, and the ignore entry for CVE-2026-22184 is properly structured with clear justification..trivyignore.yaml (1)
1-11: Well-documented ignore entry with proper audit trail.The structured YAML format with upstream issue references provides excellent traceability for future audits. The justification clearly explains why this CVE is safe to ignore (affects only
contrib/untgzdemo utility, not shipped in images).
…error, docs updates - Add `config: .grype.yaml` to both Grype scan steps (backend + web) for explicit config loading instead of relying on auto-discovery - Add `continue-on-error: true` to Trivy HIGH scan steps so unexpected Trivy errors don't block the pipeline - Update CLAUDE.md CI section to describe tiered scan model and ignore files - Update DESIGN_SPEC.md file tree with .grype.yaml and .trivyignore.yaml
| - name: Trivy scan (high — warn only) | ||
| uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0 | ||
| continue-on-error: true | ||
| with: | ||
| image-ref: ${{ steps.scan-ref.outputs.ref }} | ||
| format: table | ||
| exit-code: "0" | ||
| severity: HIGH | ||
| trivyignores: .trivyignore.yaml |
There was a problem hiding this comment.
continue-on-error: true masks scan infrastructure failures
exit-code: "0" already instructs Trivy to exit with code 0 when vulnerabilities are found, making continue-on-error: true redundant for the intended use case. However, the combination is subtly problematic: if Trivy encounters a genuine infrastructure error (DB download failure, image pull error, malformed config), it still exits non-zero — but continue-on-error: true will swallow that failure and mark the step as passed.
The CRITICAL step (no continue-on-error) running first provides a partial mitigation — if the infrastructure is broken, the critical scan would fail first. However, there's a narrow window where the critical step succeeds and the high step then encounters a transient error (flaky network on DB re-download, ephemeral runner issues), resulting in the HIGH scan being silently skipped rather than visibly errored.
Using exit-code: "0" alone is sufficient to make findings non-blocking, while still correctly surfacing scan infrastructure failures in the step output. Consider removing continue-on-error: true from both the build-backend (line 110) and build-web (line 221) jobs:
| - name: Trivy scan (high — warn only) | |
| uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0 | |
| continue-on-error: true | |
| with: | |
| image-ref: ${{ steps.scan-ref.outputs.ref }} | |
| format: table | |
| exit-code: "0" | |
| severity: HIGH | |
| trivyignores: .trivyignore.yaml | |
| - name: Trivy scan (high — warn only) | |
| uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0 | |
| with: | |
| image-ref: ${{ steps.scan-ref.outputs.ref }} | |
| format: table | |
| exit-code: "0" | |
| severity: HIGH | |
| trivyignores: .trivyignore.yaml |
Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/docker.yml
Line: 108-116
Comment:
**`continue-on-error: true` masks scan infrastructure failures**
`exit-code: "0"` already instructs Trivy to exit with code 0 when vulnerabilities are found, making `continue-on-error: true` redundant for the intended use case. However, the combination is subtly problematic: if Trivy encounters a genuine infrastructure error (DB download failure, image pull error, malformed config), it still exits non-zero — but `continue-on-error: true` will swallow that failure and mark the step as passed.
The CRITICAL step (no `continue-on-error`) running first provides a partial mitigation — if the infrastructure is broken, the critical scan would fail first. However, there's a narrow window where the critical step succeeds and the high step then encounters a transient error (flaky network on DB re-download, ephemeral runner issues), resulting in the HIGH scan being silently skipped rather than visibly errored.
Using `exit-code: "0"` alone is sufficient to make findings non-blocking, while still correctly surfacing scan infrastructure failures in the step output. Consider removing `continue-on-error: true` from both the `build-backend` (line 110) and `build-web` (line 221) jobs:
```suggestion
- name: Trivy scan (high — warn only)
uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0
with:
image-ref: ${{ steps.scan-ref.outputs.ref }}
format: table
exit-code: "0"
severity: HIGH
trivyignores: .trivyignore.yaml
```
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
.trivyignore.yamlseverity-cutofffromhightocritical— only CRITICAL vulns block the build.trivyignore.yamlwith CVE-2026-22184 (disputed zlibuntgzdemo utility vuln — upstream disputes CVE validity, nginx-unprivileged maintainer closed as not-zlib).grype.yamlwith matching ignore entry for Grype parityMotivation: The Docker workflow was failing on the web image due to CVE-2026-22184 (CVSS 9.3 CRITICAL) in Alpine's zlib package. The CVE affects only the
untgzdemo utility incontrib/, not core zlib compression. The zlib maintainer disputes the CVE and the nginx-unprivileged maintainer closed the issue. The base Alpine image hasn't been rebuilt with the patch.New scan behavior per job:
Both scanners consume their respective ignore files for disputed/false-positive CVEs.
Test plan
.trivyignore.yaml(check logs for absence of CVE-2026-22184)severity-cutoff: criticaland reads.grype.yamlReview coverage