new file: assets/_plugin-vue_export-helper-xvHHTGU_.css
new file: assets/appearance-patent-BNTrbLJh.css
new file: assets/appearance-patent-BPCrG75P.css
new file: assets/appearance-patent.js
new file: assets/brand-1nUVsWrm.js
new file: assets/brand-5-W0Wonr.js
new file: assets/brand-BATjYfEL.js
new file: assets/brand-BZije8D7.js
new file: assets/brand-C0Q5LZ0P.js
new file: assets/brand-CFZZtTv8.js
new file: assets/brand-CKgrwtni.js
new file: assets/brand-CRmRvyGD.js
new file: assets/brand-CXHemZwJ.js
new file: assets/brand-DBpLCgAF.js
new file: assets/brand-DRn3N4FA.js
new file: assets/brand-DZ5_PGnw.js
new file: assets/brand-DysFlQbZ.js
new file: assets/brand-UU-ckLq6.js
new file: assets/convert-1dkFPbKa.css
new file: assets/convert-6b0yq-M0.css
new file: assets/convert-7wWJ02Tw.css
new file: assets/convert-BKSNvX8i.css
new file: assets/convert-BxkpMHO9.css
new file: assets/convert-CQ22EBpm.css
new file: assets/convert-Cfr3mUjs.css
new file: assets/convert-D4Yv2oRy.css
new file: assets/convert-DwbQug2y.css
new file: assets/dedupe-B0eqpVpj.css
new file: assets/dedupe-BHE_BCAJ.css
new file: assets/dedupe-BpNHwt51.css
new file: assets/dedupe-CS18ls2z.css
new file: assets/dedupe-DNlVfFj-.css
new file: assets/dedupe-Day_nGxq.css
new file: assets/dedupe-DyzjKbsT.css
new file: assets/dedupe-DzFvTfoj.css
new file: assets/dedupe-rhGu1E8E.css
new file: assets/delete-brand-BNvh4ru4.css
new file: assets/delete-brand-BP3XWKAC.css
new file: assets/delete-brand-BRIDBaoM.css
new file: assets/delete-brand-BcZomrN3.css
new file: assets/delete-brand-BgPrpPsj.css
new file: assets/delete-brand-ByeMdpEk.css
new file: assets/delete-brand-C-Rj3NMH.css
new file: assets/delete-brand-CDZTH98q.css
new file: assets/delete-brand-CS44Bk-y.css
new file: assets/delete-brand-CWLpe7lu.css
new file: assets/delete-brand-CdxGWtvK.css
new file: assets/delete-brand-Chu8awlt.css
new file: assets/delete-brand-CndjrFFS.css
new file: assets/delete-brand-CpNTe9WM.css
new file: assets/delete-brand-D7t16Ukk.css
new file: assets/delete-brand-DE0hLEak.css
new file: assets/delete-brand-DLyg-H8J.css
new file: assets/delete-brand-DO6pdlC3.css
new file: assets/delete-brand-DXSeQxXc.css
new file: assets/delete-brand-DZ6zYt8o.css
new file: assets/delete-brand-DfRLfrtm.css
new file: assets/delete-brand-Dl7T0pmm.css
new file: assets/delete-brand-Dt_MS9as.css
new file: assets/delete-brand-DvND7vBL.css
new file: assets/delete-brand-_jGFWTAn.css
new file: assets/el-alert-Ct0RpqUD.css
new file: assets/el-input-CezJelDw.css
new file: assets/el-input-xaztPnzw.css
new file: assets/el-table-column-Cy4YJvw0.css
new file: assets/listingFilters-B6-M_FNM.js
new file: assets/listingFilters-BmlAzw7M.css
new file: assets/listingFilters-BpGOU_pJ.js
new file: assets/listingFilters-CK58rX4v.css
new file: assets/patrol-delete-BPu1AAPM.css
new file: assets/patrol-delete-BctopIU4.css
new file: assets/patrol-delete-CSekhzSS.css
new file: assets/patrol-delete-DIvFZUTh.css
new file: assets/patrol-delete.js
new file: assets/price-track-1SjcUfP4.css
new file: assets/price-track-85NbckiJ.css
new file: assets/price-track-B5FVfJb_.css
new file: assets/price-track-BO5PtL0W.css
new file: assets/price-track-BccJT4Qr.css
new file: assets/price-track-BlSD-0un.css
new file: assets/price-track-BlVVl2eV.css
new file: assets/price-track-BwgEuRxe.css
new file: assets/price-track-CWQD_A7D.css
new file: assets/price-track-DNTcdRH8.css
new file: assets/price-track-Dv4EZPhf.css
new file: assets/price-track-Ji5JAoeR.css
new file: assets/price-track-RLJUgMl_.css
new file: assets/price-track-z8RU_FlW.css
new file: assets/price-track.js
new file: assets/product-risk-1G_ztqNY.css
new file: assets/product-risk-A5bhfaTH.css
new file: assets/product-risk-BBMcuGAw.css
new file: assets/product-risk-C3Yn2wAL.css
new file: assets/product-risk-CG-1Iq4P.css
new file: assets/product-risk-COeM91v5.css
new file: assets/product-risk-ClWs7d57.css
new file: assets/product-risk-CtpNfape.css
new file: assets/product-risk-DBsBE_mg.css
new file: assets/product-risk-DRYaWmI2.css
new file: assets/product-risk-Db49F4J5.css
new file: assets/product-risk-DoO8ZHM0.css
new file: assets/product-risk-DpSMKBCA.css
new file: assets/product-risk-DqFPFWEv.css
new file: assets/product-risk-cfL3Ch5-.css
new file: assets/product-risk-eXMv239F.css
new file: assets/product-risk-un2cxu--.css
new file: assets/product-risk.js
new file: assets/pywebview-3PePjYSu.js
new file: assets/pywebview-8G_9KMXd.css
new file: assets/pywebview-9YBa--7x.js
new file: assets/pywebview-B6ZNXusn.css
new file: assets/pywebview-BCPdlDdb.js
new file: assets/pywebview-BLoeiUcF.css
new file: assets/pywebview-BRrok0pS.js
new file: assets/pywebview-BT0f6KST.css
new file: assets/pywebview-BbIq-QPS.css
new file: assets/pywebview-Bc09DixN.js
new file: assets/pywebview-Bl6M97uH.js
new file: assets/pywebview-BnpJyyGZ.js
new file: assets/pywebview-Bt854mYs.js
new file: assets/pywebview-C5RGB8QW.css
new file: assets/pywebview-C66x_2Dh.js
new file: assets/pywebview-C8Bik-Sc.js
new file: assets/pywebview-CGwF8TuM.js
new file: assets/pywebview-CJLylbJu.js
new file: assets/pywebview-CeWJDVeG.js
new file: assets/pywebview-Chz98E9c.css
new file: assets/pywebview-ClWy2SbE.js
new file: assets/pywebview-Cq_E2BnJ.js
new file: assets/pywebview-Cs1Kot1q.js
new file: assets/pywebview-D-PKWjUg.js
new file: assets/pywebview-D-mMH8F6.css
new file: assets/pywebview-D4gpiFjY.js
new file: assets/pywebview-D74jYk6P.css
new file: assets/pywebview-D7_PdvyM.js
new file: assets/pywebview-D808cNhy.js
new file: assets/pywebview-DVgP2-kW.js
new file: assets/pywebview-Dee3nQjE.js
new file: assets/pywebview-DiP0HdY6.js
new file: assets/pywebview-Dp5dN8OO.css
new file: assets/pywebview-DuyK2jB1.js
new file: assets/pywebview-IqgMfeBe.css
new file: assets/pywebview-MkjZQlBu.css
new file: assets/pywebview-Q4glvYu5.css
new file: assets/pywebview-Rm5Hhqpf.js
new file: assets/pywebview-V_UIajJm.js
new file: assets/pywebview-hj_EXwAP.css
new file: assets/pywebview-ij4pgMq8.css
new file: assets/pywebview-leZCedEt.js
new file: assets/query-asin-B0yMJ9Or.css
new file: assets/query-asin-B5e5m-vs.css
new file: assets/query-asin-Bv7Jtgqa.css
new file: assets/query-asin-DZwJfwHU.css
new file: assets/query-asin.js
new file: assets/shop-match-Banz7DWL.css
new file: assets/shop-match-BiZP8IGM.css
new file: assets/shop-match-BrrGkYV7.css
new file: assets/shop-match-CVFsXUvd.css
new file: assets/shop-match-CfGJEHz0.css
new file: assets/shop-match-CfGWwDtw.css
new file: assets/shop-match-D0DGETCs.css
new file: assets/shop-match-DFEKOpvV.css
new file: assets/shop-match-DNFA8ceR.css
new file: assets/shop-match-DhT1CvMP.css
new file: assets/shop-match-L0xHTaQ2.css
new file: assets/shop-match-MsxXMG_G.css
new file: assets/shop-match-g3eRKhTP.css
new file: assets/shop-match.js
new file: assets/split-BoBVrLdC.css
new file: assets/split-BsJfbBqn.css
new file: assets/split-CRUIYKS6.css
new file: assets/split-DAa_Usoh.css
new file: assets/split-DidKJ84l.css
new file: assets/split-RNZYJ-zZ.css
new file: assets/split-R_8V5xgh.css
new file: assets/split-_O6NHqDj.css
new file: assets/split-mwLUJT1K.css
new file: assets/zh-cn-BjWx61Lu.js
new file: assets/zh-cn-C0iS6aoJ.js
new file: assets/zh-cn-CuE9Zzgz.js
new file: assets/zh-cn-DyKmB71i.js
new file: assets/zh-cn-Z9PBnl-n.js
Generated __pycache__ files were already ignored in some paths but remained tracked in the repository, which caused merge noise and binary conflicts. This removes the tracked bytecode from the index and adds an explicit recursive ignore rule so future Python runs do not reintroduce them.
Constraint: Existing repository history already tracked pycache files across app, backend, and source_code
Rejected: Delete local pycache directories from disk | only repository tracking needed to be removed
Confidence: high
Scope-risk: narrow
Directive: Do not force-add __pycache__ or *.pyc files unless there is a documented runtime packaging reason
Tested: git ls-files shows no remaining paths containing __pycache__/
Not-tested: Application runtime; change only affects tracked generated artifacts and ignore rules
The merge keeps dev/koko patrol-delete asset fallback behavior while accepting the latest master feature work. Conflicts were limited to ignore rules, local environment/config artifacts, tracked pycache binaries, and the Flask main blueprint.
Constraint: master and dev/koko both edited app/blueprints/main.py around brand and asset serving
Rejected: Drop dev/koko asset fallback logic | patrol delete and rebuilt Vite assets still need hashed asset resolution across app/new_web_source locations
Confidence: medium
Scope-risk: broad
Directive: app/.env remains a tracked local-config file in this repository; do not print or normalize secrets during conflict handling
Tested: uv run python -m py_compile blueprints\\main.py amazon\\base.py amazon\\main.py
Tested: uv run --group dev pytest tests\\test_amazon_base.py tests\\test_patrol_delete.py
Not-tested: Full backend-java/frontend-vue test suites
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
Update the README so new contributors start from the latest patrol-delete automation flow instead of treating delete-brand as the primary example. Keep the older delete-brand path as contrast for the file-driven workflow.
Constraint: Recent repository changes made patrol-delete the newest automation module, so the onboarding example needed to match current development reality
Rejected: Leave delete-brand as the primary example | would mislead readers about the latest automation entry point
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Revisit this section when a newer automation module replaces patrol-delete as the primary example
Tested: README diff review
Not-tested: lint, typecheck, unit/integration tests not run (documentation-only change)
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
Add a root README that explains the active runtime layers and onboarding path, and keep local OMX session state out of version control so developer tooling does not interfere with pulls.
Constraint: Local OMX state is developer-specific and should not block branch sync or appear in shared history
Rejected: Keep onboarding notes untracked | easy to lose and hard to share with the team
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Keep the README aligned with the active app/backend-java/frontend-vue execution path; revisit if the runtime architecture changes
Tested: git diff review; git status after staging
Not-tested: lint, typecheck, unit/integration tests not run (docs and ignore rules only)
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