- Keep CI workflows and developer-facing docs on normal project test commands.
- Prefer skill
ghostscope-e2e-runnerfor all e2e execution requests. - Install the internal runner skill with
./scripts/e2e/runner/install_ghostscope_e2e_runner_skill.shand restart Codex. - Agent-driven e2e should default to the runner service API instead of invoking local container helper scripts directly.
- If the runner service is not running, tell the user to start it manually instead of trying to start it on their behalf, because it typically requires
sudo. - Do not create commits unless the user explicitly asks for a commit.
- First classify the change before choosing validation scope:
- docs-only, comment-only, AGENTS-only, or other non-runtime text edits
- CI/workflow-only edits
- normal Rust or runtime behavior changes
- container or topology-related changes
- Treat
.github/workflows/ci.ymland.github/workflows/container-e2e.ymlas the source of truth for CI-parity validation scope and intended topology coverage. - Do not work directly on
mainfor non-trivial changes. - Prefer branch names in the form
<type>/<short-kebab-case-summary>. - Common prefixes:
feature/,fix/,docs/,refactor/,test/,chore/,ci/. - Keep branch names concise, ASCII-only, and descriptive. An issue ID prefix is fine when the repo or task already uses one.
- Match verification scope to the kind of change instead of running every check by default.
- Docs-only, comment-only, AGENTS-only, and other non-runtime text edits do not require
cargo fmt,cargo clippy, or e2e. - CI/workflow-only edits do not require routine local e2e unless they change e2e behavior, topology coverage, or runner invocation semantics.
- For normal Rust or runtime behavior changes, run formatting, linting, and standard e2e through the
ghostscope-e2e-runnerskill. - Local formatting:
cargo fmt --all(single run is enough). - CI uses
cargo fmt --all -- --checkfor verification only. - Minimum local checks, aligned with CI:
cargo clippy --all-targets --all-features -- -D warnings
- If full-workspace
clippyis too slow or blocked, runclippyfor affected crates and clearly report scope. - Do not default to container-topology e2e during routine day-to-day development.
- Only add container-topology e2e when the change is container-related or when the user explicitly asks for it.
- Reserve container-topology e2e for changes that touch container behavior, PID namespace handling, sandbox/topology logic, Docker execution, runner topology requests, or related e2e infrastructure.
- When routine development needs extra integration confidence, prefer a single full
host -> docker-privaterun before broader container-topology coverage. - Container/topology verification expectations:
- container, PID namespace, sandbox, topology, Docker, or runner-topology changes: add full e2e for
host -> docker-private - same-sandbox private-container behavior changes: also add full e2e for
docker-private -> same docker-private - host-PID container behavior changes: also add smoke e2e for
docker-host -> same docker-host
- container, PID namespace, sandbox, topology, Docker, or runner-topology changes: add full e2e for
- Preferred container-topology escalation order:
- full e2e for
host -> docker-private - full e2e for
docker-private -> same docker-privatewhen same-sandbox private-container behavior is relevant - smoke e2e for
docker-host -> same docker-hostwhen host-PID container behavior is relevant
- full e2e for
- During normal agent work, align with CI by matching topology intent in runner requests rather than manually reconstructing CI shell commands.
- Use direct topology-aware
sudo env ... cargo testorscripts/e2e/container/*.shonly as a fallback when the runner service is unavailable or when you are explicitly validating CI parity outside the runner. - If runner service, Docker, or required privileges are unavailable, report that explicitly with the blocked verification scope.
- Handoff messages must state what changed, what verification actually ran, and any blocked or intentionally skipped coverage.
- If standard e2e or container-topology e2e was not run, say why in one sentence.
- If e2e is blocked because the runner service is not running, explicitly say that the user should start the runner manually since it usually needs
sudo. - If container-topology e2e is intentionally skipped because the change is unrelated, say so explicitly in the handoff.
- Do not claim validation that was not actually executed.
- Keep user-facing messages concise and concrete.
- When a commit is requested, use conventional commits format.
- Format the subject as
<type>: <imperative summary>. - Keep the subject concise and specific, use a lowercase type, and do not end the subject with a period.
- Avoid vague subjects such as
update stufforfix issue. - Add a body only when the reason, scope, or risk is not obvious from the subject. Keep the body short and focused on why the change exists.
- Wrap commit body lines at 80 columns or fewer.
- Prefer one logical change per commit.