Соединение SQLite на запрос, сравнение токенов в постоянное время,
400 на битый JSON и нечисловые параметры.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Typ5sXWNMFirr2va2uL8o
check_confirmed для ensure_link: связь есть и нет конфликтов (другой тип между теми же задачами
или обратное направление любого типа). check_confirmed для ensure_issue: необязательный reporter,
сужает поиск по теме до задач этого автора. Тесты: конфликты, обратное направление при обоих
ключах в зеркале, давность 7 дней, фильтр по reporter, выбор самой новой из двух.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Typ5sXWNMFirr2va2uL8o
rename_note: при old_key == new_key ранний выход (DELETE раньше стирал единственную заметку);
DELETE и UPDATE выполняются в транзакции.
set_note: чтение, слияние и запись в одной транзакции (соединение общее для потоков).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Typ5sXWNMFirr2va2uL8o
Модуль settings: значения по умолчанию, версия настроек, защищённые ключи,
перенос проектных настроек из config.example.json (учётные данные остаются у агента).
Фикстура tests/fixtures/config.example.json — копия admin/jira-sync/config.example.json.
.pytest_cache/ добавлен в .gitignore.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014Typ5sXWNMFirr2va2uL8o