## 1. Слой метаданных — генерация URL - [x] 1.1 Добавить поле `URL` в структуру `metadata.Candidate` (`internal/metadata/metadata.go`) - [x] 1.2 Заполнять `URL` в `TMDB.Search`: `https://www.themoviedb.org/movie/{id}` (фильм) или `https://www.themoviedb.org/tv/{id}` (сериал) - [x] 1.3 Заполнять `URL` в `TVDB.Search`: `https://www.thetvdb.com/dereferrer/series/{id}` - [x] 1.4 Заполнять `URL` в `TVMaze.Search`: `https://www.tvmaze.com/shows/{id}` (нативный id, не теговый) - [x] 1.5 Обновить тесты клиентов метаданных (tmdb_test.go, tvdb_test.go, tvmaze_test.go) — проверить наличие URL в результатах Search ## 2. БД — хранение URL - [x] 2.1 Создать миграцию `internal/store/migrations/0004_candidate_url.sql` — добавить колонку `url TEXT` в `metadata_candidate` - [x] 2.2 Добавить поле `URL` (`sql.NullString`) в структуру `store.MetadataCandidate` - [x] 2.3 Обновить `CreateCandidates` — сохранять `url` в INSERT - [x] 2.4 Обновить `docs/specs/database.md` — актуализировать ER-схему (колонка `url`) ## 3. Конвертация candidate → store - [x] 3.1 В `worker.toStoreCandidates` пробрасывать `URL` из `metadata.Candidate` в `store.MetadataCandidate` ## 4. HTTP API и шаблон - [x] 4.1 Добавить поле `URL` в `candidateView` (internal/httpapi/review.go) - [x] 4.2 Пробросить `URL` из `store.MetadataCandidate` в `candidateView` при сборе данных ревью - [x] 4.3 В шаблоне `web/templates/review.html` добавить колонку «ссылка» в таблицу кандидатов с `` ## 5. Проверка - [x] 5.1 `task test` — все тесты проходят - [x] 5.2 `task lint` — без ошибок - [x] 5.3 `openspec validate --strict` — валидация спеки