feat(evidence): accept declared unresolved sources - #729
Conversation
Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 71c871d94f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| HttpJson { | ||
| base_url: String, | ||
| posture: AcquisitionPosture, | ||
| /// Optional exact upstream Problem Details tuple which means that the |
There was a problem hiding this comment.
For any PR containing this commit, the DCO job will fail because its message has no Signed-off-by: Name <email> trailer; .github/workflows/dco.yml:27-38 checks every non-merge commit and exits unsuccessfully when that trailer is absent. Recreate this commit with git commit -s before submitting it.
AGENTS.md reference: AGENTS.md:L274-L274
Useful? React with 👍 / 👎.
| let declared_unresolved = config | ||
| .sources | ||
| .get(requirement.initial_source()) | ||
| .is_some_and(|source| source.unresolved_problem().is_some()); |
There was a problem hiding this comment.
Validate unresolved fixtures for every requirement
When two requirements reference the same fixture path, this requirement-specific flag is computed only for the first one because the existing cache check at lines 2127-2129 skips every later reference. If the first requirement's initial source declares unresolvedProblem but a later one's does not, Bundle::load accepts the fixture's declaredUnresolved case without ever validating it against the later source; configuration validation does not prohibit shared fixture paths, so a directly loaded runtime bundle can bypass this new startup invariant depending on requirement order. Validate the marker for every referencing requirement before reusing the parsed fixture, or reject duplicate references at bundle load.
AGENTS.md reference: products/evidence/AGENTS.md:L85-L94
Useful? React with 👍 / 👎.
| "fixture declared-unresolved marker must be true", | ||
| )); | ||
| } | ||
| None => false, |
There was a problem hiding this comment.
Require a fixture case for each unresolved declaration
When an initial source declares unresolvedProblem but its fixture retains the old no-match and ambiguous cases, None => false leaves those existing IDs sufficient for FixtureCategories::complete(), so the production/evidence-grade bundle loads without any declaredUnresolved case. This lets a project claim complete fixture coverage without exercising the newly governed data-free outcome that the fixture contract says every declaring source must include; track whether the marker was observed and reject its absence when declared_unresolved is true, with a focused negative test.
AGENTS.md reference: products/evidence/AGENTS.md:L96-L102
Useful? React with 👍 / 👎.
Summary
unresolvedProblemdeclaration for HTTP JSON sourcesdeclaredUnresolvedfixture coverage, normative contracts, and security traceabilityWhy
Relay V2 intentionally makes no-match, ambiguous-match, and concealed outcomes indistinguishable as one exact 404 Problem Details response. Registry Evidence needs to accept that governed source outcome without parsing or exposing sensitive source state.
Security invariants
unresolved; dependent fetch/member outcomes remain dependency failuresVerification
cargo fmt --all -- --checkcargo test -p registry-evidence --lockedcargo clippy -p registry-evidence --all-targets --locked -- -D warningsproducts/evidence/scripts/check-contracts.shproducts/evidence/scripts/check-source-neutrality.shproducts/evidence/scripts/check-config-key-paths.shcargo metadata --locked --format-version 1git diff --checkThis is the Registry Evidence prerequisite for the Solmara authority-cell reset and the v0.20.1 fix-forward release. The already-published v0.20.0 tag and assets are not changed.