Release · 2026-08-11T18:26:09+02:00 · By Threadnote

Threadnote 4.1.1

Threadnote 4.1.1 makes small changes in mixed Nx and Bazel monorepos substantially cheaper and keeps existing graph results available while a newer checkout snapshot is being prepared.

What's new

Threadnote 4.1.1 makes small changes in mixed Nx and Bazel monorepos substantially cheaper and keeps existing graph results available while a newer checkout snapshot is being prepared.

Faster incremental monorepo updates

  • Nx, package-manager, and nested Bazel workspace compatibility is evaluated by semantic project scope instead of one repository-wide workspace fingerprint. Local metadata and source edits can reuse unrelated projects while changes to ownership or unresolved dependency boundaries continue to fall back safely.
  • Exact dirty-to-clean reversions reuse a retained clean snapshot, and interrupted-build cleanup performs only bounded foreground work before continuing through normal maintenance.
  • Structural-only indexing defers opaque image, audio, and video assets. Structured JSON, YAML, schema, and Apple resource extraction now uses deterministic classifier-specific budgets with source-to-storage attribution.
  • Redundant symbol indexes are removed, unresolved edge targets no longer occupy the reverse-adjacency index, and compaction recommendations include live-page fragmentation as well as SQLite freelist bytes.

Ready graphs remain useful during refresh

  • Non-strict query, node, neighbors, and explain operations can serve the latest immutable ready snapshot while indexing continues, with explicit stale freshness. Relationship-sensitive path and impact operations remain strict-current.
  • CLI and Manager progress now report whether materialization is full or incremental and expose the exact bounded fallback reason when known. This distinguishes parser-cache reuse from final graph reuse on large repositories.
  • Existing 4.1 graph databases migrate the optimized adjacency index atomically before it is queried. An already prepared partial index is retained without a repository-scale rebuild, and SQLite schema errors no longer appear as misleading filesystem-permission failures.

Bounded upgrades and repeatable scale gates

  • Reusable clean snapshots now record per-language-pack cache, derivation, and resolution provenance. A compatible extractor rollout re-extracts only files owned by changed packs; pack membership and unresolved resolution-surface changes continue to fail closed to a full rebuild.
  • Dirty indexing no longer performs a complete committed-tree/workspace observation before the real inventory pass, and source-only overlays reuse the manifest-derived workspace from that pass. Exact worktree bytes are still checked before and after lock acquisition, including successive edits to an already-dirty file.
  • Degraded parser results are now admitted from their persisted cache generation instead of rereading and reparsing the same resource-heavy source on every edit. Incremental activation also releases inventory heap pages and bounds both main and temporary SQLite pager caches before full-graph validation.
  • Refreshes that arrive during a build are serialized and collapse intermediate targets to the newest checkout state. The just-completed graph remains a reusable base, preventing a moving HEAD from automatically replaying a full materialization.
  • A deterministic mixed Nx/Bazel fixture generator pins reviewed Nx, rules_js, and Angular commits. Its release gate covers inventory, no-op and one-file indexing, queries, stale reads, recovery, storage growth, cached topology analysis, cold-build reduction, and moving-target behavior. On the 10,398-file standalone fixture, two successive one-file edits completed in 5.94–7.38 seconds at no more than 498.7 MiB RSS; both reused 10,397 files and staged one.

Use threadnote graph query --freshness allow-stale for an explicitly stale-tolerant CLI read. threadnote graph status shows the ready snapshot, active target, materialization mode, and indexing progress.