Repository navigation
Integrate validation coordinator with policy, runners, environment, and browser executor - #423
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ent, and browser executor Stacked on feat/validation-coordinator-lifecycle. Brings adapter slices from #418 (environment manager, moved to server), #419 (policy + repository runner), and #421 (browser executor + evidence) into one coordinator flow. - Coordinator owns plan via ValidationPolicy + changed paths from checkpoints - Repository gates via RepositoryValidationRunner with distinct attempts, bounded output refs, redaction, invalid-spec->blocked, timeout/signal->interrupted - Browser gates via BrowserValidationExecutor against acquired validated environment; preflight before token, recording-required blocked until verified decoder, no success-shaped fallback evidence - Pairing-self-test via pnpm test:self through repo runner, required only when selected by policy - Deterministic gate order, required failure stops dependents, interruption resumable, drift->stale, duplicate attemptId idempotent, lease expiry rejects late results, lease release on terminal - Persist env/process/port identity via diagnostics/outputRef, no credentials - Timeline shows run state, active gate, results/blockers, exact revision, evidence refs Canonical contracts: validation.ts durable run/gate/result/lease/target; browserValidation.ts rich scenario/evidence; ValidationScenario simple for request, BrowserValidationScenario rich for execution; structured result durable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…grate-validation-coordinator-flow Take updated lifecycle hardening (terminal taxonomy, legacy-run fence, lease-expiry release) under the integrated coordinator flow. Resolve ValidationCoordinatorReactor to keep coordinator-owned policy planning and gate execution while adopting canonical effective-status checks, the coordinator-owned-run fence, lease-expiry release, and the releasing target-error path. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Stacked PR updated for latest dependency revisionsPushed update bringing this stack current without force-push (merge + cherry-picks on top of the previous integration commit). Newly integrated since the last push:
Conflict resolution ( Validation on final tree (
Still stacked on |
- Stabilize the environment service process start identity by capturing it once per process instead of recomputing process.uptime() on every probe, so persisted records revalidate instead of throwing pid-reuse. - Pass the real attempt number derived from the reactor attempt id to the repository runner so retries use distinct artifact keys. - Scrub the one-time pairing token from every post-pair broker failure via a live-token safeMessage helper, including recording cleanup diagnostics. - Reject unsafe gate-derived media filenames instead of allowing path escape from the evidence store. - Recover a stale persisted environment by terminating the dead owner and launching fresh after failed revalidation instead of timing out forever. - Omit absolute persisted media paths from browser outputRef, emitting only kind and hash prefix. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Review findings addressed in 4d28dd0All six findings are fixed on this branch (fast-forward push, no force-push):
Validation on 4d28dd0: focused validation+orchestration+contracts 50 files / 599 tests passed; |
… keys per run - Resume now resets every interrupted gate to pending (per-gate dispatches with per-cycle command ids) before transitioning the run to planned, so the pending-only next-gate selector can schedule the run again instead of stalling in running. Resume command ids include run.updatedAt so repeated interruption cycles cannot dedupe away. - Extract the deterministic next-gate selector to selectNextRunnableGate in the planner, used by the reactor unchanged. - Repository artifact keys accept an optional caller-owned scope validated against the artifact-key alphabet, producing <scope>-<gate>-attempt-<n>; the gate executor scopes every run with a sanitized run id so concurrent runs no longer overwrite each other's evidence and outputRef identifies the producing run. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Follow-up findings addressed in e37734fBoth findings from the latest review are fixed (fast-forward push): P1 — reset interrupted gates on resume (
P2 — per-run artifact keys (
Validation on e37734f: validation+orchestration+contracts 50 files / 604 tests passed; |
…y preflight errors - Record a blocked structured result (instead of a bare gate update) when a gate kind has no integrated runner, so the run reaches blocked through the standard result path instead of stalling in running behind a blocked required gate. - Remove the unused sha computation and createHash import from the browser gate execution path. - Report unrequested preflight targets and environment mismatches with actionable diagnostics instead of the generic fallback. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Review findings addressed in 47f0a8cAll three findings fixed (fast-forward push): P2 — transition run when gate kind has no runner (
P3 — dead sha removed ( P3 — actionable preflight mismatches (
Validation on 47f0a8c: focused validation+orchestration+contracts 50 files / 607 tests passed; |
6470402
into
feat/validation-coordinator-lifecycle
Stacked on #420 (
feat/validation-coordinator-lifecycle).Depends on:
apps/server/src/validation/)Once those land, retarget/rebase onto main.
Integration
Canonical contracts
validation.ts: durable run/gate/result/lease/target (+interrupted result status)browserValidation.ts: rich scenario/evidencevalidationEnvironmentManagerfrom scripts to server, preserved interface/testsvalidation:<runId>, preview-only, env/thread-bound; no weakeningValidation
pnpm fmt:checkpass,pnpm lintwarnings only,pnpm typecheckpass (suggestions only),pnpm testfull suite pass (server 2510+102, web 1931, etc.)Limitations / follow-up
pnpm devfull stack fails pre-existing (vp filter t3 matches root, recursion); used manual isolated server+web for real-client; fix dev-runner filters separatelyFeature captures
PR head at upload:
d025466a0075c3529a9be662a5d84d376261c633. See the testing notes for exercised behavior and limitations; uploading media is not a test result.