@whyshu/argent-engine 0.0.0-stage → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MANIFEST.json +341 -0
- package/engine/VERSION +1 -0
- package/engine/agents/catalog.json +454 -0
- package/engine/configs/_aliases.proposed.json +651 -0
- package/engine/configs/_migration-plan.proposed.json +899 -0
- package/engine/configs/account.json +272 -0
- package/engine/configs/advanced.json +205 -0
- package/engine/configs/host.json +149 -0
- package/engine/configs/hr.json +27 -0
- package/engine/configs/notify.json +264 -0
- package/engine/core/cli/argent.mjs +277 -0
- package/engine/core/contracts/argent.contracts.json +1065 -0
- package/engine/core/contracts/verbs.schema.json +2539 -0
- package/engine/core/lib/argent-datadir.mjs +223 -0
- package/engine/core/lib/audit.mjs +187 -0
- package/engine/core/lib/claim.mjs +258 -0
- package/engine/core/lib/config-catalog.mjs +1172 -0
- package/engine/core/lib/doctor-customer.mjs +577 -0
- package/engine/core/lib/flow-list.mjs +138 -0
- package/engine/core/lib/flow-registry.mjs +48 -0
- package/engine/core/lib/init.mjs +247 -0
- package/engine/core/lib/ledger.mjs +124 -0
- package/engine/core/lib/license-activate.mjs +813 -0
- package/engine/core/lib/license-device.mjs +314 -0
- package/engine/core/lib/license-file.mjs +349 -0
- package/engine/core/lib/license-guard.mjs +123 -0
- package/engine/core/lib/license-ops.mjs +1645 -0
- package/engine/core/lib/license-verdict.mjs +133 -0
- package/engine/core/lib/license.mjs +577 -0
- package/engine/core/lib/notify/dedup.mjs +101 -0
- package/engine/core/lib/notify/feishu.mjs +38 -0
- package/engine/core/lib/notify/index.mjs +95 -0
- package/engine/core/lib/notify/verb.mjs +327 -0
- package/engine/core/lib/notify/webhook.mjs +135 -0
- package/engine/core/lib/notify/wecom.mjs +36 -0
- package/engine/core/lib/python.mjs +145 -0
- package/engine/core/lib/sop.mjs +116 -0
- package/engine/core/lib/versions.mjs +205 -0
- package/engine/core/mcp/client.mjs +67 -0
- package/engine/core/mcp/http.mjs +138 -0
- package/engine/core/mcp/server.mjs +702 -0
- package/engine/scripts/_engine_rules_probe.py +15 -0
- package/engine/scripts/analyze-full-day.py +568 -0
- package/engine/scripts/archive/feishu-bridge.js +246 -0
- package/engine/scripts/argent-agents.mjs +527 -0
- package/engine/scripts/argent-capabilities.mjs +776 -0
- package/engine/scripts/argent-catalog.mjs +186 -0
- package/engine/scripts/argent-datadir.py +62 -0
- package/engine/scripts/argent-doctor.mjs +624 -0
- package/engine/scripts/argent-env-write.mjs +302 -0
- package/engine/scripts/argent-schedule.mjs +620 -0
- package/engine/scripts/argent-setup-check.mjs +369 -0
- package/engine/scripts/argent-upgrade.mjs +1046 -0
- package/engine/scripts/base-bootstrap.sh +576 -0
- package/engine/scripts/billing-mode-daily.sh +13 -0
- package/engine/scripts/build-engine-package.mjs +126 -0
- package/engine/scripts/capability-packs.lock.json +484 -0
- package/engine/scripts/capability_pack.py +1242 -0
- package/engine/scripts/check-1.0-criteria.mjs +355 -0
- package/engine/scripts/check-agent-catalog.mjs +141 -0
- package/engine/scripts/check-billing-mode.sh +378 -0
- package/engine/scripts/check-child-sessions.mjs +83 -0
- package/engine/scripts/check-config-catalog.mjs +677 -0
- package/engine/scripts/check-docs-drift.mjs +522 -0
- package/engine/scripts/check-dsh-web-expose.sh +98 -0
- package/engine/scripts/check-judgment-drift.mjs +403 -0
- package/engine/scripts/check-license.mjs +199 -0
- package/engine/scripts/check-model-auth.py +443 -0
- package/engine/scripts/check-pack-closure.mjs +661 -0
- package/engine/scripts/check-portable-symbols.mjs +116 -0
- package/engine/scripts/check-preset-landing.mjs +124 -0
- package/engine/scripts/check-production-home.mjs +602 -0
- package/engine/scripts/check-role-mapping.mjs +461 -0
- package/engine/scripts/check-sample-redaction.mjs +320 -0
- package/engine/scripts/check-skill-classification.mjs +188 -0
- package/engine/scripts/check-sop-consistency.mjs +431 -0
- package/engine/scripts/check-test-env-safety.mjs +627 -0
- package/engine/scripts/check-version-consistency.mjs +452 -0
- package/engine/scripts/ci-run.sh +558 -0
- package/engine/scripts/collect-evidence.mjs +42 -0
- package/engine/scripts/config-explain.mjs +278 -0
- package/engine/scripts/configure-provider.rb +29 -0
- package/engine/scripts/customer-config-migrate.mjs +179 -0
- package/engine/scripts/customer-preflight.py +892 -0
- package/engine/scripts/customer-readiness.sh +135 -0
- package/engine/scripts/daily-report-inbox.py +242 -0
- package/engine/scripts/daily-report-reconcile.mjs +312 -0
- package/engine/scripts/daily-report.mjs +1310 -0
- package/engine/scripts/daily-report.sh +47 -0
- package/engine/scripts/data/lip-product-dict.json +306 -0
- package/engine/scripts/deliver-customer.mjs +932 -0
- package/engine/scripts/delivery-faces.txt +31 -0
- package/engine/scripts/desktop-trial.sh +146 -0
- package/engine/scripts/dev-window.sh +261 -0
- package/engine/scripts/drill-clean-machine.sh +315 -0
- package/engine/scripts/dsh-api-client.mjs +215 -0
- package/engine/scripts/dsh-backup-scope.sh +83 -0
- package/engine/scripts/dsh-offline-pack.mjs +77 -0
- package/engine/scripts/dsh-overlay-pin.sh +87 -0
- package/engine/scripts/dsh-plane.mjs +153 -0
- package/engine/scripts/dsh-portforward.py +223 -0
- package/engine/scripts/dsh-preflight.mjs +179 -0
- package/engine/scripts/dsh-release-watch-daily.sh +19 -0
- package/engine/scripts/dsh-release-watch.mjs +458 -0
- package/engine/scripts/dsh-remote-check.sh +99 -0
- package/engine/scripts/dsh-restart.sh +179 -0
- package/engine/scripts/dsh-restore.sh +111 -0
- package/engine/scripts/dsh-scope-rewire.mjs +803 -0
- package/engine/scripts/dsh-snapshot.mjs +116 -0
- package/engine/scripts/dsh-upgrade-readiness.mjs +165 -0
- package/engine/scripts/dsh-upgrade.mjs +612 -0
- package/engine/scripts/dsh-url.sh +86 -0
- package/engine/scripts/dsh-web-launch.mjs +155 -0
- package/engine/scripts/ensure-store-windows.py +509 -0
- package/engine/scripts/entitlements.py +458 -0
- package/engine/scripts/env_probe.py +411 -0
- package/engine/scripts/feishu-card.mjs +252 -0
- package/engine/scripts/final-check.mjs +43 -0
- package/engine/scripts/fix-skill-frontmatter.py +209 -0
- package/engine/scripts/flow-auto-retry.py +454 -0
- package/engine/scripts/flow-requirements.json +735 -0
- package/engine/scripts/flow-scaffold.py +275 -0
- package/engine/scripts/flow-timers-plist.sh +87 -0
- package/engine/scripts/flow-timers.sh +184 -0
- package/engine/scripts/flow-trigger-wake.mjs +284 -0
- package/engine/scripts/flow-trigger.sh +571 -0
- package/engine/scripts/flow_billing.py +354 -0
- package/engine/scripts/flow_capability_stats.py +314 -0
- package/engine/scripts/flow_case.py +194 -0
- package/engine/scripts/flow_claim.py +497 -0
- package/engine/scripts/flow_config.py +1025 -0
- package/engine/scripts/flow_failure.py +588 -0
- package/engine/scripts/flow_learn.py +105 -0
- package/engine/scripts/flow_ledger.py +235 -0
- package/engine/scripts/flow_policy.py +238 -0
- package/engine/scripts/flow_preflight.py +339 -0
- package/engine/scripts/flow_registry.py +341 -0
- package/engine/scripts/flow_retry.py +304 -0
- package/engine/scripts/flow_return_to_ops.py +191 -0
- package/engine/scripts/flow_source.py +315 -0
- package/engine/scripts/flow_sources/__init__.py +53 -0
- package/engine/scripts/flow_sources/cases_json.py +106 -0
- package/engine/scripts/flow_sources/common.py +428 -0
- package/engine/scripts/flow_sources/feishu_base.py +273 -0
- package/engine/scripts/flow_stale.py +185 -0
- package/engine/scripts/flow_status_reconcile.py +344 -0
- package/engine/scripts/flow_triage.py +849 -0
- package/engine/scripts/flow_write_verify.py +496 -0
- package/engine/scripts/fulfillment.js +586 -0
- package/engine/scripts/gen-agent-bundles.mjs +276 -0
- package/engine/scripts/gen-preset-rows.mjs +259 -0
- package/engine/scripts/init-ml.sh +2278 -0
- package/engine/scripts/install-internal-role.sh +190 -0
- package/engine/scripts/install-license.mjs +641 -0
- package/engine/scripts/install-one-shot.mjs +665 -0
- package/engine/scripts/integration_contract.py +220 -0
- package/engine/scripts/integrations/wenyao/adapter.py +98 -0
- package/engine/scripts/integrations/xzh/adapter.py +75 -0
- package/engine/scripts/invoice-mapping.example.json +40 -0
- package/engine/scripts/invoice-table.sh +195 -0
- package/engine/scripts/invoice_carrier_notice.py +279 -0
- package/engine/scripts/invoice_fail_closeout.py +297 -0
- package/engine/scripts/invoice_lip_runner.py +1508 -0
- package/engine/scripts/invoice_lip_runner.py.bak-20260922-1710-freready +1090 -0
- package/engine/scripts/invoice_ready_audit.py +191 -0
- package/engine/scripts/invoice_runner.py +675 -0
- package/engine/scripts/invoice_stageb.py +516 -0
- package/engine/scripts/launchd/com.whyshu.argent-bridge.plist.example +42 -0
- package/engine/scripts/launchd/com.whyshu.fulfillment-poll.plist.example +29 -0
- package/engine/scripts/lease.py +377 -0
- package/engine/scripts/lib/agent-install.mjs +649 -0
- package/engine/scripts/lib/argent-datadir.mjs +16 -0
- package/engine/scripts/lib/argent-datadir.sh +18 -0
- package/engine/scripts/lib/argent_datadir.py +285 -0
- package/engine/scripts/lib/argent_filelock.py +507 -0
- package/engine/scripts/lib/bootcheck-wiring.mjs +510 -0
- package/engine/scripts/lib/cdp_ports.py +197 -0
- package/engine/scripts/lib/customer-env.mjs +102 -0
- package/engine/scripts/lib/daily-report-core.mjs +517 -0
- package/engine/scripts/lib/dep-declaration.mjs +81 -0
- package/engine/scripts/lib/deps-migrate.mjs +310 -0
- package/engine/scripts/lib/dsh-host-resolve.mjs +109 -0
- package/engine/scripts/lib/dsh-scope.mjs +500 -0
- package/engine/scripts/lib/dsh-snapshot-path.mjs +35 -0
- package/engine/scripts/lib/dsh-versions.mjs +96 -0
- package/engine/scripts/lib/dsh-web-probe.mjs +214 -0
- package/engine/scripts/lib/is-direct-run.mjs +61 -0
- package/engine/scripts/lib/patch-compose.mjs +241 -0
- package/engine/scripts/lib/patch-target.mjs +35 -0
- package/engine/scripts/lib/plugin-lifecycle.mjs +128 -0
- package/engine/scripts/lib/plugin-packages.mjs +332 -0
- package/engine/scripts/lib/preset-compat.mjs +127 -0
- package/engine/scripts/lib/preset-install.mjs +575 -0
- package/engine/scripts/lib/preset-mechanism.mjs +56 -0
- package/engine/scripts/lib/preset-sync.mjs +59 -0
- package/engine/scripts/lib/profile-retire.mjs +97 -0
- package/engine/scripts/lib/python-runtime.mjs +190 -0
- package/engine/scripts/lib/registry.mjs +72 -0
- package/engine/scripts/lib/repo-root.sh +56 -0
- package/engine/scripts/lib/schedule-mechanism.mjs +659 -0
- package/engine/scripts/lib/schedule-probe.mjs +835 -0
- package/engine/scripts/lib/scope-pointer.mjs +164 -0
- package/engine/scripts/lib/settings-panels.mjs +816 -0
- package/engine/scripts/lib/stdio_utf8.py +86 -0
- package/engine/scripts/lib/wake-auth.mjs +392 -0
- package/engine/scripts/lib/webdriver_ipc.py +264 -0
- package/engine/scripts/lib/zstd-frames.mjs +104 -0
- package/engine/scripts/license-e2e-drill.mjs +426 -0
- package/engine/scripts/license-gate.mjs +245 -0
- package/engine/scripts/lip_backlog.py +171 -0
- package/engine/scripts/lip_table.py +185 -0
- package/engine/scripts/local-usage.mjs +214 -0
- package/engine/scripts/migrate-providers.mjs +127 -0
- package/engine/scripts/migrate-skills.sh +65 -0
- package/engine/scripts/ml-oauth-setup.mjs +550 -0
- package/engine/scripts/ml-store-ids.json +26 -0
- package/engine/scripts/ml_artifact_attribution.py +333 -0
- package/engine/scripts/ml_capacity_probe.py +1158 -0
- package/engine/scripts/ml_hub_status.py +1556 -0
- package/engine/scripts/ml_schema_check.py +115 -0
- package/engine/scripts/ml_store_ids.py +139 -0
- package/engine/scripts/npm-publish-argent.mjs +499 -0
- package/engine/scripts/npm-publish-argent.sh +20 -0
- package/engine/scripts/orchestrator.py +13811 -0
- package/engine/scripts/pack-plugins.mjs +140 -0
- package/engine/scripts/patches/dsh-llm-deepseek--transport-diagnostics.patch +297 -0
- package/engine/scripts/patches/dsh-session--append-message-shape.patch +15 -0
- package/engine/scripts/patches/dsh-session--tool-result-block-017.patch +28 -0
- package/engine/scripts/patches/dsh-session-format-v0-to-v1--permission-preset-origin.patch +11 -0
- package/engine/scripts/patches/dsh-session-format-v3-to-v4--turn-outside-replace.patch +20 -0
- package/engine/scripts/patches/dsh-session-persistence-jsonl--worker-bundled-migrators.patch +39 -0
- package/engine/scripts/patches/dsh-tools--render-return-shape.patch +50 -0
- package/engine/scripts/patches/verify-bundled-migrators.mjs +79 -0
- package/engine/scripts/patches/verify-hardening.mjs +167 -0
- package/engine/scripts/patches/verify-session-migration.mjs +149 -0
- package/engine/scripts/patches/verify-transport-diagnostics.mjs +227 -0
- package/engine/scripts/plan-role-rename.mjs +125 -0
- package/engine/scripts/plugin-bootcheck.mjs +451 -0
- package/engine/scripts/plugin-composition.json +15 -0
- package/engine/scripts/poc-mcp-host.mjs +455 -0
- package/engine/scripts/poll-fulfillment.sh +295 -0
- package/engine/scripts/poll-invoice.sh +76 -0
- package/engine/scripts/profile-doctor.mjs +686 -0
- package/engine/scripts/provider-select.sh +71 -0
- package/engine/scripts/provider-switch.sh +146 -0
- package/engine/scripts/provider-sync-target.check.mjs +64 -0
- package/engine/scripts/python-runtime.sh +78 -0
- package/engine/scripts/query_runner.py +310 -0
- package/engine/scripts/release-argent.sh +574 -0
- package/engine/scripts/repair-unresolved-tools.mjs +178 -0
- package/engine/scripts/retire-inventory.mjs +40 -0
- package/engine/scripts/run-tests.sh +257 -0
- package/engine/scripts/s1-audit.mjs +85 -0
- package/engine/scripts/self-sign-license.mjs +179 -0
- package/engine/scripts/session-health-scan.mjs +63 -0
- package/engine/scripts/session-repair-tool-result-content.mjs +181 -0
- package/engine/scripts/setup.sh +22 -0
- package/engine/scripts/skill-install.mjs +629 -0
- package/engine/scripts/sku_translate.py +148 -0
- package/engine/scripts/sync-plugins.sh +90 -0
- package/engine/scripts/sync-presets.sh +27 -0
- package/engine/scripts/sync-scripts.sh +445 -0
- package/engine/scripts/telemetry.py +873 -0
- package/engine/scripts/ui-copy-count.mjs +220 -0
- package/engine/scripts/usage-anchor.sh +137 -0
- package/engine/scripts/usage_report.py +531 -0
- package/engine/scripts/validate-preset-schema.mjs +208 -0
- package/engine/scripts/vertical-init.mjs +323 -0
- package/engine/scripts/vertical-lint.mjs +482 -0
- package/engine/scripts/wenyao-browser.sh +74 -0
- package/engine/scripts/wenyao-fixture-export.py +116 -0
- package/engine/scripts/wenyao-invoice-writeback.mjs +540 -0
- package/engine/scripts/wenyao-login.sh +35 -0
- package/engine/scripts/wenyao-template-map.json +292 -0
- package/engine/scripts/wenyao_attach.py +131 -0
- package/engine/scripts/wenyao_download_template.py +144 -0
- package/engine/scripts/wenyao_fill_template.py +568 -0
- package/engine/scripts/wenyao_login.py +145 -0
- package/engine/scripts/wenyao_portal.py +633 -0
- package/engine/scripts/wenyao_recon.py +230 -0
- package/engine/scripts/wenyao_run.py +503 -0
- package/engine/scripts/wenyao_shadow_diff.py +160 -0
- package/engine/scripts/wenyao_skill_contract.py +156 -0
- package/engine/scripts/wenyao_template_fetch.py +175 -0
- package/engine/scripts/win/dsh-web-autostart.ps1 +372 -0
- package/engine/scripts/ziniao-auth-probe.sh +268 -0
- package/engine/scripts/ziniao-keepalive.sh +217 -0
- package/engine/scripts/ziniao-post-upgrade-check.sh +121 -0
- package/engine/scripts/ziniao-windows.sh +154 -0
- package/engine/skills/README.md +86 -0
- package/engine/skills/argent-dev/SKILL.md +41 -0
- package/engine/skills/internal.json +37 -0
- package/engine/skills/lktop-pm/SKILL.md +35 -0
- package/engine/skills/lktopapp-dev/SKILL.md +34 -0
- package/engine/skills/ml-config-guide/SKILL.md +50 -0
- package/engine/skills/ml-fulfillment-sop/SKILL.md +178 -0
- package/engine/skills/ml-fulfillment-sop/references/andes-components.md +69 -0
- package/engine/skills/ml-fulfillment-sop/references/cdp-port-mapping.md +35 -0
- package/engine/skills/ml-fulfillment-sop/references/feishu-base-fulfillment-schema.md +136 -0
- package/engine/skills/ml-fulfillment-sop/references/multi-window-concurrency.md +69 -0
- package/engine/skills/ml-fulfillment-sop/references/pitfalls.md +77 -0
- package/engine/skills/ml-fulfillment-sop/references/selectors.md +243 -0
- package/engine/skills/ml-fulfillment-sop/scripts/fulfillment.js +586 -0
- package/engine/skills/ml-fulfillment-sop/scripts/poll-and-execute.sh +271 -0
- package/engine/skills/ml-fulfillment-sop/templates/report.md +55 -0
- package/engine/skills/ml-invoice/SKILL.md +506 -0
- package/engine/skills/ml-invoice/references/pitfalls.md +268 -0
- package/engine/skills/ml-invoice/references/portal-flow.md +360 -0
- package/engine/skills/ml-invoice/references/template-fill-contract.md +133 -0
- package/engine/skills/ml-invoice-xzh/SKILL.md +133 -0
- package/engine/skills/ml-invoice-xzh/references/pitfalls.md +230 -0
- package/engine/skills/ml-store-daily-report/SKILL.md +224 -0
- package/engine/skills/ml-store-daily-report/scripts/README.md +25 -0
- package/engine/skills/ml-store-daily-report/scripts/extract.js +691 -0
- package/engine/skills/ml-store-daily-report/scripts/generate.js +299 -0
- package/engine/skills/pet-dev/SKILL.md +42 -0
- package/engine/skills/whyshu-pm/SKILL.md +35 -0
- package/engine/skills/whyshu-web-dev/SKILL.md +50 -0
- package/engine/version.mjs +1 -0
- package/engine/verticals/README.md +103 -0
- package/engine/verticals/_engine-words.baseline.txt +237 -0
- package/engine/verticals/_engine-words.json +19 -0
- package/engine/verticals/mercadolibre/README.md +43 -0
- package/engine/verticals/mercadolibre/config.json +709 -0
- package/engine/verticals/mercadolibre/flows.json +738 -0
- package/engine/verticals/mercadolibre/manifest.json +538 -0
- package/engine/verticals/mercadolibre/migrate-machine-state.mjs +138 -0
- package/engine/verticals/mercadolibre/preflight.py +143 -0
- package/engine/verticals/mercadolibre/prompts/daily-report.failure.md +69 -0
- package/engine/verticals/mercadolibre/prompts/daily-report.md +47 -0
- package/engine/verticals/mercadolibre/prompts/daily-report.scheduled.md +79 -0
- package/engine/verticals/mercadolibre/prompts/full.failure.md +125 -0
- package/engine/verticals/mercadolibre/prompts/full.md +91 -0
- package/engine/verticals/mercadolibre/prompts/wenyao-invoice.failure.md +88 -0
- package/engine/verticals/mercadolibre/prompts/wenyao-invoice.md +64 -0
- package/engine/verticals/mercadolibre/prompts/xzh-invoice.failure.md +91 -0
- package/engine/verticals/mercadolibre/prompts/xzh-invoice.md +46 -0
- package/package.json +22 -4
- package/requirements.txt +5 -0
- package/README.md +0 -3
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# 已知陷阱与修复(踩坑清单)
|
|
2
|
+
|
|
3
|
+
按出现频率排序的经验教训。改动脚本或排障时先对照本清单,避免重复踩坑。
|
|
4
|
+
|
|
5
|
+
## 导航栏误触
|
|
6
|
+
|
|
7
|
+
- 现象:checkbox 选择器命中顶部导航栏的用户切换组件(`#nav-header-user-switch`),勾选错误元素
|
|
8
|
+
- 修复:checkbox 限定到 `main` 容器内查找;`_scope` 参数只对 checkbox 生效
|
|
9
|
+
|
|
10
|
+
## 货件号 ≠ URL 编号
|
|
11
|
+
|
|
12
|
+
- 现象:从 URL(inbound 编号)提取货件号,与实际货件号不一致
|
|
13
|
+
- 修复:货件号从 DOM 标题元素提取,不使用 URL inbound 编号
|
|
14
|
+
|
|
15
|
+
## React 动态 ID 大小写
|
|
16
|
+
|
|
17
|
+
- 现象:动态 ID 大小写不稳定(`_r_` vs `_R_`),选择器漏匹配
|
|
18
|
+
- 修复:CSS `[id^="_r_"]` 区分大小写,需同时覆盖两种写法;数量输入框不是 `type="number"`
|
|
19
|
+
|
|
20
|
+
## 产品标 PDF 前缀
|
|
21
|
+
|
|
22
|
+
- 现象:下载的产品标文件名带 `Envio-` 前缀,按 `*Etiquetas-de-productos.pdf` 匹配时漏掉
|
|
23
|
+
- 修复:文件名模式用 `Envio-*-Etiquetas-de-productos.pdf`
|
|
24
|
+
|
|
25
|
+
## 下载目录
|
|
26
|
+
|
|
27
|
+
- 下载目录为 `ziniaobrowserdatas/{店铺名}/`,多店铺时按店铺名区分,勿混用
|
|
28
|
+
|
|
29
|
+
## PDF 命名规则
|
|
30
|
+
|
|
31
|
+
- 产品标:`产品标 + SKU + ML码 + 品名 + 店名`
|
|
32
|
+
- 箱唛:`货件号 + {箱数}箱 + 品名`(用户 2026-09-15 明确口径;此前误写"店名",已更正)
|
|
33
|
+
|
|
34
|
+
## 排除无关 PDF
|
|
35
|
+
|
|
36
|
+
- 排除 listado / Descargar / preparation 产品列表等非目标 PDF 文件
|
|
37
|
+
|
|
38
|
+
## 货件终态跳过
|
|
39
|
+
|
|
40
|
+
- 货件终态 `Reserva cancelada` 应跳过,不再继续处理
|
|
41
|
+
|
|
42
|
+
## wait_for_url 时序
|
|
43
|
+
|
|
44
|
+
- `wait_for_url` 在 hub-v2 之后提取,避免过早读取旧页面内容
|
|
45
|
+
|
|
46
|
+
## 页面切换等待
|
|
47
|
+
|
|
48
|
+
- 页面切换用旋转蒙层(spinner)等待替代固定 sleep,避免竞态与超时
|
|
49
|
+
|
|
50
|
+
## ⛔ 步骤7「未见 Agrupa tu stock」被误判成「门户改版」(2026-10-12 事故:同一票连错 5 次)
|
|
51
|
+
|
|
52
|
+
- **现场**:货件 `79301358` / SKU `HW-MX-162` / 1 店,步骤7 **连续 5 次**失败,文案一律
|
|
53
|
+
「页面未到箱数填写页:2 轮自愈+重导航后仍未见「Agrupa tu stock」」。
|
|
54
|
+
- **错在哪**:这句话**只说"没看到什么",不说"页面到底是什么样"**。角色据此把它刻度成
|
|
55
|
+
「**脚本缺陷/门户改版**(`Agrupa tu stock` 入口缺失)⇒ 需 ml-dev 修复选择器」——
|
|
56
|
+
**误导**:ml-dev 无从下手(元素一个都没变),票还一直占着槽位。
|
|
57
|
+
- **真因**:商品被判**超大件**(units 页 `size-dimensions-tag` = `EXTRAGRANDE`、
|
|
58
|
+
`volume-pill` = `11,712 cm 3`),而该货件空间**只收中小件**(原文「Pequeños y medianos —
|
|
59
|
+
Este espacio incluye a los productos Pequeños y medianos.」)⇒ 库存输入框
|
|
60
|
+
(`aria-label="Stock a enviar"`,值 200)被平台渲染成 **disabled** ⇒ 到不了箱数填写页。
|
|
61
|
+
hub 第 5 项「Prepara bultos y/o pallets con tus productos e identifícalos」恒 `done=False`,
|
|
62
|
+
紧随其后「Debes completar las tareas anteriores para preparar e identificar.」。
|
|
63
|
+
- **⛔ 脚本侧无解**:运营实测把那个 disabled 输入框**强制启用 + 重输 + 点 Guardar**
|
|
64
|
+
(units 页 `Guardar`)**没有任何效果**(hub 项不变)。正确动作只有运营侧两个:
|
|
65
|
+
**修正商品包装尺寸**(改到该空间接受的分级)**或改走其他渠道/货件**。
|
|
66
|
+
- **已修**(判据缺失 ⇒ 报错误导):步骤7 失败路径先做一次**只读归因探测**
|
|
67
|
+
(hub-v2 + units 页,只 `navigate` + `evaluate`),命中即改抛**可执行结论**:
|
|
68
|
+
① 尺寸分级阻塞(带 tag/体积/空间原文)② 前置未完成(列未完成项原文)③ 都不是 ⇒
|
|
69
|
+
保留旧文案 + 补证据(`Agrupa tu stock` 缺失 / 当时 URL / 自愈轮数,供 ml-dev 排查真正的改版)。
|
|
70
|
+
判据是**纯函数** `scripts/ml_hub_status.py#step7_block_verdict`(离线可回归)。
|
|
71
|
+
观察点登记见 `references/selectors.md` §「商品尺寸页(units)与尺寸分级阻塞」。
|
|
72
|
+
- **教训(可推广)**:**"没看到预期元素"不是结论,是问题**。凡失败文案只说"未见 X",
|
|
73
|
+
下一个人(或下一个角色)就只能**猜**页面长什么样 —— 猜出来的"门户改版/脚本缺陷"
|
|
74
|
+
会把票推给**根本修不了它的人**。失败文案必须**先读页面、再写结论**,并且带**原文**。
|
|
75
|
+
- **口径变化(有意)**:新文案含「需运营…」⇒ 分类从 `needs_agent`(唤醒角色去猜)
|
|
76
|
+
变为 `needs_human`(落卡等人、运营改商品)。⛔ 这是本事故要的结果,不是副作用。
|
|
77
|
+
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# MercadoLibre FULL 页面 CSS 选择器映射
|
|
2
|
+
|
|
3
|
+
## 维护说明
|
|
4
|
+
- 美客多后台使用 **Andes** 设计系统(`andes-table`、`andes-button`、`andes-card` 等)
|
|
5
|
+
- 原生 `querySelectorAll` **不支持** `:contains()` / `:has-text()` 伪类——这些是 jQuery/Sizzle 扩展
|
|
6
|
+
- 数据提取策略:CSS 选择器定位结构容器 → JavaScript 遍历 textContent 匹配内容
|
|
7
|
+
- 每次 UI 变更后更新「最后验证日期」
|
|
8
|
+
- 关键页面:`https://myaccount.mercadolibre.com.mx/shipping/inbounds`
|
|
9
|
+
|
|
10
|
+
## 当前有效选择器(Playwright CDP,2026-08-05)
|
|
11
|
+
|
|
12
|
+
| 元素 | 选择器 / 提取方式 | 说明 |
|
|
13
|
+
|------|------------------|------|
|
|
14
|
+
| 数量输入框 | `input[id^="_r_"], input[id^="_R_"]` | ⚠️ 不是 `type="number"`,用 ID 前缀匹配 |
|
|
15
|
+
| Checkbox | 限定到 `main` 容器 | 排除 `#nav-header-user-switch`,防导航栏误触 |
|
|
16
|
+
| 产品标 PDF | 文件名模式 `Envio-*-Etiquetas-de-productos.pdf` | `Envio-` 前缀容易漏 |
|
|
17
|
+
| 货件号 | 从 DOM 标题元素提取 | 不是 URL inbound 编号 |
|
|
18
|
+
| ML 码 | `match(/[A-Z]{4}[0-9]+/)` 搜子串 | 用正则扫文本 |
|
|
19
|
+
| 预约确认按钮 | 双 Confirmar | 日历确认 top<700 + 主确认 top≈800 |
|
|
20
|
+
| 教程蒙层 | `aria-label=Close` + `andes-coach-marks` | 关闭新手引导浮层 |
|
|
21
|
+
| Enviar productos | `<a>` 标签 + force=True | 链接型按钮需强制点击 |
|
|
22
|
+
| 大货件地址 MXCD05 | card footer Continuar force=True | 特殊地址流程的确认按钮 |
|
|
23
|
+
|
|
24
|
+
## 已验证信息(2026-07-27)
|
|
25
|
+
|
|
26
|
+
| 项目 | 值 |
|
|
27
|
+
|------|-----|
|
|
28
|
+
| 表格类名 | `andes-table` |
|
|
29
|
+
| 表格列(th) | Envío / Declaradas-Aptas / Cita reservada / Cargo aplicado / Estado / Acciones |
|
|
30
|
+
| 按钮组件 | `andes-button`(A 标签或 BUTTON 标签) |
|
|
31
|
+
| 状态文本容器 | `TD.andes-table__column` → `DIV.andes-typography` |
|
|
32
|
+
| 操作列容器 | `TD.andes-table__column` → `DIV.table-actions-column` |
|
|
33
|
+
| 卡片容器 | `andes-card` |
|
|
34
|
+
| 已验证货件状态值 | Vencido, En preparación, Pendiente de recepción, Procesamiento finalizado |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 步骤 1:前期准备 [已验证 ✅]
|
|
39
|
+
|
|
40
|
+
### 选择器(CSS 结构定位)
|
|
41
|
+
|
|
42
|
+
| 元素 | CSS 选择器 | 验证状态 | 说明 |
|
|
43
|
+
|------|-----------|----------|------|
|
|
44
|
+
| 货件列表表格 | `table.andes-table` | ✅ 已验证 | 页面唯一表格 |
|
|
45
|
+
| 货件行 | `table.andes-table tbody tr` | ✅ 已验证 | 每行一个货件 |
|
|
46
|
+
| 状态列单元格 | `td.andes-table__column` (第 5 列, 0-indexed) | ✅ 已验证 | 表头第 5 列 = "Estado" |
|
|
47
|
+
| 操作列单元格 | `td.andes-table__column` (第 6 列) | ✅ 已验证 | 表头第 6 列 = "Acciones" |
|
|
48
|
+
| 库容警告容器 | `.andes-card`(含 "liberar espacio" 文本) | ✅ 已验证 | 出现在页面顶部 |
|
|
49
|
+
|
|
50
|
+
### 库容警告的**严格阻断形态**(2026-10-12 判据收紧,⛔ 别只看关键词)
|
|
51
|
+
|
|
52
|
+
⚠️ 库容警告的**关键词本身不是判据**:`ml_capacity_probe` 要求「关键词 ∧ 阻断形态」同时成立才算仓容满
|
|
53
|
+
(只出现提示文案、主按钮仍可点 ⇒ 不算)。判据是**纯函数**,可离线回归。
|
|
54
|
+
|
|
55
|
+
### 数据提取方式(JavaScript)
|
|
56
|
+
|
|
57
|
+
由于 Andes 组件 class 名不包含业务语义,数据提取**必须用 textContent 匹配**:
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
// 检查过期货件
|
|
61
|
+
const rows = document.querySelectorAll('table.andes-table tbody tr');
|
|
62
|
+
const vencidos = Array.from(rows).filter(row =>
|
|
63
|
+
row.textContent.includes('Vencido')
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
// 统计各状态数量
|
|
67
|
+
const statuses = {};
|
|
68
|
+
rows.forEach(row => {
|
|
69
|
+
const cells = row.querySelectorAll('td');
|
|
70
|
+
const status = cells[4]?.textContent?.trim(); // 第 5 列 = Estado
|
|
71
|
+
if (status) statuses[status] = (statuses[status] || 0) + 1;
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// 检测库容警告
|
|
75
|
+
const warning = Array.from(document.querySelectorAll('.andes-card'))
|
|
76
|
+
.find(card => card.textContent.includes('liberar espacio'));
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 步骤 2:进入创建入口 [已验证 ✅]
|
|
82
|
+
|
|
83
|
+
| 元素 | 定位方式 | 验证状态 | 说明 |
|
|
84
|
+
|------|----------|----------|------|
|
|
85
|
+
| "Enviar productos" 按钮 | `a.andes-button` 且 textContent === "Enviar productos" | ✅ 已确认组件类型 | ⚠️ 库容满时此按钮不显示/禁用,页面显示"Para enviar productos, primero deberás liberar espacio..." |
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
const enviarBtn = Array.from(document.querySelectorAll('a.andes-button'))
|
|
89
|
+
.find(btn => btn.textContent.trim() === 'Enviar productos');
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 步骤 3-5:创建货件表单
|
|
95
|
+
|
|
96
|
+
### 步骤 3:选择产品与数量 [✅ 已部分验证]
|
|
97
|
+
|
|
98
|
+
> 已验证:配送计划页面的 SKU 搜索、数量填写、继续按钮。
|
|
99
|
+
|
|
100
|
+
| 元素 | 定位方式 | 验证状态 |
|
|
101
|
+
|------|----------|----------|
|
|
102
|
+
| SKU 搜索框 | `input[placeholder*="搜索产品"]` | ✅ 已验证 |
|
|
103
|
+
| 数量输入 | `input.andes-form-control__field`(搜索结果行的可见 input) | ✅ 已验证 |
|
|
104
|
+
| "继续" 按钮 | `button.andes-button` + textContent === "继续" | ✅ 已验证 |
|
|
105
|
+
| 明星产品弹窗 "维持现有方案" | textContent 匹配 → click 关闭 | ✅ 已验证 |
|
|
106
|
+
|
|
107
|
+
### 步骤 4:预约时间 [✅ 已验证]
|
|
108
|
+
|
|
109
|
+
> 已验证:配送方式下拉、focus-ui-calendar 日期选择、时间槽、确认按钮。
|
|
110
|
+
> 页面:`/shipping/inbounds/{id}/appointment-v2`
|
|
111
|
+
|
|
112
|
+
| 子步骤 | 元素 | 定位方式 | 验证状态 |
|
|
113
|
+
|--------|------|----------|----------|
|
|
114
|
+
| 配送方式下拉 | `[id*=shipment-type-selection]` | id 前缀匹配 | ✅ |
|
|
115
|
+
| "Vehículo particular" | 叶子 SPAN,textContent === "Vehículo particular" | textContent 精确匹配 | ✅ |
|
|
116
|
+
| 日期输入框 | `input[readonly][id^="_R_"]` | 只读,动态 ID 以 `_R_` 开头 | ✅ |
|
|
117
|
+
| 当前月份 | `.focus-ui-datepicker__content__month-year` | 如 "julio 2026" | ✅ |
|
|
118
|
+
| 下月按钮 | `.focus-ui-datepicker__content__next_month_selector` | aria-label="next month" | ✅ |
|
|
119
|
+
| 上月按钮 | `.focus-ui-datepicker__content__back_month_selector` | aria-label="back month" | ✅ |
|
|
120
|
+
| 可选日期 | `div.day:not(.day--disabled)` | 排除 `day--disabled` 的格子 | ✅ |
|
|
121
|
+
| 已选日期 | `div.day--selected` | 已选日期(可能同时 disabled) | ✅ |
|
|
122
|
+
| 时间槽 | `.date-time-card-content` 内 textContent 匹配 `/\d{1,2}:\d{2}/` 的叶子元素 | 动态渲染 | ✅ |
|
|
123
|
+
| 确认按钮 | `button:not([disabled])` + textContent === "Confirmar" | 需等时间槽选定后才启用 | ✅ |
|
|
124
|
+
|
|
125
|
+
**自动化算法(⚠️ 2026-07-27 更新:robustClick 模式)**:
|
|
126
|
+
```javascript
|
|
127
|
+
// robustClick: 攻克 Andes React 组件的鼠标事件序列
|
|
128
|
+
function rc(el){ el.scrollIntoView();el.focus();
|
|
129
|
+
el.dispatchEvent(new MouseEvent("mousedown",{bubbles:true}));
|
|
130
|
+
el.dispatchEvent(new MouseEvent("mouseup",{bubbles:true}));
|
|
131
|
+
el.dispatchEvent(new MouseEvent("click",{bubbles:true,cancelable:true,view:window})); }
|
|
132
|
+
|
|
133
|
+
// 1. 选配送方式
|
|
134
|
+
rc(document.querySelector("[role=combobox]")); // 打开下拉
|
|
135
|
+
// 在 [role=option] 中找 textContent 含 "Vehículo particular" → rc()
|
|
136
|
+
|
|
137
|
+
// 2. 选日期
|
|
138
|
+
rc(document.getElementById("_r_j_")); // 打开日历
|
|
139
|
+
// 翻月: rc(document.querySelector("[aria-label=\"next month\"]"));
|
|
140
|
+
// ⚠️ 日历格子点击: rc() 无法触发 React onChange
|
|
141
|
+
// → **此步目前需人工点击**,其余 7 步全自动
|
|
142
|
+
|
|
143
|
+
// 3. 选时间
|
|
144
|
+
// 在 date-time-card-content 内找 textContent 匹配 /\d{1,2}:\d{2}/ → rc()
|
|
145
|
+
|
|
146
|
+
// 4. 确认
|
|
147
|
+
// 先点日历 Confirmar (top<700 的), 再点主 Confirmar (_r_k_)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 步骤 5:包装确认 [⚠️ 待验证]
|
|
151
|
+
|
|
152
|
+
| 元素 | 定位方式 | 验证状态 |
|
|
153
|
+
|------|----------|----------|
|
|
154
|
+
| 包装确认复选框 | 待确认 | ⚠️ 待验证 |
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 步骤 6-8:标签/箱唛/取消
|
|
159
|
+
|
|
160
|
+
### 步骤 6:标签下载 [✅ 已验证]
|
|
161
|
+
|
|
162
|
+
> 已验证:通过 Hub 页「Revisar」链接进入标签页、复选框(Andes 组件需 MouseEvent)、下载弹窗、确认。
|
|
163
|
+
|
|
164
|
+
| 元素 | 定位方式 | 验证状态 | 备注 |
|
|
165
|
+
|------|----------|----------|------|
|
|
166
|
+
| Hub 页入口(初始) | `[data-testid="link-identifiers"]`(卡片本身 `role="button"`) | ✅ | 首次进入,右侧 SVG 箭头是卡片视觉元素,整个卡片可点击 |
|
|
167
|
+
| Hub 页入口(二次) | `a[href*="labeling"]` + textContent === "Revisar" | ✅ | 进入过一次后出现 |
|
|
168
|
+
| 产品展开按钮 | `button` + textContent === "Producto" | ✅ | 展开产品列表 |
|
|
169
|
+
| 复选框 | `input[type=checkbox]` 在 `.andes-checkbox__checkbox` 内 | ✅ | **必须用 MouseEvent 而非 .click()** |
|
|
170
|
+
| Descargar etiquetas | `button` + textContent === "Descargar etiquetas" + `!disabled` | ✅ | 复选框勾选后启用 |
|
|
171
|
+
| 弹窗 PDF 选项 | `button` + textContent === "PDF" + `inModal` | ✅ | 默认已选中 |
|
|
172
|
+
| 弹窗 Descargar | `button` + textContent === "Descargar" + `inModal` | ✅ | 触发下载 |
|
|
173
|
+
| Confirmar | `button` + textContent === "Confirmar" | ✅ | 完成标签步骤 |
|
|
174
|
+
|
|
175
|
+
**关键 Pitfall**:Andes 复选框是 React 受控组件,`cb.click()` **不会触发 React onChange**——必须用:
|
|
176
|
+
```javascript
|
|
177
|
+
cb.dispatchEvent(new MouseEvent("click", {bubbles: true, cancelable: true, view: window}));
|
|
178
|
+
```
|
|
179
|
+
复选框 DOM `checked` 属性不会更新,但 React 内部状态会正确更新。
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 从页面内容提取数据的完整模式
|
|
184
|
+
|
|
185
|
+
`ziniao-cli page content --content-format text` 返回的纯文本已包含所有业务数据,正则提取比 CSS 选择器更可靠:
|
|
186
|
+
|
|
187
|
+
```javascript
|
|
188
|
+
// 从 page content 文本中提取货件列表
|
|
189
|
+
const text = pageContent; // ziniao-cli page content 返回的纯文本
|
|
190
|
+
|
|
191
|
+
// 匹配货件行:货件号 + 声明数/合格数 + 日期(可选) + 状态 + 操作
|
|
192
|
+
const shipmentPattern = /#(\d{8})\s+(\d+)\s*\/\s*(\S+)\s+([\d\/]+\s+\S+(?:\s+\d+:\d+)?\s*(?:hs)?\s+[^VEPC]*)?\s+(Vencido|En preparación|Pendiente de recepción|Procesamiento finalizado)\s+(Revisar detalle|Completar envío)/g;
|
|
193
|
+
|
|
194
|
+
let match;
|
|
195
|
+
while ((match = shipmentPattern.exec(text)) !== null) {
|
|
196
|
+
// match[1] = 货件号, match[2] = 声明数, match[3] = 合格数
|
|
197
|
+
// match[5] = 状态, match[6] = 操作
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**优势**:纯文本提取不依赖 CSS 选择器,UI 改版后仍可工作(只要文本内容不变)。
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 注意
|
|
206
|
+
- `:has-text()` 和 `:contains()` **不可用**——这是 jQuery 扩展,标准 CSS / `querySelectorAll` 不支持
|
|
207
|
+
- Andes 组件 class 名(`andes-button__content`、`andes-typography`)是内部实现细节,可能随版本变更
|
|
208
|
+
- **推荐策略**:结构定位用 CSS(`table.andes-table`),内容匹配用 textContent
|
|
209
|
+
- 纯文本正则提取(`page content`)是最稳定的数据采集方式,优先使用
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 商品尺寸页(units)与「⛔ 尺寸分级阻塞」(2026-10-12 实测登记)
|
|
214
|
+
|
|
215
|
+
### 两个页面的分工(⛔ 别只看 hub)
|
|
216
|
+
|
|
217
|
+
| 页面 | URL | 能看到什么 |
|
|
218
|
+
|------|-----|-----------|
|
|
219
|
+
| hub-v2 | `/shipping/inbounds/<货件号>/hub-v2` | 逐项任务卡(`done` 状态)+「Tienes N producto para revisar」+「Debes completar las tareas anteriores para preparar e identificar.」|**看不到商品尺寸分级** |
|
|
220
|
+
| units | `/shipping/inbounds/<货件号>/units?from=hub` | 商品尺寸分级 / 体积 / 空间口径 / 库存输入框渲染态|= hub 上「Tienes N producto para revisar」右侧【**Editar**】的 href |
|
|
221
|
+
|
|
222
|
+
### units 页新观察点(2026-10-12 现场,货件 79301358 / SKU HW-MX-162 / 1 店)
|
|
223
|
+
|
|
224
|
+
| 元素 | 定位方式 | 现场实测值 | 说明 |
|
|
225
|
+
|------|----------|-----------|------|
|
|
226
|
+
| 尺寸分级标签 | `[data-testid="size-dimensions-tag"]` | **`EXTRAGRANDE`** | ⚠️ 取值是**西语原文**(`PEQUEÑO`/`MEDIANO`/`GRANDE`/`EXTRAGRANDE`…),大小写/重音需归一化后再比 |
|
|
227
|
+
| 体积胶囊 | `[data-testid="volume-pill"]` | **`11,712 cm 3`** | 原文带千分位与空格,**照抄原文**留痕(别自己格式化) |
|
|
228
|
+
| 空间口径原文 | 正文文本 | 「**Pequeños y medianos** — Este espacio incluye a los productos Pequeños y medianos. Revisa el tamaño de cada uno junto a su nombre.」 | 描述的是**空间**(这个空间只收中小件),⛔ **不是**"这个商品有问题"的判据 |
|
|
229
|
+
| 尺寸规则入口 | 链接文本 | 「Revisar dimensiones permitidas」|「Cómo clasifican los productos por tamaño」 | 同上,只作佐证 |
|
|
230
|
+
| 库存输入框 | `[aria-label="Stock a enviar"]`(`[data-testid^="input-textfield"]`) | 值 `200`,**被平台渲染为 `disabled`**:外层 `andes-form-control--disabled` + `data-andes-state="disabled"`,位于 `.andes-tooltip__trigger` 内 | 运营实测:**强制启用 + 重输 + 点 Guardar 没有任何效果**(hub 项不变)⇒ ⛔ 别写"自动启用它"的补丁 |
|
|
231
|
+
|
|
232
|
+
### ⛔ 尺寸分级阻塞 = **运营侧**,脚本侧无解
|
|
233
|
+
|
|
234
|
+
**判据(唯一实现 `scripts/ml_hub_status.py#step7_block_verdict`,纯函数、可离线回归):**
|
|
235
|
+
出现 `size-dimensions-tag` **且值 ∉ 中小件允许集**(`PEQUEÑO`/`MEDIANO` 族)⇒
|
|
236
|
+
**该商品被平台判为超大件,而本货件空间只收中小件** ⇒ 步骤7 **进不了箱数页**(hub 第 5 项
|
|
237
|
+
「Prepara bultos y/o pallets…」恒 `done=False`)。
|
|
238
|
+
|
|
239
|
+
- **正确动作(运营)**:修正商品包装尺寸(改小到该空间接受的分级)**或**改走其他渠道/货件。
|
|
240
|
+
- **⛔ 不是门户改版、⛔ 不是选择器缺陷、⛔ 无需 ml-dev 改脚本** —— 页面元素一个都没变,
|
|
241
|
+
是平台按尺寸**合规性**把库存输入框锁成 disabled。
|
|
242
|
+
- ⚠️ **判别力**:空间文案「Pequeños y medianos…」在**任何一个**中小件货件的 units 页都会出现
|
|
243
|
+
⇒ 单凭它判"尺寸阻塞"会把正常票全判错。判据必须是**商品自己的尺寸标签**。
|