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, andexplainoperations can serve the latest immutable ready snapshot while indexing continues, with explicit stale freshness. Relationship-sensitivepathandimpactoperations 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.