Skip to content

ci: split vulnerability scans into critical-fail and high-warn tiers#277

Merged
Aureliolo merged 2 commits intomainfrom
ci/cve-triage-workflow
Mar 10, 2026
Merged

ci: split vulnerability scans into critical-fail and high-warn tiers#277
Aureliolo merged 2 commits intomainfrom
ci/cve-triage-workflow

Conversation

@Aureliolo
Copy link
Copy Markdown
Owner

Summary

  • Split Trivy scans into two steps per job: CRITICAL (exit-code 1, hard fail) and HIGH (exit-code 0, warn only) — both reference .trivyignore.yaml
  • Change Grype severity-cutoff from high to critical — only CRITICAL vulns block the build
  • Add .trivyignore.yaml with CVE-2026-22184 (disputed zlib untgz demo utility vuln — upstream disputes CVE validity, nginx-unprivileged maintainer closed as not-zlib)
  • Add .grype.yaml with matching ignore entry for Grype parity

Motivation: 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 untgz demo utility in contrib/, 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:

Scanner Severity Behavior
Trivy CRITICAL Hard fail (exit-code 1)
Trivy HIGH Warn only (exit-code 0, visible in logs)
Grype CRITICAL Hard fail
Grype HIGH Allowed through (below cutoff)

Both scanners consume their respective ignore files for disputed/false-positive CVEs.

Test plan

  • Docker workflow passes on this branch (web image no longer blocked by CVE-2026-22184)
  • Trivy CRITICAL step uses .trivyignore.yaml (check logs for absence of CVE-2026-22184)
  • Trivy HIGH step runs with exit-code 0 (succeeds even if HIGHs found)
  • Grype uses severity-cutoff: critical and reads .grype.yaml
  • Both backend and web jobs have identical scan configuration

Review coverage

  • Auto-skipped agent review (no substantive code changes — CI workflow + scanner config only)
  • Pre-commit hooks passed (check-yaml, gitleaks, commitizen)

- 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.
Copilot AI review requested due to automatic review settings March 10, 2026 21:17
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 10, 2026

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, 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

  • Vulnerability Scan Tiers: Split Trivy scans into two steps per job: CRITICAL (hard fail) and HIGH (warn only), both referencing .trivyignore.yaml.
  • Grype Severity Cutoff: Changed Grype's severity-cutoff from high to critical, ensuring only critical vulnerabilities block the build.
  • CVE Ignore Files: Added .trivyignore.yaml and .grype.yaml to ignore CVE-2026-22184, a disputed zlib vulnerability.
Changelog
  • .grype.yaml
    • Added a new configuration file for Grype.
  • .trivyignore.yaml
    • Added a new ignore file for Trivy.
