2026-06-08 — Build-version stamp, workload-node submit gate, OpenAPI jobs error visibility¶
Motivation¶
Three independent issues reported together:
- Build-version stamp looked like a commit. Cloud images bake a
commit-qualified
APP_VERSION(0.2.0-commit.<sha>). The SPA'sformatBuildVersionsplit that on., saw four segments, bailed out, and renderedv0.2.0-commit.2d563cd · 2d563cd— the commit appeared twice and the build version was unreadable. - A BLAST submit could be accepted with no workload nodes. A running AKS
cluster whose workload pool is scaled to 0 passed every pre-flight gate
(
aks_clusteronly checks the control-plane power state). Theelastic-blastJob then satPendingforever and the queued job row was stranded. The only node check (openapi_ready→ siblingno_workload_nodes) is skipped when the optional elb-openapi sidecar is not deployed. - OpenAPI
/v1/jobserrors were swallowed.GET /api/blast/jobsdegrades to locally-recorded rows when the external/v1/jobsplane fails (it returnsexternal_degraded=true), but the Recent searches page never read that flag, so an external-plane outage hid OpenAPI-submitted jobs with no indication.
User-facing change¶
- Header / Settings footer now render
v0.2.271 · 2d563cd(releaseA.B, build number, then short commit) even for commit-qualified cloud builds. - Submitting BLAST against a running cluster with an empty/NotReady workload
pool is rejected up front (HTTP 409
blocked_by_preflight) with ano_workload_nodesgate and a Scale up workload pool action, instead of stranding a queued job. - The Recent searches page shows a non-blocking degraded notice
("OpenAPI jobs degraded · …") when the external
/v1/jobsplane cannot be reached, while still listing locally-recorded jobs.
API / IaC diff summary¶
api/services/blast/submit_gates.py: new_gate_workload_nodesgate (reusesk8s_ready_warmup_node_names); added toevaluate_submit_gates. Reuses the existingno_workload_nodes/scale_up_workload_poolSPA remediation. Skips (ok) when the cluster is not Running / unverifiable so it never double-blocks withaks_cluster;unknown+critical only when the cluster is Running but the K8s node API errors (soallow_unverifiedcan downgrade it).api/routes/blast/jobs.py:GET /api/blast/jobsnow also returnsexternal_degraded_message(additive) alongsideexternal_degraded/external_degraded_reason.web/src/utils/buildVersion.ts(new): sharedformatBuildVersionthat strips any SemVer pre-release/build-metadata suffix before theA.B.Csplit. BothLayout.tsxandSettingsPanel.tsxnow import it (local duplicates removed).web/src/pages/BlastJobs/useBlastJobsState.ts+BlastJobs.tsx: surface the newexternalDegradedNoticevia the sharedDegradedNoticecomponent.- No IaC changes.
Validation evidence¶
uv run ruff check api→ All checks passed.uv run pytest -q api/tests→ 3103 passed, 3 skipped.- New gate tests:
test_workload_nodes_gate_*,test_evaluate_blocks_when_workload_pool_emptyinapi/tests/test_blast_submit_gates.py. - Extended
test_canonical_jobs_list_reports_external_detail_codeassertsexternal_degraded_message == "bad gateway". cd web && npx vitest run→ 734 passed (incl. newsrc/utils/buildVersion.test.ts, 5 cases).cd web && npm run build→ built clean.