The patrol-delete flow now waits for country and listing-status controls before acting, uses the dedicated PatrolDeleteTask entry point, and includes the browser helper scripts required by the bulk-delete path. Tests cover delayed dropdown readiness, payload rejection/retry behavior, complete-draft normalization, filtered bulk deletion, and asset fallback lookup.
Constraint: Amazon listing UI exposes status controls through dynamic KAT components and delayed option rendering
Rejected: Keep row-by-row delete flow | bulk selection is the current implemented path and is covered by the added helper scripts
Confidence: high
Scope-risk: moderate
Directive: Do not remove the patrol_delete JS helper files without checking app/amazon/patrol_delete.py script loading
Tested: uv run --group dev pytest tests\\test_amazon_base.py tests\\test_patrol_delete.py
Tested: uv run python -m py_compile amazon\\base.py amazon\\main.py blueprints\\main.py
Not-tested: Real Amazon Seller Central browser session
Patrol delete can spend a long time switching countries, reading listing states, and confirming deletes, so the flow now emits concise progress logs around each high-value step. The logs avoid full DOM dumps outside existing diagnostics and focus on task, shop, country, status, deletion counts, and callback boundaries.
Constraint: Existing patrol delete runs are browser-driven and need observable progress without changing deletion behavior
Rejected: Log every DOM probe | too noisy for routine task monitoring
Confidence: high
Scope-risk: narrow
Tested: uv run --group dev pytest tests\\test_patrol_delete.py
Tested: uv run --group dev ruff check amazon\\patrol_delete.py
Tested: uv run python -m py_compile amazon\\patrol_delete.py
Not-tested: Live Seller Central browser run
Keep the patrol deletion test module aligned with the renamed patrol_delete implementation and update test function names so future searches no longer point at the old product module name.
Constraint: This is a naming-only follow-up to the patrol_delete module rename
Confidence: high
Scope-risk: narrow
Tested: uv run pytest tests/test_patrol_delete.py
Rename the patrol deletion implementation and browser helper scripts away from the generic product name so the filesystem matches the queued patrol-delete task domain. Update imports, script loading, and tests to use the patrol_delete module path.
Constraint: Existing task class remains ProductTask to avoid broad API churn beyond the requested file and script naming
Rejected: Rename ProductTask class now | would expand the change into a larger API update across tests and task dispatch
Confidence: high
Scope-risk: narrow
Directive: Keep patrol-delete script paths under app/amazon/scripts/patrol_delete when adding new helper scripts
Tested: uv run pytest tests/test_product.py
Not-tested: Remote push before this commit due previous SSH publickey failure
Merge origin/master into dev/koko while preserving the patrol delete task added on dev/koko. The task dispatcher now recognizes both patrol deletion and appearance patent collection, and the master-side SpiderTask implementation is included.
Constraint: origin fetch and push over SSH are blocked in this environment by Gitee publickey authentication
Rejected: Overwrite dev/koko with master | would drop the patrol delete branch work
Confidence: medium
Scope-risk: moderate
Directive: Do not remove either patrol-delete-run or appearance-patent-run without checking queued task producers
Tested: python -m py_compile app/amazon/approve.py app/amazon/asin_status.py app/amazon/detail_spider.py app/amazon/main.py app/amazon/match_action.py app/amazon/price_match.py
Not-tested: Remote push, blocked by SSH publickey authentication
new file: "brand - \345\211\257\346\234\254.html"
new file: "brand-\346\227\247.html"
new file: brand.html
new file: home.html
new file: index.html
new file: login.html
new file: update/PyQt5/Qt5/.keep_dir.txt
new file: update/PyQt5/QtCore.pyd
new file: update/PyQt5/QtGui.pyd
new file: update/PyQt5/QtWidgets.pyd
new file: update/PyQt5/qt-plugins/iconengines/qsvgicon.dll
new file: update/PyQt5/qt-plugins/imageformats/qgif.dll
new file: update/PyQt5/qt-plugins/imageformats/qicns.dll
new file: update/PyQt5/qt-plugins/imageformats/qico.dll
new file: update/PyQt5/qt-plugins/imageformats/qjpeg.dll
new file: update/PyQt5/qt-plugins/imageformats/qsvg.dll
new file: update/PyQt5/qt-plugins/imageformats/qtga.dll
new file: update/PyQt5/qt-plugins/imageformats/qtiff.dll
new file: update/PyQt5/qt-plugins/imageformats/qwbmp.dll
new file: update/PyQt5/qt-plugins/imageformats/qwebp.dll
new file: update/PyQt5/qt-plugins/mediaservice/dsengine.dll
new file: update/PyQt5/qt-plugins/mediaservice/qtmedia_audioengine.dll
new file: update/PyQt5/qt-plugins/mediaservice/wmfengine.dll
new file: update/PyQt5/qt-plugins/platforms/qminimal.dll
new file: update/PyQt5/qt-plugins/platforms/qoffscreen.dll
new file: update/PyQt5/qt-plugins/platforms/qwebgl.dll
new file: update/PyQt5/qt-plugins/platforms/qwindows.dll
new file: update/PyQt5/qt-plugins/platformthemes/qxdgdesktopportal.dll
new file: update/PyQt5/qt-plugins/printsupport/windowsprintersupport.dll
new file: update/PyQt5/qt-plugins/styles/qwindowsvistastyle.dll
new file: update/PyQt5/sip.pyd
new file: update/_bz2.pyd
new file: update/_ctypes.pyd
new file: update/_decimal.pyd
new file: update/_elementtree.pyd
new file: update/_hashlib.pyd
new file: update/_hashlib.zip
new file: update/_lzma.pyd
new file: update/_socket.pyd
new file: update/libcrypto-1_1-x64.dll
new file: update/libeay32.dll
new file: update/libffi-7.dll
new file: update/msvcp140.dll
new file: update/msvcp140_1.dll
new file: update/psutil/_psutil_windows.pyd
new file: update/pyexpat.pyd
new file: update/python3.dll
new file: update/python39.dll
new file: update/qt5core.dll
new file: update/qt5dbus.dll
new file: update/qt5gui.dll
new file: update/qt5multimedia.dll
new file: update/qt5network.dll
new file: update/qt5printsupport.dll
new file: update/qt5qml.dll
new file: update/qt5qmlmodels.dll
new file: update/qt5quick.dll
new file: update/qt5svg.dll
new file: update/qt5websockets.dll
new file: update/qt5widgets.dll
new file: update/select.pyd
new file: update/ssleay32.dll
new file: update/unicodedata.pyd
new file: update/update.exe
new file: update/vcruntime140.dll
new file: update/vcruntime140_1.dll