Ignored Files
  • Ignored by pattern: .github/workflows/** (1)
    • .github/workflows/docker.yml
Activity
  • The Docker workflow is expected to pass on this branch, resolving the CVE-2026-22184 blocking issue.
  • Trivy CRITICAL step is configured to use .trivyignore.yaml for vulnerability filtering.
  • Trivy HIGH step is configured to run with exit-code 0, allowing it to succeed even if high-severity issues are found (warn only).
  • Grype is configured to use severity-cutoff: critical and read .grype.yaml for its scans.
  • Both backend and web jobs are expected to have identical scan configurations.
  • Agent review was auto-skipped as there were no substantive code changes, only CI workflow and scanner configuration.
  • Pre-commit hooks (check-yaml, gitleaks, commitizen) passed successfully.
Using Gemini Code Assist

The 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 /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

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 .gemini/ folder in the base of the repository. Detailed instructions can be found here.

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

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 10, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: f77544b3-2a69-4b56-8fab-aa73491cfd9c

📥 Commits

Reviewing files that changed from the base of the PR and between 02243e3 and 0db2bd2.

📒 Files selected for processing (3)
  • .github/workflows/docker.yml
  • CLAUDE.md
  • DESIGN_SPEC.md

📝 Walkthrough

Summary by CodeRabbit

  • Chores
    • Split vulnerability scanning into two severity-tiered scans with distinct pass/fail behavior.
    • Added CI ignore configurations to exempt a specific non-core vulnerability from blocking releases.
  • Documentation
    • Updated CI docs to describe scanning behavior, thresholds, and added notes on dependency checks and coverage.

Walkthrough

Splits 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

Cohort / File(s) Summary
CI/CD Workflow Configuration
.github/workflows/docker.yml
Replaces single Trivy step with two Trivy steps per job: "critical" (exit-code 1, severity CRITICAL, uses .trivyignore.yaml) and "high" (exit-code 0, severity HIGH, continue-on-error, uses .trivyignore.yaml). Updates Grype severity-cutoff from HIGH to CRITICAL. Applied to backend and web jobs.
Security Ignore Configurations
.grype.yaml, .trivyignore.yaml
New files adding an ignore for CVE-2026-22184 with a multiline rationale stating it affects only a contrib demo (untgz) and is disputed upstream; files are documented as synchronized.
Documentation / Spec
CLAUDE.md, DESIGN_SPEC.md
Minor documentation updates: explicitly documents scanning thresholds/behavior, notes added CI checklist items (dependency review, coverage), and mentions the new ignore config files.

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
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely summarizes the main change: splitting vulnerability scans into two tiers (critical-fail and high-warn) in the CI workflow.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, detailing the split Trivy scans, Grype configuration changes, and CVE rationale.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch ci/cve-triage-workflow
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch ci/cve-triage-workflow

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

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
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

There seems to be a typo in the CVE identifier. The correct identifier for the disputed zlib vulnerability is CVE-2022-37434, not CVE-2026-22184. This typo will prevent Trivy from ignoring the vulnerability as intended.

  - id: CVE-2022-37434

@greptile-apps
Copy link
Copy Markdown

greptile-apps bot commented Mar 10, 2026

Greptile Summary

This 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 critical, and introducing .trivyignore.yaml / .grype.yaml config files to suppress the disputed CVE-2026-22184 across both scanners.

  • Two-tier Trivy scan: CRITICAL findings hard-fail (exit-code 1); HIGH findings are surfaced as visible warnings in logs but never block the build (exit-code: "0"). Both steps are symmetric across build-backend and build-web.
  • Grype cutoff lowered to critical: Grype now only blocks on CRITICAL findings. Unlike Trivy, Grype has no "warn-only" mode below the cutoff, so HIGH vulnerabilities are now completely invisible from Grype's output. Trivy's HIGH warn step is the only remaining surface for HIGH-severity findings.
  • CVE-2026-22184 suppressed: Correctly added to both .trivyignore.yaml (with upstream-linked statement) and .grype.yaml (with matching reason). The Grype config is now explicitly wired via config: .grype.yaml, addressing the implicit-discovery concern raised in the previous review thread.
  • continue-on-error: true is redundant on the HIGH Trivy step: exit-code: "0" already guarantees a passing step when vulnerabilities are found; adding continue-on-error: true on top goes further and silently swallows any scan infrastructure errors (DB download failures, image pull errors). This applies to both the build-backend (line 110) and build-web (line 221) jobs.

Confidence Score: 4/5

  • Safe to merge — changes are well-scoped CI config with one minor style concern that doesn't affect correctness.
  • The two-tier scan logic is correctly and symmetrically implemented across both jobs, the CVE suppression is well-documented with upstream references, and the Grype config is now explicitly wired. The only notable issue is that continue-on-error: true alongside exit-code: "0" is redundant and could mask scan tool infrastructure errors in the HIGH step — but in practice the CRITICAL step (which lacks continue-on-error) runs first and would catch most infrastructure failures before the HIGH step is reached.
  • .github/workflows/docker.yml — review the continue-on-error: true on both HIGH Trivy scan steps.

Important Files Changed

Filename Overview
.github/workflows/docker.yml Splits Trivy scans into critical (hard fail) and high (warn-only) steps for both build jobs; lowers Grype cutoff from high to critical; adds explicit config: .grype.yaml wiring. Logic is sound and symmetric across both jobs. Minor: continue-on-error: true is redundant alongside exit-code: "0" and could silently mask scan infrastructure errors.
.trivyignore.yaml New structured YAML ignore file for Trivy; suppresses CVE-2026-22184 with a well-documented statement and upstream references. Missing an expiry-date field (already noted in a previous review thread).
.grype.yaml New Grype config file with a matching ignore entry for CVE-2026-22184. Correct vulnerability: key format for Grype's ignore schema. Kept in sync with .trivyignore.yaml as documented.
CLAUDE.md CI section updated to reflect the new two-tier scan behavior and the two new CVE ignore config files. Documentation change only, accurate and complete.
DESIGN_SPEC.md Adds .grype.yaml and .trivyignore.yaml entries to the project directory tree. Documentation change only.

Sequence Diagram

sequenceDiagram
    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
Loading

Last reviewed commit: 0db2bd2

Comment on lines +4 to +11
- 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
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:

Suggested change
- 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.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 high to critical via severity-cutoff: critical.
  • Add .trivyignore.yaml and .grype.yaml with 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
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.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.

Suggested change
severity-cutoff: critical
severity-cutoff: critical
grype-config: .grype.yaml

Copilot uses AI. Check for mistakes.
image: ${{ steps.scan-ref.outputs.ref }}
fail-build: true
severity-cutoff: high
severity-cutoff: critical
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.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.

Suggested change
severity-cutoff: critical
severity-cutoff: critical
grype-config: .grype.yaml

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 435bdfe and 02243e3.

📒 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.yaml parameter 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.yaml at the repository root will be picked up automatically by anchore/scan-action since the action does not override Grype's config auto-discovery. Grype's default behavior checks for ./.grype.yaml first, which matches your repository structure.

.grype.yaml (1)

1-8: Configuration is correct and properly placed.

The .grype.yaml file 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/untgz demo 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
@Aureliolo Aureliolo merged commit aba48af into main Mar 10, 2026
10 of 11 checks passed
@Aureliolo Aureliolo deleted the ci/cve-triage-workflow branch March 10, 2026 21:26
Comment on lines +108 to +116
- 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
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:

Suggested change
- 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.

Aureliolo added a commit that referenced this pull request Mar 10, 2026
🤖 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).
Aureliolo added a commit that referenced this pull request Mar 11, 2026
🤖 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants