Repository navigation
feat(signal): add grouped certification and backend execution - #963
Open
Kevin Cho (chokevin) wants to merge 16 commits into
Open
Kevin Cho (chokevin) wants to merge 16 commits into
Kevin Cho (chokevin) wants to merge 16 commits into
Conversation
This was referenced Oct 20, 2026
Kevin Cho (chokevin)
marked this pull request as ready for review
October 21, 2026 01:33
Contributor
Author
|
Typed workload policy, Pod queue labeling, MPI worker isolation, and focused contract tests (15 seconds): signal-workload-policy-evidence.mp4 |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Project Signal had no upstream end-to-end path from a certification request to a bounded group of node workloads and durable, typed results. This adds the controller, grouped admission contract, and optional Pod/MPIJob adapter while keeping diagnostic scripts, approval decisions, and environment-specific deployment policy outside the repository.
Behavior
CertificationProfilecan select 1-64 participants. The requesting Node is index 0; every participant records its immutable Node UID plus capacity and allocatable snapshots.sha256:<64 lowercase hex>. Bare, uppercase, wrong-algorithm, truncated, extended, and whitespace-padded values are rejected.kubeflow.org/v2beta1MPIJob per participant. MPI execution uses one launcher and one GPU worker per tested Node.workloadPolicycarries bounded resources, security context, working directory, results storage, volumes, host networking, and typed Kueue topology intent.workloadPolicy.kueueTopology.requiredLevelrequires an explicit queue and renderskueue.x-k8s.io/podset-required-topologyonly on ordinary participant Pods and MPIJob worker templates, never the unpinned launcher.script.requiresRuntimeStage: trueand a bounded lowercase DNS-labelruntimeStage.name. The stage is snapshotted Profile-to-Run-to-evidence and exported asPROJECT_SIGNAL_STAGE_NAMEonly to ordinary participant Pods and MPI workers, never the launcher. Non-stage scripts omit it.backendActiveDeadlineis distinct from outerdeadline. It must be positive whole seconds and leave at least 60 seconds for adapter result projection, evidence, and cleanup. The outer value becomes WorkflowactiveDeadlineSeconds; the backend value becomes Pod/MPIJobactiveDeadlineSeconds.Pass=0,Fail=1,Inconclusive=2. A syntactically and semantically valid bounded result remains authoritative when exit 1 or 2 makes the backend terminally failed. Missing, malformed, stale, contradictory, or unexpected-code results remain fail-closed as backend execution failures.backend-resources. A groupedPassrequires complete backend and result coverage.FullCertificationandstagePlanare evidence metadata, distinct from the optional single-script runtime stage.Scope
This PR does not publish certification scripts, runner packaging, hardware thresholds, deployment overlays, queue, flavor, topology, or stage values, resource quantities, mount paths, capabilities, tolerations, cluster or node identifiers, credentials, or endpoints. It does not add TrainJob support, approve privileged or host access, synthesize a cross-run suite verdict, or claim live-cluster validation.
Evidence
Grouped admission, rollback, backend identity, and failure-domain behavior (11 seconds):
signal-grouped-evidence.mp4
Pod/MPIJob rendering, fail-closed aggregation, and cleanup behavior (15 seconds):
project-signal-adapter.mp4
Typed workload policy, Pod queue labeling, MPI worker isolation, and focused contract tests (15 seconds):
signal-workload-policy-evidence.mp4
Typed host-network field, participant-only Pod/MPI rendering, launcher isolation, and focused tests (15 seconds):
project-signal-host-network.mp4
The first downstream
CertificationRunexposed the digest mismatch before backend creation. Commit3406e82258971c3b4049ab70a606b50a1772049aaligns the canonical digest contract.Representative Kueue admission then exposed missing explicit TAS intent. Commit
5b117beffd65e6d45c15892f163bb64096b194e9adds the typed topology policy and participant-only rendering.A4 execution then exposed that valid
Inconclusiveresult files followed by exit 2 were discarded as backend failures. Exact headf6c11877808a10ae59760149da4676e15e00dd22makes validated verdict-associated nonzero exits authoritative, rejects contradictory or missing results, and adds the typed runtime-stage and split-deadline contracts required by the downstream scripts.Exact-head pre-merge images:
ghcr.io/chokevin/project-signal-controller@sha256:60ef8509c3aa12761c5dc2db4e7679d69106a61d7e29606148876ea2d8792839linux/amd64manifest:ghcr.io/chokevin/project-signal-controller@sha256:e42aa8887f6b2fee1aef99c117f672a63027f7bdd398bab5f4ee35f4f49cc785ghcr.io/chokevin/project-signal-adapter@sha256:f3b93286383416cd1b7fb4ba9e633e9cc71837cebba2b883fc6a15812a692ba5linux/amd64manifest:ghcr.io/chokevin/project-signal-adapter@sha256:1268386ce2148b598cf6beafa7684d5981e9327705bdf1de59bc583e2d0ef752Verification
go test -race ./api/signal/v1alpha1 ./internal/signalworkload ./internal/signal ./internal/signaladapter ./cmd/project-signal-controller ./cmd/project-signal-adapter ./deploy/signalGOOS=linux GOARCH=amd64 golangci-lint run -c .golangci.yaml ./api/signal/v1alpha1 ./internal/signalworkload ./internal/signal ./internal/signaladapter ./cmd/project-signal-controller ./cmd/project-signal-adapter ./deploy/signalGOOS=linux GOARCH=amd64 go build ./cmd/project-signal-controller ./cmd/project-signal-adaptergo generate ./api/signal/v1alpha1; generated CRDs contain canonical digest, bounded topology, runtime-stage, deadline-ordering, and immutability constraints.make signal-manifestswith no rendered manifest drift.git diff --check.linux/amd64child manifests resolved independently.descriptor_half_close_matches_simulated_and_host_socketsfailed once and passed on the failed-job rerun.Risk
The highest-risk boundaries are translating asynchronous Kubernetes and MPI Operator state into a terminal diagnostic result, preserving operator-supplied participant policy without leaking it onto the launcher, and separating backend execution time from the outer evidence/cleanup window. The adapter requires exact backend identity and participant coverage, clears reserved result files before invocation, validates bounded result fields plus the exact verdict/exit matrix, checks result exit status against Kubernetes terminal state, revalidates runtime-stage and deadline ordering, and fails closed when identity, status, outputs, cleanup, or contracts cannot be proven.
Review guide
api/signal/v1alpha1/andinternal/signal/controller.go: immutable API snapshots, runtime stage/deadline validation, canonical digests, grouped admission, Workflow arguments, and evidence.internal/signalworkload/policy.go: bounded resources, security context, paths, volume unions, and Kueue topology validation.internal/signal/policy.go: whole-group recurring and failure-domain accounting.internal/signaladapter/adapter.go: result-record contract, verdict/exit matrix, Pod/MPI rendering, participant-only stage/topology/policy application, and bounds.internal/signaladapter/runner.go: backend terminal observation, result authority, deadline separation, UID collection, and foreground cleanup.deploy/signal/: WorkflowTemplate wiring, generated CRDs, operator contract, and single-run semantics.