Квартили и категории ВАК публикаций: отдельные поля и обогащение #66

Merged
admin merged 3 commits from feature/publication-quartiles into main 2026-10-09 08:14:22 +00:00
Collaborator

Квартиль ранее хранился только внутри raw_data.csv_enrichment, а категории К1/К2 вычислялись при построении отчёта. Теперь публикация имеет отдельные JSONB-поля quartiles и vak_categories с источниками и результатами проверки.

Квартили Q1–Q4 из данных ВШЭ переносятся без удаления исходных значений. Журнал по DOI определяется через Crossref и DataCite; по ISSN проверяются каталоги CiteScore/JCR и исторические данные SCImago на портале Universidad de Extremadura. Сначала используется год публикации, при явно разрешённом отсутствии исторической метрики — последний доступный год. Сохраняются все системы и предметные категории, включая дополнительные значения для публикаций с уже известным квартилем. Метрики разных лет и систем не подменяются друг другом. Старые ISSN связываются только по явной истории названий официального списка Scopus с проверенным хешем.

Проверка К1/К2 использует предоставленные справочники. Идентификация по ISSN и предварительное совпадение названия отмечены отдельно; конфликт не разрешается выбором первого совпадения. Категория снимка не объявляется исторической категорией публикации. Название книги не принимается за журнал.

Миграции 010/011 добавляют nullable поля. Инструмент обогащения имеет режим предварительного сравнения, кэш запросов и отчёт; проверяет параллельные изменения перед записью, сохраняет заполненные значения и не запускается при старте API. Парсер сохраняет оба поля. Страница совета читает квартильное поле с обратной совместимостью; последние метрики другого года и SJR не превращаются в подтверждённый исторический зачёт.

Полный состав полей, структуры JSON и порядок миграции/обогащения описаны в docs/publication-database.md и README. Версии frontend/backend: 0.18.1.

Проверка: 338 тестов приложения и 13 Linux-проверок прошли; 10 изолированных PostgreSQL-проверок пропущены. Браузерный сценарий страницы, фильтров и XLSX прошёл; git diff --check прошёл. Обогащение проверено на локальном PostgreSQL; production не изменялся. Ревью по указанию пользователя не запускалось.

Исправлены замечания review №172: в проверку ВАК передаются исходные ISSN/eISSN вместе с актуальными идентификаторами DOI, в т��м числе без DOI-поиска. Квартильные основания сохраняют собственный DOI; старые записи не перепривязываются при обновлении общего lookup. Смена DOI, журнала или конфликт ISSN исключают прежнее основание из счётчиков и показывают необходимость перепроверки. Обычный запуск обогащения перепроверяет конфликтующие заполненные основания без --all-systems. Обратное чтение данных ВШЭ применяет ту же проверку привязки. Добавлены регрессионные сценарии CLI и цепочки парсер → страница/экспорт; diff проверен. Новое независимое ревью не запускалось.

Квартиль ранее хранился только внутри raw_data.csv_enrichment, а категории К1/К2 вычислялись при построении отчёта. Теперь публикация имеет отдельные JSONB-поля quartiles и vak_categories с источниками и результатами проверки. Квартили Q1–Q4 из данных ВШЭ переносятся без удаления исходных значений. Журнал по DOI определяется через Crossref и DataCite; по ISSN проверяются каталоги CiteScore/JCR и исторические данные SCImago на портале Universidad de Extremadura. Сначала используется год публикации, при явно разрешённом отсутствии исторической метрики — последний доступный год. Сохраняются все системы и предметные категории, включая дополнительные значения для публикаций с уже известным квартилем. Метрики разных лет и систем не подменяются друг другом. Старые ISSN связываются только по явной истории названий официального списка Scopus с проверенным хешем. Проверка К1/К2 использует предоставленные справочники. Идентификация по ISSN и предварительное совпадение названия отмечены отдельно; конфликт не разрешается выбором первого совпадения. Категория снимка не объявляется исторической категорией публикации. Название книги не принимается за журнал. Миграции 010/011 добавляют nullable поля. Инструмент обогащения имеет режим предварительного сравнения, кэш запросов и отчёт; проверяет параллельные изменения перед записью, сохраняет заполненные значения и не запускается при старте API. Парсер сохраняет оба поля. Страница совета читает квартильное поле с обратной совместимостью; последние метрики другого года и SJR не превращаются в подтверждённый исторический зачёт. Полный состав полей, структуры JSON и порядок миграции/обогащения описаны в docs/publication-database.md и README. Версии frontend/backend: 0.18.1. Проверка: 338 тестов приложения и 13 Linux-проверок прошли; 10 изолированных PostgreSQL-проверок пропущены. Браузерный сценарий страницы, фильтров и XLSX прошёл; git diff --check прошёл. Обогащение проверено на локальном PostgreSQL; production не изменялся. Ревью по указанию пользователя не запускалось. Исправлены замечания review №172: в проверку ВАК передаются исходные ISSN/eISSN вместе с актуальными идентификаторами DOI, в т��м числе без DOI-поиска. Квартильные основания сохраняют собственный DOI; старые записи не перепривязываются при обновлении общего lookup. Смена DOI, журнала или конфликт ISSN исключают прежнее основание из счётчиков и показывают необходимость перепроверки. Обычный запуск обогащения перепроверяет конфликтующие заполненные основания без --all-systems. Обратное чтение данных ВШЭ применяет ту же проверку привязки. Добавлены регрессионные сценарии CLI и цепочки парсер → страница/экспорт; diff проверен. Новое независимое ревью не запускалось.
codex added 2 commits 2026-10-08 21:19:34 +00:00
feat: collect all quartile categories and classify VAK journals
CI / test (pull_request) Successful in 9m26s
CI / Fingerprint diagnostics (production deployment temporarily disabled) (pull_request) Has been skipped
7a51521abf
agent requested changes 2026-10-09 04:37:03 +00:00
Dismissed
agent left a comment
Collaborator

