v14.1.0
[14.1.0] — 2026-03-14
Added
- Content attachment metadata API —
attachContent()andattachEdgeContent()now accept optional{ mime, size }metadata hints, persist logical content byte size alongside the_contentOID, and exposegetContentMeta()/getEdgeContentMeta()for structured{ oid, mime, size }reads without manual_content.*property handling. Metadata reads stay aligned with the current_contentattachment instead of inheriting stale sibling props from later manual rewrites. - Streaming transitive closure traversal — Added
transitiveClosureStream()to the traversal stack so callers can consume reachability edges lazily as anAsyncGenerator<{ from, to }>without materializing the full closure array. The existingtransitiveClosure()API remains and now collects from the stream for backward compatibility. - First-class sync trust configuration —
WarpGraph.open({ trust })andgraph.syncWith(..., { trust })now expose an explicit public trust-config surface for sync evaluation instead of relying on hidden controller wiring alone. - Fluent
WarpStateV5test builder — AddedcreateStateBuilder()intest/helpers/stateBuilder.jsso state-heavy tests can seed nodes, edges, removals, properties, frontier state, and graph materialization through one fluent helper instead of ad hoc OR-Set/LWW mutation. - Seeded tree-construction determinism fuzzer — Added property-based coverage for patch and checkpoint tree construction, proving stable tree OIDs across internal content-anchor permutations in
PatchBuilderV2and shuffled content-property insertion order inCheckpointService.createV5(). - Focused markdownlint gate — Added
npm run lint:mdbacked bymarkdownlint-cliand a repo config that enforces fenced code-block languages (MD040) across Markdown files. - Markdown JS/TS code-sample linter — Added
npm run lint:md:code, which scans fenced JavaScript and TypeScript blocks in Markdown and syntax-checks them with the TypeScript parser for file/line-accurate diagnostics. - Pre-push hook regression harness — Added a focused Vitest behavioral harness for
scripts/hooks/pre-pushthat exercises the real shell hook with stubbed commands, proves quick mode skips Gate 8, and verifies Gate 1–8 failure labels at runtime.
Changed
- Release audit override for transitive
tar— Added an npmoverridespin fortar@7.5.11so the published/runtime dependency tree can resolve past thetar@<=7.5.10high-severity advisory blocking thev14.1.0release audit. - Content metadata review follow-ups —
ContentMetaandContentAttachmentOptionsare now exported as public type-only symbols, the consumer smoke test imports them directly, and the git-cas adapter docs now explicitly note that MIME/size hints are accepted for CRDT metadata but are not embedded in CAS manifests. - Content metadata surface manifest follow-up — the declaration contract manifest now matches the shipped API:
attachContent()/attachEdgeContent()include the optional metadata parameter for both patch builders and patch sessions, andWarpGraphexportsgetContentMeta()/getEdgeContentMeta()in the tracked public surface. - Backlog expanded for roaring runtime evaluation —
ROADMAP.mdnow tracksB170, a dedicated benchmark slice for nativeroaringversusroaring-wasmacross the bitmap-heavy hot paths used by the index builders and readers. - Roadmap reconciled after PR #69 merge —
ROADMAP.mdnow reflects the merged issue-45 content metadata work onmain, records that the GitHub issue queue is empty, and keepsB88as the next tracked backlog slice. - Roadmap reconciled after PR #67 / #68 merges —
ROADMAP.mdanddocs/ROADMAP/COMPLETED.mdnow reflect the merged pre-push gate regression work (B168) and the currentmainbaseline before the issue-45 slice branches off. - Large-graph traversal memory profile —
topologicalSort()now has a lightweight mode that avoids retaining discovery adjacency when callers do not need it.levels()andtransitiveReduction()were refactored to re-fetch neighbors on demand instead of pinning full topo adjacency in memory, reducing steady-state large-graph working sets. - Roadmap reconciled after B87 merge —
ROADMAP.mdnow treats the Markdown code-sample linter as merged work onmain, advances the CI/tooling wave to start atB88, and records the follow-up backlog items for pre-push gate-message regression coverage (B168) and archived-doc status guardrails (B169). - Surface validation accounting — The declaration surface checker now distinguishes runtime-backed exports from type-only manifest entries and understands namespace declarations, which makes the type-surface contract tighter without forcing runtime exports for pure types.
- Local push firewall now matches CI surface and docs checks —
scripts/hooks/pre-pushnow runsnpm run typecheck:surface,npm run lint:md, andnpm run lint:md:codealongside lint, strict typecheck, policy, and consumer surface checks before unit tests, so declaration-surface drift and Markdown sample regressions are blocked locally instead of waiting for CI. - Trust test infrastructure deduplicated — The TrustRecordService suites now share a single in-memory ref/blob/tree/commit fixture and JSON codec via
test/helpers/trustTestUtils.js, eliminating the four forked mock implementations that had started to drift. - Explicit type-only export manifest section —
type-surface.m8.jsonnow separates runtimeexportsfrom declaration-onlytypeExports, and the surface checker now fails on misplaced or duplicate entries across those sections. - Constructor option-bag defaults made explicit — Added an ESLint rule banning
constructor({ ... } = {})in source files and rewrote the remaining constructors to destructure an explicitoptionsbag inside the constructor body. This avoids accidentally marking required constructor params optional in JSDoc and strict type checking. - Checkpoint content-anchor batching —
CheckpointService.createV5()now folds content blob OIDs into sorted anchor entries in batches instead of building one monolithicSetbefore tree serialization. Added direct checkpoint coverage for anchor dedupe, deterministic ordering, and load-path indifference to_content_*anchor entries. - CI gate dedupe — Folded the duplicate
lintworkflow job intotype-firewalland carried forward the advisory runtimenpm auditstep there, leaving one authoritative lint/type gate in the main CI workflow. - Markdown fence labeling sweep — Unlabeled Markdown code fences now declare a language such as
text, letting the new markdown gate verify docs/examples without broad style-rule churn. - Docs static firewall extended — The CI fast gate now runs both markdown fence-language checks and JavaScript/TypeScript code-sample syntax validation before the runtime matrix jobs.
Fixed
- Missing content blob OIDs now throw instead of reading as empty bytes —
GitGraphAdapter.readBlob()now disambiguates real zero-byte blobs from swallowed missing-object reads by checking object existence when a blob stream collects to zero bytes. Corrupted_content/ edge-content references now surfacePersistenceError(E_MISSING_OBJECT)throughgetContent()/getEdgeContent()instead of returning a truthy empty buffer. - Deno CI resolver drift — The Deno test image now imports a Node 22 npm toolchain from
node:22-slim, installs dependencies withnpm ci, and runs tests with--node-modules-dir=manual, avoiding runtime npm re-resolution ofcbor-extractoptional platform packages while keeping the container on the repo’s supported Node engine line. - Markdown code-sample linter edge cases — The Markdown JS/TS sample linter now recognizes fenced code blocks indented by up to three spaces, rejects malformed mixed-marker fences, fails on unterminated JS/TS fences, and parses snippets with the repository’s configured TypeScript target from
tsconfig.base.json. - B87 review follow-ups — Clarified the ADR folds snippet as a wholly proposed
graph.view()sketch, corrected the pre-push quick-mode gate label to Gate 8, aligned the local hook’s gate numbers with CI for faster failure triage, and removed the self-expiringpending mergewording from the completed-roadmap archive entry. - Signed trust verification now performs real crypto checks — Trust evaluation now verifies Ed25519 signatures and key fingerprints during evidence processing instead of stopping at envelope/shape validation.
- Browser/WebSocket serve payload parity for edge properties —
WarpServeServicestate payloads now include edge properties, so served graph views no longer drop part of the graph model. attachContent()/attachEdgeContent()orphan blob writes — Content attachment now validates the target node/edge before writing blob content, preventing orphaned blob storage on invalid mutations.NodeWsAdaptercleanup contracts — Failed startup paths now clean up partial internal state, and shutdown is idempotent instead of leaving stale listener/server state behind.- Public export surface drift —
WarpServeServiceandWebSocketServerPortare exported fromindex.js, bringing runtime exports back into alignment with the declared public surface. - Type-policy false positives from declaration comments —
ts-policy-checknow ignores inline declaration comments instead of flagginganymentions that exist only inside explanatory comments. - Trust/canonical property coverage — Added property-based determinism coverage for
canonicalStringify()and trust-schema canonical parse behavior, and tightened the trust property generators to avoid invalid whitespace-onlywriterIdcounterexamples.
Registry publish summary
- npm:
success - JSR:
success
Dist-tag: latest
Version: 14.1.0
If one registry failed, re-run only that job from Actions.
What's Changed
- ci: lint Markdown JS/TS code samples by @flyingrobots in #66
- test: add pre-push gate regression coverage by @flyingrobots in #67
- fix: throw on missing content blob oids by @flyingrobots in #68
- feat: attach content metadata to content blobs by @flyingrobots in #69
Full Changelog: v14.0.0...v14.1.0