{"id":20642415,"url":"https://github.com/ipld/go-ipld-prime","last_synced_at":"2026-04-23T05:04:03.873Z","repository":{"id":39069028,"uuid":"155609504","full_name":"ipld/go-ipld-prime","owner":"ipld","description":"Golang interfaces for the IPLD Data Model, with core Codecs included, IPLD Schemas support, and some handy functional transforms tools.","archived":false,"fork":false,"pushed_at":"2026-02-18T06:53:32.000Z","size":5449,"stargazers_count":143,"open_issues_count":78,"forks_count":49,"subscribers_count":17,"default_branch":"master","last_synced_at":"2026-02-18T11:30:05.623Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ipld.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-10-31T19:03:58.000Z","updated_at":"2026-02-18T06:53:35.000Z","dependencies_parsed_at":"2023-10-03T05:37:00.959Z","dependency_job_id":"43e176dd-7bca-4bd7-9acb-1ee3a4272ff8","html_url":"https://github.com/ipld/go-ipld-prime","commit_stats":null,"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"purl":"pkg:github/ipld/go-ipld-prime","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipld%2Fgo-ipld-prime","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipld%2Fgo-ipld-prime/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipld%2Fgo-ipld-prime/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipld%2Fgo-ipld-prime/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ipld","download_url":"https://codeload.github.com/ipld/go-ipld-prime/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipld%2Fgo-ipld-prime/sbom","scorecard":{"id":493904,"data":{"date":"2025-08-11","repo":{"name":"github.com/ipld/go-ipld-prime","commit":"0a304bd3f2fa4412155be3d9377a2112630af513"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.9,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":6,"reason":"Found 6/9 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/go-check.yml:10","Warn: no topLevel permission defined: .github/workflows/go-test-prime.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/go-test.yml:10","Warn: topLevel 'contents' permission set to 'write': .github/workflows/release-check.yml:10","Warn: topLevel 'contents' permission set to 'write': .github/workflows/releaser.yml:9","Info: topLevel 'contents' permission set to 'read': .github/workflows/tagpush.yml:9","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: storage/sharding/sharding.test:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/generated-pr.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/generated-pr.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go-check.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/go-check.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-test-prime.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/go-test-prime.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-test-prime.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/go-test-prime.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go-test-prime.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/go-test-prime.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go-test.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/go-test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-check.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/release-check.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/releaser.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/releaser.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/stale.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/stale.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/tagpush.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/ipld/go-ipld-prime/tagpush.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   8 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: GoBuiltInFuzzer integration found: node/bindnode/fuzz_test.go:145"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T19:57:06.419Z","repository_id":39069028,"created_at":"2025-08-19T19:57:06.419Z","updated_at":"2025-08-19T19:57:06.419Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32166661,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T02:19:40.750Z","status":"ssl_error","status_checked_at":"2026-04-23T02:17:55.737Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-16T16:09:04.777Z","updated_at":"2026-04-23T05:04:03.857Z","avatar_url":"https://github.com/ipld.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"go-ipld-prime\n=============\n\n`go-ipld-prime` is an implementation of the IPLD spec interfaces,\na batteries-included codec implementations of IPLD for CBOR and JSON,\nand tooling for basic operations on IPLD objects (traversals, etc).\n\n\n\nAPI\n---\n\nThe API is split into several packages based on responsibly of the code.\nThe most central interfaces are the base package,\nbut you'll certainly need to import additional packages to get concrete implementations into action.\n\nRoughly speaking, the core package interfaces are all about the IPLD Data Model;\nthe `codec/*` packages contain functions for parsing serial data into the IPLD Data Model,\nand converting Data Model content back into serial formats;\nthe `traversal` package is an example of higher-order functions on the Data Model;\nconcrete `ipld.Node` implementations ready to use can be found in packages in the `node/*` directory;\nand several additional packages contain advanced features such as IPLD Schemas.\n\n(Because the codecs, as well as higher-order features like traversals, are\nimplemented in a separate package from the core interfaces or any of the Node implementations,\nyou can be sure they're not doing any funky \"magic\" -- all this stuff will work the same\nif you want to write your own extensions, whether for new Node implementations\nor new codecs, or new higher-order order functions!)\n\n- `github.com/ipld/go-ipld-prime` -- imported as just `ipld` -- contains the core interfaces for IPLD.  The most important interfaces are `Node`, `NodeBuilder`, `Path`, and `Link`.\n- `github.com/ipld/go-ipld-prime/node/basicnode` -- provides concrete implementations of `Node` and `NodeBuilder` which work for any kind of data, using unstructured memory.\n- `github.com/ipld/go-ipld-prime/node/bindnode` -- provides concrete implementations of `Node` and `NodeBuilder` which store data in native golang structures, interacting with it via reflection.  Also supports IPLD Schemas!\n- `github.com/ipld/go-ipld-prime/traversal` -- contains higher-order functions for traversing graphs of data easily.\n- `github.com/ipld/go-ipld-prime/traversal/selector` -- contains selectors, which are sort of like regexps, but for trees and graphs of IPLD data!\n- `github.com/ipld/go-ipld-prime/codec` -- parent package of all the codec implementations!\n- `github.com/ipld/go-ipld-prime/codec/dagcbor` -- implementations of marshalling and unmarshalling as CBOR (a fast, binary serialization format).\n- `github.com/ipld/go-ipld-prime/codec/dagjson` -- implementations of marshalling and unmarshalling as JSON (a popular human readable format).\n- `github.com/ipld/go-ipld-prime/linking/cid` -- imported as `cidlink` -- provides concrete implementations of `Link` as a CID.  Also, the multicodec registry.\n- `github.com/ipld/go-ipld-prime/schema` -- contains the `schema.Type` and `schema.TypedNode` interface declarations, which represent IPLD Schema type information.\n- `github.com/ipld/go-ipld-prime/node/typed` -- provides concrete implementations of `schema.TypedNode` which decorate a basic `Node` at runtime to have additional features described by IPLD Schemas.\n\n\nGetting Started\n---------------\n\nLet's say you want to create some data programmatically,\nand then serialize it, or save it as [blocks].\n\nYou've got a ton of different options, depending on what golang convention you want to use:\n\n- the `qp` package -- [example](https://pkg.go.dev/github.com/ipld/go-ipld-prime/fluent/qp#example-package)\n- the `bindnode` system, if you want to use golang types -- [example](https://pkg.go.dev/github.com/ipld/go-ipld-prime/node/bindnode#example-Wrap-NoSchema), [example with schema](https://pkg.go.dev/github.com/ipld/go-ipld-prime/node/bindnode#example-Wrap-WithSchema)\n- or the [`NodeBuilder`](https://pkg.go.dev/github.com/ipld/go-ipld-prime/datamodel#NodeBuilder) interfaces, raw (verbose; not recommended)\n- or even some codegen systems!\n\nOnce you've got a Node full of data,\nyou can serialize it:\n\nhttps://pkg.go.dev/github.com/ipld/go-ipld-prime#example-package-CreateDataAndMarshal\n\nBut probably you want to do more than that;\nprobably you want to store this data as a block,\nand get a CID that links back to it.\nFor this you use `LinkSystem`:\n\nhttps://pkg.go.dev/github.com/ipld/go-ipld-prime/linking#example-LinkSystem.Store\n\nHopefully these pointers give you some useful getting-started focal points.\nThe API docs should help from here on out.\nWe also highly recommend scanning the [godocs](https://pkg.go.dev/github.com/ipld/go-ipld-prime) for other pieces of example code, in various packages!\n\nLet us know in [issues](https://github.com/ipld/go-ipld-prime/issues), [chat, or other community spaces](https://ipld.io/docs/intro/community/) if you need more help,\nor have suggestions on how we can improve the getting-started experiences!\n\n\n\nOther IPLD Libraries\n--------------------\n\nThe IPLD specifications are designed to be language-agnostic.\nMany implementations exist in a variety of languages.\n\nFor overall behaviors and specifications, refer to the IPLD website, or its source, in IPLD meta repo:\n- https://ipld.io/\n- https://github.com/ipld/ipld/\nYou should find specs in the `specs/` dir there,\nhuman-friendly docs in the `docs/` dir,\nand information about _why_ things are designed the way they are mostly in the `design/` directories.\n\nThere are also pages in the IPLD website specifically about golang IPLD libraries,\nand your alternatives: https://ipld.io/libraries/golang/\n\n\n### distinctions from go-ipld-interface\u0026go-ipld-cbor\n\nThis library (\"go ipld prime\") is the current head of development for golang IPLD,\nand we recommend new developments in golang be done using this library as the basis.\n\nHowever, several other libraries exist in golang for working with IPLD data.\nMost of these predate go-ipld-prime and no longer receive active development,\nbut since they do support a lot of other software, you may continue to seem them around for a while.\ngo-ipld-prime is generally **serially compatible** with these -- just like it is with IPLD libraries in other languages.\n\nIn terms of programmatic API and features, go-ipld-prime is a clean take on the IPLD interfaces,\nand chose to address several design decisions very differently than older generation of libraries:\n\n- **The Node interfaces map cleanly to the IPLD Data Model**;\n- Many features known to be legacy are dropped;\n- The Link implementations are purely CIDs (no \"name\" nor \"size\" properties);\n- The Path implementations are provided in the same box;\n- The JSON and CBOR implementations are provided in the same box;\n- Several odd dependencies on blockstore and other interfaces that were closely coupled with IPFS are replaced by simpler, less-coupled interfaces;\n- New features like IPLD Selectors are only available from go-ipld-prime;\n- New features like ADLs (Advanced Data Layouts), which provide features like transparent sharding and indexing for large data, are only available from go-ipld-prime;\n- Declarative transformations can be applied to IPLD data (defined in terms of the IPLD Data Model) using go-ipld-prime;\n- and many other small refinements.\n\nIn particular, the clean and direct mapping of \"Node\" to concepts in the IPLD Data Model\nensures a much more consistent set of rules when working with go-ipld-prime data, regardless of which codecs are involved.\n(Codec-specific embellishments and edge-cases were common in the previous generation of libraries.)\nThis clarity is also what provides the basis for features like Selectors, ADLs, and operations such as declarative transformations.\n\nMany of these changes had been discussed for the other IPLD codebases as well,\nbut we chose clean break v2 as a more viable project-management path.\nBoth go-ipld-prime and these legacy libraries can co-exist on the same import path, and both refer to the same kinds of serial data.\nProjects wishing to migrate can do so smoothly and at their leisure.\n\nWe now consider many of the earlier golang IPLD libraries to be defacto deprecated,\nand you should expect new features *here*, rather than in those libraries.\n(Those libraries still won't be going away anytime soon, but we really don't recommend new construction on them.)\n\n### migrating\n\n**For recommendations on where to start when migrating:**\nsee [README_migrationGuide](./README_migrationGuide.md).\nThat document will provide examples of which old concepts and API names map to which new APIs,\nand should help set you on the right track.\n\n### unixfsv1\n\nLots of people who hear about IPLD have heard about it through IPFS.\nIPFS has IPLD-native APIs, but IPFS *also* makes heavy use of a specific system called \"UnixFSv1\",\nso people often wonder if UnixFSv1 is supported in IPLD libraries.\n\nThe answer is \"yes\" -- but it's not part of the core.\n\nUnixFSv1 is now treated as an [ADL](https://ipld.io/glossary/#adl),\nand a go-ipld-prime compatible implementation can be found\nin the [ipfs/go-unixfsnode](https://github.com/ipfs/go-unixfsnode) repo.\n\nAdditionally, the codec used in UnixFSv1 -- dag-pb --\ncan be found implemented in the [ipld/go-codec-dagpb](https://github.com/ipld/go-codec-dagpb) repo.\n\nA \"some assembly required\" advisory may still be in effect for these pieces;\ncheck the readmes in those repos for details on what they support.\n\nThe move to making UnixFSv1 a non-core system has been an arduous retrofit.\nHowever, framing it as an ADL also provides many advantages:\n\n- it demonstrates that ADLs as a plugin system _work_, and others can develop new systems in this pattern!\n- it has made pathing over UnixFSv1 much more standard and well-defined\n- this standardization means systems like [Selectors](https://ipld.io/glossary/#selectors) work naturally over UnixFSv1...\n- ... which in turn means anything using them (ex: CAR export; graphsync; etc) can very easily be asked to produce a merkle-proof\n  for a path over UnixFSv1 data, without requiring the querier to know about the internals.  Whew!\n\nWe hope users and developers alike will find value in how these systems are now layered.\n\n\n\nChange Policy\n-------------\n\nThe go-ipld-prime library is ready to use, and we value stability highly.\n\nWe make releases periodically.\nHowever, using a commit hash to pin versions precisely when depending on this library is also perfectly acceptable.\n(Only commit hashes on the master branch can be expected to persist, however;\ndepending on a commit hash in a branch is not recommended.  See [development branches](#development-branches).)\n\nWe maintain a [CHANGELOG](CHANGELOG.md)!\nPlease read it, when updating!\n\nWe do make reasonable attempts to minimize the degree of changes to the library which will create \"breaking change\" experiences for downstream consumers,\nand we do document these in the changelog (often, even with specific migration instructions).\nHowever, we do also still recommend running your own compile and test suites as a matter of course after updating.\n\nYou can help make developing this library easier by staying up-to-date as a downstream consumer!\nWhen we do discover a need for API changes, we typically try to introduce the new API first,\nand do at least one release tag in which the old API is deprecated (but not yet removed).\nWe will all be able to develop software faster, together, as an ecosystem,\nif libraries can keep reasonably closely up-to-date with the most recent tags.\n\n\n### Version Names\n\nWhen a tag is made, version number steps in go-ipld-prime advance as follows:\n\n1. the number bumps when the lead maintainer says it does.\n2. even numbers should be easy upgrades; odd numbers may change things.\n3. the version will start with `v0.` until further notice.\n\n[This is WarpVer](https://gist.github.com/warpfork/98d2f4060c68a565e8ad18ea4814c25f).\n\nThese version numbers are provided as hints about what to expect,\nbut ultimately, you should always invoke your compiler and your tests to tell you about compatibility,\nas well as read the [changelog](CHANGELOG.md).\n\n\n### Updating\n\n**Read the [CHANGELOG](CHANGELOG.md).**\n\nReally, read it.  We put exact migration instructions in there, as much as possible.  Even outright scripts, when feasible.\n\nAn even-number release tag is usually made very shortly before an odd number tag,\nso if you're cautious about absorbing changes, you should update to the even number first,\nrun all your tests, and *then* upgrade to the odd number.\nUsually the step to the even number should go off without a hitch, but if you *do* get problems from advancing to an even number tag,\nA) you can be pretty sure it's a bug, and B) you didn't have to edit a bunch of code before finding that out.\n\n\n### Development branches\n\nThe following are norms you can expect of changes to this codebase, and the treatment of branches:\n\n- The `master` branch will not be force-pushed.\n    - (exceptional circumstances may exist, but such exceptions will only be considered valid for about as long after push as the \"$N-second-rule\" about dropped food).\n    - Therefore, commit hashes on master are gold to link against.\n- All other branches *can* be force-pushed.\n    - Therefore, commit hashes not reachable from the master branch are inadvisable to link against.\n- If it's on master, it's understood to be good, in as much as we can tell.\n    - Changes and features don't get merged until their tests pass!\n    - Packages of \"alpha\" developmental status may exist, and be more subject to change than other more finalized parts of the repo, but their self-tests will at least pass.\n- Development proceeds -- both starting from and ending on -- the `master` branch.\n    - There are no other long-running supported-but-not-master branches.\n    - The existence of tags at any particular commit do not indicate that we will consider starting a long running and supported diverged branch from that point, nor start doing backports, etc.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipld%2Fgo-ipld-prime","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fipld%2Fgo-ipld-prime","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipld%2Fgo-ipld-prime/lists"}