diff --git a/AGENTS.md b/AGENTS.md index ad10f05ef..4b2de3cf5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -141,21 +141,12 @@ Fabro is an AI-powered workflow orchestration platform. Workflows are defined as ### Docker sandbox provider - Docker is the default runtime sandbox provider from `defaults.toml`. The Fabro process must have a working Docker client environment (`DOCKER_HOST`, socket access, Docker Desktop behavior, TLS settings, groups/permissions, and any remote daemon policy are operator responsibilities). - The packaged compose service mounts `/var/run/docker.sock` so the server can create sibling run containers on the host daemon. This is host-root-equivalent under Docker's security model; only use it in the trusted, single-tenant deployment model described by the sandbox code/docs. -- Docker and Daytona are clone-based providers. When a run manifest has a GitHub origin, they clone it into the provider workspace. Present non-GitHub origins fail unless the provider has `skip_clone = true`; absent origins or `skip_clone = true` create an empty workspace without repository files. For an exact commit, the submitted branch names the working branch and the syntactically valid SHA is requested directly. No layer proves branch/SHA ancestry: a fetchable commit is checked out, an unavailable commit fails setup, and branch HEAD is never substituted. -- The sandbox layer also accepts an optional exact commit for future admitted - runs. An exact commit always requires a non-empty branch. The sandbox driver - performs the pin the same way on every provider: it initializes an empty - repository, fetches the SHA directly at the requested depth, and attaches - the admitted branch to it, so the workspace reports the admitted branch - name. Daytona's native toolbox clone serves plain branch clones only; its - commit pin checks the branch head out first, so the driver does not use - it. A successful clone has the pin checked out; the driver's - conformance suite verifies that on every provider, and fabro does not - re-verify HEAD. Never fall back to a newer branch HEAD, and do not wire - this capability directly from legacy `GitContext.sha`. The sandbox layer - does not verify that the commit is reachable from the branch; admission - owns that check. Current production callers remain branch-only until the - RunIntent admission cutover supplies a validated branch/SHA pair. +- Fabro no longer clones a repository into a sandbox: the engine prepares + every run's checkout. `CloneRequest` still travels beside the sandbox spec + so the run record names the origin and branch; fabro validates it (a pin + needs a branch, a non-GitHub origin needs `skip_clone`) and refuses a + request that asks for a clone. Preflight and `fabro exec` initialize + sandboxes with `CloneRequest::none()`, which creates an empty workspace. ### Release automation - `cargo dev release` — creates the next stable release tag. Use `cargo dev release --nightly` for a nightly prerelease. Use `--dry-run` to print planned commands without mutating git or running Cargo, `--skip-tests` only after running the release-mode smoke yourself, and `--release-date YYYY-MM-DD` or `FABRO_RELEASE_DATE` for deterministic version computation.