@quolu/lattice 0.43.0 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/package.json +4 -2
  2. package/sensor/NOTICE +8 -19
  3. package/sensor/dist/bin/lattice-sensor.js +31 -0
  4. package/sensor/dist/db/index.d.ts +114 -0
  5. package/sensor/dist/db/index.d.ts.map +1 -1
  6. package/sensor/dist/db/index.js +235 -7
  7. package/sensor/dist/db/index.js.map +1 -1
  8. package/sensor/dist/db/migrations.js +1 -1
  9. package/sensor/dist/db/migrations.js.map +1 -1
  10. package/sensor/dist/db/queries.d.ts +46 -8
  11. package/sensor/dist/db/queries.d.ts.map +1 -1
  12. package/sensor/dist/db/queries.js +99 -16
  13. package/sensor/dist/db/queries.js.map +1 -1
  14. package/sensor/dist/db/wal-valve.d.ts +15 -2
  15. package/sensor/dist/db/wal-valve.d.ts.map +1 -1
  16. package/sensor/dist/db/wal-valve.js +88 -6
  17. package/sensor/dist/db/wal-valve.js.map +1 -1
  18. package/sensor/dist/extraction/extraction-version.d.ts +1 -1
  19. package/sensor/dist/extraction/extraction-version.d.ts.map +1 -1
  20. package/sensor/dist/extraction/extraction-version.js +5 -1
  21. package/sensor/dist/extraction/extraction-version.js.map +1 -1
  22. package/sensor/dist/extraction/function-ref.d.ts.map +1 -1
  23. package/sensor/dist/extraction/function-ref.js +6 -0
  24. package/sensor/dist/extraction/function-ref.js.map +1 -1
  25. package/sensor/dist/extraction/grammars.d.ts.map +1 -1
  26. package/sensor/dist/extraction/grammars.js +46 -0
  27. package/sensor/dist/extraction/grammars.js.map +1 -1
  28. package/sensor/dist/extraction/index.d.ts +11 -1
  29. package/sensor/dist/extraction/index.d.ts.map +1 -1
  30. package/sensor/dist/extraction/index.js +68 -16
  31. package/sensor/dist/extraction/index.js.map +1 -1
  32. package/sensor/dist/extraction/kernel/decode.d.ts.map +1 -1
  33. package/sensor/dist/extraction/kernel/decode.js +9 -3
  34. package/sensor/dist/extraction/kernel/decode.js.map +1 -1
  35. package/sensor/dist/extraction/kernel/index.d.ts +2 -0
  36. package/sensor/dist/extraction/kernel/index.d.ts.map +1 -1
  37. package/sensor/dist/extraction/kernel/index.js +122 -8
  38. package/sensor/dist/extraction/kernel/index.js.map +1 -1
  39. package/sensor/dist/extraction/kernel/layout.d.ts +10 -1
  40. package/sensor/dist/extraction/kernel/layout.d.ts.map +1 -1
  41. package/sensor/dist/extraction/kernel/layout.js +11 -2
  42. package/sensor/dist/extraction/kernel/layout.js.map +1 -1
  43. package/sensor/dist/extraction/kernel/loader.d.ts +42 -0
  44. package/sensor/dist/extraction/kernel/loader.d.ts.map +1 -1
  45. package/sensor/dist/extraction/kernel/loader.js.map +1 -1
  46. package/sensor/dist/extraction/languages/c-cpp.d.ts +13 -0
  47. package/sensor/dist/extraction/languages/c-cpp.d.ts.map +1 -1
  48. package/sensor/dist/extraction/languages/c-cpp.js +809 -13
  49. package/sensor/dist/extraction/languages/c-cpp.js.map +1 -1
  50. package/sensor/dist/extraction/store-worker.js +29 -0
  51. package/sensor/dist/extraction/store-worker.js.map +1 -1
  52. package/sensor/dist/extraction/tree-sitter.d.ts +4 -1
  53. package/sensor/dist/extraction/tree-sitter.d.ts.map +1 -1
  54. package/sensor/dist/extraction/tree-sitter.js +20 -4
  55. package/sensor/dist/extraction/tree-sitter.js.map +1 -1
  56. package/sensor/dist/extraction/wasm/tree-sitter-c.wasm +0 -0
  57. package/sensor/dist/extraction/wasm/tree-sitter-cpp.wasm +0 -0
  58. package/sensor/dist/extraction/wasm/tree-sitter-dart.wasm +0 -0
  59. package/sensor/dist/extraction/wasm/tree-sitter-kotlin.wasm +0 -0
  60. package/sensor/dist/extraction/wasm/tree-sitter-php.wasm +0 -0
  61. package/sensor/dist/extraction/wasm/tree-sitter-ruby.wasm +0 -0
  62. package/sensor/dist/extraction/wasm/tree-sitter-rust.wasm +0 -0
  63. package/sensor/dist/extraction/wasm/tree-sitter-swift.wasm +0 -0
  64. package/sensor/dist/index.d.ts +12 -1
  65. package/sensor/dist/index.d.ts.map +1 -1
  66. package/sensor/dist/index.js +42 -7
  67. package/sensor/dist/index.js.map +1 -1
  68. package/sensor/dist/mcp/daemon-registry.d.ts +5 -2
  69. package/sensor/dist/mcp/daemon-registry.d.ts.map +1 -1
  70. package/sensor/dist/mcp/daemon-registry.js +5 -2
  71. package/sensor/dist/mcp/daemon-registry.js.map +1 -1
  72. package/sensor/dist/mcp/index.d.ts +24 -0
  73. package/sensor/dist/mcp/index.d.ts.map +1 -1
  74. package/sensor/dist/mcp/index.js +51 -2
  75. package/sensor/dist/mcp/index.js.map +1 -1
  76. package/sensor/dist/mcp/liveness-watchdog.d.ts.map +1 -1
  77. package/sensor/dist/mcp/liveness-watchdog.js +3 -1
  78. package/sensor/dist/mcp/liveness-watchdog.js.map +1 -1
  79. package/sensor/dist/mcp/server-instructions.d.ts +1 -1
  80. package/sensor/dist/mcp/server-instructions.d.ts.map +1 -1
  81. package/sensor/dist/mcp/server-instructions.js +1 -0
  82. package/sensor/dist/mcp/server-instructions.js.map +1 -1
  83. package/sensor/dist/mcp/tools.d.ts +48 -0
  84. package/sensor/dist/mcp/tools.d.ts.map +1 -1
  85. package/sensor/dist/mcp/tools.js +231 -4
  86. package/sensor/dist/mcp/tools.js.map +1 -1
  87. package/sensor/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
  88. package/sensor/dist/resolution/c-fnptr-synthesizer.js +561 -127
  89. package/sensor/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
  90. package/sensor/dist/resolution/callback-synthesizer.d.ts +1 -1
  91. package/sensor/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  92. package/sensor/dist/resolution/callback-synthesizer.js +80 -11
  93. package/sensor/dist/resolution/callback-synthesizer.js.map +1 -1
  94. package/sensor/dist/resolution/import-resolver.d.ts.map +1 -1
  95. package/sensor/dist/resolution/import-resolver.js +34 -2
  96. package/sensor/dist/resolution/import-resolver.js.map +1 -1
  97. package/sensor/dist/resolution/index.d.ts +34 -0
  98. package/sensor/dist/resolution/index.d.ts.map +1 -1
  99. package/sensor/dist/resolution/index.js +393 -51
  100. package/sensor/dist/resolution/index.js.map +1 -1
  101. package/sensor/dist/resolution/memory-budget.d.ts +48 -0
  102. package/sensor/dist/resolution/memory-budget.d.ts.map +1 -0
  103. package/sensor/dist/resolution/memory-budget.js +162 -0
  104. package/sensor/dist/resolution/memory-budget.js.map +1 -0
  105. package/sensor/dist/resolution/name-matcher.d.ts +4 -7
  106. package/sensor/dist/resolution/name-matcher.d.ts.map +1 -1
  107. package/sensor/dist/resolution/name-matcher.js +256 -91
  108. package/sensor/dist/resolution/name-matcher.js.map +1 -1
  109. package/sensor/dist/resolution/resolver-pool.d.ts +41 -1
  110. package/sensor/dist/resolution/resolver-pool.d.ts.map +1 -1
  111. package/sensor/dist/resolution/resolver-pool.js +103 -3
  112. package/sensor/dist/resolution/resolver-pool.js.map +1 -1
  113. package/sensor/dist/resolution/resolver-worker.js +27 -0
  114. package/sensor/dist/resolution/resolver-worker.js.map +1 -1
  115. package/sensor/dist/sync/watcher.d.ts +8 -1
  116. package/sensor/dist/sync/watcher.d.ts.map +1 -1
  117. package/sensor/dist/sync/watcher.js +44 -2
  118. package/sensor/dist/sync/watcher.js.map +1 -1
  119. package/sensor/dist/types.d.ts +7 -3
  120. package/sensor/dist/types.d.ts.map +1 -1
  121. package/src/cli-help.mjs +16 -0
  122. package/src/sensor-adapter.mjs +4 -0
  123. package/src/sensor-cli.mjs +37 -5
  124. package/src/sensor-diff.mjs +661 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quolu/lattice",