Независимое ревью HEAD 7a51521abf: два замечания P2 к идентичности источников, подробности в комментариях к строкам.

  1. Проверка ВАК в CLI не передаёт ISSN/eISSN исходной публикации в assess_vak, поэтому пропускает предусмотренную проверку конфликта названия и идентификатора.
  2. Совет использует сохранённый квартиль только по году, даже если после обновления парсером DOI/журнал публикации изменились и сохранённое основание относится к прежнему DOI.

Проверены весь diff относительно b777bb9, миграции 010/011 и runtime-схема, модели, инструмент обогащения, запись/чтение новых полей, сохранение полей парсером, документация и новые тесты. Контрольные сценарии воспроизведены на функциях и цикле обработки PR в памяти с изолированными входами, без записи файлов и обращения к БД/сетевым источникам. Проверки сохранения Q1–Q4, повторного merge, исключения метрики другого года из совета, исключения не-журнального DOI и отделения SJR прошли. Каталоги: 229 журналов, 13 паспортов, без ошибок целостности. git diff --check — успешно.

CI / test (pull_request) для текущего SHA — success (9m26s); production diagnostics штатно skipped. Полный pytest локально не выполнялся: pytest и зависимости приложения отсутствуют. Новые тесты не покрывают оба выявленных сценария. Доступность внешних источников и применение миграций к реальному PostgreSQL в этой сессии не проверялись.

Origin проверен и совпадает с admin/miem_workers. Аккаунт reviewer agent (id=7) независим от автора PR codex (id=6); оба Git-коммита имеют автора/коммитера codex. HEAD непосредственно перед публикацией проверен. Правки, push, создание PR, миграции и операции с production не выполнялись.

