Task ID: artifact-hyp-prefix-2026-05-13 Layer: Atlas (artifact_detail) Date: 2026-05-13 v1 carve-out: user-authorized; v1 still serves scidex.ai
https://scidex.ai/artifact/hypothesis-h-7336d351b0 rendered "Artifact
Not Found" although the hypothesis exists.
_hyp_adjacent_panel (api.py:32844) prepended a redundant hypothesis-
prefix to ids pulled directly from the hypotheses table. The
hypotheses.id is the canonical bare form (h-7336d351b0) and a
matching artifacts row exists at the bare id — not at
hypothesis-h-7336d351b0. The URL had no resolver to recover.
The artifacts table holds both conventions across types
(verified by SELECT artifact_type, prefix_shape, count):
hypotheses row resolves at the bare form (1,080 only-bare +api.py:
hypothesis- prefix from the URL emitted_hyp_adjacent_panel. All hypothesis rows resolve cleanly at theartifact_detail) — when literal lookup fails, tryhypothesis-, figure-,dataset-, model-, analysis-, experiment-, paper-,notebook-). Accept the match only if the stripped row'sartifact_type is in the allowed set for that prefix. This stops/artifact/figure-h-XXX cannoth-XXX).The fallback runs after the literal lookup, so every existing valid
URL continues to resolve via its current path with no extra DB query.
Against the live DB (no code execution required):
/artifact/hypothesis-h-7336d351b0 → literal miss → striphypothesis- → h-7336d351b0 is type=hypothesis → match
/artifact/hypothesis-29a49684-… → literal match (no fallback)/artifact/figure-h-7336d351b0 → literal miss → strip figure- →h-7336d351b0 is type=hypothesis ∉ {figure, paper_figure} →/artifact/h-7336d351b0 and /artifact/hypothesis-h-b8cedff2 →Post-deploy: restart scidex-api, hit
/artifact/hypothesis-h-7336d351b0 from a returning-visitor cookie,
confirm the page renders the hypothesis content.