(high) migrate_kg_to_obsidian.py extract_date/_DATE_PATTERNS: ведущий \b перед месяцем срывает извлечение даты у entity с разделителем '_' #1491

Closed
opened 2026-06-15 05:58:39 +00:00 by bot-backend · 1 comment
Collaborator

Severity: high · Категория: parsing · Файл: scripts/migrate_kg_to_obsidian.py:85-116

migrate_kg_to_obsidian.py:85-116 (шаблоны 87,89,91,93). Все date-паттерны начинаются с \b непосредственно перед токеном месяца/квартала. В именах entity месяц почти всегда следует за '' (Session_End_Apr30_2026, Cad_Quarter_Backfill_Apr30). Поскольку '' принадлежит классу \w, граница слова \b между '' и буквой не возникает, и pat.search() не находит совпадения → extract_date() возвращает None для всех таких имён (проверено: 'Backfill_Apr30'→None, 'Apr30'→2026-04-30). Импакт: у заметок нет поля date во frontmatter (строки 328-329) и ломается хроносортировка MOC (см. находку 519-528). Починка: убрать ведущий \b и допускать разделитель перед месяцем, напр. (?:^|[- ]) или (?<![A-Za-z]) lookbehind вместо \b; завершающий \b после числа года/дня можно оставить или заменить на (?![\dA-Za-z]).

Почему баг: Прогнал реальные имена: extract_date('Cad_Quarter_Backfill_Apr30') -> None, extract_date('Session_End_Apr30_2026') -> None, extract_date('Apr30') -> 2026-04-30. Тест с границами: 'Apr30' p2=False, ' Apr30' p2=True, '-Apr30' p2=True — то есть именно префикс '' (а это основной разделитель в именах) ломает \b. На полном KG: 142/142 датированных entity дают None.

Как чинить: Убрать ведущий \b (он не нужен, т.к. слева обычно '_'/начало) либо заменить на (?:^|[^A-Za-z]) / lookbehind (?<![A-Za-z]). Напр.: re.compile(r"(?<![A-Za-z])(?PJan|...|Dec)(?P\d{1,2})(?![0-9])(?!_20)", re.IGNORECASE). После фикса перепроверить, что Nov2025 по-прежнему идёт в pattern 3, а не в pattern 2.


deep-audit «армия ботов 2» · verify+harden, confidence 0.97 · unit U111

**Severity:** high · **Категория:** parsing · **Файл:** `scripts/migrate_kg_to_obsidian.py:85-116` migrate_kg_to_obsidian.py:85-116 (шаблоны 87,89,91,93). Все date-паттерны начинаются с \b непосредственно перед токеном месяца/квартала. В именах entity месяц почти всегда следует за '_' (Session_End_Apr30_2026, Cad_Quarter_Backfill_Apr30). Поскольку '_' принадлежит классу \w, граница слова \b между '_' и буквой не возникает, и pat.search() не находит совпадения → extract_date() возвращает None для всех таких имён (проверено: 'Backfill_Apr30'→None, 'Apr30'→2026-04-30). Импакт: у заметок нет поля date во frontmatter (строки 328-329) и ломается хроносортировка MOC (см. находку 519-528). Починка: убрать ведущий \b и допускать разделитель перед месяцем, напр. (?:^|[_\- ]) или (?<![A-Za-z]) lookbehind вместо \b; завершающий \b после числа года/дня можно оставить или заменить на (?![\dA-Za-z]). **Почему баг:** Прогнал реальные имена: extract_date('Cad_Quarter_Backfill_Apr30') -> None, extract_date('Session_End_Apr30_2026') -> None, extract_date('Apr30') -> 2026-04-30. Тест с границами: '_Apr30' p2=False, ' Apr30' p2=True, '-Apr30' p2=True — то есть именно префикс '_' (а это основной разделитель в именах) ломает \b. На полном KG: 142/142 датированных entity дают None. **Как чинить:** Убрать ведущий \b (он не нужен, т.к. слева обычно '_'/начало) либо заменить на (?:^|[^A-Za-z]) / lookbehind (?<![A-Za-z]). Напр.: re.compile(r"(?<![A-Za-z])(?P<m>Jan|...|Dec)(?P<d>\d{1,2})(?![0-9])(?!_20)", re.IGNORECASE). После фикса перепроверить, что Nov2025 по-прежнему идёт в pattern 3, а не в pattern 2. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.97 · unit U111</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:58:39 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:13 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: scripts/migrate_kg_to_obsidian.py:85-94 (_DATE_PATTERNS), :97-116 (extract_date).

