Packages
Deterministic protocol verification for cryptographically bounded proof-of-possession authority.
Current section
Files
Jump to
Current section
Files
docs/errata.md
# Errata registry
Numbered errata against published normative documents, per the
[governance policy](governance.md#errata-channel). An erratum may clarify prose,
correct non-normative text, or add conformance cases. **No erratum may change a verdict of an
existing certified corpus**: any change that would alter such an accept/reject outcome is a
contract-major change and follows the evolution contract, never this registry. The one exception
is a soundness repair ([governance § Soundness repairs](governance.md#soundness-repairs)): it
changes verdicts only from accept to
reject on producer-impossible inputs, adds its cases in a new additive corpus, and leaves every
existing corpus verdict unchanged.
Each entry records: number, date, affected document and versions, the correction, and its
conformance-corpus impact (which must be additive or none).
| # | Date | Document | Correction | Corpus impact |
|---|---|---|---|---|
| 1 | 2026-08-24 | `docs/protocol-v1.md` and the standalone/embedded selector schemas as published in package versions 0.1.0–0.1.2 | An `all` selector is valid on exactly the three recognized selector member sets; `path` and `value`/`values` are inert when present. No other member set is accepted. | None: corpus bytes, 283 verdicts, and the certified index SHA are unchanged. |
| E-2026-09-17-1 | 2026-09-17 | README.md (published Hex 0.4.1) | The 0.4.1 package's README records checksum `8544a9ff…358a9` (the pre-publish `mix hex.build` inner-tar checksum) where the registry checksum belongs. The 0.4.1 registry checksum is `4648f545f681d540c965d460411133cf6188066439dbc37fc869288f9fcad1cf` (read back from the Hex release API); README on `main` is corrected. Consumers verify package identity against the registry, not the shipped README string. | none |
| 2 | 2026-10-12 | `spec/bap-v1.md`, `spec/bap-v2.md`, and the local-loopback, role-attestation, and content-assertion profile specifications, as published through package version 0.7.0 | Soundness repair: Ed25519 verification is strict. Point encodings must be canonical, small-order keys and `R` values are rejected, `S` must be below the group order, and the cofactorless equation is mandatory; public keys must pass key acceptance; hosts must check torsion-freedom at enrollment, trust install, and deny-list comparison. See the security advisory. | Additive: the new `bap-strict-ed25519/1` corpus (2,410 cases; index SHA-256 `732117dfe1881b553998126a9524a95bfb1171257e388d5430a0a099f2287cb9`). Every existing corpus index, its cases, and its verdicts are unchanged. |
| 3 | 2026-10-14 | `spec/bap-v1.md` § 16 (and its `docs/protocol-v1.md` view), `spec/bap-v2.md`, `spec/bap-v3.md` § 3.2, and the local-loopback, role-attestation, and content-assertion profile specifications, as published through package version 0.8.0 | Compact assembly and anchored-export encoding are producer surfaces: they frame a signature and verify none (§ 16 lists them among the public surfaces because they are public). Each MUST refuse a signature that no conforming signer emits: under contract-major 3, `r` or `s` outside `0 < r < n`, `0 < s ≤ ⌊n/2⌋`; under Ed25519, `S ≥ L`, or `R` non-canonical or of small order. Each MUST emit accepted signature bytes unchanged and never normalizes. Every BAP verifier already rejected these signatures, so no verification verdict changes. Requirement ids `REQ1-SIGNING-ed25519-producer-canonical`, `REQ2-SIGNING-ed25519-producer-canonical`, and `REQ3-SIGNING-producer-canonical`; the sibling profiles' assembly requirements carry the same clause. | Additive: the new `bap-producer-canonicality/1` corpus (75 cases; index SHA-256 `99ee6fbbf32758b03d4630647f721d8d4e349f0628d860493d667fe6e762c601`). Every existing corpus index, its cases, and its verdicts are unchanged. |
| 4 | 2026-10-14 | `spec/bap-v1.md` § 14.1 (and its `docs/protocol-v1.md` view), as published through package version 0.8.0 | Editorial: the torsion paragraph said one secret can sign under "up to eight distinct mixed-order encodings" of its key. The eight encodings `A + T` over the eight small-order points `T` include `T = O`, the prime-order key itself, so they are the prime-order key and up to seven mixed-order variants. The requirement (`REQ1-HOST-ed25519-torsion-free`) and every verdict are unchanged. | None: no corpus, case, or verdict changes. |
| 5 | 2026-10-14 | `spec/bap-v1.md` (and its `docs/protocol-v1.md` view), `spec/bap-v2.md`, and `spec/bap-v3.md`, as published through package version 0.8.0 | Editorial: section anchors were written as kramdown `{#id}` heading attributes, which HexDocs and GitHub print as literal text, and `spec/bap-v1.md` cross-references as `(#id)`, which they do not link, so links such as `bap-v1.md#strict-ed25519` did not resolve. Each anchor is now an explicit `<a id="…"></a>` element before its heading, with the same ids, and each cross-reference is a Markdown link to it. No heading wording, requirement, requirement id, or verdict changes. | None: no corpus, case, or verdict changes. |
| 6 | 2026-11-09 | `spec/bap-v1.md` § 7 and § 12 (and its `docs/protocol-v1.md` view), `spec/bap-v2.md` § 4, and `spec/bap-v3.md` § 4, as published through package version 0.9.1 | Soundness repair: grant decode on every contract-major rejects an `equals` value or `one_of` member that contains a float-tagged number equal to zero at any depth, whatever its sign or spelling (`0.0`, `-0.0`, `-0e0`, an underflowing `1e-400`). Range bounds and inert `all` members are unchanged; range comparison treats −0.0 and 0.0 as equal. RFC 8785 writes a float zero as `0`, which decodes integer-tagged, so no conforming producer emits one; verifiers accept non-JCS payload bytes, and conforming verifiers disagreed on whether `0.0` and `-0.0` are the same selector value. The grant producer refuses any float-tagged integral selector value, because its JCS bytes would decode integer-tagged. Requirement ids `REQ1/REQ2/REQ3-SELECTOR-float-zero`, `REQ3-SELECTOR-range-signed-zero`, and `REQ1/REQ2/REQ3-SIGNING-integral-float-selector`; the `REQ2-SELECTOR-range-signed-zero` evidence is corrected. Signer-bound: every affected value sits inside issuer-signed bytes, so under [governance § Soundness repairs](governance.md#soundness-repairs) condition 6 this entry is the disclosure and there is no separate advisory. Affected releases, which stay installable and return the pre-repair verdict: `bounded_authority_protocol` 0.9.1 and earlier on Hex; `@bounded-authority-protocol/verifier` 1.0.0 and earlier on npm; `@bounded-authority-protocol/signer` 1.0.0 and earlier on npm (producer refusal only); `bounded_authority_report_adapter` 0.12.0 and earlier on Hex (producer refusal only, through its protocol `~> 0.9.1` requirement). | Additive: the new `bap-selector-float-zero/1` corpus (161 cases; index SHA-256 `97fd7a99cdbf3acc0a78f5ba1c6556e23a63e0ad66f533e31fd69f82dc5f3003`). Every existing corpus index, its cases, and its verdicts are unchanged. |