3
- "version": "0.43.0",
3
+ "version": "0.45.0",
4
4
  "description": "Schedulability compiler for multi-agent development: observe real code boundaries, refactor the conflicting seam, recompile the plan for parallel execution",
5
5
  "author": {
6
6
  "name": "Quo / クオ at kitepon.dev",
@@ -74,7 +74,9 @@
74
74
  "verify:todo-store": "node bin/lattice.mjs todo verify --json",
75
75
  "check:cli-surface": "node scripts/verify-cli-surface.mjs",
76
76
  "check:open-questions": "node scripts/verify-open-questions.mjs",
77
- "check:reachability": "node scripts/verify-product-reachability.mjs"
77
+ "check:reachability": "node scripts/verify-product-reachability.mjs",
78
+ "upstream:check": "node scripts/upstream-check.mjs",
79
+ "upstream:sync": "node scripts/upstream-sync.mjs"
78
80
  },
79
81
  "homepage": "https://github.com/kitepon-rgb/Lattice#readme",
80
82
  "bugs": {
package/sensor/NOTICE CHANGED
@@ -8,23 +8,12 @@ Lattice の構造 sensor として吸収したものである(Lattice ADR 0047
8
8
  - 取り込み方法: `git archive`(pristine tree。改変は吸収後の履歴が持つ)
9
9
  - 取り込み時の唯一の改変: upstream `CLAUDE.md` → `docs/UPSTREAM-CLAUDE.md` へ移動
10
10
  (Lattice 内での AI セッションへ upstream 正典が自動注入されるのを防ぐ。内容は不変)
11
- ## upstream 追従方針(cherry-pick 基準・ADR 0048 Decision 4 の消化)
11
+ ## upstream 追従方針(ADR 0155・オーナー裁定 2026-08-03)
12
12
 
13
- - 既定は**選択的 cherry-pick**。全量 merge 追従はしない(sensor は Lattice 所有で、
14
- 改良(a)(b)(c) により upstream と意図的に分岐しているため)。
15
- - 取り込む: (i) グラフ構築の correctness に関わる修正(extraction / resolution /
16
- storage / migration)(ii) Lattice sensor として使う CLI 面(index / affected /
17
- explore 等)の欠陥修正 (iii) security fix。
18
- - 取り込まない: site / telemetry / install channel / UI、および Lattice 側で置換・
19
- 改良済みの経路(corroboration filter・動的 import 抽出等)と衝突する変更。
20
- 衝突する場合は自前実装を優先し、必要なら考え方だけ手移植する。
21
- - 手順: upstream diff を実読 → cherry-pick または手移植 → schema migration は
22
- **Lattice 採番(v9 以降は Lattice が所有。upstream の同番 migration は振替)** →
23
- focused test → `npm run ci` green → 本 NOTICE 末尾の「追従記録」へ
24
- upstream commit を追記。
25
- - 監視は定期ジョブ化しない。sensor の欠陥・機能不足に当たった時に upstream を
26
- 確認する(必要駆動)。
27
-
28
- ## 追従記録
29
-
30
- (吸収時点 04ab45c 以降の取り込みなし)
13
+ - 既定は**全量 3-way merge**。貰えるものは全部取り込む。旧方針(選択的 cherry-pick・
14
+ 必要駆動の監視)は54コミット溜めた実績をもって廃止した(経緯は ADR 0155)。
15
+ - 正本は `sensor/UPSTREAM.json`(同期点 synced_at・path 写像・skip・衝突方針・削除承認)。
16
+ - 追従は `npm run upstream:sync`(衝突後は解決 commit `--mark-synced`)、
17
+ 検知は週次の `.github/workflows/upstream-check.yml` `npm run upstream:check`。
18
+ - 取り込み履歴は UPSTREAM.json synced_at git 履歴が持つ(本 NOTICE には重複記録しない)。
19
+ 現在の同期点: 49c11fc(2026-08-03、54コミット消化・kernel 20言語化)。
@@ -861,6 +861,8 @@ function main() {
861
861
  const journalMode = cg.getJournalMode();
862
862
  const buildInfo = cg.getIndexBuildInfo();
863
863
  const reindexRecommended = cg.isIndexStale();
864
+ // Non-zero means THIS process is older than the index it is attached to.
865
+ const engineBehindIndexFiles = cg.getEngineBehindIndexFileCount();
864
866
  const indexState = cg.getIndexState();
865
867
  // Zero on a healthy index; non-zero at rest means a resolution pass was
866
868
  // interrupted, so some files' call edges are missing (#1187).
@@ -878,6 +880,7 @@ function main() {
878
880
  nodeCount: stats.nodeCount,
879
881
  edgeCount: stats.edgeCount,
880
882
  dbSizeBytes: stats.dbSizeBytes,
883
+ walSizeBytes: stats.walSizeBytes,
881
884
  backend,
882
885
  journalMode,
883
886
  nodesByKind: stats.nodesByKind,
@@ -895,6 +898,11 @@ function main() {
895
898
  builtWithExtractionVersion: buildInfo.extractionVersion,
896
899
  currentExtractionVersion: extraction_version_1.EXTRACTION_VERSION,
897
900
  reindexRecommended,
901
+ // Files written by a NEWER extractor than this process. Non-zero
902
+ // means this process is behind the index; it leaves those rows
903
+ // alone rather than downgrading them, so the gap persists until
904
+ // the older process is restarted on the current build.
905
+ engineBehindIndexFiles,
898
906
  // 'complete' | 'partial' (files silently dropped) | 'indexing'
899
907
  // (a run was killed mid-index — the index is truncated) |
900
908
  // 'failed' | null (predates the marker).
@@ -933,6 +941,19 @@ function main() {
933
941
  console.log(` Nodes: ${formatNumber(stats.nodeCount)}`);
934
942
  console.log(` Edges: ${formatNumber(stats.edgeCount)}`);
935
943
  console.log(` DB Size: ${(stats.dbSizeBytes / 1024 / 1024).toFixed(2)} MB`);
944
+ // Surface the WAL sidecar (#1431): a WAL that dwarfs the DB at rest is
945
+ // the killed-session leak — invisible before this line, it only showed
946
+ // up as a mysteriously full disk. open() above already kicked off the
947
+ // automatic heal for the oversized case.
948
+ if (stats.walSizeBytes > 0) {
949
+ const { WAL_HEAL_THRESHOLD_BYTES } = await Promise.resolve().then(() => __importStar(require('../db/index')));
950
+ const oversized = stats.walSizeBytes > Math.max(WAL_HEAL_THRESHOLD_BYTES, stats.dbSizeBytes);
951
+ const walLabel = `${(stats.walSizeBytes / 1024 / 1024).toFixed(2)} MB`;
952
+ console.log(` WAL Size: ${oversized ? chalk.yellow(walLabel) : walLabel}`);
953
+ if (oversized) {
954
+ warn('The write-ahead log is larger than the database — killed sessions left it behind. It is reclaimed automatically on open; if it persists across runs, another live LatticeSensor process is holding it.');
955
+ }
956
+ }
936
957
  // Surface the active SQLite backend (node:sqlite — Node's built-in real
937
958
  // SQLite, full WAL + FTS5, no native build).
938
959
  const backendLabel = chalk.green(`node:sqlite ${(0, glyphs_1.getGlyphs)().dash} built-in (full WAL)`);
@@ -991,6 +1012,16 @@ function main() {
991
1012
  info('Run "lattice sensor index" (full rebuild) or "lattice sensor sync"');
992
1013
  console.log();
993
1014
  }
1015
+ // The opposite direction, and the one that used to be invisible: this
1016
+ // process is older than the index. Those rows are left untouched on
1017
+ // purpose, so nothing converges until the stale process is restarted.
1018
+ if (engineBehindIndexFiles > 0) {
1019
+ warn(`${engineBehindIndexFiles} file(s) were indexed by a NEWER extractor than this process`
1020
+ + ` (running extraction v${extraction_version_1.EXTRACTION_VERSION}).`);
1021
+ info('This process is behind the index and will not rewrite those rows.'
1022
+ + ' Restart any long-running sensor process on the current build.');
1023
+ console.log();
1024
+ }
994
1025
  cg.destroy();
995
1026
  }
996
1027
  catch (err) {
@@ -6,6 +6,20 @@
6
6
  import { SqliteDatabase, SqliteBackend } from './sqlite-adapter';
7
7
  import { SchemaVersion } from '../types';
8
8
  export { SqliteDatabase, SqliteBackend } from './sqlite-adapter';
9
+ /**
10
+ * WAL size past which `healOversizedWal` (run at every `open`) checkpoints and
11
+ * truncates the file, and to which `journal_size_limit` clips the WAL after any
12
+ * resetting checkpoint. A SIGKILL'd process (the #850 liveness watchdog, OOM,
13
+ * crash) can leave an arbitrarily large WAL behind — a whole deferred-sync
14
+ * run's worth (#1248) — and before #1431 no later session ever shrank it: the
15
+ * file just grew, killed session after killed session, until the disk filled
16
+ * (25.6 GB observed). 64 MB is far above anything a healthy open ever sees
17
+ * (a clean close deletes the WAL) yet small enough to cap the leak.
18
+ * Override with `LATTICE_SENSOR_WAL_HEAL_MB` (also feeds `journal_size_limit`).
19
+ */
20
+ export declare const WAL_HEAL_THRESHOLD_BYTES: number;
21
+ /** Resolve the heal threshold from the env override (MB); invalid ⇒ 64 MB. */
22
+ export declare function resolveWalHealBytes(envVal: string | undefined): number;
9
23
  /**
10
24
  * Database connection wrapper with lifecycle management
11
25
  */
@@ -52,6 +66,64 @@ export declare class DatabaseConnection {
52
66
  * IF NOT EXISTS).
53
67
  */
54
68
  endBulkNodeLoad(): void;
69
+ /**
70
+ * NON-UNIQUE secondary indexes maintained per-row during the parse phase's
71
+ * bulk inserts — the store-architecture arc's first lever (plan §4d: dubbo's
72
+ * parse-loop wall is 94% store-writer busy, and the #1320 post-mortem showed
73
+ * statement batching and sorted inserts are ~zero on this path because
74
+ * B-TREE MAINTENANCE is the floor). A fresh init writes every row of
75
+ * nodes/unresolved_refs/files exactly once and reads none of them until
76
+ * resolution, so the parse window can drop all of these and rebuild each in
77
+ * one table scan afterwards — the same measured trade as the resolution
78
+ * phase's edge-index window (2.8s → 1.1s inserting, ~0.3s recreating).
79
+ * Primary keys and UNIQUE constraints stay (upserts and OR-IGNORE dedup
80
+ * conflict on them).
81
+ */
82
+ private static readonly BULK_PARSE_INDEX_NAMES;
83
+ /**
84
+ * Enter bulk-parse-load mode (FRESH-INIT ONLY — the caller gates on a fresh
85
+ * DB, because an incremental index deletes per-file rows mid-phase and needs
86
+ * the file_path indexes): drop every parse-lane secondary index, including
87
+ * the four non-unique edge indexes (parse inserts contains-edges too; the
88
+ * UNIQUE identity index stays for INSERT OR IGNORE dedup, and its `source`
89
+ * prefix keeps source-keyed reads indexed, as in the edge window). MUST be
90
+ * paired with endBulkParseLoad(); a crash inside the window is healed on the
91
+ * next DatabaseConnection open (schema.sql re-applies CREATE INDEX IF NOT
92
+ * EXISTS).
93
+ */
94
+ beginBulkParseLoad(): void;
95
+ /**
96
+ * Leave bulk-parse-load mode: recreate everything the window dropped, one
97
+ * table scan per index, with a yield between statements (same
98
+ * liveness-watchdog rationale as endBulkEdgeLoad — at kernel scale each
99
+ * build is a long synchronous scan). The edge indexes are rebuilt here too,
100
+ * so paths that never enter the resolution phase's own bulk-edge window
101
+ * (small runs) are left with a complete schema; the batched resolver's
102
+ * beginBulkEdgeLoad simply re-drops them (DROP IF EXISTS — idempotent).
103
+ */
104
+ endBulkParseLoad(): Promise<void>;
105
+ /**
106
+ * unresolved_refs secondary indexes NOT read by the batched resolution
107
+ * loop. The loop pages pending refs by keyset (`status='pending' AND id>?`
108
+ * — the status index + PK), deletes resolved rows by id, and parks failures
109
+ * with a status UPDATE; every other ref index serves SYNC-time paths
110
+ * (per-file re-index deletes, name-keyed retry, failed-tail heal). Each
111
+ * per-batch DELETE maintains all of them — the biggest single main-thread
112
+ * stage on the dubbo profile (deletes 1.2s of a 5.4s resolution phase) —
113
+ * so the batched loop drops them and rebuilds at the end, where the table
114
+ * holds only the surviving FAILED refs (resolved rows are gone), making
115
+ * the recreate near-free.
116
+ */
117
+ private static readonly BULK_REF_INDEX_NAMES;
118
+ /**
119
+ * Enter bulk-ref mode for the batched resolution loop — see
120
+ * BULK_REF_INDEX_NAMES. MUST be paired with endBulkRefLoad(); a crash
121
+ * inside the window heals on the next open (schema.sql re-applies
122
+ * CREATE INDEX IF NOT EXISTS).
123
+ */
124
+ beginBulkRefLoad(): void;
125
+ /** Leave bulk-ref mode: recreate each index in one scan (yield between). */
126
+ endBulkRefLoad(): Promise<void>;
55
127
  /**
56
128
  * Names of the NON-UNIQUE edge indexes dropped for a bulk edge load.
57
129
  * idx_edges_identity deliberately stays: INSERT OR IGNORE's dedup conflicts
@@ -136,6 +208,9 @@ export declare class DatabaseConnection {
136
208
  * journal mode, in-memory DB, or no write since the last checkpoint+reset).
137
209
  */
138
210
  getWalSizeBytes(): number;
211
+ /** Size of the main DB file in bytes (0 for in-memory/unknown) — the WAL
212
+ * valve scales its fold caps with it (resolveWalValveMb). */
213
+ getDbFileSizeBytes(): number;
139
214
  /** Current `wal_autocheckpoint` interval in pages (0 = disabled). */
140
215
  getWalAutocheckpoint(): number;
141
216
  /**
@@ -169,6 +244,45 @@ export declare class DatabaseConnection {
169
244
  log: number;
170
245
  checkpointed: number;
171
246
  } | null>;
247
+ /**
248
+ * `PRAGMA wal_checkpoint(TRUNCATE)` — same off-thread pattern as PASSIVE,
249
+ * but on success the WAL FILE is chopped to zero. A completed passive
250
+ * backfill bounds the un-checkpointed backlog, yet the FILE only stops
251
+ * growing when a commit finds ZERO readers holding WAL marks — rare while
252
+ * pool workers cycle, so at kernel scale a fully-backfilled WAL still
253
+ * accreted the phase's whole write volume on disk (§7a.1: 22GB). The valve
254
+ * calls this exactly at a parked barrier (writer parked, pool drained,
255
+ * backfill complete) where the no-reader condition is guaranteed rather
256
+ * than lucky. The worker sets a short busy_timeout so a racing reader
257
+ * degrades this to a no-op (busy=1) instead of a stall.
258
+ */
259
+ checkpointWalTruncate(): Promise<{
260
+ busy: number;
261
+ log: number;
262
+ checkpointed: number;
263
+ } | null>;
264
+ /**
265
+ * Shrink a leftover oversized WAL (#1431). A SIGKILL'd session — the #850
266
+ * liveness watchdog, OOM, a crash — leaves its WAL on disk, the next session
267
+ * appends to the same file, and (pre-#1431) nothing ever truncated it:
268
+ * PASSIVE checkpoints fold frames but keep the file at its high-water mark,
269
+ * and the one shrinking path (a clean last-connection close) is exactly what
270
+ * the killed world never takes. Unbounded growth until the disk fills.
271
+ *
272
+ * Called fire-and-forget from every `open()`: cost is one statSync when the
273
+ * WAL is small (the overwhelmingly common case). Past the threshold it runs
274
+ * the off-thread PASSIVE fold then TRUNCATE — both on worker connections
275
+ * with a busy_timeout, so a racing writer degrades this to a no-op that the
276
+ * next open retries rather than a stall.
277
+ */
278
+ healOversizedWal(): Promise<{
279
+ healed: boolean;
280
+ beforeBytes: number;
281
+ afterBytes: number;
282
+ }>;
283
+ private walHeal;
284
+ private runWalHeal;
285
+ private checkpointWal;
172
286
  /**
173
287
  * Optimize database (vacuum and analyze)
174
288
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAkB,MAAM,kBAAkB,CAAC;AAGjF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA0BjE;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B;;;;;;;OAOG;IACH,OAAO,CAAC,WAAW,CAAgB;IAEnC,OAAO;IAOP;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IA4BrD;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAyB/C;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAiD;IAE1F;;;;;;;OAOG;IACH,iBAAiB,IAAI,IAAI;IAMzB;;;;;OAKG;IACH,eAAe,IAAI,IAAI;IAKvB;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAKlC;IAEX;;;;;;;OAOG;IACH,iBAAiB,IAAI,IAAI;IAMzB;;;;;;;;;;;;OAYG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtC,8EAA8E;IAC9E,OAAO,CAAC,gBAAgB;IAUxB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,KAAK,IAAI,cAAc;IAIvB;;;;OAIG;IACH,UAAU,IAAI,aAAa;IAI3B;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;;;;;;;;OASG;IACH,cAAc,IAAI,MAAM;IASxB;;OAEG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAcxC;;OAEG;IACH,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAI9B;;OAEG;IACH,OAAO,IAAI,MAAM;IAKjB;;;OAGG;IACH,eAAe,IAAI,MAAM;IASzB,qEAAqE;IACrE,oBAAoB,IAAI,MAAM;IAM9B;;;;;;;OAOG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC;;;;;;;;;;;;;;;;OAgBG;IACG,oBAAoB,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IA2CjG;;OAEG;IACH,QAAQ,IAAI,IAAI;IAKhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAcrC;;;;;;;OAOG;YACW,mBAAmB;IAkCjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;;;;;;;;;OAUG;IACH,gBAAgB,IAAI,OAAO;CAK5B;AAmBD;;GAEG;AACH,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAS7C;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAWxD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
@@ -38,7 +38,8 @@ var __importStar = (this && this.__importStar) || (function () {
38
38
  };
39
39
  })();
40
40
  Object.defineProperty(exports, "__esModule", { value: true });
41
- exports.DATABASE_FILENAME = exports.DatabaseConnection = void 0;
41
+ exports.DATABASE_FILENAME = exports.DatabaseConnection = exports.WAL_HEAL_THRESHOLD_BYTES = void 0;
42
+ exports.resolveWalHealBytes = resolveWalHealBytes;
42
43
  exports.getDatabasePath = getDatabasePath;
43
44
  exports.removeDatabaseFiles = removeDatabaseFiles;
44
45
  const sqlite_adapter_1 = require("./sqlite-adapter");
@@ -68,6 +69,34 @@ function configureConnection(db) {
68
69
  db.pragma('cache_size = -64000'); // 64 MB page cache
69
70
  db.pragma('temp_store = MEMORY'); // temp tables in memory
70
71
  db.pragma('mmap_size = 268435456'); // 256 MB memory-mapped I/O
72
+ // Without a journal_size_limit the -wal file never shrinks below its
73
+ // high-water mark while a connection lives: checkpoints fold frames back but
74
+ // leave the file at full size, so one giant deferred-sync WAL stays giant
75
+ // forever. With the limit set, any checkpoint that resets the WAL truncates
76
+ // the file back down. Killed-process leftovers are handled separately by
77
+ // healOversizedWal() at open. (#1431)
78
+ db.pragma(`journal_size_limit = ${exports.WAL_HEAL_THRESHOLD_BYTES}`);
79
+ }
80
+ /**
81
+ * WAL size past which `healOversizedWal` (run at every `open`) checkpoints and
82
+ * truncates the file, and to which `journal_size_limit` clips the WAL after any
83
+ * resetting checkpoint. A SIGKILL'd process (the #850 liveness watchdog, OOM,
84
+ * crash) can leave an arbitrarily large WAL behind — a whole deferred-sync
85
+ * run's worth (#1248) — and before #1431 no later session ever shrank it: the
86
+ * file just grew, killed session after killed session, until the disk filled
87
+ * (25.6 GB observed). 64 MB is far above anything a healthy open ever sees
88
+ * (a clean close deletes the WAL) yet small enough to cap the leak.
89
+ * Override with `LATTICE_SENSOR_WAL_HEAL_MB` (also feeds `journal_size_limit`).
90
+ */
91
+ exports.WAL_HEAL_THRESHOLD_BYTES = resolveWalHealBytes(process.env.LATTICE_SENSOR_WAL_HEAL_MB);
92
+ /** Resolve the heal threshold from the env override (MB); invalid ⇒ 64 MB. */
93
+ function resolveWalHealBytes(envVal) {
94
+ if (envVal !== undefined && envVal !== '') {
95
+ const n = Number(envVal);
96
+ if (Number.isFinite(n) && n > 0)
97
+ return Math.floor(n * 1024 * 1024);
98
+ }
99
+ return 64 * 1024 * 1024;
71
100
  }
72
101
  /**
73
102
  * Database connection wrapper with lifecycle management
@@ -133,6 +162,9 @@ class DatabaseConnection {
133
162
  // beginBulkNodeLoad and endBulkNodeLoad): the FTS triggers are missing and
134
163
  // nodes_fts is stale. Rebuild + recreate so search stays in sync.
135
164
  conn.healBulkNodeLoad();
165
+ // Self-heal a killed session's leftover oversized WAL (#1431) — one
166
+ // statSync when healthy, off-thread checkpoint+truncate when not.
167
+ void conn.healOversizedWal();
136
168
  return conn;
137
169
  }
138
170
  /**
@@ -163,6 +195,116 @@ class DatabaseConnection {
163
195
  this.db.exec(`INSERT INTO nodes_fts(nodes_fts) VALUES('rebuild')`);
164
196
  this.recreateFtsTriggers();
165
197
  }
198
+ /**
199
+ * NON-UNIQUE secondary indexes maintained per-row during the parse phase's
200
+ * bulk inserts — the store-architecture arc's first lever (plan §4d: dubbo's
201
+ * parse-loop wall is 94% store-writer busy, and the #1320 post-mortem showed
202
+ * statement batching and sorted inserts are ~zero on this path because
203
+ * B-TREE MAINTENANCE is the floor). A fresh init writes every row of
204
+ * nodes/unresolved_refs/files exactly once and reads none of them until
205
+ * resolution, so the parse window can drop all of these and rebuild each in
206
+ * one table scan afterwards — the same measured trade as the resolution
207
+ * phase's edge-index window (2.8s → 1.1s inserting, ~0.3s recreating).
208
+ * Primary keys and UNIQUE constraints stay (upserts and OR-IGNORE dedup
209
+ * conflict on them).
210
+ */
211
+ static BULK_PARSE_INDEX_NAMES = [
212
+ 'idx_nodes_kind',
213
+ 'idx_nodes_name',
214
+ 'idx_nodes_qualified_name',
215
+ 'idx_nodes_file_path',
216
+ 'idx_nodes_language',
217
+ 'idx_nodes_file_line',
218
+ 'idx_nodes_lower_name',
219
+ 'idx_unresolved_from_node',
220
+ 'idx_unresolved_name',
221
+ 'idx_unresolved_file_path',
222
+ 'idx_unresolved_from_name',
223
+ 'idx_unresolved_status',
224
+ 'idx_unresolved_failed_tail',
225
+ 'idx_files_language',
226
+ 'idx_files_modified_at',
227
+ ];
228
+ /**
229
+ * Enter bulk-parse-load mode (FRESH-INIT ONLY — the caller gates on a fresh
230
+ * DB, because an incremental index deletes per-file rows mid-phase and needs
231
+ * the file_path indexes): drop every parse-lane secondary index, including
232
+ * the four non-unique edge indexes (parse inserts contains-edges too; the
233
+ * UNIQUE identity index stays for INSERT OR IGNORE dedup, and its `source`
234
+ * prefix keeps source-keyed reads indexed, as in the edge window). MUST be
235
+ * paired with endBulkParseLoad(); a crash inside the window is healed on the
236
+ * next DatabaseConnection open (schema.sql re-applies CREATE INDEX IF NOT
237
+ * EXISTS).
238
+ */
239
+ beginBulkParseLoad() {
240
+ for (const idx of DatabaseConnection.BULK_PARSE_INDEX_NAMES) {
241
+ this.db.exec(`DROP INDEX IF EXISTS ${idx}`);
242
+ }
243
+ this.beginBulkEdgeLoad();
244
+ }
245
+ /**
246
+ * Leave bulk-parse-load mode: recreate everything the window dropped, one
247
+ * table scan per index, with a yield between statements (same
248
+ * liveness-watchdog rationale as endBulkEdgeLoad — at kernel scale each
249
+ * build is a long synchronous scan). The edge indexes are rebuilt here too,
250
+ * so paths that never enter the resolution phase's own bulk-edge window
251
+ * (small runs) are left with a complete schema; the batched resolver's
252
+ * beginBulkEdgeLoad simply re-drops them (DROP IF EXISTS — idempotent).
253
+ */
254
+ async endBulkParseLoad() {
255
+ const schemaPath = path.join(__dirname, 'schema.sql');
256
+ const schema = fs.readFileSync(schemaPath, 'utf-8');
257
+ for (const idx of DatabaseConnection.BULK_PARSE_INDEX_NAMES) {
258
+ const m = schema.match(new RegExp(`CREATE INDEX IF NOT EXISTS ${idx}\\b[^;]*;`));
259
+ if (!m)
260
+ throw new Error(`schema.sql: parse index ${idx} not found for bulk-load recreation`);
261
+ this.db.exec(m[0]);
262
+ await new Promise((resolve) => setImmediate(resolve));
263
+ }
264
+ await this.endBulkEdgeLoad();
265
+ }
266
+ /**
267
+ * unresolved_refs secondary indexes NOT read by the batched resolution
268
+ * loop. The loop pages pending refs by keyset (`status='pending' AND id>?`
269
+ * — the status index + PK), deletes resolved rows by id, and parks failures
270
+ * with a status UPDATE; every other ref index serves SYNC-time paths
271
+ * (per-file re-index deletes, name-keyed retry, failed-tail heal). Each
272
+ * per-batch DELETE maintains all of them — the biggest single main-thread
273
+ * stage on the dubbo profile (deletes 1.2s of a 5.4s resolution phase) —
274
+ * so the batched loop drops them and rebuilds at the end, where the table
275
+ * holds only the surviving FAILED refs (resolved rows are gone), making
276
+ * the recreate near-free.
277
+ */
278
+ static BULK_REF_INDEX_NAMES = [
279
+ 'idx_unresolved_from_node',
280
+ 'idx_unresolved_name',
281
+ 'idx_unresolved_file_path',
282
+ 'idx_unresolved_from_name',
283
+ 'idx_unresolved_failed_tail',
284
+ ];
285
+ /**
286
+ * Enter bulk-ref mode for the batched resolution loop — see
287
+ * BULK_REF_INDEX_NAMES. MUST be paired with endBulkRefLoad(); a crash
288
+ * inside the window heals on the next open (schema.sql re-applies
289
+ * CREATE INDEX IF NOT EXISTS).
290
+ */
291
+ beginBulkRefLoad() {
292
+ for (const idx of DatabaseConnection.BULK_REF_INDEX_NAMES) {
293
+ this.db.exec(`DROP INDEX IF EXISTS ${idx}`);
294
+ }
295
+ }
296
+ /** Leave bulk-ref mode: recreate each index in one scan (yield between). */
297
+ async endBulkRefLoad() {
298
+ const schemaPath = path.join(__dirname, 'schema.sql');
299
+ const schema = fs.readFileSync(schemaPath, 'utf-8');
300
+ for (const idx of DatabaseConnection.BULK_REF_INDEX_NAMES) {
301
+ const m = schema.match(new RegExp(`CREATE INDEX IF NOT EXISTS ${idx}\\b[^;]*;`));
302
+ if (!m)
303
+ throw new Error(`schema.sql: ref index ${idx} not found for bulk-load recreation`);
304
+ this.db.exec(m[0]);
305
+ await new Promise((resolve) => setImmediate(resolve));
306
+ }
307
+ }
166
308
  /**
167
309
  * Names of the NON-UNIQUE edge indexes dropped for a bulk edge load.
168
310
  * idx_edges_identity deliberately stays: INSERT OR IGNORE's dedup conflicts
@@ -321,6 +463,18 @@ class DatabaseConnection {
321
463
  return 0;
322
464
  }
323
465
  }
466
+ /** Size of the main DB file in bytes (0 for in-memory/unknown) — the WAL
467
+ * valve scales its fold caps with it (resolveWalValveMb). */
468
+ getDbFileSizeBytes() {
469
+ if (!this.dbPath || this.dbPath === ':memory:')
470
+ return 0;
471
+ try {
472
+ return fs.statSync(this.dbPath).size;
473
+ }
474
+ catch {
475
+ return 0;
476
+ }
477
+ }
324
478
  /** Current `wal_autocheckpoint` interval in pages (0 = disabled). */
325
479
  getWalAutocheckpoint() {
326
480
  const v = this.db.pragma('wal_autocheckpoint', { simple: true });
@@ -356,9 +510,72 @@ class DatabaseConnection {
356
510
  * never run inline on the main thread).
357
511
  */
358
512
  async checkpointWalPassive() {
513
+ return this.checkpointWal('PASSIVE');
514
+ }
515
+ /**
516
+ * `PRAGMA wal_checkpoint(TRUNCATE)` — same off-thread pattern as PASSIVE,
517
+ * but on success the WAL FILE is chopped to zero. A completed passive
518
+ * backfill bounds the un-checkpointed backlog, yet the FILE only stops
519
+ * growing when a commit finds ZERO readers holding WAL marks — rare while
520
+ * pool workers cycle, so at kernel scale a fully-backfilled WAL still
521
+ * accreted the phase's whole write volume on disk (§7a.1: 22GB). The valve
522
+ * calls this exactly at a parked barrier (writer parked, pool drained,
523
+ * backfill complete) where the no-reader condition is guaranteed rather
524
+ * than lucky. The worker sets a short busy_timeout so a racing reader
525
+ * degrades this to a no-op (busy=1) instead of a stall.
526
+ */
527
+ async checkpointWalTruncate() {
528
+ return this.checkpointWal('TRUNCATE');
529
+ }
530
+ /**
531
+ * Shrink a leftover oversized WAL (#1431). A SIGKILL'd session — the #850
532
+ * liveness watchdog, OOM, a crash — leaves its WAL on disk, the next session
533
+ * appends to the same file, and (pre-#1431) nothing ever truncated it:
534
+ * PASSIVE checkpoints fold frames but keep the file at its high-water mark,
535
+ * and the one shrinking path (a clean last-connection close) is exactly what
536
+ * the killed world never takes. Unbounded growth until the disk fills.
537
+ *
538
+ * Called fire-and-forget from every `open()`: cost is one statSync when the
539
+ * WAL is small (the overwhelmingly common case). Past the threshold it runs
540
+ * the off-thread PASSIVE fold then TRUNCATE — both on worker connections
541
+ * with a busy_timeout, so a racing writer degrades this to a no-op that the
542
+ * next open retries rather than a stall.
543
+ */
544
+ async healOversizedWal() {
545
+ const beforeBytes = this.getWalSizeBytes();
546
+ if (beforeBytes <= exports.WAL_HEAL_THRESHOLD_BYTES) {
547
+ return { healed: false, beforeBytes, afterBytes: beforeBytes };
548
+ }
549
+ // Single-flight: open() fires this fire-and-forget and callers may also
550
+ // invoke it explicitly. Two concurrent passes DEFEAT each other — each
551
+ // checkpoint worker sees the other as a busy reader and no-ops — so share
552
+ // one in-flight pass instead of racing.
553
+ this.walHeal ??= this.runWalHeal(beforeBytes).finally(() => { this.walHeal = null; });
554
+ return this.walHeal;
555
+ }
556
+ walHeal = null;
557
+ async runWalHeal(beforeBytes) {
558
+ // A racing reader/writer (another session healing the same file, a query
559
+ // pool warming up) degrades a checkpoint pass to a busy no-op — retry a
560
+ // few times before leaving the rest to the next open.
561
+ for (let attempt = 0; attempt < 3; attempt++) {
562
+ if (attempt > 0)
563
+ await new Promise((r) => setTimeout(r, 300));
564
+ await this.checkpointWalPassive();
565
+ await this.checkpointWalTruncate();
566
+ if (this.getWalSizeBytes() <= exports.WAL_HEAL_THRESHOLD_BYTES)
567
+ break;
568
+ }
569
+ const afterBytes = this.getWalSizeBytes();
570
+ if (process.env.LATTICE_SENSOR_WAL_VALVE_DEBUG) {
571
+ console.error(`[wal-heal] oversized WAL at open: ${Math.round(beforeBytes / (1024 * 1024))}MB -> ${Math.round(afterBytes / (1024 * 1024))}MB`);
572
+ }
573
+ return { healed: afterBytes < beforeBytes, beforeBytes, afterBytes };
574
+ }
575
+ async checkpointWal(mode) {
359
576
  if (!this.dbPath || this.dbPath === ':memory:') {
360
577
  try {
361
- const row = this.db.prepare('PRAGMA wal_checkpoint(PASSIVE)').get();
578
+ const row = this.db.prepare(`PRAGMA wal_checkpoint(${mode})`).get();
362
579
  return row ? { busy: Number(row.busy), log: Number(row.log), checkpointed: Number(row.checkpointed) } : null;
363
580
  }
364
581
  catch {
@@ -370,13 +587,18 @@ class DatabaseConnection {
370
587
  const workerSource = `
371
588
  const { workerData, parentPort } = require('node:worker_threads');
372
589
  let row = null;
590
+ let err = null;
373
591
  try {
374
592
  const { DatabaseSync } = require('node:sqlite');
375
593
  const db = new DatabaseSync(workerData.dbPath);
376
- try { row = db.prepare('PRAGMA wal_checkpoint(PASSIVE)').get(); } catch {}
594
+ const mode = workerData.mode === 'TRUNCATE' ? 'TRUNCATE' : 'PASSIVE';
595
+ try {
596
+ if (mode === 'TRUNCATE') db.exec('PRAGMA busy_timeout = 2000');
597
+ row = db.prepare('PRAGMA wal_checkpoint(' + mode + ')').get();
598
+ } catch (e) { err = String(e && e.message || e); }
377
599
  try { db.close(); } catch {}
378
- } catch {}
379
- parentPort.postMessage({ row });
600
+ } catch (e) { err = err || String(e && e.message || e); }
601
+ parentPort.postMessage({ row, err });
380
602
  `;
381
603
  return await new Promise((resolve) => {
382
604
  let settled = false;
@@ -387,8 +609,14 @@ class DatabaseConnection {
387
609
  resolve(row ? { busy: Number(row.busy), log: Number(row.log), checkpointed: Number(row.checkpointed) } : null);
388
610
  };
389
611
  try {
390
- const worker = new Worker(workerSource, { eval: true, workerData: { dbPath: this.dbPath } });
391
- worker.once('message', (m) => { void worker.terminate(); finish(m?.row ?? null); });
612
+ const worker = new Worker(workerSource, { eval: true, workerData: { dbPath: this.dbPath, mode } });
613
+ worker.once('message', (m) => {
614
+ if (m?.err && process.env.LATTICE_SENSOR_WAL_VALVE_DEBUG) {
615
+ console.error(`[wal-valve] checkpoint worker (${mode}): ${m.err}`);
616
+ }
617
+ void worker.terminate();
618
+ finish(m?.row ?? null);
619
+ });
392
620
  worker.once('error', () => { void worker.terminate(); finish(null); });
393
621
  worker.once('exit', () => finish(null));
394
622
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
@@ -142,7 +142,7 @@ const migrations = [
142
142
  },
143
143
  {
144
144
  version: 12,
145
- description: 'files.extraction_version — EXTRACTION_VERSION of the engine that wrote each row (DEFAULT 0 = pre-stamp). Sync re-extracts rows whose stamp differs from the running engine, so extractor upgrades heal incrementally instead of relying on a manual full re-index that the status hint merely recommends',
145
+ description: 'files.extraction_version — EXTRACTION_VERSION of the engine that wrote each row (DEFAULT 0 = pre-stamp). Sync re-extracts rows whose stamp is BELOW the running engine, so extractor upgrades heal incrementally instead of relying on a manual full re-index that the status hint merely recommends. Rows stamped above the running engine are left untouched: rewriting them would downgrade the index',
146
146
  up: (db) => {
147
147
  const cols = db.prepare('PRAGMA table_info(files)').all();
148
148
  if (!cols.some((c) => c.name === 'extraction_version')) {