Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
1c82c0e
feat(sandbox): add code-runner foundation (M1 — runtime image, egress…
larryro May 19, 2026
ded283e
feat(convex): add code_run agent tool + sandboxExecutions audit pipel…
larryro May 19, 2026
4c8af74
feat(cli): integrate sandbox + sandbox-egress services + tale doctor …
larryro May 19, 2026
741c6c5
fix(sandbox): preserve cause + narrow unsafe assertions in sandbox cl…
larryro May 19, 2026
2b51134
test(sandbox): unit-test reserveSlotAndInsert quota + watchdog (R1.22…
larryro May 19, 2026
71e86c1
fix(sandbox): make L4 smoke tests pass end-to-end
larryro May 19, 2026
64c33c1
fix(sandbox): accept Convex doc-id alphabet in executionId
larryro May 19, 2026
24e7f05
feat(sandbox): publish 8003 for bun dev + wire code_run into chat-age…
larryro May 19, 2026
18693d3
fix(sandbox): attach generated files as chat-card parts (appendFilePart)
larryro May 19, 2026
09127fd
fix(sandbox): make SANDBOX_TOKEN optional (rag/crawler parity)
larryro May 19, 2026
978d4f9
fix(sandbox): default SANDBOX_URL to localhost (rag/crawler-parity fo…
larryro May 19, 2026
e64da4c
feat(sandbox): sse phase events + artifact run-state schema (M5a)
larryro May 19, 2026
71c68cc
feat(sandbox): wire artifact_create / artifact_edit to executeCode fo…
larryro May 19, 2026
56fa2f6
feat(sandbox): fold code_run into artifact system as python_runnable …
larryro May 19, 2026
bb762c7
fix(sandbox): register runnable types in artifact bar / pill icon maps
larryro May 19, 2026
59c5341
fix(sandbox): surface run outcome in artifact_create / artifact_edit …
larryro May 19, 2026
8a7a714
fix(sandbox): always route runnable artifacts through the runnable re…
larryro May 19, 2026
2f7bd97
fix(sandbox): runnable canvas — pin execution panel above source, dro…
larryro May 19, 2026
e753889
fix(platform): prevent duplicate artifact row when onInputDelta loses…
larryro May 19, 2026
efb4da1
feat(platform): split runnable execution into a dedicated artifact_ru…
larryro May 19, 2026
7250d82
fix(platform): hide empty RUN panel before artifact_run is called
larryro May 19, 2026
56512b2
fix(platform): close placeholder-insert guard synchronously to preven…
larryro May 19, 2026
e3481a4
fix(sandbox): unblock CI on the sandbox PR
larryro May 20, 2026
c8918da
fix(sandbox): suppress Trivy AVD-DS-0002/0026 via .trivyignore.yaml
larryro May 20, 2026
df479b3
fix(sandbox): apply review findings across spawner, convex, ui, ci
larryro May 20, 2026
c5a77bd
fix(sandbox): unblock platform + sandbox image builds in CI
larryro May 20, 2026
b9128c4
fix(sandbox): use Anonymous, not AnonymousHeader, in egress tinyproxy…
larryro May 20, 2026
ed4cb11
fix(sandbox): include sandbox images in release pipeline and runtime …
larryro May 20, 2026
80c3b88
fix(sandbox): cover sandbox images in CI builds and vulnerability scans
larryro May 20, 2026
a5e9faf
fix(sandbox): cascade artifact finalize when a sandbox execution dies
larryro May 20, 2026
8606379
fix(sandbox): close concurrency races in spawner
larryro May 20, 2026
bedf641
fix(sandbox): harden egress proxy SSRF defenses (fail-closed, IPv6, f…
larryro May 20, 2026
64a8400
fix(sandbox): bind HMAC signature to method + path + timestamp
larryro May 20, 2026
64ac84f
fix(sandbox): clean up runnable-artifact UI rendering
larryro May 20, 2026
afefb19
fix(sandbox): clean up chat-agent runnable-flow prompt contradictions
larryro May 20, 2026
d1dba31
fix(sandbox): tighten artifact agent-tool error surfaces
larryro May 20, 2026
4c85047
fix(sandbox): tighten state machine + RLS + lazy GC
larryro May 20, 2026
2c5954b
fix(sandbox): smoke test catches new HMAC contract + negative cases
larryro May 20, 2026
caddcb5
chore(sandbox): drop dead code and stale comments
larryro May 20, 2026
cc8f6b2
fix(sandbox): cap spawner/egress resources, decouple health probes
larryro May 20, 2026
909285c
docs(sandbox): refresh sandboxExecutions schema header
larryro May 20, 2026
65bf798
fix(sandbox): tolerate rate-limiter failure during lazy GC
larryro May 20, 2026
6d1289b
fix(sandbox): drop unused auth exports, tidy knip config
larryro May 20, 2026
4919daa
fix(sandbox): include services/sandbox manifest in web + docs images
larryro May 20, 2026
e9f38be
fix(sandbox): stream oversized smoke-test body via file, not argv
larryro May 20, 2026
c58e7f4
fix(sandbox): probe egress proxy with small endpoint, not 40MB index
larryro May 20, 2026
3650313
fix(sandbox): unblock package install via egress return path + SSE ke…
larryro May 20, 2026
e549125
fix(platform): split chat-agent visual-content rule into 3 explicit p…
larryro May 20, 2026
4859ade
chore(convex): sync generated api.d.ts after sandbox module rename
larryro May 20, 2026
361a58e
fix(platform): close chat video-link detection to known hosts only
larryro May 20, 2026
b204088
fix(platform): dedup artifact_create by toolCallId to prevent double-…
larryro May 20, 2026
d8a6595
fix(sandbox): harden spawner against OOM, HMAC replay, latent footguns
larryro May 21, 2026
0df8bf5
fix(sandbox): close storage-blob leaks + bound watchdog scan + harden…
larryro May 21, 2026
db3b927
fix(platform): close install-script injection + stale run-state + RLS…
larryro May 21, 2026
c5f42e5
fix(ui): icu template, segmented-radio a11y, hardware locale + yearly…
larryro May 21, 2026
170c26a
fix(sandbox): trigger trivy on dockerfile/dockerignore + backport com…
larryro May 21, 2026
558e3ef
fix(sandbox): wire-schema drift guard + runtime body validation
larryro May 21, 2026
daa8501
refactor(platform): multi-file artifacts + title-idempotent create
larryro May 21, 2026
808ac9c
feat(platform): artifact_run accepts path + multi-file sandbox staging
larryro May 21, 2026
061560f
fix(platform): persist video-link chip dismissal across refresh
larryro May 21, 2026
fce4a42
feat(platform): canvas multi-file sidebar + per-file runs + create st…
larryro May 21, 2026
3d4e96f
fix(platform): preserve structured parts and streamed text on stop ge…
larryro May 21, 2026
f5ab820
feat(sandbox): artifact_run accepts steps[] for sequential multi-scri…
larryro May 21, 2026
f2f47fa
fix(platform): user-stop cascade, live sandbox stdout tail, post-revi…
larryro May 21, 2026
bfd6769
fix(platform): artifact UX redesign + chat freeze on long tool inputs
larryro May 21, 2026
63eba57
fix(platform): persist artifact streaming content incrementally
larryro May 21, 2026
89f77a3
feat(platform): canvas run-result panel — entry-file primary, others …
larryro May 21, 2026
36ed0e8
feat(sandbox): pre-stage artifact's prior run outputs into /workspace…
larryro May 21, 2026
d836c75
fix(platform): settle stranded artifact_create placeholders on execut…
larryro May 21, 2026
3094193
refactor(platform): retire streaming-create; artifact_edit gains chun…
larryro May 21, 2026
2a17e38
fix(platform): canvas content streaming display recognises artifact_e…
larryro May 21, 2026
46fccae
fix(platform): preserve prior runOutputFiles across failed/cancelled …
larryro May 22, 2026
30229b3
fix(platform): defer artifact_edit streamingPath commit until path li…
larryro May 22, 2026
8d1d9c2
refactor(platform): split artifacts/internal_mutations into thin wrap…
larryro May 22, 2026
535d554
feat(platform): add artifactFiles / artifactRuns / artifactRunFiles t…
larryro May 22, 2026
8f5563d
feat(platform): phase 2 — spawner harvests on failure + finalize/pre-…
larryro May 22, 2026
c255c5d
feat(platform): phase 3 — artifact_run inputs/runId + artifact_edit p…
larryro May 22, 2026
ee09f1a
refactor(platform): strict-CRUD artifact tool surface + retire artifa…
larryro May 22, 2026
7c50111
refactor(platform): rename file_* tools to artifact_file_* + de-pollu…
larryro May 22, 2026
31da868
fix(platform): wire chat-agent to new artifact_file_* CRUD tools
larryro May 22, 2026
4cfe128
fix(platform): gate artifact_file_{create,update} preflight on closed…
larryro May 22, 2026
538d5af
fix(platform): keep stale run output visible with "Source edited" badge
larryro May 22, 2026
0db33c5
fix(sandbox): drop main.py/main.js reservation in artifact_run
larryro May 22, 2026
953477f
chore(sandbox): stabilize byte-cap tests and drop dead code
larryro May 22, 2026
95630dd
fix(platform): prevent tool-args truncation on large file writes
larryro May 22, 2026
d5efb55
fix(platform): bump artifact_file size hint from 12KB to 40KB
larryro May 22, 2026
e165ab4
fix(sandbox): raise /v1/execute body cap default from 256 KB to 20 MB
larryro May 22, 2026
5f0a039
fix(platform): enrich run output files with storageId so canvas downl…
larryro May 22, 2026
8b031fe
feat(platform): add script_runnable polyglot artifact (Python + Node …
larryro May 23, 2026
f061763
refactor(platform): drop flat-array packages input, force grouped {py…
larryro May 23, 2026
ced7378
fix(platform): walk back past empty-output runs when pre-staging arti…
larryro May 23, 2026
0c97edb
fix(platform): pre-stage walks all runs status-agnostic, never wipes …
larryro May 23, 2026
e3b1350
fix(sandbox): validator strips priorOutputFiles, defeating pre-stage …
larryro May 23, 2026
932af1d
feat(platform): reject obvious wrong-bucket package specs at tool input
larryro May 23, 2026
6428ca3
feat(sandbox): impl Phase A - wire protocol & types for presigned-URL…
larryro May 23, 2026
aef550f
feat(sandbox): impl Phase B - Convex side for presigned-URL upload pi…
larryro May 23, 2026
4851736
feat(sandbox): impl Phase C - spawner-side presigned-URL upload pipeline
larryro May 23, 2026
8ecb882
feat(sandbox): impl Phase D - infrastructure (Caddy, compose, CLI def…
larryro May 23, 2026
20422c5
feat(sandbox): finish presigned-URL pipeline + carry-forward outputs
larryro May 23, 2026
7ca176a
feat(platform): cumulative output manifest + fatal pre-stage attestation
larryro May 23, 2026
469cff4
fix(platform): make sandbox capability limits explicit in artifact_run
larryro May 23, 2026
947c9e0
chore: drop unused exports flagged by knip
larryro May 23, 2026
c36a9dd
fix(sandbox): close P0/P1 audit findings across spawner + Convex
larryro May 23, 2026
81667ce
fix(sandbox): make artifact uploads work under docker compose
larryro May 24, 2026
20baa61
fix(platform): close 5 P0 + 10 P1 sandbox/artifact review findings
larryro May 24, 2026
d9ad12d
fix(sandbox): allow sha256 in executeCode returns validator
larryro May 24, 2026
6a0d256
chore(sandbox): drop unused exports flagged by knip
larryro May 24, 2026
23b2bdd
fix(sandbox): update smoke test for current /v1/execute contract
larryro May 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .commitlintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"pii",
"proxy",
"rag",
"sandbox",
"storybook",
"ui",
"web",
Expand Down
4 changes: 4 additions & 0 deletions .env.test
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,7 @@ POSTGRES_PASSWORD=test_password_e2e
# Convex
INSTANCE_SECRET=0000000000000000000000000000000000000000000000000000000000000000
INSTANCE_NAME=tale_platform

# Sandbox spawner — fixed test-only HMAC token so the smoke script can sign
# /v1/execute. Production deploys auto-mint via the CLI's ensure-env helper.
SANDBOX_TOKEN=test-sandbox-token-do-not-use-in-production-deadbeefcafef00d
60 changes: 48 additions & 12 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,12 @@ jobs:
- 'services/platform/**'
- 'packages/ui/**'
- 'packages/webui/**'
sandbox:
- 'services/sandbox/**'
sandbox-egress:
- 'services/sandbox-egress/**'
sandbox-runtime:
- 'services/sandbox-runtime/**'
ci_tests:
- 'tests/container-*'
- 'compose.test.yml'
Expand All @@ -118,6 +124,9 @@ jobs:
- 'services/rag/**'
- 'services/platform/**'
- 'services/proxy/**'
- 'services/sandbox/**'
- 'services/sandbox-egress/**'
- 'services/sandbox-runtime/**'

- name: Compute service matrix
id: services
Expand All @@ -127,10 +136,11 @@ jobs:
echo "list=${SERVICES}" >> "$GITHUB_OUTPUT"
echo "Services to build: ${SERVICES}"

# Vulnerability scan only covers the six compose-stack services that
# `build` actually pushes to GHCR. Web and docs use their own compose
# stacks and are reachable via security.yml's filesystem scan.
SCANNABLE=$(echo "${SERVICES}" | jq -c '[.[] | select(. == "db" or . == "convex" or . == "crawler" or . == "rag" or . == "platform" or . == "proxy")]')
# Vulnerability scan covers the compose-stack services + sandbox
# trio that `build` actually pushes to GHCR. Web and docs use their
# own compose stacks and are reachable via security.yml's
# filesystem scan.
SCANNABLE=$(echo "${SERVICES}" | jq -c '[.[] | select(. == "db" or . == "convex" or . == "crawler" or . == "rag" or . == "platform" or . == "proxy" or . == "sandbox" or . == "sandbox-egress" or . == "sandbox-runtime")]')
echo "scannable=${SCANNABLE}" >> "$GITHUB_OUTPUT"
echo "Services to scan: ${SCANNABLE}"

Expand Down Expand Up @@ -180,14 +190,25 @@ jobs:
matrix:
# Compose-stack services. Keep in sync with build.yml (smoke/validate
# pull loops) and cleanup-pr-images.yml matrix.
service: [db, convex, crawler, rag, platform, proxy]
service:
[
db,
convex,
crawler,
rag,
platform,
proxy,
sandbox,
sandbox-egress,
sandbox-runtime,
]

steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- name: Reclaim disk space
if: matrix.service == 'platform' || matrix.service == 'rag' || matrix.service == 'crawler' || matrix.service == 'convex'
if: matrix.service == 'platform' || matrix.service == 'rag' || matrix.service == 'crawler' || matrix.service == 'convex' || matrix.service == 'sandbox-runtime'
run: |
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL
sudo docker image prune -af
Expand Down Expand Up @@ -316,16 +337,22 @@ jobs:
# `docker compose build` step.
- name: Pull images from GHCR
run: |
# Compose-stack services. Keep in sync with build.yml (build matrix)
# and cleanup-pr-images.yml matrix.
# Compose-stack services + sandbox-runtime. Keep in sync with build.yml
# (build matrix) and cleanup-pr-images.yml matrix. sandbox-runtime is
# not a compose service but the spawner pulls it at boot — re-tag it
# locally so smoke tests with PULL_POLICY=never find it.
TAG="${{ needs.changes.outputs.image_tag }}"
REGISTRY_PATH="${{ env.REGISTRY }}/${{ github.repository }}"
for svc in db convex crawler rag platform proxy; do
for svc in db convex crawler rag platform proxy sandbox sandbox-egress sandbox-runtime; do
IMAGE="${REGISTRY_PATH}/tale-${svc}:${TAG}"
echo "Pulling ${IMAGE}..."
docker pull "${IMAGE}"
docker tag "${IMAGE}" "ghcr.io/tale-project/tale/tale-${svc}:latest"
done
# See note in image-validate: the spawner's SANDBOX_RUNTIME_IMAGE
# defaults to the unscoped `tale-sandbox-runtime:latest`.
docker tag "ghcr.io/tale-project/tale/tale-sandbox-runtime:latest" \
"tale-sandbox-runtime:latest"

- name: Run smoke tests
run: bash tests/container-smoke-test.sh
Expand Down Expand Up @@ -511,16 +538,24 @@ jobs:

- name: Pull images from GHCR
run: |
# Compose-stack services. Keep in sync with build.yml (build matrix)
# and cleanup-pr-images.yml matrix.
# Compose-stack services + sandbox-runtime. Keep in sync with build.yml
# (build matrix) and cleanup-pr-images.yml matrix. sandbox-runtime is
# not a compose service but the spawner pulls it at boot — re-tag it
# locally so PULL_POLICY=never validation finds it.
TAG="${{ needs.changes.outputs.image_tag }}"
REGISTRY_PATH="${{ env.REGISTRY }}/${{ github.repository }}"
for svc in db convex crawler rag platform proxy; do
for svc in db convex crawler rag platform proxy sandbox sandbox-egress sandbox-runtime; do
IMAGE="${REGISTRY_PATH}/tale-${svc}:${TAG}"
echo "Pulling ${IMAGE}..."
docker pull "${IMAGE}"
docker tag "${IMAGE}" "ghcr.io/tale-project/tale/tale-${svc}:latest"
done
# The spawner reads SANDBOX_RUNTIME_IMAGE which defaults to
# `tale-sandbox-runtime:latest` (unscoped). Mirror the tag so the
# spawner's boot-time `ensureImage` hits a local cache instead of
# trying to pull from GHCR.
docker tag "ghcr.io/tale-project/tale/tale-sandbox-runtime:latest" \
"tale-sandbox-runtime:latest"

- name: Run image validation
run: bash tests/container-image-test.sh
Expand Down Expand Up @@ -605,6 +640,7 @@ jobs:
format: 'sarif'
output: '${{ matrix.service }}-trivy.sarif'
severity: 'HIGH,CRITICAL'
trivyignores: '.trivyignore.yaml'

- name: Upload SARIF
uses: github/codeql-action/upload-sarif@e46ed2cbd01164d986452f91f178727624ae40d7 # v4.35.3
Expand Down
13 changes: 12 additions & 1 deletion .github/workflows/cleanup-pr-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,18 @@ jobs:
matrix:
# Compose-stack services. Keep in sync with build.yml (build matrix +
# smoke/validate pull loops).
service: [db, convex, crawler, rag, platform, proxy]
service:
[
db,
convex,
crawler,
rag,
platform,
proxy,
sandbox,
sandbox-egress,
sandbox-runtime,
]

steps:
- name: Delete PR-tagged versions
Expand Down
28 changes: 22 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ jobs:
- { name: convex }
- { name: web }
- { name: docs }
- { name: sandbox }
- { name: sandbox-egress }
- { name: sandbox-runtime }
arch:
- { name: amd64, runner: ubuntu-latest, platform: linux/amd64 }
- { name: arm64, runner: ubuntu-24.04-arm, platform: linux/arm64 }
Expand All @@ -86,7 +89,7 @@ jobs:
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- name: Reclaim disk space
if: matrix.service.name == 'platform' || matrix.service.name == 'rag' || matrix.service.name == 'crawler' || matrix.service.name == 'convex'
if: matrix.service.name == 'platform' || matrix.service.name == 'rag' || matrix.service.name == 'crawler' || matrix.service.name == 'convex' || matrix.service.name == 'sandbox-runtime'
run: |
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL
sudo docker image prune -af
Expand Down Expand Up @@ -156,7 +159,7 @@ jobs:
run: |
VERSION="${{ needs.prepare.outputs.version_number }}"
ARCH="amd64"
for svc in platform rag crawler db proxy convex web docs; do
for svc in platform rag crawler db proxy convex web docs sandbox sandbox-egress sandbox-runtime; do
IMAGE="${{ env.REGISTRY }}/${{ github.repository }}/tale-${svc}:${VERSION}-${ARCH}"
echo "Pulling ${IMAGE}..."
docker pull "${IMAGE}"
Expand Down Expand Up @@ -207,7 +210,20 @@ jobs:

strategy:
matrix:
service: [platform, rag, crawler, db, proxy, convex, web, docs]
service:
[
platform,
rag,
crawler,
db,
proxy,
convex,
web,
docs,
sandbox,
sandbox-egress,
sandbox-runtime,
]

steps:
- name: Login to GHCR
Expand Down Expand Up @@ -256,7 +272,7 @@ jobs:
run: |
VERSION="${{ needs.prepare.outputs.version_number }}"
REGISTRY="${{ env.REGISTRY }}/${{ github.repository }}"
for svc in platform rag crawler db proxy convex web docs; do
for svc in platform rag crawler db proxy convex web docs sandbox sandbox-egress sandbox-runtime; do
IMAGE="${REGISTRY}/tale-${svc}:${VERSION}"
echo "Verifying manifest: ${IMAGE}"
docker manifest inspect "${IMAGE}" > /dev/null 2>&1 || {
Expand Down Expand Up @@ -310,13 +326,13 @@ jobs:
run: |
echo "## Release ${{ needs.prepare.outputs.version }} Complete" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "All 8 service images have been built, tested, and pushed to GHCR (native amd64 + arm64)." >> "$GITHUB_STEP_SUMMARY"
echo "All 11 service images have been built, tested, and pushed to GHCR (native amd64 + arm64)." >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "### Images" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "| Service | Image |" >> "$GITHUB_STEP_SUMMARY"
echo "|---------|-------|" >> "$GITHUB_STEP_SUMMARY"
for svc in platform rag crawler db proxy convex web docs; do
for svc in platform rag crawler db proxy convex web docs sandbox sandbox-egress sandbox-runtime; do
echo "| ${svc} | \`${{ env.REGISTRY }}/${{ github.repository }}/tale-${svc}:${{ needs.prepare.outputs.version_number }}\` |" >> "$GITHUB_STEP_SUMMARY"
done
echo "" >> "$GITHUB_STEP_SUMMARY"
Expand Down
18 changes: 17 additions & 1 deletion .github/workflows/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@ on:
- 'services/rag/uv.lock'
- 'services/rag/pyproject.toml'
- 'packages/*/pyproject.toml'
# Dockerfile + dockerignore changes alter what trivy's misconfig
# scanner sees on the fs-scan path; .trivyignore.yaml changes can
# silently un-suppress findings. Round-2 R2-B11 found this branch
# added new Dockerfiles + a trivyignore without re-triggering the
# security scan — PRs went out blind.
- 'services/*/Dockerfile'
- 'services/*/Dockerfile.dockerignore'
- '.trivyignore.yaml'
- '.trivyignore'
- '.github/workflows/security.yml'
push:
branches:
Expand All @@ -22,6 +31,10 @@ on:
- 'services/rag/uv.lock'
- 'services/rag/pyproject.toml'
- 'packages/*/pyproject.toml'
- 'services/*/Dockerfile'
- 'services/*/Dockerfile.dockerignore'
- '.trivyignore.yaml'
- '.trivyignore'
- '.github/workflows/security.yml'
schedule:
- cron: '0 3 * * 1' # Monday 03:00 UTC
Expand Down Expand Up @@ -83,7 +96,7 @@ jobs:
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- name: Run Trivy filesystem scan
uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # 0.35.0
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: 'fs'
scan-ref: '.'
Expand All @@ -93,6 +106,9 @@ jobs:
exit-code: '0'
scanners: 'vuln,secret,misconfig'
ignore-unfixed: true
# Per-path misconfig suppressions live in .trivyignore.yaml; the
# plain .trivyignore is auto-detected but cannot scope by path.
trivyignores: '.trivyignore.yaml'
# Skip handlebars Dockerfile templates: handlebars syntax confuses
# the misconfig scanner. The generated Dockerfiles are scanned
# downstream when each service runs its own build.
Expand Down
37 changes: 37 additions & 0 deletions .trivyignore.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# =============================================================================
# Trivy Ignore File (YAML)
# =============================================================================
# Per-path suppressions for vulnerabilities, misconfigurations, secrets, and
# licenses. Plain CVE-only entries can also live in `.trivyignore` next to
# this file; YAML is needed when scoping by `paths`.
#
# Docs: https://aquasecurity.github.io/trivy/latest/docs/configuration/filtering/
# Loaded by CI via `trivyignores:` on the trivy-action invocations in
# .github/workflows/security.yml and .github/workflows/build.yml.
# =============================================================================

misconfigurations:
# AVD-DS-0002: "Image user should not be 'root'"
- id: AVD-DS-0002
paths:
- 'services/sandbox/Dockerfile'
statement: |
Sandbox spawner needs root inside the container to talk to the mounted
/var/run/docker.sock. The docker socket is the security boundary, not
the in-container UID. Documented in services/sandbox/Dockerfile.
- id: AVD-DS-0002
paths:
- 'services/sandbox-egress/Dockerfile'
statement: |
Egress proxy entrypoint runs as root only long enough to chown the log
file; tinyproxy itself drops privileges to `nobody` at bind time via
tinyproxy.conf. Documented in services/sandbox-egress/Dockerfile.

# AVD-DS-0026: "No HEALTHCHECK defined"
- id: AVD-DS-0026
paths:
- 'services/sandbox-runtime/Dockerfile'
statement: |
Sandbox runtime is an ephemeral one-shot image: the spawner runs it per
code_run call, entrypoint.sh executes the user code, and the container
exits. There is no long-running process to health-check.
18 changes: 17 additions & 1 deletion bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading