Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 6 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

## [Unreleased]

- PR2 candidate: add isolated locked Ruff 0.17.1, pytest 9.1.1 and pre-commit 4.7.0 CLI environments plus Aqua-locked Mike Farah yq 4.54.1, shfmt 3.14.1 and actionlint 1.7.12. Preserve Python 3.14.8 default / 3.15.0 project selection, launcher independence and immutable runtime boundaries. Final exact-head build and legal/size acceptance remain pending; see `docs/universal-validation-tools.md`.

### Automated upstream refreshes

<!-- remote-dev-upstream-refreshes -->
Expand Down Expand Up @@ -56,6 +54,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

### Added

- PR2 (#281): six pre-CI validation CLIs — Ruff 0.17.1, pytest 9.1.1 and pre-commit 4.7.0 in isolated hash-locked Python CLI environments, plus Aqua-locked Mike Farah yq 4.54.1, shfmt 3.14.1 and actionlint 1.7.12. The public baseline is now 53 commands; Python 3.14/3.15 project precedence, read-only root, private agent state and fail-closed behavior are intact. Exact-head CI and main-push AMD64 build/experimental edge publication succeeded on 2026-10-18. **Live TrueNAS PR2 acceptance is pending**. The project owner approved a targeted distribution/license review and +70.41 MiB base / +68.06 MiB final uncompressed soft-budget exception under #53. This is not a stable release.
- Added bilingual TrueNAS first-install/update runbooks for exact-image-source bootstrap, preflight, host ACL audit and PR2 acceptance, reusing the existing canonical directory initializer rather than adding a second creation script.
- Bundle two independently locked CPython maintenance runtimes: Python 3.14.x remains the default/administrative interpreter, while compatible projects may explicitly select the parallel Python 3.15.x interpreter. Validate both versions on AMD64 and ARM64, preserve version-specific legal evidence and maintain both update lines without relaxing mise's fail-closed policy.
- Expanded the immutable common developer baseline with low-cost filesystem, process, network/DNS/TLS, archive and template diagnostics; promoted already-intentional `python3`, `sqlite3`, `xz`, `ps`, `pgrep`, `gcc` and `npx` commands; and added `tree` for bounded repository inspection while preserving project-owned tool/version precedence and deferring Corepack/Yarn/pnpm shims.
- Weekly exact-digest vulnerability rescanning for published AMD64 edge images with fresh Trivy evidence, bounded 30-day reports, a deduplicated automation-owned alert for fixable `CRITICAL` findings, fail-closed report validation and split scan/issue-write permissions; image rebuilding and promotion remain separate under #93.
Expand Down Expand Up @@ -109,6 +109,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

### Changed

- Reference-image rebuilds (`remote-dev-base:pr2-before` and `remote-dev:pr2-before`) and four optional before-image SPDX/Trivy reports are performed by `scripts/measure-tooling-image-delta.sh`, invoked only on explicit `workflow_dispatch` with `compare_images=true`. Normal PR/main builds run the candidate-image checks without rebuilding previous images; mandatory smoke, notices, SPDX and Trivy gates remain unchanged.
- Bumped the local development baseline from `0.1.0-dev` to `0.1.1-dev`. This does not create a stable release: edge publication keeps its dated `edge-YYYY.MM.DD-<short-sha>` identity and stable/latest remain reserved for an explicit SemVer release.
- Clarified the current browser-password policy: Codex and enabled Antigravity require only a non-empty single-line configured value unless an explicit reviewed insecure override is used; Remote Dev does not enforce minimum length, composition or cross-agent uniqueness, and the two agent configuration entries may intentionally reuse the same password pending a future browser-access/security decision.
- Clarified that the current launcher is a password-free navigation surface rather than the stack's central authentication boundary. Stronger single-entry launcher/gateway authentication remains future #181 work; the existing launcher-auth override is advanced/non-default and is not required for the normal deployment.
Expand Down Expand Up @@ -163,6 +164,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

### Security

- Security fix #286 (2026-10-21): replaced both architecture-locked Python 3.14.8/3.15.0 standalone builds with upstream `20261020` packages carrying patched `pip 26.2.2` / `certifi 2026.10.19`, and repinned `uv` to patched 0.13.4. Both base/final Trivy reports now have **zero fixable CRITICAL** on the reviewed final-head CI. Verified four upstream Python archive digests, two uv digests, runtime notices and SPDX evidence; no scanner suppression or stable release.
- TrueNAS hardening fix #285 (2026-10-21): pre-create `/usr/share/doc/remote-dev` with `root:root 0755` so license/notice files remain traversable even under `cap_drop: [ALL]`; add build-time and cap-dropped functional regression tests. Actual TrueNAS confirmation of the updated image remains pending (#121).

- Hardened launcher, Codex and experimental Antigravity outer containers with read-only root filesystems, `cap_drop: [ALL]`, exact role capability whitelists, private bounded `/tmp` and `/run` tmpfs mounts, explicit PID ceilings and live same-image isolation/toolchain assertions; `/tmp` remains `noexec`, while executable Codex update and Context7 staging remains bounded under transient `/run`.
- Reduced the launcher further after retiring file-backed browser secrets: production launcher containers now start directly as UID/GID `65532` with no added capabilities, while remaining free of bind, persistent, and agent-state mounts and under `no-new-privileges`.
- Added a narrow Antigravity-private `state/antigravity/config` bind at `/root/.gemini/config` so the official CLI can persist project configuration below `projects/` without making the read-only container root or all of `/root/.gemini` writable; host preflight, startup hardening and cross-service canaries enforce the separate boundary.
Expand Down
14 changes: 8 additions & 6 deletions PROJECT_STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@
- Image rebuild/update workflows for bundled components rather than broad in-container package mutation.
- `dev -> edge -> stable = latest` release-channel contract; immutable digest remains the strongest reproduction/rollback identity.

## PR2 candidate (#121)
## PR2 integrated — operational acceptance pending (#121)

The candidate adds exactly Ruff, pytest, pre-commit, Mike Farah yq, shfmt and actionlint (53 public commands). Python CLI graphs use pinned mise/PyPI+uv sidecars and explicit administrative Python 3.14; no shared Python packages are added. See `docs/universal-validation-tools.md` and `.es.md` for evidence and outstanding gates. PR2 acceptance remains pending; PR3 and #180 remain separate.
Security fix #286 (emSign CA trust) and the TrueNAS notice-directory traversal fix #285 are merged into `main` (2026-10-21), with the former exact-head build and post-merge experimental edge publication verified. The notice fix creates `/usr/share/doc/remote-dev` as `root:root 0755` and tests notices under a capability-free container. **Real TrueNAS acceptance of the new image, without restoring DAC capabilities, remains to be recorded in #121.** The release channel is still experimental; there is no stable tag.

PR #281 is squash-merged into `main` at `5a56c3006135d41c913bb09a7f3be37d35c2c4df` and passed main-push `Build AMD64` and experimental `Publish edge AMD64` (2026-10-18). Ruff, pytest, pre-commit, Mike Farah yq, shfmt and actionlint are bundled (53 public commands). Python CLIs use pinned mise/PyPI+uv graphs and administrative Python 3.14 without contaminating the shared interpreters. Owner-approved soft image-size exception and targeted distribution/licensing review are recorded under #53. **Live TrueNAS PR2 acceptance remains outstanding**; #121 is open. See `docs/universal-validation-tools.md` / `.es.md` and the first-install manuals `docs/truenas-install.md` / `.es.md`. PR3 and #180 remain separate.

## Current implementation

Expand Down Expand Up @@ -61,7 +63,7 @@ The current TrueNAS YAML path is deterministic:
- `scripts/truenas-acl-audit.py` validates the TrueNAS Generic/POSIX private-state ACL contract without modifying data;
- no browser-password secret directory is created or required.

See `docs/truenas-acl-contract.md` for the ACL rationale, audit and migration guidance.
See `docs/truenas-acl-contract.md` for ACL rationale and `docs/truenas-install.md` / `.es.md` for exact-revision bootstrap and post-update acceptance instructions.

## Security boundary

Expand Down Expand Up @@ -101,13 +103,13 @@ Exact mutable component versions remain authoritative in `versions.env` and runt

The main implementation foundations are already present. Before the first stable publication the repository still needs to satisfy the support level it actually claims, including:

- merge the #92 documentation synchronization and close the stale status gap;
- reconcile #31 so completed gates are no longer listed as pending and only real release blockers remain;
- complete real TrueNAS PR2/#121 acceptance for both agent roles, persistence, the six tools, project Python selection and session continuity;
- reconcile #31 so only genuine stable-release blockers remain;
- pass the stable-release checklist in `docs/releases.md` on an exact `main` revision/digest;
- complete any open maintenance/security item that #31 identifies as blocking the claimed stable support level;
- create the dated stable changelog section and publish an exact SemVer release only after those gates pass.

Optional/future work such as #181 stronger browser access, #170 native Community App research, #124 inbound key-only SSH, #95 Context7 for Antigravity, #71 SMB, #112 ARM64, #121 universal tooling, #148 concurrent sessions/worktrees and #151 isolated container build/test tooling does not become shipped merely because the core YAML deployment works.
Optional/future work such as #181 stronger browser access, #170 native Community App research, #124 inbound key-only SSH, #95 Context7 for Antigravity, #71 SMB, #112 ARM64, #180 persistent on-demand toolchains, #148 concurrent sessions/worktrees and #151 isolated container build/test tooling does not become shipped merely because PR2's universal baseline has been integrated.

## Upstream pin policy

Expand Down
6 changes: 4 additions & 2 deletions README.es.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Remote Dev Containers — inicio v0.1.1-dev

El candidato PR2 añade seis CLI de validación bloqueadas; consulta [diseño, evidencias y gates pendientes](docs/universal-validation-tools.es.md).
PR2 ya está integrada en `edge`: seis herramientas de validación con versiones bloqueadas y 53 comandos públicos. Consulta el [contrato y las pruebas de PR2](docs/universal-validation-tools.es.md). La aceptación práctica en TrueNAS está pendiente.

Entorno comunitario de agentes de programación accesible desde navegador para Docker, NAS y homelab.

Expand Down Expand Up @@ -28,14 +28,16 @@ Bases actuales:
- un servicio Antigravity opcional aislado con estado privado y runtime del proveedor instalado únicamente mediante acción explícita del usuario;
- Ubuntu 26.04 LTS, AMD64 primero;
- Codex CLI desde un artefacto oficial fijado, más una ruta opcional explícita de runtime oficial conservando el CLI incluido como fallback;
- GitHub CLI, Python 3.14, Node 24, npm, uv, mise, ttyd y tmux;
- GitHub CLI, Python 3.14 predeterminado y 3.15 seleccionable por proyecto, Node 24, npm, uv, mise, ttyd, tmux y las seis herramientas PR2 (`ruff`, `pytest`, `pre-commit`, `yq`, `shfmt`, `actionlint`);
- un único contrato canónico y neutral de persistencia;
- un único contrato runtime de autenticación web basado en `WEB_PASSWORD` para los endpoints de agente protegidos, con entradas separadas para Codex/Antigravity; actualmente los valores pueden reutilizarse entre agentes;
- selección de proyecto debajo de cada `/workspace` privado;
- semántica de releases `dev -> edge -> stable = latest`, manteniendo la identidad fechada de edge separada del canal y de la procedencia inmutable.

## Instalar en TrueNAS SCALE

**[Manual paso a paso: primer despliegue, directorios persistentes y actualización segura](docs/truenas-install.es.md).** Incluye los comandos para obtener los scripts de la misma revisión que la imagen y un checklist de aceptación de PR2.

Utiliza [`compose/truenas.yml`](compose/truenas.yml) como **YAML canónico de Custom App para TrueNAS**. No mantengas una copia independiente del stack en el README.

Los detalles de la UI de TrueNAS pueden cambiar entre versiones. La referencia upstream actual es la [documentación de Custom Apps de TrueNAS](https://www.truenas.com/docs/scale/apps/installcustomappscreens/).
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Remote Dev Containers — starter v0.1.1-dev

The PR2 candidate adds six locked validation CLIs; see [design, evidence and pending gates](docs/universal-validation-tools.md).
PR2 is integrated into `edge`: six pinned validation CLIs and a 53-command public baseline. See the [PR2 tooling contract and evidence](docs/universal-validation-tools.md). Live TrueNAS acceptance is still pending.

Community-maintained, browser-accessible coding-agent environment for Docker, NAS and homelab systems.

Expand Down Expand Up @@ -28,14 +28,16 @@ Current foundations:
- an optional isolated Antigravity service with private state and a vendor runtime installed only by explicit user action;
- Ubuntu 26.04 LTS, AMD64 first;
- Codex CLI from an official pinned release asset, plus an explicit optional official runtime path with the bundled CLI retained as fallback;
- GitHub CLI, Python 3.14, Node 24, npm, uv, mise, ttyd and tmux;
- GitHub CLI, default Python 3.14 and project-selectable Python 3.15, Node 24, npm, uv, mise, ttyd, tmux and six PR2 validation CLIs (`ruff`, `pytest`, `pre-commit`, `yq`, `shfmt`, `actionlint`);
- one canonical role-neutral persistent-data contract;
- one configuration-backed `WEB_PASSWORD` browser-authentication runtime contract for protected agent endpoints, with separate Codex/Antigravity configuration entries; values may currently be reused across agents;
- project selection below each private `/workspace` collection root;
- `dev -> edge -> stable = latest` release semantics, with dated edge build identity separate from channel and immutable provenance.

## Install on TrueNAS SCALE

**[Step-by-step manual: first deployment, persistent directories, and safe updates](docs/truenas-install.md).** Includes same-source script retrieval and a PR2 acceptance checklist.

Use [`compose/truenas.yml`](compose/truenas.yml) as the **canonical TrueNAS Custom App YAML**. Do not maintain a copied stack definition in the README.

TrueNAS UI details may change between releases. The current upstream reference is the [TrueNAS Custom App documentation](https://www.truenas.com/docs/scale/apps/installcustomappscreens/).
Expand Down
15 changes: 7 additions & 8 deletions docs/python-dual-runtime.es.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Contrato de Python 3.14 / 3.15 en paralelo

Estado: **candidato en PR #273; no está fusionado ni desplegado**. Issue responsable: [#270](https://github.com/eXPerience83/remote-dev-containers/issues/270). La ampliación de herramientas universales sigue separada en [#121 PR2](https://github.com/eXPerience83/remote-dev-containers/issues/121); el problema anterior de actualizaciones de Python #257 se corrigió en PR #271. Este documento describe el comportamiento candidato y los requisitos de aceptación, no que TrueNAS ya lo esté ejecutando.
Estado: **PR #273 fusionada en main y distribuida en edge**. Issue [#270](https://github.com/eXPerience83/remote-dev-containers/issues/270), cerrado tras la aceptación de su excepción de tamaño y la CI. La ampliación universal [PR2 #281](https://github.com/eXPerience83/remote-dev-containers/pull/281) también está integrada y publicada como edge desde el 18/10/2026, pero su aceptación operativa en TrueNAS sigue pendiente. El incidente de actualizaciones #257 se corrigió en PR #271. Esta guía describe el contrato implementado; no confunde CI con sesiones reales de agentes.

## Versiones y selección

Expand Down Expand Up @@ -40,22 +40,21 @@ La Action `Build AMD64` ejecuta `scripts/build-local.sh` y estos controles:
| --- | --- |
| Ambos Python exactos y 3.14 predeterminado | `scripts/smoke-test.sh` |
| Selección 3.14/3.15 por proyecto en **Codex y Antigravity** | `scripts/test-mise-project-resolution.sh` |
| Dos venv `uv` sin red: versión exacta, paquetes aislados y Python global intacto | `scripts/test-mise-project-resolution.sh` (añadida a este PR; exige CI verde del último commit) |
| Dos venv `uv` sin red: versión exacta, paquetes aislados y Python global intacto | `scripts/test-mise-project-resolution.sh` (integrada; CI de la PR superada) |
| Versión ausente, proyecto no confiable, sin instalación/fallback y almacén inmutable | `scripts/test-mise-project-resolution.sh` |
| Separación de estados y montajes, credenciales, launcher y rootfs | `scripts/test-cross-service-isolation.sh` |
| Lock: arquitecturas, backend, artefactos, procedencia y regeneración segura | `scripts/test-validate-mise-lock.py` y `scripts/test-regenerate-mise-lock.sh` |
| Retrasos de propagación y errores inesperados | `scripts/test_preflight_python_upstream.py` |
| Licencias y vulnerabilidades | `scripts/validate-third-party-inventory.sh`, `remote-dev-notices --check`, SBOM SPDX, Trivy y bloqueo de críticos corregibles |

CI demuestra ejecución AMD64 y metadatos de lock completos para AMD64/ARM64; **no** implica soporte de ejecución ARM64 (issue #112) ni sesiones reales autenticadas con los agentes. Antes de implantarlo sigue siendo necesaria la validación manual de TrueNAS: interfaz de ambos agentes, historial, selección de intérpretes y seguridad de contenedores.
CI demuestra ejecución AMD64 y metadatos de lock completos para AMD64/ARM64; **no** implica soporte de ejecución ARM64 (issue #112) ni sesiones reales autenticadas con los agentes. La aceptación operativa de cada nueva imagen sigue requiriendo comprobar en TrueNAS las interfaces de los agentes, sus historiales, la selección de intérprete y los límites del contenedor; la integración PR2 se valida por separado en #121.

## Tamaño y decisión de publicación

Añadir el segundo intérprete tiene coste. Con los mismos pins de componentes, el build verde de `main` `b42f9c2` ([38548947867](https://github.com/eXPerience83/remote-dev-containers/actions/runs/38548947867)) ocupa **1.547.987.128 bytes** sin comprimir. El candidato `bba44c0` ([38633948930](https://github.com/eXPerience83/remote-dev-containers/actions/runs/38633948930)) ocupa **1.655.339.677 bytes**. Incremento: **107.352.549 bytes / 102.38 MiB**. La imagen base aumenta 107.351.674 bytes. Supera el umbral **blando** de revisión de 50 MiB de #121: disponer siempre del segundo Python es una decisión explícita de funcionalidad frente a tamaño. No afirmamos conocer el incremento exacto de descarga comprimida.

## Pendiente antes de aceptar
## Decisiones y seguimiento

- CI verde del último commit con el nuevo test de venv, revisión de CodeRabbit y resolución de sus observaciones.
- Coordinar [PR #272](https://github.com/eXPerience83/remote-dev-containers/pull/272), relativo a actualizaciones upstream, y repetir la CI tras cualquier fusión/rebase. No sobrescribir pins desde PR no relacionado.
- Revisar expresamente la excepción de +102.38 MiB, registrar las evidencias en #270/PR #273 y fusionar manualmente solo si todos los controles del commit final pasan.
- Mantener PR2 del #121 (Ruff, pytest, pre-commit, yq, shfmt y actionlint) y PR3 (demanda real de herramientas) como cambios independientes.
- PR #273 está fusionada, con CI de su revisión final validada y excepción de **+102,38 MiB** sin comprimir aceptada explícitamente por el propietario el 17/10/2026. No se interpreta como incremento de descarga comprimida.
- PR2 #281, con las seis herramientas universales, se fusionó y publicó en edge el 18/10/2026. La aceptación de esa imagen en el TrueNAS real sigue pendiente en [#121](https://github.com/eXPerience83/remote-dev-containers/issues/121).
- El estudio PR3 y los toolchains bajo demanda de #180 siguen siendo trabajo independiente. No introducir parámetros de arranque ni instalaciones pasivas para suplirlos.
Loading
Loading