@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,738 @@
|
|
|
1
|
+
{
|
|
2
|
+
"vertical": "mercadolibre",
|
|
3
|
+
"_note": "局部 id 不带点;合并后规范 id = `mercadolibre.<local>`。旧 id 由 base 的 aliases 兜底。",
|
|
4
|
+
"_skillNote": "`skill`(2026-10-03 加,修 D2):该流程的**主技能目录名**,必须 ∈ manifest.json#skills 且 skills/<名>/SKILL.md 存在(门禁 scripts/vertical-lint.mjs)。它是「流程 → 技能目录」的**单一真源** —— `argent sop` 只认它,**不再用 role 拼路径**(角色名 ≠ 技能名:ml-invoice-wy ≠ ml-invoice,实测把 sop 指到了不存在的目录,宿主因此以为没有踩坑文档);缺声明 ⇒ sop 明确报错,不静默兜底。",
|
|
5
|
+
"aliases": {
|
|
6
|
+
"full": "mercadolibre.full",
|
|
7
|
+
"wenyao-invoice": "mercadolibre.wenyao-invoice",
|
|
8
|
+
"xzh-invoice": "mercadolibre.xzh-invoice",
|
|
9
|
+
"daily-report": "mercadolibre.daily-report"
|
|
10
|
+
},
|
|
11
|
+
"flows": {
|
|
12
|
+
"full": {
|
|
13
|
+
"title": "FULL 货件流程",
|
|
14
|
+
"role": "ml-fulfillment",
|
|
15
|
+
"skill": "ml-fulfillment-sop",
|
|
16
|
+
"_note": "2026-09-16 用户口径:**源以客户要求为准** —— 先 legacy 表、后 lip 表,两种都要适配,故用 source.variants 而非二选一;切换只改部署环境变量,**不改流程/不重跑迁移**。字段映射与拾取规则分别对应 orchestrator.py 的 legacy/lip 两套(:446-495 / :8544-8560)。",
|
|
17
|
+
"notes": [
|
|
18
|
+
"【2026-09-17 实测定论·FULL 在 lip 表上的两层语义】旧架构 lip_poll_scan 分两层:**识别层**处理「FULL状态=空 ∧ 货件号=空」的行(校验店铺授权/SKU/数量/箱数 → 置 FULL状态=待执行,缺必填则置待执行+FULL备注,店铺未授权则置跳过);**拾取层**处理「FULL状态=待执行 ∧ 就绪=true」(运营勾「就绪」= 放行)→ 置执行中+就绪=false 后开跑。",
|
|
19
|
+
"⇒ 本注册表的 lip `pick` 目前表达的是**拾取层**(待执行 ∧ 就绪 ∧ 货件号空):实测该表 530 行中 FULL状态=待执行 96 行、已完成 112 行、空 320 行,而**就绪=true 的行数为 0** ⇒ 当前真候选 = 0(运营尚未放行任何行)。",
|
|
20
|
+
"⚠️ **缺口**:新引擎目前没有「识别层」等价物 ⇒ 一旦旧 lip-poll 停用,`FULL状态=空` 的**新行永远不会被标记为「待执行」**,拾取层将长期空转。二选一(待拍板):① 把识别判据并进 pick(triage 即识别层,识别结果由角色写回状态);② 保留一个只跑识别层的脚本(lip_poll_scan 的识别段),新引擎只做拾取。"
|
|
21
|
+
],
|
|
22
|
+
"source": {
|
|
23
|
+
"kind": "feishu-base",
|
|
24
|
+
"identity": "ml-fulfillment",
|
|
25
|
+
"select": "env:FULL_TABLE_MODE",
|
|
26
|
+
"default": "lip",
|
|
27
|
+
"variants": {
|
|
28
|
+
"legacy": {
|
|
29
|
+
"baseEnv": "FEISHU_BASE_TOKEN",
|
|
30
|
+
"tableEnv": "FEISHU_TABLE_ID",
|
|
31
|
+
"fields": {
|
|
32
|
+
"status": "状态",
|
|
33
|
+
"ready": "就绪",
|
|
34
|
+
"step": "当前步骤",
|
|
35
|
+
"note": "状态详情",
|
|
36
|
+
"labelFile": "产品标签",
|
|
37
|
+
"boxLabelFile": "箱唛"
|
|
38
|
+
},
|
|
39
|
+
"pick": {
|
|
40
|
+
"status": [
|
|
41
|
+
"待处理",
|
|
42
|
+
"运行中"
|
|
43
|
+
],
|
|
44
|
+
"ready": true
|
|
45
|
+
},
|
|
46
|
+
"_deprecated": "2026-09-17 用户口径:**legacy(FEISHU_*) 是早期测试用的旧表,现在的正式表是 lip** ⇒ default 已改为 lip,此变体仅留作回溯。",
|
|
47
|
+
"_pickNote": "2026-09-17 实测:旧表 180 行状态全为中文「已完成」,而旧 poll 的过滤器写的是 Pending/运行中 —— 两套口径本就不一致;正式流程改用 lip 变体后此项作废。",
|
|
48
|
+
"required": [
|
|
49
|
+
{
|
|
50
|
+
"name": "店铺名称",
|
|
51
|
+
"why": "legacy 旧表列名(lip 表叫「店铺」)",
|
|
52
|
+
"owner": "运营"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "SKU",
|
|
56
|
+
"why": "选品与拾取条件",
|
|
57
|
+
"owner": "运营"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "品名",
|
|
61
|
+
"why": "标签/箱唛文案(legacy 旧表列名;lip 表叫「产品名称」)",
|
|
62
|
+
"owner": "运营"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "数量",
|
|
66
|
+
"why": "装箱与标签数量",
|
|
67
|
+
"owner": "运营"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "箱数",
|
|
71
|
+
"why": "箱唛数量(真名是「箱数」不是「装箱数」,2026-09-17 实测)",
|
|
72
|
+
"owner": "运营"
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
"lip": {
|
|
77
|
+
"baseEnv": "FULL_BASE_TOKEN",
|
|
78
|
+
"tableEnv": "FULL_TABLE_ID",
|
|
79
|
+
"identityEnv": "FULL_LARK_PROFILE",
|
|
80
|
+
"_identityNote": "客户 Base 只对客户 bot 开放(本机 ml-fulfillment 读它报 91403)⇒ 身份由部署 env FULL_LARK_PROFILE 指定;未设置时沿用流程声明的 identity。",
|
|
81
|
+
"_tableNote": "2026-09-17 用户口径:**FULL 现在的正式表就是 lip** —— Base K8zjbMB9TaGKADsruYRcuKPFnAe / 表 tblj6CBX0JQWDLhh(与文鳐发票同一张表:FULL 与发票字段同表)。已实测该表含本变体声明的全部 6 列:FULL状态/就绪/当前步骤/FULL备注/FULL标签文件/FULL箱唛文件。",
|
|
82
|
+
"fields": {
|
|
83
|
+
"status": "FULL状态",
|
|
84
|
+
"ready": "就绪",
|
|
85
|
+
"store": "店铺",
|
|
86
|
+
"step": "当前步骤",
|
|
87
|
+
"note": "FULL备注",
|
|
88
|
+
"labelFile": "FULL标签文件",
|
|
89
|
+
"boxLabelFile": "FULL箱唛文件",
|
|
90
|
+
"labelCheck": "产品标签",
|
|
91
|
+
"boxCheck": "产品箱唛"
|
|
92
|
+
},
|
|
93
|
+
"pick": {
|
|
94
|
+
"status": [
|
|
95
|
+
"",
|
|
96
|
+
"待执行"
|
|
97
|
+
],
|
|
98
|
+
"release": {
|
|
99
|
+
"field": "就绪",
|
|
100
|
+
"equals": true
|
|
101
|
+
},
|
|
102
|
+
"onlyStoresFrom": "~/.dsh/argent/stores.json",
|
|
103
|
+
"retryFrom": [
|
|
104
|
+
"失败"
|
|
105
|
+
],
|
|
106
|
+
"retry": {
|
|
107
|
+
"maxAttempts": 3,
|
|
108
|
+
"_note": "2026-09-17 用户口径 A:`状态=失败` 的行按 flow_failure 分类器分流 —— retryable(网络/浏览器瞬时类,如 Target page/browser has been closed)⇒ `_phase=retry`,派发时**允许走写路径**重跑(守卫照旧:白名单/写前备份/审计/读回);其余类(业务/门户状态类)⇒ `_phase=needs_human`,交人裁定,绝不自动写。"
|
|
109
|
+
},
|
|
110
|
+
"releaseReDispatch": {
|
|
111
|
+
"enabled": true,
|
|
112
|
+
"maxPerCase": 3,
|
|
113
|
+
"cooldownMin": 30,
|
|
114
|
+
"_note": "人工重新放行(Rule R,2026-09-21 用户口径:「运营按提示在表里补好数据、自己勾就绪 ⇒ Argent 应当自动重跑,不必运维手工介入」)。判据(全部确定性):① 台账最后事件 ∈ {failed, blocked},或 `flow_retry.py` 写的 retry(`by=flow_retry`;**角色**写的 retry 归角色自己派发,引擎不抢,避免双派);② 放行位「就绪」为真 —— 失败收口一律写 就绪=false(`_fail_record`/SKU 未找到分支/`_hand_to_ops_close`),所以为真只可能是**人工重新勾的**;③ 未达 maxPerCase(每票人工放行重跑上限,含首次);④ 距上次人工放行重跑已过 cooldownMin。命中即进 `to_dispatch`(带 kind=release),认领时 planned 记 `release=true` ⇒ 上限/冷却据此计数。默认关闭;目前只给 full 开。 配套:needsHuman 类失败的 FULL备注会追加运营动作提示(failureClasses.opsAction),运营照着做即可。"
|
|
115
|
+
},
|
|
116
|
+
"_onlyStoresNote": "2026-09-17 实测:本机紫鸟只授权客户 6 家里的 3 家(墨西哥-1店-子账号 / 2店-子账号 / 3店-主账号,store_id 与客户机一致,仅命名少了「墨西哥-」前缀 ⇒ 已把本机 stores.json 键名对齐 lip 表)。若不加这层收窄,识别层会把其余店铺的行判成「未授权」并**把「跳过」写进生产表**(写脏数据)。加了之后:不属于本机授权店的行**根本不进候选**,不派发、不写任何字段。",
|
|
117
|
+
"requireEmpty": [
|
|
118
|
+
"货件号"
|
|
119
|
+
],
|
|
120
|
+
"_twoPhase": "2026-09-17 用户口径 F5「triage 即识别层」:status 里的空串 = 状态为空的新行 ⇒ 落 `_phase=identify` 的 case(角色只做识别:校验店铺授权/SKU/数量/箱数 → 写「待执行」;未授权写「跳过」+FULL备注;**不做货件作业**);`待执行` 且「就绪」已勾 ⇒ `_phase=execute`(正常作业);`待执行` 但未勾就绪 ⇒ 分诊 `await_release` 桶(只报数、不派发、不落卡)。",
|
|
121
|
+
"_truthyNote": "放行门用**真值**判断:飞书 checkbox 经 _flat() 变成字符串 'False'(非空 ⇒ 朴素 `if` 会误判为已放行)——2026-09-17 实测修。"
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
"envFile": "verticals/mercadolibre/env/fulfillment.env",
|
|
126
|
+
"_envNote": "FULL 的表 id/凭据来自部署文件 fulfillment.env(KEY=VALUE;已在进程 env 里的不覆盖);console 的 --lax 会列出仍未解析的项",
|
|
127
|
+
"_tableNote": "表由 fulfillment.env 决定:legacy=FEISHU_BASE_TOKEN/FEISHU_TABLE_ID(本机实测 180 行全「已完成」);另有 BASE_TOKEN/TABLE_ID 一套;lip 模式用 FULL_BASE_TOKEN/FULL_TABLE_ID",
|
|
128
|
+
"ticketKey": "record_id",
|
|
129
|
+
"_ticketKeyNote": "2026-09-18:FULL 的行身份**必须**用 record_id —— 因为货件号是流程中途才建出来的,用「票号列优先」会让同一条票在建单前后有两个身份(实测:失败票变 full__<货件号>,与失败台账 caseId 对不上 ⇒ 被当成新票自动重派)。⚠️ 发票流程(文鳐/鑫中航)**不要**加这个键:它们的行天然已有货件号,历史身份一直是货件号(10+5 条),改成 record_id 会让已完成的行换个身份被重复认领。"
|
|
130
|
+
},
|
|
131
|
+
"trigger": {
|
|
132
|
+
"wake": "session",
|
|
133
|
+
"mode": "real",
|
|
134
|
+
"pauseSwitch": "verticals/mercadolibre/PAUSE.full",
|
|
135
|
+
"log": "verticals/mercadolibre/logs/flow-trigger-full.log",
|
|
136
|
+
"_note": "wake=off:源已注册(可 triage/可查),但**不自动唤起角色** —— 恢复自动唤醒是P2/P3 的一次配置改动(wake=session);沿用既有 PAUSE_POLL 开关口径",
|
|
137
|
+
"_wakeNote": "2026-09-17 用户口径:**FULL 规则上允许自动唤醒重跑** —— 旧架构本来就有「脚本在下一轮轮询自动重置重跑」的语义(AUTO_RETRY_MAX=2,且**只对网络类**自动重置;选择器/业务类绝不自动重置,防重复写)。本机 PAUSE_POLL 仍在 ⇒ 触发器不会真的跑(与客户机不抢行)。",
|
|
138
|
+
"_pauseSwitchNote": "历史兼容名(PAUSE_POLL):客户机/文档/运维手册都按此名操作,**不要改名**。新流程不写 pauseSwitch 时,`_derive` 会派生 `PAUSE_FLOW_<ID>`(大写、-→_)。",
|
|
139
|
+
"pauseSwitchLegacy": "PAUSE_POLL",
|
|
140
|
+
"promptTemplate": "verticals/mercadolibre/prompts/full.md",
|
|
141
|
+
"dispatch": {
|
|
142
|
+
"sessionIdFile": "verticals/mercadolibre/flow-dispatch-full.json"
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"concurrency": {
|
|
146
|
+
"max": 2,
|
|
147
|
+
"leaseMin": 45,
|
|
148
|
+
"perStore": 1,
|
|
149
|
+
"_perStoreNote": "P5(2026-09-17):一个店铺=一个紫鸟浏览器实例+一个 CDP 端口+一个下载目录 ⇒ 同店串行、跨店并行。限并发的是店铺级共享资源(下载目录产物认领、门户会话状态、启动清场动作、仓储容量),不是标签页机制。",
|
|
150
|
+
"batchPerStore": 1,
|
|
151
|
+
"perIp": 1,
|
|
152
|
+
"_perIpNote": "B3(2026-09-24):限流按**代理 IP** 判定,而主/子账号是「两个店名、同一个 IP」(本机实测 216.238.78.250 ← 1店主+子、158.23.227.110 ← 2店主+子)⇒ 只按店限并发等于允许同一 IP 上翻倍打请求。perIp=1 = 同一 IP 同一时刻只跑一张票;IP 未知的店归入同一「未知」桶(同样不许叠加)。",
|
|
153
|
+
"_note": "2026-09-18 用户口径 B「一店一批」:同店一次最多带走 3 张,交给**一个** subagent 跑 orchestrator.py --records a,b,c(KB-085:单 CDP 连接、多标签页、顺序执行)。为什么不是同店真并行:产物认领的兜底是\"目录里新出现/最新的文件\",同店两批并行会把标签/箱唛记到错票(P5 实测结论);顺序批处理同样省掉每票一次的编排+连接开销。铁律:该店已有活租约(上一批在跑)⇒ 整店跳过,绝不追加。 租约 45 分钟:一批最多 3 张、单张引擎 ~4 分钟 + 编排开销 ⇒ 最坏约 20~25 分钟,留出余量;租约内该店不会再被认领(租约到期仍未收尾 ⇒ 分诊判\"停滞\"、工作台可见)。",
|
|
154
|
+
"_throttleNote": "2026-09-23 平台限流(ML 返回 local_rate_limited/503):同轮多店并发会显著推高被限流概率。降为 同轮≤2 张、同店 1 张;配合 5 分钟定时器 ⇒ 同店两票自然间隔≥5 分钟。限流缓解后可回调(改 max/perStore/batchPerStore 三个数即可)。"
|
|
155
|
+
},
|
|
156
|
+
"guards": {
|
|
157
|
+
"dryRunDefault": true,
|
|
158
|
+
"backup": false,
|
|
159
|
+
"audit": false,
|
|
160
|
+
"_note": "现状:FULL 写表**无白名单/无写前备份/无审计**(只有 --allow-write)⇒ P3 补齐"
|
|
161
|
+
},
|
|
162
|
+
"required": [
|
|
163
|
+
{
|
|
164
|
+
"name": "店铺",
|
|
165
|
+
"why": "紫鸟授权判定 + 异店并行分组(**lip 表列名**;legacy 旧表叫「店铺名称」⇒ 见 legacy 变体的 required 覆盖)",
|
|
166
|
+
"owner": "运营",
|
|
167
|
+
"role": "input"
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
"name": "SKU",
|
|
171
|
+
"why": "选品与拾取条件",
|
|
172
|
+
"owner": "运营",
|
|
173
|
+
"role": "input"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"name": "产品名称",
|
|
177
|
+
"why": "标签/箱唛文案(**lip 表列名**;legacy 旧表叫「品名」)",
|
|
178
|
+
"owner": "运营",
|
|
179
|
+
"role": "input"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"name": "数量",
|
|
183
|
+
"why": "装箱与标签数量",
|
|
184
|
+
"owner": "运营",
|
|
185
|
+
"role": "input"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"name": "箱数",
|
|
189
|
+
"why": "箱唛数量(**真名是「箱数」**,不是「装箱数」——2026-09-17 实测)",
|
|
190
|
+
"owner": "运营",
|
|
191
|
+
"role": "input"
|
|
192
|
+
}
|
|
193
|
+
],
|
|
194
|
+
"failures": {
|
|
195
|
+
"enabled": true,
|
|
196
|
+
"_note": "FULL 失败进统一台账 + 可自动唤醒角色判断(wake=session);告警轮只读影子(模板 flow-prompts/full.failure.md 写死禁 --allow-write)"
|
|
197
|
+
},
|
|
198
|
+
"_requiredNote": "2026-09-17 实测修正:原写 店铺/装箱数 在真实表里不存在(真名 店铺名称/箱数),导致投影失败且**静默 0 行**。修列名的同时给 flow_source 加了大声失败。",
|
|
199
|
+
"authority": {
|
|
200
|
+
"_note": "角色(=用户替身)的权限边界:auto=可自行决定;ask=必须问用户。见 docs/Argent-宿主适配契约.md §1「判断归属」",
|
|
201
|
+
"retry": {
|
|
202
|
+
"auto": true,
|
|
203
|
+
"maxAttempts": 2
|
|
204
|
+
},
|
|
205
|
+
"discard": {
|
|
206
|
+
"auto": false
|
|
207
|
+
},
|
|
208
|
+
"caliber": {
|
|
209
|
+
"auto": false
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
"capability": "full",
|
|
213
|
+
"envProbe": {
|
|
214
|
+
"kind": "ziniao-store",
|
|
215
|
+
"_note": "认领前只读探一次紫鸟 Bridge(ziniao-cli store list):不可用就不认领本轮,避免把票派出去才发现未登录(2026-09-23:14 张票因此变停滞,还占着店铺批次)"
|
|
216
|
+
},
|
|
217
|
+
"staleReclaim": {
|
|
218
|
+
"enabled": true,
|
|
219
|
+
"staleAfterMin": 60,
|
|
220
|
+
"maxPerRound": 1,
|
|
221
|
+
"requireEnv": true,
|
|
222
|
+
"cooldownMin": 30,
|
|
223
|
+
"_note": "停滞票自动回收:租约到期从未派发的票重排回候选(写 requeued 事件)。保守参数:超 60 分钟才回收、每轮最多 3 张、回收前先过环境预检、同票 30 分钟内不重复回收",
|
|
224
|
+
"_throttleNote": "停滞回收也降到每轮 1 张:回收后同轮大批派发正是 2026-09-23 限流的放大器。"
|
|
225
|
+
},
|
|
226
|
+
"_migrated": "2026-09-29 P2a:从 base 迁入业务线,路径命名空间化(角色/preset/能力 id 仍是旧名,待 P2b/P5)",
|
|
227
|
+
"runner": {
|
|
228
|
+
"script": "orchestrator.py",
|
|
229
|
+
"args": [
|
|
230
|
+
"--mode",
|
|
231
|
+
"full",
|
|
232
|
+
"--record-id",
|
|
233
|
+
"{ticket}"
|
|
234
|
+
],
|
|
235
|
+
"_note": "0.7.0 W2:FULL 走编排器(--mode full)"
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
"wenyao-invoice": {
|
|
239
|
+
"title": "上海文鳐发票流程",
|
|
240
|
+
"role": "ml-invoice-wy",
|
|
241
|
+
"skill": "ml-invoice",
|
|
242
|
+
"source": {
|
|
243
|
+
"kind": "feishu-base",
|
|
244
|
+
"pick": {
|
|
245
|
+
"equals": {
|
|
246
|
+
"FULL状态": "已完成",
|
|
247
|
+
"发票就绪": "true"
|
|
248
|
+
},
|
|
249
|
+
"release": {
|
|
250
|
+
"field": "发票就绪",
|
|
251
|
+
"equals": true
|
|
252
|
+
},
|
|
253
|
+
"releaseReDispatch": {
|
|
254
|
+
"enabled": true,
|
|
255
|
+
"maxPerCase": 3,
|
|
256
|
+
"cooldownMin": 30,
|
|
257
|
+
"upstreamHash": {
|
|
258
|
+
"enabled": true,
|
|
259
|
+
"watch": [
|
|
260
|
+
"产品图"
|
|
261
|
+
],
|
|
262
|
+
"ignore": [
|
|
263
|
+
"发票状态",
|
|
264
|
+
"发票文件",
|
|
265
|
+
"大货标签",
|
|
266
|
+
"发票错误信息"
|
|
267
|
+
],
|
|
268
|
+
"_note": "①「上游数据变化 ⇒ 放行额度重置」的判据面(2026-10-13,与 `xzh-invoice` 同一份判据,起因 `xzh-invoice__79406731`:运营按提示补好数据并重勾「发票就绪」,分诊仍给 `release_capped`(3/3)⇒ **永远不再拾取**)。参与 = case 里该行**被流程读取**的字段(required ∪ pick 列 ∪ `watch`);`ignore` = 流程**自己回写**的列(它们变了不代表运营改了数据),⛔ 必须含全 4 个回写列,否则每轮都判「变了」⇒ 无限重试;放行勾「发票就绪」与票号列**永远**不参与(勾一次 ≠ 改数据 —— 这正是本 BUG 的文案形态)。`watch` = **另外**纳入判据的列(`产品图`:运营补了它、流程也依赖它,但它不在 required 里 ⇒ 不进 case ⇒ 观察不到变化)—— 由 `flow_sources.common.wanted_upstream_columns()` 加进投影(表里没这列 ⇒ 静默跳过)。判据实现 `flow_triage.upstream_changed()`:优先比台账里**上次派发**记的 `upstreamFieldHash`;无快照(0.1.7 既有台账)时退回 case 的 `provenance.<字段>.at`(字段最后一次变化时间)> 上次派发时间。⛔ 上游**未变**时**不**重置(否则退化成无限重试)。"
|
|
269
|
+
},
|
|
270
|
+
"externalTiming": {
|
|
271
|
+
"enabled": true,
|
|
272
|
+
"maxPerCase": 8,
|
|
273
|
+
"cooldownMin": 120,
|
|
274
|
+
"patterns": [
|
|
275
|
+
"外部时序",
|
|
276
|
+
"尚未生成",
|
|
277
|
+
"未生成",
|
|
278
|
+
"等待平台",
|
|
279
|
+
"平台尚未"
|
|
280
|
+
],
|
|
281
|
+
"_note": "②「外部时序类失败**不占**运营放行额度」(2026-10-13,同一现场的第二条根因):`门户搜索订单 79406731 命中 0 行(仅缺大货标签)…外部时序缺口` 这类是**门户/平台侧还没生成** —— 运营改不动,而旧实现把它算进 Rule R 的 3 次额度,运营于是白补了产品图(真源原话:『之前判断需要补产品图并打勾,运营也照做了,可是你却没有拾取』)。⇒ 走**独立通道**:长冷却 `cooldownMin`(≥120,明显长于 Rule R 的 30)+ 独立更高上限 `maxPerCase`(≥8),认领时 `planned` 记 `externalTiming=true`(⛔ **不写** `release`)⇒ 既不占 `maxPerCase`、也不受其约束(分诊按 `externalRetry` 单独计数)。判据**复用现有失败分类器**(`flow_failure.classify` 的 `needs_agent` 档 = 需判断/门户类);`patterns` 只补一条**窄**标记(外部时序/尚未生成/等待平台)—— 因为生产原文含「未就绪」二字会被 `needsHuman` 组先匹配掉(实测),而它的正确动作**不是**补数据。⛔ 不新造一套分类:不声明 `patterns` 时用同一形状的内置兜底。"
|
|
282
|
+
},
|
|
283
|
+
"_note": "人工重新放行(Rule R,2026-10-09 起对**两个发票流程**开启;此前只有 FULL 开)。用户口径:「运营按提示在表里补好数据、自己勾「发票就绪」⇒ 应当自动重跑,不必运维手工补 requeued」。判据(全部确定性、无时间猜测,实现在 `flow_triage.py`):① 台账**有效末条**事件 ∈ {`failed`, `blocked`}(信息性事件 `phase`/`wake`/`policy_apply`/`policy_new` **不参与判定**,一律回退到最近一条状态性事件),或 `flow_retry.py` 写的 `retry`(`by=flow_retry`;**角色**写的 retry 归角色自己派发,引擎不抢 ⇒ 避免双派);② 放行位 = 本流程的**门控列**「发票就绪」为真(`_truthy` 与 source 同源:`'False'`/`'否'`/空 ⇒ 未放行);③ 未达 `maxPerCase`(每票上限 **3** 次,含首次);④ 距上次人工放行重跑已过 `cooldownMin`(**30** 分钟)。命中 ⇒ 进 `to_dispatch`(带 `kind=release`,认领时 `planned` 记 `release=true`+`releaseRetry=N`,上限/冷却据此计数);超限/冷却中 ⇒ `needs_human` 并写明原因。⛔ **不放宽任何写纪律**:Rule R **只重新派发**(把票放回候选、由流程按既有守卫重跑),**不改写任何数据** —— 不写表字段、不清货件号、不重置状态、不碰门户;`发票就绪` 的**勾选权永远归运营**(`wenyao-invoice-writeback.mjs` 的 `ONEWAY_FALSE_FIELDS` 只允许置 false)。⚠️ 与 FULL 的**行为差异**(如实记录):发票失败收口对**运营类**缺口会**取消**「发票就绪」(运营补齐后重勾 ⇒ 触发 Rule R),而**系统/我方类**缺口按既有口径**不取消**勾选 ⇒ 放行位仍为真,Rule R 会在冷却到期后**无需人工再勾**地重派一次(仍受每票 3 次上限约束;每次都会把原因与动作写进「发票错误信息」)。"
|
|
284
|
+
},
|
|
285
|
+
"_gateNote": "2026-09-17 用户口径:发票流程的开启前提 = **FULL状态=已完成**(不是「状态」,那是物流状态)**∧ 发票就绪=true**(运营自认字段填齐的放行勾)。缺口回填规则两个发票流程一致:**只有需要运营填的字段缺口**才写「发票错误信息」并**取消勾选「发票就绪」**(运营补齐后需自己重勾);系统/我方类缺口只写错误信息、不取消勾选。"
|
|
286
|
+
},
|
|
287
|
+
"envFile": "verticals/mercadolibre/env/fulfillment.env",
|
|
288
|
+
"baseEnv": "FULL_BASE_TOKEN",
|
|
289
|
+
"tableEnv": "FULL_TABLE_ID",
|
|
290
|
+
"identityEnv": "FULL_LARK_PROFILE",
|
|
291
|
+
"_envNote": "2026-09-20(迭代1-步骤4):表/身份**不再写死**,改走 envFile + *Env(与 FULL 同一张 lip 表、同一身份 profile)。硬编码会让换客户=改代码;且与 FULL 的口径不一致(同一仓库两种写法)。"
|
|
292
|
+
},
|
|
293
|
+
"routing": {
|
|
294
|
+
"routeBy": "货代公司",
|
|
295
|
+
"match": "上海文鳐",
|
|
296
|
+
"_note": "2026-09-15 实测修正:lip 表无「货代」列,真实列名为「货代公司」(文鳐角色实跑时发现)"
|
|
297
|
+
},
|
|
298
|
+
"trigger": {
|
|
299
|
+
"intervalSec": 300,
|
|
300
|
+
"wake": "session",
|
|
301
|
+
"mode": "real",
|
|
302
|
+
"pauseSwitch": "verticals/mercadolibre/PAUSE.wenyao-invoice",
|
|
303
|
+
"log": "verticals/mercadolibre/logs/flow-trigger-wenyao-invoice.log",
|
|
304
|
+
"promptTemplate": "verticals/mercadolibre/prompts/wenyao-invoice.md",
|
|
305
|
+
"dispatch": {
|
|
306
|
+
"preset": "argent-ml-invoice-wy",
|
|
307
|
+
"cwd": "~/Code",
|
|
308
|
+
"sessionIdFile": "verticals/mercadolibre/flow-dispatch-wenyao-invoice.json"
|
|
309
|
+
},
|
|
310
|
+
"_note": "2026-09-18 用户口径:两个发票流程在旧脚本时期都已成功跑通 ⇒ 定时轮**真实执行**(原\"只跑影子、真跑须人工批准\"的红线撤销)。守卫不变:字段/记录白名单、写前备份、写后读回、审计、终态需 --force;HS 等报关敏感字段仍由运营人工维护。",
|
|
311
|
+
"_pauseSwitchNote": "历史兼容名(PAUSE_FLOW_TRIGGER):客户机/文档/运维手册都按此名操作,**不要改名**。新流程不写 pauseSwitch 时,`_derive` 会派生 `PAUSE_FLOW_<ID>`(大写、-→_)。",
|
|
312
|
+
"pauseSwitchLegacy": "PAUSE_FLOW_TRIGGER"
|
|
313
|
+
},
|
|
314
|
+
"concurrency": {
|
|
315
|
+
"max": 2,
|
|
316
|
+
"leaseMin": 20,
|
|
317
|
+
"_leaseNote": "2026-09-20(迭代1-步骤5):与 xzh-invoice 统一为 20 分钟。原为 10 分钟,而两条流程的门户导出/文件上传耗时相当 ⇒ 10 分钟在慢轮次会**提前失效**(同一张票可能被重复认领)。取较长者是保守方向。"
|
|
318
|
+
},
|
|
319
|
+
"guards": {
|
|
320
|
+
"dryRunDefault": true,
|
|
321
|
+
"writeFields": [
|
|
322
|
+
"发票状态",
|
|
323
|
+
"发票文件",
|
|
324
|
+
"大货标签",
|
|
325
|
+
"发票错误信息"
|
|
326
|
+
],
|
|
327
|
+
"errorField": "发票错误信息",
|
|
328
|
+
"_errorFieldNote": "2026-10-09(缺陷 B):**失败收口必须写的那一列**(运营看的)—— 由 `scripts/invoice_fail_closeout.py` 读取;文案由 `flow_failure.ops_message()` 产出(结论+动作),与台账 `failed/blocked` 的 `error/detail` **同一串**。⛔ 未声明 `errorField` 的流程,该命令**拒绝执行**(不许把发票列写到别的流程的表上)。",
|
|
329
|
+
"_note": "真实写:只写白名单字段(发票状态/发票文件/大货标签/发票错误信息);写前整行备份 + 写后读回验收 + 审计 JSONL;附件按 field_id 上传、同名同大小幂等跳过。",
|
|
330
|
+
"writer": "scripts/wenyao-invoice-writeback.mjs",
|
|
331
|
+
"_writerNote": "2026-10-09(缺陷 B):**写手路径由流程声明**(`scripts/invoice_fail_closeout.py` 读它)—— 两条发票流程共用同一份守卫(字段白名单 / 记录白名单 / 写前整行备份 / 写后读回 / 审计 JSONL)。⛔ 未声明 `writer` 的流程,收口命令**拒绝执行**(不许猜一个写手去写生产表)。"
|
|
332
|
+
},
|
|
333
|
+
"required": [
|
|
334
|
+
{
|
|
335
|
+
"name": "货件号",
|
|
336
|
+
"why": "模板 D 列 + 门户查询/勾选",
|
|
337
|
+
"owner": "运营",
|
|
338
|
+
"role": "input"
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"name": "发票状态",
|
|
342
|
+
"why": "状态机(待生成→填写中→…→已完成)",
|
|
343
|
+
"owner": "系统/运营",
|
|
344
|
+
"role": "state"
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"name": "发票就绪",
|
|
348
|
+
"why": "运营放行开关(checkbox)",
|
|
349
|
+
"owner": "运营",
|
|
350
|
+
"role": "state"
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"name": "产品图",
|
|
354
|
+
"why": "模板 27 列浮动图片",
|
|
355
|
+
"owner": "运营",
|
|
356
|
+
"role": "input"
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"name": "发票文件",
|
|
360
|
+
"why": "回写①(附件)",
|
|
361
|
+
"owner": "系统",
|
|
362
|
+
"role": "output"
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"name": "大货标签",
|
|
366
|
+
"why": "回写②(附件)",
|
|
367
|
+
"owner": "系统",
|
|
368
|
+
"role": "output"
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"name": "发票错误信息",
|
|
372
|
+
"why": "缺口/失败提示面",
|
|
373
|
+
"owner": "系统",
|
|
374
|
+
"role": "output"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"name": "产品名称",
|
|
378
|
+
"why": "模板列B 产品中文品名",
|
|
379
|
+
"owner": "运营",
|
|
380
|
+
"role": "input"
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"name": "货件号",
|
|
384
|
+
"why": "模板列D 货件号/唛头",
|
|
385
|
+
"owner": "运营",
|
|
386
|
+
"role": "input"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"name": "SKU",
|
|
390
|
+
"why": "模板列F SKU",
|
|
391
|
+
"owner": "运营",
|
|
392
|
+
"role": "input"
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"name": "数量",
|
|
396
|
+
"why": "模板列I 总产品数量",
|
|
397
|
+
"owner": "运营",
|
|
398
|
+
"role": "input"
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"name": "箱数",
|
|
402
|
+
"why": "模板列J 总箱数",
|
|
403
|
+
"owner": "运营",
|
|
404
|
+
"role": "input"
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"name": "重量",
|
|
408
|
+
"why": "模板列K 单箱总重",
|
|
409
|
+
"owner": "运营",
|
|
410
|
+
"role": "input"
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"name": "重量",
|
|
414
|
+
"why": "模板列L 单箱产品净重",
|
|
415
|
+
"owner": "运营",
|
|
416
|
+
"role": "input"
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
"name": "长",
|
|
420
|
+
"why": "模板列N 货箱长度",
|
|
421
|
+
"owner": "运营",
|
|
422
|
+
"role": "input"
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
"name": "宽",
|
|
426
|
+
"why": "模板列O 货箱宽度",
|
|
427
|
+
"owner": "运营",
|
|
428
|
+
"role": "input"
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"name": "高",
|
|
432
|
+
"why": "模板列P 货箱高度",
|
|
433
|
+
"owner": "运营",
|
|
434
|
+
"role": "input"
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
"name": "HS编码",
|
|
438
|
+
"why": "模板列Z 产品海关编码",
|
|
439
|
+
"owner": "运营",
|
|
440
|
+
"role": "input"
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
"name": "是否带电",
|
|
444
|
+
"why": "模板列AB 是否带电",
|
|
445
|
+
"owner": "运营",
|
|
446
|
+
"role": "input"
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
"name": "是否带磁",
|
|
450
|
+
"why": "模板列AC 是否带磁",
|
|
451
|
+
"owner": "运营",
|
|
452
|
+
"role": "input"
|
|
453
|
+
}
|
|
454
|
+
],
|
|
455
|
+
"notes": [
|
|
456
|
+
"HS 编码:人工维护,系统不自动填/不写候选/不自动确认(决策 2026-08-19)",
|
|
457
|
+
"模板固定值(不来自数据源):A=, S={材质},{材质英文}, T=家用, U=无, V=无, W=7 …",
|
|
458
|
+
"TODO(待用户确认语义):required 里「重量」「货件号」各出现两次,而源表只有一列同名 —— 推测分别对应模板 K(单箱总重)/L(单箱产品净重) 与「货件号/唛头」两处写法;缺口检查已按名去重展示,语义归属待定。",
|
|
459
|
+
"放行口径(2026-09-17 P4 实测修正):`发票就绪`(checkbox,运营放行) 与 `产品图`(attachment) 必须**真有值**才算齐备 —— flow_source 早先把空单元格也算作「已提供」,于是分诊报「可派发 83」;实测 lip 表 90 行(货代公司=上海文鳐)中 `发票就绪` 仅 5 行勾选、`产品图` 3 行、`HS编码` 7 行、`材质` 0 行。修正后同一轮分诊 = 可派发 0 / 等人补 88 ⇒ **没人勾放行就不会自动开票**(期望行为)。"
|
|
460
|
+
],
|
|
461
|
+
"failures": {
|
|
462
|
+
"enabled": true,
|
|
463
|
+
"_note": "P0.6 试点:只有本流程打开「失败→唤醒角色」回路;needs_agent 类失败才唤醒,带 maxPerCase/cooldown/maxPerRound 三重上限(见 flow_config 缺省)"
|
|
464
|
+
},
|
|
465
|
+
"capability": "invoice",
|
|
466
|
+
"overrides": {
|
|
467
|
+
"requiredExtra": [
|
|
468
|
+
"产品图",
|
|
469
|
+
"重量",
|
|
470
|
+
"长",
|
|
471
|
+
"宽",
|
|
472
|
+
"高",
|
|
473
|
+
"是否带电",
|
|
474
|
+
"是否带磁"
|
|
475
|
+
],
|
|
476
|
+
"_note": "与 capability 共同部分的**显式差异**(C9 门禁要求差异必须写在这里):requiredExtra = 该集成额外要求运营提供的字段(不同货代的门户/模板不同)"
|
|
477
|
+
},
|
|
478
|
+
"integration": "wenyao",
|
|
479
|
+
"_migrated": "2026-09-29 P2a:从 base 迁入业务线,路径命名空间化(角色/preset/能力 id 仍是旧名,待 P2b/P5)",
|
|
480
|
+
"runner": {
|
|
481
|
+
"script": "wenyao_run.py",
|
|
482
|
+
"args": [
|
|
483
|
+
"--shipment",
|
|
484
|
+
"{ticket}"
|
|
485
|
+
],
|
|
486
|
+
"_note": "0.7.0 W2:文鳐 runner;⚠️ 还需 --english-name(由流程上下文/LLM 提供)⇒ 完整驱动属 W3"
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
"xzh-invoice": {
|
|
490
|
+
"title": "鑫中航发票流程",
|
|
491
|
+
"role": "ml-invoice-xzh",
|
|
492
|
+
"skill": "ml-invoice-xzh",
|
|
493
|
+
"_note": "2026-09-16 注册:源表/字段来自部署配置 invoice-mapping.json(**引用而非写死**)。门户与文鳐不同(106.13.216.234:10001 老系统)⇒ 管线适配器待 P4;当前注册的价值:鑫中航的票**可分诊、可入台账、可被工作台看见**。",
|
|
494
|
+
"source": {
|
|
495
|
+
"kind": "feishu-base",
|
|
496
|
+
"pick": {
|
|
497
|
+
"equals": {
|
|
498
|
+
"FULL状态": "已完成",
|
|
499
|
+
"发票就绪": "true"
|
|
500
|
+
},
|
|
501
|
+
"release": {
|
|
502
|
+
"field": "发票就绪",
|
|
503
|
+
"equals": true
|
|
504
|
+
},
|
|
505
|
+
"releaseReDispatch": {
|
|
506
|
+
"enabled": true,
|
|
507
|
+
"maxPerCase": 3,
|
|
508
|
+
"cooldownMin": 30,
|
|
509
|
+
"upstreamHash": {
|
|
510
|
+
"enabled": true,
|
|
511
|
+
"watch": [
|
|
512
|
+
"产品图"
|
|
513
|
+
],
|
|
514
|
+
"ignore": [
|
|
515
|
+
"发票状态",
|
|
516
|
+
"发票文件",
|
|
517
|
+
"大货标签",
|
|
518
|
+
"发票错误信息"
|
|
519
|
+
],
|
|
520
|
+
"_note": "①「上游数据变化 ⇒ 放行额度重置」的判据面(2026-10-13,修 `xzh-invoice__79406731`:运营按提示补好数据并重勾「发票就绪」,分诊仍给 `release_capped`(3/3)⇒ **永远不再拾取**)。参与 = case 里该行**被流程读取**的字段(required ∪ pick 列 ∪ `watch`);`ignore` = 流程**自己回写**的列(它们变了不代表运营改了数据),⛔ 必须含全 4 个回写列,否则每轮都判「变了」⇒ 无限重试;放行勾「发票就绪」与票号列**永远**不参与(勾一次 ≠ 改数据 —— 这正是本 BUG 的文案形态)。`watch` = **另外**纳入判据的列(`产品图`:运营补了它、流程也依赖它,但它不在 required 里 ⇒ 不进 case ⇒ 观察不到变化)—— 由 `flow_sources.common.wanted_upstream_columns()` 加进投影(表里没这列 ⇒ 静默跳过)。判据实现 `flow_triage.upstream_changed()`:优先比台账里**上次派发**记的 `upstreamFieldHash`;无快照(0.1.7 既有台账)时退回 case 的 `provenance.<字段>.at`(字段最后一次变化时间)> 上次派发时间。⛔ 上游**未变**时**不**重置(否则退化成无限重试)。"
|
|
521
|
+
},
|
|
522
|
+
"externalTiming": {
|
|
523
|
+
"enabled": true,
|
|
524
|
+
"maxPerCase": 8,
|
|
525
|
+
"cooldownMin": 120,
|
|
526
|
+
"patterns": [
|
|
527
|
+
"外部时序",
|
|
528
|
+
"尚未生成",
|
|
529
|
+
"未生成",
|
|
530
|
+
"等待平台",
|
|
531
|
+
"平台尚未"
|
|
532
|
+
],
|
|
533
|
+
"_note": "②「外部时序类失败**不占**运营放行额度」(2026-10-13,同一现场的第二条根因):`门户搜索订单 79406731 命中 0 行(仅缺大货标签)…外部时序缺口` 这类是**门户/平台侧还没生成** —— 运营改不动,而旧实现把它算进 Rule R 的 3 次额度,运营于是白补了产品图(真源原话:『之前判断需要补产品图并打勾,运营也照做了,可是你却没有拾取』)。⇒ 走**独立通道**:长冷却 `cooldownMin`(≥120,明显长于 Rule R 的 30)+ 独立更高上限 `maxPerCase`(≥8),认领时 `planned` 记 `externalTiming=true`(⛔ **不写** `release`)⇒ 既不占 `maxPerCase`、也不受其约束(分诊按 `externalRetry` 单独计数)。判据**复用现有失败分类器**(`flow_failure.classify` 的 `needs_agent` 档 = 需判断/门户类);`patterns` 只补一条**窄**标记(外部时序/尚未生成/等待平台)—— 因为生产原文含「未就绪」二字会被 `needsHuman` 组先匹配掉(实测),而它的正确动作**不是**补数据。⛔ 不新造一套分类:不声明 `patterns` 时用同一形状的内置兜底。"
|
|
534
|
+
},
|
|
535
|
+
"_note": "同 `wenyao-invoice`(Rule R 的完整判据/上限/冷却/⛔ 只重新派发不写数据 见该处 `pick.releaseReDispatch._note`,本条只记**鑫中航侧**的两点事实):① 放行位是**本流程自己的门控列**「发票就绪」(⛔ 不是 FULL 的「就绪」);② 鑫中航的终端态是 `发票状态=已完成`(与文鳐同表同状态机)⇒ 重跑由流程按既有守卫重做,Rule R 本身**一个字段都不写**。"
|
|
536
|
+
},
|
|
537
|
+
"_gateNote": "2026-09-17 用户口径:发票流程的开启前提 = **FULL状态=已完成**(不是「状态」,那是物流状态)**∧ 发票就绪=true**(运营自认字段填齐的放行勾)。缺口回填规则两个发票流程一致:**只有需要运营填的字段缺口**才写「发票错误信息」并**取消勾选「发票就绪」**(运营补齐后需自己重勾);系统/我方类缺口只写错误信息、不取消勾选。"
|
|
538
|
+
},
|
|
539
|
+
"_tableNote": "2026-09-17 用户口径:**文鳐与鑫中航同属发票流程、同一张表(lip)** ⇒ 从旧表 TJrmbxuIyauNqrsJL9FclLfbnhc/tbl4vDxpCa71YLpe(2026-08-20 单表方案遗留,30 列、无「发票就绪」)切到 lip 表。旧 runner invoice_runner.py 的 `状态=已完成 ∧ 发票状态=待生成` 口径作废(新表无「状态=已完成」语义)。",
|
|
540
|
+
"envFile": "verticals/mercadolibre/env/fulfillment.env",
|
|
541
|
+
"baseEnv": "FULL_BASE_TOKEN",
|
|
542
|
+
"tableEnv": "FULL_TABLE_ID",
|
|
543
|
+
"identityEnv": "FULL_LARK_PROFILE",
|
|
544
|
+
"_envNote": "2026-09-20(迭代1-步骤4):表/身份**不再写死**,改走 envFile + *Env(与 FULL 同一张 lip 表、同一身份 profile)。硬编码会让换客户=改代码;且与 FULL 的口径不一致(同一仓库两种写法)。"
|
|
545
|
+
},
|
|
546
|
+
"trigger": {
|
|
547
|
+
"wake": "session",
|
|
548
|
+
"mode": "real",
|
|
549
|
+
"pauseSwitch": "verticals/mercadolibre/PAUSE.xzh-invoice",
|
|
550
|
+
"log": "verticals/mercadolibre/logs/flow-trigger-xzh-invoice.log",
|
|
551
|
+
"_note": "2026-09-18 用户口径:两个发票流程在旧脚本时期都已成功跑通 ⇒ 定时轮**真实执行**(原\"只跑影子、真跑须人工批准\"的红线撤销)。守卫不变:字段/记录白名单、写前备份、写后读回、审计、终态需 --force;HS 等报关敏感字段仍由运营人工维护。",
|
|
552
|
+
"promptTemplate": "verticals/mercadolibre/prompts/xzh-invoice.md",
|
|
553
|
+
"_wakeNote": "2026-09-17:与 FULL 同规则(旧架构本来就有轮询自动重跑)⇒ wake=session;本机 PAUSE_INVOICE 仍在 ⇒ 触发器直接退出、与客户机不抢行。注意:SKILL §7 的门户步骤与写入守卫**尚未核对**,模板里已写死『预检到此为止』。",
|
|
554
|
+
"_pauseSwitchNote": "历史兼容名(PAUSE_INVOICE):客户机/文档/运维手册都按此名操作,**不要改名**。新流程不写 pauseSwitch 时,`_derive` 会派生 `PAUSE_FLOW_<ID>`(大写、-→_)。",
|
|
555
|
+
"pauseSwitchLegacy": "PAUSE_INVOICE",
|
|
556
|
+
"dispatch": {
|
|
557
|
+
"sessionIdFile": "verticals/mercadolibre/flow-dispatch-xzh-invoice.json"
|
|
558
|
+
}
|
|
559
|
+
},
|
|
560
|
+
"concurrency": {
|
|
561
|
+
"max": 2,
|
|
562
|
+
"leaseMin": 20
|
|
563
|
+
},
|
|
564
|
+
"guards": {
|
|
565
|
+
"dryRunDefault": true,
|
|
566
|
+
"errorField": "发票错误信息",
|
|
567
|
+
"_errorFieldNote": "同 `wenyao-invoice`(缺陷 B):失败收口必须写的列(运营看的),文案与台账 `failed/blocked` 同源同文;用于 `scripts/invoice_fail_closeout.py`。",
|
|
568
|
+
"_note": "真实写:只写白名单字段(发票状态/发票文件/大货标签/发票错误信息);写前整行备份 + 写后读回验收 + 审计 JSONL;附件按 field_id 上传、同名同大小幂等跳过。",
|
|
569
|
+
"writer": "scripts/wenyao-invoice-writeback.mjs",
|
|
570
|
+
"_writerNote": "2026-10-09(缺陷 B):**写手路径由流程声明**(`scripts/invoice_fail_closeout.py` 读它)—— 两条发票流程共用同一份守卫(字段白名单 / 记录白名单 / 写前整行备份 / 写后读回 / 审计 JSONL)。⛔ 未声明 `writer` 的流程,收口命令**拒绝执行**(不许猜一个写手去写生产表)。"
|
|
571
|
+
},
|
|
572
|
+
"required": [
|
|
573
|
+
{
|
|
574
|
+
"name": "货件号",
|
|
575
|
+
"why": "票据键 + 模板 D 列",
|
|
576
|
+
"owner": "运营",
|
|
577
|
+
"role": "input"
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
"name": "SKU",
|
|
581
|
+
"why": "模板列 F",
|
|
582
|
+
"owner": "运营",
|
|
583
|
+
"role": "input"
|
|
584
|
+
},
|
|
585
|
+
{
|
|
586
|
+
"name": "产品名称",
|
|
587
|
+
"why": "模板列 B 产品中文品名",
|
|
588
|
+
"owner": "运营",
|
|
589
|
+
"role": "input"
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
"name": "数量",
|
|
593
|
+
"why": "模板列 I 总数量",
|
|
594
|
+
"owner": "运营",
|
|
595
|
+
"role": "input"
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"name": "箱数",
|
|
599
|
+
"why": "模板列 J 总箱数",
|
|
600
|
+
"owner": "运营",
|
|
601
|
+
"role": "input"
|
|
602
|
+
},
|
|
603
|
+
{
|
|
604
|
+
"name": "HS编码",
|
|
605
|
+
"why": "报关要素(人工维护)",
|
|
606
|
+
"owner": "运营",
|
|
607
|
+
"role": "input"
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
"name": "材质",
|
|
611
|
+
"why": "模板固定值 {材质}",
|
|
612
|
+
"owner": "运营",
|
|
613
|
+
"role": "input"
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
"name": "发票就绪",
|
|
617
|
+
"why": "运营放行勾(本流程的开启前提之一)",
|
|
618
|
+
"owner": "运营",
|
|
619
|
+
"role": "state"
|
|
620
|
+
}
|
|
621
|
+
],
|
|
622
|
+
"failures": {
|
|
623
|
+
"enabled": true,
|
|
624
|
+
"_note": "失败进统一台账并可唤醒角色判断;告警轮只读(模板 xzh-invoice.failure.md 写死禁写表/禁门户)"
|
|
625
|
+
},
|
|
626
|
+
"_requiredNote": "2026-09-17 实测修正:原写 产品名称/HS编码/材质 在真实表里不存在(真名 品名/海关编码/材质中文)—— 新加的「未知列名大声失败」闸门当场揪出并列出可用列。",
|
|
627
|
+
"_routeNote": "本表实测 3 行、货代∈{允墨,商达,空}**没有鑫中航行** ⇒ 不加 routing 过滤(加了会把候选清空);鑫中航行的识别待客户机确认。",
|
|
628
|
+
"routing": {
|
|
629
|
+
"routeBy": "货代公司",
|
|
630
|
+
"match": "鑫中航-美墨",
|
|
631
|
+
"_note": "2026-09-17 实测:lip 表是多货代共用表(鑫中航-美墨 156 / 上海文鳐 90 / 允墨 76 / 商达 44 / 鑫隆 32 / 美加运通 22 / 冲港 12 / 三瀛 3 / 鸿泰信 2 / 空 93),按货代分流"
|
|
632
|
+
},
|
|
633
|
+
"capability": "invoice",
|
|
634
|
+
"overrides": {
|
|
635
|
+
"requiredExtra": [
|
|
636
|
+
"材质"
|
|
637
|
+
],
|
|
638
|
+
"_note": "与 capability 共同部分的**显式差异**(C9 门禁要求差异必须写在这里):requiredExtra = 该集成额外要求运营提供的字段(不同货代的门户/模板不同)"
|
|
639
|
+
},
|
|
640
|
+
"integration": "xzh",
|
|
641
|
+
"_migrated": "2026-09-29 P2a:从 base 迁入业务线,路径命名空间化(角色/preset/能力 id 仍是旧名,待 P2b/P5)",
|
|
642
|
+
"runner": {
|
|
643
|
+
"script": "invoice_lip_runner.py",
|
|
644
|
+
"args": [
|
|
645
|
+
"--record-id",
|
|
646
|
+
"{ticket}"
|
|
647
|
+
],
|
|
648
|
+
"_note": "0.7.0 W2:执行面 runner 声明(CLI `argent run` 只认这里,⛔ 不在 CLI 里写第二份名单)"
|
|
649
|
+
}
|
|
650
|
+
},
|
|
651
|
+
"daily-report": {
|
|
652
|
+
"title": "美客多店铺日报",
|
|
653
|
+
"role": "ml-daily",
|
|
654
|
+
"skill": "ml-store-daily-report",
|
|
655
|
+
"_note": "P2(2026-09-17):单元 = 站点 × 日期(不是货件号)。源是**批量待处理清单**(cases-json,由 scripts/daily-report-inbox.py 从「店铺清单 × 幂等标记」算出,**零 API 调用**)⇒ 廉价轮询;真正的抓取与推送由角色派出的 subagent 跑 daily-report.mjs 完成。",
|
|
656
|
+
"source": {
|
|
657
|
+
"kind": "cases-json",
|
|
658
|
+
"file": "flow-inbox/daily-report.json",
|
|
659
|
+
"identity": "ml-daily",
|
|
660
|
+
"regenerate": {
|
|
661
|
+
"script": "daily-report-inbox.py"
|
|
662
|
+
},
|
|
663
|
+
"maxAgeSec": 7200,
|
|
664
|
+
"_note": "单元由 daily-report-inbox.py 按 source.regenerate 在每轮读之前再生成;清单超过 maxAgeSec 未更新 ⇒ 源适配器响亮失败(不许静默 0 票)。"
|
|
665
|
+
},
|
|
666
|
+
"trigger": {
|
|
667
|
+
"intervalSec": 300,
|
|
668
|
+
"wake": "session",
|
|
669
|
+
"mode": "real",
|
|
670
|
+
"pauseSwitch": "verticals/mercadolibre/PAUSE.daily-report",
|
|
671
|
+
"log": "verticals/mercadolibre/logs/flow-trigger-daily-report.log",
|
|
672
|
+
"promptTemplate": "verticals/mercadolibre/prompts/daily-report.md",
|
|
673
|
+
"_note": "2026-09-18 用户口径:日报要**到点自动推送**(北京 14:05 = 站点本地 00:05)。intervalSec 300 保证在推送点后 ~5 分钟内触发;\"未到点不产出单元\"由 daily-report-inbox.py 的门控保证(未到点零唤醒、零模型成本)。",
|
|
674
|
+
"pauseSwitchLegacy": "PAUSE_DAILY_REPORT",
|
|
675
|
+
"dispatch": {
|
|
676
|
+
"sessionIdFile": "verticals/mercadolibre/flow-dispatch-daily-report.json"
|
|
677
|
+
},
|
|
678
|
+
"_scheduleNote": "P1-A(2026-10-12,**只对日报试点**):把触发从「每 5 分钟轮询 ≈288 次/天」改成「宿主原生 daily 排程(每天 1 次准点)」。**沿用 trigger 段**(⛔ 不另起顶层字段 ⇒ 不开第二份真源):`schedule` 只描述「排程器怎么叫醒」,周期与暂停开关仍只在 trigger 里。⛔ 本批**不切投递**:宿主排程的 prompt 创建时固定 ⇒ 语义退化为「到点叫醒 + 角色自己调 L1 认领」,而「只认领不唤醒」的 L1 入口(`flow-trigger.sh --no-wake`)**尚不存在**(实测只认 --flow/--max/--dry-run)⇒ 声明先落、防线先建,投递切换留 P1-B。⛔ `intervalSec` **保持 300 不动**:本批 launchd 那条路径照旧(先起后排,绝不双跑)。",
|
|
679
|
+
"schedule": {
|
|
680
|
+
"enabled": true,
|
|
681
|
+
"kind": "daily",
|
|
682
|
+
"time": "14:05:00",
|
|
683
|
+
"timeZone": "Asia/Shanghai",
|
|
684
|
+
"taskTitle": "日报 · 美客多店铺日报(宿主排程)",
|
|
685
|
+
"promptFile": "prompts/daily-report.scheduled.md",
|
|
686
|
+
"onPause": "deactivate",
|
|
687
|
+
"_note": "键白名单与自洽性由 scripts/vertical-lint.mjs 与 scripts/flow_config.py 各判一次(同一套判据;lint 是资产门禁、flow_config 是运行期唯一读取点)。`time` 北京 14:05 = 站点本地 00:05(与上面 trigger._note 同一口径;比 300s 轮询等点更准:从 ±5 分钟变准点、288 次/天 → 1 次/天)。`onPause: deactivate` 的**如实声明**:宿主**没有**把任务置 inactive 的远端端点 ⇒ 收敛只能用 `schedule/delete`(唯一可用的停法),被删的整条记录落 `<数据目录>/schedule-audit.jsonl`;见 scripts/argent-schedule.mjs 的 pause/apply。`promptFile` 相对**业务线目录**(也接受 `verticals/<id>/…` 的仓库根相对写法),指向**静态**轮次指令(⛔ 不带 {{tickets}})。"
|
|
688
|
+
}
|
|
689
|
+
},
|
|
690
|
+
"concurrency": {
|
|
691
|
+
"max": 6,
|
|
692
|
+
"leaseMin": 30
|
|
693
|
+
},
|
|
694
|
+
"guards": {
|
|
695
|
+
"dryRunDefault": true,
|
|
696
|
+
"backup": false,
|
|
697
|
+
"audit": false,
|
|
698
|
+
"_note": "日报只读+推送(真实推送,幂等靠 .pushed-<date>-<store> 标记);影子模式仅用于失败取证(--force --json)。"
|
|
699
|
+
},
|
|
700
|
+
"failures": {
|
|
701
|
+
"enabled": true
|
|
702
|
+
},
|
|
703
|
+
"required": [
|
|
704
|
+
{
|
|
705
|
+
"name": "store",
|
|
706
|
+
"why": "哪家店(推送身份与报表维度)",
|
|
707
|
+
"owner": "系统",
|
|
708
|
+
"role": "derived"
|
|
709
|
+
},
|
|
710
|
+
{
|
|
711
|
+
"name": "site",
|
|
712
|
+
"why": "站点(决定时区与口径)",
|
|
713
|
+
"owner": "系统",
|
|
714
|
+
"role": "derived"
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
"name": "date",
|
|
718
|
+
"why": "日报日期(幂等键)",
|
|
719
|
+
"owner": "系统",
|
|
720
|
+
"role": "derived"
|
|
721
|
+
}
|
|
722
|
+
],
|
|
723
|
+
"capability": "daily-report",
|
|
724
|
+
"_migrated": "2026-09-29 P2a:从 base 迁入业务线,路径命名空间化(角色/preset/能力 id 仍是旧名,待 P2b/P5)",
|
|
725
|
+
"runner": {
|
|
726
|
+
"script": "daily-report.mjs",
|
|
727
|
+
"args": [],
|
|
728
|
+
"ticketless": true,
|
|
729
|
+
"_note": "0.7.0 W2:日报是**无票流程**(内部按店铺/日期遍历)⇒ ticketless;args 不带 {ticket}"
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
},
|
|
733
|
+
"capabilities": {},
|
|
734
|
+
"billing": {
|
|
735
|
+
"units": {}
|
|
736
|
+
},
|
|
737
|
+
"_aliasNote": "旧 id(full / wenyao-invoice / xzh-invoice / daily-report)→ 规范 id;迁移期兜底,P2b/P5 随调用点改完后删除。"
|
|
738
|
+
}
|