Requirements-файл может подключать другой список через -r и отдельный файл ограничений через -c, сохраняя общую базу, тестовые инструменты и правила версий раздельными. Дубли не нужны.

Разделите назначение

В base.txt храните рабочие требования, в dev.txt подключайте базу и добавляйте инструменты команды, а constraints.txt оставляйте исключительно для управления границами resolver.

-r base.txt
-c constraints.txt
pytest>=8

Помните про относительные пути

Путь вложенного файла разрешается относительно файла, в котором записана директива. Такая структура одинаково работает из корня проекта и из CI-каталога.

Не смешивайте глобальные флаги

Опции вроде –index-url действуют на весь запуск и должны стоять отдельной строкой, а секреты следует передавать через защищенную конфигурацию без токена в репозитории.

После перестройки файлов создайте пустой venv и установите каждую верхнеуровневую комбинацию, поскольку ошибка во вложенной директиве может не проявиться в давно используемом окружении.

Разницу между списком и ограничением объясняет статья про constraints.txt. Допустимые строки перечислены в формате requirements-файлов.