Корень: Все month/quarter-паттерны начинаются с ведущего \b прямо перед токеном (:87 \b(?P<m>Jan|...|Dec)(?P<d>\d{1,2})_(?P<y>20\d{2})\b, :89, :91; :93 \bQ(?P<q>...)). В именах entity месяц/квартал почти всегда идёт за _ (Session_End_Apr30_2026, Cad_Quarter_Backfill_Apr30). Поскольку _ принадлежит классу \w, границы слова \b между _ и буквой нет → pat.search() не находит совпадения → extract_date() возвращает None. Это бьёт по frontmatter date (:526) и по хроносортировке MOC (:519-522, см. #1492).

Что править:

  • Убрать ведущий \b (он избыточен — слева обычно _/начало) либо заменить на lookbehind (?<![A-Za-z]) / (?:^|[_\- ]). Завершающий \b после года/дня заменить на (?![0-9A-Za-z]).
  • Пример для pat2: re.compile(r"(?<![A-Za-z])(?P<m>Jan|...|Dec)(?P<d>\d{1,2})(?![0-9])(?!_20)", re.IGNORECASE).
  • Та же правка нужна для \bQ на :93.

Что посмотреть:

  • Код: migrate_kg_to_obsidian.py:85-116; добавить unit-тесты на extract_date('Cad_Quarter_Backfill_Apr30'), 'Session_End_Apr30_2026', 'Nov2025' (должен идти в pat3, не pat2), 'Q1_2026'.
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `scripts/migrate_kg_to_obsidian.py:85-94` (`_DATE_PATTERNS`), `:97-116` (`extract_date`). **Корень:** Все month/quarter-паттерны начинаются с ведущего `\b` прямо перед токеном (`:87` `\b(?P<m>Jan|...|Dec)(?P<d>\d{1,2})_(?P<y>20\d{2})\b`, `:89`, `:91`; `:93` `\bQ(?P<q>...)`). В именах entity месяц/квартал почти всегда идёт за `_` (`Session_End_Apr30_2026`, `Cad_Quarter_Backfill_Apr30`). Поскольку `_` принадлежит классу `\w`, границы слова `\b` между `_` и буквой нет → `pat.search()` не находит совпадения → `extract_date()` возвращает `None`. Это бьёт по frontmatter `date` (`:526`) и по хроносортировке MOC (`:519-522`, см. #1492). **Что править:** - Убрать ведущий `\b` (он избыточен — слева обычно `_`/начало) либо заменить на lookbehind `(?<![A-Za-z])` / `(?:^|[_\- ])`. Завершающий `\b` после года/дня заменить на `(?![0-9A-Za-z])`. - Пример для pat2: `re.compile(r"(?<![A-Za-z])(?P<m>Jan|...|Dec)(?P<d>\d{1,2})(?![0-9])(?!_20)", re.IGNORECASE)`. - Та же правка нужна для `\bQ` на `:93`. **Что посмотреть:** - Код: `migrate_kg_to_obsidian.py:85-116`; добавить unit-тесты на `extract_date('Cad_Quarter_Backfill_Apr30')`, `'Session_End_Apr30_2026'`, `'Nov2025'` (должен идти в pat3, не pat2), `'Q1_2026'`. - Vault: релевантных заметок не найдено.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1491
No description provided.