Repository navigation
Purely additive since 0.2.0 — no existing exported function, type, error
code, wire format, vector, or default behaviour changes. Existing tests and
vectors pass unmodified.
Added
describeFilter(f)(.) — a plain, readonly public view of a
MembershipFilter's metadata (fingerprintBits,filterType,keyed,
padded,epoch,memberCountBand,segmentLength,segmentCount,
arrayLength,byteLength,theoreticalFalsePositiveRate), and the
FilterDescriptiontype. Reveals nothing beyond what the serializedKFLT
header already discloses (PROTOCOL.md §10).testMany(f, valuesHex)(.) — test many values against a filter in one
call, with the exact same validation and semantics as calling
testMembershipon each value (PROTOCOL.md §10).verifyAndParseFilter'sopts.strictlyNewerThan— an opt-in, stricter
sibling ofminEpochthat rejects a parsed filter whoseepochis not
strictly greater than the given value, closing the same-epoch-replay gap
minEpoch's non-strict<comparison leaves open for a caller who opts in
(PROTOCOL.md §4.3).minEpoch's own behaviour is unchanged.- New
TesseraErrorCodevalues:TEST_VALUES_TYPE(testMany's
non-arrayvaluesHex),VERIFY_STRICTLY_NEWER_THAN_INVALIDand
VERIFY_EPOCH_NOT_NEWER(opts.strictlyNewerThan's validation and
freshness-check failures). - PROTOCOL.md §10 ("Introspection & bulk-test helpers") and §11 ("Evolution /
versioning") — new sections;CONFORMANCE.mdlinks §11. - Dev tooling:
fast-checkproperty tests (build→serialize→parse round-trip
and byte-identical re-serialization over random member sets sized 0–2000;
testManyvs. the equivalenttestMembershiploop) and a structure-aware
fast-check fuzz test forparseFilterthat mutates individual header
fields (boundary + random values), fingerprint bytes, and geometry-driven
resizes, asserting every failure is aTesseraError;@vitest/coverage-v8
and atest:coveragescript (reporting only, no CI-failing thresholds); a
benchscript (scripts/bench.mjs, not run in CI ornpm test) timing
build/test/testMany/parse/sign/verify at 1k/100k/1M members. - PROTOCOL.md corrections from an independent review of this pass: §11's
"how a verifier rejects an unknown version" now distinguishesparseFilter
(rejects atPARSE_UNSUPPORTED_VERSION, after bounds/magic) from
verifyAndParseFilter(rejects almost all such blobs earlier, at
VERIFY_SIGNATURE_OR_SIGNER_MISMATCH, sinceverifyFilterBlobnever
inspectsformat_version); §4.3 now states plainly that this kit does not
enforce "one content per epoch," and gives usage guidance for
strictlyNewerThan(an ordinary re-fetch of the current epoch throws
VERIFY_EPOCH_NOT_NEWER— treat that as "no update," or useminEpoch
for re-fetches instead); §9 and theTesseraErrorCodeJSDoc now state the
minor-vs-major stability policy explicitly (existing codes are fixed within
a major version, new codes may be added in a minor one — don't write an
exhaustiveswitch/Recordover the union without a fallback). - CI now runs the test matrix on Node 22 and 24 (was 22 only).
Reproducible build: byte-identical output verified across two independent CI runners.
Artefact integrity
file: forgesworn-tessera-kit-0.2.1.tgz
size: 276647 bytes
sha256: 70bd67be74d0ebe6f698ffa7d23c9df47ca312e73aaecf5c73cdb6379f555a6e
sha512-SLeid4PSZhuxGLbvbnP2eQVZxcvsdwqenzSsJh9krFGtu38F/rP4JuWHdmS8jaZ8ybvgtbJwQti0rWiR7P56Ig==
Verify against the registry tarball:
curl -sLO https://registry.npmjs.org/@forgesworn/tessera-kit/-/tessera-kit-0.2.1.tgz
shasum -a 256 tessera-kit-0.2.1.tgz