D-164: one coordinate, one PURL — the maven identity seam for the asserted tier - #134
Merged
Merged
Conversation
…erted tier The elastic-agent validation flagged a Maven purl-separator inconsistency in the asserted tier's merge fallback; verified real: with no Declarer for "maven", mergeResolved names deps.dev-asserted children pkg:maven/group:artifact@v (colon kept) while the adapter's observed nodes carry pkg:maven/group/artifact@v — two IDs for one package, so observed-beats-asserted dedupe fails and the same dependency re-enters as a colon-form twin with advisories split across the pair (the D-15 leak, one tier up). The walk also skipped maven nodes as expansion candidates entirely. Fix: clojure.WalkSource, an identity-only Declarer for ecosystem "maven" — Identify splits group:artifact into the adapter's purl.NewMaven namespace form (bare name: group == artifact, the Leiningen convention); Declared is honest-empty (reading Maven declarations means pom interpretation, its own decision), which the walk's contract counts as unread — disclosed, never presumed. Registered in the -expand source list. Validation: Identify pinned against the adapter's emitted node for the same manifest; an asserted-merge test through the real Walker and a deps.dev-shaped stub (queried dep dedupes against the observed node, child lands at the namespace-form PURL with asserted truth, no colon-form ID exists); the mutation half permanently encoded — the same scenario without the seam reproduces the split. Full suite green (35 packages), -race clean. D-164 entry appended to docs/DECISIONS.md. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018d8nb38Prtn8dzwep6jaH9
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.
What
Fixes the Maven purl-separator inconsistency the elastic-agent validation flagged at the asserted tier's merge fallback — a defect left open from D-162/D-163, verified against the source before writing the fix:
Declarerseam formaven,mergeResolved's fallback names a deps.dev-asserted childpkg:maven/org.postgresql:postgresql@42.7.4(colon kept in the name) while the adapter's observed node ispkg:maven/org.postgresql/postgresql@42.7.4(namespace form). Two IDs for one package: observed-beats-asserted dedupe can't match, the same direct dependency re-enters as a colon-form twin, and advisories/registry data split across the pair — the D-15 identity leak, one tier up, exactly what theIdentifycontract doc says the seam exists to prevent.-expandcan deepen Clojure trees" held only through the asserted tier — whose merged children then carried the malformed IDs.Fix
clojure.WalkSource— an identity-only Declarer for ecosystemmaven:Identifysplitsgroup:artifactinto the adapter's ownpurl.NewMavennamespace form (bare name → group==artifact, the Leiningen convention).Declaredis honest-empty: reading a Maven package's declared dependencies means fetching and interpreting poms (parents, properties, dependencyManagement) — the pom.xml problem, its own decision. The walk's contract counts an absent coordinate as not read, which is the true state — disclosed, never presumed. Real transitive resolution stays with the asserted (deps.dev) tier, whose children this seam now names correctly.-expandsource list.Validation
Identifypinned against the adapter's emitted node for the same manifest — one coordinate, one PURL, whichever tier names it first.-raceclean, gofmt/vet silent. D-164 entry indocs/DECISIONS.md.Residuals
The registration is one literal inside the inline
-expandsource construction — no cheap seam to pin it from a test without a refactor this bug fix shouldn't smuggle in; coverage is the encoded contrast.Declaredstays empty until pom reading is its own decision. The engine's raw fallback still writespkg:eco/name@versionfor any future ecosystem that gains asserted resolution before its identity seam — this seam is the pattern to copy.🤖 Generated with Claude Code
Generated by Claude Code