yotamleo and Claude
bc45e1cf8b
fix(dedup): merge cross-file entity nodes typed by their file's extension ( #296 )
...
Per-file extraction over a note vault mints one node per mention of the same
person or project, and they never merge. Normalization is not the problem:
`_norm` already casefolds and collapses `[\W_]+`, so `@cyrilXBT`, `@cyrilxbt`
and `cyrilXBT` land in the same Pass 1 bucket. The bucket is then dropped,
because the cross-file union added in #2182 is gated to
`file_type == "concept"` — and an entity the extractor pulls out of a `.md`
note inherits `document` from the file's extension, not from anything about
the entity.
#1284 's reasoning for that gate is right about files: two `README.md` in
different folders are two documents. It does not follow for a node that merely
lives in a document. This widens the Pass 1 cross-file residue to
`document`/`rationale` nodes that are provably not part of their file's own
structure, via a new `_provably_not_file_structure`:
* not the file's own node — reusing `_id_prefixes`, which already enumerates
the ID a node standing for `source_file` would carry in every spelling a
stored path may take;
* not one of the file's sections — `node_kind: "heading"`, and `"page"` for
the file node the markdown extractor labels outright.
A node that cannot be checked (no ID, no provenance) answers False and stays
blocked, so the predicate can only narrow what the gate treats as
file-anchored, never widen it on a guess.
Deliberately unchanged: the entropy and provenance guards, `code` (#1205 ),
`image`/`paper` shared basenames, and Pass 2's fuzzy
`_crossfile_fileanchored_blocked` — so #1284 's near-identical boilerplate and
#3094 's repeated `## Decisions` sections stay per-file, both now covered by
tests.
Co-Authored-By: Claude <noreply@anthropic.com >
2026-08-30 18:30:46 +02:00
..
2026-08-30 15:14:33 +01:00
2026-07-15 15:09:17 +01:00
2026-08-12 20:56:28 +01:00
2026-08-15 17:16:53 +01:00
2026-07-05 11:41:18 +01:00
2026-07-11 11:52:12 +01:00
2026-07-30 17:13:48 +01:00
2026-08-13 14:17:41 +01:00
2026-08-12 20:57:39 +01:00
2026-07-26 11:52:20 +01:00
2026-08-12 20:56:28 +01:00
2026-07-27 10:46:47 +01:00
2026-08-12 14:20:21 +01:00
2026-08-25 18:06:46 +01:00
2026-08-06 17:29:18 +01:00
2026-08-29 18:42:15 +01:00
2026-07-08 12:09:40 +01:00
2026-08-21 19:21:20 +01:00
2026-08-06 17:29:18 +01:00
2026-07-14 13:19:16 +01:00
2026-08-28 01:20:10 +01:00
2026-07-16 23:48:07 +01:00
2026-07-15 13:13:30 +01:00
2026-08-08 23:37:49 +01:00
2026-07-18 19:07:16 +01:00
2026-07-12 23:57:16 +01:00
2026-08-18 22:38:47 +01:00
2026-08-29 19:32:51 +01:00
2026-08-28 01:19:45 +01:00
2026-07-18 19:07:16 +01:00
2026-08-05 22:08:29 +01:00
2026-08-18 16:02:02 +01:00
2026-08-20 15:42:36 +01:00
2026-08-12 20:56:28 +01:00
2026-07-18 12:04:23 +01:00
2026-07-08 01:16:58 +01:00
2026-08-24 14:12:53 +01:00
2026-08-21 16:50:31 +01:00
2026-08-25 15:45:06 +01:00
2026-08-21 16:50:25 +01:00
2026-08-24 13:22:09 +01:00
2026-08-18 18:07:12 +01:00
2026-08-24 14:08:25 +01:00
2026-08-24 13:17:23 +01:00
2026-08-05 01:41:12 +01:00
2026-08-17 15:35:53 +01:00
2026-08-30 18:30:46 +02:00
2026-08-25 15:52:10 +01:00
2026-08-29 18:38:33 +01:00
2026-07-17 00:09:02 +01:00
2026-07-30 17:13:48 +01:00
2026-08-20 16:09:00 +01:00
2026-08-14 14:26:12 +01:00
2026-08-18 22:27:27 +01:00
2026-07-13 10:29:26 +01:00
2026-08-21 19:21:20 +01:00
2026-08-28 01:20:57 +01:00
2026-08-29 18:42:15 +01:00
2026-07-09 13:22:36 +01:00
2026-08-27 20:20:16 +01:00
2026-07-20 16:35:14 +01:00
2026-07-06 16:43:21 +01:00
2026-08-25 18:09:25 +01:00
2026-07-30 17:13:48 +01:00
2026-08-16 18:35:46 +01:00
2026-07-20 15:35:40 +01:00
2026-08-28 01:20:27 +01:00
2026-07-27 10:46:47 +01:00
2026-08-30 15:11:40 +01:00
2026-08-30 15:11:40 +01:00
2026-08-19 14:05:58 +01:00
2026-07-18 19:07:16 +01:00
2026-08-25 18:06:46 +01:00
2026-08-05 22:08:29 +01:00
2026-08-05 22:08:29 +01:00
2026-08-16 18:28:53 +01:00
2026-08-17 19:00:46 +01:00
2026-08-17 15:40:19 +01:00
2026-08-18 22:20:19 +01:00
2026-07-20 11:29:22 +01:00
2026-07-25 22:53:43 +01:00
2026-08-13 14:21:22 +01:00
2026-07-27 10:46:47 +01:00
2026-08-11 15:18:33 +01:00
2026-08-11 16:54:35 +01:00
2026-08-15 16:43:11 +01:00
2026-08-13 13:30:24 +01:00
2026-08-15 20:11:13 +01:00
2026-07-28 09:37:39 +01:00
2026-08-05 01:41:12 +01:00
2026-08-18 16:02:02 +01:00
2026-08-29 16:14:47 +01:00
2026-08-30 15:11:24 +01:00
2026-08-13 14:17:42 +01:00
2026-07-06 16:43:21 +01:00
2026-07-06 16:38:42 +01:00
2026-08-16 18:34:11 +01:00
2026-08-30 15:11:40 +01:00
2026-08-29 18:36:56 +01:00
2026-08-29 16:14:47 +01:00
2026-08-06 17:29:18 +01:00
2026-08-09 23:19:08 +01:00
2026-08-10 18:07:20 +01:00
2026-08-14 14:49:56 +01:00
2026-07-30 17:13:48 +01:00
2026-08-12 14:20:21 +01:00
2026-08-21 16:49:55 +01:00
2026-08-11 15:18:12 +01:00
2026-08-01 12:21:04 +01:00
2026-08-20 16:10:36 +01:00
2026-08-30 15:53:16 +01:00
2026-08-20 15:45:18 +01:00
2026-08-20 15:44:56 +01:00
2026-07-04 22:12:47 +01:00
2026-08-11 16:54:35 +01:00
2026-07-17 10:54:07 +01:00
2026-08-25 18:09:58 +01:00
2026-08-29 19:32:44 +01:00
2026-08-20 16:13:45 +01:00
2026-07-29 17:25:08 +01:00
2026-08-13 14:20:36 +01:00
2026-08-01 11:36:30 +01:00
2026-08-10 18:06:50 +01:00
2026-08-29 16:14:29 +01:00
2026-08-10 18:06:50 +01:00
2026-08-10 18:06:50 +01:00
2026-08-19 14:05:58 +01:00
2026-08-21 19:22:21 +01:00
2026-08-14 21:09:32 +01:00
2026-07-04 22:12:47 +01:00
2026-07-06 12:44:47 +01:00
2026-08-21 16:57:29 +01:00
2026-08-08 23:37:49 +01:00
2026-08-19 14:05:58 +01:00
2026-07-09 00:32:21 +01:00
2026-07-09 00:32:21 +01:00
2026-07-09 01:06:02 +01:00
2026-08-05 22:08:29 +01:00
2026-08-11 14:40:01 +01:00
2026-08-21 16:57:29 +01:00
2026-08-21 16:50:44 +01:00
2026-08-25 15:44:52 +01:00
2026-07-04 21:22:39 +01:00
2026-08-29 16:15:58 +01:00
2026-08-12 14:20:21 +01:00
2026-07-18 12:03:47 +01:00
2026-08-17 15:33:34 +01:00
2026-07-25 22:53:43 +01:00
2026-08-13 13:30:24 +01:00
2026-07-21 21:45:53 +01:00
2026-08-01 11:36:30 +01:00
2026-08-18 22:36:42 +01:00
2026-07-12 10:36:00 +01:00
2026-07-28 09:37:39 +01:00
2026-07-06 16:38:42 +01:00
2026-08-17 15:25:39 +01:00
2026-07-06 12:36:12 +01:00
2026-08-30 15:11:24 +01:00
2026-08-13 13:30:24 +01:00
2026-08-25 18:12:02 +01:00
2026-07-28 09:37:39 +01:00
2026-07-18 19:07:16 +01:00
2026-07-10 20:24:25 +01:00
2026-07-18 19:09:53 +01:00
2026-07-16 23:36:49 +01:00
2026-07-15 15:14:34 +01:00
2026-08-29 18:38:05 +01:00
2026-08-29 18:38:05 +01:00
2026-07-25 22:53:43 +01:00
2026-08-25 18:07:40 +01:00
2026-07-21 14:22:50 +01:00
2026-07-27 10:46:47 +01:00
2026-08-28 01:18:04 +01:00
2026-08-11 14:40:01 +01:00
2026-07-25 15:44:50 +01:00
2026-07-27 10:22:48 +01:00
2026-08-09 23:19:08 +01:00
2026-08-18 16:02:02 +01:00
2026-08-07 22:49:25 +01:00
2026-08-29 16:19:48 +01:00
2026-08-30 15:48:40 +01:00
2026-08-27 20:57:16 +01:00
2026-08-11 15:18:12 +01:00
2026-08-08 23:37:32 +01:00
2026-08-29 16:16:09 +01:00
2026-08-25 15:45:33 +01:00
2026-07-14 23:32:02 +01:00
2026-07-27 10:46:47 +01:00
2026-08-30 15:12:10 +01:00
2026-07-26 11:52:20 +01:00
2026-08-01 11:36:30 +01:00
2026-08-30 15:11:50 +01:00
2026-08-14 14:21:34 +01:00
2026-08-30 15:11:23 +01:00
2026-08-14 14:20:04 +01:00
2026-08-11 14:40:01 +01:00
2026-07-05 10:33:07 +01:00