Validation stays outside model control.
The model can request tests, typecheck, lint, or build. It cannot provide the command. The exact success criteria come from trusted workspace configuration.
I built CodePilot around one rule: the model can propose code, but it cannot declare its own work correct.
It works inside a managed Git workspace, makes bounded changes, runs human-configured checks in a sandbox, repairs real failures, and only completes when the evidence still matches the code being returned.
Most coding-agent demos end at “done.” I was more interested in everything that has to happen before that word can be trusted.
CodePilot separates model output from execution authority. The model can inspect, reason, request bounded writes, and react to failures. It cannot choose the repository root, validation command, sandbox trust level, repair budget, or what qualifies as verified completion.
That constraint shaped the project more than the UI did. The interesting work is in the boundaries: path confinement, hash-gated mutation, sandbox execution, failure classification, concurrency, evidence persistence, and the final revision check.
The important line in CodePilot is not between one model and another. It is between untrusted model intent and the trusted code that decides what can actually happen.
The model can request tests, typecheck, lint, or build. It cannot provide the command. The exact success criteria come from trusted workspace configuration.
Sensitive paths are denied, stale-file overwrites are rejected, patch impact is measured before mutation, and repair work shares one cumulative change budget.
Checks must execute and pass, the workspace and validation configuration must still match, and VerificationEvidence is committed atomically with the COMPLETED state.
These are the parts of CodePilot I would actually want to discuss in a technical interview—the places where “just call the model” stopped being enough.
src/tools/workspace/write-file.tsProblemA model may read a file and propose an edit after something else has already changed it.
DecisionExisting files require the SHA-256 content hash returned by the read tool. A mismatch rejects the write before mutation.
ResultOptimistic concurrency became part of the tool contract, not a prompt instruction.
src/validation · src/agent/verification.tsProblemA coding agent should not be allowed to choose an easier test command after seeing a failure.
DecisionValidation tools accept zero model-controlled command arguments. Commands come from trusted workspace configuration and historical records store only their hash identity.
ResultSuccess criteria stay outside model authority throughout repair.
src/agent/workspace-revision.tsProblemA run could pass validation, then the workspace or validation configuration could change before completion.
DecisionCodePilot hashes the workspace revision and validation configuration and re-checks both before atomically persisting COMPLETED with VerificationEvidence.
ResultThe evidence is bound to the code that is actually returned.
src/sandbox · src/agent/run-coding-task.tsProblemA missing Docker daemon or failed sandbox launch should not consume the model's repair budget.
DecisionInfrastructure outcomes are classified separately, retried independently, and never enter the REPAIRING state.
ResultRepair attempts represent code repair, not platform noise.
Two bugs that only showed up once the abstractions touched real Git behavior.
core.autocrlfOn Windows, a global core.autocrlf=true setting made git applysilently rewrite LF to CRLF. The patch path now pins core.autocrlf=false on both the dry run and the real apply, so the same patch produces the same bytes everywhere.
git diff <baseline>Untracked files do not appear in the baseline diff CodePilot uses for review. New paths are staged—not committed—after creation so the diff remains complete while the working change stays fully reviewable.
One application, one runtime boundary, no pretend startup metrics.
I did not turn the public site into an anonymous code-execution service. Arbitrary public repositories, GitHub OAuth/PR automation, billing, and multi-agent orchestration are outside this release—the project stops at the trust boundary it can defend.
The browser demo is deliberately deterministic. It shows the same failure, bounded repair, validation, and evidence vocabulary as the real runtime without exposing an anonymous shell, arbitrary repositories, or credentials on the public site.