Conversation
…ssion (#140) Phase 2 of the link-rot-elimination campaign. Implements oddkit_resolve per klappy://docs/oddkit/specs/oddkit-resolve (DRAFT v4 — KISS) and klappy://canon/principles/identity-resolved-by-protocol. URI in, current canonical answer out. Walks superseded_by chains in existing frontmatter to terminus, normalizing across three shapes used in canon authoring (full klappy:// URI, path with .md, path without). Backward-compatible — purely additive net-new action; existing callers unchanged. Reads only the existing index. Status enum: FOUND | NOT_FOUND | INVALID_INPUT | CIRCULAR_SUPERSESSION Vodka discipline applied. v3 of the spec proposed a richer surface (batch action, resolve_links flag, aliases field, supersession_response field, identity-by-meaning queries). v4 cut to the minimum: one input, one job. Cuts captured with explicit revisit triggers in klappy://docs/planning/link-rot-deferred-concerns. Co-authored-by: Cursor Agent <bugbot@cursor.com> Caught in review: - VALID_ACTIONS array missing 'resolve' (Cursor Agent fix) - supersession_chain field-name inconsistency in error branches (Cursor Agent fix) - state-threading parity with peer actions (Cursor Agent fix) - mixed-shape superseded_by lookup failure (independent Sonnet 4.6 validator fix per E0008.3 release-validation-gate) Version bump: 0.24.0 → 0.25.0 Canon basis: klappy://canon/constraints/release-validation-gate, klappy://canon/principles/vodka-architecture, klappy://canon/methods/supersession Canon PR: klappy/klappy.dev#142
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
oddkit | 3d20ff3 | Commit Preview URL Branch Preview URL |
Apr 26 2026, 03:50 PM |
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.
Promotes
oddkit_resolve(PR #140) to production.What ships
oddkit_resolve— protocol-level URI resolution with transparent supersession traversal. URI in, current canonical answer out. Walkssuperseded_bychains in existing frontmatter to terminus, normalizing across the three shapes used in canon authoring (fullklappy://URI, repo-relative path with.md, repo-relative path without).FOUND | NOT_FOUND | INVALID_INPUT | CIRCULAR_SUPERSESSIONoddkitrouter (action: "resolve") and exposed as a standaloneoddkit_resolvetoolfetcher.getIndex); no new caches, no new frontmatter fieldstests/cloudflare-production.test.sh(direct hit, supersession walk against real canon data, NOT_FOUND, INVALID_INPUT)Version
0.24.0 → 0.25.0
Campaign context
Phase 2 of the link-rot-elimination campaign per
klappy://docs/planning/link-rot-elimination-campaign. Realizes the architectural answer named inklappy://canon/principles/identity-resolved-by-protocol(Phase 1, klappy/klappy.dev #142, merged): identity references are resolved by the protocol, never authored as locations. Vodka discipline applied — every other piece in the v3 spec (batch action,resolve_linksflag,aliasesfield, identity-by-meaning queries) was deferred perklappy://docs/planning/link-rot-deferred-concerns.Validation receipts
PR #140 cleared every gate the canon requires for load-bearing surface promotion per
klappy://canon/constraints/release-validation-gate(E0008.3):VALID_ACTIONSarray missingresolve, field-name inconsistency onsupersession_chain, state-threading parity — all fixed)superseded_bylookup originally only handled URI form, broke for the path forms canon authors actually use; fix verified against the same canon entry that surfaced the bug)The release-validation-gate constraint earned its keep on the very first PR it gated. Validator caught a production-blocking bug that CI could not catch because CI's smoke tests didn't exercise mixed-shape supersession against real canon data.
Post-promotion verification (recommended)
After CF auto-deploy completes (1–3 min), verify against
https://oddkit.klappy.dev/mcp:oddkit_versionreturns0.25.0action: "resolve"(12 enum values, not 11)oddkit_resolvewithklappy://docs/oddkit/proactive/dolche-vocabularyreturnsstatus: FOUND,resolved.uri: klappy://canon/definitions/dolcheo-vocabulary,supersession_chainpopulated with one entry, nowarningfieldRefs
klappy://docs/oddkit/specs/oddkit-resolve(DRAFT v4)klappy://canon/principles/identity-resolved-by-protocolklappy://docs/planning/link-rot-elimination-campaignklappy://docs/planning/link-rot-deferred-concernsNote
Medium Risk
Adds a new MCP tool/action that changes request routing and response shapes for a new surface area; risk is mainly around resolver edge cases (cycles/dangling successors) and relying on index/frontmatter correctness, but existing actions are unchanged.
Overview
Adds a new
oddkit_resolveMCP tool and unified-routeraction:"resolve"that takes aklappy://URI, looks it up in the index, and returns a canonicalresolveddocument (plussupersession_chain) after walking anysuperseded_bychain with cycle and depth safeguards.The resolver normalizes
superseded_byreferences across URI and repo-path forms (with/without.md) and surfaces explicit statuses (FOUND,NOT_FOUND,INVALID_INPUT,CIRCULAR_SUPERSESSION) plus a truncation warning for dangling successors.Updates production smoke tests to cover direct resolve, mixed-shape supersession traversal, and error statuses, and bumps package versions/CHANGELOG to
0.25.0.Reviewed by Cursor Bugbot for commit 3d20ff3. Bugbot is set up for automated code reviews on this repo. Configure here.