Conversation
Replace broken selective find command with explicit directory whitelist for container-managed directories. Fix execution order to run setup_nonroot_user before ensure_agent_binaries. - Fix regression from commit 5807889 causing "Permission denied" errors - Whitelist approach: .npm-global, .local, .oh-my-zsh, .skills, .config, .cache, go - Add comprehensive research doc on UID/GID handling patterns - Add devlog documenting fix and industry validation
- release.yml: fix IMAGE_NAME ccyolo→deva, add rust profile build - ci.yml: test deva.sh instead of deprecated claude.sh - version-check.sh: check deva.sh version instead of claude.sh - install.sh: update branding to deva Multi-Agent Environment - Add .deva.example config reference file Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
Claude encountered an error —— View job I'll analyze this and get back to you. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e4e60f4067
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
.github/workflows/release.yml
Outdated
| build-args: | | ||
| BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest |
There was a problem hiding this comment.
Build rust image from a stale base tag
The rust image is always built from ghcr.io/thevibeworks/deva:latest, but in this workflow the base image is only tagged latest when is_default_branch is true and otherwise only gets the version tag. On tag-triggered releases, that means latest may still point at the previous release, so v0.9.1-rust can be built on an older base and miss the just-released fixes (e.g., entrypoint UID/GID changes). Consider using the tag-specific base (e.g., ${{ steps.meta.outputs.version }} or github.ref_name) or the digest from the base build so the rust image always matches the release tag.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
This PR releases version 0.9.1 with a critical fix for Docker container UID/GID permission issues that prevented container startup, along with rebranding updates and GitHub workflow improvements.
- Fixes critical permission denied errors caused by broken UID remapping in docker-entrypoint.sh
- Updates GitHub workflows for deva rebrand and adds rust profile build support
- Adds comprehensive documentation on UID/GID handling patterns and a reference configuration file
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| deva.sh | Updates version from 0.9.0 to 0.9.1 |
| CHANGELOG.md | Documents all changes in this release including the critical UID/GID fix |
| docker-entrypoint.sh | Implements whitelist approach for UID/GID remapping and fixes execution order |
| .github/workflows/release.yml | Updates IMAGE_NAME to deva, adds rust profile build job, updates version update logic |
| .github/workflows/ci.yml | Updates test commands to reference deva.sh instead of claude.sh |
| scripts/version-check.sh | Updates all references from claude.sh to deva.sh for rebrand consistency |
| install.sh | Updates branding text in header comment |
| docs/devlog/20260108-docker-uid-permission-fix.org | New comprehensive devlog documenting the UID/GID fix investigation and implementation |
| docs/UID-GID-HANDLING-RESEARCH.md | New research document covering industry patterns for UID/GID handling in containers |
| .deva.example | New example configuration file demonstrating all supported directives |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
scripts/version-check.sh
Outdated
| main() { | ||
| if [[ ! -f "claude.sh" ]] || [[ ! -f "CHANGELOG.md" ]]; then | ||
| if [[ ! -f "deva.sh" ]] || [[ ! -f "CHANGELOG.md" ]]; then | ||
| error "Must be run from claude-code-yolo root directory" |
There was a problem hiding this comment.
The error message still references "claude-code-yolo" but should reference "deva" to be consistent with the rebrand. This affects the user experience when the script fails.
| error "Must be run from claude-code-yolo root directory" | |
| error "Must be run from deva root directory" |
install.sh
Outdated
| YOLO_WRAPPER="claude-yolo" | ||
| DEVA_LAUNCHER="deva.sh" | ||
| DOCKER_IMAGE="ghcr.io/thevibeworks/deva:latest" | ||
| GITHUB_RAW="https://raw.githubusercontent.com/thevibeworks/claude-code-yolo/main" |
There was a problem hiding this comment.
The GitHub repository URL still references "claude-code-yolo" in the raw URL path. If the repository has been renamed to match the deva rebrand, this URL should be updated to reflect the new repository name. If the repository name hasn't changed, this is acceptable but may be confusing given the rebrand to "deva".
| GITHUB_RAW="https://raw.githubusercontent.com/thevibeworks/claude-code-yolo/main" | |
| GITHUB_RAW="https://raw.githubusercontent.com/thevibeworks/deva/main" |
- version-check.sh: error message now says "deva" not "claude-code-yolo" - install.sh: GITHUB_RAW URL points to renamed repo thevibeworks/deva - release.yml: rust image uses version-specific base tag, not :latest Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
Claude finished @lroolle's task in 1m 14s —— View job Security Audit - PR #158 🔴 CRITICAL FINDINGSConducting paranoid security audit focusing on container boundaries, authentication flows, and privilege escalation vectors. Security Audit Checklist
🚨 BLOCKING SECURITY ISSUES1. CRITICAL - Base Image Supply Chain Attack VectorFile: build-args: |
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}Issue: Rust profile builds from Attack Vector:
Mitigation: Use specific digest from base build output instead of tag reference. 2. HIGH - Docker Socket Permission EscalationFile: chmod 666 /var/run/docker.sock 2>/dev/null || trueIssue: World-writable Docker socket = root access on host. Agent can:
Current State: Auto-mounted by default, disabled only with 3. MEDIUM - UID/GID Injection via Environment VariablesFile: if [ "$DEVA_UID" = "0" ]; then
echo "[entrypoint] WARNING: Host UID is 0. Using fallback 1000."
DEVA_UID=1000
fiIssue: Only blocks UID=0, allows other dangerous values:
4. MEDIUM - Whitelist chown Race ConditionFile: for dir in .npm-global .local .oh-my-zsh .skills .config .cache go; do
if [ -d "$DEVA_HOME/$dir" ] && [ ! -L "$DEVA_HOME/$dir" ]; then
chown -R "$DEVA_UID:$DEVA_GID" "$DEVA_HOME/$dir" 2>/dev/null || true
fi
doneIssue: Time-of-check vs time-of-use race. Attacker can:
🔶 HIGH-RISK FINDINGS1. Configuration Injection PotentialFile: Risk: Users may inadvertently expose sensitive directories. Config parsing needs validation against dangerous paths ( 2. Shell Injection in Version DetectionFile: version=$($path --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)Risk: If
|
Summary
Test Plan
Closes #157 follow-up
Generated with Claude Code