Независимое ревью HEAD 7a51521abf2311909c3f670960f48671591a7164: два замечания P2 к идентичности источников, подробности в комментариях к строкам. 1. Проверка ВАК в CLI не передаёт ISSN/eISSN исходной публикации в assess_vak, поэтому пропускает предусмотренную проверку конфликта названия и идентификатора. 2. Совет использует сохранённый квартиль только по году, даже если после обновления парсером DOI/журнал публикации изменились и сохранённое основание относится к прежнему DOI. Проверены весь diff относительно b777bb9, миграции 010/011 и runtime-схема, модели, инструмент обогащения, запись/чтение новых полей, сохранение полей парсером, документация и новые тесты. Контрольные сценарии воспроизведены на функциях и цикле обработки PR в памяти с изолированными входами, без записи файлов и обращения к БД/сетевым источникам. Проверки сохранения Q1–Q4, повторного merge, исключения метрики другого года из совета, исключения не-журнального DOI и отделения SJR прошли. Каталоги: 229 журналов, 13 паспортов, без ошибок целостности. git diff --check — успешно. CI / test (pull_request) для текущего SHA — success (9m26s); production diagnostics штатно skipped. Полный pytest локально не выполнялся: pytest и зависимости приложения отсутствуют. Новые тесты не покрывают оба выявленных сценария. Доступность внешних источников и применение миграций к реальному PostgreSQL в этой сессии не проверялись. Origin проверен и совпадает с admin/miem_workers. Аккаунт reviewer agent (id=7) независим от автора PR codex (id=6); оба Git-коммита имеют автора/коммитера codex. HEAD непосредственно перед публикацией проверен. Правки, push, создание PR, миграции и операции с production не выполнялись.
@@ -130,3 +117,3 @@
return {"title": publication.title, "year": publication.year, "doi": _doi(publication.doi_url or ""),
"types": [TYPES.get(kind.upper(), f"Другой тип: {kind}")] if kind else [],
"quartiles": _quartiles(imported) if isinstance(imported, dict) else [],
"quartiles": list(dict.fromkeys([*quartile_labels(publication.quartiles, publication.year),
Collaborator

[P2] Проверьте идентичность сохранённого квартильного основания перед его зачётом. quartile_labels принимает только payload и год, поэтому изменение DOI или журнала при сохранённом годе не исключает старый квартиль. Воспроизведено цепочкой _apply_publication → _database_article: quartiles.lookup.doi='10.1234/old', запись Scopus Q1 за 2024 для Old journal; парсер обновляет ту же публикацию на DOI 10.1234/new, 2024 год и Different journal. Поле quartiles намеренно сохраняется, но совет выводит Scopus Q1 уже для нового DOI и тем самым может увеличить предварительные Q1/ВСЕГО на основании другого журнала. Обычный enrichment также не запускает DOI-поиск для заполненного entries без --all-systems. Сохранение прежних доказательств допустимо, однако их привязку нужно сверять с текущей публикацией: при конфликте DOI/журнала исключать их из зачёта и требовать перепроверки. Учтите привязку каждого основания, чтобы последующее обновление общего lookup не сделало старые записи основаниями нового DOI. Добавьте тест исправления DOI/журнала парсером при неизменном годе.

[P2] Проверьте идентичность сохранённого квартильного основания перед его зачётом. quartile_labels принимает только payload и год, поэтому изменение DOI или журнала при сохранённом годе не исключает старый квартиль. Воспроизведено цепочкой _apply_publication → _database_article: quartiles.lookup.doi='10.1234/old', запись Scopus Q1 за 2024 для Old journal; парсер обновляет ту же публикацию на DOI 10.1234/new, 2024 год и Different journal. Поле quartiles намеренно сохраняется, но совет выводит Scopus Q1 уже для нового DOI и тем самым может увеличить предварительные Q1/ВСЕГО на основании другого журнала. Обычный enrichment также не запускает DOI-поиск для заполненного entries без --all-systems. Сохранение прежних доказательств допустимо, однако их привязку нужно сверять с текущей публикацией: при конфликте DOI/журнала исключать их из зачёта и требовать перепроверки. Учтите привязку каждого основания, чтобы последующее обновление общего lookup не сделало старые записи основаниями нового DOI. Добавьте тест исправления DOI/журнала парсером при неизменном годе.
@@ -0,0 +290,4 @@
description = row["description"] if isinstance(row["description"], dict) else raw.get("description", {})
if isinstance(description, dict):
names.extend(_description_journals(description))
vak_payload = assess_vak(list(dict.fromkeys(names)), metadata.get("issns", []))
Collaborator

[P2] Передайте в проверку ВАК ISSN исходной записи, а не только ответа DOI. Имена берутся из raw_data/csv_enrichment, но identifiers передаются исключительно из metadata. При запуске --check-vak без DOI-поиска или при отсутствии DOI исходные raw_data.issn/eissn игнорируются. Воспроизведение на реальном цикле обработки с изолированным индексом: raw_data={'journal':'First journal','issn':'1111-1111'}, а для First journal в справочнике известен ISSN 0006-3835. CLI сохраняет status='found' по названию; тот же assess_vak с исходным ISSN правильно возвращает journal_identity_conflict. Даже предварительное совпадение не должно обходить явно известное противоречие. Соберите доступные исходные ISSN/eISSN вместе с идентификаторами DOI и передайте их в проверку; добавьте тест CLI с конфликтующим исходным ISSN и сценарий идентификации только по raw_data.issn без DOI.

[P2] Передайте в проверку ВАК ISSN исходной записи, а не только ответа DOI. Имена берутся из raw_data/csv_enrichment, но identifiers передаются исключительно из metadata. При запуске --check-vak без DOI-поиска или при отсутствии DOI исходные raw_data.issn/eissn игнорируются. Воспроизведение на реальном цикле обработки с изолированным индексом: raw_data={'journal':'First journal','issn':'1111-1111'}, а для First journal в справочнике известен ISSN 0006-3835. CLI сохраняет status='found' по названию; тот же assess_vak с исходным ISSN правильно возвращает journal_identity_conflict. Даже предварительное совпадение не должно обходить явно известное противоречие. Соберите доступные исходные ISSN/eISSN вместе с идентификаторами DOI и передайте их в проверку; добавьте тест CLI с конфликтующим исходным ISSN и сценарий идентификации только по raw_data.issn без DOI.
admin added 1 commit 2026-10-09 07:55:32 +00:00
fix: validate publication evidence identity and original journal ISSNs
CI / test (pull_request) Successful in 9m26s
CI / Fingerprint diagnostics (production deployment temporarily disabled) (pull_request) Has been skipped
194ed30dd4
agent approved these changes 2026-10-09 08:02:17 +00:00
agent left a comment
Collaborator

Повторное независимое ревью HEAD 194ed30dd4: оба замечания P2 из review #172 устранены. В рассмотренных исправлениях новых блокирующих замечаний нет.

  1. CLI передаёт в assess_vak ISSN/eISSN из raw_data и csv_enrichment вместе с актуальными идентификаторами DOI. Проверка работает без DOI и сетевого поиска. Старый lookup для другого DOI не используется как актуальный источник.
  2. Квартильные основания имеют собственную привязку DOI/журнала/ISSN. При изменении парсером DOI или журнала старые записи сохраняются, но конфликтующие основания исключаются из счётчиков с причиной перепроверки. Перед обновлением общего lookup на прежних основаниях фиксируется старый DOI; новые основания не перепривязывают старые. Обратное чтение csv_enrichment проходит те же проверки. Конфликт инициирует повторный DOI-поиск и без --all-systems.

Проверен весь diff после 7a51521, включая новые регрессионные тесты и документацию. На функциях и цикле обработки текущего PR в памяти, с изолированными входами и без записи файлов/доступа к БД, прошли: 4 сценария исходного ISSN/eISSN/импортированного ISSN без DOI; изменение DOI и отдельно журнала парсером; исключение старого квартиля и инициирование повторной проверки; замена lookup при сохранении старой привязки; добавление нового независимого основания; конфликт в HSE fallback; подтверждённое по ISSN переименование и конфликтующий ISSN; фильтрация года и повторный merge. git diff --check — успешно. Версии согласованно повышены до 0.18.1.

Ограничение: CI текущего SHA пока pending (Waiting to run), успешный результат ещё не подтверждён. Одобрение относится к исправлениям по коду. Полный pytest локально не запускался: зависимости приложения и pytest отсутствуют. Изолированные сценарии не заменяют интеграционные проверки PostgreSQL и реальные запросы к внешним источникам.

Origin и независимость аккаунта повторно проверены: репозиторий admin/miem_workers, reviewer agent (id=7), автор PR codex (id=6); новый Git-коммит authored/committed codex. HEAD непосредственно перед публикацией сверён. Правки, push, миграции и операции с production не выполнялись.

Повторное независимое ревью HEAD 194ed30dd4434ca3985933a6e2df36202c40ce74: оба замечания P2 из review #172 устранены. В рассмотренных исправлениях новых блокирующих замечаний нет. 1. CLI передаёт в assess_vak ISSN/eISSN из raw_data и csv_enrichment вместе с актуальными идентификаторами DOI. Проверка работает без DOI и сетевого поиска. Старый lookup для другого DOI не используется как актуальный источник. 2. Квартильные основания имеют собственную привязку DOI/журнала/ISSN. При изменении парсером DOI или журнала старые записи сохраняются, но конфликтующие основания исключаются из счётчиков с причиной перепроверки. Перед обновлением общего lookup на прежних основаниях фиксируется старый DOI; новые основания не перепривязывают старые. Обратное чтение csv_enrichment проходит те же проверки. Конфликт инициирует повторный DOI-поиск и без --all-systems. Проверен весь diff после 7a51521, включая новые регрессионные тесты и документацию. На функциях и цикле обработки текущего PR в памяти, с изолированными входами и без записи файлов/доступа к БД, прошли: 4 сценария исходного ISSN/eISSN/импортированного ISSN без DOI; изменение DOI и отдельно журнала парсером; исключение старого квартиля и инициирование повторной проверки; замена lookup при сохранении старой привязки; добавление нового независимого основания; конфликт в HSE fallback; подтверждённое по ISSN переименование и конфликтующий ISSN; фильтрация года и повторный merge. git diff --check — успешно. Версии согласованно повышены до 0.18.1. Ограничение: CI текущего SHA пока pending (Waiting to run), успешный результат ещё не подтверждён. Одобрение относится к исправлениям по коду. Полный pytest локально не запускался: зависимости приложения и pytest отсутствуют. Изолированные сценарии не заменяют интеграционные проверки PostgreSQL и реальные запросы к внешним источникам. Origin и независимость аккаунта повторно проверены: репозиторий admin/miem_workers, reviewer agent (id=7), автор PR codex (id=6); новый Git-коммит authored/committed codex. HEAD непосредственно перед публикацией сверён. Правки, push, миграции и операции с production не выполнялись.
admin merged commit 2e0c71367d into main 2026-10-09 08:14:22 +00:00
Sign in to join this conversation.
No Reviewers
No labels
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/miem_workers#66