{ "acceptance_criteria": [ { "id": "AC-001", "source": "product-manager", "text": "AC-001 Для заданной темы утилита возвращает машиночитаемый список результатов, в каждом элементе есть URL, формат и фактические размеры; успешный поиск, отсутствие подходящих изображений и сбой различимы по коду завершения и структуре вывода.", "verifies": [] }, { "id": "AC-002", "source": "product-manager", "text": "AC-002 Поиск успешно выполняется в окружении, где не задано ни одного API-ключа или учётных данных.", "verifies": [] }, { "id": "AC-003", "source": "product-manager", "text": "AC-003 Указание источника в параметрах приводит к использованию соответствующего источника, и использованный источник явно отражён в выводе; неизвестный источник даёт явную ошибку с перечнем доступных источников.", "verifies": [] }, { "id": "AC-004", "source": "product-manager", "text": "AC-004 Запрос формата png возвращает только реальные png-файлы; запрос ico при отсутствии ico у источника даёт явное сообщение о том, что изображений такого формата нет, и это сообщение отличимо от сообщения об ошибке доступа к источнику.", "verifies": [] }, { "id": "AC-005", "source": "product-manager", "text": "AC-005 При запросе желаемого размера в выдаче присутствуют только изображения, размер которых не меньше желаемого по обоим измерениям, и для каждого указаны фактические размеры.", "verifies": [] }, { "id": "AC-006", "source": "product-manager", "text": "AC-006 Если по теме у источника есть только изображения меньше желаемого размера, вывод содержит явное сообщение, что подходящих по размеру нет, и это сообщение отличимо от сообщения об отсутствии формата и от ошибки доступа.", "verifies": [] }, { "id": "AC-007", "source": "product-manager", "text": "AC-007 При указании флага скачивания файлы физически сохранены в заданном каталоге, пути в выводе соответствуют существующим файлам, и файлы открываются как изображения заявленного формата.", "verifies": [] }, { "id": "AC-008", "source": "product-manager", "text": "AC-008 При наличии флага масштабирования изображение, найденное в размере больше желаемого, сохраняется с размерами, равными желаемым; без этого флага фактические размеры сохранённого файла совпадают с исходными.", "verifies": [] }, { "id": "AC-009", "source": "product-manager", "text": "AC-009 Утилита запускается как обычный исполняемый процесс без Docker и без контейнерной обвязки.", "verifies": [] }, { "id": "AC-010", "source": "product-manager", "text": "AC-010 Реальная проверка на известном результате: запрос по теме, для которой у выбранного источника заведомо есть изображения, возвращает непустой список с рабочими ссылками на файлы (проверка на живом источнике, а не только на синтетических данных).", "verifies": [] }, { "id": "AC-011", "source": "product-manager", "text": "AC-011 При запрещённом сетевом доступе к источнику утилита завершается явной ошибкой доступа и не выдаёт результат, выглядящий как успешный поиск.", "verifies": [] } ], "artifacts": [], "delivery_requirements": [ { "kind": "native_process", "requirement_ids": [ "REQ-011" ] } ], "external_inputs": [], "out_of_scope": [ { "id": "OOS-001", "text": "Генерация изображений и любые операции редактирования, кроме уменьшения до желаемого размера" }, { "id": "OOS-002", "text": "Форматы изображений вне начального набора png/ico" }, { "id": "OOS-003", "text": "Платные и требующие API-ключей источники изображений" }, { "id": "OOS-004", "text": "Запуск в Docker/контейнерах" }, { "id": "OOS-005", "text": "Графический интерфейс пользователя" } ], "readiness": "ready_for_architecture", "requirements": [ { "id": "REQ-001", "priority": "must", "source": "product-manager", "text": "REQ-001 Утилита является консольным приложением, запускаемым как обычный исполняемый процесс; параметры запуска задают тему поиска, желаемый размер, формат, источник, флаг скачивания и флаг масштабирования." }, { "id": "REQ-002", "priority": "must", "source": "product-manager", "text": "REQ-002 Результат работы выводится в машиночитаемом структурированном виде, пригодном для tool calling ИИ-агентом: перечень найденных изображений с источником, URL, форматом и фактическими размерами, а также однозначное различие между успехом, отсутствием подходящих изображений и ошибкой." }, { "id": "REQ-003", "priority": "must", "source": "product-manager", "text": "REQ-003 Доступ к источникам бесплатный, без API-ключей, регистрации и иных учётных данных; поиск выполняется без настройки секретов." }, { "id": "REQ-004", "priority": "must", "source": "product-manager", "text": "REQ-004 Источник изображений выбирается вызывающей стороной через параметр; схема допускает подключение нескольких источников, и в поставку входит как минимум один рабочий бесплатный источник; неизвестный источник даёт явную ошибку с перечнем доступных источников." }, { "id": "REQ-005", "priority": "must", "source": "product-manager", "text": "REQ-005 Поиск выполняется по теме (текстовому запросу), задаваемой вызывающей стороной; количество возвращаемых результатов может быть ограничено вызывающей стороной." }, { "id": "REQ-006", "priority": "must", "source": "product-manager", "text": "REQ-006 Вызывающая сторона задаёт желаемый размер изображения (ширина/высота); в результатах по каждому изображению указываются его фактические размеры." }, { "id": "REQ-007", "priority": "must", "source": "product-manager", "text": "REQ-007 Формат изображения выбирается из начального набора png и ico; возвращаются только файлы запрошенного формата, а при отсутствии таких изображений у источника выдаётся явное сообщение, что изображений такого формата нет, отличимое от ошибки доступа к источнику." }, { "id": "REQ-008", "priority": "must", "source": "product-manager", "text": "REQ-008 Возвращаются только изображения, размер которых не меньше желаемого по обоим измерениям; если у источника по теме нет изображений подходящего размера, выдаётся явное сообщение, что подходящих по размеру нет, отличимое от сообщения об отсутствии формата и от ошибки доступа." }, { "id": "REQ-009", "priority": "must", "source": "product-manager", "text": "REQ-009 По флагу скачивания найденные изображения сохраняются в каталог, указанный вызывающей стороной, а в результате сообщаются пути сохранённых файлов." }, { "id": "REQ-010", "priority": "must", "source": "product-manager", "text": "REQ-010 При наличии флага масштабирования изображения, доступные только в размере больше желаемого, уменьшаются до желаемого размера; без этого флага изображения сохраняются без изменения размеров." }, { "id": "REQ-011", "priority": "must", "source": "product-manager", "text": "REQ-011 Утилита поставляется и запускается как обычный исполняемый процесс, без Docker и контейнеров." } ], "schema": "agent.product_contract.v1", "summary": "Нужно консольное приложение (CLI), запускаемое как обычный исполняемый процесс, которое по заданной теме находит изображения в бесплатных источниках и по флагу скачивает их. Инструмент предназначен для вызова ИИ-агентом через tool calling, поэтому результат должен быть машиночитаемым и однозначно различать успех, отсутствие подходящих изображений и ошибку. Доступ бесплатный, без API-ключей и регистрации. Источник не принципиален, но выбирается вызывающей стороной, схема допускает несколько подключаемых источников, и в поставку входит как минимум один рабочий бесплатный источник. Задаются тема, желаемый размер и формат из начального набора png/ico. Возвращаются только изображения запрошенного формата, не меньшие желаемого размера; если таких форматов нет — явное сообщение, что изображений такого формата нет; если подходящих по размеру нет — явное сообщение, что подходящих по размеру нет. При наличии флага масштабирования изображения больше желаемого размера уменьшаются до желаемого. Запуск — как обычный процесс, без Docker. Сетевой доступ к бесплатным источникам согласован пользователем вне этого обсуждения (Wikimedia Commons и Openverse, HTTPS 443, включая поддомены).", "title": "Консольная утилита поиска и скачивания изображений для вызова ИИ-агентом", "unknowns": [ { "id": "UNK-001", "text": "Какой именно бесплатный источник реализуется первым и покрывает ли его API фильтрацию по размеру/формату или фильтрация выполняется на стороне клиента (влияет на объём загружаемых данных)" }, { "id": "UNK-002", "text": "Практическая доступность файлов формата ico у бесплатных источников: ожидаемо такие запросы будут часто возвращать сообщение об отсутствии формата" }, { "id": "UNK-003", "text": "Ограничения частоты запросов и требования к идентификации клиента (user agent) у выбранного бесплатного источника" }, { "id": "UNK-004", "text": "Каталог сохранения по умолчанию, если вызывающая сторона не задала его явно" }, { "id": "UNK-005", "text": "Как сообщать частичный успех скачивания, когда часть файлов сохранилась, а часть нет" } ], "verification_obligations": [ { "acceptance_criterion_ids": [ "AC-001" ], "id": "VO-001", "proof_class": "behavior_execution", "requirement_ids": [ "REQ-001", "REQ-002" ] }, { "acceptance_criterion_ids": [ "AC-002", "AC-010" ], "id": "VO-002", "proof_class": "integration_check", "requirement_ids": [ "REQ-003" ] }, { "acceptance_criterion_ids": [ "AC-003" ], "id": "VO-003", "proof_class": "behavior_execution", "requirement_ids": [ "REQ-004" ] }, { "acceptance_criterion_ids": [ "AC-004" ], "id": "VO-004", "proof_class": "behavior_execution", "requirement_ids": [ "REQ-005", "REQ-006", "REQ-007" ] }, { "acceptance_criterion_ids": [ "AC-005", "AC-006" ], "id": "VO-005", "proof_class": "behavior_execution", "requirement_ids": [ "REQ-008" ] }, { "acceptance_criterion_ids": [ "AC-007" ], "id": "VO-006", "proof_class": "behavior_execution", "requirement_ids": [ "REQ-009" ] }, { "acceptance_criterion_ids": [ "AC-008" ], "id": "VO-007", "proof_class": "behavior_execution", "requirement_ids": [ "REQ-010" ] }, { "acceptance_criterion_ids": [ "AC-009" ], "id": "VO-008", "proof_class": "behavior_execution", "requirement_ids": [ "REQ-011" ] }, { "acceptance_criterion_ids": [ "AC-011" ], "id": "VO-009", "proof_class": "integration_check", "requirement_ids": [ "REQ-003", "REQ-007", "REQ-008" ] } ], "workflow": { "generated_by": "product-manager-agent", "transcript": "https://git.p2prod.ru/platform/product-requests/issues/1" } }