Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1979,6 +1979,7 @@ jobs:
E2E_TARGET_ID: "managed-image-multiarch-startup"
RELEASE_E2E_ACTIVATION_PATH: ci/protected-managed-image-multiarch-activation-v1.json
NEMOCLAW_E2E_EXPECTED_SHA: ${{ inputs.checkout_sha }}
NEMOCLAW_PROTECTED_MANAGED_IMAGE_HEAD_SHA: ${{ inputs.checkout_sha || github.sha }}
NEMOCLAW_E2E_SHARD: ${{ matrix.shard }}
NEMOCLAW_PROTECTED_MANAGED_IMAGE_BASE_SHA: ${{ inputs.base_sha || github.event.before || github.sha }}
NEMOCLAW_PROTECTED_MANAGED_IMAGE_BUILD_CACHE: ${{ github.workspace }}/.protected-managed-image-build-cache/${{ matrix.shard }}
Expand Down Expand Up @@ -2401,6 +2402,7 @@ jobs:
NEMOCLAW_E2E_EXPECTED_SHA: ${{ inputs.checkout_sha }}
NEMOCLAW_E2E_SHARD: linux-arm64-gpu-dgx-spark-gb10
NEMOCLAW_LLAMA_CPP_QUALIFICATION_BASE_SHA: ${{ inputs.base_sha || github.event.before || github.sha }}
NEMOCLAW_LLAMA_CPP_QUALIFICATION_HEAD_SHA: ${{ inputs.checkout_sha || github.sha }}
NEMOCLAW_LLAMA_CPP_QUALIFICATION_CANDIDATE_ROOT: ${{ github.workspace }}/.candidate-llama-cpp
NEMOCLAW_LLAMA_CPP_QUALIFICATION_EVIDENCE: ${{ github.workspace }}/e2e-artifacts/live/llama-cpp-dgx-spark-qualification/evidence.json
NEMOCLAW_LLAMA_CPP_QUALIFICATION_PLAN: ${{ github.workspace }}/.llama-cpp-qualification/plan.json
Expand Down
2 changes: 1 addition & 1 deletion test/e2e/live/llama-cpp-dgx-spark-qualification-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ function positiveIntegerEnvironment(name: string): number {
export function llamaCppDgxSparkQualificationEnvironment(): LlamaCppDgxSparkQualificationEnvironment {
const identity = {
baseSha: requiredEnvironment("NEMOCLAW_LLAMA_CPP_QUALIFICATION_BASE_SHA"),
headSha: requiredEnvironment("NEMOCLAW_E2E_EXPECTED_SHA"),
headSha: requiredEnvironment("NEMOCLAW_LLAMA_CPP_QUALIFICATION_HEAD_SHA"),
runAttempt: positiveIntegerEnvironment("GITHUB_RUN_ATTEMPT"),
runId: positiveIntegerEnvironment("GITHUB_RUN_ID"),
workflowSha: requiredEnvironment("NEMOCLAW_LLAMA_CPP_QUALIFICATION_WORKFLOW_SHA"),
Expand Down
2 changes: 1 addition & 1 deletion test/e2e/live/managed-image-multiarch-startup-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ function positiveIntegerEnvironment(name: string): number {
export function protectedManagedImageDispatchEnvironment(): ProtectedManagedImageDispatchEnvironment {
const platform = requiredEnvironment("NEMOCLAW_PROTECTED_MANAGED_IMAGE_PLATFORM");
const cohort = requiredEnvironment("NEMOCLAW_PROTECTED_MANAGED_IMAGE_COHORT");
const headSha = requiredEnvironment("NEMOCLAW_E2E_EXPECTED_SHA");
const headSha = requiredEnvironment("NEMOCLAW_PROTECTED_MANAGED_IMAGE_HEAD_SHA");
const baseSha = requiredEnvironment("NEMOCLAW_PROTECTED_MANAGED_IMAGE_BASE_SHA");
const workflowSha = requiredEnvironment("NEMOCLAW_PROTECTED_MANAGED_IMAGE_WORKFLOW_SHA");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,16 @@ describe("llama.cpp DGX Spark qualification workflow boundary (#8260)", () => {
);
});

it("binds qualification candidate identity on ordinary main runs", () => {
const value = workflow();
const jobEnv = job(value, "llama-cpp-dgx-spark-qualification").env as Record<string, unknown>;
jobEnv.NEMOCLAW_LLAMA_CPP_QUALIFICATION_HEAD_SHA = "${{ inputs.checkout_sha }}";

expect(validateLlamaCppDgxSparkQualificationWorkflow(value)).toContain(
"llama-cpp-dgx-spark-qualification env must bind NEMOCLAW_LLAMA_CPP_QUALIFICATION_HEAD_SHA to ${{ inputs.checkout_sha || github.sha }}",
);
});

it("rejects bypassing the declarative protected-runner plan", () => {
const value = workflow();
job(value, "llama-cpp-dgx-spark-qualification")["runs-on"] = "self-hosted";
Expand Down
11 changes: 10 additions & 1 deletion test/e2e/support/managed-image-multiarch-startup-helpers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ beforeEach(() => {
vi.stubEnv("GITHUB_RUN_ATTEMPT", "1");
vi.stubEnv("GITHUB_RUN_ID", "123");
vi.stubEnv("GITHUB_WORKSPACE", temporaryRoot);
vi.stubEnv("NEMOCLAW_E2E_EXPECTED_SHA", sha);
vi.stubEnv("NEMOCLAW_PROTECTED_MANAGED_IMAGE_BASE_SHA", sha);
vi.stubEnv("NEMOCLAW_PROTECTED_MANAGED_IMAGE_COHORT", "protected-123-1");
vi.stubEnv("NEMOCLAW_PROTECTED_MANAGED_IMAGE_CONTRACT", path.join(artifacts, "contract.json"));
vi.stubEnv("NEMOCLAW_PROTECTED_MANAGED_IMAGE_EVIDENCE", path.join(artifacts, "evidence.json"));
vi.stubEnv("NEMOCLAW_PROTECTED_MANAGED_IMAGE_HEAD_SHA", sha);
vi.stubEnv("NEMOCLAW_PROTECTED_MANAGED_IMAGE_PLATFORM", "linux/amd64");
vi.stubEnv("NEMOCLAW_PROTECTED_MANAGED_IMAGE_WORKFLOW_SHA", sha);
});
Expand Down Expand Up @@ -57,6 +57,15 @@ describe("protected managed-image startup helpers", () => {
);
});

it("requires an explicit protected candidate head independent of PR risk signals", () => {
vi.stubEnv("NEMOCLAW_PROTECTED_MANAGED_IMAGE_HEAD_SHA", "");
vi.stubEnv("NEMOCLAW_E2E_EXPECTED_SHA", sha);

expect(() => protectedManagedImageDispatchEnvironment()).toThrow(
"NEMOCLAW_PROTECTED_MANAGED_IMAGE_HEAD_SHA is required",
);
});

it("reads a bounded file through its opened descriptor and rejects a symlink", () => {
const artifacts = path.join(temporaryRoot, "artifacts");
const artifact = path.join(artifacts, "contract.json");
Expand Down
10 changes: 10 additions & 0 deletions test/e2e/support/managed-image-protected-runtime-workflow.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,16 @@ describe("protected managed-image runtime workflow boundary", () => {
);
});

it("binds protected candidate identity on ordinary main runs", () => {
const value = workflow();
const jobEnv = multiarchJob(value).env as Record<string, unknown>;
jobEnv.NEMOCLAW_PROTECTED_MANAGED_IMAGE_HEAD_SHA = "${{ inputs.checkout_sha }}";

expect(validateManagedImageMultiarchWorkflow(value)).toContain(
"managed-image-multiarch-startup env must bind NEMOCLAW_PROTECTED_MANAGED_IMAGE_HEAD_SHA to ${{ inputs.checkout_sha || github.sha }}",
);
});

it("ships the exact activation contract consumed by the trusted lane (#7744)", () => {
const activation = JSON.parse(
fs.readFileSync(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ export function validateLlamaCppDgxSparkQualificationWorkflow(workflow: RecordVa
NEMOCLAW_E2E_EXPECTED_SHA: "${{ inputs.checkout_sha }}",
NEMOCLAW_LLAMA_CPP_QUALIFICATION_BASE_SHA:
"${{ inputs.base_sha || github.event.before || github.sha }}",
NEMOCLAW_LLAMA_CPP_QUALIFICATION_HEAD_SHA: "${{ inputs.checkout_sha || github.sha }}",
NEMOCLAW_LLAMA_CPP_QUALIFICATION_PLAN:
"${{ github.workspace }}/.llama-cpp-qualification/plan.json",
NEMOCLAW_LLAMA_CPP_QUALIFICATION_WORKFLOW_SHA:
Expand Down
1 change: 1 addition & 0 deletions tools/e2e/managed-image-multiarch-workflow-boundary.mts
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ export function validateManagedImageMultiarchWorkflow(workflow: WorkflowRecord):
"protected-managed-image-build-cache-${{ github.run_id }}-${{ inputs.checkout_sha || github.sha }}",
NEMOCLAW_PROTECTED_MANAGED_IMAGE_COHORT:
"protected-${{ github.run_id }}-${{ github.run_attempt }}",
NEMOCLAW_PROTECTED_MANAGED_IMAGE_HEAD_SHA: "${{ inputs.checkout_sha || github.sha }}",
NEMOCLAW_PROTECTED_MANAGED_IMAGE_CONTRACT:
"${{ github.workspace }}/e2e-artifacts/live/managed-image-multiarch-startup/${{ matrix.shard }}/contracts.json",
NEMOCLAW_PROTECTED_MANAGED_IMAGE_EVIDENCE:
Expand Down
Loading