@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,735 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_doc": "各流程配置(**手工维护**,P0 引擎泛化起;无脚本会重新生成,可放心改)。source/routing/required=数据源与字段要求(分诊层据此读 live schema 判缺口);trigger/concurrency/guards=引擎运行时参数(触发间隔·唤醒方式·暂停开关·日志·提示词模板·唤醒目标·并发上限·租约·写入守卫),由 scripts/flow_config.py 统一读取并补缺省(新流程只写 source 也能跑起来)。wake 合法值只有 session|off —— 旧的「飞书 @ 唤醒 agent」机制已废弃,不保留。",
|
|
3
|
+
"flows": {},
|
|
4
|
+
"failureClasses": {
|
|
5
|
+
"_note": "失败分类规则的**唯一权威副本**(P3,2026-09-17)。引擎与 flow_failure 共读;改这里即改全链路。engineNetwork = 引擎内部自动重置用的**窄口径**(历史行为,保持不broadening);flowRetryable = 流程层(pick.retry / 失败回路 / 角色)用的宽口径。",
|
|
6
|
+
"engineNetwork": {
|
|
7
|
+
"_why": "orchestrator._is_network_error:err_type=timeout 且消息含这些关键词,或命中紫鸟修复页诊断",
|
|
8
|
+
"errTypes": [
|
|
9
|
+
"timeout"
|
|
10
|
+
],
|
|
11
|
+
"patterns": [
|
|
12
|
+
"ERR_CONNECTION_CLOSED",
|
|
13
|
+
"error.html",
|
|
14
|
+
"网络",
|
|
15
|
+
"zinia_network_retry"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"flowRetryable": {
|
|
19
|
+
"_why": "flow_failure classify():网络/限流/浏览器瞬时类 ⇒ retryable(自动重跑,不叫人)",
|
|
20
|
+
"patterns": [
|
|
21
|
+
"timeout|timed out|超时|连接|connection|ECONN|ETIMEDOUT|EAI_AGAIN|socket|网络|429|502|503|504|rate limit|限流|too many requests|temporar|稍后重试|重试即可",
|
|
22
|
+
"页面导航失败|导航失败|Target page|browser has been closed|Target closed|Page\\.goto|net::ERR_|ERR_SOCKS_CONNECTION_FAILED|NS_ERROR_|context or browser|browser context",
|
|
23
|
+
"local_rate_limited",
|
|
24
|
+
"rate_limit",
|
|
25
|
+
"resolveProps",
|
|
26
|
+
"fbm-shipment-planning-frontend",
|
|
27
|
+
"Error loading",
|
|
28
|
+
"上下文销毁",
|
|
29
|
+
"context destroyed",
|
|
30
|
+
"slow_render",
|
|
31
|
+
"页面仍在加载",
|
|
32
|
+
"ERR_ABORTED",
|
|
33
|
+
"net::ERR_ABORTED",
|
|
34
|
+
"platform_error_page",
|
|
35
|
+
"Hubo un error accediendo",
|
|
36
|
+
"平台错误页"
|
|
37
|
+
],
|
|
38
|
+
"_throttleNote": "2026-09-23 实测补:ML 限流原样是 local_rate_limited(下划线),旧规则只有 rate limit(空格)⇒ 匹配不上,被归到需角色判断而没走自动重试;503 时前端模块 fbm-shipment-planning-frontend / resolveProps 加载失败也属瞬时可重试。 同日 C-3 实战再补:ML 限流**也会**以整页错误页出现(「Hubo un error accediendo a esta página…/Error Code: XXX」,URL 不变)⇒ 归瞬时可重试类(引擎侧 err_type=platform_error_page,见 orchestrator.py 常量区实证)。"
|
|
39
|
+
},
|
|
40
|
+
"needsHuman": {
|
|
41
|
+
"_why": "flow_failure classify():缺数据/选错行/无权限/未授权等运行前提问题 ⇒ 落卡等人 |2026-09-21 补一条**窄**判据 `SKU.{0,40}在店铺`:实测「SKU HW-MX-YU-124 在店铺 墨西哥-2店-子账号 未找到」原先落到 needs_agent(兜底),但它的正确动作是**运营补数据**(不是角色判断)⇒ 归 needsHuman;刻意**不收**裸「未找到」——选择器类错误(如「[qty_input] 未找到输入框」)必须留在 needs_agent。 |2026-10-09 再补两条**窄**判据(步骤4 预约页形态;生产实测 79096447 / HW-MX-068):`预约页形态异常`、`无可用日`。为什么必须落 needsHuman:① 这一类的正确动作是**人工**(核对/改正表内货件号,或等平台放号后由人放行)⇒ 落卡等人、⛔ 绝不自动写;② 旧归属本身就是**误导源** —— 「未找到 Vehículo」走兜底 needs_agent ⇒ 唤醒角色,而角色**只能靠猜**页面长什么样(生产里就猜成了「平台无预约时段」,可 `div.day` 命中 0 只说明**日历没渲染**,同店同 SKU 4 分钟后还成功过);带 `platform_error_page` 字样那条更糟:会被 flowRetryable 吞成 retryable(脚本「自重试、不叫人」,而步骤4 是写步、引擎根本不自动重置 ⇒ 票**静默**卡住)。刻意**不收**裸 `预约失败`:金样例「预约失败:货件状态为「Reserva cancelada」…」必须留在 needs_agent(见 check-sop-consistency C3)。",
|
|
42
|
+
"patterns": [
|
|
43
|
+
"缺(?:[失了少]|\\s)|未填|为空|空值|missing|不存在|未就绪|闸门|校验不通过|需运营|等运营|请补|路由守卫|货代.*[≠!=]|不匹配|非.{0,6}货代|选错|人工",
|
|
44
|
+
"未授权|未登录|登录失效|登录墙|login_expired|无权限|permission",
|
|
45
|
+
"SKU.{0,40}在店铺",
|
|
46
|
+
"预约页形态异常|无可用日"
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"pageFlaky": {
|
|
50
|
+
"_why": "页面/选择器类(2026-09-18 用户实测暴露):UI 选择器超时 ≠ 网络超时。旧架构既定规则是「选择器/业务类绝不自动重置」(防重复写操作),但 flowRetryable 的 `超时|timeout` 会把它吞成 retryable ⇒ 允许清号重建 = 重复建单。本组在 flowRetryable **之前**匹配 ⇒ 归 needs_agent(交掌舵者判断),从而让 flow_retry 的\"非 retryable 一律拒绝\"自动兜住重建风险。 注意:**不要**放裸 `Timeout \\d+ms exceeded` —— 导航超时(门户导航超时/Page.goto)属网络类,必须留给 retryable;只收\"选择器语义\"的(等待选择器/选择器超时/locator/input[...]/date_input)。",
|
|
51
|
+
"patterns": [
|
|
52
|
+
"等待选择器超时",
|
|
53
|
+
"选择器\\s*超时",
|
|
54
|
+
"selector\\s*(timeout|超时)",
|
|
55
|
+
"wait_for_selector",
|
|
56
|
+
"locator.*(timeout|超时)",
|
|
57
|
+
"input\\[[a-z]+\\]",
|
|
58
|
+
"date_input"
|
|
59
|
+
]
|
|
60
|
+
},
|
|
61
|
+
"capacityFull": {
|
|
62
|
+
"_why": "**仓容(库容)满**(2026-10-10,FULL 自动路径成功率修复批):平台在店铺列表页**逐字**拒绝继续发货 ——「Para enviar productos, primero deberás liberar espacio de almacenamiento retirando stock de baja calidad」,且页面显示「N Envíos para terminar de preparar」。判据(⛔ 不新造第二条真相)= 平台原文关键片段(`liberar espacio` 等,与 `scripts/ml_capacity_probe.py` 的 `PLATFORM_QUOTES` **同一份**,也复用既有步骤1探针 `JS_EXTRACT_SHIPMENTS` 的 `capacity_warning`)+ 分类标记 `capacity_full`。为什么必须是**独立一类**(而不是并进 needsHuman 靠 `需运营` 兜住):① 它是**前提问题**、不是页面临时故障 —— 正确动作只有**一个**(清低质库存腾库容),要能被单独计数/告警/对账;② 它有自己的**当日重试**语义(预检发现仓容恢复 ⇒ 当日解除 defer,见 `ml_capacity_probe.defer_lift_decision`),并进 needsHuman 就再也认不出来是哪条链;③ ⛔ **绝不**与「预约页形态异常/日历没渲染」混成一条结论(那是页面形态,另有一条链 `appointment_form_verdict`)。归 needs_human(落卡等人、⛔ 绝不自动写)。",
|
|
63
|
+
"patterns": [
|
|
64
|
+
"capacity_full",
|
|
65
|
+
"liberar espacio de almacenamiento",
|
|
66
|
+
"liberar espacio",
|
|
67
|
+
"retirar stock de baja calidad",
|
|
68
|
+
"retirando stock de baja calidad",
|
|
69
|
+
"stock de baja calidad",
|
|
70
|
+
"仓容满",
|
|
71
|
+
"库容满"
|
|
72
|
+
],
|
|
73
|
+
"_action": "需运营清低质库存腾库容"
|
|
74
|
+
},
|
|
75
|
+
"opsAction": {
|
|
76
|
+
"_why": "失败备注末尾给**运营**的下一步提示(Rule R,2026-09-21 用户口径:「在 FULL备注时加上一句让运营改完之后勾选就绪,这样运营看到提示就知道如何做了」)。只在流程开了 `pick.releaseReDispatch` 时追加(关着还写「勾了就绪会自动跑」= 说谎);`{release}` = 注册表里的放行字段名(pick.release.field)。只对 **needsHuman 类**失败追加:retryable(网络类)脚本自重试,写这句是噪音;needs_agent(门户业务类/需裁定)勾了就绪也不会跑,写这句会误导。",
|
|
77
|
+
"text": "改好后勾「{release}」即可,系统下一轮会自动重跑(无需通知运维)"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"_requiredRoles": {
|
|
81
|
+
"_why": "2026-09-20 起,required 的**机器判据**是显式 `role`;`owner` 降级为给人看的责任说明。",
|
|
82
|
+
"values": {
|
|
83
|
+
"input": "运营必须提供的数据;缺 ⇒ 落卡等人(need_fields)",
|
|
84
|
+
"state": "运行中读写的状态位(发票状态/发票就绪等);进投影,但缺**不**落卡等人",
|
|
85
|
+
"output": "流程产物(发票文件/大货标签/发票错误信息);**不**进投影、**不**落卡等人",
|
|
86
|
+
"derived": "由上游生成器/引擎提供(日报的 store/site/date);不进投影、不落卡等人"
|
|
87
|
+
},
|
|
88
|
+
"_history": "此前判据是 `'系统' in owner`(中文自由文本子串)——把 `系统` 写成「我方/平台」即静默翻转语义;且 `发票状态`(owner=系统/运营)被误排除出投影,而流程实际要读它。"
|
|
89
|
+
},
|
|
90
|
+
"capabilities": {
|
|
91
|
+
"_why": "同一 capability 的多个 flow(如两条发票流程)**必须共享**这些规则;差异只能写在flow.overrides 里且被 C9 门禁检查。此前两条发票流程已漂移:required 20 vs 8、guards.writeFields 一方缺失、暂停开关命名不一。",
|
|
92
|
+
"invoice": {
|
|
93
|
+
"gate": {
|
|
94
|
+
"equals": {
|
|
95
|
+
"FULL状态": "已完成",
|
|
96
|
+
"发票就绪": "true"
|
|
97
|
+
},
|
|
98
|
+
"excludeEquals": {
|
|
99
|
+
"发票状态": [
|
|
100
|
+
"已完成"
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
"excludeAllPresent": [
|
|
104
|
+
[
|
|
105
|
+
"发票文件",
|
|
106
|
+
"大货标签"
|
|
107
|
+
]
|
|
108
|
+
],
|
|
109
|
+
"_excludeNote": "2026-09-22 用户口径:lip 表里**大量行是客户运营人工完成**的历史数据(FULL+发票都做完了),必须分辨清楚、不能当待办反复派发或计数。判据:① 发票状态=已完成;② 发票文件 与 大货标签 **都在**(人工/自动完成的共同特征;两条都成立才算完成)。只差一步的行(例如只有发票文件、缺标签)**保留**,让流程补完剩下那一步。"
|
|
110
|
+
},
|
|
111
|
+
"writeFields": [
|
|
112
|
+
"发票状态",
|
|
113
|
+
"发票文件",
|
|
114
|
+
"大货标签",
|
|
115
|
+
"发票错误信息"
|
|
116
|
+
],
|
|
117
|
+
"stateFields": [
|
|
118
|
+
"发票状态",
|
|
119
|
+
"发票就绪"
|
|
120
|
+
],
|
|
121
|
+
"gapPolicy": "只有运营缺口才写「发票错误信息」并取消勾「发票就绪」;我方缺口只写错误信息",
|
|
122
|
+
"failures": {
|
|
123
|
+
"enabled": true
|
|
124
|
+
},
|
|
125
|
+
"requiredCommon": [
|
|
126
|
+
"货件号",
|
|
127
|
+
"SKU",
|
|
128
|
+
"产品名称",
|
|
129
|
+
"数量",
|
|
130
|
+
"箱数",
|
|
131
|
+
"HS编码"
|
|
132
|
+
],
|
|
133
|
+
"progressions": [
|
|
134
|
+
"未开发票",
|
|
135
|
+
"待勾选",
|
|
136
|
+
"待生成",
|
|
137
|
+
"填写中",
|
|
138
|
+
"已上传",
|
|
139
|
+
"标签已下载",
|
|
140
|
+
"已完成",
|
|
141
|
+
"失败",
|
|
142
|
+
"跳过"
|
|
143
|
+
],
|
|
144
|
+
"guards": {
|
|
145
|
+
"backup": true,
|
|
146
|
+
"audit": true,
|
|
147
|
+
"_why": "写前整行备份 + 审计 JSONL + 写后读回是**写手**(wenyao-invoice-writeback.mjs)的实际行为;此前两条发票 flow 各自声明且相反(xzh 写 false/false,而它的注释又写着有备份+审计)⇒ 声明说谎。现上提到能力层,由 flow_preflight 与写手实际姿态强制一致。"
|
|
148
|
+
},
|
|
149
|
+
"minPlan": "enterprise",
|
|
150
|
+
"pack": {
|
|
151
|
+
"version": "1.2.167",
|
|
152
|
+
"scripts": [
|
|
153
|
+
"scripts/wenyao-invoice-writeback.mjs",
|
|
154
|
+
"scripts/invoice_lip_runner.py",
|
|
155
|
+
"scripts/flow_return_to_ops.py",
|
|
156
|
+
"scripts/wenyao_portal.py",
|
|
157
|
+
"scripts/invoice_fail_closeout.py"
|
|
158
|
+
],
|
|
159
|
+
"skills": [
|
|
160
|
+
"ml-invoice",
|
|
161
|
+
"ml-invoice-xzh",
|
|
162
|
+
"ml-config-guide"
|
|
163
|
+
],
|
|
164
|
+
"_note": [
|
|
165
|
+
"能力包版本(语义化):改了该能力的流程/提示词/脚本/技能 ⇒ 必须提版本并重新打包 |**1.2.59(2026-09-30)**:共用引擎变更(flow-trigger.sh 新增「离线许可 / 租约二选一」闸门,并把 check-license.mjs / license-gate.mjs 纳入引擎分发)⇒ 版本随引擎前进。|**1.2.64(2026-10-03)**:共用引擎变更(`scripts/lib/repo-root.sh` 的 `argent_agent_path()` 去掉旧 node 前缀 `$HOME/node/bin`、换成现役 `$HOME/.local/node/bin` —— 否则生成的 launchd PATH 指向旧树,且只改 plist 会被重生成写回)⇒ 版本随引擎前进。|**1.2.65(2026-10-03,D1)**:共用引擎变更(`scripts/lib/registry.mjs` 支持**显式解释器** `py` —— 内核侧不再赌 PATH 上恰好有 `python3`;台账查询收口为 `core/lib/ledger.mjs`(**CLI 与 MCP 共用同一套**,MCP 不再自带一份 `slice(-tail)` 先截断后过滤的假空实现))⇒ 版本随引擎前进。|**1.2.66(2026-10-03,D2)**:共用引擎变更(`scripts/vertical-lint.mjs` 新增 `flow.skill` 校验 —— 缺声明 / 未在 manifest#skills 声明 / 技能目录不存在 三类即红;`scripts/vertical-init.mjs` 生成的流程带上 `skill` 声明,保证「生成即合规」)⇒ 版本随引擎前进。 |**1.2.67(2026-10-03)**:共用引擎变更(`scripts/flow_claim.py` 补 `--cases-from-dir` 透传 + dry-run 零副作用:不建台账目录/锁文件、不落店铺清单缓存、不写 blocked 台账、源层 case 落临时目录)⇒ 版本随引擎走。|**1.2.68(2026-10-03,P1 第二批)**:共用引擎变更(`scripts/check-license.mjs` 接**唯一判定入口** `core/lib/license-verdict.mjs`(三态 + 离线设备绑定,含 `device` 比对 / unbound 放行 / 自助重绑 3 次 + 7 天宽限),`scripts/license-gate.mjs` 新增 `--json`(只给程序消费,**不改判定/不改证据**)、`scripts/install-license.mjs` 补设备比对与 `--rebind`)⇒ 版本随引擎前进。|**1.2.69(2026-10-03,P1 第三批/P3)**:包内容变更(发票技能的 SKILL 去掉**字段白名单的逐字枚举**、改为引用写手与 `core/contracts/`;两条发票提示词的守卫行同样改成引用 `argent writeback`)⇒ 版本随内容前进。|**1.2.70(2026-10-03,P4 批)**:共用引擎变更 —— `pack.engine` 纳入 **core 运行期文件**(26 项 core 运行期文件 + 3 项**独立运行验证抓出的缺件**(VERSION / flow_case.py / ml_schema_check.py):`core/cli/argent.mjs` + `core/mcp/{server,http}.mjs` + `core/lib/**` 运行期闭包 + 两个 `core/contracts/*.json`,按实际 import 关系推导)⇒ 能力包自带 core,装机可不依赖 git/sync;同批数据目录链两步落地(`scripts/lib/argent_datadir.py`:老机器存在即沿用、新装 `~/.argent`)⇒ 版本随引擎前进。|**1.2.71(2026-10-03,P4 批·独立运行复验)**:把能力包 build 出来在**无仓库/无 git-sync/极简 PATH** 下真跑,抓出 3 个此前就缺的运行期文件(`VERSION`:CLI `version`/`--help` 直接读,缺它当场 ENOENT 崩;`scripts/flow_case.py`:`flow_source.py:260` 子进程建案;`scripts/ml_schema_check.py`:`flow_source.py:280` 子进程做缺口检查)⇒ 一并纳入引擎;推导规矩收紧为「静态 import 闭包 ∪ **子进程调用图**」。 |**1.2.76(2026-10-04,§8-③ 路径 (a):一次性激活码)**:共用引擎变更(新增 `core/lib/license-activate.mjs` —— 客户机的激活码兑换:归一化/端点解析/服务端错误码→reason·退出码映射/审计;`core/lib/license.mjs` 新增 `activate` 子命令;`core/contracts/*.json` 同批登记)⇒ 版本随引擎前进。|**1.2.78(2026-10-04,isDirectRun 统一 + 补两处引擎缺件)**:共用引擎变更(新增 `scripts/lib/is-direct-run.mjs` —— \"本文件是否被直接执行\"的**唯一判据**(realpath 比对);同批把升级器/安装器/各 check-*/日报/写手/飞书卡片共 10 个 CLI 的入口守卫换成它:旧形态 `pathToFileURL(argv[1]) === import.meta.url` 在软链路径(`/tmp` → `/private/tmp`)下**假否定** ⇒ CLI 静默不跑;本包内的日报/写手两个 CLI 随之变更)⇒ 版本随引擎前进;同批补两个**此前漏在引擎清单外**的运行期文件(本次\"独立运行复验\"抓出:包内 CLI 当场 ERR_MODULE_NOT_FOUND)—— `scripts/lib/argent-datadir.mjs`(内核数据目录判据的脚本侧再导出,包内日报/写手/卡片三个 CLI 都 import 它)与 `scripts/check-skill-classification.mjs`(`core/lib/doctor-customer.mjs` 静态 import ⇒ 缺它连 `argent --help` 都起不来)。|**1.2.81(2026-10-04,客户机试点:逃生阀透传 + 用法事实)**:共用引擎变更(`core/lib/license-activate.mjs` 新增 `--allow-regression` 透传(判定仍只在 install-license)+ `--json` 时把“放行一次倒退”的标注写 stderr + 404 的 hint 点名 `--server` 只给 base URL;`core/lib/license.mjs` 把 `asJson` 告知子命令层;`core/contracts/verbs.schema.json` 同步 args 与 jsonFields)⇒ 版本随引擎前进。 |**1.2.82(2026-10-04,角色提示词收敛)**:包内容变更:`presets/argent-ml-invoice-{wy,该流程}/agent.cordis.yml` 的 persona 收敛到统一骨架(小节标题与顺序);「落卡」等看板期指令改成现行台账 blocked + 会话挂起 ⇒ 版本随内容前进。|**1.2.83(2026-10-04,O2 只读运营视图:`argent license ops`)**:共用引擎变更(新增 `core/lib/license-ops.mjs` —— 许可只读运营巡检:在途码/失败码/近 N 天事件时间线/席位账目/异常清单,替代 `mongosh`;`core/lib/license.mjs` 新增 `ops` 子命令;`core/contracts/{argent.contracts.json,verbs.schema.json}` 同批登记 + `reasonCodes` 新增 `field_missing`(O2 两个已知陷阱的响亮失败码:`state` 不是 `status`、席位不是存储字段 `used`);engine +1 项)⇒ 版本随引擎前进。(⚠️ 盖章说明:本版内容在同一工作树里经过两次收口(先落实现,再补契约 note 与词表去重)⇒ 以**最终内容**盖章;版本号 `1.2.83` 从未发布过,不存在\"内容变了版本没动\"的对外窗口)|**1.2.84(2026-10-04,O2 客户端接线:4 个只读接口)**:共用引擎变更(`core/lib/license-ops.mjs` —— `OPS_READ_ENDPOINTS` 的 4 条 `exists:false → true` 并真正发 GET(`codes-list`/`events`/`seats`/`devices/{codePrefix}`,契约 = `whyshu-svr@92c6233`);四处字段映射(`devices[].codePrefix→code`、`items/totals→principals/totals`、`device.found=total`、`timeline` 用服务端 `total`/`count` + 显式 `limit=200`);`405/400 field_unknown/429/401/403/400 bad_*` 一律 exit 2 响亮(`field_unknown`/`rate_limited`/`method_not_allowed`/`admin_required`/`bad_request`,同批登记进 `core/contracts/*`);新增 `coverage`/`coverageDetail`、`checkServerRows`、`serverPageMeta`、`summarizeCoverage`、`seat_used_mismatch`/`seat_totals_mismatch`;⛔ 仍只发 GET、零落盘、无 `--apply`、不探不调 `release-device`)⇒ 版本随引擎前进。⚠️ 服务端那 4 个接口**已就绪但未部署** ⇒ 线上仍报节级 `endpoint_missing`(⛔ 不是空集)。|**1.2.85(2026-10-04,O2 接线后收口:一行措辞修正)**:`core/lib/license-ops.mjs` 文件头「四处字段映射」表 **④** 的措辞改对(窗口内总数在 `timeline.server.total`;`timeline.scanned` 是**客户端窗口过滤后**的条数,⛔ 别当窗口内总数;落点由不存在的 `serverTimelineSection()` 改成 `serverPageMeta()` + 服务端分支)—— **一行注释同样改了引擎 sha** ⇒ 按纪律再提一版(先例同 `_engineNoteDoctor20261003`)。⛔ 行为零变化(254 断言 + kernel-purity 复跑全绿)。|**1.2.86(2026-10-04,合规改造:诊断上报改「告知—同意」)**:共用引擎变更(`scripts/telemetry.py` 默认改为 **opt-in**:`telemetryOptIn` 无键 = 关、`TELEMETRY_DISABLE=1` 硬关;新增采集时刻同意标记 `consent` 与「关闭期不采集/不堆积/不补发」迁移语义;字段 `host`(原始主机名)改为不可逆 `hostHash`,`redact()` 同步掩主机名;新增 `--purge`)—— 这些改了引擎 sha ⇒ 按纪律提版本(先例同 `_engineNoteDoctor20261003`)。客户端侧同批:安装器新增「诊断上报(可选)」步(非交互默认拒绝)、设置页新增可开关(写 `telemetryOptIn`)。|**实例令牌批次(2026-10-05,路线 B)**:共用引擎变更 —— `scripts/telemetry.py` 的凭证取值链从两级扩成三级(`ARGENT_INSTANCE_TOKEN` → `<数据目录>/instance-token.json`(**机器自带凭证**,0600)→ 账号令牌兜底);实例令牌走 **`x-instance-token`**(紧凑串 `it1.<b64url(payload)>.<sig>`)并可带 `x-instance-device`;新增**本地绑定自检**(令牌 instanceId ≠ 本机 installId ⇒ **不发网**、`lastError: instance-token-mismatch`)与 `--status.credential`(只显示来源类型/到期日与绑定态,⛔ 不显示令牌值)。`scripts/install-license.mjs` 新增 `--instance-token-file`(与许可**同一条离线下发链路**,先判后写:归属/设备码/期限对不上即拒装;0600 + 备份 + 原子落盘 + 幂等),`scripts/install-one-shot.mjs` 的 `license` 段透传该参数;新增回归 `scripts/tests/telemetry-instance-token.test.mjs`(62 例,含 JS⇄Python 对拍),`scripts/tests/telemetry-consent.test.mjs` 补「令牌 ≠ 同意」。动机:客户机此前靠 30 天账号 JWT 上报(2026-11-04 到期,且服务端 2026-09-14 轮换 JWT_SECRET 时全灭),交付一台机器就该交付**随机器走**的凭证。服务端契约与签发/续期/吊销手册见 `whyshu-svr/docs/ops/instance-token.md`。⛔ 本轮**未新增运行期文件**(只改上述三个既有引擎文件),故 `pack.engine` 清单不变。|**1.2.89(2026-10-06)**:包内容变更(业务线 `verticals/<id>/manifest.json` 是各能力包内容集的一部分)——业务线 `requires.argent` 由 `>=0.2 <0.3` 抬到 `>=0.3 <0.4`、`version` 0.1.0→0.1.1(P0-5,修「Argent 能力 → 概览」把唯一业务线误标 `⚠️ 版本不满足`);⛔ **未新增运行期文件、未改共用引擎**,故 `pack.engine` 清单不变,按既有纪律只提受影响能力包的补丁版本并重盖章。|**1.2.90(2026-10-06,MCP 工具安全注解)**:共用引擎变更(`core/mcp/server.mjs` 的 `tools/list` 给 14 个工具加 MCP 规范 `annotations` —— 只读 9 ⇒ `readOnlyHint:true`;写类 5 ⇒ `readOnlyHint:false` + `destructiveHint:true`(含三个沙箱影子工具,保守标法理由见该文件注释)—— 让宿主能在**协议层**分辨只读/写类、收窄授权面;内核侧 `confirm=false` 只回影子 + 真写 `confirm:true` 且过 `gateWrite` 许可闸的**双重门禁原样保留**。⛔ 零行为改动:handler / `inputSchema` / 返回逐字节不变、工具数仍 **14**(已与 `git HEAD` 基线逐工具比对:去掉新键后 14 条完全一致),新增回归 `scripts/tests/mcp-tool-annotations.test.mjs`)⇒ 版本随引擎前进。|**1.2.92(2026-10-08,WebDriver 用法 P0 批)**:共用引擎变更(P0-1 依赖表补 `selenium` ——`install-argent.mjs` 的 `pythonRuntimePlan().pkgs` 与 `scripts/lib/python-runtime.mjs` 的 `venvUsable` 默认 `pkgs` 同批加第五项,官方唯一推荐的驱动档位(`ZINIAO_MODE=selenium`)此前**装都没装** ⇒ 选型开关静默撒谎、该档位从未运行过一次;缺它时老 venv 必须判「未就绪」否则 `ensure` 空转、永远装不上;同批 `SeleniumClient` 的 ImportError 分支改显著 warn + 选型处预检并显著 warn 后回退 Playwright(官方不建议)、`--mode inspect` 报 `driver_tiers`;P0-2 `updateCore` 总超时 60→300s / 单次 30→60s(官方建议值)并把官方 `msg` 进度打进日志;P0-3 每题尾部**只读** before/after 窗口快照并排 + 连续 3 轮泄漏 ⇒ 台账 blocked(needs_human,⛔ 不自动关店);P1-a `_wd_call` 落 requestId/耗时一行;P1-b `-10006` 按官方语义重试一次。⛔ 未新增运行期文件(只改上述既有引擎文件),故 `pack.engine` 清单不变。)|**1.3.97(2026-10-08,WebDriver 用法 P1 小件批)**:共用引擎变更(`scripts/orchestrator.py` —— 审计 §3.2–§3.6 的 P1 小件六条:① `LastError` 并入 `WebDriverError` 与每接口日志(`_wd_err_fields` **优先读 `err`**;`err` 空时 `LastError` 仍可见、各截 80 字;`startBrowser` 的「未返回 debuggingPort」分支不再丢该字段);② 清场后 `pgrep` **进程级**复核(`wd_residual_processes`/`_wd_report_residuals`:残留 ⇒ 显著 warn,⛔ **不自动 kill 更多东西**;复核路径运行时计数 + AST 双判据零 kill;自己与祖先链不计入残留);③ IPC **连接类**异常退避 2s **重试一次**(`_wd_conn_error_kind` 分 refused/timeout/reset/conn;业务错误码与其它异常不重试;`startBrowser` 撞 timeout/reset **不重试** —— 重试会被内核视为「重启」,官方 -10006 语义);④ chromedriver **缓存面**只读巡检(`cached_chromedriver_majors`/`chromedriver_cache_inventory`/`chromedriver_cache_line` + `--mode inspect` 报缓存面;`detect_running_core_version_free` 只用窗口 CDP **免凭据**取内核大版本 ⇒ 缓存大版本可对照);⑤ `getPluginInstalled` 只读漂移探测(`plugin_probe_plan`/`probe_plugin_installed`:无 `pluginIds` 来源 ⇒ **零调用**只报「能力未接」,⛔ 不猜);⑥ `ClearCache`/`ClearOnline` **显式人工**子命令(payload 构造 + 凭据三元组脱敏的 dry-run 预览;⛔ 编排路径零调用,默认 dry-run、`--yes` 才真跑)。另改两个**不在包内**的运维脚本(`scripts/*-windows.sh` 新增 `cache`/`plugins`/`clear-cache`/`clear-online` 子命令;`scripts/*-post-upgrade-check.sh` 新增两条只读段)。新增回归 `scripts/tests/*-webdriver-p1.test.py`(103 断言;桩/夹具,⛔ 不真开浏览器、不联网、不写真实数据目录)。⛔ 未新增运行期文件,故 `pack.engine` 清单不变。⚠️ 本批**未做**(如实保留):**选型解耦**(`ZINIAO_LIFECYCLE` + `ZINIAO_DRIVER`,审计 §3.1 第 2 行)—— 留待下一批。)|**1.2.97(2026-10-09,P0 注册表投影)**:共用引擎变更(`install-argent.mjs` 的 `--expect-sha256` 改为**一个包一个**摘要(可逗号分隔/重复给,数量不匹配=用法错)+ `--check-update` 合成**一条**可原样跑的「一起装」命令;`scripts/argent-capabilities.mjs` 加 **P2a 不变量**:投影落 `scripts/flow-requirements.json`(引擎级 base)前先摘掉不属于 base 的 `flows`/`aliases`)。能力包自身:包内注册表投影**只并引擎级段**(flow 不再抄进投影 ⇒ 与 `verticals/<id>/flows.json` 不再重复定义),并**同批带上** `verticals/<id>/flows.json`(旧包只带 manifest ⇒ 纯包装机 `flow_registry.py --json` exit 2)。判据:`scripts/tests/install-registry-loadable.test.mjs`(装完即加载注册表,五态)。|**1.2.98(2026-10-09,引擎锁跨平台化)**:共用引擎变更 —— 新增 `scripts/lib/argent_filelock.py`(模块名带 `argent_` 前缀 = **撞名防线**:PyPI 上有同名且极常见的 `filelock` 包,实测在 Windows 真机上被 `import filelock` 静默拿到过)(跨平台**排他文件锁唯一真源**:POSIX `fcntl.flock` / Windows `msvcrt.locking`,同一 API、同一锁文件约定),并把 `scripts/flow_claim.py` / `scripts/flow_ledger.py` / `scripts/telemetry.py` 的**顶层** `import fcntl` 与 `scripts/orchestrator.py` 的 **10 处**函数内 `fcntl` 全部换成它 ⇒ Windows 上认领/台账/遥测不再 `ModuleNotFoundError`(此前整个不可用),编排器的锁不再 `except: pass` **静默变 no-op**(互斥类 fail-closed、追加/审计类响亮降级 + 逐次计数)。⛔ 业务语义 / 数据格式 / 事件形状零变化:POSIX 侧与旧实现**逐字等价**(同一次 `flock` 调用、同一把锁文件、同一阻塞语义;`best_effort` 只在锁不可用时介入);同批 `pack.engine` 登记新文件。回归 `scripts/tests/filelock.test.py`(两进程抢锁 / 新旧逐字节对照 / 无 fcntl 可 import / Windows 分支桩测,52 断言)。(⚠️ 盖章说明:本版内容在同一工作树里经过**多轮收口**,以**最终内容**盖章;版本号从未发布过,不存在「内容变了版本没动」的对外窗口。三轮都来自**真机(Windows)实测**:① `import filelock` 与 **PyPI 同名包**撞车(探针当场拿到第三方的 `WindowsFileLock` 类)⇒ 改名 `scripts/lib/argent_filelock.py`(与 `argent_datadir.py` 同惯例)并同步四处 import;② Windows 无 `/tmp` ⇒ `lock_dir()` 的 Windows 缺省改用系统临时目录(POSIX 缺省**逐字不变**);③ **3 进程 ×15 条并发追加只活下 42 条**(Windows `_O_APPEND` 非原子)⇒ 根因是 `best_effort` 默认退成了**非阻塞**(旧实现是阻塞 `flock`),改为 `blocking=True` 默认并补回归(`filelock.test.py` §6b:持锁期间 append 必须**排队**,故障注入可复现变红)⇒ 复跑 45/45;④ 真机再实测出**强制锁挡读**:锁住数据文件**第 0 字节**会让别的进程**整文件读不了**(`flow_ledger.read()` 当场 `PermissionError`)⇒ Windows 锁区间挪到**文件内容之外**(第 2^40 字节起 **1 字节**;`LockFile` 允许锁到 EOF 之外且不分配、不改大小)⇒ 锁照样跨进程互斥、**读者零影响**(真机复验:持锁期间整文件读正常、解锁后可锁))|**1.2.99(2026-10-09,能力包地址真源收敛)**:共用引擎变更(`install-argent.mjs` —— ① `--capability` 的包地址**真源收敛**:有 install-ticket 清单 url 就用**清单的**(它与清单里的 sha256 同源 ⇒ \"地址+摘要\"成对可信),只有无账号/离线/清单没给 url 时才回落 `--pack-base` + 锁内版本自拼,且计划清单**逐条标注地址来源**(旧实现无条件自拼 ⇒ `--pack-base` 一整段绕开清单);② `--check-update` 主推 `--capability <服务端授予全集>`(不再要用户手抄四条 URL 与四个摘要),`--from-packs … --expect-sha256 …` 降为**离线/裁剪交付的进阶备选**另起一行;③ `--check-update` 对「显式零能力」账号改**中性提示**(exit 0)—— 旧实现把\"啥都没买\"报成\"拿不到服务端能力清单\"故障;判据换成\"服务端回没回 `capabilities` 字段\";`scripts/argent-capabilities.mjs` 的 `parseCapabilityManifest` 为此新增 `capabilitiesPresent`)⇒ 版本随引擎前进。同批 `scripts/release-argent.sh --check-dl` 新增**能力包档**(对服务端清单里每个包逐个 HTTP 取回 + `capability_pack.py --digest-tgz` 重算内容摘要 == 清单 sha256;不通过即判红)—— 该脚本与 `capability_pack.py` **都不在** `pack.engine`,故不改包内容。|**1.2.100(2026-10-09,同批二次收口:`--dsh-home` 必须同时决定数据目录)**:共用引擎变更(`install-argent.mjs` —— `DATA_DIR` 从**模块级 `const`** 改成**取值函数 `dataDirOf()`**。旧形态在 `--dsh-home` **解析之前**就求值 ⇒ 账本写进 `--dsh-home`、而 **packs-cache 写进默认 `~/.dsh/argent`**:后果不是\"多一个文件\",而是**定向安装/测试用的临时 home 会往真实 `~/.dsh` 里写**——\"⛔ 不碰既有 home\"当场不成立。同文件 `PRESET_ROOT` 早有同因修复(注释原文:\"const 提前求值会锁死默认 ~/.dsh\"),`DATA_DIR` 是漏网的那一个。**真机取证**:Windows 定向安装后 `C:\\Users\\<u>\\.dsh\\argent\\packs-cache\\` 多出 hr-0.1.41 / full-1.3.104 / invoice-1.2.99 / daily-report-1.1.106 四条(已逐条清除,回到原有 10 条);同场景换成 HEAD 版安装器可复现(`\\$HOME/.dsh/argent/packs-cache` 被创建)。无 `--dsh-home` 时 `dshHome = ~/.dsh` ⇒ 真实装机路径**逐字节零变化**。回归:`scripts/tests/install-capability-url-source.test.mjs`【E】(把子进程 HOME 也钉进临时目录,断言默认数据目录**没有被创建**)。|**1.2.101(2026-10-09,配置地基:配置目录 + 通用读取器)**:共用引擎变更 —— `pack.engine` 新增 `core/lib/config-catalog.mjs`(配置面的**唯一**读取器:五级解析链 env → 域 env 文件 → config.json → 业务线/机器本地文件 → 声明 default;API `get/require/sourceOf/isConfigured/all/describe/invalidate`;secret 项在 `describe()` 里**结构性**不回值)+ 5 个引擎级配置目录文件 `configs/*.json`(账号 / 通知与投递 / 宿主与机器 / 人事(HR) / 高级与诊断);业务线级目录 `verticals/<id>/config.json` 由 `capability_pack.manifest()` 随 manifest/flows **同批带上**(改了 `scripts/capability_pack.py` ⇒ 本次三个带 flow 的能力包内容都变了)。四道门禁:`node scripts/check-config-catalog.mjs --strict`(①双向对账 ②敏感不出门 ③必须项可解析 ④新增即生效)+ 回归 `scripts/tests/config-gates.test.mjs`(84 断言,含「注入假象必须变红」的自证)。⛔ 不改任何现有配置的取值行为(读取器是**新增**入口,现有调用方仍按自己的链路读;每项声明的 `todayChain` 如实记录「今天代码的优先级」,迁移时逐项核对)。契约见 `docs/Argent-宿主适配契约.md` §7。|**1.2.102(2026-10-09,配置地基第二批次:设置页「配置中心」+ 逐能力「检查更新」)**:共用引擎变更 —— `core/lib/config-catalog.mjs` 增「可写落点 / 旧优先级提示 / 分类 order」进 `describe()` 载荷,`configs/advanced.json` 把 `capability.checkUpdate` 的 `implemented` 如实改为 `true`,`install-argent.mjs` 的 `--check-update` 增 `--json` + `--capability` 过滤(设置页与命令行**同一份比对**)⇒ 版本随引擎前进(本能力的流程/提示词/脚本内容一字未改)。|**1.2.103(2026-10-09,变现分层落地)**:业务线清单 业务线清单 `verticals/<id>/manifest.json` 同批变更(`daily-report` 档位 `enterprise` → `pro`;本能力 `minPlan` **保持 `enterprise`** —— 门户写操作属企业版)⇒ 包内容随之变化,按纪律提版本。|**1.2.106(2026-10-09,预约失败判定链 + 口径统一)**:共用引擎 `scripts/flow_failure.py` 变更(新增 `canonical_reason()` 与 `--case` —— 打印某 case 的**规范失败原因**:优先读台账 `failed.reason`,老台账回落到 `error` 去身份前缀;给角色/运维一个**逐字照抄**的取数口,杜绝\"表备注写 A、账本写 B\")⇒ 所有能力包的注册表投影同批变化。本能力自身:本能力的流程/提示词/脚本内容一字未改(仅注册表投影与共用引擎前进)。(⚠️ **盖章说明**:本版内容在同一工作树里经过**多轮收口**(先落实现,再按 vertical-lint 的引擎业务词约束改注册表文案、再收口文案)⇒ 以**最终内容**盖章;版本号从未发布过,不存在\"内容变了版本没动\"的对外窗口。)|**1.2.107(2026-10-09,三处生产实测收口:票不许静默消失 · 失败必写原因+动作 · 发票流程 Rule R)**:共用引擎变更 ⇒ 四个能力包一起提版本并重盖章。① `scripts/flow_triage.py`:判定改为**有效末条事件**(`INFO_EVENTS = phase/wake/policy_apply/policy_new` 回退到最近一条状态性事件;`failed_ack` = 有意不动且**不参与回退**)、`blocked` 从「静默 pass」改为可见的 `needs_human`,并加**循环后对账兜底**(任何未归桶的 case ⇒ `needs_human`,kind=unclassified)——修的是客户机生产实测 P0(某发票票):其尾部是 `blocked → phase` ⇒ 分诊摘要全 0、运营勾了放行也不派发、且**不在「需人工」里**(静默卡死)。② `scripts/flow_failure.py`:新增运营文案**唯一来源** `ops_message()`(`结论:<业务类|系统类|我方缺陷类>|<原因>|动作:…`,≤300 字)与 `release_hint()`(放行位/提示的**唯一实现**:变体与**顶层** pick 都认;`orchestrator._ops_action_hint` 改为委托它);③ **新增** `scripts/invoice_fail_closeout.py`(属**发票能力专属脚本** `capabilities.invoice.pack.scripts`,⛔ 不进共用引擎 —— 它只写发票那一列):失败/成功收口 —— 把**同一串**写进表「发票错误信息」与台账(`detail` 逐字相同、`error` 放规范原因),取不到原因 ⇒ **exit 2 拒绝执行**,代码级异常归「我方缺陷类」且**不回原文**,成功 ⇒ `--clear-error` 清空;④ `scripts/flow_return_to_ops.py`:缺口回填文案改用同一来源(表字段 == 台账 `detail`);④b `scripts/flow_config.py`:归一化的 `guards` 增**标量透传**(`writer`=写手路径、`errorField`=失败原因列 —— 不透出就只能各自把路径/列名写死,那正是「判据第二份」与业务词泄漏进引擎的来源);⑤ 业务线声明(`verticals/<id>/flows.json`):两个发票流程新增 `pick.release` / `pick.releaseReDispatch`(放行位 = **各自的门控列**「发票就绪」;上限 3 / 冷却 30)与 `guards.errorField`。本能力自身:两条发票流程的技能(§6.2.1 / §6)与两份失败交接提示词各加「失败收口必须写表」口径(命令/红线/⛔ 不许手写 `--error-message` 两处各写一套)。|**1.2.108(2026-10-09,配置「生效来源」可见化 + 冲突告警,批 1)**:本能力自身:流程 / 提示词 / 脚本内容一字未改(仅共用引擎与注册表投影前进)。共用引擎 `core/lib/config-catalog.mjs` 新增**纯函数** `resolveEffective()`(按规范链算「谁赢了 / 谁被压住」)、密钥脱敏 `redactSecret()` 与读取器 `effectiveOf()/levelsOf()`,并新增只读 CLI `scripts/config-explain.mjs`(`--key/--all/--list/--json`)⇒ 能力包内容变化,按纪律提版本并重盖章。⛔ **零行为变化**:读取器的取值路径(`resolveOne`)与任何 `todayChain` 一个字节都没改,只是「如实展示」;同批回归 `scripts/tests/config-effective.test.mjs`(63 断言)+ 端点 / 页面两条既有回归扩测。|**1.2.109(2026-10-09,同批收口:脱敏闸幂等)**:只读 CLI `scripts/config-explain.mjs` 的\"再脱敏\"兜底闸原先**无条件**执行 ⇒ `❰已设置(长度N)❱` 里的 N 变成**占位串自己的长度**(恒 11,实测),而用户正是拿它比对\"密钥换没换\" ⇒ 已改为**幂等**(含被压住的那级)并补回归;引擎面同一份 CLI 变了 ⇒ 包内容变化,按纪律再提版本并重盖章。本能力自身内容一字未改。|**1.2.111(2026-10-10,A 批:按智能体安装清单 —— 客户从「智能体库」选一个装,只装它的东西)**:① **`pack.engine` 新增两项**:`agents/catalog.json`(L0 货架声明:agent → capability + flows 子集 + 角色 + 插件/技能/集成/凭据槽)与 `scripts/argent-agents.mjs`(声明解析/校验/清单构造;安装器与门禁**共用一份**判据)⇒ 引擎清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**,按「内容变 ⇒ 版本必变(含无 flow 的包)」这条不变式一起提版本);② **共用引擎行为变更**(`install-argent.mjs` / `scripts/lib/preset-install.mjs` / `scripts/argent-upgrade.mjs`):新增 `--agent <id>[,<id>…]` / `--list-agents` / `--internal-roles` / `--capability remove <id>`(写前备份 + 审计);preset **行落盘集合**改为「按清单收窄」(`--agent` ⇒ 恒装 + 本智能体角色 + 已装集;默认 ⇒ 客户可见集 + 已装集;**内部角色默认不落**);升级器按 `<dshHome>/argent/agents.json` **重新施加**同一集合(否则一次升级就把收窄还原);**未给 `--agent` 时 CLI 契约与计划清单输出与改动前逐字一致**(差分回归钉住);③ 本能力自身:⛔ 流程/提示词/脚本**一字未改**(只有引擎面与 pack.engine 前进);⚠️ 共享能力包**不拆**:`invoice` 里的两条 flow 仍在**同一个**包里,智能体层只做 **flow 子集投影**(按目录声明的 `flows` 子集收窄角色/技能/定时器;装其中一条不会把另一条的角色带下来,⛔ 也不拆包)。回归:`scripts/tests/agent-catalog.test.mjs`(110 断言,七条判据:只落本智能体 / 子集过滤 / 向后兼容差分 / 未知输入零写入 / remove 备份+审计 / 目录 schema / 内部角色默认不落)。|**1.2.112(2026-10-10,同批二次收口:宿主资产声明 + 门禁)**:同一工作树里第二次收口(先落 `--agent` 实现并盖章,再补 `capabilities.<c>.pack.hostAssets`(**宿主侧资产声明位**:定时器/登录自启/桌面项)与它的门禁 C12,并把 `scripts/argent-agents.mjs` 的清单/回执接上宿主资产)⇒ 引擎面文件内容变了,按「内容变 ⇒ 版本必变」纪律**再提一版**(先例同 1.3.104→1.3.105、`docs/Argent-智能体平台-设计.md` §8.3 第 3 条)。版本号 1.2.111 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**1.2.113(2026-10-10,同批三次收口:安装器用法文案 · 门禁登记 · 引擎面去业务词)**:同一工作树里第三次收口 —— ① `install-argent.mjs` 的**用法头注释**补上 `--agent` / `--list-agents` / `--internal-roles` / `--capability remove` 四个入口(内容变 ⇒ 引擎 sha 变);② `scripts/tests/is-direct-run.test.mjs` 的**唯一登记处**加入 `scripts/check-agent-catalog.mjs`(新增 CLI 必须登记,否则端到端判据覆盖不到它;测试文件不在包内,本条只为留痕);③ 本文件里本批新加的 `_note` 文案去掉业务词(`vertical-lint` 的 engine-words 档按**基线**只拦新增,⛔ 不抬基线 ⇒ 改写文案而不是改基线)⇒ 引擎面内容再变,按纪律**再提一版**。版本号 1.2.112 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**1.2.114(2026-10-10,FULL 自动路径成功率修复批)**:共用引擎变更 —— `scripts/flow_failure.py` 新增失败组 **`capacityFull`**(判据来自注册表 `failureClasses.capacityFull`,**排在 `needs_human` 之前** —— 否则仓容满的文案会被 `需运营` 吞进 needsHuman,就再也分不出是哪条链;派发 kind 仍是 needs_human);`scripts/flow_config.py` 新增配置中心入口 `appointment_max_day()` / `catalog_default()`(按 key 从声明面取 `default`,**不是**第二条解析链);`configs/advanced.json` 新增声明 `advanced.appointment.max_day`(**默认 5**,原 3 —— 本批**唯一的行为变更**);`scripts/flow-requirements.json#failureClasses.capacityFull` 是分类侧同一份口径。本能力自身:`scripts/orchestrator.py` 新增**仓容前置探测**(进步骤4 前只读探测:仓容满 ⇒ **不进入步骤4**、直接落 `capacity_full` 失败;探测不可用 ⇒ 证据不足、照常尝试)+ `defer_capacity` 当日解除链 + `--mode capacity-probe` 只读 CLI;新增 `scripts/ml_capacity_probe.py`(**纯判据**,只有 stdlib ⇒ 可离线夹具回归)与 `scripts/analyze-full-day.py`(只读归因报表)。回归:`capacity-precheck` / `capacity-defer-lift` / `analyze-full-day` 三份;`check-sop-consistency` 的 C6b 判据**收紧**(capacityFull/pageFlaky 也要与注册表逐字一致,⛔ 未抬基线)。⛔ 未新增引擎面运行期文件(只改既有引擎文件 + 本能力脚本)。|**1.2.115(2026-10-10,同批二次收口:契约 anchor 跟随实现)**:`core/contracts/argent.contracts.json` 的 J4-failure-classification 判据登记(engine 面文件,四个包里的三个含它)—— ① owner/implementations 的行号与 anchor 跟着`scripts/flow_failure.py` 重排走(89/91 → 118/121);② anchor 从 `GROUPS = (('pageFlaky'` 改成**更精确**的 `GROUPS = (('capacityFull', 'needs_human')`(初版写成 `GROUPS = (` 被 `argent-contracts` 的 R1d 当场拦下:`scripts/daily-report.mjs` 里也有同名字符串 ⇒ anchor 太松就是假绿);③ outputs 补一行「命中的**组**名进 reason」。⚠️ 版本号 1.3.124 从未发布过(同批收口 ⇒ 以**最终内容**盖章,不存在「内容变了版本没动」的对外窗口)。本能力自身内容未再改动。|**1.2.116(2026-10-10,同批三次收口:两处文档小节号 + 去掉未用常量)**:`configs/advanced.json` 的 help 里指的小节号写错(§8.71 → **§8.72**,那是本批新落的小节;写错会把运营指到别人的事故记录上);`scripts/flow_config.py` 去掉一个未被使用的模块级常量 `CATALOG_DIRS`(死代码只会误导下一个人以为它在参与解析链)⇒ 引擎面内容再变,按「内容变 ⇒ 版本必变」各提一个补丁版本并重新盖章。⚠️ 版本号 1.3.125 / 1.2.115 / 1.1.122 从未发布过(同批收口 ⇒ 以**最终内容**盖章)。⛔ 行为零变化(三份回归复跑全绿)。|**1.2.119(2026-10-11,同批:引擎面新增 `scripts/lib/cdp_ports.py`)**:本能力的流程 / 提示词 / 脚本**一字未改**;共用引擎新增 CDP 调端口发现/归属/页面探针的唯一实现(认领前环境预检第二层回退),包内注册表投影随之变化 ⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」提版本并重盖章。|**1.2.120(2026-10-12,Windows 安装路径三缺陷修复批)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `scripts/lib/preset-install.mjs`:**「已装集」判据改为选择痕迹** `presets.selection.json#kept`(⛔ 不再读 `package.json#dsh.bundle.patch` —— pnpm 对 `file:` 依赖建的是指向货架的链,读到的永远是货架自带的 14 条 ⇒ 收窄被自己的安装步骤抹掉),新增 `installedSelectionIds()` / `materializeBundleDir()`(软链**实体化**后再改写,⛔ 不走链写进仓库)/ `checkPresetSelectionConsistency()`(patch 实体 == presets.json 行 == dsh.bundle.patch == 痕迹);② `install-argent.mjs`:新增**第 7c2 步收尾重施**(第 7 步 `pnpm add file:…` 会把 profile 副本换回货架 14 个 ⇒ 旧实现在 winpc 真机\"声称只落 7/14、装完却是 14\",7 个内部角色永久留下)、版本体检改**两个候选落点**(克隆目录 + 安装器自己那棵树 —— Windows 的 boot 克隆场景,此前永远退回内置列表 ⇒ 现役 `0.1.7-rc.2` 被报\"未验证\")、`profile-doctor` 与升级器子进程**显式传 `DSH_HOME`**(否则 `--dsh-home <临时>` 时改的是真实 `~/.dsh`)、完成提示**按平台**给启动/重启指引(Windows 不再打 bash 的 `DSH_HOME=… dsh web …`);③ `scripts/lib/dsh-versions.mjs`:内置基线补 `0.1.7-rc.2` + 新增 `verifiedListGaps()` **防漂移门禁**;④ `scripts/argent-upgrade.mjs`:同一判据 + 收尾重施。⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个包一起提版本并重盖章。本能力流程 / 提示词 / 脚本**一字未改**。回归:`scripts/tests/preset-landing-selection.test.mjs`(48 断言:全新机器恰 7 个客户可见角色 / 客户机的 7 再跑安装**仍 7**(垫片 pnpm 中途真把它放大过)/ 14 坏态收窄到 7 / 三处集合+痕迹不变量 / 软链不走链改写仓库 / 真 pnpm 的机制证据)、`scripts/tests/dsh-verified-list.test.mjs`(21 断言:lock 里已晋级版本必须全在列表内(构造缺项 ⇒ 红)、`candidate/` 不参与、列表唯一真源、boot 克隆场景真跑一次)。⛔ 本批**未发布**(发布留给交付方)。|**1.2.121(2026-10-12,升级路径角色落盘追修批:已装集唯一来源 + 内部角色不变式)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `scripts/lib/preset-install.mjs`:「已装集」的**唯一来源**收口到 `resolveInstalledSelection()`(**可信痕迹** `presets.selection.json#kept` → 退回 `agents.json` 里各 agent 的 `roles` 并集 → 两级都没有 ⇒ **空集**=首次安装语义;⛔ **绝不**把 profile 里的 patch 实体 / `presets.json` 行 / `dsh.bundle.patch` 条目当已装集 —— 那三份铺完恒是 14,「客户可见 ∪ 已装 ∪ 本智能体」于是恒等于 14,收窄被自己的安装步骤抹掉),并给「可信」加了**判据**:痕迹含 `visibility: internal` 的角色而本机 `internalRoles ≠ true`(且未给 `--internal-roles`)⇒ 判不可信、**响亮报告**后按「痕迹缺失」处理(现场那份 `kept:14/excluded:[]` 的痕迹正是放大缺陷写出来的);新增**不变式** `checkNoInternalLanding()` —— 落盘集合不得含内部角色(除非 `--internal-roles` 或 `agents.json#internalRoles === true`),违反 ⇒ `applyPresetSelection()` **判红并拒绝写出**(⛔ 不静默剔除、不静默修);新增 `reseedBundleDir()` 与 `applyPresetSelection({reseedFromShelf})`(收尾重施必须**按货架重播再收窄**:副本已被削到 7 时就地再过滤永远只能得 7,`--internal-roles` 装不回来、自检还会拿「期望 14 ≠ 落盘 7」判**假红**);② `scripts/argent-upgrade.mjs`:**升级档与安装档同一条公式**(客户可见集 ∪ 可信已装集 ∪ 本智能体角色),⛔ 不再用 `agentScoped: agents.length>0`(它把客户可见集整个排除掉 ⇒ 现场那台只落 2 个角色);第 7.6 步收尾重施带 `allowInternal` + `reseedFromShelf`,判红即该步 `ok:false`;③ `install-argent.mjs`:第 4 步默认档 / `--agent` 子集 / 第 7c2 步收尾重施 / `--capability remove` 四处统一走可信已装集与授权口径(`--capability remove` 只为「本机已合法装了内部角色」时不误判红);④ **新增只读 CLI** `scripts/check-preset-landing.mjs`(四件套 + 已装集来源 + 两条不变式,任何一台机器可照抄自查,⛔ 不写任何文件)⇒ `pack.engine` 登记项 +1。**现场(winpc 真机,2026-10-12)**:profile 14 个 patch 实体 + 痕迹 `kept:14/excluded:[]` + `agents.json=[hr]` + `internalRoles=false`,重跑官网一条命令(升级路径)修前打的是 `preset 同步(行式): **14** 个角色` + `角色落盘集合收尾:14 个;三处集合 + 痕迹一致`(7 个内部角色一个没摘),修后同一台机器 ⇒ **7**(`excluded` 列出 7 个内部角色)并打印 `选择痕迹不可信 ⇒ 已装集退回 agents.json 角色`。回归:`scripts/tests/preset-landing-upgrade-path.test.mjs`(43 断言:现场复刻升级路径 ⇒ 7 且 **pre-fix 判据重建得 14**(鉴别力)/ `agents.json` 缺失 ⇒ 7 / 可信痕迹 7 不许放大 / `internalRoles:true` ⇒ 14 放行 / **不变式负样本判红且零写入** / 「铺货架 ≠ 选择」/ 现场真形态 `kept:14` ⇒ 7 且响亮报告 / 真 home 零增量)。⛔ 本批**未发布**(发布留给交付方)。本能力流程 / 提示词 / 脚本**一字未改**。|**1.2.123(2026-10-12,P1-A 宿主排程批:四道闸防线 + 日报试点声明)**:本能力的流程/提示词/脚本**一字未改**;共用引擎面变更(`scripts/flow_config.py` 新增 trigger.schedule 解析、`scripts/vertical-lint.mjs` 新增排程声明门禁、`scripts/lib/registry.mjs` 新增只读 flowSchedule())与**包内注册表投影**变化(业务线声明只动了日报;新增的 L1 `scripts/lib/schedule-probe.mjs` 与 L2 `scripts/argent-schedule.mjs` **刻意不进 pack.engine**,理由见 daily-report 的 `_note`)⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本并重盖章。新增回归 `scripts/tests/schedule-probe.test.mjs` / `scripts/tests/schedule-declaration.test.mjs`。|**1.2.126(2026-10-12,宿主门禁追修批:⛔ 不代装宿主 + npx 形态纳入宿主解析)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变,**含无 flow 的 hr**)——① `install-argent.mjs`:**删除** `--install-host` 代装入口(连同旧自动代装函数与宿主离线包的下载/解包/bin 链接逻辑;开关若仍被传入 ⇒ 报「该开关已废弃」+ **非零退出**(1 = 用法错误),⛔ 不静默忽略),被拒文案改为按 dsh **官方**运行方式给指引(首选 `npx @deepseek-ai/dsh@<窗口内版本> web`;备选官方「从源码运行」;四要素:① 你的版本不在支持窗口(列窗口)② 官方方式换成窗口内版本的一行命令 ③ 我们正在适配你的版本(⛔ 不给对外 ETA)④ 未改动你的 dsh);② **新增** `scripts/lib/dsh-host-resolve.mjs`(**进 `pack.engine`**):宿主解析链 = **PATH 上的 `dsh` → `DSH_BIN` → npx 缓存形态**(读 `<npm cache>/_npx/<hash>/node_modules/@deepseek-ai/dsh/package.json` 的 version,纯只读零网络;多候选按「最近使用优先(mtime 最新)+ 同刻路径升序」确定并**打印选了哪个**)⇒ **npx 形态算宿主**(旧口径「npx 不等于已安装宿主」作废),且 npx 形态下插件装配走**同一条 launcher**(`npx --yes @deepseek-ai/dsh@<版本> plugin --profile web add file:…`),⛔ 不许「检测到 npx 却去用 PATH 上的另一个 dsh」;③ `install.sh` / `install.ps1` 口径同步(ps1 仍声明并透传 `-InstallHost`,只为让旧命令行得到**可读**的「已废弃」原因而不是参数绑定错误)。本能力自身流程 / 提示词 / 脚本**一字未改**。回归 `scripts/tests/install-host-gate.test.mjs`(**219 断言**,纯夹具:垫片 dsh/npx + 本地裸库 + 临时 home,⛔ 零外网、⛔ 不碰真 `~/.dsh`;⚠️ `dsh plugin` 会绕过 `DSH_HOME`/`HOME` ⇒ 夹具只断言命令行、绝不真跑)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
166
|
+
"2026-10-12:仓容前置探测**误报**修复(判据收紧为「严格阻断形态」+ 手动/CLI 跑完落终态台账);注册表投影在每个包内 ⇒ 四包一起提版重盖。",
|
|
167
|
+
"2026-10-12:**材质英文解析链修复批**(本能力内容 + 文件集变更)——① 材质英文(模板 `S` 列 = `{材质},{材质英文}`)改为**三级解析唯一实现**:① per-SKU 字典(数据目录 `lip-sku-dict.json`,键=SKU,优先 `confirmed:true`)→ ② 通用小词典(映射真源 `materialEn`)→ ③ **会话传入 `--material-en`**(政策A:LLM 译出的可直接用);三级都没命中 ⇒ 填报阶段(P3)**阻断且不落盘**,文案**指路**;③ 命中 ⇒ **写回字典**(新增/合并条目 `confirmed:false` + 来源「LLM 译 <日期>(政策A:材质英文可直接用,HS 不动)」,原子写 `tmp`+`os.replace`,同键同值幂等跳过,**⛔ 不覆盖 `confirmed:true`**,同名不同值 ⇒ **冲突交人**且不写回 —— 与 `flow_case` 的「不覆盖 + 记冲突」同口径)。② **闸门改口径(修误阻)**:删掉误套在材质英文上的「英文为空 ⇒ 按报关敏感字段拦」(那条红线**只给 HS 编码**,HS 侧一个字节未动:仍人工维护 / 不预填 / 不写候选 / 不自动确认),改成「**三级都无法解析**才阻断」,阻断文案不再出现「报关敏感/不预填」。③ **影子放行闸门**:`S` 列由「按 `const` 逐字比」改为按 `perRow` 放行(该列随行变化,判据上移到填报器的三级解析);⛔ 其余 `const` 列判据未放宽(对照断言在位)。④ **文件集 +2**:模板填报器与影子放行闸门两个执行脚本此前**没在集成适配器 `RUNNERS` 里声明** ⇒ 不进任何能力包(纯包装机上 P3 / 放行闸门直接缺件)⇒ 本批在适配器里声明(包内容集由 `RUNNERS`/`TEMPLATE` 派生,⛔ 未动 `pack.engine` ⇒ 其余三个包不跟版)。⑤ 文档:两条发票线的技能写明**两份字典**的存在/路径/优先级/写回规则与 **HS(人工) vs 材质英文(三级 + LLM 可译)** 的分界;列契约由真源重新生成(`--check` 绿);适配器与流程提示词的「等报关敏感字段」措辞收紧为「只指 HS」。回归:新增材质英文三级解析回归(**75 断言** / 七条判据:① 字典命中 ② 会话传入+写回 ③ 阻断文案 ④ 小词典 ⑤ HS 红线对照 ⑥ 幂等·不覆盖·冲突·原子写 ⑦ 真 home 零增量,含 **pre-fix 判据重建**的鉴别力证据);既有影子对比回归 9→14 断言、模板填报与技能自检复跑全绿。⛔ 本批**未发布**(发布留给交付方)。",
|
|
168
|
+
"2026-10-12(同批**二次收口**):1.2.128 盖章后本批又改了一处文案(填报器文件头的一行措辞 + 列契约注释)⇒ 按「内容变 ⇒ 版本必变」**再提一版**并重盖章。⚠️ 版本号 1.2.128 从未发布过(同批收口 ⇒ 以**最终内容**盖章,不存在「内容变了版本没动」的对外窗口)。行为零变化(三级解析 / 闸门 / 写回判据一个字节未改;复跑回归全绿)。",
|
|
169
|
+
"2026-10-12(门户并发踩踏/死锁修复批):包内容变更 —— 门户模块的 `connect()` 改为**每条跑批一个自己的标签页**(默认 `context.new_page()`,返回 `PortalSession`,调用方 `finally` **只关自己那个页**;⛔ 不动用户自己开着的页),并新增**每门户一把有界 flock** `portal_lock()`(`<数据目录>/` 下的门户锁文件,默认 300s / `WENYAO_PORTAL_LOCK_TIMEOUT`,抢锁每 15s 打印一行,超时**明确失败**、⛔ 绝不无限等待)、下载行为按 `browserContextId` 收到本票 context + 下载归属校验(文件名 8 位票号 / 包内容);编排器把 P6→P14 包进该锁并打印「本次标签页|锁|票」起止两行;技能(SKILL/pitfalls/portal-flow)与流程提示词补口径。事故:三条票 79212271/79298694/79210359 同时派发后抢同一个 page ⇒ 死循环。⚠️ 只提**本能力包**版本(未动 `pack.engine`);回归为 `scripts/tests/` 下的门户隔离用例(72 项,纯夹具零网络)。",
|
|
170
|
+
"1.2.132(2026-10-12,P1-3 宿主窗口与 scope 定位批):共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `install-argent.mjs`:**空 `- insert:` 清理**(审计 §C.1 #1)——生成侧改走真源渲染器 `scripts/lib/patch-compose.mjs#renderInsertBlock()`(空数组 ⇒ **不再产出**空块;旧实现内联渲染且不看空数组);修复侧用 `stripEmptyInsertBlocks()`(只清\"真空白\"的块,⛔ 不碰有子项的 insert;幂等),**写前备份**(`<数据目录>/backup/patch-<profile>-<时间戳>/`,含 sha256 与逐字可照抄的回滚命令),⛔ 备份失败就**不改客户文件**;② `scripts/lib/dsh-scope.mjs`:**平铺档 `<dir>/node_modules/.bin/dsh` 上移进真源**(`scopeBinCandidates()`;本批把 P1-0 暂存在 `bootcheck-wiring.mjs#bootcheckBinCandidates()` 的那份副本**删除**,两处不再各自实现),并新增 `resolveDshScopeDir()`(标准 / 邻居 / 平铺三种布局 + 认 `--scope-dir` / `DSH_SCOPE` / `--global-bin` / `DSH_BIN`;⛔ 探不到 ⇒ 回 null 让调用方**响亮失败**,⛔ 不静默回退到 `npm root -g` 猜一个)给安装器 `scopeDirForPreset()` 用 ⇒ 消客户机 scope 探测陷阱(`npm root -g` 在那里报的是错路径,真身在 `<prefix>/node_modules/@deepseek-ai`);③ `scripts/lib/patch-compose.mjs#composeFix` 写回前过清理器 —— 实测:它的规则①(bundle 层迁移)会把只剩一个子项的 `- insert:` **掏空** ⇒ 升级路径上空块**又回来**(同一次真跑复现)。⛔ `pack.engine` **清单未变**(本批零新增文件)⇒ **无 flow 的 hr 不跟随提版**。本能力流程 / 提示词 / 脚本**一字未改**。回归:`scripts/tests/patch-empty-insert.test.mjs`(34 断言)、`scripts/tests/dsh-scope-resolve.test.mjs`(33 断言)、`scripts/tests/install-scope-window-patch.test.mjs`(49 断言,端到端:夹具 lock **根**放\"假快照\" ⇒ 窗口**立刻**含它、移到 `candidate/` ⇒ 立刻不含;客户机邻居布局判出**行式**;`DSH_BIN` 指向平铺树判出**目录式**;显式给错的 `DSH_SCOPE` ⇒ **响亮失败**;空 insert 清干净 + 备份/回滚可用 + 幂等 + 升级路径不回潮;真 `~/.dsh` **零增量**)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
171
|
+
"2026-10-12(0.5.0 真机验收缺陷批:插件依赖图 / 落盘跟随已装智能体 / 空 insert 收尾 / 升级路径 venv):共用引擎变更(只改 install-argent.mjs 一个引擎面文件 ⇒ 引擎 sha 变、每个带引擎的包内容都变,**无 flow 的 hr 不跟随提版**)——**A(阻断级)插件必须进 profile 依赖图**:真机现场「exit 0 但装出来是半残」——profile 的 package.json#dependencies 里只有角色挂载面那一条,两个应用级插件只在 node_modules/ 里有实体,而 0.2 的宿主**只加载依赖图内的插件** ⇒ 启动日志报 failed to import 且安装期**零报错**。根因:宿主无包管理器时安装器**静默**改走「把插件目录拷进 node_modules」并 exit 0。现在三条口径:① **优先真·注册**(npx 形态 + 真实 home ⇒ 走**同一条 launcher** 的 plugin --profile … add file:…;其它形态 ⇒ 用**已解析的包管理器**在 profile 目录做同一件事,cwd = profile 目录);② 宿主没有 pnpm ⇒ **借一个**(corepack / npx --yes pnpm@<钉住版本>,可用 ARGENT_PNPM_SPEC 覆盖)并把**实际使用的包管理器与版本**打进日志,⛔ 不再 npm install -g;③ 借不到或注册失败 ⇒ **非零退出 + 明确指引**(文案含「缺包管理器」与两条出路),⛔ **绝不**退回「拷贝后 exit 0」。另加**收尾依赖图自检**:断言本次注册的每个包都在 dependencies 里、spec 与本次 argv 的 file:<插件目录> 同源(按 realpath 比对,吸收包管理器的路径规范化),且**能被 profile 解析**;任一条不满足 ⇒ 非零退出 + 打印「怎么修」(⛔「实体在 node_modules 就算过」是假绿)。**新装与升级两条路径共用同一份实现**(真机两次跑都出了同一个半残形态)。**B 落盘集合跟随「已装智能体」**:旧口径是「客户可见集 ∪ 已装集」⇒ **只装壳也会落一批属于未装智能体的角色**(真机现场:7 个外发角色里有 4 个 ML 系 + 5 个 ML 技能,而对应智能体根本没装 ⇒ 那些角色行引用的插件不存在、启动报 never started)。新口径 = **基座集**(角色清单里声明「与智能体无关、恒装」的那些)∪ **已装智能体面**(智能体目录里该智能体声明的角色;「已装」= 装机账本 ∪ 本次点名);技能同理(并清理「属于货架技能世界、但没装它的智能体」的孤儿,⛔ 内部角色/用户自建技能只报告不删)。⛔ **未改智能体目录的声明语义**,口径一律取自仓库既有真源。**C 空 `- insert:` 收尾**:定位到写入点 = 组合校正侧(profile-doctor --fix 会按退役/重复挂载**删行**,把某个 `- insert:` 掏空,而它**没有**过空块清理器);现在**所有会动 profile 的步骤之后**再过一遍清理器(幂等、写前备份 + 回滚命令),并**硬断言空块数 = 0**(判红即非零退出)。**D 升级路径也建/校验 venv**:升级分支在「新装专属」的建 venv 步之前就退出 ⇒ 真机第二次跑 exit 0 但持久运行时不存在(定时器照跑、什么也不做);现在升级路径同样调用同一份运行时准备(版本门禁、支持 --python-bin、建完真 import 校验),失败即非零退出。回归:新增 scripts/tests/install-plugin-graph-and-landing.test.mjs(77 断言:无包管理器 ⇒ 非零且文案含「缺包管理器」且**无插件实体** / 借用可用 ⇒ 真调注册路径且依赖项落地 / 依赖图自检能判红 / 只装壳 ⇒ 落盘 = 基座集(零 ML 角色与技能,内部技能保留)/ 计划清单列出 ML 角色与技能 / 空块端到端 = 0 且幂等 / 升级路径建 venv、--python-bin 透传、失败路径非零),并把受影响的既有夹具换成**忠实**的包管理器垫片(报版本 + 真写依赖边;旧的「空操作垫片」= 假成功,本批起会被正确地判红)。⛔ 本批**未发布**(发布留给交付方)。(⚠️ 盖章说明:本版内容在同一工作树里经过**多轮收口**(先落实现并盖章,再补注释/文档收口)⇒ 以**最终内容**盖章(`--stamp --force`);版本号从未发布过,不存在「内容变了版本没动」的对外窗口。)",
|
|
172
|
+
"0.6.0 W9:插件发布为 @whyshu/argent-*(用户名 scope)+ 消费路径改 npm 名(保留 file: 回退)+ 发布流水线(预检/逐包/回读退避/审计);包名迁移与 profile 行/生成器同批改透。引擎面在制:install-argent.mjs、check-preset-landing.mjs、lib/{patch-compose,plugin-lifecycle,preset-install}.mjs。",
|
|
173
|
+
"0.6.0 W9 收口(补件):`pack.engine` **新增** `scripts/lib/plugin-packages.mjs` —— W9 把「插件 id ↔ npm 包名」收口成这一份唯一真源(`PLUGIN_PACKAGES` / `pluginIdOf` / `npmNameOf` / `fileSpecOf` / `npmSpecOf` / `migrateDependencyKeys` / `migratePluginRowNames` 支撑),而它被**两个已在引擎清单里**的文件**静态 import**:`scripts/lib/plugin-lifecycle.mjs` 与 `scripts/lib/preset-install.mjs`。未登记 ⇒ 打出来的包里没有它 ⇒ 装完第一次 `import` 就 `ERR_MODULE_NOT_FOUND`(不是静默降级,是**必崩**)。判据 = `node scripts/check-pack-closure.mjs`(修前:full / invoice / daily-report **各缺 1 件**,逐条点名 `plugin-packages.mjs`;修后缺件 0)。本文件是**纯 node 内建**(只 `import { readFileSync } from 'node:fs'`)⇒ 满足 `kernel-purity` 的 L1 约束。⚠️ `pack.engine` 是**分发清单**,而每个包的 tgz **都带一份注册表投影**(含 `pack.engine`)⇒ 改的是清单本身 ⇒ 四个包**全部**变字节,**含无 flow 的 hr**(它不背引擎文件,但背注册表投影)——一并 +1 patch 并重盖章,否则同一个版本号会对应两份字节(正是 `release-argent.sh --check-dl` 的能力包档要抓的形态)。⚠️ 与既往批次的判据区分:**只改**引擎面文件而**不动清单**时,`hr` 才不跟随提版(先例 1.3.142→1.3.143)。回归:`scripts/tests/pack-closure.test.mjs` + `check-pack-closure` 缺件 0。",
|
|
174
|
+
"0.6.0 W9 补丁(profile 面向字符串漏迁 scope):只改**引擎面文件**、⛔ **未动** `pack.engine` 清单本身 —— `scripts/lib/plugin-packages.mjs` 新增 `migrateBundleNames()` / `exactPluginIdOf()` / `canonicalPluginName()`(**读侧宽松、写侧严格**:路径形态只用于读,改写 profile 只认「裸 id」与「本仓 npm 名」,否则会把别的 scope 的同名包改写成我们的);`scripts/lib/plugin-lifecycle.mjs` 新增 `bundleLayerRows()`(bundle 名单用 id 声明、名字经真源合成);`install-argent.mjs` 新增 `normalizeProfileBundles()` 与 `pruneStaleBareLandings()`(写前备份 + 逐字回滚命令,备份失败即不改客户文件);`scripts/argent-upgrade.mjs` 补齐升级路径上**从未执行**的四类迁移(`ensureBundles` 不再把 id 直接写进 `dsh.profile.bundles`、`normalizeDepKeys`、`fixPatch` 给所有已知 id 归一行名、`syncPlugins`/`migrateBareLandings` 落位目录改包名);`scripts/profile-doctor.mjs` 补必需行不再写裸 id + 重复挂载判据认包名。真机形态(用户机器,0.2.0-rc.2):`dsh.profile.bundles` 里留着裸名 ⇒ 该 bundle **解析不到** ⇒ 皮肤/UI 壳**静默不加载**(安装期零报错)。判据:新增门禁 `scripts/tests/profile-scope-migration.test.mjs`(静态 sink 扫描 + 注入自证 + 接线逐点断言 + 夹具实跑)与 `scripts/tests/install-plugin-graph-and-landing.test.mjs` §9(预置四处全裸名 ⇒ 重跑安装命令 ⇒ 全部 scoped、无残留、幂等)。⚠️ 版本轴:**只改引擎文件**、⛔ 不动 `pack.engine` 清单 ⇒ 只有含引擎文件的三个能力包内容变(无 flow 的那个包不背引擎文件、摘要未变 ⇒ **不跟随**,先例 1.3.142→1.3.143)。⚠️ 盖章说明:本版内容在同一工作树里经过三次收口(① 落实现与门禁 ② 补本 `_note` ③ 收口若干注释与 doctor 的读侧点名)⇒ 以**最终内容**盖章;各次版本号都未发布过,不存在「内容变了版本没动」的对外窗口。",
|
|
175
|
+
"0.6.0 W2(2026-10-13,壳 bundle):**只改引擎面文件、⛔ 未动 `pack.engine` 清单本身** —— ① `plugins/argent-shell/`(新包:纯 bundle,零源码、零宿主 import;`dsh.bundle.patch` + `dependencies` = core/skin/presets 三条);② `scripts/lib/plugin-packages.mjs` 的 `PLUGIN_PACKAGES` 登记该壳(安装器与发布流水线同一份真源 ⇒ Lead 可用 `npm-publish-argent.mjs --only argent-shell` 发它);③ `install-argent.mjs` 第 7 步改为**壳优先**:`dsh plugin add @whyshu/argent-shell@<版本>`(官方路径)⇒ 依赖图由包管理器维护(core/skin/presets 走 hoisted 落 profile 根);壳装不上 ⇒ **回退**逐个插件注册,壳装上了但个别壳插件不在依赖图内 ⇒ **修补**那几个(既有逐插件路径逐字保留);④ 收尾自检(7c4)**新增**判据:`@whyshu/argent-shell` 在位时其三个依赖也必须能被 profile 解析(否则判红)。⚠️ 版本轴:**只改引擎文件、不动清单** ⇒ 含引擎件的三包内容变 ⇒ full/invoice/daily-report 各 +1 patch;**无 flow 的 hr 不跟随**(它只背 preset 目录,摘要逐字节未变 —— 判据 `--check-stamp` 实测)。回归:`scripts/tests/shell-bundle-assembly.test.mjs`(53 断言:官方路径壳优先 + 依赖图齐 / 离线 file: 回退仍走官方 launcher / 缺包管理器非零退出 / 存量 profile 幂等且无重复条目 / 两条有牙自证)+ `plugin-peer-coverage` 新 25 断言(纯 bundle 的显式豁免 + 4 条牙)+ `plugin-official-add-path` 39/0 与 `install-plugin-graph-and-landing` 106/0 未放宽。⛔ 本批**未发布**(发布留给交付方)。",
|
|
176
|
+
"0.6.0 W3(2026-10-13,agent = 一个 bundle):**只改引擎面文件、⛔ 未动 `pack.engine` 清单本身** —— ① 新增 6 个纯 bundle 包 `plugins/argent-agent-<id>/package.json`(零 JS;`dependencies` = 壳 + 该智能体声明的非壳插件;`dsh.bundle.patch = []`(合法空层:core/skin 由壳 insert、gateway/flow/ml 的挂载面仍是整装 + 设置页);**包内声明** `argent.agent{payload{capabilities,plan},flows,roles,skills,integrations,credentials,scheduler,plugins}`);② 新增生成器 `scripts/gen-agent-bundles.mjs`(声明驱动:`--check` 逐字节比对 + `catalog ⟺ 恰好一个 bundle` 双向 + 目录声明自检;产物禁止手改);③ `agents/catalog.json` 补 `argent-ml` 声明(5 个 ML 智能体的 `plugins` + 说明表)—— 此前漏声明 ⇒ 生成器无从推导「ML 类要装它」(⛔ 不许写死);④ `install-argent.mjs`:`--agent` 解析阶段读**包内声明**并与货架投影**逐字比对**(不一致 ⇒ 零写入 exit 2),用包内声明重建安装清单;landing 收尾新增 `installAgentBundlesAndSelfcheck()`(① 官方路径装 bundle `dsh plugin add @whyshu/argent-agent-<id>@<版本>` / 离线回退 `file:` ② 按声明装能力包 ③ 落盘集合语义不变 ④ 收尾自检四条:在依赖图内 ∧ 依赖可解析 ∧ 能力包已装 ∧ 角色/技能按声明落位 ⇒ 任一不满足 exit 1;装完再**重施一次角色落盘集合** —— 包管理器会把 presets 副本换回货架全量,与第 7c2 步同一份实现);注册机新增 `registerAgents()`/`registerAllWithBundles()`(agents 为空 ⇒ 逐字等价);顺带修掉一个既存 TDZ:`PNPM_BORROW_SPEC` 声明上移(`--agent`/升级路径都在第 7 步之前调装配机);⑤ `scripts/argent-agents.mjs` 回执的「其它插件」宇宙排除 `argent-shell` 与 `argent-agent-*`(它们是基座/智能体本身,不是「可以另外装的插件」);⑥ `scripts/lib/plugin-packages.mjs` 登记 6 个智能体 bundle ⇒ Lead 可用 `npm-publish-argent.mjs --only argent-agent-<id>` 发布。⚠️ 版本轴:**只改引擎文件、不动清单** ⇒ 含引擎件的三包内容变 ⇒ full/invoice/daily-report 各 +1 patch;**无 flow 的 hr 不跟随**(它只背 preset 目录 —— 判据 `--check-stamp` 实测其内容摘要逐字节未变)。回归:`scripts/tests/agent-bundle-generation.test.mjs`(57 断言,含 4 条牙)+ `scripts/tests/agent-bundle-install.test.mjs`(56 断言:官方路径 / 离线 `file:` 回退 / 老克隆逐字回退 / 幂等 / 5 条牙 —— 含「只落实体不写依赖边 ⇒ 自检判红」);`plugin-peer-coverage` 24→25(纯 bundle 豁免由货架派生 + 扫描面显式改数)、`kernel-purity` 63/0(新增 L2 层标注)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
177
|
+
"0.6.0 W3(同批二次收口,2026-10-13):同一工作树里**第二次**以最终内容盖章 —— 首次盖章后又落了两处**在 `pack.engine` 里**的收口:① `scripts/lib/plugin-packages.mjs` 不再逐条列智能体 bundle 的名字,改成**前缀规则**(`AGENT_BUNDLE_PREFIX` / `isAgentBundleId`,接进 `pluginIdOf`/`npmNameOf`/`packageMetaOf`/`exactPluginIdOf`)—— 名字带业务线词,逐条列进引擎面会脏掉 `vertical-lint` 的 engine-words 判据(基线 0 新增 = 红);② `scripts/vertical-lint.mjs#engineFiles()` 为**生成产物** `plugins/argent-agent-*/package.json` 加**结构性豁免**(与既有的 `capability-packs.lock.json` 同一条理由:生成产物、无人手写、必然带商品名;业务词真源 `agents/catalog.json` 不在扫描面内,⛔ 基线文件一字未动);同批 `scripts/npm-publish-argent.mjs` 按前缀**现扫** agent bundle 认包(发布面 7 → 13)。⚠️ 按「内容变 ⇒ 版本必变(含无 flow 的包)」,本版为**最终内容**;版本号 1.3.152 / 1.2.141 / 1.1.145 从未发布过(不存在「内容变了版本没动」的对外窗口)。⛔ hr 仍不跟随(其摘要逐字节未变)。",
|
|
178
|
+
"0.6.0 现场纠正(2026-10-13):发票「产品英文名称」只保留**直译名** —— 提示词改为\"直译、⛔ 不带材质/颜色/规格括号注释\",并新增 strip_name_parens() 在「读字典 / 收 LLM 结果 / 写 xlsx / 固化字典」四处清洗(幂等、只去尾部括号、清空则回退);现场:某货代发票已生成单据出现 `150mm Digital Caliper (Zinc Alloy)` 一类括号注释。",
|
|
179
|
+
"0.6.0 W3 收口:vertical-lint 的 `--root` 修 —— 注册表/数据面子脚本一律按 **lint 自身目录**定位,`--root` 只换注册表根(此前夹具根下无该脚本 ⇒ 子进程 ENOENT ⇒ 报「注册表合并失败」假红,core-sop-skill 夹具被误伤)。",
|
|
180
|
+
"**1.2.145(2026-10-13,失败自动重试(方案 a)批)**:`pack.engine` 新增 `scripts/flow-auto-retry.py`(可用性类失败的**受守卫自动重试**:候选 = 末条 failed/blocked ⇒ 唯一分类器判 `retryable` + 预约闸门放行 + 每票次数上限 + 冷却 + 每轮上限;真正的\"重置后重建\"**全部委托** `flow_retry.py`(走它的全部守卫),本脚本只做筛选/限流/可见性)+ `scripts/flow_config.py` 新增 `autoRetry` 段(**唯一读取点**:enabled/max/cooldownMin/perCycle,缺省 开/2/20/2)+ `scripts/flow-trigger.sh` 新增一步「先自动重试、再认领」(非零退出**不阻断认领**)。⇒ 引擎清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**),按「内容变 ⇒ 版本必变(含无 flow 的包)」四包一起提版本。本能力自身:流程 / 提示词 / 脚本一字未改。",
|
|
181
|
+
"**1.2.146(2026-10-13,失败自动重试(方案 a)批 · **同批二次收口**)**:首次以最终内容盖章(c99a04f)后又落了一处**在 `pack.engine` 里**的收口 —— `scripts/flow-auto-retry.py` 的次数上限改为按**尝试**计(台账 `retry` 事件数 + 本脚本审计里 `ok:false` 的被拒次数):委托侧拒绝时**不写**台账事件,只数台账会让\"每轮都会被拒\"的票(表里状态已不是失败 / 表备注分类或预约留痕与台账不一致…)**每轮**再试一次、长期白占\"每轮上限\"的名额并每轮刷卡片/审计 ⇒ 现在最多 `max` 次后明确交人工(日志点名\"其中 n 次被委托侧拒绝\")。题外(⛔ 本批不改):`scripts/flow_retry.py` 的\"缺陷④ 已有货件号默认拒绝清号\"闸门因调用了**未定义**的 `one()` 而被 `except Exception` 静默吞掉(实测 `NameError` ⇒ `ship_now=None` ⇒ 闸门事实上不生效)—— 属该文件的既存缺陷,**未动**(改它 = 改变守卫语义,需专门一批)。⚠️ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四包一起再提一版;版本号 1.3.155 / 1.2.145 / 1.1.148 / 0.1.66 从未发布过(同批收口 ⇒ 以**最终内容**盖章,不存在\"内容变了版本没动\"的对外窗口)。",
|
|
182
|
+
"发票技能口径更正(用户 2026-10-13 拍板):**表内已填的「材质」「HS 编码」照填入发票**,⛔ 不再因\"材质类别与 HS 章看起来不一致\"而停下等核对;HS 红线只约束\"表内为空时不得编造\"。落点:skills/ml-invoice/SKILL.md(新增「口径」小节)+ skills/ml-invoice-该流程/SKILL.md(同口径一行)。",
|
|
183
|
+
"缺产品图 ⇒ 写「发票错误信息」提示运营补图(用户口径 2026-10-13):预检 precheck 新增「缺产品图(运营补)」缺口(此前清单里没有产品图这一项,现场 79408052/79406731 无图却零提示);夹具 invoice-image-gap.test.py(6 断言,含有牙)。",
|
|
184
|
+
"修 flow_retry.py 的**死守卫**(2026-10-13):清号守卫原写 `one(row.get(f_ship))` 而本文件无 `one()` 定义 ⇒ NameError 被 `except Exception` 静默吞 ⇒ 已有货件号也会被清号重置(红线从未生效);改用唯一取值助手 `first()` 并去掉吞噬;新门禁 scripts/tests/flow-retry-guard4.test.py(15 断言,含两条有牙)。",
|
|
185
|
+
"缺产品图缺口文案统一(用户口径 2026-10-13):另一条发票链此前把**表头名**当缺口文案,现统一为「缺产品图(运营补)」(两条链同句),表头名改记入 notes 溯源;落点该链填报器的 image 分支;测试同步断言(含\"不再是表头名\")。",
|
|
186
|
+
"**W7.7(2026-10-14,尾巴收口:智能体标题去掉「角色」字样 + 死指针改指新落点)**:本批改了 `pack.engine` 里的两件(`agents/catalog.json` 的两个 `title`、`configs/hr.json` 的 label/help)与本注册表自身的一处(`hr` 设置面板的 `hint`)⇒ 清单本身变了、且每个包的 tgz 都带一份注册表投影 ⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个能力包一起提版本并重盖章。口径:**角色 = DSH preset**,Argent 侧不复述角色清单(会话身份 ⇒ 官方「Agent 预设」区;安装 / 升级 ⇒ 设置 → Argent →「我的智能体」)。⛔ 本能力自身的流程 / 提示词 / 脚本一字未改。",
|
|
187
|
+
"**1.2.160(2026-10-14,P1-B `--no-wake` + 外部时序运营文案)**:共用引擎变更(`scripts/flow-trigger.sh` 新增 `--no-wake` —— 只认领 + 只写台账、不唤起会话;`scripts/lib/schedule-mechanism.mjs` 的 native 静态指令 `promptCommand` 带上该开关(宿主排程那条命令);`scripts/flow_triage.py` 的外部时序阻塞文案补齐两要素 —— 自动再试节奏(N 取声明面 `externalTiming.cooldownMin`)+ 人工接管方式(取消勾选放行位即停取);`scripts/run-tests.sh` 的干净树自检按判据 `[ -d .git ]` 跳过「需要 git 索引」的用例)⇒ 版本随引擎前进。本能力自身:发票链运行器的表字段文案同批更新(同一句、纯文本版),两份发票技能文档同步。⚠️ 盖章说明:本版内容在同一工作树里经过**二次收口**(先落实现,再按 `vertical-lint` 的 engine-words 判据改写文案 —— ⛔ **不抬基线**)⇒ 以**最终内容**盖章;版本号 1.2.160 从未发布过,不存在「内容变了版本没动」的对外窗口。",
|
|
188
|
+
"0.6.0 发版:平台 VERSION 0.4.0→0.6.0、契约 argentVersion 同步、宿主窗口晋级 0.2.0-rc.2;agent bundle BUNDLE_VERSION 0.1.0→0.1.1(内容随\"标题去角色\"变化,避免同版本换字节)。",
|
|
189
|
+
"0.7.0 W2:流程声明补 `runner`(三条流程)+ 门禁 flow-runner-declared(脚本须存在、args 须带 {ticket})。",
|
|
190
|
+
"0.7.0 W2:daily-report 补 runner 声明(ticketless)⇒ 全部流程 runner 齐;门禁收紧到\"0 未声明\"。",
|
|
191
|
+
"0.7.0 W2:`runner` 登记进 flow_config 顶层直通段与 _derive(否则 --json 不透出 ⇒ CLI 读不到声明)。",
|
|
192
|
+
"0.7.0 W5/W7:引擎包白名单纳入 `skills/`(CLI `skill show|sync` 的真源;此前包内没有技能)。",
|
|
193
|
+
"0.7.0 W8/S1:路径统一(22 个脚本改走唯一判据)触及本包成员 ⇒ 按纪律提版重盖章。"
|
|
194
|
+
],
|
|
195
|
+
"hostAssets": {
|
|
196
|
+
"scheduler": {
|
|
197
|
+
"required": true,
|
|
198
|
+
"install": "print-only",
|
|
199
|
+
"perFlow": true,
|
|
200
|
+
"command": "bash {home}/scripts/flow-timers.sh install --flow {flow}",
|
|
201
|
+
"_note": "安装器**只打印**(⛔ 不自动装,见设计文档 §7.3⑥):装完先别开,确认配置齐了再启用。"
|
|
202
|
+
},
|
|
203
|
+
"loginAutostart": {
|
|
204
|
+
"required": false,
|
|
205
|
+
"install": "opt-in-flag",
|
|
206
|
+
"flag": "--win-autostart",
|
|
207
|
+
"_note": "Windows 登录自启是**显式 opt-in**(默认不建);macOS 由 LaunchAgent com.whyshu.dsh-web 托管。"
|
|
208
|
+
},
|
|
209
|
+
"desktopShortcut": {
|
|
210
|
+
"required": false,
|
|
211
|
+
"install": "none",
|
|
212
|
+
"_note": "今天没有任何能力需要桌面项;保留键位是为了新增宿主时有声明位(⛔ 不许各宿主各写一套)。"
|
|
213
|
+
},
|
|
214
|
+
"_note": "宿主侧资产声明位(A 批,2026-10-10;补《Argent 智能体平台 设计》§8.3 第 3 条的缺口:能力包此前**没有任何宿主侧资产的声明位**,定时器/自启这类事只能由安装器**写死**推断)。字段语义:`required` = 该能力**是否需要一个常驻定时器**(无 flow 的能力必须 false —— 没有可定时的东西);`install` ∈ {`print-only`(安装器只**打印**命令,客户按需自行启用), `auto`(安装器自动注册), `none`};`perFlow` = 是否**逐条 flow** 一个定时器(判据 = 该能力名下的 flow 数);`command` = 用户可照抄的命令模板(`{home}` / `{flow}` 占位)。⛔ `loginAutostart` / `desktopShortcut` 今天一律 required=false / install∈{opt-in-flag,none} —— 如实声明现状,⛔ 不把\"我们希望有的\"写成\"已支持\"。门禁:`node scripts/check-agent-catalog.mjs`(C12:枚举合法 + required 与 flow 数自洽 + 与智能体目录的 `scheduler` 逐条一致)。"
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
"full": {
|
|
219
|
+
"gate": {
|
|
220
|
+
"status": [
|
|
221
|
+
"",
|
|
222
|
+
"待执行"
|
|
223
|
+
],
|
|
224
|
+
"release": {
|
|
225
|
+
"field": "就绪",
|
|
226
|
+
"equals": true
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
"stateFields": [
|
|
230
|
+
"FULL状态",
|
|
231
|
+
"就绪",
|
|
232
|
+
"当前步骤"
|
|
233
|
+
],
|
|
234
|
+
"producedFields": [
|
|
235
|
+
"FULL标签文件",
|
|
236
|
+
"FULL箱唛文件"
|
|
237
|
+
],
|
|
238
|
+
"failures": {
|
|
239
|
+
"enabled": true
|
|
240
|
+
},
|
|
241
|
+
"requiredCommon": [
|
|
242
|
+
"店铺",
|
|
243
|
+
"SKU",
|
|
244
|
+
"产品名称",
|
|
245
|
+
"数量",
|
|
246
|
+
"箱数"
|
|
247
|
+
],
|
|
248
|
+
"minPlan": "enterprise",
|
|
249
|
+
"pack": {
|
|
250
|
+
"version": "1.3.172",
|
|
251
|
+
"scripts": [
|
|
252
|
+
"scripts/poll-fulfillment.sh",
|
|
253
|
+
"scripts/orchestrator.py",
|
|
254
|
+
"scripts/ensure-store-windows.py",
|
|
255
|
+
"scripts/ml_hub_status.py",
|
|
256
|
+
"scripts/ml_capacity_probe.py",
|
|
257
|
+
"scripts/analyze-full-day.py",
|
|
258
|
+
"scripts/fulfillment.js",
|
|
259
|
+
"scripts/ml_schema_check.py"
|
|
260
|
+
],
|
|
261
|
+
"skills": [
|
|
262
|
+
"ml-fulfillment-sop",
|
|
263
|
+
"ml-config-guide"
|
|
264
|
+
],
|
|
265
|
+
"_note": [
|
|
266
|
+
"能力包版本(语义化):改了该能力的流程/提示词/脚本/技能 ⇒ 必须提版本并重新打包 |1.3.1(2026-09-21):失败备注的运营动作提示(orchestrator._fail_note)+ SKU 类判据收窄。 |**1.3.2(2026-09-21,批 B1)**:把**执行器与运行时依赖**声明进包 —— 此前 --describe full 只有 21 个文件(18 共用引擎 + poll-fulfillment.sh + 提示词/preset/技能),**没有 orchestrator.py / fulfillment.js** ⇒ 装出来的包跑不了 FULL,且 PACK.json 的 sha 清单核不到执行器版本(docs §8.30 的发现)。同一份引擎被多个能力包共用时,安装器必须校验 sha 一致(见安装器 B3)。 |**1.3.60(2026-09-30)**:共用引擎变更(flow-trigger.sh 新增「离线许可 / 租约二选一」闸门,并把 check-license.mjs / license-gate.mjs 纳入引擎分发)⇒ 版本随引擎前进。|**1.3.65(2026-10-03)**:共用引擎变更(`scripts/lib/repo-root.sh` 的 `argent_agent_path()` 去掉旧 node 前缀 `$HOME/node/bin`、换成现役 `$HOME/.local/node/bin` —— 否则生成的 launchd PATH 指向旧树,且只改 plist 会被重生成写回)⇒ 版本随引擎前进。|**1.3.66(2026-10-03,D1)**:共用引擎变更(`scripts/lib/registry.mjs` 支持**显式解释器** `py` —— 内核侧不再赌 PATH 上恰好有 `python3`;台账查询收口为 `core/lib/ledger.mjs`(**CLI 与 MCP 共用同一套**,MCP 不再自带一份 `slice(-tail)` 先截断后过滤的假空实现))⇒ 版本随引擎前进。|**1.3.67(2026-10-03,D2)**:共用引擎变更(`scripts/vertical-lint.mjs` 新增 `flow.skill` 校验 —— 缺声明 / 未在 manifest#skills 声明 / 技能目录不存在 三类即红;`scripts/vertical-init.mjs` 生成的流程带上 `skill` 声明,保证「生成即合规」)⇒ 版本随引擎前进。 |**1.3.68(2026-10-03)**:共用引擎变更(`scripts/flow_claim.py` 补 `--cases-from-dir` 透传 + dry-run 零副作用:不建台账目录/锁文件、不落店铺清单缓存、不写 blocked 台账、源层 case 落临时目录)⇒ 版本随引擎走。|**1.3.69(2026-10-03,P1 第二批)**:共用引擎变更(`scripts/check-license.mjs` 接**唯一判定入口** `core/lib/license-verdict.mjs`(三态 + 离线设备绑定,含 `device` 比对 / unbound 放行 / 自助重绑 3 次 + 7 天宽限),`scripts/license-gate.mjs` 新增 `--json`(只给程序消费,**不改判定/不改证据**)、`scripts/install-license.mjs` 补设备比对与 `--rebind`)⇒ 版本随引擎前进。|**1.3.70(2026-10-03,P1 第三批/P3)**:包内容变更(`skills/ml-config-guide/SKILL.md` —— 把「系统字段枚举」改成引用 CLI 输出,去掉第二份判据;R2 复述告警基线 24→20 的一部分)⇒ 版本随内容前进。|**1.3.71(2026-10-03,P4 批)**:共用引擎变更 —— `pack.engine` 纳入 **core 运行期文件**(26 项 core 运行期文件 + 3 项独立运行验证抓出的缺件(VERSION / flow_case.py / ml_schema_check.py),按实际 import 关系推导:CLI 入口 + MCP 面 + `core/lib/**` 闭包 + 运行期读的 `core/contracts/*.json`)⇒ 能力包自带 core,装机可不依赖 git/sync;同批数据目录链两步落地(老机器存在即沿用、新装 `~/.argent`)⇒ 版本随引擎前进。|**1.3.72(2026-10-03,P4 批·独立运行复验)**:同上(本包新缺 2 项:`VERSION` / `scripts/flow_case.py`;`ml_schema_check.py` 本就在本包 pack.scripts 里)⇒ 引擎纳入后独立运行复验通过。 |**1.3.77(2026-10-04,§8-③ 路径 (a):一次性激活码)**:共用引擎变更(同 invoice 1.2.76:新增 `core/lib/license-activate.mjs` + CLI `license activate` + 两份契约登记)⇒ 版本随引擎前进。|**1.3.79(2026-10-04,isDirectRun 统一 + 补两处引擎缺件)**:共用引擎变更(新增 `scripts/lib/is-direct-run.mjs` —— \"本文件是否被直接执行\"的**唯一判据**(realpath 比对);同批把升级器/安装器/各 check-*/日报/写手/飞书卡片共 10 个 CLI 的入口守卫换成它:旧形态 `pathToFileURL(argv[1]) === import.meta.url` 在软链路径(`/tmp` → `/private/tmp`)下**假否定** ⇒ CLI 静默不跑;本包内的日报/写手两个 CLI 随之变更)⇒ 版本随引擎前进;同批补两个**此前漏在引擎清单外**的运行期文件(本次\"独立运行复验\"抓出:包内 CLI 当场 ERR_MODULE_NOT_FOUND)—— `scripts/lib/argent-datadir.mjs`(内核数据目录判据的脚本侧再导出,包内日报/写手/卡片三个 CLI 都 import 它)与 `scripts/check-skill-classification.mjs`(`core/lib/doctor-customer.mjs` 静态 import ⇒ 缺它连 `argent --help` 都起不来)。|**1.3.82(2026-10-04,客户机试点:逃生阀透传 + 用法事实)**:共用引擎变更(同 invoice 1.2.81:`license activate` 的 `--allow-regression` 透传 + `--json` 下的倒退标注走 stderr + `--server` 用法事实)⇒ 版本随引擎前进。 |**1.3.83(2026-10-04,角色提示词收敛)**:包内容变更:`presets/argent-ml-fulfillment/agent.cordis.yml` 的 persona 收敛到统一骨架;写路径白名单改为**引用**声明(`verticals/<id>/flows.json#guards.writeFields` + `argent writeback --print-posture`),并删掉终态/失败分类的枚举 ⇒ 版本随内容前进。|**1.3.84(2026-10-04,O2 只读运营视图:`argent license ops`)**:共用引擎变更(新增 `core/lib/license-ops.mjs` —— 许可只读运营巡检:在途码/失败码/近 N 天事件时间线/席位账目/异常清单,替代 `mongosh`;`core/lib/license.mjs` 新增 `ops` 子命令;`core/contracts/{argent.contracts.json,verbs.schema.json}` 同批登记 + `reasonCodes` 新增 `field_missing`(O2 两个已知陷阱的响亮失败码:`state` 不是 `status`、席位不是存储字段 `used`);engine +1 项)⇒ 版本随引擎前进。(⚠️ 盖章说明:本版内容在同一工作树里经过两次收口(先落实现,再补契约 note 与词表去重)⇒ 以**最终内容**盖章;版本号 `1.3.84` 从未发布过,不存在\"内容变了版本没动\"的对外窗口)|**1.3.85(2026-10-04,O2 客户端接线:4 个只读接口)**:共用引擎变更(`core/lib/license-ops.mjs` —— `OPS_READ_ENDPOINTS` 的 4 条 `exists:false → true` 并真正发 GET(`codes-list`/`events`/`seats`/`devices/{codePrefix}`,契约 = `whyshu-svr@92c6233`);四处字段映射(`devices[].codePrefix→code`、`items/totals→principals/totals`、`device.found=total`、`timeline` 用服务端 `total`/`count` + 显式 `limit=200`);`405/400 field_unknown/429/401/403/400 bad_*` 一律 exit 2 响亮(`field_unknown`/`rate_limited`/`method_not_allowed`/`admin_required`/`bad_request`,同批登记进 `core/contracts/*`);新增 `coverage`/`coverageDetail`、`checkServerRows`、`serverPageMeta`、`summarizeCoverage`、`seat_used_mismatch`/`seat_totals_mismatch`;⛔ 仍只发 GET、零落盘、无 `--apply`、不探不调 `release-device`)⇒ 版本随引擎前进。⚠️ 服务端那 4 个接口**已就绪但未部署** ⇒ 线上仍报节级 `endpoint_missing`(⛔ 不是空集)。|**1.3.86(2026-10-04,O2 接线后收口:一行措辞修正)**:`core/lib/license-ops.mjs` 文件头「四处字段映射」表 **④** 的措辞改对(窗口内总数在 `timeline.server.total`;`timeline.scanned` 是**客户端窗口过滤后**的条数,⛔ 别当窗口内总数;落点由不存在的 `serverTimelineSection()` 改成 `serverPageMeta()` + 服务端分支)—— **一行注释同样改了引擎 sha** ⇒ 按纪律再提一版(先例同 `_engineNoteDoctor20261003`)。⛔ 行为零变化(254 断言 + kernel-purity 复跑全绿)。|**1.3.87(2026-10-04,合规改造:诊断上报改「告知—同意」)**:共用引擎变更(`scripts/telemetry.py` 默认改为 **opt-in**:`telemetryOptIn` 无键 = 关、`TELEMETRY_DISABLE=1` 硬关;新增采集时刻同意标记 `consent` 与「关闭期不采集/不堆积/不补发」迁移语义;字段 `host`(原始主机名)改为不可逆 `hostHash`,`redact()` 同步掩主机名;新增 `--purge`)—— 这些改了引擎 sha ⇒ 按纪律提版本(先例同 `_engineNoteDoctor20261003`)。客户端侧同批:安装器新增「诊断上报(可选)」步(非交互默认拒绝)、设置页新增可开关(写 `telemetryOptIn`)。|**实例令牌批次(2026-10-05,路线 B)**:共用引擎变更 —— `scripts/telemetry.py` 的凭证取值链从两级扩成三级(`ARGENT_INSTANCE_TOKEN` → `<数据目录>/instance-token.json`(**机器自带凭证**,0600)→ 账号令牌兜底);实例令牌走 **`x-instance-token`**(紧凑串 `it1.<b64url(payload)>.<sig>`)并可带 `x-instance-device`;新增**本地绑定自检**(令牌 instanceId ≠ 本机 installId ⇒ **不发网**、`lastError: instance-token-mismatch`)与 `--status.credential`(只显示来源类型/到期日与绑定态,⛔ 不显示令牌值)。`scripts/install-license.mjs` 新增 `--instance-token-file`(与许可**同一条离线下发链路**,先判后写:归属/设备码/期限对不上即拒装;0600 + 备份 + 原子落盘 + 幂等),`scripts/install-one-shot.mjs` 的 `license` 段透传该参数;新增回归 `scripts/tests/telemetry-instance-token.test.mjs`(62 例,含 JS⇄Python 对拍),`scripts/tests/telemetry-consent.test.mjs` 补「令牌 ≠ 同意」。动机:客户机此前靠 30 天账号 JWT 上报(2026-11-04 到期,且服务端 2026-09-14 轮换 JWT_SECRET 时全灭),交付一台机器就该交付**随机器走**的凭证。服务端契约与签发/续期/吊销手册见 `whyshu-svr/docs/ops/instance-token.md`。⛔ 本轮**未新增运行期文件**(只改上述三个既有引擎文件),故 `pack.engine` 清单不变。|**1.3.91(2026-10-06)**:包内容变更(业务线 `verticals/<id>/manifest.json` 是各能力包内容集的一部分)——业务线 `requires.argent` 由 `>=0.2 <0.3` 抬到 `>=0.3 <0.4`、`version` 0.1.0→0.1.1(P0-5,修「Argent 能力 → 概览」把唯一业务线误标 `⚠️ 版本不满足`);⛔ **未新增运行期文件、未改共用引擎**,故 `pack.engine` 清单不变,按既有纪律只提受影响能力包的补丁版本并重盖章。|**1.3.92(2026-10-06,MCP 工具安全注解)**:共用引擎变更(同 invoice 1.2.90:`core/mcp/server.mjs` 的 `tools/list` 加 MCP 规范 `annotations`(只读 9 / 写类 5),零行为改动、工具数仍 14)⇒ 版本随引擎前进。|**1.3.94(2026-10-08,WebDriver 用法 P0 批)**:共用引擎变更(P0-1 依赖表补 `selenium` ——`install-argent.mjs` 的 `pythonRuntimePlan().pkgs` 与 `scripts/lib/python-runtime.mjs` 的 `venvUsable` 默认 `pkgs` 同批加第五项,官方唯一推荐的驱动档位(`ZINIAO_MODE=selenium`)此前**装都没装** ⇒ 选型开关静默撒谎、该档位从未运行过一次;缺它时老 venv 必须判「未就绪」否则 `ensure` 空转、永远装不上;同批 `SeleniumClient` 的 ImportError 分支改显著 warn + 选型处预检并显著 warn 后回退 Playwright(官方不建议)、`--mode inspect` 报 `driver_tiers`;P0-2 `updateCore` 总超时 60→300s / 单次 30→60s(官方建议值)并把官方 `msg` 进度打进日志;P0-3 每题尾部**只读** before/after 窗口快照并排 + 连续 3 轮泄漏 ⇒ 台账 blocked(needs_human,⛔ 不自动关店);P1-a `_wd_call` 落 requestId/耗时一行;P1-b `-10006` 按官方语义重试一次。⛔ 未新增运行期文件(只改上述既有引擎文件),故 `pack.engine` 清单不变。)|**1.3.95(2026-10-08,驱动解析根因修复 / P0-4)**:共用引擎变更(`scripts/orchestrator.py` —— 追记-5 真店实测的根因修复:① **`core_version` 多源取值**(优先级 startBrowser 响应 → getRunningInfo 条目 → 窗口 CDP `GET /json/version`),每源失败都留可诊断输出,三源都取不到 ⇒ 显著 warn 点名「取不到内核大版本 ⇒ 无法保证驱动匹配」;② 驱动按内核大版本解析并缓存到 `~/.dsh/argent/chromedriver_cache/<major>/`(命中打 `♻️ 缓存命中`,缺失才按 chrome-for-testing 获取);③ **禁止 Selenium Manager 静默接管**:显式 `Service(executable_path=<解析结果>)` + 子进程与本进程置 `SE_OFFLINE`,无匹配时默认**明确失败**(`DriverResolutionError`,err_type=config_error,不触发 KB-084 端口重发现、`flow_failure` 归 needs_human),两个逃生阀 `ZINIAO_ALLOW_SELENIUM_MANAGER=1` / `ZINIAO_ALLOW_PLAYWRIGHT_FALLBACK=1` 都**默认关**且各自显著告警;④ 新增回归(P0-4 驱动解析用例:45 断言,夹具/桩,不真开浏览器)。⛔ 未新增运行期文件(只改上述既有引擎文件),故 `pack.engine` 清单不变。)(⚠️ 盖章说明:本版内容在同一工作树里经过两次收口 —— 先落实现并盖章,再按 `vertical-lint` 的业务词约束改文案(⛔ 未动 `verticals/_engine-words.baseline.txt`)⇒ 以**最终内容**盖章;版本号 `1.3.95` 从未发布过,不存在\"内容变了版本没动\"的对外窗口)|**1.3.96(2026-10-08,WebDriver 用法 P0-5)**:共用引擎变更(`scripts/orchestrator.py` —— 补 `SeleniumClient.health()`:KB-133 窗口前置检查对两档都调 `self.browser.health()`,而 `health()` 只在 `PlaywrightClient` 实现 ⇒ `ZINIAO_MODE=selenium` 在**步骤 1** 当场 `AttributeError`(本机台账 11:24:23 有原文,是 P0-4 修复后暴露的下一处)。新实现与 Playwright **逐字同契约**(同 4 键 connected/contexts/pages/reason、同真值语义 `connected ∧ contexts`、同 reason 码),判据只用**驱动会话**(`driver.window_handles`,一次本机 chromedriver 只读 GET;异常按类名分 `browser_disconnected`/`probe_error:<类名>`),CDP `GET /json/version`+`/json/list` 仅作**不参与判定**的只读旁证。⚠️ **自愈闸门**:`health()` 判不健康会驱动 `_heal_store_window()` 关当前标签并 `startBrowser` **重开真店窗口**,而该链路在 selenium 档位从未在真店验证 ⇒ **默认整体拒绝**(显著 warn + 快速失败 + 文案不再声称\"已自动自愈\",`recovery_attempted` 带 `selenium_selfheal_suppressed`),仅在显式 `ZINIAO_SELENIUM_SELFHEAL=1` 时照既有语义执行(⛔ 不新增任何自动关店窗路径);判据用真实客户端类型而非会撒谎的 `ZINIAO_MODE`。新增回归 `scripts/tests/kb133-selenium-health.test.py`(79 断言:契约一致性/只读/未触发窗口变更的静态+运行时断言/开关行为)。本机真店复验:`ZINIAO_MODE=selenium` 步骤 1 **首次跑完**(`status=success`、exit 0、占窗 ~15 秒、测后回基线)。⛔ 未新增运行期文件(只改上述既有引擎文件),故 `pack.engine` 清单不变。)|**1.3.102(2026-10-09,P0 注册表投影)**:共用引擎变更(`install-argent.mjs` 的 `--expect-sha256` 改为**一个包一个**摘要(可逗号分隔/重复给,数量不匹配=用法错)+ `--check-update` 合成**一条**可原样跑的「一起装」命令;`scripts/argent-capabilities.mjs` 加 **P2a 不变量**:投影落 `scripts/flow-requirements.json`(引擎级 base)前先摘掉不属于 base 的 `flows`/`aliases`)。能力包自身:包内注册表投影**只并引擎级段**(flow 不再抄进投影 ⇒ 与 `verticals/<id>/flows.json` 不再重复定义),并**同批带上** `verticals/<id>/flows.json`(旧包只带 manifest ⇒ 纯包装机 `flow_registry.py --json` exit 2)。判据:`scripts/tests/install-registry-loadable.test.mjs`(装完即加载注册表,五态)。|**1.3.103(2026-10-09,引擎锁跨平台化)**:共用引擎变更 —— 新增 `scripts/lib/argent_filelock.py`(模块名带 `argent_` 前缀 = **撞名防线**:PyPI 上有同名且极常见的 `filelock` 包,实测在 Windows 真机上被 `import filelock` 静默拿到过)(跨平台**排他文件锁唯一真源**:POSIX `fcntl.flock` / Windows `msvcrt.locking`,同一 API、同一锁文件约定),并把 `scripts/flow_claim.py` / `scripts/flow_ledger.py` / `scripts/telemetry.py` 的**顶层** `import fcntl` 与 `scripts/orchestrator.py` 的 **10 处**函数内 `fcntl` 全部换成它 ⇒ Windows 上认领/台账/遥测不再 `ModuleNotFoundError`(此前整个不可用),编排器的锁不再 `except: pass` **静默变 no-op**(互斥类 fail-closed、追加/审计类响亮降级 + 逐次计数)。⛔ 业务语义 / 数据格式 / 事件形状零变化:POSIX 侧与旧实现**逐字等价**(同一次 `flock` 调用、同一把锁文件、同一阻塞语义;`best_effort` 只在锁不可用时介入);同批 `pack.engine` 登记新文件。回归 `scripts/tests/filelock.test.py`(两进程抢锁 / 新旧逐字节对照 / 无 fcntl 可 import / Windows 分支桩测,52 断言)。(⚠️ 盖章说明:本版内容在同一工作树里经过**多轮收口**,以**最终内容**盖章;版本号从未发布过,不存在「内容变了版本没动」的对外窗口。三轮都来自**真机(Windows)实测**:① `import filelock` 与 **PyPI 同名包**撞车(探针当场拿到第三方的 `WindowsFileLock` 类)⇒ 改名 `scripts/lib/argent_filelock.py`(与 `argent_datadir.py` 同惯例)并同步四处 import;② Windows 无 `/tmp` ⇒ `lock_dir()` 的 Windows 缺省改用系统临时目录(POSIX 缺省**逐字不变**);③ **3 进程 ×15 条并发追加只活下 42 条**(Windows `_O_APPEND` 非原子)⇒ 根因是 `best_effort` 默认退成了**非阻塞**(旧实现是阻塞 `flock`),改为 `blocking=True` 默认并补回归(`filelock.test.py` §6b:持锁期间 append 必须**排队**,故障注入可复现变红)⇒ 复跑 45/45;④ 真机再实测出**强制锁挡读**:锁住数据文件**第 0 字节**会让别的进程**整文件读不了**(`flow_ledger.read()` 当场 `PermissionError`)⇒ Windows 锁区间挪到**文件内容之外**(第 2^40 字节起 **1 字节**;`LockFile` 允许锁到 EOF 之外且不分配、不改大小)⇒ 锁照样跨进程互斥、**读者零影响**(真机复验:持锁期间整文件读正常、解锁后可锁))|**1.3.104(2026-10-09,能力包地址真源收敛)**:共用引擎变更(`install-argent.mjs` —— ① `--capability` 的包地址**真源收敛**:有 install-ticket 清单 url 就用**清单的**(它与清单里的 sha256 同源 ⇒ \"地址+摘要\"成对可信),只有无账号/离线/清单没给 url 时才回落 `--pack-base` + 锁内版本自拼,且计划清单**逐条标注地址来源**(旧实现无条件自拼 ⇒ `--pack-base` 一整段绕开清单);② `--check-update` 主推 `--capability <服务端授予全集>`(不再要用户手抄四条 URL 与四个摘要),`--from-packs … --expect-sha256 …` 降为**离线/裁剪交付的进阶备选**另起一行;③ `--check-update` 对「显式零能力」账号改**中性提示**(exit 0)—— 旧实现把\"啥都没买\"报成\"拿不到服务端能力清单\"故障;判据换成\"服务端回没回 `capabilities` 字段\";`scripts/argent-capabilities.mjs` 的 `parseCapabilityManifest` 为此新增 `capabilitiesPresent`)⇒ 版本随引擎前进。同批 `scripts/release-argent.sh --check-dl` 新增**能力包档**(对服务端清单里每个包逐个 HTTP 取回 + `capability_pack.py --digest-tgz` 重算内容摘要 == 清单 sha256;不通过即判红)—— 该脚本与 `capability_pack.py` **都不在** `pack.engine`,故不改包内容。|**1.3.105(2026-10-09,同批二次收口:`--dsh-home` 必须同时决定数据目录)**:共用引擎变更(`install-argent.mjs` —— `DATA_DIR` 从**模块级 `const`** 改成**取值函数 `dataDirOf()`**。旧形态在 `--dsh-home` **解析之前**就求值 ⇒ 账本写进 `--dsh-home`、而 **packs-cache 写进默认 `~/.dsh/argent`**:后果不是\"多一个文件\",而是**定向安装/测试用的临时 home 会往真实 `~/.dsh` 里写**——\"⛔ 不碰既有 home\"当场不成立。同文件 `PRESET_ROOT` 早有同因修复(注释原文:\"const 提前求值会锁死默认 ~/.dsh\"),`DATA_DIR` 是漏网的那一个。**真机取证**:Windows 定向安装后 `C:\\Users\\<u>\\.dsh\\argent\\packs-cache\\` 多出 hr-0.1.41 / full-1.3.104 / invoice-1.2.99 / daily-report-1.1.106 四条(已逐条清除,回到原有 10 条);同场景换成 HEAD 版安装器可复现(`\\$HOME/.dsh/argent/packs-cache` 被创建)。无 `--dsh-home` 时 `dshHome = ~/.dsh` ⇒ 真实装机路径**逐字节零变化**。回归:`scripts/tests/install-capability-url-source.test.mjs`【E】(把子进程 HOME 也钉进临时目录,断言默认数据目录**没有被创建**)。|**1.3.106(2026-10-09,配置地基:配置目录 + 通用读取器)**:共用引擎变更 —— `pack.engine` 新增 `core/lib/config-catalog.mjs`(配置面的**唯一**读取器:五级解析链 env → 域 env 文件 → config.json → 业务线/机器本地文件 → 声明 default;API `get/require/sourceOf/isConfigured/all/describe/invalidate`;secret 项在 `describe()` 里**结构性**不回值)+ 5 个引擎级配置目录文件 `configs/*.json`(账号 / 通知与投递 / 宿主与机器 / 人事(HR) / 高级与诊断);业务线级目录 `verticals/<id>/config.json` 由 `capability_pack.manifest()` 随 manifest/flows **同批带上**(改了 `scripts/capability_pack.py` ⇒ 本次三个带 flow 的能力包内容都变了)。四道门禁:`node scripts/check-config-catalog.mjs --strict`(①双向对账 ②敏感不出门 ③必须项可解析 ④新增即生效)+ 回归 `scripts/tests/config-gates.test.mjs`(84 断言,含「注入假象必须变红」的自证)。⛔ 不改任何现有配置的取值行为(读取器是**新增**入口,现有调用方仍按自己的链路读;每项声明的 `todayChain` 如实记录「今天代码的优先级」,迁移时逐项核对)。契约见 `docs/Argent-宿主适配契约.md` §7。|**1.3.107(2026-10-09,配置地基第二批次:设置页「配置中心」+ 逐能力「检查更新」)**:共用引擎变更 —— `core/lib/config-catalog.mjs` 增「可写落点 / 旧优先级提示 / 分类 order」进 `describe()` 载荷,`configs/advanced.json` 把 `capability.checkUpdate` 的 `implemented` 如实改为 `true`,`install-argent.mjs` 的 `--check-update` 增 `--json` + `--capability` 过滤(设置页与命令行**同一份比对**)⇒ 版本随引擎前进(本能力的流程/提示词/脚本内容一字未改)。|**1.3.108(2026-10-09,变现分层落地)**:业务线清单 业务线清单 `verticals/<id>/manifest.json` 同批变更(`daily-report` 档位 `enterprise` → `pro`;本能力 `minPlan` **保持 `enterprise`** —— 箱唛/写操作属企业版)⇒ 包内容随之变化,按纪律提版本。|**1.3.111(2026-10-09,预约失败判定链 + 口径统一)**:共用引擎 `scripts/flow_failure.py` 变更(新增 `canonical_reason()` 与 `--case` —— 打印某 case 的**规范失败原因**:优先读台账 `failed.reason`,老台账回落到 `error` 去身份前缀;给角色/运维一个**逐字照抄**的取数口,杜绝\"表备注写 A、账本写 B\")⇒ 所有能力包的注册表投影同批变化。本能力自身:`scripts/orchestrator.py` —— ① 新增 `appointment_form_verdict()`:步骤4 预约页**由证据派生结论**(`calendar` 三态:日历没渲染=页面形态异常 / 日历在但可用=0=才允许\"当前无可预约时段\"且必须带 `div.day 可用=0/总数=N` 证据 / 有可用日=失败点不在此),`_capture_page_diag` 与新增的 `_appointment_page_evidence()` 同时补采**可用数**(旧摘要只有命中数 ⇒ `div.day=0` 被读成\"平台没放号\",生产实测 79096447 的误导根因);② `_pick_date()` 三处失败、`_book_appointment` 选运输方式失败、时间选择 `div.hour` 命中 0、坏号早停(`bad_shipment_id`)全部改用同一串 `appointment_failure_text()`;③ `_ledger_record_full_failure` 单列 `reason`/`errType` 字段(表备注与账本**同源同文**);④ 批处理失败分支改用 `_fail_note()`(此前裸写 `失败:<msg>` ⇒ 与单票路径措辞不一致)。⚠️ 行为变更(**经用户口径**):预约页形态类失败从 needs_agent/retryable 改判 **needs_human**(落卡等人、⛔ 绝不自动写、⛔ 不自动重跑);`verticals/<id>/prompts/full.failure.md` 的\"两种页面状态\"表按证据重写为四种,并加\"口径统一\"硬要求。(⚠️ **盖章说明**:本版内容在同一工作树里经过**多轮收口**(先落实现,再按 vertical-lint 的引擎业务词约束改注册表文案、再收口文案)⇒ 以**最终内容**盖章;版本号从未发布过,不存在\"内容变了版本没动\"的对外窗口。)|**1.3.112(2026-10-09,三处生产实测收口:票不许静默消失 · 失败必写原因+动作 · 发票流程 Rule R)**:共用引擎变更 ⇒ 四个能力包一起提版本并重盖章。① `scripts/flow_triage.py`:判定改为**有效末条事件**(`INFO_EVENTS = phase/wake/policy_apply/policy_new` 回退到最近一条状态性事件;`failed_ack` = 有意不动且**不参与回退**)、`blocked` 从「静默 pass」改为可见的 `needs_human`,并加**循环后对账兜底**(任何未归桶的 case ⇒ `needs_human`,kind=unclassified)——修的是客户机生产实测 P0(某发票票):其尾部是 `blocked → phase` ⇒ 分诊摘要全 0、运营勾了放行也不派发、且**不在「需人工」里**(静默卡死)。② `scripts/flow_failure.py`:新增运营文案**唯一来源** `ops_message()`(`结论:<业务类|系统类|我方缺陷类>|<原因>|动作:…`,≤300 字)与 `release_hint()`(放行位/提示的**唯一实现**:变体与**顶层** pick 都认;`orchestrator._ops_action_hint` 改为委托它);③ **新增** `scripts/invoice_fail_closeout.py`(属**发票能力专属脚本** `capabilities.invoice.pack.scripts`,⛔ 不进共用引擎 —— 它只写发票那一列):失败/成功收口 —— 把**同一串**写进表「发票错误信息」与台账(`detail` 逐字相同、`error` 放规范原因),取不到原因 ⇒ **exit 2 拒绝执行**,代码级异常归「我方缺陷类」且**不回原文**,成功 ⇒ `--clear-error` 清空;④ `scripts/flow_return_to_ops.py`:缺口回填文案改用同一来源(表字段 == 台账 `detail`);④b `scripts/flow_config.py`:归一化的 `guards` 增**标量透传**(`writer`=写手路径、`errorField`=失败原因列 —— 不透出就只能各自把路径/列名写死,那正是「判据第二份」与业务词泄漏进引擎的来源);⑤ 业务线声明(`verticals/<id>/flows.json`):两个发票流程新增 `pick.release` / `pick.releaseReDispatch`(放行位 = **各自的门控列**「发票就绪」;上限 3 / 冷却 30)与 `guards.errorField`。本能力自身:`scripts/orchestrator.py` 的 `_ops_action_hint` 改为**委托** `flow_failure.release_hint`(旧实现只看 `source.variants.*.pick` ⇒ 对 pick 写在顶层的流程恒空)。|**1.3.113(2026-10-09,hub-v2 真实状态源 + 表内进度实时回写)**:用户口径两条(同日十几条实跑数据提出)——①「创建货件号之后,完全可以根据 `…/shipping/inbounds/<号>/hub-v2` 页面中各状态来判断该货件号状态,例如产品标签和箱唛是否下载完成、预约是否被取消,这是最真实的状态查询方式」;②「在 FULL 流程跑的过程中,lip 表的『当前步骤』字段并没有随着实际步骤显示,都先显示步骤1,直到失败或者成功了」。**① 新增 `scripts/ml_hub_status.py`**(只读探针的**纯解析器**:吃 DOM dump 吐结构化结论,只有 stdlib ⇒ 可离线夹具回归;派生规则确定性 —— 逐项 done 五信号三态 / `appointment_cancelled`(页面文本 `Reserva cancelada` 优先,其次 hub 上是否仍有 `Cancelar reserva` 按钮)/ `labels_downloaded` / `box_labels_downloaded` / `all_items_done` / **`operationally_complete = 预约已取消 ∧ 产品标签已下载 ∧ 箱唛已下载`**(严格要求三者为 True,`null` 一律不算 ⇒ 平台改版时**保守**);未知项如实 dump 为 `{label, done:null, note}`,⛔ 不因未知结构而崩),并把它登记进本能力包脚本集(⛔ 未进 `pack.engine` —— 它是 full 的执行器配套,不进其它包)。**编排器三处接入**:a) 步骤1 前置校验改为**先问 hub 真相**(无论表/列表状态写什么)—— hub 判完成 ⇒ 视为已完成 + 写备注「识别为运营手动完成(依据 hub-v2 实测):<逐项>」+ `当前步骤=已识别为运营手动完成(hub-v2 实测)`,**⛔ 不改写 `FULL状态`**(改写权留给人/用户;返回体带 `status_unchanged=true`);hub 明确没做完 ⇒ 保留拦截**且文案带逐项状态**;hub 探针不可用 ⇒ 退回原交付物判据(保守,行为与改动前一致)。b) 失败现场补采 hub 逐项状态 —— 进 `failures.jsonl` 的 `dom_summary`(追加 `|hub: …`)与新增结构化字段 `hub_status`,并进统一台账 `detail`(两处**同源同文**)。c) 新增只读 CLI `--mode hub-status --shipment-id <号> [--record-id <rec>]`(`--hub-write-note` 才写备注,默认零写表),复用店铺执行者锁(非阻塞:生产在同店跑 ⇒ 探针 skipped,绝不抢窗口)。**② `当前步骤` 实时跟随**:新增 `FeishuClient.update_step_progress()`(节流:文案变化立即写 / 同文案 ≥15s 才重写 / `force` 绕过;**⛔ 完成态只在 `done=True` 时写**——写「全部完成」而 `done=False` 一律**拒绝**并记审计 `why=premature-completion`,防「表=完成、台账=blocked」错位),`_execute_steps` 每步**开始/结束各写一次**(文案唯一真源 `STEP_PROGRESS`:`步骤4 预约中` / `步骤6 下载产品标签` / `步骤7 上传箱唛` / `步骤8 取消预约` …),完成态两个收尾点与 step1 的「已有终态」两处改为 `done=True` 单点写入;**失败文本不再写进 `当前步骤`**(今天现场 `当前步骤='失败:预约失败:取消预约**未执行**(3/3…)'` 语义完全不对)——失败时 `当前步骤` 保持最后真实步骤(`步骤N <名>失败`),原因只进备注(`FULL备注`/legacy `状态详情`,仍走**唯一写入口** `update_field`:白名单 + 写前整行备份 + 写后读回 + 审计),并把 `clear_failed_note()` 从 lip 扩到两种模式(原因只落备注后,legacy 也需要开跑清残留,否则旧原因会一直挂在表上)。回归:`scripts/tests/hub-truth-completion.test.py`(71 断言:全勾选+预约取消⇒完成 / 缺箱唛⇒点名缺哪项 / 未知项改版⇒不崩且保守 / 表=失败+hub=完成⇒「运营手动完成」且**零** `update_status` 调用(AST 级断言)/ 步骤1 命中 hub 完成不再报失败 / 逐项进失败诊断 / 探针 JS 只读闸门)与 `scripts/tests/step-progress-realtime.test.py`(41 断言:16 次写入序列 / 节流四态 / 失败不污染当前步骤 / 完成态只在 done=True / 源码级「无裸写全部完成」)。文档:`docs/本机接班运行清单.md` §8.70(hub 真相源判据 + 派生规则 + `当前步骤` 写入口径 + 运营可读话术)。|**1.3.114(2026-10-09,同批二次收口:引擎面零业务词)**:`scripts/ml_hub_status.py` **不再内置平台域名**(`hub_url(shipment_id, base_url)` 的 `base_url` 改为**必填**,编排器传自己的 `ML_BASE_URL`;夹具改用中性基址 `https://ml-platform.invalid`)—— 原写法让这个**新的引擎面文件**带上平台域名词(engine-words 词表里那条),`vertical-lint` 的 engine-words 档当场报「基线 0 → 现在 1」。⛔ **没有抬** `verticals/_engine-words.baseline.txt`,而是把业务词从引擎面移出去(判据本身没放宽)。同批:`--mode hub-status` 返回体里那个含中文的 `note` 键改名 `advice`(`note` 是 `check-sop-consistency` C1 的**域内字段键**,会被误读成\"引擎写了一个未声明字段\")。(⚠️ **盖章说明**:本版内容在同一工作树里经过多轮收口 ⇒ 以**最终内容**盖章;`1.3.113` 从未发布过,不存在\"内容变了版本没动\"的对外窗口。)|**1.3.115(2026-10-09,hub-v2 真机校准:逐项 done / appointment_cancelled 的 DOM 信号)**:上一批(1.3.113/1.3.114)交付了 hub-v2 真相源,但**逐项 `done` 与 `appointment_cancelled` 的 DOM 信号从未在真页面上校准过**(代理当时如实点名了这个唯一保真缺口)。本批用**真机 dump**(生产货件 `79096447`,运营已手动完成:ML 列表 `Reserva cancelada`、预约已取消、标签+箱唛已下载;只读抓取 `orchestrator.py --mode hub-status`)当场复现并修掉:**旧判据把「已完成」判成「没完成」** —— 旧第①步要求页面文本含 `Reserva cancelada`,而**真机那一页通篇没有**该字样(整份 dump 里 `Reserva`/`cancelad`/`Cancelar` **各命中 0 次**)⇒ 规则①③永不命中、②也不命中(`Cancelar reserva` 按钮已消失)⇒ 落回 `null` ⇒ `operationally_complete=false`(与事实相反)。**`scripts/ml_hub_status.py` 判据按真 DOM 重排为「顺序即优先级」四步**:⓪**残缺闸门**(探针无效/预约区域缺失/预约卡没渲染/预约项自身就是残缺卡 ⇒ `null`,缺证据 ≠ 完成)①**反证最高优先**(仍有 `Cancelar reserva`/`Cancelar cita` 或改期入口 ⇒ `false`)②预约项 `done is False` ⇒ `false` ③明确取消文案 ⇒ `true` ④**真机校准组合**:预约项 `done is True`(环节已结束)**∧** `cancel_button_present is False`(取消入口已消失)∧ 预约卡根可辨 ⇒ `true`;⑤其余 ⇒ `null`。⛔ **判据没放松**:`operationally_complete` 仍严格要求 `appointment_cancelled is True ∧ labels_downloaded is True ∧ box_labels_downloaded is True`(`null` 一律不算)。**为什么必须两条合取**:只看「没有取消按钮」会把**从未预约**的货件误判成已取消(它同样没有该按钮);只看「环节已结束」会把**预约成功**的货件误判成已取消(它环节也结束了,但页面上**仍留着** `Cancelar reserva`,第①步反证先赢)。**真机定位到的承载元素**(探针 v2 逐项命中词元):预约卡的 `done` = `hub--card__content-summary-task-done-check-icon`(**五项都有**,=「任务完成勾」具名元素),而 `andes-card--completed`(常规完成态)**只有四项有** ⇒ 预约卡 =「已结束但不是常规完成」= 取消这一种终态;⛔ 但**绝不**能把 `card_completed_class=False` 当「未完成」负信号(那会把真机样本当场判成未完成),它只进 `signals` 留痕。那段 `Algo salió mal…` 经核对是**另一个子组件**(`seller-monitor__error-card`)的渲染残缺卡,与预约卡(`data-testid=\"link-appointment\"`)是两条不同条目 ⇒ 判据必须能区分「别处坏了」与「预约区坏了」。**可选组合接口**:`parse_hub_dump(..., list_status=\"\")` 收列表页/表里的粗粒度状态原文,**⛔ 永远不是唯一依据**(不能把「判不了」变成「完成」),只做①否决(列表页说预约仍有效 ⇒ 组合降级回 `null`)②佐证留痕(`signals.list_status_confirms`);本样本**不依赖它**(只读探针只导航一次)。**dump 保真度**:探针升 `probe_version: 2`,逐项新增 `class_tokens`(**逐元素分词**,替代会被 400 字符截断切词的拼接串)、`done_class_hits`/`todo_class_hits`(命中的确切词元 —— 正是它定位到上面那个承载元素)、`done_class`/`todo_class`(权威布尔)、`card_completed_class`、`tag`/`data_testid`,页面级新增 `error_cards`;解析结果的 `raw` 投影同步带上(旧投影只留 `label`+`html` ⇒ 「解析器记了 `done_class=true` 却没人能回答它从哪来」正是第一次校不出根因的地方)。⛔ v2 字段**只扩证据**,判据仍走原字段。**真机复核(客户机,只读)**:用新解析器重跑同一条命令 ⇒ `appointment_cancelled=true`(`by=step-closed-and-no-cancel-affordance`)、`labels_downloaded=true`、`box_labels_downloaded=true`、**`operationally_complete=true`**、`probe_version=2` ⇒ 与事实一致;⛔ **未改动客户机仓库字节**(新解析器经 `sys.modules` 注入、跑客户机自己那份 `orchestrator.py`;探测前后 `scripts/ml_hub_status.py` sha256 逐字节一致,临时件已清理;探测前两次失败发生在导航之前 ⇒ 未占用窗口)。**仍是推断(下一轮真机验)**:**从未预约**的真机形态 —— 本批只抓到「已完成」这一票;派生前提是「未预约的预约项**不会**带 `task-done-check-icon`」(元素名字面即「任务完成」,语义支持,但**无真机样本**),若被证伪 ⇒ 第④步会把「没预约」误判成「已取消」;已用夹具 `appointment-not-concluded` 锁住**行为**,⛔ 不为取证多占窗口。**已知探针缺口(本轮只记录、未改)**:`has_check_icon` 的四个选择器抓不到那个 `div`(真机五项该字段全 `False`)⇒ 下一轮若要启用「勾选图标」正信号,需把 `[class*=\"check\"]` 纳入并连同回归一起做。**回归**:`scripts/tests/hub-truth-completion.test.py` **72 → 122 断言**(既有 72 条**零回归**)—— 新增 §9 真机校准(脱敏真机夹具 ⇒ `appointment_cancelled=True` ∧ `operationally_complete=True` ∧ 判据名 `step-closed-and-no-cancel-affordance`;`done` 承载元素与五项对照;旧判据①在真机证据面上**不命中**的现场复现;4 条负样本:预约仍活/从未预约/页面残缺/卡片没渲染 + 探针失效 + `done is False`;`list_status` 接口四态)与 §10 真机保真度(dump v2 字段 + `has_check_icon` 缺口);夹具 `scripts/tests/fixtures/hub-v2-real-anon.json`(**脱敏**:货件号/数量/箱数/体积/平台域名换占位符,逐项 `label`+`html`+v2 词元逐字保留;⛔ 原始生产 dump 不入仓库)。⛔ 本批**未动 `pack.engine`**(只改 `capabilities.full.pack.scripts` 里的 `ml_hub_status.py` + 测试 + 文档)。(⚠️ **盖章说明**:本版内容在同一工作树里经过多轮收口 ⇒ 以**最终内容**盖章;`1.3.114` 之后未再次发布过其它内容,不存在「内容变了版本没动」的对外窗口。)|**1.3.116(2026-10-09,配置「生效来源」可见化 + 冲突告警,批 1)**:本能力自身:流程 / 提示词 / 脚本内容一字未改(仅共用引擎与注册表投影前进)。共用引擎 `core/lib/config-catalog.mjs` 新增**纯函数** `resolveEffective()`(按规范链算「谁赢了 / 谁被压住」)、密钥脱敏 `redactSecret()` 与读取器 `effectiveOf()/levelsOf()`,并新增只读 CLI `scripts/config-explain.mjs`(`--key/--all/--list/--json`)⇒ 能力包内容变化,按纪律提版本并重盖章。⛔ **零行为变化**:读取器的取值路径(`resolveOne`)与任何 `todayChain` 一个字节都没改,只是「如实展示」;同批回归 `scripts/tests/config-effective.test.mjs`(63 断言)+ 端点 / 页面两条既有回归扩测。|**1.3.117(2026-10-09,同批收口:脱敏闸幂等)**:只读 CLI `scripts/config-explain.mjs` 的\"再脱敏\"兜底闸原先**无条件**执行 ⇒ `❰已设置(长度N)❱` 里的 N 变成**占位串自己的长度**(恒 11,实测),而用户正是拿它比对\"密钥换没换\" ⇒ 已改为**幂等**(含被压住的那级)并补回归;引擎面同一份 CLI 变了 ⇒ 包内容变化,按纪律再提版本并重盖章。本能力自身内容一字未改。|**1.3.119(2026-10-10,单步运行不得把整票写成完成)**:`scripts/orchestrator.py` —— 完成判据由「**本次调用请求的步骤子集**是否跑完」改为「**整票 1..8 是否均已达成**」(新增 `ALL_STEPS` 唯一真源 + `_missing_steps()`/`_ticket_done_why()`/`_ticket_attestation()`)。生产亲历:`--mode step --step 4` 预约成功后 5/6/7/8 一步没跑,而 `_execute_steps([4])` 正常返回 `None` ⇒ 旧调用方据此写 `FULL状态=已完成` + `当前步骤=全部完成` + 完成卡(旧守卫只校验 `done=True`,单步路径**同样传 `True`** ⇒ 放行;判据实际退化成\"本次调用自己完成了\")。现在完成态**只有一个写入点** `_finalize_ticket_complete()`(内部先按整票口径自检,缺步即拒绝 + 审计 `premature-completion-ticket`),单票/批处理两个收尾点都只经 `_finalize_after_steps()`;单步/部分运行只写**步骤级进度**(`步骤4 预约完成(待步骤5-8;未达成:步骤1-3)`)+ 发「FULL 步骤完成」卡(`step` 事件、`final=False`、缺省 `FULL_NOTIFY_MODE=final` 下不外发),⛔ 不动 `FULL状态`、⛔ 不发完成卡;「已存在而跳过」的步骤(步骤3 已有货件号 / 步骤4 检到已有预约 ⇒ 保留)同样记达成 ⇒ `--mode full` 的真实路径仍能写完成态。写表守卫加强为**双闸门**(`done=True` **且** 整票凭据齐备);唯一合法的非 1..8 口径 = `terminal_evidence`(ML 侧货件已是终态 / hub 判全完成)。结果体新增 `ticket_complete`/`missing_steps`(⚠️ `status=success` **不代表**整票完成)。回归:新增 `scripts/tests/ticket-completion-criteria.test.py`(71 断言)+ `step-progress-realtime.test.py` 41→50(口径收紧,⛔ 未放宽)+ `flow-notify-trunk.test.mjs` 完成卡发出点 2→1;`prefail-verify.test.py` 73 断言**零回归**。⛔ **未动 `pack.engine`**(`hr`/`invoice`/`daily-report` 的文件集不含 `orchestrator.py`)⇒ 只有 **full** 提版本。|**1.3.120(2026-10-10,同批二次收口:终态路保持静默 + 断言补齐)**:同一工作树里第二次收口(先落实现并盖章,再补 `notify` 形参与回归断言)⇒ 按「内容变 ⇒ 版本必变」纪律**再提一版**(先例同 1.3.104→1.3.105、1.3.113→1.3.114)。内容变更:① 唯一完成入口加 `notify` 形参,**步骤1 的两条「已有终态」路显式 `notify=False`** —— 那两条路在本批改动之前**本来就不发完成卡**(静默识别为已完成),本批 ⛔ 不顺手改通知面(否则重跑一张已完成的票会向客户群重发「FULL 货件完成」);② 回归断言补齐(`scripts/tests/ticket-completion-criteria.test.py` 71→78 断言):终态路**零卡片**、缺省 `notify=True` 仍发卡、两处调用显式 `notify=False`(AST 级)。⛔ 判据零放宽:完成口径仍 = **整票 1..8 全达成**(或外部终态证据)。版本号 `1.3.119` 从未发布过,不存在「内容变了版本没动」的对外窗口。|**1.3.121(2026-10-10,A 批:按智能体安装清单 —— 客户从「智能体库」选一个装,只装它的东西)**:① **`pack.engine` 新增两项**:`agents/catalog.json`(L0 货架声明:agent → capability + flows 子集 + 角色 + 插件/技能/集成/凭据槽)与 `scripts/argent-agents.mjs`(声明解析/校验/清单构造;安装器与门禁**共用一份**判据)⇒ 引擎清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**,按「内容变 ⇒ 版本必变(含无 flow 的包)」这条不变式一起提版本);② **共用引擎行为变更**(`install-argent.mjs` / `scripts/lib/preset-install.mjs` / `scripts/argent-upgrade.mjs`):新增 `--agent <id>[,<id>…]` / `--list-agents` / `--internal-roles` / `--capability remove <id>`(写前备份 + 审计);preset **行落盘集合**改为「按清单收窄」(`--agent` ⇒ 恒装 + 本智能体角色 + 已装集;默认 ⇒ 客户可见集 + 已装集;**内部角色默认不落**);升级器按 `<dshHome>/argent/agents.json` **重新施加**同一集合(否则一次升级就把收窄还原);**未给 `--agent` 时 CLI 契约与计划清单输出与改动前逐字一致**(差分回归钉住);③ 本能力自身:⛔ 流程/提示词/脚本**一字未改**(只有引擎面与 pack.engine 前进)。回归:`scripts/tests/agent-catalog.test.mjs`(110 断言,七条判据:只落本智能体 / 子集过滤 / 向后兼容差分 / 未知输入零写入 / remove 备份+审计 / 目录 schema / 内部角色默认不落)。|**1.3.122(2026-10-10,同批二次收口:宿主资产声明 + 门禁)**:同一工作树里第二次收口(先落 `--agent` 实现并盖章,再补 `capabilities.<c>.pack.hostAssets`(**宿主侧资产声明位**:定时器/登录自启/桌面项)与它的门禁 C12,并把 `scripts/argent-agents.mjs` 的清单/回执接上宿主资产)⇒ 引擎面文件内容变了,按「内容变 ⇒ 版本必变」纪律**再提一版**(先例同 1.3.104→1.3.105、`docs/Argent-智能体平台-设计.md` §8.3 第 3 条)。版本号 1.3.121 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**1.3.123(2026-10-10,同批三次收口:安装器用法文案 · 门禁登记 · 引擎面去业务词)**:同一工作树里第三次收口 —— ① `install-argent.mjs` 的**用法头注释**补上 `--agent` / `--list-agents` / `--internal-roles` / `--capability remove` 四个入口(内容变 ⇒ 引擎 sha 变);② `scripts/tests/is-direct-run.test.mjs` 的**唯一登记处**加入 `scripts/check-agent-catalog.mjs`(新增 CLI 必须登记,否则端到端判据覆盖不到它;测试文件不在包内,本条只为留痕);③ 本文件里本批新加的 `_note` 文案去掉业务词(`vertical-lint` 的 engine-words 档按**基线**只拦新增,⛔ 不抬基线 ⇒ 改写文案而不是改基线)⇒ 引擎面内容再变,按纪律**再提一版**。版本号 1.3.122 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**1.3.124(2026-10-10,FULL 自动路径成功率修复批)**:共用引擎变更 —— `scripts/flow_failure.py` 新增失败组 **`capacityFull`**(判据来自注册表 `failureClasses.capacityFull`,**排在 `needs_human` 之前** —— 否则仓容满的文案会被 `需运营` 吞进 needsHuman,就再也分不出是哪条链;派发 kind 仍是 needs_human);`scripts/flow_config.py` 新增配置中心入口 `appointment_max_day()` / `catalog_default()`(按 key 从声明面取 `default`,**不是**第二条解析链);`configs/advanced.json` 新增声明 `advanced.appointment.max_day`(**默认 5**,原 3 —— 本批**唯一的行为变更**);`scripts/flow-requirements.json#failureClasses.capacityFull` 是分类侧同一份口径。本能力自身:`scripts/orchestrator.py` 新增**仓容前置探测**(进步骤4 前只读探测:仓容满 ⇒ **不进入步骤4**、直接落 `capacity_full` 失败;探测不可用 ⇒ 证据不足、照常尝试)+ `defer_capacity` 当日解除链 + `--mode capacity-probe` 只读 CLI;新增 `scripts/ml_capacity_probe.py`(**纯判据**,只有 stdlib ⇒ 可离线夹具回归)与 `scripts/analyze-full-day.py`(只读归因报表)。回归:`capacity-precheck` / `capacity-defer-lift` / `analyze-full-day` 三份;`check-sop-consistency` 的 C6b 判据**收紧**(capacityFull/pageFlaky 也要与注册表逐字一致,⛔ 未抬基线)。⛔ 未新增引擎面运行期文件(只改既有引擎文件 + 本能力脚本)。|**1.3.125(2026-10-10,同批二次收口:契约 anchor 跟随实现)**:`core/contracts/argent.contracts.json` 的 J4-failure-classification 判据登记(engine 面文件,四个包里的三个含它)—— ① owner/implementations 的行号与 anchor 跟着`scripts/flow_failure.py` 重排走(89/91 → 118/121);② anchor 从 `GROUPS = (('pageFlaky'` 改成**更精确**的 `GROUPS = (('capacityFull', 'needs_human')`(初版写成 `GROUPS = (` 被 `argent-contracts` 的 R1d 当场拦下:`scripts/daily-report.mjs` 里也有同名字符串 ⇒ anchor 太松就是假绿);③ outputs 补一行「命中的**组**名进 reason」。⚠️ 版本号 1.3.124 从未发布过(同批收口 ⇒ 以**最终内容**盖章,不存在「内容变了版本没动」的对外窗口)。本能力自身内容未再改动。|**1.3.126(2026-10-10,同批三次收口:两处文档小节号 + 去掉未用常量)**:`configs/advanced.json` 的 help 里指的小节号写错(§8.71 → **§8.72**,那是本批新落的小节;写错会把运营指到别人的事故记录上);`scripts/flow_config.py` 去掉一个未被使用的模块级常量 `CATALOG_DIRS`(死代码只会误导下一个人以为它在参与解析链)⇒ 引擎面内容再变,按「内容变 ⇒ 版本必变」各提一个补丁版本并重新盖章。⚠️ 版本号 1.3.125 / 1.2.115 / 1.1.122 从未发布过(同批收口 ⇒ 以**最终内容**盖章)。⛔ 行为零变化(三份回归复跑全绿)。|**1.3.130(2026-10-11,窗口与端口对齐:重启/端口漂移后**一条命令**恢复窗口)**:本能力自身新增执行器配套脚本 `scripts/ensure-store-windows.py`(**只进 full 的能力包脚本集**,⛔ 未进 `pack.engine` —— 它硬依赖同包内的 `scripts/orchestrator.py`,塞进共用引擎会让 hr/invoice/daily-report 的机器上多一个 `import orchestrator` 必崩的文件)。职责:**幂等地**把「该开的店铺窗口」开好、CDP 端口对齐、可驱动性断言过。动机 = 2026-10-11 客户机生产现场(FULL 触发器瞬时报「Bridge 正常但没有任何店铺」,随后自愈):① WebDriver API 的 `getBrowserList` 返回 `statusCode=0, data=None`(0 个店铺)⇒ **`startBrowser` 不可用**(`-10004 browserId或browserOauth缺失`);② 改用 **CLI 通道**(客户端自带的命令行 `store open --id <storeId> --expected-name <店名>`)当场可用(`launchSource: cli`);③ 但 `cdp-port-map.json` 里还是旧端口 ⇒ **引擎找不到窗口** —— 缺的不是能力,而是「**CLI 开窗后没人把新端口写进映射**」这一步(正常路径是引擎 `startBrowser` 时顺手写,CLI 开的窗口绕过了它)。本脚本把那一步收成一条命令,且**只复用引擎既有实现**(`_discover_cdp_ports` / `_match_port_by_user_data_dir` / `write_cdp_port_map` / `Orchestrator._port_from_cdp_map` / `_is_cdp_port` / `_acquire_open_port_lock` / `_release_open_port_lock` / `close_store_bridge`)⇒ ⛔ 没有第二套端口发现/归属判据/写入口。安全边界:**默认 dry-run**(写类 A3),真做要 `--apply`;⛔ 不 `startBrowser`(`--api-first` 明确拒绝,绝不假装已做);⛔ 不关任何窗口(**只有** `--force-reopen <店>` 才关);归属歧义(多个新端口都匹配不上 `chrome_<store_id>`)⇒ **拒绝乱连、不写映射**;⛔ 也**不调**云端店铺清单那条账号硬校验(它的判据在现场恰好在最需要恢复时不成立;防开错店由 `--expected-name` 逐字校验 + 开窗后的归属断言兜住)。⚠️ 该新引擎文件里**零业务词**(客户端可执行名引用 `env_probe.DEFAULT_STORE_CMD` 的既有唯一字面量)——`vertical-lint` 的 engine-words 档只拦新增且 ⛔ 不抬基线,先例同 1.3.114。文档 `docs/本机接班运行清单.md` §8.74。回归 `scripts/tests/ensure-store-windows.test.py`(52 断言,纯夹具:幂等跳过 / 漂移重对齐并覆盖 / CLI 失败不改映射 / dry-run 零写入 / 归属歧义拒绝乱连 / `--json` 与退出码三态 / 除 `--force-reopen` 外零关窗)。⚠️ **只有 full 提版本**(`capabilities.full.pack.scripts` +1 ⇒ 本能力的注册表投影与文件集变了;⛔ 未动 `pack.engine`,故 invoice/daily-report/hr 的投影字节不变 ⇒ 按「内容变 ⇒ 版本必变」**不需要**跟版);版本号**跳过 1.3.129**(该号由同工作树的并发批次占用 ⇒ 避免「同号不同内容」)。|**1.3.131(2026-10-11,认领前环境预检第二层回退:CDP 端口 + 店铺归属)**:共用引擎新增 `scripts/lib/cdp_ports.py`(CDP 调试端口的**唯一实现**:发现/归属/页面探针;进 `pack.engine`)⇒ 每个包里的注册表投影都变了(**无 flow 的 hr 也变**),四个包一起提版本。本能力**自身**:`scripts/orchestrator.py` 的三个 CDP 端口函数(`_is_cdp_port` / `_discover_cdp_ports` / `_match_port_by_user_data_dir`)改为**薄委托**(名字与语义逐字保留 —— `ensure-store-windows.py` 按 `orch.X()` 属性调用,既有回归 52 断言全绿)、`scripts/ensure-store-windows.py` 的 `/json/list` 探针同样薄委托(本文件不再 import urllib)⇒ 本能力包内容随之变化。⛔ 行为零变化:端口发现/归属/页面探针的判据一个字节没改,只是搬到了 lib 并让三处共用同一份。|**1.3.132(2026-10-12,Windows 安装路径三缺陷修复批)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `scripts/lib/preset-install.mjs`:**「已装集」判据改为选择痕迹** `presets.selection.json#kept`(⛔ 不再读 `package.json#dsh.bundle.patch` —— pnpm 对 `file:` 依赖建的是指向货架的链,读到的永远是货架自带的 14 条 ⇒ 收窄被自己的安装步骤抹掉),新增 `installedSelectionIds()` / `materializeBundleDir()`(软链**实体化**后再改写,⛔ 不走链写进仓库)/ `checkPresetSelectionConsistency()`(patch 实体 == presets.json 行 == dsh.bundle.patch == 痕迹);② `install-argent.mjs`:新增**第 7c2 步收尾重施**(第 7 步 `pnpm add file:…` 会把 profile 副本换回货架 14 个 ⇒ 旧实现在 winpc 真机\"声称只落 7/14、装完却是 14\",7 个内部角色永久留下)、版本体检改**两个候选落点**(克隆目录 + 安装器自己那棵树 —— Windows 的 boot 克隆场景,此前永远退回内置列表 ⇒ 现役 `0.1.7-rc.2` 被报\"未验证\")、`profile-doctor` 与升级器子进程**显式传 `DSH_HOME`**(否则 `--dsh-home <临时>` 时改的是真实 `~/.dsh`)、完成提示**按平台**给启动/重启指引(Windows 不再打 bash 的 `DSH_HOME=… dsh web …`);③ `scripts/lib/dsh-versions.mjs`:内置基线补 `0.1.7-rc.2` + 新增 `verifiedListGaps()` **防漂移门禁**;④ `scripts/argent-upgrade.mjs`:同一判据 + 收尾重施。⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个包一起提版本并重盖章。本能力流程 / 提示词 / 脚本**一字未改**。回归:`scripts/tests/preset-landing-selection.test.mjs`(48 断言:全新机器恰 7 个客户可见角色 / 客户机的 7 再跑安装**仍 7**(垫片 pnpm 中途真把它放大过)/ 14 坏态收窄到 7 / 三处集合+痕迹不变量 / 软链不走链改写仓库 / 真 pnpm 的机制证据)、`scripts/tests/dsh-verified-list.test.mjs`(21 断言:lock 里已晋级版本必须全在列表内(构造缺项 ⇒ 红)、`candidate/` 不参与、列表唯一真源、boot 克隆场景真跑一次)。⛔ 本批**未发布**(发布留给交付方)。|**1.3.133(2026-10-12,升级路径角色落盘追修批:已装集唯一来源 + 内部角色不变式)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `scripts/lib/preset-install.mjs`:「已装集」的**唯一来源**收口到 `resolveInstalledSelection()`(**可信痕迹** `presets.selection.json#kept` → 退回 `agents.json` 里各 agent 的 `roles` 并集 → 两级都没有 ⇒ **空集**=首次安装语义;⛔ **绝不**把 profile 里的 patch 实体 / `presets.json` 行 / `dsh.bundle.patch` 条目当已装集 —— 那三份铺完恒是 14,「客户可见 ∪ 已装 ∪ 本智能体」于是恒等于 14,收窄被自己的安装步骤抹掉),并给「可信」加了**判据**:痕迹含 `visibility: internal` 的角色而本机 `internalRoles ≠ true`(且未给 `--internal-roles`)⇒ 判不可信、**响亮报告**后按「痕迹缺失」处理(现场那份 `kept:14/excluded:[]` 的痕迹正是放大缺陷写出来的);新增**不变式** `checkNoInternalLanding()` —— 落盘集合不得含内部角色(除非 `--internal-roles` 或 `agents.json#internalRoles === true`),违反 ⇒ `applyPresetSelection()` **判红并拒绝写出**(⛔ 不静默剔除、不静默修);新增 `reseedBundleDir()` 与 `applyPresetSelection({reseedFromShelf})`(收尾重施必须**按货架重播再收窄**:副本已被削到 7 时就地再过滤永远只能得 7,`--internal-roles` 装不回来、自检还会拿「期望 14 ≠ 落盘 7」判**假红**);② `scripts/argent-upgrade.mjs`:**升级档与安装档同一条公式**(客户可见集 ∪ 可信已装集 ∪ 本智能体角色),⛔ 不再用 `agentScoped: agents.length>0`(它把客户可见集整个排除掉 ⇒ 现场那台只落 2 个角色);第 7.6 步收尾重施带 `allowInternal` + `reseedFromShelf`,判红即该步 `ok:false`;③ `install-argent.mjs`:第 4 步默认档 / `--agent` 子集 / 第 7c2 步收尾重施 / `--capability remove` 四处统一走可信已装集与授权口径(`--capability remove` 只为「本机已合法装了内部角色」时不误判红);④ **新增只读 CLI** `scripts/check-preset-landing.mjs`(四件套 + 已装集来源 + 两条不变式,任何一台机器可照抄自查,⛔ 不写任何文件)⇒ `pack.engine` 登记项 +1。**现场(winpc 真机,2026-10-12)**:profile 14 个 patch 实体 + 痕迹 `kept:14/excluded:[]` + `agents.json=[hr]` + `internalRoles=false`,重跑官网一条命令(升级路径)修前打的是 `preset 同步(行式): **14** 个角色` + `角色落盘集合收尾:14 个;三处集合 + 痕迹一致`(7 个内部角色一个没摘),修后同一台机器 ⇒ **7**(`excluded` 列出 7 个内部角色)并打印 `选择痕迹不可信 ⇒ 已装集退回 agents.json 角色`。回归:`scripts/tests/preset-landing-upgrade-path.test.mjs`(43 断言:现场复刻升级路径 ⇒ 7 且 **pre-fix 判据重建得 14**(鉴别力)/ `agents.json` 缺失 ⇒ 7 / 可信痕迹 7 不许放大 / `internalRoles:true` ⇒ 14 放行 / **不变式负样本判红且零写入** / 「铺货架 ≠ 选择」/ 现场真形态 `kept:14` ⇒ 7 且响亮报告 / 真 home 零增量)。⛔ 本批**未发布**(发布留给交付方)。本能力流程 / 提示词 / 脚本**一字未改**。|**1.3.135(2026-10-12,P1-A 宿主排程批:四道闸防线 + 日报试点声明)**:本能力的流程/提示词/脚本**一字未改**;共用引擎面变更(`scripts/flow_config.py` 新增 trigger.schedule 解析、`scripts/vertical-lint.mjs` 新增排程声明门禁、`scripts/lib/registry.mjs` 新增只读 flowSchedule())与**包内注册表投影**变化(业务线声明只动了日报;新增的 L1 `scripts/lib/schedule-probe.mjs` 与 L2 `scripts/argent-schedule.mjs` **刻意不进 pack.engine**,理由见 daily-report 的 `_note`)⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本并重盖章。新增回归 `scripts/tests/schedule-probe.test.mjs` / `scripts/tests/schedule-declaration.test.mjs`。|**1.3.137(2026-10-12,宿主门禁追修批:⛔ 不代装宿主 + npx 形态纳入宿主解析)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变,**含无 flow 的 hr**)——① `install-argent.mjs`:**删除** `--install-host` 代装入口(连同旧自动代装函数与宿主离线包的下载/解包/bin 链接逻辑;开关若仍被传入 ⇒ 报「该开关已废弃」+ **非零退出**(1 = 用法错误),⛔ 不静默忽略),被拒文案改为按 dsh **官方**运行方式给指引(首选 `npx @deepseek-ai/dsh@<窗口内版本> web`;备选官方「从源码运行」;四要素:① 你的版本不在支持窗口(列窗口)② 官方方式换成窗口内版本的一行命令 ③ 我们正在适配你的版本(⛔ 不给对外 ETA)④ 未改动你的 dsh);② **新增** `scripts/lib/dsh-host-resolve.mjs`(**进 `pack.engine`**):宿主解析链 = **PATH 上的 `dsh` → `DSH_BIN` → npx 缓存形态**(读 `<npm cache>/_npx/<hash>/node_modules/@deepseek-ai/dsh/package.json` 的 version,纯只读零网络;多候选按「最近使用优先(mtime 最新)+ 同刻路径升序」确定并**打印选了哪个**)⇒ **npx 形态算宿主**(旧口径「npx 不等于已安装宿主」作废),且 npx 形态下插件装配走**同一条 launcher**(`npx --yes @deepseek-ai/dsh@<版本> plugin --profile web add file:…`),⛔ 不许「检测到 npx 却去用 PATH 上的另一个 dsh」;③ `install.sh` / `install.ps1` 口径同步(ps1 仍声明并透传 `-InstallHost`,只为让旧命令行得到**可读**的「已废弃」原因而不是参数绑定错误)。本能力自身流程 / 提示词 / 脚本**一字未改**。回归 `scripts/tests/install-host-gate.test.mjs`(**219 断言**,纯夹具:垫片 dsh/npx + 本地裸库 + 临时 home,⛔ 零外网、⛔ 不碰真 `~/.dsh`;⚠️ `dsh plugin` 会绕过 `DSH_HOME`/`HOME` ⇒ 夹具只断言命令行、绝不真跑)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
267
|
+
"2026-10-12:运维开关 ARGENT_CAPACITY_PRECHECK=off(现场疑似「仓容满」误报时把 capacity_full 降级为 unavailable ⇒ 照常尝试步骤4,原判证据留在 bypassed;判据纯函数 ml_capacity_probe.apply_precheck_switch + 回归 81 断言)",
|
|
268
|
+
"2026-10-12:仓容前置探测**误报**修复(判据收紧为「严格阻断形态」+ 手动/CLI 跑完落终态台账);注册表投影在每个包内 ⇒ 四包一起提版重盖。",
|
|
269
|
+
"2026-10-12(步骤7 产品尺寸分级阻塞归因修复批):`scripts/orchestrator.py` + `scripts/ml_hub_status.py` —— 步骤7 失败路径新增**只读归因探测**(hub-v2 + units 页,只导航 + evaluate;探测后把页面还原回 volumes ⇒ 统一失败分支的截图/DOM 摘要语义不变),由**纯函数** `ml_hub_status.step7_block_verdict()` 出结论:① `size-block`(units 页 `size-dimensions-tag` ∉ 中小件允许集,如 `EXTRAGRANDE` ⇒ 商品超大件 + 本货件空间只收中小件 ⇒ **运营改包装尺寸/渠道,脚本侧无解**)② `precondition`(hub 有 `done=False` 的前置项,列**未完成项原文** + 需运营在门户完成)③ `unattributed`(都不是 ⇒ **逐字保留旧文案** + 补证据:`Agrupa tu stock` 缺失 / 当时 URL / 自愈轮数)。动机 = 生产现场 79301358 **连续 5 次**被旧文案误判成「门户改版/脚本缺陷 ⇒ 需 ml-dev 修选择器」(真因 = 商品被判超大件;运营实测强制启用那个 disabled 库存输入框 + 重输 + 保存**零效果**)。新增 units 页只读 dump `JS_UNITS_DUMP`(**零判定词**,只测量:尺寸标签/体积/空间原文/库存输入框 disabled 渲染态)+ 纯解析器 `parse_units_dump()` + `units_url()`;三态共用 `err_type=business` ⇒ ⛔ 探测结果**不改变失败码/阻断性**,探测失败一律落③。⚠️ 有意行为变化:①②含「需运营…」⇒ 分类由 `needs_agent`(唤醒角色去猜)变 `needs_human`(落卡等人)—— 正是本批要的结果。回归 `scripts/tests/step7-attribution.test.py`(纯夹具,含**鉴别力**对照与只读性 AST+运行时双证)。⛔ 未动 `pack.engine`(`orchestrator.py`/`ml_hub_status.py` 只在 `capabilities.full.pack.scripts`)⇒ 只有 full 提版本。",
|
|
270
|
+
"1.3.143(2026-10-12,P1-3 宿主窗口与 scope 定位批):共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `install-argent.mjs`:**空 `- insert:` 清理**(审计 §C.1 #1)——生成侧改走真源渲染器 `scripts/lib/patch-compose.mjs#renderInsertBlock()`(空数组 ⇒ **不再产出**空块;旧实现内联渲染且不看空数组);修复侧用 `stripEmptyInsertBlocks()`(只清\"真空白\"的块,⛔ 不碰有子项的 insert;幂等),**写前备份**(`<数据目录>/backup/patch-<profile>-<时间戳>/`,含 sha256 与逐字可照抄的回滚命令),⛔ 备份失败就**不改客户文件**;② `scripts/lib/dsh-scope.mjs`:**平铺档 `<dir>/node_modules/.bin/dsh` 上移进真源**(`scopeBinCandidates()`;本批把 P1-0 暂存在 `bootcheck-wiring.mjs#bootcheckBinCandidates()` 的那份副本**删除**,两处不再各自实现),并新增 `resolveDshScopeDir()`(标准 / 邻居 / 平铺三种布局 + 认 `--scope-dir` / `DSH_SCOPE` / `--global-bin` / `DSH_BIN`;⛔ 探不到 ⇒ 回 null 让调用方**响亮失败**,⛔ 不静默回退到 `npm root -g` 猜一个)给安装器 `scopeDirForPreset()` 用 ⇒ 消客户机 scope 探测陷阱(`npm root -g` 在那里报的是错路径,真身在 `<prefix>/node_modules/@deepseek-ai`);③ `scripts/lib/patch-compose.mjs#composeFix` 写回前过清理器 —— 实测:它的规则①(bundle 层迁移)会把只剩一个子项的 `- insert:` **掏空** ⇒ 升级路径上空块**又回来**(同一次真跑复现)。⛔ `pack.engine` **清单未变**(本批零新增文件)⇒ **无 flow 的 hr 不跟随提版**。本能力流程 / 提示词 / 脚本**一字未改**。回归:`scripts/tests/patch-empty-insert.test.mjs`(34 断言)、`scripts/tests/dsh-scope-resolve.test.mjs`(33 断言)、`scripts/tests/install-scope-window-patch.test.mjs`(49 断言,端到端:夹具 lock **根**放\"假快照\" ⇒ 窗口**立刻**含它、移到 `candidate/` ⇒ 立刻不含;客户机邻居布局判出**行式**;`DSH_BIN` 指向平铺树判出**目录式**;显式给错的 `DSH_SCOPE` ⇒ **响亮失败**;空 insert 清干净 + 备份/回滚可用 + 幂等 + 升级路径不回潮;真 `~/.dsh` **零增量**)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
271
|
+
"2026-10-12(0.5.0 真机验收缺陷批:插件依赖图 / 落盘跟随已装智能体 / 空 insert 收尾 / 升级路径 venv):共用引擎变更(只改 install-argent.mjs 一个引擎面文件 ⇒ 引擎 sha 变、每个带引擎的包内容都变,**无 flow 的 hr 不跟随提版**)——**A(阻断级)插件必须进 profile 依赖图**:真机现场「exit 0 但装出来是半残」——profile 的 package.json#dependencies 里只有角色挂载面那一条,两个应用级插件只在 node_modules/ 里有实体,而 0.2 的宿主**只加载依赖图内的插件** ⇒ 启动日志报 failed to import 且安装期**零报错**。根因:宿主无包管理器时安装器**静默**改走「把插件目录拷进 node_modules」并 exit 0。现在三条口径:① **优先真·注册**(npx 形态 + 真实 home ⇒ 走**同一条 launcher** 的 plugin --profile … add file:…;其它形态 ⇒ 用**已解析的包管理器**在 profile 目录做同一件事,cwd = profile 目录);② 宿主没有 pnpm ⇒ **借一个**(corepack / npx --yes pnpm@<钉住版本>,可用 ARGENT_PNPM_SPEC 覆盖)并把**实际使用的包管理器与版本**打进日志,⛔ 不再 npm install -g;③ 借不到或注册失败 ⇒ **非零退出 + 明确指引**(文案含「缺包管理器」与两条出路),⛔ **绝不**退回「拷贝后 exit 0」。另加**收尾依赖图自检**:断言本次注册的每个包都在 dependencies 里、spec 与本次 argv 的 file:<插件目录> 同源(按 realpath 比对,吸收包管理器的路径规范化),且**能被 profile 解析**;任一条不满足 ⇒ 非零退出 + 打印「怎么修」(⛔「实体在 node_modules 就算过」是假绿)。**新装与升级两条路径共用同一份实现**(真机两次跑都出了同一个半残形态)。**B 落盘集合跟随「已装智能体」**:旧口径是「客户可见集 ∪ 已装集」⇒ **只装壳也会落一批属于未装智能体的角色**(真机现场:7 个外发角色里有 4 个 ML 系 + 5 个 ML 技能,而对应智能体根本没装 ⇒ 那些角色行引用的插件不存在、启动报 never started)。新口径 = **基座集**(角色清单里声明「与智能体无关、恒装」的那些)∪ **已装智能体面**(智能体目录里该智能体声明的角色;「已装」= 装机账本 ∪ 本次点名);技能同理(并清理「属于货架技能世界、但没装它的智能体」的孤儿,⛔ 内部角色/用户自建技能只报告不删)。⛔ **未改智能体目录的声明语义**,口径一律取自仓库既有真源。**C 空 `- insert:` 收尾**:定位到写入点 = 组合校正侧(profile-doctor --fix 会按退役/重复挂载**删行**,把某个 `- insert:` 掏空,而它**没有**过空块清理器);现在**所有会动 profile 的步骤之后**再过一遍清理器(幂等、写前备份 + 回滚命令),并**硬断言空块数 = 0**(判红即非零退出)。**D 升级路径也建/校验 venv**:升级分支在「新装专属」的建 venv 步之前就退出 ⇒ 真机第二次跑 exit 0 但持久运行时不存在(定时器照跑、什么也不做);现在升级路径同样调用同一份运行时准备(版本门禁、支持 --python-bin、建完真 import 校验),失败即非零退出。回归:新增 scripts/tests/install-plugin-graph-and-landing.test.mjs(77 断言:无包管理器 ⇒ 非零且文案含「缺包管理器」且**无插件实体** / 借用可用 ⇒ 真调注册路径且依赖项落地 / 依赖图自检能判红 / 只装壳 ⇒ 落盘 = 基座集(零 ML 角色与技能,内部技能保留)/ 计划清单列出 ML 角色与技能 / 空块端到端 = 0 且幂等 / 升级路径建 venv、--python-bin 透传、失败路径非零),并把受影响的既有夹具换成**忠实**的包管理器垫片(报版本 + 真写依赖边;旧的「空操作垫片」= 假成功,本批起会被正确地判红)。⛔ 本批**未发布**(发布留给交付方)。(⚠️ 盖章说明:本版内容在同一工作树里经过**多轮收口**(先落实现并盖章,再补注释/文档收口)⇒ 以**最终内容**盖章(`--stamp --force`);版本号从未发布过,不存在「内容变了版本没动」的对外窗口。)",
|
|
272
|
+
"0.6.0 W9:插件发布为 @whyshu/argent-*(用户名 scope)+ 消费路径改 npm 名(保留 file: 回退)+ 发布流水线(预检/逐包/回读退避/审计);包名迁移与 profile 行/生成器同批改透。引擎面在制:install-argent.mjs、check-preset-landing.mjs、lib/{patch-compose,plugin-lifecycle,preset-install}.mjs。",
|
|
273
|
+
"0.6.0 W9 收口(补件):`pack.engine` **新增** `scripts/lib/plugin-packages.mjs` —— W9 把「插件 id ↔ npm 包名」收口成这一份唯一真源(`PLUGIN_PACKAGES` / `pluginIdOf` / `npmNameOf` / `fileSpecOf` / `npmSpecOf` / `migrateDependencyKeys` / `migratePluginRowNames` 支撑),而它被**两个已在引擎清单里**的文件**静态 import**:`scripts/lib/plugin-lifecycle.mjs` 与 `scripts/lib/preset-install.mjs`。未登记 ⇒ 打出来的包里没有它 ⇒ 装完第一次 `import` 就 `ERR_MODULE_NOT_FOUND`(不是静默降级,是**必崩**)。判据 = `node scripts/check-pack-closure.mjs`(修前:full / invoice / daily-report **各缺 1 件**,逐条点名 `plugin-packages.mjs`;修后缺件 0)。本文件是**纯 node 内建**(只 `import { readFileSync } from 'node:fs'`)⇒ 满足 `kernel-purity` 的 L1 约束。⚠️ `pack.engine` 是**分发清单**,而每个包的 tgz **都带一份注册表投影**(含 `pack.engine`)⇒ 改的是清单本身 ⇒ 四个包**全部**变字节,**含无 flow 的 hr**(它不背引擎文件,但背注册表投影)——一并 +1 patch 并重盖章,否则同一个版本号会对应两份字节(正是 `release-argent.sh --check-dl` 的能力包档要抓的形态)。⚠️ 与既往批次的判据区分:**只改**引擎面文件而**不动清单**时,`hr` 才不跟随提版(先例 1.3.142→1.3.143)。回归:`scripts/tests/pack-closure.test.mjs` + `check-pack-closure` 缺件 0。",
|
|
274
|
+
"0.6.0 W9 补丁(profile 面向字符串漏迁 scope):只改**引擎面文件**、⛔ **未动** `pack.engine` 清单本身 —— `scripts/lib/plugin-packages.mjs` 新增 `migrateBundleNames()` / `exactPluginIdOf()` / `canonicalPluginName()`(**读侧宽松、写侧严格**:路径形态只用于读,改写 profile 只认「裸 id」与「本仓 npm 名」,否则会把别的 scope 的同名包改写成我们的);`scripts/lib/plugin-lifecycle.mjs` 新增 `bundleLayerRows()`(bundle 名单用 id 声明、名字经真源合成);`install-argent.mjs` 新增 `normalizeProfileBundles()` 与 `pruneStaleBareLandings()`(写前备份 + 逐字回滚命令,备份失败即不改客户文件);`scripts/argent-upgrade.mjs` 补齐升级路径上**从未执行**的四类迁移(`ensureBundles` 不再把 id 直接写进 `dsh.profile.bundles`、`normalizeDepKeys`、`fixPatch` 给所有已知 id 归一行名、`syncPlugins`/`migrateBareLandings` 落位目录改包名);`scripts/profile-doctor.mjs` 补必需行不再写裸 id + 重复挂载判据认包名。真机形态(用户机器,0.2.0-rc.2):`dsh.profile.bundles` 里留着裸名 ⇒ 该 bundle **解析不到** ⇒ 皮肤/UI 壳**静默不加载**(安装期零报错)。判据:新增门禁 `scripts/tests/profile-scope-migration.test.mjs`(静态 sink 扫描 + 注入自证 + 接线逐点断言 + 夹具实跑)与 `scripts/tests/install-plugin-graph-and-landing.test.mjs` §9(预置四处全裸名 ⇒ 重跑安装命令 ⇒ 全部 scoped、无残留、幂等)。⚠️ 版本轴:**只改引擎文件**、⛔ 不动 `pack.engine` 清单 ⇒ 只有含引擎文件的三个能力包内容变(无 flow 的那个包不背引擎文件、摘要未变 ⇒ **不跟随**,先例 1.3.142→1.3.143)。⚠️ 盖章说明:本版内容在同一工作树里经过三次收口(① 落实现与门禁 ② 补本 `_note` ③ 收口若干注释与 doctor 的读侧点名)⇒ 以**最终内容**盖章;各次版本号都未发布过,不存在「内容变了版本没动」的对外窗口。",
|
|
275
|
+
"0.6.0 W2(2026-10-13,壳 bundle):**只改引擎面文件、⛔ 未动 `pack.engine` 清单本身** —— ① `plugins/argent-shell/`(新包:纯 bundle,零源码、零宿主 import;`dsh.bundle.patch` + `dependencies` = core/skin/presets 三条);② `scripts/lib/plugin-packages.mjs` 的 `PLUGIN_PACKAGES` 登记该壳(安装器与发布流水线同一份真源 ⇒ Lead 可用 `npm-publish-argent.mjs --only argent-shell` 发它);③ `install-argent.mjs` 第 7 步改为**壳优先**:`dsh plugin add @whyshu/argent-shell@<版本>`(官方路径)⇒ 依赖图由包管理器维护(core/skin/presets 走 hoisted 落 profile 根);壳装不上 ⇒ **回退**逐个插件注册,壳装上了但个别壳插件不在依赖图内 ⇒ **修补**那几个(既有逐插件路径逐字保留);④ 收尾自检(7c4)**新增**判据:`@whyshu/argent-shell` 在位时其三个依赖也必须能被 profile 解析(否则判红)。⚠️ 版本轴:**只改引擎文件、不动清单** ⇒ 含引擎件的三包内容变 ⇒ full/invoice/daily-report 各 +1 patch;**无 flow 的 hr 不跟随**(它只背 preset 目录,摘要逐字节未变 —— 判据 `--check-stamp` 实测)。回归:`scripts/tests/shell-bundle-assembly.test.mjs`(53 断言:官方路径壳优先 + 依赖图齐 / 离线 file: 回退仍走官方 launcher / 缺包管理器非零退出 / 存量 profile 幂等且无重复条目 / 两条有牙自证)+ `plugin-peer-coverage` 新 25 断言(纯 bundle 的显式豁免 + 4 条牙)+ `plugin-official-add-path` 39/0 与 `install-plugin-graph-and-landing` 106/0 未放宽。⛔ 本批**未发布**(发布留给交付方)。",
|
|
276
|
+
"0.6.0 W3(2026-10-13,agent = 一个 bundle):**只改引擎面文件、⛔ 未动 `pack.engine` 清单本身** —— ① 新增 6 个纯 bundle 包 `plugins/argent-agent-<id>/package.json`(零 JS;`dependencies` = 壳 + 该智能体声明的非壳插件;`dsh.bundle.patch = []`(合法空层:core/skin 由壳 insert、gateway/flow/ml 的挂载面仍是整装 + 设置页);**包内声明** `argent.agent{payload{capabilities,plan},flows,roles,skills,integrations,credentials,scheduler,plugins}`);② 新增生成器 `scripts/gen-agent-bundles.mjs`(声明驱动:`--check` 逐字节比对 + `catalog ⟺ 恰好一个 bundle` 双向 + 目录声明自检;产物禁止手改);③ `agents/catalog.json` 补 `argent-ml` 声明(5 个 ML 智能体的 `plugins` + 说明表)—— 此前漏声明 ⇒ 生成器无从推导「ML 类要装它」(⛔ 不许写死);④ `install-argent.mjs`:`--agent` 解析阶段读**包内声明**并与货架投影**逐字比对**(不一致 ⇒ 零写入 exit 2),用包内声明重建安装清单;landing 收尾新增 `installAgentBundlesAndSelfcheck()`(① 官方路径装 bundle `dsh plugin add @whyshu/argent-agent-<id>@<版本>` / 离线回退 `file:` ② 按声明装能力包 ③ 落盘集合语义不变 ④ 收尾自检四条:在依赖图内 ∧ 依赖可解析 ∧ 能力包已装 ∧ 角色/技能按声明落位 ⇒ 任一不满足 exit 1;装完再**重施一次角色落盘集合** —— 包管理器会把 presets 副本换回货架全量,与第 7c2 步同一份实现);注册机新增 `registerAgents()`/`registerAllWithBundles()`(agents 为空 ⇒ 逐字等价);顺带修掉一个既存 TDZ:`PNPM_BORROW_SPEC` 声明上移(`--agent`/升级路径都在第 7 步之前调装配机);⑤ `scripts/argent-agents.mjs` 回执的「其它插件」宇宙排除 `argent-shell` 与 `argent-agent-*`(它们是基座/智能体本身,不是「可以另外装的插件」);⑥ `scripts/lib/plugin-packages.mjs` 登记 6 个智能体 bundle ⇒ Lead 可用 `npm-publish-argent.mjs --only argent-agent-<id>` 发布。⚠️ 版本轴:**只改引擎文件、不动清单** ⇒ 含引擎件的三包内容变 ⇒ full/invoice/daily-report 各 +1 patch;**无 flow 的 hr 不跟随**(它只背 preset 目录 —— 判据 `--check-stamp` 实测其内容摘要逐字节未变)。回归:`scripts/tests/agent-bundle-generation.test.mjs`(57 断言,含 4 条牙)+ `scripts/tests/agent-bundle-install.test.mjs`(56 断言:官方路径 / 离线 `file:` 回退 / 老克隆逐字回退 / 幂等 / 5 条牙 —— 含「只落实体不写依赖边 ⇒ 自检判红」);`plugin-peer-coverage` 24→25(纯 bundle 豁免由货架派生 + 扫描面显式改数)、`kernel-purity` 63/0(新增 L2 层标注)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
277
|
+
"0.6.0 W3(同批二次收口,2026-10-13):同一工作树里**第二次**以最终内容盖章 —— 首次盖章后又落了两处**在 `pack.engine` 里**的收口:① `scripts/lib/plugin-packages.mjs` 不再逐条列智能体 bundle 的名字,改成**前缀规则**(`AGENT_BUNDLE_PREFIX` / `isAgentBundleId`,接进 `pluginIdOf`/`npmNameOf`/`packageMetaOf`/`exactPluginIdOf`)—— 名字带业务线词,逐条列进引擎面会脏掉 `vertical-lint` 的 engine-words 判据(基线 0 新增 = 红);② `scripts/vertical-lint.mjs#engineFiles()` 为**生成产物** `plugins/argent-agent-*/package.json` 加**结构性豁免**(与既有的 `capability-packs.lock.json` 同一条理由:生成产物、无人手写、必然带商品名;业务词真源 `agents/catalog.json` 不在扫描面内,⛔ 基线文件一字未动);同批 `scripts/npm-publish-argent.mjs` 按前缀**现扫** agent bundle 认包(发布面 7 → 13)。⚠️ 按「内容变 ⇒ 版本必变(含无 flow 的包)」,本版为**最终内容**;版本号 1.3.152 / 1.2.141 / 1.1.145 从未发布过(不存在「内容变了版本没动」的对外窗口)。⛔ hr 仍不跟随(其摘要逐字节未变)。",
|
|
278
|
+
"0.6.0 W3 收口:vertical-lint 的 `--root` 修 —— 注册表/数据面子脚本一律按 **lint 自身目录**定位,`--root` 只换注册表根(此前夹具根下无该脚本 ⇒ 子进程 ENOENT ⇒ 报「注册表合并失败」假红,core-sop-skill 夹具被误伤)。",
|
|
279
|
+
"**1.3.155(2026-10-13,失败自动重试(方案 a)批)**:`pack.engine` 新增 `scripts/flow-auto-retry.py`(可用性类失败的**受守卫自动重试**:候选 = 末条 failed/blocked ⇒ 唯一分类器判 `retryable` + 预约闸门放行 + 每票次数上限 + 冷却 + 每轮上限;真正的\"重置后重建\"**全部委托** `flow_retry.py`(走它的全部守卫),本脚本只做筛选/限流/可见性)+ `scripts/flow_config.py` 新增 `autoRetry` 段(**唯一读取点**:enabled/max/cooldownMin/perCycle,缺省 开/2/20/2)+ `scripts/flow-trigger.sh` 新增一步「先自动重试、再认领」(非零退出**不阻断认领**)。⇒ 引擎清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**),按「内容变 ⇒ 版本必变(含无 flow 的包)」四包一起提版本。本能力自身:触发面只对本流程生效(`case full`);流程 / 提示词 / 脚本一字未改。",
|
|
280
|
+
"**1.3.156(2026-10-13,失败自动重试(方案 a)批 · **同批二次收口**)**:首次以最终内容盖章(c99a04f)后又落了一处**在 `pack.engine` 里**的收口 —— `scripts/flow-auto-retry.py` 的次数上限改为按**尝试**计(台账 `retry` 事件数 + 本脚本审计里 `ok:false` 的被拒次数):委托侧拒绝时**不写**台账事件,只数台账会让\"每轮都会被拒\"的票(表里状态已不是失败 / 表备注分类或预约留痕与台账不一致…)**每轮**再试一次、长期白占\"每轮上限\"的名额并每轮刷卡片/审计 ⇒ 现在最多 `max` 次后明确交人工(日志点名\"其中 n 次被委托侧拒绝\")。题外(⛔ 本批不改):`scripts/flow_retry.py` 的\"缺陷④ 已有货件号默认拒绝清号\"闸门因调用了**未定义**的 `one()` 而被 `except Exception` 静默吞掉(实测 `NameError` ⇒ `ship_now=None` ⇒ 闸门事实上不生效)—— 属该文件的既存缺陷,**未动**(改它 = 改变守卫语义,需专门一批)。⚠️ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四包一起再提一版;版本号 1.3.155 / 1.2.145 / 1.1.148 / 0.1.66 从未发布过(同批收口 ⇒ 以**最终内容**盖章,不存在\"内容变了版本没动\"的对外窗口)。",
|
|
281
|
+
"修 flow_retry.py 的**死守卫**(2026-10-13):清号守卫原写 `one(row.get(f_ship))` 而本文件无 `one()` 定义 ⇒ NameError 被 `except Exception` 静默吞 ⇒ 已有货件号也会被清号重置(红线从未生效);改用唯一取值助手 `first()` 并去掉吞噬;新门禁 scripts/tests/flow-retry-guard4.test.py(15 断言,含两条有牙)。",
|
|
282
|
+
"**W7.7(2026-10-14,尾巴收口:智能体标题去掉「角色」字样 + 死指针改指新落点)**:本批改了 `pack.engine` 里的两件(`agents/catalog.json` 的两个 `title`、`configs/hr.json` 的 label/help)与本注册表自身的一处(`hr` 设置面板的 `hint`)⇒ 清单本身变了、且每个包的 tgz 都带一份注册表投影 ⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个能力包一起提版本并重盖章。口径:**角色 = DSH preset**,Argent 侧不复述角色清单(会话身份 ⇒ 官方「Agent 预设」区;安装 / 升级 ⇒ 设置 → Argent →「我的智能体」)。⛔ 本能力自身的流程 / 提示词 / 脚本一字未改。",
|
|
283
|
+
"**1.3.165(2026-10-14,P1-B `--no-wake` + 外部时序运营文案)**:共用引擎变更(`scripts/flow-trigger.sh` 新增 `--no-wake` —— 只认领 + 只写台账、不唤起会话;`scripts/lib/schedule-mechanism.mjs` 的 native 静态指令 `promptCommand` 带上该开关(宿主排程那条命令);`scripts/flow_triage.py` 的外部时序阻塞文案补齐两要素 —— 自动再试节奏(N 取声明面 `externalTiming.cooldownMin`)+ 人工接管方式(取消勾选放行位即停取);`scripts/run-tests.sh` 的干净树自检按判据 `[ -d .git ]` 跳过「需要 git 索引」的用例)⇒ 版本随引擎前进。本能力自身:流程 / 提示词 / 脚本一字未改(仅注册表投影与共用引擎前进)。⚠️ 盖章说明:本版内容在同一工作树里经过**二次收口**(先落实现,再按 `vertical-lint` 的 engine-words 判据改写文案 —— ⛔ **不抬基线**)⇒ 以**最终内容**盖章;版本号 1.3.165 从未发布过,不存在「内容变了版本没动」的对外窗口。",
|
|
284
|
+
"0.6.0 发版:平台 VERSION 0.4.0→0.6.0、契约 argentVersion 同步、宿主窗口晋级 0.2.0-rc.2;agent bundle BUNDLE_VERSION 0.1.0→0.1.1(内容随\"标题去角色\"变化,避免同版本换字节)。",
|
|
285
|
+
"0.7.0 W2:流程声明补 `runner`(三条流程)+ 门禁 flow-runner-declared(脚本须存在、args 须带 {ticket})。",
|
|
286
|
+
"0.7.0 W2:daily-report 补 runner 声明(ticketless)⇒ 全部流程 runner 齐;门禁收紧到\"0 未声明\"。",
|
|
287
|
+
"0.7.0 W2:`runner` 登记进 flow_config 顶层直通段与 _derive(否则 --json 不透出 ⇒ CLI 读不到声明)。",
|
|
288
|
+
"0.7.0 W5/W7:引擎包白名单纳入 `skills/`(CLI `skill show|sync` 的真源;此前包内没有技能)。",
|
|
289
|
+
"0.7.0 W8/S1:路径统一(22 个脚本改走唯一判据)触及本包成员 ⇒ 按纪律提版重盖章。"
|
|
290
|
+
],
|
|
291
|
+
"hostAssets": {
|
|
292
|
+
"scheduler": {
|
|
293
|
+
"required": true,
|
|
294
|
+
"install": "print-only",
|
|
295
|
+
"perFlow": true,
|
|
296
|
+
"command": "bash {home}/scripts/flow-timers.sh install --flow {flow}",
|
|
297
|
+
"_note": "安装器**只打印**(⛔ 不自动装,见设计文档 §7.3⑥):装完先别开,确认配置齐了再启用。"
|
|
298
|
+
},
|
|
299
|
+
"loginAutostart": {
|
|
300
|
+
"required": false,
|
|
301
|
+
"install": "opt-in-flag",
|
|
302
|
+
"flag": "--win-autostart",
|
|
303
|
+
"_note": "Windows 登录自启是**显式 opt-in**(默认不建);macOS 由 LaunchAgent com.whyshu.dsh-web 托管。"
|
|
304
|
+
},
|
|
305
|
+
"desktopShortcut": {
|
|
306
|
+
"required": false,
|
|
307
|
+
"install": "none",
|
|
308
|
+
"_note": "今天没有任何能力需要桌面项;保留键位是为了新增宿主时有声明位(⛔ 不许各宿主各写一套)。"
|
|
309
|
+
},
|
|
310
|
+
"_note": "宿主侧资产声明位(A 批,2026-10-10;补《Argent 智能体平台 设计》§8.3 第 3 条的缺口:能力包此前**没有任何宿主侧资产的声明位**,定时器/自启这类事只能由安装器**写死**推断)。字段语义:`required` = 该能力**是否需要一个常驻定时器**(无 flow 的能力必须 false —— 没有可定时的东西);`install` ∈ {`print-only`(安装器只**打印**命令,客户按需自行启用), `auto`(安装器自动注册), `none`};`perFlow` = 是否**逐条 flow** 一个定时器(判据 = 该能力名下的 flow 数);`command` = 用户可照抄的命令模板(`{home}` / `{flow}` 占位)。⛔ `loginAutostart` / `desktopShortcut` 今天一律 required=false / install∈{opt-in-flag,none} —— 如实声明现状,⛔ 不把\"我们希望有的\"写成\"已支持\"。门禁:`node scripts/check-agent-catalog.mjs`(C12:枚举合法 + required 与 flow 数自洽 + 与智能体目录的 `scheduler` 逐条一致)。"
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
"daily-report": {
|
|
315
|
+
"gate": {
|
|
316
|
+
"note": "由 daily-report-inbox.py 按「站点本地日期 × 幂等标记 × 推送点」判定"
|
|
317
|
+
},
|
|
318
|
+
"stateFields": [],
|
|
319
|
+
"failures": {
|
|
320
|
+
"enabled": false
|
|
321
|
+
},
|
|
322
|
+
"requiredCommon": [],
|
|
323
|
+
"minPlan": "pro",
|
|
324
|
+
"_minPlanNote": "**2026-10-09(变现分层落地)**:`enterprise` → **`pro`**。判据 = 用户已确认的产品模型「分界线 = **价值更高 / 风险更高 ⇒ 企业版**」:日报是**只读**能力(官方 API 只读查询 + 生成推送,⛔ 不写客户任何系统、⛔ 不动浏览器),与 `full`(箱唛/写操作)、`invoice`(发票/门户写操作)不同档 ⇒ 归 **Pro**。⛔ 只改**档位下限**,⛔ 不改流程行为、⛔ 不改价格口径;`daily-report` 的能力包版本随引擎前进(见 pack.version)。已装机器**不因本改动被卸载/停用**(缩权只影响后续下发,见 entitlements.plans._why 与 docs 策划案 §4.4)。",
|
|
325
|
+
"pack": {
|
|
326
|
+
"version": "1.1.165",
|
|
327
|
+
"scripts": [
|
|
328
|
+
"scripts/daily-report.mjs",
|
|
329
|
+
"scripts/daily-report.sh",
|
|
330
|
+
"scripts/daily-report-reconcile.mjs",
|
|
331
|
+
"scripts/lib/daily-report-core.mjs"
|
|
332
|
+
],
|
|
333
|
+
"skills": [
|
|
334
|
+
"ml-store-daily-report"
|
|
335
|
+
],
|
|
336
|
+
"_note": [
|
|
337
|
+
"能力包版本(语义化):改了该能力的流程/提示词/脚本/技能 ⇒ 必须提版本并重新打包 |**1.1.67(2026-09-30)**:共用引擎变更(flow-trigger.sh 新增「离线许可 / 租约二选一」闸门,并把 check-license.mjs / license-gate.mjs 纳入引擎分发)⇒ 版本随引擎前进。|**1.1.72(2026-10-03)**:共用引擎变更(`scripts/lib/repo-root.sh` 的 `argent_agent_path()` 去掉旧 node 前缀 `$HOME/node/bin`、换成现役 `$HOME/.local/node/bin` —— 否则生成的 launchd PATH 指向旧树,且只改 plist 会被重生成写回)⇒ 版本随引擎前进。|**1.1.73(2026-10-03,D1)**:共用引擎变更(`scripts/lib/registry.mjs` 支持**显式解释器** `py` —— 内核侧不再赌 PATH 上恰好有 `python3`;台账查询收口为 `core/lib/ledger.mjs`(**CLI 与 MCP 共用同一套**,MCP 不再自带一份 `slice(-tail)` 先截断后过滤的假空实现))⇒ 版本随引擎前进。|**1.1.74(2026-10-03,D2)**:共用引擎变更(`scripts/vertical-lint.mjs` 新增 `flow.skill` 校验 —— 缺声明 / 未在 manifest#skills 声明 / 技能目录不存在 三类即红;`scripts/vertical-init.mjs` 生成的流程带上 `skill` 声明,保证「生成即合规」)⇒ 版本随引擎前进。 |**1.1.75(2026-10-03)**:共用引擎变更(`scripts/flow_claim.py` 补 `--cases-from-dir` 透传 + dry-run 零副作用:不建台账目录/锁文件、不落店铺清单缓存、不写 blocked 台账、源层 case 落临时目录)⇒ 版本随引擎走。|**1.1.76(2026-10-03,P1 第二批)**:共用引擎变更(`scripts/check-license.mjs` 接**唯一判定入口** `core/lib/license-verdict.mjs`(三态 + 离线设备绑定,含 `device` 比对 / unbound 放行 / 自助重绑 3 次 + 7 天宽限),`scripts/license-gate.mjs` 新增 `--json`(只给程序消费,**不改判定/不改证据**)、`scripts/install-license.mjs` 补设备比对与 `--rebind`)⇒ 版本随引擎前进。|**1.1.77(2026-10-03,P4 批)**:共用引擎变更 —— `pack.engine` 纳入 **core 运行期文件**(26 项 core 运行期文件 + 3 项独立运行验证抓出的缺件(VERSION / flow_case.py / ml_schema_check.py),按实际 import 关系推导)⇒ 能力包自带 core,装机可不依赖 git/sync;同批数据目录链两步落地(`scripts/lib/argent_datadir.py`)⇒ 版本随引擎前进。|**1.1.78(2026-10-03,P4 批·独立运行复验)**:同上(新缺 3 项:`VERSION` / `scripts/flow_case.py` / `scripts/ml_schema_check.py`)⇒ 引擎纳入后独立运行复验通过。 |**1.1.83(2026-10-04,§8-③ 路径 (a):一次性激活码)**:共用引擎变更(同 invoice 1.2.76)⇒ 版本随引擎前进。|**1.1.85(2026-10-04,isDirectRun 统一 + 补两处引擎缺件)**:共用引擎变更(新增 `scripts/lib/is-direct-run.mjs` —— \"本文件是否被直接执行\"的**唯一判据**(realpath 比对);同批把升级器/安装器/各 check-*/日报/写手/飞书卡片共 10 个 CLI 的入口守卫换成它:旧形态 `pathToFileURL(argv[1]) === import.meta.url` 在软链路径(`/tmp` → `/private/tmp`)下**假否定** ⇒ CLI 静默不跑;本包内的日报/写手两个 CLI 随之变更)⇒ 版本随引擎前进;同批补两个**此前漏在引擎清单外**的运行期文件(本次\"独立运行复验\"抓出:包内 CLI 当场 ERR_MODULE_NOT_FOUND)—— `scripts/lib/argent-datadir.mjs`(内核数据目录判据的脚本侧再导出,包内日报/写手/卡片三个 CLI 都 import 它)与 `scripts/check-skill-classification.mjs`(`core/lib/doctor-customer.mjs` 静态 import ⇒ 缺它连 `argent --help` 都起不来)。|**1.1.88(2026-10-04,客户机试点:逃生阀透传 + 用法事实)**:共用引擎变更(同 invoice 1.2.81:`license activate` 的 `--allow-regression` 透传 + `--json` 下的倒退标注走 stderr + `--server` 用法事实)⇒ 版本随引擎前进。 |**1.1.89(2026-10-04,角色提示词收敛)**:包内容变更:`presets/argent-ml-daily/agent.cordis.yml` 的 persona 收敛到统一骨架(身份句 → 核心职责 → 环境/知识入口 → 协作规则 → 行为准则)+ 去判据复述(配置协议里的取值域改为引用工具 `impact`/`preview`,不再写 TopN 上下界)+ 错字修正(旧文案把平台名写成「美乐多」,改为正确写法) ⇒ 版本随内容前进。|**1.1.90(2026-10-04,O2 只读运营视图:`argent license ops`)**:共用引擎变更(新增 `core/lib/license-ops.mjs` —— 许可只读运营巡检:在途码/失败码/近 N 天事件时间线/席位账目/异常清单,替代 `mongosh`;`core/lib/license.mjs` 新增 `ops` 子命令;`core/contracts/{argent.contracts.json,verbs.schema.json}` 同批登记 + `reasonCodes` 新增 `field_missing`(O2 两个已知陷阱的响亮失败码:`state` 不是 `status`、席位不是存储字段 `used`);engine +1 项)⇒ 版本随引擎前进。(⚠️ 盖章说明:本版内容在同一工作树里经过两次收口(先落实现,再补契约 note 与词表去重)⇒ 以**最终内容**盖章;版本号 `1.1.90` 从未发布过,不存在\"内容变了版本没动\"的对外窗口)|**1.1.91(2026-10-04,O2 客户端接线:4 个只读接口)**:共用引擎变更(`core/lib/license-ops.mjs` —— `OPS_READ_ENDPOINTS` 的 4 条 `exists:false → true` 并真正发 GET(`codes-list`/`events`/`seats`/`devices/{codePrefix}`,契约 = `whyshu-svr@92c6233`);四处字段映射(`devices[].codePrefix→code`、`items/totals→principals/totals`、`device.found=total`、`timeline` 用服务端 `total`/`count` + 显式 `limit=200`);`405/400 field_unknown/429/401/403/400 bad_*` 一律 exit 2 响亮(`field_unknown`/`rate_limited`/`method_not_allowed`/`admin_required`/`bad_request`,同批登记进 `core/contracts/*`);新增 `coverage`/`coverageDetail`、`checkServerRows`、`serverPageMeta`、`summarizeCoverage`、`seat_used_mismatch`/`seat_totals_mismatch`;⛔ 仍只发 GET、零落盘、无 `--apply`、不探不调 `release-device`)⇒ 版本随引擎前进。⚠️ 服务端那 4 个接口**已就绪但未部署** ⇒ 线上仍报节级 `endpoint_missing`(⛔ 不是空集)。|**1.1.92(2026-10-04,O2 接线后收口:一行措辞修正)**:`core/lib/license-ops.mjs` 文件头「四处字段映射」表 **④** 的措辞改对(窗口内总数在 `timeline.server.total`;`timeline.scanned` 是**客户端窗口过滤后**的条数,⛔ 别当窗口内总数;落点由不存在的 `serverTimelineSection()` 改成 `serverPageMeta()` + 服务端分支)—— **一行注释同样改了引擎 sha** ⇒ 按纪律再提一版(先例同 `_engineNoteDoctor20261003`)。⛔ 行为零变化(254 断言 + kernel-purity 复跑全绿)。|**1.1.93(2026-10-04,合规改造:诊断上报改「告知—同意」)**:共用引擎变更(`scripts/telemetry.py` 默认改为 **opt-in**:`telemetryOptIn` 无键 = 关、`TELEMETRY_DISABLE=1` 硬关;新增采集时刻同意标记 `consent` 与「关闭期不采集/不堆积/不补发」迁移语义;字段 `host`(原始主机名)改为不可逆 `hostHash`,`redact()` 同步掩主机名;新增 `--purge`)—— 这些改了引擎 sha ⇒ 按纪律提版本(先例同 `_engineNoteDoctor20261003`)。客户端侧同批:安装器新增「诊断上报(可选)」步(非交互默认拒绝)、设置页新增可开关(写 `telemetryOptIn`)。|**实例令牌批次(2026-10-05,路线 B)**:共用引擎变更 —— `scripts/telemetry.py` 的凭证取值链从两级扩成三级(`ARGENT_INSTANCE_TOKEN` → `<数据目录>/instance-token.json`(**机器自带凭证**,0600)→ 账号令牌兜底);实例令牌走 **`x-instance-token`**(紧凑串 `it1.<b64url(payload)>.<sig>`)并可带 `x-instance-device`;新增**本地绑定自检**(令牌 instanceId ≠ 本机 installId ⇒ **不发网**、`lastError: instance-token-mismatch`)与 `--status.credential`(只显示来源类型/到期日与绑定态,⛔ 不显示令牌值)。`scripts/install-license.mjs` 新增 `--instance-token-file`(与许可**同一条离线下发链路**,先判后写:归属/设备码/期限对不上即拒装;0600 + 备份 + 原子落盘 + 幂等),`scripts/install-one-shot.mjs` 的 `license` 段透传该参数;新增回归 `scripts/tests/telemetry-instance-token.test.mjs`(62 例,含 JS⇄Python 对拍),`scripts/tests/telemetry-consent.test.mjs` 补「令牌 ≠ 同意」。动机:客户机此前靠 30 天账号 JWT 上报(2026-11-04 到期,且服务端 2026-09-14 轮换 JWT_SECRET 时全灭),交付一台机器就该交付**随机器走**的凭证。服务端契约与签发/续期/吊销手册见 `whyshu-svr/docs/ops/instance-token.md`。⛔ 本轮**未新增运行期文件**(只改上述三个既有引擎文件),故 `pack.engine` 清单不变。|**1.1.96(2026-10-06)**:包内容变更(业务线 `verticals/<id>/manifest.json` 是各能力包内容集的一部分)——业务线 `requires.argent` 由 `>=0.2 <0.3` 抬到 `>=0.3 <0.4`、`version` 0.1.0→0.1.1(P0-5,修「Argent 能力 → 概览」把唯一业务线误标 `⚠️ 版本不满足`);⛔ **未新增运行期文件、未改共用引擎**,故 `pack.engine` 清单不变,按既有纪律只提受影响能力包的补丁版本并重盖章。|**1.1.97(2026-10-06,MCP 工具安全注解)**:共用引擎变更(同 invoice 1.2.90:`core/mcp/server.mjs` 的 `tools/list` 加 MCP 规范 `annotations`(只读 9 / 写类 5),零行为改动、工具数仍 14)⇒ 版本随引擎前进。|**1.1.99(2026-10-08,WebDriver 用法 P0 批)**:共用引擎变更(P0-1 依赖表补 `selenium` ——`install-argent.mjs` 的 `pythonRuntimePlan().pkgs` 与 `scripts/lib/python-runtime.mjs` 的 `venvUsable` 默认 `pkgs` 同批加第五项,官方唯一推荐的驱动档位(`ZINIAO_MODE=selenium`)此前**装都没装** ⇒ 选型开关静默撒谎、该档位从未运行过一次;缺它时老 venv 必须判「未就绪」否则 `ensure` 空转、永远装不上;同批 `SeleniumClient` 的 ImportError 分支改显著 warn + 选型处预检并显著 warn 后回退 Playwright(官方不建议)、`--mode inspect` 报 `driver_tiers`;P0-2 `updateCore` 总超时 60→300s / 单次 30→60s(官方建议值)并把官方 `msg` 进度打进日志;P0-3 每题尾部**只读** before/after 窗口快照并排 + 连续 3 轮泄漏 ⇒ 台账 blocked(needs_human,⛔ 不自动关店);P1-a `_wd_call` 落 requestId/耗时一行;P1-b `-10006` 按官方语义重试一次。⛔ 未新增运行期文件(只改上述既有引擎文件),故 `pack.engine` 清单不变。)|**1.1.104(2026-10-09,P0 注册表投影)**:共用引擎变更(`install-argent.mjs` 的 `--expect-sha256` 改为**一个包一个**摘要(可逗号分隔/重复给,数量不匹配=用法错)+ `--check-update` 合成**一条**可原样跑的「一起装」命令;`scripts/argent-capabilities.mjs` 加 **P2a 不变量**:投影落 `scripts/flow-requirements.json`(引擎级 base)前先摘掉不属于 base 的 `flows`/`aliases`)。能力包自身:包内注册表投影**只并引擎级段**(flow 不再抄进投影 ⇒ 与 `verticals/<id>/flows.json` 不再重复定义),并**同批带上** `verticals/<id>/flows.json`(旧包只带 manifest ⇒ 纯包装机 `flow_registry.py --json` exit 2)。判据:`scripts/tests/install-registry-loadable.test.mjs`(装完即加载注册表,五态)。|**1.1.105(2026-10-09,引擎锁跨平台化)**:共用引擎变更 —— 新增 `scripts/lib/argent_filelock.py`(模块名带 `argent_` 前缀 = **撞名防线**:PyPI 上有同名且极常见的 `filelock` 包,实测在 Windows 真机上被 `import filelock` 静默拿到过)(跨平台**排他文件锁唯一真源**:POSIX `fcntl.flock` / Windows `msvcrt.locking`,同一 API、同一锁文件约定),并把 `scripts/flow_claim.py` / `scripts/flow_ledger.py` / `scripts/telemetry.py` 的**顶层** `import fcntl` 与 `scripts/orchestrator.py` 的 **10 处**函数内 `fcntl` 全部换成它 ⇒ Windows 上认领/台账/遥测不再 `ModuleNotFoundError`(此前整个不可用),编排器的锁不再 `except: pass` **静默变 no-op**(互斥类 fail-closed、追加/审计类响亮降级 + 逐次计数)。⛔ 业务语义 / 数据格式 / 事件形状零变化:POSIX 侧与旧实现**逐字等价**(同一次 `flock` 调用、同一把锁文件、同一阻塞语义;`best_effort` 只在锁不可用时介入);同批 `pack.engine` 登记新文件。回归 `scripts/tests/filelock.test.py`(两进程抢锁 / 新旧逐字节对照 / 无 fcntl 可 import / Windows 分支桩测,52 断言)。(⚠️ 盖章说明:本版内容在同一工作树里经过**多轮收口**,以**最终内容**盖章;版本号从未发布过,不存在「内容变了版本没动」的对外窗口。三轮都来自**真机(Windows)实测**:① `import filelock` 与 **PyPI 同名包**撞车(探针当场拿到第三方的 `WindowsFileLock` 类)⇒ 改名 `scripts/lib/argent_filelock.py`(与 `argent_datadir.py` 同惯例)并同步四处 import;② Windows 无 `/tmp` ⇒ `lock_dir()` 的 Windows 缺省改用系统临时目录(POSIX 缺省**逐字不变**);③ **3 进程 ×15 条并发追加只活下 42 条**(Windows `_O_APPEND` 非原子)⇒ 根因是 `best_effort` 默认退成了**非阻塞**(旧实现是阻塞 `flock`),改为 `blocking=True` 默认并补回归(`filelock.test.py` §6b:持锁期间 append 必须**排队**,故障注入可复现变红)⇒ 复跑 45/45;④ 真机再实测出**强制锁挡读**:锁住数据文件**第 0 字节**会让别的进程**整文件读不了**(`flow_ledger.read()` 当场 `PermissionError`)⇒ Windows 锁区间挪到**文件内容之外**(第 2^40 字节起 **1 字节**;`LockFile` 允许锁到 EOF 之外且不分配、不改大小)⇒ 锁照样跨进程互斥、**读者零影响**(真机复验:持锁期间整文件读正常、解锁后可锁))|**1.1.106(2026-10-09,能力包地址真源收敛)**:共用引擎变更(`install-argent.mjs` —— ① `--capability` 的包地址**真源收敛**:有 install-ticket 清单 url 就用**清单的**(它与清单里的 sha256 同源 ⇒ \"地址+摘要\"成对可信),只有无账号/离线/清单没给 url 时才回落 `--pack-base` + 锁内版本自拼,且计划清单**逐条标注地址来源**(旧实现无条件自拼 ⇒ `--pack-base` 一整段绕开清单);② `--check-update` 主推 `--capability <服务端授予全集>`(不再要用户手抄四条 URL 与四个摘要),`--from-packs … --expect-sha256 …` 降为**离线/裁剪交付的进阶备选**另起一行;③ `--check-update` 对「显式零能力」账号改**中性提示**(exit 0)—— 旧实现把\"啥都没买\"报成\"拿不到服务端能力清单\"故障;判据换成\"服务端回没回 `capabilities` 字段\";`scripts/argent-capabilities.mjs` 的 `parseCapabilityManifest` 为此新增 `capabilitiesPresent`)⇒ 版本随引擎前进。同批 `scripts/release-argent.sh --check-dl` 新增**能力包档**(对服务端清单里每个包逐个 HTTP 取回 + `capability_pack.py --digest-tgz` 重算内容摘要 == 清单 sha256;不通过即判红)—— 该脚本与 `capability_pack.py` **都不在** `pack.engine`,故不改包内容。|**1.1.107(2026-10-09,同批二次收口:`--dsh-home` 必须同时决定数据目录)**:共用引擎变更(`install-argent.mjs` —— `DATA_DIR` 从**模块级 `const`** 改成**取值函数 `dataDirOf()`**。旧形态在 `--dsh-home` **解析之前**就求值 ⇒ 账本写进 `--dsh-home`、而 **packs-cache 写进默认 `~/.dsh/argent`**:后果不是\"多一个文件\",而是**定向安装/测试用的临时 home 会往真实 `~/.dsh` 里写**——\"⛔ 不碰既有 home\"当场不成立。同文件 `PRESET_ROOT` 早有同因修复(注释原文:\"const 提前求值会锁死默认 ~/.dsh\"),`DATA_DIR` 是漏网的那一个。**真机取证**:Windows 定向安装后 `C:\\Users\\<u>\\.dsh\\argent\\packs-cache\\` 多出 hr-0.1.41 / full-1.3.104 / invoice-1.2.99 / daily-report-1.1.106 四条(已逐条清除,回到原有 10 条);同场景换成 HEAD 版安装器可复现(`\\$HOME/.dsh/argent/packs-cache` 被创建)。无 `--dsh-home` 时 `dshHome = ~/.dsh` ⇒ 真实装机路径**逐字节零变化**。回归:`scripts/tests/install-capability-url-source.test.mjs`【E】(把子进程 HOME 也钉进临时目录,断言默认数据目录**没有被创建**)。|**1.1.108(2026-10-09,配置地基:配置目录 + 通用读取器)**:共用引擎变更 —— `pack.engine` 新增 `core/lib/config-catalog.mjs`(配置面的**唯一**读取器:五级解析链 env → 域 env 文件 → config.json → 业务线/机器本地文件 → 声明 default;API `get/require/sourceOf/isConfigured/all/describe/invalidate`;secret 项在 `describe()` 里**结构性**不回值)+ 5 个引擎级配置目录文件 `configs/*.json`(账号 / 通知与投递 / 宿主与机器 / 人事(HR) / 高级与诊断);业务线级目录 `verticals/<id>/config.json` 由 `capability_pack.manifest()` 随 manifest/flows **同批带上**(改了 `scripts/capability_pack.py` ⇒ 本次三个带 flow 的能力包内容都变了)。四道门禁:`node scripts/check-config-catalog.mjs --strict`(①双向对账 ②敏感不出门 ③必须项可解析 ④新增即生效)+ 回归 `scripts/tests/config-gates.test.mjs`(84 断言,含「注入假象必须变红」的自证)。⛔ 不改任何现有配置的取值行为(读取器是**新增**入口,现有调用方仍按自己的链路读;每项声明的 `todayChain` 如实记录「今天代码的优先级」,迁移时逐项核对)。契约见 `docs/Argent-宿主适配契约.md` §7。|**1.1.109(2026-10-09,配置地基第二批次:设置页「配置中心」+ 逐能力「检查更新」)**:共用引擎变更 —— `core/lib/config-catalog.mjs` 增「可写落点 / 旧优先级提示 / 分类 order」进 `describe()` 载荷,`configs/advanced.json` 把 `capability.checkUpdate` 的 `implemented` 如实改为 `true`,`install-argent.mjs` 的 `--check-update` 增 `--json` + `--capability` 过滤(设置页与命令行**同一份比对**)⇒ 版本随引擎前进(本能力的流程/提示词/脚本内容一字未改)。|**1.1.110(2026-10-09,变现分层落地)**:本能力档位下限 `enterprise` → **`pro`**(只读 ⇒ Pro;业务线清单 `verticals/<id>/manifest.json` 同批)+ `presets/argent-ml-daily/preset.yml` 描述的档位词同步 ⇒ 包内容随之变化(含业务线清单与 preset),按纪律提版本。(同批引擎级:注册表 `entitlements.plans` 新增 `ml-pro`、`daily-report` 在既有两个套餐里的授予档位改为 `pro`。)|**1.1.113(2026-10-09,预约失败判定链 + 口径统一)**:共用引擎 `scripts/flow_failure.py` 变更(新增 `canonical_reason()` 与 `--case` —— 打印某 case 的**规范失败原因**:优先读台账 `failed.reason`,老台账回落到 `error` 去身份前缀;给角色/运维一个**逐字照抄**的取数口,杜绝\"表备注写 A、账本写 B\")⇒ 所有能力包的注册表投影同批变化。本能力自身:本能力的流程/提示词/脚本内容一字未改(仅注册表投影与共用引擎前进)。(⚠️ **盖章说明**:本版内容在同一工作树里经过**多轮收口**(先落实现,再按 vertical-lint 的引擎业务词约束改注册表文案、再收口文案)⇒ 以**最终内容**盖章;版本号从未发布过,不存在\"内容变了版本没动\"的对外窗口。)|**1.1.114(2026-10-09,三处生产实测收口:票不许静默消失 · 失败必写原因+动作 · 发票流程 Rule R)**:共用引擎变更 ⇒ 四个能力包一起提版本并重盖章。① `scripts/flow_triage.py`:判定改为**有效末条事件**(`INFO_EVENTS = phase/wake/policy_apply/policy_new` 回退到最近一条状态性事件;`failed_ack` = 有意不动且**不参与回退**)、`blocked` 从「静默 pass」改为可见的 `needs_human`,并加**循环后对账兜底**(任何未归桶的 case ⇒ `needs_human`,kind=unclassified)——修的是客户机生产实测 P0(某发票票):其尾部是 `blocked → phase` ⇒ 分诊摘要全 0、运营勾了放行也不派发、且**不在「需人工」里**(静默卡死)。② `scripts/flow_failure.py`:新增运营文案**唯一来源** `ops_message()`(`结论:<业务类|系统类|我方缺陷类>|<原因>|动作:…`,≤300 字)与 `release_hint()`(放行位/提示的**唯一实现**:变体与**顶层** pick 都认;`orchestrator._ops_action_hint` 改为委托它);③ **新增** `scripts/invoice_fail_closeout.py`(属**发票能力专属脚本** `capabilities.invoice.pack.scripts`,⛔ 不进共用引擎 —— 它只写发票那一列):失败/成功收口 —— 把**同一串**写进表「发票错误信息」与台账(`detail` 逐字相同、`error` 放规范原因),取不到原因 ⇒ **exit 2 拒绝执行**,代码级异常归「我方缺陷类」且**不回原文**,成功 ⇒ `--clear-error` 清空;④ `scripts/flow_return_to_ops.py`:缺口回填文案改用同一来源(表字段 == 台账 `detail`);④b `scripts/flow_config.py`:归一化的 `guards` 增**标量透传**(`writer`=写手路径、`errorField`=失败原因列 —— 不透出就只能各自把路径/列名写死,那正是「判据第二份」与业务词泄漏进引擎的来源);⑤ 业务线声明(`verticals/<id>/flows.json`):两个发票流程新增 `pick.release` / `pick.releaseReDispatch`(放行位 = **各自的门控列**「发票就绪」;上限 3 / 冷却 30)与 `guards.errorField`。本能力自身:流程/提示词/脚本内容一字未改(仅注册表投影与共用引擎前进)。|**1.1.115(2026-10-09,配置「生效来源」可见化 + 冲突告警,批 1)**:本能力自身:流程 / 提示词 / 脚本内容一字未改(仅共用引擎与注册表投影前进)。共用引擎 `core/lib/config-catalog.mjs` 新增**纯函数** `resolveEffective()`(按规范链算「谁赢了 / 谁被压住」)、密钥脱敏 `redactSecret()` 与读取器 `effectiveOf()/levelsOf()`,并新增只读 CLI `scripts/config-explain.mjs`(`--key/--all/--list/--json`)⇒ 能力包内容变化,按纪律提版本并重盖章。⛔ **零行为变化**:读取器的取值路径(`resolveOne`)与任何 `todayChain` 一个字节都没改,只是「如实展示」;同批回归 `scripts/tests/config-effective.test.mjs`(63 断言)+ 端点 / 页面两条既有回归扩测。|**1.1.116(2026-10-09,同批收口:脱敏闸幂等)**:只读 CLI `scripts/config-explain.mjs` 的\"再脱敏\"兜底闸原先**无条件**执行 ⇒ `❰已设置(长度N)❱` 里的 N 变成**占位串自己的长度**(恒 11,实测),而用户正是拿它比对\"密钥换没换\" ⇒ 已改为**幂等**(含被压住的那级)并补回归;引擎面同一份 CLI 变了 ⇒ 包内容变化,按纪律再提版本并重盖章。本能力自身内容一字未改。|**1.1.118(2026-10-10,A 批:按智能体安装清单 —— 客户从「智能体库」选一个装,只装它的东西)**:① **`pack.engine` 新增两项**:`agents/catalog.json`(L0 货架声明:agent → capability + flows 子集 + 角色 + 插件/技能/集成/凭据槽)与 `scripts/argent-agents.mjs`(声明解析/校验/清单构造;安装器与门禁**共用一份**判据)⇒ 引擎清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**,按「内容变 ⇒ 版本必变(含无 flow 的包)」这条不变式一起提版本);② **共用引擎行为变更**(`install-argent.mjs` / `scripts/lib/preset-install.mjs` / `scripts/argent-upgrade.mjs`):新增 `--agent <id>[,<id>…]` / `--list-agents` / `--internal-roles` / `--capability remove <id>`(写前备份 + 审计);preset **行落盘集合**改为「按清单收窄」(`--agent` ⇒ 恒装 + 本智能体角色 + 已装集;默认 ⇒ 客户可见集 + 已装集;**内部角色默认不落**);升级器按 `<dshHome>/argent/agents.json` **重新施加**同一集合(否则一次升级就把收窄还原);**未给 `--agent` 时 CLI 契约与计划清单输出与改动前逐字一致**(差分回归钉住);③ 本能力自身:⛔ 流程/提示词/脚本**一字未改**(只有引擎面与 pack.engine 前进)。回归:`scripts/tests/agent-catalog.test.mjs`(110 断言,七条判据:只落本智能体 / 子集过滤 / 向后兼容差分 / 未知输入零写入 / remove 备份+审计 / 目录 schema / 内部角色默认不落)。|**1.1.119(2026-10-10,同批二次收口:宿主资产声明 + 门禁)**:同一工作树里第二次收口(先落 `--agent` 实现并盖章,再补 `capabilities.<c>.pack.hostAssets`(**宿主侧资产声明位**:定时器/登录自启/桌面项)与它的门禁 C12,并把 `scripts/argent-agents.mjs` 的清单/回执接上宿主资产)⇒ 引擎面文件内容变了,按「内容变 ⇒ 版本必变」纪律**再提一版**(先例同 1.3.104→1.3.105、`docs/Argent-智能体平台-设计.md` §8.3 第 3 条)。版本号 1.1.118 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**1.1.120(2026-10-10,同批三次收口:安装器用法文案 · 门禁登记 · 引擎面去业务词)**:同一工作树里第三次收口 —— ① `install-argent.mjs` 的**用法头注释**补上 `--agent` / `--list-agents` / `--internal-roles` / `--capability remove` 四个入口(内容变 ⇒ 引擎 sha 变);② `scripts/tests/is-direct-run.test.mjs` 的**唯一登记处**加入 `scripts/check-agent-catalog.mjs`(新增 CLI 必须登记,否则端到端判据覆盖不到它;测试文件不在包内,本条只为留痕);③ 本文件里本批新加的 `_note` 文案去掉业务词(`vertical-lint` 的 engine-words 档按**基线**只拦新增,⛔ 不抬基线 ⇒ 改写文案而不是改基线)⇒ 引擎面内容再变,按纪律**再提一版**。版本号 1.1.119 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**1.1.121(2026-10-10,FULL 自动路径成功率修复批)**:共用引擎变更 —— `scripts/flow_failure.py` 新增失败组 **`capacityFull`**(判据来自注册表 `failureClasses.capacityFull`,**排在 `needs_human` 之前** —— 否则仓容满的文案会被 `需运营` 吞进 needsHuman,就再也分不出是哪条链;派发 kind 仍是 needs_human);`scripts/flow_config.py` 新增配置中心入口 `appointment_max_day()` / `catalog_default()`(按 key 从声明面取 `default`,**不是**第二条解析链);`configs/advanced.json` 新增声明 `advanced.appointment.max_day`(**默认 5**,原 3 —— 本批**唯一的行为变更**);`scripts/flow-requirements.json#failureClasses.capacityFull` 是分类侧同一份口径。本能力自身:`scripts/orchestrator.py` 新增**仓容前置探测**(进步骤4 前只读探测:仓容满 ⇒ **不进入步骤4**、直接落 `capacity_full` 失败;探测不可用 ⇒ 证据不足、照常尝试)+ `defer_capacity` 当日解除链 + `--mode capacity-probe` 只读 CLI;新增 `scripts/ml_capacity_probe.py`(**纯判据**,只有 stdlib ⇒ 可离线夹具回归)与 `scripts/analyze-full-day.py`(只读归因报表)。回归:`capacity-precheck` / `capacity-defer-lift` / `analyze-full-day` 三份;`check-sop-consistency` 的 C6b 判据**收紧**(capacityFull/pageFlaky 也要与注册表逐字一致,⛔ 未抬基线)。⛔ 未新增引擎面运行期文件(只改既有引擎文件 + 本能力脚本)。|**1.1.122(2026-10-10,同批二次收口:契约 anchor 跟随实现)**:`core/contracts/argent.contracts.json` 的 J4-failure-classification 判据登记(engine 面文件,四个包里的三个含它)—— ① owner/implementations 的行号与 anchor 跟着`scripts/flow_failure.py` 重排走(89/91 → 118/121);② anchor 从 `GROUPS = (('pageFlaky'` 改成**更精确**的 `GROUPS = (('capacityFull', 'needs_human')`(初版写成 `GROUPS = (` 被 `argent-contracts` 的 R1d 当场拦下:`scripts/daily-report.mjs` 里也有同名字符串 ⇒ anchor 太松就是假绿);③ outputs 补一行「命中的**组**名进 reason」。⚠️ 版本号 1.3.124 从未发布过(同批收口 ⇒ 以**最终内容**盖章,不存在「内容变了版本没动」的对外窗口)。本能力自身内容未再改动。|**1.1.123(2026-10-10,同批三次收口:两处文档小节号 + 去掉未用常量)**:`configs/advanced.json` 的 help 里指的小节号写错(§8.71 → **§8.72**,那是本批新落的小节;写错会把运营指到别人的事故记录上);`scripts/flow_config.py` 去掉一个未被使用的模块级常量 `CATALOG_DIRS`(死代码只会误导下一个人以为它在参与解析链)⇒ 引擎面内容再变,按「内容变 ⇒ 版本必变」各提一个补丁版本并重新盖章。⚠️ 版本号 1.3.125 / 1.2.115 / 1.1.122 从未发布过(同批收口 ⇒ 以**最终内容**盖章)。⛔ 行为零变化(三份回归复跑全绿)。|**1.1.126(2026-10-11,同批:引擎面新增 `scripts/lib/cdp_ports.py`)**:本能力的流程 / 提示词 / 脚本**一字未改**;共用引擎新增 CDP 端口发现/归属/页面探针的唯一实现(认领前环境预检第二层回退),包内注册表投影随之变化 ⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」提版本并重盖章。|**1.1.127(2026-10-12,Windows 安装路径三缺陷修复批)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `scripts/lib/preset-install.mjs`:**「已装集」判据改为选择痕迹** `presets.selection.json#kept`(⛔ 不再读 `package.json#dsh.bundle.patch` —— pnpm 对 `file:` 依赖建的是指向货架的链,读到的永远是货架自带的 14 条 ⇒ 收窄被自己的安装步骤抹掉),新增 `installedSelectionIds()` / `materializeBundleDir()`(软链**实体化**后再改写,⛔ 不走链写进仓库)/ `checkPresetSelectionConsistency()`(patch 实体 == presets.json 行 == dsh.bundle.patch == 痕迹);② `install-argent.mjs`:新增**第 7c2 步收尾重施**(第 7 步 `pnpm add file:…` 会把 profile 副本换回货架 14 个 ⇒ 旧实现在 winpc 真机\"声称只落 7/14、装完却是 14\",7 个内部角色永久留下)、版本体检改**两个候选落点**(克隆目录 + 安装器自己那棵树 —— Windows 的 boot 克隆场景,此前永远退回内置列表 ⇒ 现役 `0.1.7-rc.2` 被报\"未验证\")、`profile-doctor` 与升级器子进程**显式传 `DSH_HOME`**(否则 `--dsh-home <临时>` 时改的是真实 `~/.dsh`)、完成提示**按平台**给启动/重启指引(Windows 不再打 bash 的 `DSH_HOME=… dsh web …`);③ `scripts/lib/dsh-versions.mjs`:内置基线补 `0.1.7-rc.2` + 新增 `verifiedListGaps()` **防漂移门禁**;④ `scripts/argent-upgrade.mjs`:同一判据 + 收尾重施。⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个包一起提版本并重盖章。本能力流程 / 提示词 / 脚本**一字未改**。回归:`scripts/tests/preset-landing-selection.test.mjs`(48 断言:全新机器恰 7 个客户可见角色 / 客户机的 7 再跑安装**仍 7**(垫片 pnpm 中途真把它放大过)/ 14 坏态收窄到 7 / 三处集合+痕迹不变量 / 软链不走链改写仓库 / 真 pnpm 的机制证据)、`scripts/tests/dsh-verified-list.test.mjs`(21 断言:lock 里已晋级版本必须全在列表内(构造缺项 ⇒ 红)、`candidate/` 不参与、列表唯一真源、boot 克隆场景真跑一次)。⛔ 本批**未发布**(发布留给交付方)。|**1.1.128(2026-10-12,升级路径角色落盘追修批:已装集唯一来源 + 内部角色不变式)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `scripts/lib/preset-install.mjs`:「已装集」的**唯一来源**收口到 `resolveInstalledSelection()`(**可信痕迹** `presets.selection.json#kept` → 退回 `agents.json` 里各 agent 的 `roles` 并集 → 两级都没有 ⇒ **空集**=首次安装语义;⛔ **绝不**把 profile 里的 patch 实体 / `presets.json` 行 / `dsh.bundle.patch` 条目当已装集 —— 那三份铺完恒是 14,「客户可见 ∪ 已装 ∪ 本智能体」于是恒等于 14,收窄被自己的安装步骤抹掉),并给「可信」加了**判据**:痕迹含 `visibility: internal` 的角色而本机 `internalRoles ≠ true`(且未给 `--internal-roles`)⇒ 判不可信、**响亮报告**后按「痕迹缺失」处理(现场那份 `kept:14/excluded:[]` 的痕迹正是放大缺陷写出来的);新增**不变式** `checkNoInternalLanding()` —— 落盘集合不得含内部角色(除非 `--internal-roles` 或 `agents.json#internalRoles === true`),违反 ⇒ `applyPresetSelection()` **判红并拒绝写出**(⛔ 不静默剔除、不静默修);新增 `reseedBundleDir()` 与 `applyPresetSelection({reseedFromShelf})`(收尾重施必须**按货架重播再收窄**:副本已被削到 7 时就地再过滤永远只能得 7,`--internal-roles` 装不回来、自检还会拿「期望 14 ≠ 落盘 7」判**假红**);② `scripts/argent-upgrade.mjs`:**升级档与安装档同一条公式**(客户可见集 ∪ 可信已装集 ∪ 本智能体角色),⛔ 不再用 `agentScoped: agents.length>0`(它把客户可见集整个排除掉 ⇒ 现场那台只落 2 个角色);第 7.6 步收尾重施带 `allowInternal` + `reseedFromShelf`,判红即该步 `ok:false`;③ `install-argent.mjs`:第 4 步默认档 / `--agent` 子集 / 第 7c2 步收尾重施 / `--capability remove` 四处统一走可信已装集与授权口径(`--capability remove` 只为「本机已合法装了内部角色」时不误判红);④ **新增只读 CLI** `scripts/check-preset-landing.mjs`(四件套 + 已装集来源 + 两条不变式,任何一台机器可照抄自查,⛔ 不写任何文件)⇒ `pack.engine` 登记项 +1。**现场(winpc 真机,2026-10-12)**:profile 14 个 patch 实体 + 痕迹 `kept:14/excluded:[]` + `agents.json=[hr]` + `internalRoles=false`,重跑官网一条命令(升级路径)修前打的是 `preset 同步(行式): **14** 个角色` + `角色落盘集合收尾:14 个;三处集合 + 痕迹一致`(7 个内部角色一个没摘),修后同一台机器 ⇒ **7**(`excluded` 列出 7 个内部角色)并打印 `选择痕迹不可信 ⇒ 已装集退回 agents.json 角色`。回归:`scripts/tests/preset-landing-upgrade-path.test.mjs`(43 断言:现场复刻升级路径 ⇒ 7 且 **pre-fix 判据重建得 14**(鉴别力)/ `agents.json` 缺失 ⇒ 7 / 可信痕迹 7 不许放大 / `internalRoles:true` ⇒ 14 放行 / **不变式负样本判红且零写入** / 「铺货架 ≠ 选择」/ 现场真形态 `kept:14` ⇒ 7 且响亮报告 / 真 home 零增量)。⛔ 本批**未发布**(发布留给交付方)。本能力流程 / 提示词 / 脚本**一字未改**。|**1.1.130(2026-10-12,P1-A 宿主排程批:四道闸防线 + 日报试点声明)**:本能力的流程/提示词/脚本**一字未改**;共用引擎面变更 —— ① **新增** L1 判据 `scripts/lib/schedule-probe.mjs`(宿主排程四道闸:挂载/新鲜度/执行/持久化;只读、纯 node 内建、零宿主 import)与 L2 CLI `scripts/argent-schedule.mjs`(probe/status/check/pause/apply,默认 dry-run);⛔ 两者**刻意不进 pack.engine** —— 它们是运维/巡查档,与 check-production-home.mjs / argent-doctor.mjs 同类:不被任何包内文件 import、不参与流程轮次 ⇒ 防线的落点是**同步面 scripts/**与门禁,不是能力包(P1-B 若要让 CLI 随包交付,再单独判定)。② 三个**在 engine 清单里**的文件变更:`scripts/flow_config.py`(新增 trigger.schedule 的解析/校验 + paths.schedulePromptFile)、`scripts/vertical-lint.mjs`(trigger.schedule 键白名单 + promptFile 必须存在 + kind/timeZone 自洽 + 试点期只许一条 enabled)、`scripts/lib/registry.mjs`(新增只读 flowSchedule())。③ 业务线声明:业务线的 `flows.json` **只给 daily-report** 加 trigger.schedule(kind=daily / 14:05:00 / Asia/Shanghai),FULL 与两条发票的 trigger **逐字节未动**(差分回归钉住)。④ `scripts/capability_pack.py` 的 `_prompt_paths` 现在也把 trigger.schedule.promptFile **随包带上**(判据:注册表引用谁,包带谁)⇒ 本包**新增一个文件**(该业务线的 `prompts/daily-report.scheduled.md`)。⑤ 新增回归 `scripts/tests/schedule-probe.test.mjs`(59 断言)与 `scripts/tests/schedule-declaration.test.mjs`(37 断言)。⚠️ **本批不切投递**:宿主排程的 prompt 创建时固定 ⇒ 依赖“只认领不唤醒”的 L1 入口,而 `scripts/flow-trigger.sh` **还没有** `--no-wake` ⇒ 只落声明与防线(P1-B 才建任务)。|**1.1.133(2026-10-12,宿主门禁追修批:⛔ 不代装宿主 + npx 形态纳入宿主解析)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变,**含无 flow 的 hr**)——① `install-argent.mjs`:**删除** `--install-host` 代装入口(连同旧自动代装函数与宿主离线包的下载/解包/bin 链接逻辑;开关若仍被传入 ⇒ 报「该开关已废弃」+ **非零退出**(1 = 用法错误),⛔ 不静默忽略),被拒文案改为按 dsh **官方**运行方式给指引(首选 `npx @deepseek-ai/dsh@<窗口内版本> web`;备选官方「从源码运行」;四要素:① 你的版本不在支持窗口(列窗口)② 官方方式换成窗口内版本的一行命令 ③ 我们正在适配你的版本(⛔ 不给对外 ETA)④ 未改动你的 dsh);② **新增** `scripts/lib/dsh-host-resolve.mjs`(**进 `pack.engine`**):宿主解析链 = **PATH 上的 `dsh` → `DSH_BIN` → npx 缓存形态**(读 `<npm cache>/_npx/<hash>/node_modules/@deepseek-ai/dsh/package.json` 的 version,纯只读零网络;多候选按「最近使用优先(mtime 最新)+ 同刻路径升序」确定并**打印选了哪个**)⇒ **npx 形态算宿主**(旧口径「npx 不等于已安装宿主」作废),且 npx 形态下插件装配走**同一条 launcher**(`npx --yes @deepseek-ai/dsh@<版本> plugin --profile web add file:…`),⛔ 不许「检测到 npx 却去用 PATH 上的另一个 dsh」;③ `install.sh` / `install.ps1` 口径同步(ps1 仍声明并透传 `-InstallHost`,只为让旧命令行得到**可读**的「已废弃」原因而不是参数绑定错误)。本能力自身流程 / 提示词 / 脚本**一字未改**。回归 `scripts/tests/install-host-gate.test.mjs`(**219 断言**,纯夹具:垫片 dsh/npx + 本地裸库 + 临时 home,⛔ 零外网、⛔ 不碰真 `~/.dsh`;⚠️ `dsh plugin` 会绕过 `DSH_HOME`/`HOME` ⇒ 夹具只断言命令行、绝不真跑)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
338
|
+
"2026-10-12:仓容前置探测**误报**修复(判据收紧为「严格阻断形态」+ 手动/CLI 跑完落终态台账);注册表投影在每个包内 ⇒ 四包一起提版重盖。",
|
|
339
|
+
"1.1.135(2026-10-12,日报口径透明化 + 只读对账批):卡片概览段**追加**「数据截至(站点本地时区)+ 一行口径」两行(⛔ 既有数字与措辞一字未改、⛔ 不新增推送);快照**新增** `capturedAt`(ISO8601 带偏移)/`capturedAtLocal`/`window`(from/to + 时区)/`apiBase` 四个字段(只新增,老快照渲染优雅降级);`pack.scripts` 新增只读对账 CLI `scripts/daily-report-reconcile.mjs` 与共用实现 `scripts/lib/daily-report-core.mjs`(窗口计算 + fetchOrders + aggregateOrders + 候选口径逐项重算 + KPI 命中判据 + token 复用/轮换 —— 日报与对账**共用同一份**,⛔ 不存在第二份口径逻辑;`daily-report.mjs` 的对外导出逐字转出,行为逐字不变)。对账工具默认**完全只读**(不写快照/不写客户表/不改凭据文件),唯一写盘点 = `--allow-token-refresh` 分支的 tmp+rename 原子写回。动机 = 2026-10-12 现场「卡片订单数 595 vs 平台销售量 602」:实测同窗口隔 ~4h 重拉 595→592 / 643→640 / 27→30(平台**会事后改历史订单状态**),且 602 对不上任何候选(我方 592|仅付款已批准 577|含取消 622|件数 640|唯一买家 576)⇒ 差异是**时点 × 标签**,不是算错。同批还修了 `core/contracts/argent.contracts.json` 的 J10 判据 anchor 行号(`scripts/daily-report.mjs:877 → 691` —— 本批把取数/聚合抽到共用实现后该行前移);该文件是 **pack.engine 件**(三个含引擎件的包都带它)⇒ 按「内容变 ⇒ 版本必变」full 1.3.142 / invoice 1.2.131 同批各 +1 patch(两个包的**内容**只多了这一个契约文件的 sha 变化)。 ⛔ 未动 `pack.engine` **清单**(两个新文件登记在本包 `pack.scripts`,故不牵连其它包的文件集;仅契约件内容变化牵连 full/invoice 各 +1 patch)。回归:`scripts/tests/daily-report-capture.test.mjs`(36 断言)+ `scripts/tests/daily-report-reconcile.test.mjs`(69 断言)。",
|
|
340
|
+
"1.1.136(2026-10-12,P1-3 宿主窗口与 scope 定位批):共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `install-argent.mjs`:**空 `- insert:` 清理**(审计 §C.1 #1)——生成侧改走真源渲染器 `scripts/lib/patch-compose.mjs#renderInsertBlock()`(空数组 ⇒ **不再产出**空块;旧实现内联渲染且不看空数组);修复侧用 `stripEmptyInsertBlocks()`(只清\"真空白\"的块,⛔ 不碰有子项的 insert;幂等),**写前备份**(`<数据目录>/backup/patch-<profile>-<时间戳>/`,含 sha256 与逐字可照抄的回滚命令),⛔ 备份失败就**不改客户文件**;② `scripts/lib/dsh-scope.mjs`:**平铺档 `<dir>/node_modules/.bin/dsh` 上移进真源**(`scopeBinCandidates()`;本批把 P1-0 暂存在 `bootcheck-wiring.mjs#bootcheckBinCandidates()` 的那份副本**删除**,两处不再各自实现),并新增 `resolveDshScopeDir()`(标准 / 邻居 / 平铺三种布局 + 认 `--scope-dir` / `DSH_SCOPE` / `--global-bin` / `DSH_BIN`;⛔ 探不到 ⇒ 回 null 让调用方**响亮失败**,⛔ 不静默回退到 `npm root -g` 猜一个)给安装器 `scopeDirForPreset()` 用 ⇒ 消客户机 scope 探测陷阱(`npm root -g` 在那里报的是错路径,真身在 `<prefix>/node_modules/@deepseek-ai`);③ `scripts/lib/patch-compose.mjs#composeFix` 写回前过清理器 —— 实测:它的规则①(bundle 层迁移)会把只剩一个子项的 `- insert:` **掏空** ⇒ 升级路径上空块**又回来**(同一次真跑复现)。⛔ `pack.engine` **清单未变**(本批零新增文件)⇒ **无 flow 的 hr 不跟随提版**。本能力流程 / 提示词 / 脚本**一字未改**。回归:`scripts/tests/patch-empty-insert.test.mjs`(34 断言)、`scripts/tests/dsh-scope-resolve.test.mjs`(33 断言)、`scripts/tests/install-scope-window-patch.test.mjs`(49 断言,端到端:夹具 lock **根**放\"假快照\" ⇒ 窗口**立刻**含它、移到 `candidate/` ⇒ 立刻不含;客户机邻居布局判出**行式**;`DSH_BIN` 指向平铺树判出**目录式**;显式给错的 `DSH_SCOPE` ⇒ **响亮失败**;空 insert 清干净 + 备份/回滚可用 + 幂等 + 升级路径不回潮;真 `~/.dsh` **零增量**)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
341
|
+
"2026-10-12(0.5.0 真机验收缺陷批:插件依赖图 / 落盘跟随已装智能体 / 空 insert 收尾 / 升级路径 venv):共用引擎变更(只改 install-argent.mjs 一个引擎面文件 ⇒ 引擎 sha 变、每个带引擎的包内容都变,**无 flow 的 hr 不跟随提版**)——**A(阻断级)插件必须进 profile 依赖图**:真机现场「exit 0 但装出来是半残」——profile 的 package.json#dependencies 里只有角色挂载面那一条,两个应用级插件只在 node_modules/ 里有实体,而 0.2 的宿主**只加载依赖图内的插件** ⇒ 启动日志报 failed to import 且安装期**零报错**。根因:宿主无包管理器时安装器**静默**改走「把插件目录拷进 node_modules」并 exit 0。现在三条口径:① **优先真·注册**(npx 形态 + 真实 home ⇒ 走**同一条 launcher** 的 plugin --profile … add file:…;其它形态 ⇒ 用**已解析的包管理器**在 profile 目录做同一件事,cwd = profile 目录);② 宿主没有 pnpm ⇒ **借一个**(corepack / npx --yes pnpm@<钉住版本>,可用 ARGENT_PNPM_SPEC 覆盖)并把**实际使用的包管理器与版本**打进日志,⛔ 不再 npm install -g;③ 借不到或注册失败 ⇒ **非零退出 + 明确指引**(文案含「缺包管理器」与两条出路),⛔ **绝不**退回「拷贝后 exit 0」。另加**收尾依赖图自检**:断言本次注册的每个包都在 dependencies 里、spec 与本次 argv 的 file:<插件目录> 同源(按 realpath 比对,吸收包管理器的路径规范化),且**能被 profile 解析**;任一条不满足 ⇒ 非零退出 + 打印「怎么修」(⛔「实体在 node_modules 就算过」是假绿)。**新装与升级两条路径共用同一份实现**(真机两次跑都出了同一个半残形态)。**B 落盘集合跟随「已装智能体」**:旧口径是「客户可见集 ∪ 已装集」⇒ **只装壳也会落一批属于未装智能体的角色**(真机现场:7 个外发角色里有 4 个 ML 系 + 5 个 ML 技能,而对应智能体根本没装 ⇒ 那些角色行引用的插件不存在、启动报 never started)。新口径 = **基座集**(角色清单里声明「与智能体无关、恒装」的那些)∪ **已装智能体面**(智能体目录里该智能体声明的角色;「已装」= 装机账本 ∪ 本次点名);技能同理(并清理「属于货架技能世界、但没装它的智能体」的孤儿,⛔ 内部角色/用户自建技能只报告不删)。⛔ **未改智能体目录的声明语义**,口径一律取自仓库既有真源。**C 空 `- insert:` 收尾**:定位到写入点 = 组合校正侧(profile-doctor --fix 会按退役/重复挂载**删行**,把某个 `- insert:` 掏空,而它**没有**过空块清理器);现在**所有会动 profile 的步骤之后**再过一遍清理器(幂等、写前备份 + 回滚命令),并**硬断言空块数 = 0**(判红即非零退出)。**D 升级路径也建/校验 venv**:升级分支在「新装专属」的建 venv 步之前就退出 ⇒ 真机第二次跑 exit 0 但持久运行时不存在(定时器照跑、什么也不做);现在升级路径同样调用同一份运行时准备(版本门禁、支持 --python-bin、建完真 import 校验),失败即非零退出。回归:新增 scripts/tests/install-plugin-graph-and-landing.test.mjs(77 断言:无包管理器 ⇒ 非零且文案含「缺包管理器」且**无插件实体** / 借用可用 ⇒ 真调注册路径且依赖项落地 / 依赖图自检能判红 / 只装壳 ⇒ 落盘 = 基座集(零 ML 角色与技能,内部技能保留)/ 计划清单列出 ML 角色与技能 / 空块端到端 = 0 且幂等 / 升级路径建 venv、--python-bin 透传、失败路径非零),并把受影响的既有夹具换成**忠实**的包管理器垫片(报版本 + 真写依赖边;旧的「空操作垫片」= 假成功,本批起会被正确地判红)。⛔ 本批**未发布**(发布留给交付方)。(⚠️ 盖章说明:本版内容在同一工作树里经过**多轮收口**(先落实现并盖章,再补注释/文档收口)⇒ 以**最终内容**盖章(`--stamp --force`);版本号从未发布过,不存在「内容变了版本没动」的对外窗口。)",
|
|
342
|
+
"0.6.0 W9:插件发布为 @whyshu/argent-*(用户名 scope)+ 消费路径改 npm 名(保留 file: 回退)+ 发布流水线(预检/逐包/回读退避/审计);包名迁移与 profile 行/生成器同批改透。引擎面在制:install-argent.mjs、check-preset-landing.mjs、lib/{patch-compose,plugin-lifecycle,preset-install}.mjs。",
|
|
343
|
+
"0.6.0 W9 收口(补件):`pack.engine` **新增** `scripts/lib/plugin-packages.mjs` —— W9 把「插件 id ↔ npm 包名」收口成这一份唯一真源(`PLUGIN_PACKAGES` / `pluginIdOf` / `npmNameOf` / `fileSpecOf` / `npmSpecOf` / `migrateDependencyKeys` / `migratePluginRowNames` 支撑),而它被**两个已在引擎清单里**的文件**静态 import**:`scripts/lib/plugin-lifecycle.mjs` 与 `scripts/lib/preset-install.mjs`。未登记 ⇒ 打出来的包里没有它 ⇒ 装完第一次 `import` 就 `ERR_MODULE_NOT_FOUND`(不是静默降级,是**必崩**)。判据 = `node scripts/check-pack-closure.mjs`(修前:full / invoice / daily-report **各缺 1 件**,逐条点名 `plugin-packages.mjs`;修后缺件 0)。本文件是**纯 node 内建**(只 `import { readFileSync } from 'node:fs'`)⇒ 满足 `kernel-purity` 的 L1 约束。⚠️ `pack.engine` 是**分发清单**,而每个包的 tgz **都带一份注册表投影**(含 `pack.engine`)⇒ 改的是清单本身 ⇒ 四个包**全部**变字节,**含无 flow 的 hr**(它不背引擎文件,但背注册表投影)——一并 +1 patch 并重盖章,否则同一个版本号会对应两份字节(正是 `release-argent.sh --check-dl` 的能力包档要抓的形态)。⚠️ 与既往批次的判据区分:**只改**引擎面文件而**不动清单**时,`hr` 才不跟随提版(先例 1.3.142→1.3.143)。回归:`scripts/tests/pack-closure.test.mjs` + `check-pack-closure` 缺件 0。",
|
|
344
|
+
"0.6.0 W9 补丁(profile 面向字符串漏迁 scope):只改**引擎面文件**、⛔ **未动** `pack.engine` 清单本身 —— `scripts/lib/plugin-packages.mjs` 新增 `migrateBundleNames()` / `exactPluginIdOf()` / `canonicalPluginName()`(**读侧宽松、写侧严格**:路径形态只用于读,改写 profile 只认「裸 id」与「本仓 npm 名」,否则会把别的 scope 的同名包改写成我们的);`scripts/lib/plugin-lifecycle.mjs` 新增 `bundleLayerRows()`(bundle 名单用 id 声明、名字经真源合成);`install-argent.mjs` 新增 `normalizeProfileBundles()` 与 `pruneStaleBareLandings()`(写前备份 + 逐字回滚命令,备份失败即不改客户文件);`scripts/argent-upgrade.mjs` 补齐升级路径上**从未执行**的四类迁移(`ensureBundles` 不再把 id 直接写进 `dsh.profile.bundles`、`normalizeDepKeys`、`fixPatch` 给所有已知 id 归一行名、`syncPlugins`/`migrateBareLandings` 落位目录改包名);`scripts/profile-doctor.mjs` 补必需行不再写裸 id + 重复挂载判据认包名。真机形态(用户机器,0.2.0-rc.2):`dsh.profile.bundles` 里留着裸名 ⇒ 该 bundle **解析不到** ⇒ 皮肤/UI 壳**静默不加载**(安装期零报错)。判据:新增门禁 `scripts/tests/profile-scope-migration.test.mjs`(静态 sink 扫描 + 注入自证 + 接线逐点断言 + 夹具实跑)与 `scripts/tests/install-plugin-graph-and-landing.test.mjs` §9(预置四处全裸名 ⇒ 重跑安装命令 ⇒ 全部 scoped、无残留、幂等)。⚠️ 版本轴:**只改引擎文件**、⛔ 不动 `pack.engine` 清单 ⇒ 只有含引擎文件的三个能力包内容变(无 flow 的那个包不背引擎文件、摘要未变 ⇒ **不跟随**,先例 1.3.142→1.3.143)。⚠️ 盖章说明:本版内容在同一工作树里经过三次收口(① 落实现与门禁 ② 补本 `_note` ③ 收口若干注释与 doctor 的读侧点名)⇒ 以**最终内容**盖章;各次版本号都未发布过,不存在「内容变了版本没动」的对外窗口。",
|
|
345
|
+
"0.6.0 W2(2026-10-13,壳 bundle):**只改引擎面文件、⛔ 未动 `pack.engine` 清单本身** —— ① `plugins/argent-shell/`(新包:纯 bundle,零源码、零宿主 import;`dsh.bundle.patch` + `dependencies` = core/skin/presets 三条);② `scripts/lib/plugin-packages.mjs` 的 `PLUGIN_PACKAGES` 登记该壳(安装器与发布流水线同一份真源 ⇒ Lead 可用 `npm-publish-argent.mjs --only argent-shell` 发它);③ `install-argent.mjs` 第 7 步改为**壳优先**:`dsh plugin add @whyshu/argent-shell@<版本>`(官方路径)⇒ 依赖图由包管理器维护(core/skin/presets 走 hoisted 落 profile 根);壳装不上 ⇒ **回退**逐个插件注册,壳装上了但个别壳插件不在依赖图内 ⇒ **修补**那几个(既有逐插件路径逐字保留);④ 收尾自检(7c4)**新增**判据:`@whyshu/argent-shell` 在位时其三个依赖也必须能被 profile 解析(否则判红)。⚠️ 版本轴:**只改引擎文件、不动清单** ⇒ 含引擎件的三包内容变 ⇒ full/invoice/daily-report 各 +1 patch;**无 flow 的 hr 不跟随**(它只背 preset 目录,摘要逐字节未变 —— 判据 `--check-stamp` 实测)。回归:`scripts/tests/shell-bundle-assembly.test.mjs`(53 断言:官方路径壳优先 + 依赖图齐 / 离线 file: 回退仍走官方 launcher / 缺包管理器非零退出 / 存量 profile 幂等且无重复条目 / 两条有牙自证)+ `plugin-peer-coverage` 新 25 断言(纯 bundle 的显式豁免 + 4 条牙)+ `plugin-official-add-path` 39/0 与 `install-plugin-graph-and-landing` 106/0 未放宽。⛔ 本批**未发布**(发布留给交付方)。",
|
|
346
|
+
"0.6.0 W3(2026-10-13,agent = 一个 bundle):**只改引擎面文件、⛔ 未动 `pack.engine` 清单本身** —— ① 新增 6 个纯 bundle 包 `plugins/argent-agent-<id>/package.json`(零 JS;`dependencies` = 壳 + 该智能体声明的非壳插件;`dsh.bundle.patch = []`(合法空层:core/skin 由壳 insert、gateway/flow/ml 的挂载面仍是整装 + 设置页);**包内声明** `argent.agent{payload{capabilities,plan},flows,roles,skills,integrations,credentials,scheduler,plugins}`);② 新增生成器 `scripts/gen-agent-bundles.mjs`(声明驱动:`--check` 逐字节比对 + `catalog ⟺ 恰好一个 bundle` 双向 + 目录声明自检;产物禁止手改);③ `agents/catalog.json` 补 `argent-ml` 声明(5 个 ML 智能体的 `plugins` + 说明表)—— 此前漏声明 ⇒ 生成器无从推导「ML 类要装它」(⛔ 不许写死);④ `install-argent.mjs`:`--agent` 解析阶段读**包内声明**并与货架投影**逐字比对**(不一致 ⇒ 零写入 exit 2),用包内声明重建安装清单;landing 收尾新增 `installAgentBundlesAndSelfcheck()`(① 官方路径装 bundle `dsh plugin add @whyshu/argent-agent-<id>@<版本>` / 离线回退 `file:` ② 按声明装能力包 ③ 落盘集合语义不变 ④ 收尾自检四条:在依赖图内 ∧ 依赖可解析 ∧ 能力包已装 ∧ 角色/技能按声明落位 ⇒ 任一不满足 exit 1;装完再**重施一次角色落盘集合** —— 包管理器会把 presets 副本换回货架全量,与第 7c2 步同一份实现);注册机新增 `registerAgents()`/`registerAllWithBundles()`(agents 为空 ⇒ 逐字等价);顺带修掉一个既存 TDZ:`PNPM_BORROW_SPEC` 声明上移(`--agent`/升级路径都在第 7 步之前调装配机);⑤ `scripts/argent-agents.mjs` 回执的「其它插件」宇宙排除 `argent-shell` 与 `argent-agent-*`(它们是基座/智能体本身,不是「可以另外装的插件」);⑥ `scripts/lib/plugin-packages.mjs` 登记 6 个智能体 bundle ⇒ Lead 可用 `npm-publish-argent.mjs --only argent-agent-<id>` 发布。⚠️ 版本轴:**只改引擎文件、不动清单** ⇒ 含引擎件的三包内容变 ⇒ full/invoice/daily-report 各 +1 patch;**无 flow 的 hr 不跟随**(它只背 preset 目录 —— 判据 `--check-stamp` 实测其内容摘要逐字节未变)。回归:`scripts/tests/agent-bundle-generation.test.mjs`(57 断言,含 4 条牙)+ `scripts/tests/agent-bundle-install.test.mjs`(56 断言:官方路径 / 离线 `file:` 回退 / 老克隆逐字回退 / 幂等 / 5 条牙 —— 含「只落实体不写依赖边 ⇒ 自检判红」);`plugin-peer-coverage` 24→25(纯 bundle 豁免由货架派生 + 扫描面显式改数)、`kernel-purity` 63/0(新增 L2 层标注)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
347
|
+
"0.6.0 W3(同批二次收口,2026-10-13):同一工作树里**第二次**以最终内容盖章 —— 首次盖章后又落了两处**在 `pack.engine` 里**的收口:① `scripts/lib/plugin-packages.mjs` 不再逐条列智能体 bundle 的名字,改成**前缀规则**(`AGENT_BUNDLE_PREFIX` / `isAgentBundleId`,接进 `pluginIdOf`/`npmNameOf`/`packageMetaOf`/`exactPluginIdOf`)—— 名字带业务线词,逐条列进引擎面会脏掉 `vertical-lint` 的 engine-words 判据(基线 0 新增 = 红);② `scripts/vertical-lint.mjs#engineFiles()` 为**生成产物** `plugins/argent-agent-*/package.json` 加**结构性豁免**(与既有的 `capability-packs.lock.json` 同一条理由:生成产物、无人手写、必然带商品名;业务词真源 `agents/catalog.json` 不在扫描面内,⛔ 基线文件一字未动);同批 `scripts/npm-publish-argent.mjs` 按前缀**现扫** agent bundle 认包(发布面 7 → 13)。⚠️ 按「内容变 ⇒ 版本必变(含无 flow 的包)」,本版为**最终内容**;版本号 1.3.152 / 1.2.141 / 1.1.145 从未发布过(不存在「内容变了版本没动」的对外窗口)。⛔ hr 仍不跟随(其摘要逐字节未变)。",
|
|
348
|
+
"0.6.0 W3 收口:vertical-lint 的 `--root` 修 —— 注册表/数据面子脚本一律按 **lint 自身目录**定位,`--root` 只换注册表根(此前夹具根下无该脚本 ⇒ 子进程 ENOENT ⇒ 报「注册表合并失败」假红,core-sop-skill 夹具被误伤)。",
|
|
349
|
+
"**1.1.148(2026-10-13,失败自动重试(方案 a)批)**:`pack.engine` 新增 `scripts/flow-auto-retry.py`(可用性类失败的**受守卫自动重试**:候选 = 末条 failed/blocked ⇒ 唯一分类器判 `retryable` + 预约闸门放行 + 每票次数上限 + 冷却 + 每轮上限;真正的\"重置后重建\"**全部委托** `flow_retry.py`(走它的全部守卫),本脚本只做筛选/限流/可见性)+ `scripts/flow_config.py` 新增 `autoRetry` 段(**唯一读取点**:enabled/max/cooldownMin/perCycle,缺省 开/2/20/2)+ `scripts/flow-trigger.sh` 新增一步「先自动重试、再认领」(非零退出**不阻断认领**)。⇒ 引擎清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**),按「内容变 ⇒ 版本必变(含无 flow 的包)」四包一起提版本。本能力自身:流程 / 提示词 / 脚本一字未改。",
|
|
350
|
+
"**1.1.149(2026-10-13,失败自动重试(方案 a)批 · **同批二次收口**)**:首次以最终内容盖章(c99a04f)后又落了一处**在 `pack.engine` 里**的收口 —— `scripts/flow-auto-retry.py` 的次数上限改为按**尝试**计(台账 `retry` 事件数 + 本脚本审计里 `ok:false` 的被拒次数):委托侧拒绝时**不写**台账事件,只数台账会让\"每轮都会被拒\"的票(表里状态已不是失败 / 表备注分类或预约留痕与台账不一致…)**每轮**再试一次、长期白占\"每轮上限\"的名额并每轮刷卡片/审计 ⇒ 现在最多 `max` 次后明确交人工(日志点名\"其中 n 次被委托侧拒绝\")。题外(⛔ 本批不改):`scripts/flow_retry.py` 的\"缺陷④ 已有货件号默认拒绝清号\"闸门因调用了**未定义**的 `one()` 而被 `except Exception` 静默吞掉(实测 `NameError` ⇒ `ship_now=None` ⇒ 闸门事实上不生效)—— 属该文件的既存缺陷,**未动**(改它 = 改变守卫语义,需专门一批)。⚠️ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四包一起再提一版;版本号 1.3.155 / 1.2.145 / 1.1.148 / 0.1.66 从未发布过(同批收口 ⇒ 以**最终内容**盖章,不存在\"内容变了版本没动\"的对外窗口)。",
|
|
351
|
+
"修 flow_retry.py 的**死守卫**(2026-10-13):清号守卫原写 `one(row.get(f_ship))` 而本文件无 `one()` 定义 ⇒ NameError 被 `except Exception` 静默吞 ⇒ 已有货件号也会被清号重置(红线从未生效);改用唯一取值助手 `first()` 并去掉吞噬;新门禁 scripts/tests/flow-retry-guard4.test.py(15 断言,含两条有牙)。",
|
|
352
|
+
"**W7.7(2026-10-14,尾巴收口:智能体标题去掉「角色」字样 + 死指针改指新落点)**:本批改了 `pack.engine` 里的两件(`agents/catalog.json` 的两个 `title`、`configs/hr.json` 的 label/help)与本注册表自身的一处(`hr` 设置面板的 `hint`)⇒ 清单本身变了、且每个包的 tgz 都带一份注册表投影 ⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个能力包一起提版本并重盖章。口径:**角色 = DSH preset**,Argent 侧不复述角色清单(会话身份 ⇒ 官方「Agent 预设」区;安装 / 升级 ⇒ 设置 → Argent →「我的智能体」)。⛔ 本能力自身的流程 / 提示词 / 脚本一字未改。",
|
|
353
|
+
"**1.1.158(2026-10-14,P1-B `--no-wake` + 外部时序运营文案)**:共用引擎变更(`scripts/flow-trigger.sh` 新增 `--no-wake` —— 只认领 + 只写台账、不唤起会话;`scripts/lib/schedule-mechanism.mjs` 的 native 静态指令 `promptCommand` 带上该开关(宿主排程那条命令);`scripts/flow_triage.py` 的外部时序阻塞文案补齐两要素 —— 自动再试节奏(N 取声明面 `externalTiming.cooldownMin`)+ 人工接管方式(取消勾选放行位即停取);`scripts/run-tests.sh` 的干净树自检按判据 `[ -d .git ]` 跳过「需要 git 索引」的用例)⇒ 版本随引擎前进。本能力自身:业务线内的日报**静态轮次指令**(`prompts/daily-report.scheduled.md`)更新为「P1-B 已落地」的现状(该静态指令本身就要求带 `--no-wake`)。⚠️ 盖章说明:本版内容在同一工作树里经过**二次收口**(先落实现,再按 `vertical-lint` 的 engine-words 判据改写文案 —— ⛔ **不抬基线**)⇒ 以**最终内容**盖章;版本号 1.1.158 从未发布过,不存在「内容变了版本没动」的对外窗口。",
|
|
354
|
+
"0.6.0 发版:平台 VERSION 0.4.0→0.6.0、契约 argentVersion 同步、宿主窗口晋级 0.2.0-rc.2;agent bundle BUNDLE_VERSION 0.1.0→0.1.1(内容随\"标题去角色\"变化,避免同版本换字节)。",
|
|
355
|
+
"0.7.0 W2:流程声明补 `runner`(三条流程)+ 门禁 flow-runner-declared(脚本须存在、args 须带 {ticket})。",
|
|
356
|
+
"0.7.0 W2:daily-report 补 runner 声明(ticketless)⇒ 全部流程 runner 齐;门禁收紧到\"0 未声明\"。",
|
|
357
|
+
"0.7.0 W2:`runner` 登记进 flow_config 顶层直通段与 _derive(否则 --json 不透出 ⇒ CLI 读不到声明)。",
|
|
358
|
+
"0.7.0 W5/W7:引擎包白名单纳入 `skills/`(CLI `skill show|sync` 的真源;此前包内没有技能)。",
|
|
359
|
+
"0.7.0 W8/S1:路径统一(22 个脚本改走唯一判据)触及本包成员 ⇒ 按纪律提版重盖章。"
|
|
360
|
+
],
|
|
361
|
+
"hostAssets": {
|
|
362
|
+
"scheduler": {
|
|
363
|
+
"required": true,
|
|
364
|
+
"install": "print-only",
|
|
365
|
+
"perFlow": true,
|
|
366
|
+
"command": "bash {home}/scripts/flow-timers.sh install --flow {flow}",
|
|
367
|
+
"_note": "安装器**只打印**(⛔ 不自动装,见设计文档 §7.3⑥):装完先别开,确认配置齐了再启用。"
|
|
368
|
+
},
|
|
369
|
+
"loginAutostart": {
|
|
370
|
+
"required": false,
|
|
371
|
+
"install": "opt-in-flag",
|
|
372
|
+
"flag": "--win-autostart",
|
|
373
|
+
"_note": "Windows 登录自启是**显式 opt-in**(默认不建);macOS 由 LaunchAgent com.whyshu.dsh-web 托管。"
|
|
374
|
+
},
|
|
375
|
+
"desktopShortcut": {
|
|
376
|
+
"required": false,
|
|
377
|
+
"install": "none",
|
|
378
|
+
"_note": "今天没有任何能力需要桌面项;保留键位是为了新增宿主时有声明位(⛔ 不许各宿主各写一套)。"
|
|
379
|
+
},
|
|
380
|
+
"_note": "宿主侧资产声明位(A 批,2026-10-10;补《Argent 智能体平台 设计》§8.3 第 3 条的缺口:能力包此前**没有任何宿主侧资产的声明位**,定时器/自启这类事只能由安装器**写死**推断)。字段语义:`required` = 该能力**是否需要一个常驻定时器**(无 flow 的能力必须 false —— 没有可定时的东西);`install` ∈ {`print-only`(安装器只**打印**命令,客户按需自行启用), `auto`(安装器自动注册), `none`};`perFlow` = 是否**逐条 flow** 一个定时器(判据 = 该能力名下的 flow 数);`command` = 用户可照抄的命令模板(`{home}` / `{flow}` 占位)。⛔ `loginAutostart` / `desktopShortcut` 今天一律 required=false / install∈{opt-in-flag,none} —— 如实声明现状,⛔ 不把\"我们希望有的\"写成\"已支持\"。门禁:`node scripts/check-agent-catalog.mjs`(C12:枚举合法 + required 与 flow 数自洽 + 与智能体目录的 `scheduler` 逐条一致)。"
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
"hr": {
|
|
385
|
+
"_note": "HR 办公能力(2026-09-21 批 C1):**无 flow** —— 纯本地能力,入口=角色会话(preset)。原先只在 entitlements.roleMinPlan 里登记(hr-office: pro)⇒ 无法按套餐安装/核对/版本化;现提升为 capability(**无 flow** 的能力形态:入口由 pack.presets 提供)。 |**2026-10-04**:入口角色 `hr-office` 已**退役**(不再接派单、不再出现在网关 `@` 名单),但**能力包 `hr` 保留**、入口 preset 保留为**墓碑**(web 老会话的 `agentPreset` 外键)⇒ `minPlan=pro` 与 `pack.presets` 均不变;新用户请改用 `argent-general`。|**0.1.43(2026-10-09,变现分层落地)**:共用引擎级注册表 `scripts/flow-requirements.json` 变更(新增 `entitlements.plans.ml-pro`;`daily-report` 档位 `enterprise` → `pro`)⇒ 每个能力包的**注册表投影**都变了(本能力 `minPlan` **保持 `pro`** 不变),按纪律提版本。",
|
|
386
|
+
"minPlan": "pro",
|
|
387
|
+
"stateFields": [],
|
|
388
|
+
"failures": {
|
|
389
|
+
"enabled": false
|
|
390
|
+
},
|
|
391
|
+
"requiredCommon": [],
|
|
392
|
+
"pack": {
|
|
393
|
+
"settingsPanel": {
|
|
394
|
+
"id": "hr.settings",
|
|
395
|
+
"title": "HR 办公",
|
|
396
|
+
"order": 60,
|
|
397
|
+
"fields": [
|
|
398
|
+
{
|
|
399
|
+
"key": "hrRole",
|
|
400
|
+
"label": "角色入口(argent-hr)",
|
|
401
|
+
"type": "text",
|
|
402
|
+
"bind": {
|
|
403
|
+
"read": {
|
|
404
|
+
"from": "roles",
|
|
405
|
+
"key": "argent-hr"
|
|
406
|
+
}
|
|
407
|
+
},
|
|
408
|
+
"hint": "HR 智能体的入口就是这个角色会话(角色 = DSH 预设:在 设置 →「Agent 预设」查看/切换);安装 / 升级 HR 智能体在 设置 → Argent →「我的智能体」。本页只读,如实报告入口状态。"
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"key": "hrOfficeTombstone",
|
|
412
|
+
"label": "旧角色墓碑(argent-hr-office,已退役)",
|
|
413
|
+
"type": "text",
|
|
414
|
+
"bind": {
|
|
415
|
+
"read": {
|
|
416
|
+
"from": "roles",
|
|
417
|
+
"key": "argent-hr-office"
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
"hint": "2026-10-04 退役的旧 HR 角色:只作 web 老会话的 agentPreset 外键保留(⛔ 不复活、不当入口)。随 hr 能力包一起落位。"
|
|
421
|
+
}
|
|
422
|
+
]
|
|
423
|
+
},
|
|
424
|
+
"version": "0.1.74",
|
|
425
|
+
"_note": [
|
|
426
|
+
"能力包版本(语义化):改了该能力的流程/提示词/脚本/技能 ⇒ 必须提版本并重新打包 |**0.1.40(2026-10-04,角色退役·墓碑)**:包内容变更(`presets/argent-hr-office/agent.cordis.yml` 的 persona 改成退役告知、`preset.yml` 的 name/description 标注「已退役」)—— 角色 `hr-office` 已于 2026-10-04 退役(方案 §3.3.1:gateway.json 条目与 install-dsh.sh 安装期入口已撤),**本能力包保留**(装机内容不变、仍可安装;入口 preset 作为 web 老会话的墓碑保留)⇒ 版本随内容前进。|**0.1.41(2026-10-09,版本随内容前进)**:`0.1.40` **发布之后其字节被原地覆盖过一次**(服务端清单 `sha256` `15cf4f43…` → `058ccead…` 而 `version` 原地不动,见 whyshu-svr `docs/ops/deploy-fe02231-packs-align.md`)⇒ 同一个 URL 下的内容变过 ⇒ \"内容变 ⇒ 版本变\"这条不变式被破坏,客户机无法靠版本号判断自己拿到的是哪一份。本次**只提版本、包内容一字未改**(重盖章后内容摘要与 0.1.40 时逐字相同)⇒ `hr-0.1.41.tgz` 是该内容**首次以某个版本号**对外发布。⛔ 未改共用引擎、未新增运行期文件,故 `pack.engine` 清单不变。|**0.1.42(2026-10-09,配置地基:配置目录 + 通用读取器 —— hr 包内容随之改变)**:本能力**无 flow**,按 `pack.engine` 的分发规矩**不背共用引擎**(`files` 仍只有 `presets/argent-hr-office/**` 三件,`integrity` 逐字节未变)。但**每个包的 tgz 里都带一份注册表投影**(`scripts/flow-requirements.json` 的引擎级段),而本批改了它的 `pack.engine`(新增 `core/lib/config-catalog.mjs` 与 5 个 `configs/*.json`)⇒ **hr 的包字节变了** ⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」这条不变式**必须一起提版本**,否则会出现\"同一个版本号 0.1.41 对应两份不同字节\"(这正是 `release-argent.sh --check-dl` 的能力包档当场抓到的形态:`✗ hr: 版本相同(0.1.41)但内容摘要不同 —— 仓库 ad3599c5 vs 线上 09e1fef9`;提版后该条转为 ⚠「发布在途」,不再判红)。⛔ 本轮 hr 的**能力内容一字未改**。|**0.1.44(2026-10-09,预约失败判定链 + 口径统一)**:共用引擎 `scripts/flow_failure.py` 变更(新增 `canonical_reason()` 与 `--case` —— 打印某 case 的**规范失败原因**:优先读台账 `failed.reason`,老台账回落到 `error` 去身份前缀;给角色/运维一个**逐字照抄**的取数口,杜绝\"表备注写 A、账本写 B\")⇒ 所有能力包的注册表投影同批变化。本能力自身:⛔ 本能力内容一字未改;但 `flow_failure.py` 在 `pack.engine` 内,且包内 `scripts/flow-requirements.json` 投影**含 `failureClasses`**(本次新增的两条 needsHuman 判据就在其中)⇒ **包字节变了**,按「内容变 ⇒ 版本必变(含无 flow 的包)」这条不变式必须一起提版本。(⚠️ **盖章说明**:本版内容在同一工作树里经过**多轮收口**(先落实现,再按 vertical-lint 的引擎业务词约束改注册表文案、再收口文案)⇒ 以**最终内容**盖章;版本号从未发布过,不存在\"内容变了版本没动\"的对外窗口。)|**0.1.45(2026-10-09,三处生产实测收口:票不许静默消失 · 失败必写原因+动作 · 发票流程 Rule R)**:共用引擎变更 ⇒ 四个能力包一起提版本并重盖章。① `scripts/flow_triage.py`:判定改为**有效末条事件**(`INFO_EVENTS = phase/wake/policy_apply/policy_new` 回退到最近一条状态性事件;`failed_ack` = 有意不动且**不参与回退**)、`blocked` 从「静默 pass」改为可见的 `needs_human`,并加**循环后对账兜底**(任何未归桶的 case ⇒ `needs_human`,kind=unclassified)——修的是客户机生产实测 P0(某发票票):其尾部是 `blocked → phase` ⇒ 分诊摘要全 0、运营勾了放行也不派发、且**不在「需人工」里**(静默卡死)。② `scripts/flow_failure.py`:新增运营文案**唯一来源** `ops_message()`(`结论:<业务类|系统类|我方缺陷类>|<原因>|动作:…`,≤300 字)与 `release_hint()`(放行位/提示的**唯一实现**:变体与**顶层** pick 都认;`orchestrator._ops_action_hint` 改为委托它);③ **新增** `scripts/invoice_fail_closeout.py`(属**发票能力专属脚本** `capabilities.invoice.pack.scripts`,⛔ 不进共用引擎 —— 它只写发票那一列):失败/成功收口 —— 把**同一串**写进表「发票错误信息」与台账(`detail` 逐字相同、`error` 放规范原因),取不到原因 ⇒ **exit 2 拒绝执行**,代码级异常归「我方缺陷类」且**不回原文**,成功 ⇒ `--clear-error` 清空;④ `scripts/flow_return_to_ops.py`:缺口回填文案改用同一来源(表字段 == 台账 `detail`);④b `scripts/flow_config.py`:归一化的 `guards` 增**标量透传**(`writer`=写手路径、`errorField`=失败原因列 —— 不透出就只能各自把路径/列名写死,那正是「判据第二份」与业务词泄漏进引擎的来源);⑤ 业务线声明(`verticals/<id>/flows.json`):两个发票流程新增 `pick.release` / `pick.releaseReDispatch`(放行位 = **各自的门控列**「发票就绪」;上限 3 / 冷却 30)与 `guards.errorField`。本能力自身:⛔ 内容一字未改(无 flow ⇒ 不背共用引擎);但包内注册表投影含 `failureClasses`/`pack.engine` ⇒ 包字节变了,按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本。|**0.1.46(2026-10-09,配置「生效来源」可见化 + 冲突告警,批 1)**:本能力无 flow ⇒ **不背共用引擎**(`files` 仍只有 3 件 preset,逐字节未变);但包内注册表投影含 `pack.engine` ⇒ 包字节变了,按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本(同 `0.1.42` 先例)。本能力内容一字未改。共用引擎 `core/lib/config-catalog.mjs` 新增**纯函数** `resolveEffective()`(按规范链算「谁赢了 / 谁被压住」)、密钥脱敏 `redactSecret()` 与读取器 `effectiveOf()/levelsOf()`,并新增只读 CLI `scripts/config-explain.mjs`(`--key/--all/--list/--json`)⇒ 能力包内容变化,按纪律提版本并重盖章。⛔ **零行为变化**:读取器的取值路径(`resolveOne`)与任何 `todayChain` 一个字节都没改,只是「如实展示」;同批回归 `scripts/tests/config-effective.test.mjs`(63 断言)+ 端点 / 页面两条既有回归扩测。|**0.1.47(2026-10-09,同批收口:脱敏闸幂等)**:只读 CLI `scripts/config-explain.mjs` 的\"再脱敏\"兜底闸原先**无条件**执行 ⇒ `❰已设置(长度N)❱` 里的 N 变成**占位串自己的长度**(恒 11,实测),而用户正是拿它比对\"密钥换没换\" ⇒ 已改为**幂等**(含被压住的那级)并补回归;引擎面同一份 CLI 变了 ⇒ 包内容变化,按纪律再提版本并重盖章。本能力自身内容一字未改。|**0.1.49(2026-10-10,A 批:按智能体安装清单 —— 客户从「智能体库」选一个装,只装它的东西)**:① **`pack.engine` 新增两项**:`agents/catalog.json`(L0 货架声明:agent → capability + flows 子集 + 角色 + 插件/技能/集成/凭据槽)与 `scripts/argent-agents.mjs`(声明解析/校验/清单构造;安装器与门禁**共用一份**判据)⇒ 引擎清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**,按「内容变 ⇒ 版本必变(含无 flow 的包)」这条不变式一起提版本);② **共用引擎行为变更**(`install-argent.mjs` / `scripts/lib/preset-install.mjs` / `scripts/argent-upgrade.mjs`):新增 `--agent <id>[,<id>…]` / `--list-agents` / `--internal-roles` / `--capability remove <id>`(写前备份 + 审计);preset **行落盘集合**改为「按清单收窄」(`--agent` ⇒ 恒装 + 本智能体角色 + 已装集;默认 ⇒ 客户可见集 + 已装集;**内部角色默认不落**);升级器按 `<dshHome>/argent/agents.json` **重新施加**同一集合(否则一次升级就把收窄还原);**未给 `--agent` 时 CLI 契约与计划清单输出与改动前逐字一致**(差分回归钉住);③ 本能力自身:**新增活的 HR 角色** `presets/argent-hr/`(招聘支持 / 员工关系 / PPT 与文档产出 / 员工隐私严格保密)+ `pack.presets` 收它 ⇒ 本能力从「只有墓碑」变成「有入口」;设置页入口字段由 `hrOfficeRole`(hr-office) 改为 `hrRole`(argent-hr),旧角色改用 `hrOfficeTombstone` 字段如实报告(⛔ 墓碑不复活、⛔ 不当入口,仍随包落位供老会话 agentPreset 外键解析)。回归:`scripts/tests/agent-catalog.test.mjs`(110 断言,七条判据:只落本智能体 / 子集过滤 / 向后兼容差分 / 未知输入零写入 / remove 备份+审计 / 目录 schema / 内部角色默认不落)。|**0.1.50(2026-10-10,同批二次收口:宿主资产声明 + 门禁)**:同一工作树里第二次收口(先落 `--agent` 实现并盖章,再补 `capabilities.<c>.pack.hostAssets`(**宿主侧资产声明位**:定时器/登录自启/桌面项)与它的门禁 C12,并把 `scripts/argent-agents.mjs` 的清单/回执接上宿主资产)⇒ 引擎面文件内容变了,按「内容变 ⇒ 版本必变」纪律**再提一版**(先例同 1.3.104→1.3.105、`docs/Argent-智能体平台-设计.md` §8.3 第 3 条)。版本号 0.1.49 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**0.1.51(2026-10-10,同批三次收口:安装器用法文案 · 门禁登记 · 引擎面去业务词)**:同一工作树里第三次收口 —— ① `install-argent.mjs` 的**用法头注释**补上 `--agent` / `--list-agents` / `--internal-roles` / `--capability remove` 四个入口(内容变 ⇒ 引擎 sha 变);② `scripts/tests/is-direct-run.test.mjs` 的**唯一登记处**加入 `scripts/check-agent-catalog.mjs`(新增 CLI 必须登记,否则端到端判据覆盖不到它;测试文件不在包内,本条只为留痕);③ 本文件里本批新加的 `_note` 文案去掉业务词(`vertical-lint` 的 engine-words 档按**基线**只拦新增,⛔ 不抬基线 ⇒ 改写文案而不是改基线)⇒ 引擎面内容再变,按纪律**再提一版**。版本号 0.1.50 从未发布过,不存在「内容变了版本没动」的对外窗口。⛔ 本能力的流程/提示词/脚本内容未再改动。|**0.1.52(2026-10-10,仓容前置探测批 —— 注册表投影变化,hr 必须跟随提版)**:本批改了共用引擎面 `scripts/flow-requirements.json`(新增 `failureClasses.capacityFull`)、`scripts/flow_capacity*`/`ml_capacity_probe.py`、`flow_failure.py` 分类顺序、`configs/advanced.json`(`advanced.appointment.max_day` 默认 5)与编排器接入点 ⇒ **每个包的 tgz 里都带一份注册表投影**(含 `failureClasses`/`pack.engine`)⇒ hr 的包字节随之改变。本能力自身内容一字未改(`files` 仍只有两个 preset 目录)。⚠️ **教训**:本批曾按 `--describe hr`(只列 6 个 preset 文件)判定\"hr 不含 pack.engine ⇒ 内容没变\",漏掉了\"注册表投影在包内\"这一层 ⇒ 被 `release-argent.sh --check-dl` 当场抓成 `✗ hr: 版本相同(0.1.51)但内容摘要不同 ⇒ 同版本覆盖发布的形态`;按不变式提版后该条转为 ⚠「发布在途」。先例:0.1.42 / 0.1.44 / 0.1.46(均为\"改了引擎基表 ⇒ 无 flow 的包也提版本\")。|**0.1.55(2026-10-11,同批:引擎面新增 `scripts/lib/cdp_ports.py`)**:本能力**无 flow ⇒ 不背共用引擎**(`files` 仍只有两个 preset 目录,逐字节未变);但包内注册表投影含 `pack.engine` ⇒ 包字节变了,按「内容变 ⇒ 版本必变(含无 flow 的包)」提版本并重盖章(同 `0.1.42` / `0.1.52` 先例)。本能力内容一字未改。|**0.1.56(2026-10-12,Windows 安装路径三缺陷修复批)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变)——① `scripts/lib/preset-install.mjs`:**「已装集」判据改为选择痕迹** `presets.selection.json#kept`(⛔ 不再读 `package.json#dsh.bundle.patch` —— pnpm 对 `file:` 依赖建的是指向货架的链,读到的永远是货架自带的 14 条 ⇒ 收窄被自己的安装步骤抹掉),新增 `installedSelectionIds()` / `materializeBundleDir()`(软链**实体化**后再改写,⛔ 不走链写进仓库)/ `checkPresetSelectionConsistency()`(patch 实体 == presets.json 行 == dsh.bundle.patch == 痕迹);② `install-argent.mjs`:新增**第 7c2 步收尾重施**(第 7 步 `pnpm add file:…` 会把 profile 副本换回货架 14 个 ⇒ 旧实现在 winpc 真机\"声称只落 7/14、装完却是 14\",7 个内部角色永久留下)、版本体检改**两个候选落点**(克隆目录 + 安装器自己那棵树 —— Windows 的 boot 克隆场景,此前永远退回内置列表 ⇒ 现役 `0.1.7-rc.2` 被报\"未验证\")、`profile-doctor` 与升级器子进程**显式传 `DSH_HOME`**(否则 `--dsh-home <临时>` 时改的是真实 `~/.dsh`)、完成提示**按平台**给启动/重启指引(Windows 不再打 bash 的 `DSH_HOME=… dsh web …`);③ `scripts/lib/dsh-versions.mjs`:内置基线补 `0.1.7-rc.2` + 新增 `verifiedListGaps()` **防漂移门禁**;④ `scripts/argent-upgrade.mjs`:同一判据 + 收尾重施。⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个包一起提版本并重盖章。本能力内容**一字未改**(无 flow ⇒ 不背共用引擎,仍因包内注册表投影而变)。回归:`scripts/tests/preset-landing-selection.test.mjs`(48 断言:全新机器恰 7 个客户可见角色 / 客户机的 7 再跑安装**仍 7**(垫片 pnpm 中途真把它放大过)/ 14 坏态收窄到 7 / 三处集合+痕迹不变量 / 软链不走链改写仓库 / 真 pnpm 的机制证据)、`scripts/tests/dsh-verified-list.test.mjs`(21 断言:lock 里已晋级版本必须全在列表内(构造缺项 ⇒ 红)、`candidate/` 不参与、列表唯一真源、boot 克隆场景真跑一次)。⛔ 本批**未发布**(发布留给交付方)。|**0.1.57(2026-10-12,升级路径角色落盘追修批:已装集唯一来源 + 内部角色不变式)**:本能力**无 flow ⇒ 不背共用引擎**(`files` 仍只有 preset 目录,逐字节未变);但包内注册表投影含 `pack.engine` ⇒ 包字节变了,按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本并重盖章(同 `0.1.42` / `0.1.52` 先例)。本能力内容**一字未改**。① `scripts/lib/preset-install.mjs`:「已装集」的**唯一来源**收口到 `resolveInstalledSelection()`(**可信痕迹** `presets.selection.json#kept` → 退回 `agents.json` 里各 agent 的 `roles` 并集 → 两级都没有 ⇒ **空集**=首次安装语义;⛔ **绝不**把 profile 里的 patch 实体 / `presets.json` 行 / `dsh.bundle.patch` 条目当已装集 —— 那三份铺完恒是 14,「客户可见 ∪ 已装 ∪ 本智能体」于是恒等于 14,收窄被自己的安装步骤抹掉),并给「可信」加了**判据**:痕迹含 `visibility: internal` 的角色而本机 `internalRoles ≠ true`(且未给 `--internal-roles`)⇒ 判不可信、**响亮报告**后按「痕迹缺失」处理(现场那份 `kept:14/excluded:[]` 的痕迹正是放大缺陷写出来的);新增**不变式** `checkNoInternalLanding()` —— 落盘集合不得含内部角色(除非 `--internal-roles` 或 `agents.json#internalRoles === true`),违反 ⇒ `applyPresetSelection()` **判红并拒绝写出**(⛔ 不静默剔除、不静默修);新增 `reseedBundleDir()` 与 `applyPresetSelection({reseedFromShelf})`(收尾重施必须**按货架重播再收窄**:副本已被削到 7 时就地再过滤永远只能得 7,`--internal-roles` 装不回来、自检还会拿「期望 14 ≠ 落盘 7」判**假红**);② `scripts/argent-upgrade.mjs`:**升级档与安装档同一条公式**(客户可见集 ∪ 可信已装集 ∪ 本智能体角色),⛔ 不再用 `agentScoped: agents.length>0`(它把客户可见集整个排除掉 ⇒ 现场那台只落 2 个角色);第 7.6 步收尾重施带 `allowInternal` + `reseedFromShelf`,判红即该步 `ok:false`;③ `install-argent.mjs`:第 4 步默认档 / `--agent` 子集 / 第 7c2 步收尾重施 / `--capability remove` 四处统一走可信已装集与授权口径(`--capability remove` 只为「本机已合法装了内部角色」时不误判红);④ **新增只读 CLI** `scripts/check-preset-landing.mjs`(四件套 + 已装集来源 + 两条不变式,任何一台机器可照抄自查,⛔ 不写任何文件)⇒ `pack.engine` 登记项 +1。**现场(winpc 真机,2026-10-12)**:profile 14 个 patch 实体 + 痕迹 `kept:14/excluded:[]` + `agents.json=[hr]` + `internalRoles=false`,重跑官网一条命令(升级路径)修前打的是 `preset 同步(行式): **14** 个角色` + `角色落盘集合收尾:14 个;三处集合 + 痕迹一致`(7 个内部角色一个没摘),修后同一台机器 ⇒ **7**(`excluded` 列出 7 个内部角色)并打印 `选择痕迹不可信 ⇒ 已装集退回 agents.json 角色`。回归:`scripts/tests/preset-landing-upgrade-path.test.mjs`(43 断言:现场复刻升级路径 ⇒ 7 且 **pre-fix 判据重建得 14**(鉴别力)/ `agents.json` 缺失 ⇒ 7 / 可信痕迹 7 不许放大 / `internalRoles:true` ⇒ 14 放行 / **不变式负样本判红且零写入** / 「铺货架 ≠ 选择」/ 现场真形态 `kept:14` ⇒ 7 且响亮报告 / 真 home 零增量)。⛔ 本批**未发布**(发布留给交付方)。|**0.1.59(2026-10-12,P1-A 宿主排程批:四道闸防线 + 日报试点声明)**:本能力的流程/提示词/脚本**一字未改**;共用引擎面变更(`scripts/flow_config.py` 新增 trigger.schedule 解析、`scripts/vertical-lint.mjs` 新增排程声明门禁、`scripts/lib/registry.mjs` 新增只读 flowSchedule())与**包内注册表投影**变化(业务线声明只动了日报;新增的 L1 `scripts/lib/schedule-probe.mjs` 与 L2 `scripts/argent-schedule.mjs` **刻意不进 pack.engine**,理由见 daily-report 的 `_note`)⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」一起提版本并重盖章。新增回归 `scripts/tests/schedule-probe.test.mjs` / `scripts/tests/schedule-declaration.test.mjs`。|**0.1.62(2026-10-12,宿主门禁追修批:⛔ 不代装宿主 + npx 形态纳入宿主解析)**:共用引擎变更(引擎面文件 ⇒ 每个包的注册表投影都变,**含无 flow 的 hr**)——① `install-argent.mjs`:**删除** `--install-host` 代装入口(连同旧自动代装函数与宿主离线包的下载/解包/bin 链接逻辑;开关若仍被传入 ⇒ 报「该开关已废弃」+ **非零退出**(1 = 用法错误),⛔ 不静默忽略),被拒文案改为按 dsh **官方**运行方式给指引(首选 `npx @deepseek-ai/dsh@<窗口内版本> web`;备选官方「从源码运行」;四要素:① 你的版本不在支持窗口(列窗口)② 官方方式换成窗口内版本的一行命令 ③ 我们正在适配你的版本(⛔ 不给对外 ETA)④ 未改动你的 dsh);② **新增** `scripts/lib/dsh-host-resolve.mjs`(**进 `pack.engine`**):宿主解析链 = **PATH 上的 `dsh` → `DSH_BIN` → npx 缓存形态**(读 `<npm cache>/_npx/<hash>/node_modules/@deepseek-ai/dsh/package.json` 的 version,纯只读零网络;多候选按「最近使用优先(mtime 最新)+ 同刻路径升序」确定并**打印选了哪个**)⇒ **npx 形态算宿主**(旧口径「npx 不等于已安装宿主」作废),且 npx 形态下插件装配走**同一条 launcher**(`npx --yes @deepseek-ai/dsh@<版本> plugin --profile web add file:…`),⛔ 不许「检测到 npx 却去用 PATH 上的另一个 dsh」;③ `install.sh` / `install.ps1` 口径同步(ps1 仍声明并透传 `-InstallHost`,只为让旧命令行得到**可读**的「已废弃」原因而不是参数绑定错误)。本能力自身流程 / 提示词 / 脚本**一字未改**。回归 `scripts/tests/install-host-gate.test.mjs`(**219 断言**,纯夹具:垫片 dsh/npx + 本地裸库 + 临时 home,⛔ 零外网、⛔ 不碰真 `~/.dsh`;⚠️ `dsh plugin` 会绕过 `DSH_HOME`/`HOME` ⇒ 夹具只断言命令行、绝不真跑)。⛔ 本批**未发布**(发布留给交付方)。",
|
|
427
|
+
"2026-10-12:仓容前置探测**误报**修复(判据收紧为「严格阻断形态」+ 手动/CLI 跑完落终态台账);注册表投影在每个包内 ⇒ 四包一起提版重盖。",
|
|
428
|
+
"0.6.0 W9 收口(补件):`pack.engine` **新增** `scripts/lib/plugin-packages.mjs` —— W9 把「插件 id ↔ npm 包名」收口成这一份唯一真源(`PLUGIN_PACKAGES` / `pluginIdOf` / `npmNameOf` / `fileSpecOf` / `npmSpecOf` / `migrateDependencyKeys` / `migratePluginRowNames` 支撑),而它被**两个已在引擎清单里**的文件**静态 import**:`scripts/lib/plugin-lifecycle.mjs` 与 `scripts/lib/preset-install.mjs`。未登记 ⇒ 打出来的包里没有它 ⇒ 装完第一次 `import` 就 `ERR_MODULE_NOT_FOUND`(不是静默降级,是**必崩**)。判据 = `node scripts/check-pack-closure.mjs`(修前:full / invoice / daily-report **各缺 1 件**,逐条点名 `plugin-packages.mjs`;修后缺件 0)。本文件是**纯 node 内建**(只 `import { readFileSync } from 'node:fs'`)⇒ 满足 `kernel-purity` 的 L1 约束。⚠️ `pack.engine` 是**分发清单**,而每个包的 tgz **都带一份注册表投影**(含 `pack.engine`)⇒ 改的是清单本身 ⇒ 四个包**全部**变字节,**含无 flow 的 hr**(它不背引擎文件,但背注册表投影)——一并 +1 patch 并重盖章,否则同一个版本号会对应两份字节(正是 `release-argent.sh --check-dl` 的能力包档要抓的形态)。⚠️ 与既往批次的判据区分:**只改**引擎面文件而**不动清单**时,`hr` 才不跟随提版(先例 1.3.142→1.3.143)。回归:`scripts/tests/pack-closure.test.mjs` + `check-pack-closure` 缺件 0。",
|
|
429
|
+
"0.6.0 W3 收口:vertical-lint 的 `--root` 修 —— 注册表/数据面子脚本一律按 **lint 自身目录**定位,`--root` 只换注册表根(此前夹具根下无该脚本 ⇒ 子进程 ENOENT ⇒ 报「注册表合并失败」假红,core-sop-skill 夹具被误伤)。",
|
|
430
|
+
"**0.1.66(2026-10-13,失败自动重试(方案 a)批)**:`pack.engine` 新增 `scripts/flow-auto-retry.py`(可用性类失败的**受守卫自动重试**:候选 = 末条 failed/blocked ⇒ 唯一分类器判 `retryable` + 预约闸门放行 + 每票次数上限 + 冷却 + 每轮上限;真正的\"重置后重建\"**全部委托** `flow_retry.py`(走它的全部守卫),本脚本只做筛选/限流/可见性)+ `scripts/flow_config.py` 新增 `autoRetry` 段(**唯一读取点**:enabled/max/cooldownMin/perCycle,缺省 开/2/20/2)+ `scripts/flow-trigger.sh` 新增一步「先自动重试、再认领」(非零退出**不阻断认领**)。⇒ 引擎清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**),按「内容变 ⇒ 版本必变(含无 flow 的包)」四包一起提版本。本能力自身:流程 / 提示词 / 脚本一字未改(本包只随引擎面与 `pack.engine` 前进)。",
|
|
431
|
+
"**0.1.67(2026-10-13,失败自动重试(方案 a)批 · **同批二次收口**)**:首次以最终内容盖章(c99a04f)后又落了一处**在 `pack.engine` 里**的收口 —— `scripts/flow-auto-retry.py` 的次数上限改为按**尝试**计(台账 `retry` 事件数 + 本脚本审计里 `ok:false` 的被拒次数):委托侧拒绝时**不写**台账事件,只数台账会让\"每轮都会被拒\"的票(表里状态已不是失败 / 表备注分类或预约留痕与台账不一致…)**每轮**再试一次、长期白占\"每轮上限\"的名额并每轮刷卡片/审计 ⇒ 现在最多 `max` 次后明确交人工(日志点名\"其中 n 次被委托侧拒绝\")。题外(⛔ 本批不改):`scripts/flow_retry.py` 的\"缺陷④ 已有货件号默认拒绝清号\"闸门因调用了**未定义**的 `one()` 而被 `except Exception` 静默吞掉(实测 `NameError` ⇒ `ship_now=None` ⇒ 闸门事实上不生效)—— 属该文件的既存缺陷,**未动**(改它 = 改变守卫语义,需专门一批)。⚠️ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四包一起再提一版;版本号 1.3.155 / 1.2.145 / 1.1.148 / 0.1.66 从未发布过(同批收口 ⇒ 以**最终内容**盖章,不存在\"内容变了版本没动\"的对外窗口)。",
|
|
432
|
+
"**W7.7(2026-10-14,尾巴收口:智能体标题去掉「角色」字样 + 死指针改指新落点)**:本批改了 `pack.engine` 里的两件(`agents/catalog.json` 的两个 `title`、`configs/hr.json` 的 label/help)与本注册表自身的一处(`hr` 设置面板的 `hint`)⇒ 清单本身变了、且每个包的 tgz 都带一份注册表投影 ⇒ 按「内容变 ⇒ 版本必变(含无 flow 的包)」四个能力包一起提版本并重盖章。口径:**角色 = DSH preset**,Argent 侧不复述角色清单(会话身份 ⇒ 官方「Agent 预设」区;安装 / 升级 ⇒ 设置 → Argent →「我的智能体」)。⛔ 本能力自身的流程 / 提示词 / 脚本一字未改。"
|
|
433
|
+
],
|
|
434
|
+
"presets": [
|
|
435
|
+
"presets/argent-hr",
|
|
436
|
+
"presets/argent-hr-office"
|
|
437
|
+
],
|
|
438
|
+
"skills": [],
|
|
439
|
+
"scripts": [],
|
|
440
|
+
"entrypoints": [],
|
|
441
|
+
"hostAssets": {
|
|
442
|
+
"scheduler": {
|
|
443
|
+
"required": false,
|
|
444
|
+
"install": "none",
|
|
445
|
+
"perFlow": false,
|
|
446
|
+
"_note": "HR 是**纯本地能力**(无 flow)⇒ 没有任何可定时的东西;安装器 ⛔ 连命令都不打印(判据:scheduler.required=false)。"
|
|
447
|
+
},
|
|
448
|
+
"loginAutostart": {
|
|
449
|
+
"required": false,
|
|
450
|
+
"install": "opt-in-flag",
|
|
451
|
+
"flag": "--win-autostart",
|
|
452
|
+
"_note": "Windows 登录自启是**显式 opt-in**(默认不建);macOS 由 LaunchAgent com.whyshu.dsh-web 托管。"
|
|
453
|
+
},
|
|
454
|
+
"desktopShortcut": {
|
|
455
|
+
"required": false,
|
|
456
|
+
"install": "none",
|
|
457
|
+
"_note": "今天没有任何能力需要桌面项;保留键位是为了新增宿主时有声明位(⛔ 不许各宿主各写一套)。"
|
|
458
|
+
},
|
|
459
|
+
"_note": "宿主侧资产声明位(A 批,2026-10-10;补《Argent 智能体平台 设计》§8.3 第 3 条的缺口:能力包此前**没有任何宿主侧资产的声明位**,定时器/自启这类事只能由安装器**写死**推断)。字段语义:`required` = 该能力**是否需要一个常驻定时器**(无 flow 的能力必须 false —— 没有可定时的东西);`install` ∈ {`print-only`(安装器只**打印**命令,客户按需自行启用), `auto`(安装器自动注册), `none`};`perFlow` = 是否**逐条 flow** 一个定时器(判据 = 该能力名下的 flow 数);`command` = 用户可照抄的命令模板(`{home}` / `{flow}` 占位)。⛔ `loginAutostart` / `desktopShortcut` 今天一律 required=false / install∈{opt-in-flag,none} —— 如实声明现状,⛔ 不把\"我们希望有的\"写成\"已支持\"。门禁:`node scripts/check-agent-catalog.mjs`(C12:枚举合法 + required 与 flow 数自洽 + 与智能体目录的 `scheduler` 逐条一致)。"
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
},
|
|
464
|
+
"_pauseSwitchRule": "暂停开关路径 = DATA_DIR/trigger.pauseSwitch。**新线必须命名空间化**(`verticals/<id>/PAUSE.<flow>`);迁移期的线可声明 `pauseSwitchLegacy`,flow-trigger 两条都查(存在任一即暂停)。",
|
|
465
|
+
"_integrationNote": "`integration`(2026-09-20 迭代2):货代专属事实的唯一出处 = `scripts/integrations/<name>/adapter.py`(门户/人工闸门/错误词表/可执行计划)。`flow_config` 校验适配器存在且 `CARRIER == routing.match`;契约见 `scripts/integration_contract.py`。",
|
|
466
|
+
"entitlements": {
|
|
467
|
+
"_why": "能力×档位矩阵的**唯一出处**(2026-09-20 迭代3):① 流程角色的档位 = 其 capability 的 minPlan(下面 planTiers 排序);② 不挂流程的角色在 roleMinPlan 里显式声明;③ 网关的 ROLE_PLAN 与客户端的档位判断必须由本矩阵**派生**并被门禁校验(此前三处各判,实测已漂移:ml-daily 网关写 pro 而文档是企业级、两条发票角色根本没登记 ⇒ 默认落回 free,免费版会显示成可用)。",
|
|
468
|
+
"planTiers": [
|
|
469
|
+
"free",
|
|
470
|
+
"pro",
|
|
471
|
+
"enterprise"
|
|
472
|
+
],
|
|
473
|
+
"freeTier": "free",
|
|
474
|
+
"_freeTier": "免费档名:C 端(免费版)不得装配任何 B 端 capability —— 门禁见 scripts/entitlements.py --validate 与 scripts/tests/entitlements.test.mjs",
|
|
475
|
+
"roleMinPlan": {
|
|
476
|
+
"hr-office": "pro"
|
|
477
|
+
},
|
|
478
|
+
"_cli": "python3 scripts/entitlements.py --matrix | --role <r> | --validate | --emit-gateway-table",
|
|
479
|
+
"plans": {
|
|
480
|
+
"_why": "套餐 = **能力集合**(SKU,2026-09-21 批 C1)。此前只有线性三档 free/pro/enterprise,表达不了『只买 HR』或『只要美客多不要 HR』。这里为每个套餐显式列出能力与档位;`capabilities.<c>.minPlan` 必须等于『授予它的最低档』(entitlements.py --validate 守着),因此网关/客户端/服务端现有的档位判定**一行不用改**。⚠️ 后续项:服务端 `User.plan` 仍是档位(free/pro/enterprise)⇒ SKU 与档位尚未彻底解耦(真正卖『只买 HR』需要 User 上带能力清单或 planSku;见 docs 策划案批 C)。",
|
|
481
|
+
"hr-pro": {
|
|
482
|
+
"title": "HR 办公版",
|
|
483
|
+
"capabilities": {
|
|
484
|
+
"hr": "pro"
|
|
485
|
+
}
|
|
486
|
+
},
|
|
487
|
+
"ml-pro": {
|
|
488
|
+
"title": "Pro 订阅(HR + 只读日报)",
|
|
489
|
+
"capabilities": {
|
|
490
|
+
"hr": "pro",
|
|
491
|
+
"daily-report": "pro"
|
|
492
|
+
}
|
|
493
|
+
},
|
|
494
|
+
"ml-enterprise": {
|
|
495
|
+
"title": "美客多企业版",
|
|
496
|
+
"capabilities": {
|
|
497
|
+
"full": "enterprise",
|
|
498
|
+
"invoice": "enterprise",
|
|
499
|
+
"daily-report": "pro"
|
|
500
|
+
}
|
|
501
|
+
},
|
|
502
|
+
"ml-hr-enterprise": {
|
|
503
|
+
"title": "美客多 + HR 企业版",
|
|
504
|
+
"capabilities": {
|
|
505
|
+
"full": "enterprise",
|
|
506
|
+
"invoice": "enterprise",
|
|
507
|
+
"daily-report": "pro",
|
|
508
|
+
"hr": "pro"
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
},
|
|
513
|
+
"pack": {
|
|
514
|
+
"_engineNoteCdpPorts20261011": "2026-10-11(认领前环境预检**第二层回退:CDP 端口 + 店铺归属**):**新增引擎面文件** `scripts/lib/cdp_ports.py` —— CDP 调试端口的**唯一实现**(发现:`lsof` 客户端进程监听的 127.0.0.1 端口 + 逐个 `GET /json/version` 校验;归属:进程命令行含 `--user-data-dir=…/chrome_<store_id>`;页面探针:`GET /json/list` 有 page 目标)。背景 = 同一天第二段现场:FULL 触发器被预检挡下的恢复窗口里 ① `getBrowserList` 返回 `statusCode=0, data=None` (⇒ `startBrowser` 报 `-10004 browserId或browserOauth缺失` ⇒ **API 开窗这条路不可用**);② 改用 CLI 开窗成功;③ 但 **`getRunningInfo` 也是 0** —— 上一批那条「本地已运行窗口」回退**在这个现场无效**(窗口明明在跑、CDP 可连),④ 真正救回来的判据是「**端口 + `chrome_<store_id>` 归属**」(实测 `[13018, 27893]`,1 店=27893 / 2 店=13018,随后不给 `--cdp-url` 的只读查询两店都 `found=True`)。现在预检判据是**三层**(列表非空 ⇒ 可用〔逐字不变〕;① 本机已运行窗口;② CDP 端口 + 归属 + 页面可达),两层都不成立 ⇒ 不可用且文案**逐字**回到旧常量 `Bridge 正常但**没有任何店铺**(未登录 / 账号无授权)`;⛔ 只读(不 `startBrowser`、不关窗、不写 `cdp-port-map.json`)、⛔ 归属确认不到绝不猜、⛔ 探针异常绝不上抛(写明「回退判据不可用(原因)」)。**单实现**:编排器 `_is_cdp_port` / `_discover_cdp_ports` / `_match_port_by_user_data_dir` 改为**薄委托**(名字与语义逐字保留;`ensure-store-windows.py` 按 `orch.X()` 属性调用、回归 `esw.orch is orchestrator` 的断言照旧成立),`ensure-store-windows.py#cdp_page_targets` 同样薄委托,`env_probe.py` 从 lib 取用;回归带「全仓只有一处做端口发现/归属(`lsof -i…`)」与「`chrome_` 前缀常量只有一处定义」两条**静态判据**。⚠️ **env_probe 刻意不静态 import orchestrator**(后者只在 full 的能力包脚本集里):静态引用会让 invoice/daily-report 的 `check-pack-closure --strict` 报缺件(实测 3 条,含它的两跳依赖),故引擎侧店铺解析改为**动态取 + 如实降级**(取不到 ⇒ 不可用并写明原因,⛔ 不静默放行)。开关沿用 `ARGENT_PREFLIGHT_LOCAL_WINDOW_FALLBACK`(默认开;关它 ⇒ 两层都不走、零探针、文案逐字旧常量),另加更细的 `ARGENT_PREFLIGHT_CDP_PORT_FALLBACK`(默认开,只关第 ② 层)。变更文件:`scripts/lib/cdp_ports.py`(新增,进本清单)、`scripts/env_probe.py`、`scripts/orchestrator.py`(薄委托)、`scripts/ensure-store-windows.py`(薄委托)、`docs/本机接班运行清单.md` §8.73.5。回归:`scripts/tests/env-probe-cdp-port-fallback.test.py`(新增,67 断言)、`scripts/tests/env-probe-local-window-fallback.test.py`(49 断言;第 ② 层桩化 ⇒ 仍是**纯夹具**)。⇒ 本清单与每包内的注册表投影都变了(**无 flow 的 hr 也变**),四个包一起提版本并重盖章:full 1.3.130→1.3.131 / invoice 1.2.118→1.2.119 / daily-report 1.1.125→1.1.126 / hr 0.1.54→0.1.55。⛔ 本批**未发布**任何包(发布留给调用方)。",
|
|
515
|
+
"_engineNoteLocalWindowFallback20261011": "2026-10-11(认领前环境预检:本地已开窗口回退判据):**新增引擎面文件** `scripts/lib/webdriver_ipc.py` —— 浏览器客户端 WebDriver IPC 层的**唯一实现**(只读查询 `getRunningInfo` / 窗口摘要行 / 调用与重试原语)。背景:认领前的环境预检只看云端店铺列表是否非空 ⇒ 现场「列表拉不到、但本机店铺窗口已开且可驱动」时把环境判成不可用,**自动路径整轮不认领、当天 0 票**;而手工跑同一批票 6/6 成功。现在预检在列表为空(或 Bridge 有响应但未就绪)时再**只读**查一次本机已运行窗口,≥1 个即判可用;⛔ 该查询**复用既有实现**(原只存在于 `scripts/orchestrator.py`,本批抽成 lib 并让编排器改为薄委托 ⇒ 全仓库只有一个 WebDriver 客户端,回归有「只有一处构造 IPC 请求体」的判据钉住);⛔ 保守边界全留:没有窗口 / 查询失败 / 命令缺失 / 开关关闭 一律仍判不可用,列表非空时行为逐字不变;⛔ 「窗口已开」不等于「账号已授权」,只放宽这一处认领前闸门。开关 `ARGENT_PREFLIGHT_LOCAL_WINDOW_FALLBACK=0`(默认开)。变更文件:`scripts/env_probe.py`(判据 + 开关)、`scripts/orchestrator.py`(薄委托)、`scripts/lib/webdriver_ipc.py`(新增)、`docs/本机接班运行清单.md` §8.73。回归:`scripts/tests/env-probe-local-window-fallback.test.py`(43 断言)、`scripts/tests/env-gate-stale.test.py`(开关关闭语义)。⇒ `pack.engine` 清单与注册表投影都变了(**无 flow 的能力包也变**),四个包一起提版本并重盖章:invoice 1.2.116→1.2.117 / full 1.3.126→1.3.127 / daily-report 1.1.123→1.1.124 / hr 0.1.52→0.1.53。⚠️ **同批收口**:盖章后对 `scripts/env_probe.py` 做了一处**空行规范化**(纯排版)⇒ 内容字节变了,按「内容变 ⇒ 版本必变」各**再提一版**(invoice 1.2.118 / full 1.3.129 / daily-report 1.1.125 / hr 0.1.54)并重盖章;full 的 1.3.129 **刻意跳过 1.3.128**(该号被同工作树的并发批次占用,避免「同号不同内容」)。",
|
|
516
|
+
"_engineNoteBump20261009b": "2026-10-09(授权二源接入批,CLI/引擎侧):**新增「安装器授权门禁」** ⇒ 三个带 flow 的能力包(invoice 1.2.103→1.2.104 / full 1.3.108→1.3.109 / daily-report 1.1.110→1.1.111)**一起提版本并重盖章**。变更文件:`install-argent.mjs`(安装路径**在下载之前**判定「在线票据 ∪ 本地离线许可证」;新增 `--allow-unlicensed`(默认关,只对 `--from-packs <本地文件…>` 生效 + 必写审计);`--check-update` 对**已失授权**能力显示「停更:已装能力继续可用」)与 `core/lib/audit.mjs`(审计源登记表加 `install` 一行 ⇒ `argent audit --source install` 可读 `<数据目录>/install-audit.jsonl`)。⛔ 判定复用既有许可链(`license-gate.mjs` → `check-license.mjs` → `core/lib/license-verdict.mjs`),**没有第二套验签/解析**;逃生阀 `ARGENT_LICENSE_ENFORCE=off` 与 flow-trigger 同一套取值(借用 `normalizeMode`)。⚠️ **再提一版**(invoice 1.2.104→1.2.105 / full 1.3.109→1.3.110 / daily-report 1.1.111→1.1.112):并发批次(变现分层,提交 `a15c2b0`)的盖章发生在本批引擎件**落地之前** ⇒ 锁里 `install-argent.mjs` / `core/lib/audit.mjs` 仍是被改前的 sha;按「内容变 ⇒ 版本变」纪律**再提一版并重盖章**,⛔ 不改任何判据。",
|
|
517
|
+
"_doc": "能力包分发清单(迭代3-⑨)。engine = **共用引擎**文件(每个能力包都要带);能力专属脚本/技能/版本写在 capabilities.<c>.pack —— 派生不出来的才声明,声明了却不存在由 scripts/capability_pack.py --validate 报错。 engine 里**不放整目录**(避免把别家能力的文件一起打包);确需整目录时在能力侧显式声明。",
|
|
518
|
+
"engine": [
|
|
519
|
+
"scripts/dsh-backup-scope.sh",
|
|
520
|
+
"scripts/dsh-upgrade-readiness.mjs",
|
|
521
|
+
"scripts/dsh-restore.sh",
|
|
522
|
+
"scripts/dsh-web-launch.mjs",
|
|
523
|
+
"scripts/lib/scope-pointer.mjs",
|
|
524
|
+
"scripts/lib/customer-env.mjs",
|
|
525
|
+
"scripts/lib/is-direct-run.mjs",
|
|
526
|
+
"scripts/lib/dep-declaration.mjs",
|
|
527
|
+
"scripts/lib/dsh-scope.mjs",
|
|
528
|
+
"scripts/lib/dsh-versions.mjs",
|
|
529
|
+
"scripts/lib/dsh-host-resolve.mjs",
|
|
530
|
+
"scripts/lib/patch-compose.mjs",
|
|
531
|
+
"scripts/lib/patch-target.mjs",
|
|
532
|
+
"scripts/lib/plugin-lifecycle.mjs",
|
|
533
|
+
"scripts/lib/plugin-packages.mjs",
|
|
534
|
+
"scripts/lib/preset-compat.mjs",
|
|
535
|
+
"scripts/lib/preset-install.mjs",
|
|
536
|
+
"scripts/lib/preset-mechanism.mjs",
|
|
537
|
+
"scripts/lib/preset-sync.mjs",
|
|
538
|
+
"scripts/lib/profile-retire.mjs",
|
|
539
|
+
"scripts/lib/python-runtime.mjs",
|
|
540
|
+
"scripts/lib/registry.mjs",
|
|
541
|
+
"scripts/lib/repo-root.sh",
|
|
542
|
+
"scripts/lib/stdio_utf8.py",
|
|
543
|
+
"scripts/lib/zstd-frames.mjs",
|
|
544
|
+
"scripts/lib/argent-datadir.mjs",
|
|
545
|
+
"scripts/lib/argent_datadir.py",
|
|
546
|
+
"scripts/lib/argent_filelock.py",
|
|
547
|
+
"scripts/lib/cdp_ports.py",
|
|
548
|
+
"scripts/lib/webdriver_ipc.py",
|
|
549
|
+
"scripts/lib/wake-auth.mjs",
|
|
550
|
+
"scripts/argent-datadir.py",
|
|
551
|
+
"scripts/env_probe.py",
|
|
552
|
+
"scripts/feishu-card.mjs",
|
|
553
|
+
"scripts/flow-timers.sh",
|
|
554
|
+
"scripts/flow-timers-plist.sh",
|
|
555
|
+
"scripts/flow-trigger-wake.mjs",
|
|
556
|
+
"scripts/flow-trigger.sh",
|
|
557
|
+
"scripts/flow-auto-retry.py",
|
|
558
|
+
"scripts/flow_billing.py",
|
|
559
|
+
"scripts/flow_claim.py",
|
|
560
|
+
"scripts/flow_config.py",
|
|
561
|
+
"scripts/vertical-init.mjs",
|
|
562
|
+
"scripts/vertical-lint.mjs",
|
|
563
|
+
"scripts/flow_registry.py",
|
|
564
|
+
"scripts/flow_failure.py",
|
|
565
|
+
"scripts/flow_status_reconcile.py",
|
|
566
|
+
"scripts/flow_write_verify.py",
|
|
567
|
+
"scripts/flow_learn.py",
|
|
568
|
+
"scripts/flow_ledger.py",
|
|
569
|
+
"scripts/flow_policy.py",
|
|
570
|
+
"scripts/flow_preflight.py",
|
|
571
|
+
"scripts/flow_retry.py",
|
|
572
|
+
"scripts/flow_return_to_ops.py",
|
|
573
|
+
"scripts/flow_sources/__init__.py",
|
|
574
|
+
"scripts/flow_sources/common.py",
|
|
575
|
+
"scripts/flow_sources/feishu_base.py",
|
|
576
|
+
"scripts/flow_sources/cases_json.py",
|
|
577
|
+
"scripts/flow_source.py",
|
|
578
|
+
"scripts/flow_stale.py",
|
|
579
|
+
"scripts/flow_triage.py",
|
|
580
|
+
"scripts/integration_contract.py",
|
|
581
|
+
"scripts/lease.py",
|
|
582
|
+
"scripts/lip_table.py",
|
|
583
|
+
"scripts/ml_store_ids.py",
|
|
584
|
+
"scripts/check-model-auth.py",
|
|
585
|
+
"scripts/check-license.mjs",
|
|
586
|
+
"scripts/license-gate.mjs",
|
|
587
|
+
"scripts/check-skill-classification.mjs",
|
|
588
|
+
"scripts/config-explain.mjs",
|
|
589
|
+
"core/cli/argent.mjs",
|
|
590
|
+
"core/mcp/server.mjs",
|
|
591
|
+
"core/mcp/http.mjs",
|
|
592
|
+
"core/contracts/argent.contracts.json",
|
|
593
|
+
"core/contracts/verbs.schema.json",
|
|
594
|
+
"core/lib/argent-datadir.mjs",
|
|
595
|
+
"core/lib/audit.mjs",
|
|
596
|
+
"core/lib/claim.mjs",
|
|
597
|
+
"core/lib/doctor-customer.mjs",
|
|
598
|
+
"core/lib/flow-list.mjs",
|
|
599
|
+
"core/lib/flow-registry.mjs",
|
|
600
|
+
"core/lib/init.mjs",
|
|
601
|
+
"core/lib/ledger.mjs",
|
|
602
|
+
"core/lib/license.mjs",
|
|
603
|
+
"core/lib/license-ops.mjs",
|
|
604
|
+
"core/lib/license-device.mjs",
|
|
605
|
+
"core/lib/license-file.mjs",
|
|
606
|
+
"core/lib/license-guard.mjs",
|
|
607
|
+
"core/lib/license-activate.mjs",
|
|
608
|
+
"core/lib/license-verdict.mjs",
|
|
609
|
+
"core/lib/python.mjs",
|
|
610
|
+
"core/lib/sop.mjs",
|
|
611
|
+
"core/lib/versions.mjs",
|
|
612
|
+
"core/lib/config-catalog.mjs",
|
|
613
|
+
"configs/account.json",
|
|
614
|
+
"configs/advanced.json",
|
|
615
|
+
"configs/host.json",
|
|
616
|
+
"configs/hr.json",
|
|
617
|
+
"configs/notify.json",
|
|
618
|
+
"core/lib/notify/index.mjs",
|
|
619
|
+
"core/lib/notify/verb.mjs",
|
|
620
|
+
"core/lib/notify/dedup.mjs",
|
|
621
|
+
"core/lib/notify/webhook.mjs",
|
|
622
|
+
"core/lib/notify/feishu.mjs",
|
|
623
|
+
"core/lib/notify/wecom.mjs",
|
|
624
|
+
"VERSION",
|
|
625
|
+
"scripts/flow_case.py",
|
|
626
|
+
"scripts/ml_schema_check.py",
|
|
627
|
+
"scripts/telemetry.py",
|
|
628
|
+
"scripts/invoice_ready_audit.py",
|
|
629
|
+
"scripts/invoice_carrier_notice.py",
|
|
630
|
+
"scripts/ziniao-auth-probe.sh",
|
|
631
|
+
"install-argent.mjs",
|
|
632
|
+
"scripts/install-license.mjs",
|
|
633
|
+
"scripts/install-one-shot.mjs",
|
|
634
|
+
"scripts/migrate-providers.mjs",
|
|
635
|
+
"agents/catalog.json",
|
|
636
|
+
"scripts/argent-capabilities.mjs",
|
|
637
|
+
"format-version.txt",
|
|
638
|
+
"scripts/argent-agents.mjs",
|
|
639
|
+
"scripts/check-preset-landing.mjs"
|
|
640
|
+
],
|
|
641
|
+
"_cli": "python3 scripts/capability_pack.py --list | --describe <cap> | --validate | --build <cap> --out-dir <dir>",
|
|
642
|
+
"_releaseReDispatch": "2026-09-21 Rule R(人工重新放行):引擎文件 flow_triage.py/flow_claim.py 有改动 ⇒ **四个能力包版本一起前进并重盖章**(engine 是共用清单,sha 变了版本必须动,否则 capability_pack.py --validate 报错)。",
|
|
643
|
+
"_engineNoteCoreRuntime20261003": "core 运行期文件(2026-10-03,P4 批):能力包现在**自带 `core/**` 运行期文件** ⇒ 装机可不依赖 git/sync(此前 core/ 只靠 sync-scripts.sh 投递,只走能力包安装的机器会缺件:CLI 起来就 import 崩、插件 DATA_DIR='' 只读退化)。**清单按实际 import 关系推导,不是拍脑袋**:对①`core/cli/argent.mjs`(陪跑式唯一入口:SKILL 里每条命令都是它)、②`core/mcp/server.mjs`+`http.mjs`(宿主 MCP 面)、③`scripts/**` 运行期 import 到的 core 文件(如 `scripts/lib/argent-datadir.mjs` → `core/lib/argent-datadir.mjs`、`scripts/check-license.mjs` → `license-file/license-verdict`、`scripts/install-license.mjs` → `license-device`)三处入口做**静态 import 闭包**;两个 `core/contracts/*.json` 是**运行期读**的(CLI `--help`/MCP 作用域表/`versions` 对账)故一并纳入。**明确排除** `core/mcp/client.mjs`(自检/开发客户端,不在任何运行期闭包内)。⚠️ engine 只跟**有 flow 的能力**走(capability_pack.py 的既有规则)⇒ HR 办公(无 flow)**不**带 core,属设计。 |**2026-10-04(§8-③ 一次性激活码)**:engine 再 +1 项 `core/lib/license-activate.mjs` —— CLI `argent license activate` 的实现闭包(`core/lib/license.mjs` import 它);同批 `CORE_KEY` 与 `pack.engine` 两处逐项一致(`sync-scripts-core` 门禁)。",
|
|
644
|
+
"_engineNoteBump20261004": "2026-10-04(角色资产修复批):本批两处内容变更都落在**能力包 sha 里** ⇒ 四个包一起提版本并重盖章:① `core/contracts/argent.contracts.json` 的 `judgmentMeta.restateScan.globs` 扩展(新增 `presets/**/*.yml`;R2 复述扫描面 19 → 45 文件)+ baselineNote ⇒ invoice 1.2.79 / full 1.3.80 / daily-report 1.1.86(HR 不带 core,不受影响);② **preset 文案**改了 `presets/<角色>/agent.cordis.yml`(12 个 preset 的 KB-114 注释、`argent-ml-dev` 的过时 IP/同步口径、两个 invoice preset 的复述改引用)—— 能力包把 preset 目录也算内容(`pack.presets`)⇒ invoice/full/daily-report 各自的正本改了,**HR 也改了**(`presets/argent-hr-office/agent.cordis.yml` 的 KB-114 行)⇒ HR 0.1.38 → 0.1.39。⚠️ 其余 9 个 preset(argent-dev/pet-dev/…)不属于任何能力包,改了不影响包 sha。",
|
|
645
|
+
"_engineNoteBump20261008": "2026-10-08(同类根因修复批:新克隆健壮性 ②③):本批两处引擎内容变更都在 `pack.engine` 里 ⇒ 三个带 flow 的能力包(invoice 1.2.92→1.2.93 / full 1.3.97→1.3.98 / daily-report 1.1.99→1.1.100)**一起提版本并重盖章**:① `scripts/flow_sources/common.py` 新增相位唯一真源 `PHASES`(`apply_pick()` 打 `_phase` 只从它取;原字面量赋值改成同源常量,输出形状/顺序不变);② `scripts/flow_source.py` 新增 `--list-phases`(把该真源转达给门禁,替代「门禁正则解析源码文本」——P4 搬走赋值后那次解析恒得空集,C2 静默空转)。HR 不带 engine(无 flow)⇒ 不受影响。判据 = `python3 scripts/capability_pack.py --validate` ✅。",
|
|
646
|
+
"_engineNoteBump20261009": "2026-10-09(「一起装」路径根因修复批)**:共用引擎变更(`scripts/argent-capabilities.mjs` —— 新增「注册表投影」判据的**唯一真源** `isRegistryProjection()`:`planPackInstall()`(多包计划阶段)、`installPackFiles()`(落盘阶段)、`mergeCapabilityPacks()`(装机记录合并)与 `install-argent.mjs` 的升级漂移告警**共用同一个函数**。修的事故:`⑤`(608c566)只把投影感知加在执行阶段 ⇒ 计划阶段仍是裸 sha 比对,而每个能力包里的 `scripts/flow-requirements.json` 是按能力过滤的投影(跨包必然不同 sha)⇒ 安装器**自己推荐**的 `--from-packs a.tgz,b.tgz` 必失败(报「多包校验失败:能力包引擎文件版本不一致:scripts/flow-requirements.json」),实际可用路径只剩逐包装。同批:`install-argent.mjs` 的升级检查跳过投影(不再误报「记录的引擎文件与它不同版」)、`scripts/install-one-shot.mjs` 的「多包同装会被拦下(缺口㉔)」过期文案改成「一起装」;`scripts/profile-doctor.mjs` 的逐文件 sha 核对同样豁免投影(⛔ 不随能力包分发,故不进 `pack.engine` 清单)。⛔ **未放宽任何真混版判据**:同一路径不同内容且非投影 ⇒ 计划抛错、落盘冲突、合并守卫判死三条都保留(回归 `scripts/tests/pack-plan-projection.test.mjs` 15 条反例 + `install-from-packs.test.mjs` 的真 tgz 多包用例)。⚙️ **未新增运行期文件**(只改上述既有引擎文件),故 `pack.engine` 清单不变;三个带 flow 的能力包按纪律一起提版本并重盖章(invoice 1.2.95→1.2.96 / full 1.3.100→1.3.101 / daily-report 1.1.102→1.1.103)。判据 = `python3 scripts/capability_pack.py --validate` ✅。",
|
|
647
|
+
"_engineNoteBump20261008b": "2026-10-08(唤醒链根因加固批):本批引擎内容变更 ⇒ 三个带 flow 的能力包(invoice 1.2.93→1.2.94 / full 1.3.98→1.3.99 / daily-report 1.1.100→1.1.101)**一起提版本并重盖章**:① **新增** `scripts/lib/wake-auth.mjs`(唤醒鉴权来源链的唯一实现:显式 token 文件 → **凭据 `records.client-connection/browser-session` 现签 browser-session cookie(不依赖 /tmp)** → `DSH_WEB_LOG` → plist 的 `StandardOutPath` → 稳定目录候选 → `/tmp/dsh-web.log` 兜底;每个来源**先验后用**,全失败则点名所有来源 + 修法)⇒ 已加进 `pack.engine`(闭包门禁 `check-pack-closure --strict` 要求:`flow-trigger-wake.mjs` 静态 import 它);② `scripts/flow-trigger-wake.mjs` 改用该来源链,并把**所有失败出口**(缺模板/取不到鉴权/建会话失败/投递失败/未捕获异常)统一到 `failWake()`:❌ 文案 + **stderr 显著** + 台账 `blocked`(`by=flow-wake`,case=`wake__<flow>`)+ 遥测 `engine/needs_human`(修事故:`/tmp/dsh-web.log` 被系统清理 ⇒ 唤醒 exit 2 ⇒ 角色会话没起、表没生成、且**台账/遥测里一条失败都没有**的静默故障);③ `scripts/flow-trigger.sh` 取唤醒端退出码(`PIPESTATUS[0]`)非零即响亮播报并原样透出退出码(此前只有 launchd 的 last exit 可见)。⛔ 零业务改动;回归 `scripts/tests/flow-trigger-wake-auth.test.mjs`(纯夹具 + 本地桩服务:来源优先级/兜底/开关/格式错误/失败可见)。",
|
|
648
|
+
"_engineNoteBump20261005": "2026-10-05(合规缺口修复批:遗留「含店铺/货件诊断包」通道):`scripts/orchestrator.py` 两处内容变更 ⇒ ① **载荷收口**:删除 `screenshot_base64`/`dom_summary`/`log_tail`/`page_url`/`name`,`store`/`sku`/`shipment_id`/`record_id` 改发 12 位哈希(复用 `telemetry.case_hash`,A1 口径),`error` 不再整包转发 `exc.to_dict()`(改 `type`+固定措辞+`recovery_attempted`+`code`+`detail_keys`);`_report_failure` 签名收成 `(step, exc)` ⇒ 结构上不收现场原文。② **闸门统一**:删掉自建的 `_read_telemetry_opt_in()`(遗留 `config.yaml#argent.telemetry_opt_in` 只有读者、没有写者 ⇒ 可见开关管不住本通道),改调 `scripts/telemetry.py#telemetry_enabled()`(两条通道同一判定;遗留键即便 true 也不放行)。⚠️ **本批只提 `full`**:变更文件 `scripts/orchestrator.py` 属 `capabilities.full.pack.scripts`,**`pack.engine` 一个字节未动**(`scripts/telemetry.py` 只被复用、未改)⇒ 按「内容 sha 变了才提版本」的判据,三个带 flow 的能力包**不需要**同提;判据 = `python3 scripts/capability_pack.py --validate` ✅。回归:`scripts/tests/failure-report-consent.test.py`(52 断言:未同意零请求/遗留键 true 也不发/字段面白名单/业务原文零上行)。文档:《数据上报说明(对外)》新增 §2.1 + 变更记录;《日志上报与排障》新增 §2.1 与端点表更新。",
|
|
649
|
+
"_engineNoteBump20261003": "2026-10-03(P4 批):本批两处引擎变更 ⇒ 三个带 flow 的能力包(invoice/full/daily-report)**一起提版本并重盖章**:①`pack.engine` 纳入 core 运行期文件(新增 26 项);②数据目录链两步落地改了 `scripts/lib/argent_datadir.py`(存在即沿用 + 新装 `~/.argent`)。",
|
|
650
|
+
"_engineNoteBump20261009c": "2026-10-09(配置「生效来源」可见化批,批 1):`core/lib/config-catalog.mjs` 新增**纯函数** `resolveEffective()`(按规范链算「谁赢了 / 谁被压住」)、密钥脱敏 `redactSecret()`,以及读取器的 `effectiveOf()`/`levelsOf()`(把「每一级现在有没有值」都取出来);并**收录**只读 CLI `scripts/config-explain.mjs`(运维与会话读「我改了到底生效没」的唯一入口,`--key/--all/--list/--json`)。⛔ **零行为变化**:读取器取值那条路径(`resolveOne`)一个字节没动,`todayChain` 一个都没改 ⇒ 只是「如实展示」。⚠️ **四个包一起提版本并重盖章**(full 1.3.115→1.3.116 / invoice 1.2.107→1.2.108 / daily-report 1.1.114→1.1.115 / hr 0.1.45→0.1.46):**实测**(`--emit-server-manifest --json` 对 HEAD 树与工作树逐包对拍)四个包的整包摘要**全部变了** —— 除了三个带 flow 的包真的多了这一份引擎件,`hr` 也变,是因为**每个包的 tgz 里都带一份注册表投影**(`packed_registry()` → `scripts/flow-requirements.json`),而本次改了它的 `pack.engine`;`--stamp` 的拒绝文案也明说「引擎文件改动会让**所有**能力包内容变化,四个包都要提」。这正是 hr `0.1.42` 那条先例认定的形态:不一起提版本就会出现「同一版本号对应两份不同字节」(`release-argent.sh --check-dl` 的能力包档会当场判红)。 ⚠️ **盖章说明**(同日收口):本版内容在同一工作树里经过多轮收口(先落 L1 与只读 CLI,再改 CLI 文件头里的契约小节引用、补齐两条既有回归的登记)⇒ 以**最终内容** `--stamp --force` 重盖章;四个包的目标版本**从未发布过**(`--check-dl` 实测:线上仍是旧版 ⇒ 四条「版本不同 · 发布在途」,不判红)⇒ 不存在「内容变了版本没动」的对外窗口。⛔ 本批**未发布**任何包(发布留给调用方)。 |**同批收口(再现测出的一处\"如实说谎\")**:只读 CLI 出门前的第二道脱敏闸原先是**无条件**再脱敏一次 ⇒ 占位里的长度变成**占位串自己的长度**(恒 11),而用户正是拿这个数字比对\"密钥换没换\"。已改为**幂等**(形态已是占位就放过,生效级与被压住的那级都覆盖),并补回归断言\"长度 == 真实长度\";同批四个包再提一版(引擎面同一份 CLI 变了):full→1.3.117 / invoice→1.2.109 / daily-report→1.1.116 / hr→0.1.47。",
|
|
651
|
+
"_engineNote20261002": "数据目录判据(2026-10-02):`scripts/lib/argent_datadir.py`(Python 唯一实现,与 JS 内核 core/lib/argent-datadir.mjs 同语义)+ `scripts/argent-datadir.py`(CLI 包装,flow-trigger.sh / dev-window.sh / 常驻巡检脚本用它取数据目录)**必须随引擎分发** —— 否则客户机上 `flow-trigger.sh` 取不到判据会**响亮停住**(fail-closed:绝不猜目录,猜错就是往生产写)。两个文件都由 `scripts/tests/argent-datadir-parity.test.mjs` 守着。",
|
|
652
|
+
"_engineNote20260930": "离线许可闸门(2026-09-30):flow-trigger.sh 的「许可 / 租约二选一」判定调用 `scripts/license-gate.mjs`(它再调 `scripts/check-license.mjs` 读 `$ARGENT_DATA_DIR/license.json` 验签)⇒ 这两个文件**必须随引擎分发**,否则客户机上闸门会静默不生效(默认 observe 只会打一行「缺少脚本」告警,不留证据)。",
|
|
653
|
+
"_engineNote20260921": "批 C4/C2 补:`scripts/lease.py`(能力租约闸门,flow-trigger.sh 直接调用)与 `scripts/flow_billing.py`(月结账单,工作台/运维都要用)**必须随引擎分发** —— 否则客户机装完缺脚本:触发器会找不到 lease.py,账单也没法算。",
|
|
654
|
+
"_engineNoteStandalone20261003": "独立运行验证补齐(2026-10-03,P4 批):按上面那条「按实际 import 关系推导」的规矩,**把能力包 build 出来、在没有仓库、没有 git/sync 的极简 PATH 下真跑一遍** ⇒ 抓出 3 个**此前就缺**的运行期文件(不是本批引入的):① `VERSION` —— `core/cli/argent.mjs` 的 `version` / `--help` 直接读它,缺它 CLI **当场 ENOENT 崩**(实测:`node <pack>/core/cli/argent.mjs version --json` ⇒ exit 1 + `ENOENT …/VERSION`);② `scripts/flow_case.py` —— `scripts/flow_source.py:260` 用**子进程**调它建案,缺它 ⇒ 读源直接失败(cli-json / cases-json 两条数据面都过不去);③ `scripts/ml_schema_check.py` —— `flow_source.py:280` 子进程调它做字段缺口检查,缺它 ⇒ 只有加 `--skip-gap` 才跑得动。⇒ **推导规矩据此收紧**:包内运行期闭包 = 静态 import 闭包 **∪ 子进程调用图**(`sys.executable <script>` / `node <script>` 这类调用)。三条都由本批的「独立运行复验」跑通(version / flow list / source / claim / ledger / notify 全绿)。",
|
|
655
|
+
"_engineNoteDoctor20261003": "客户机自检(2026-10-03,M1 判据③):`core/lib/doctor-customer.mjs`(`argent doctor --customer` 的实现,被 `core/cli/argent.mjs` **直接 import** ⇒ 落在「按 import 闭包推导」的 core 运行期清单里)必须随引擎分发 —— 否则客户机上 `doctor --customer` 会在 import 处直接崩,而它正是 M1 判据③(无 dsh 不报 FAIL)的**唯一可跑判据**。回归:`node scripts/tests/doctor-customer.test.mjs`;同步面:`scripts/sync-scripts.sh#CORE_KEY`(两处清单逐项一致,由 `scripts/tests/sync-scripts-core.test.mjs`【0】守着)。⚠️ 该文件落地后一行**措辞修正**(失败建议不再重复「不可写」两遍)同样改了引擎 sha ⇒ 按纪律**再提一版**(invoice 1.2.73、full 1.3.74、daily-report 1.1.80)并重盖章。",
|
|
656
|
+
"_engineNoteClosure20261004": "能力包闭包体检首日(2026-10-04,新增 `scripts/check-pack-closure.mjs`):按上面那条「包内运行期闭包 = 静态 import 闭包 **∪ 子进程调用图**」的规矩做**全量反查**(从包内每个代码文件出发解析它的引用,再看引用的文件在不在包里),一次抓出 **6 个真缺件**,本批补 **5 个**:① `scripts/telemetry.py` —— `scripts/flow-trigger.sh` **9 处子进程真调用点**(4×`--emit --kind engine` + 4×`--flush` + 1×`--heartbeat --flush`),同文件还被 `scripts/flow_ledger.py:193` **静态导入**(`import telemetry as T`,用它判「引擎级合成票号」以免同一次失败写两条事件);② `scripts/invoice_ready_audit.py` —— `flow-trigger.sh:113` 子进程(按小时的「放行勾残留」巡检:发票状态=已完成 却仍勾着「发票就绪」);③ `scripts/invoice_carrier_notice.py` —— `flow-trigger.sh:170` 子进程(「未接入货代」提示写入);④ `scripts/ziniao-auth-probe.sh` —— `flow-trigger.sh:387` 子进程,**带 `[ -f ]` 守卫** ⇒ 缺件时不报错、**静默跳过**(属最危险的一类:少一次紫鸟授权自愈探针,日志上什么都看不出来);⑤ `scripts/wenyao_portal.py` —— `scripts/wenyao_run.py:335` 的 `import wenyao_portal as wp`(门户连接/钩子/下载目录三处调用),缺它文鳐门户链**直接崩**。⚠️ 归属分开:**①②③④ 是与具体业务无关的共用引擎件**(三条带 flow 的能力包都引用它们)⇒ 进顶层 `pack.engine`;**⑤ 只属发票线**(文鳐门户)⇒ 进 `capabilities.invoice.pack.scripts`,不进 engine。**第 6 个明确不进 `pack.engine`:`scripts/dsh-upgrade.mjs`** —— 它是 **L2 宿主侧升级工具**(换整棵 dsh 树 / 重打 hotfix 补丁 / 回滚),只在 `scripts/dsh-upgrade-readiness.mjs:121` 那条**可选 `--gates` 路径**上被点名(默认路径不调用它,客户机的 flow-trigger 也不会走到它),且它自己的闭包主体 `scripts/patches/**` **本就不随能力包分发**(宿主侧资产,门禁已按「非运行期」排除)⇒ 把它塞进 engine 只会让每个包白背一个「客户机上永远不该由能力包执行」的宿主工具,且与 patches 的排除口径自相矛盾。判据是**客户机的运行期是否真会走到它**,不是「字面上出现过这个路径」。本条与 `_engineNoteStandalone20261003` 是同一条规矩的两个方向:那条说「引用到了就得进」,这条说「宿主侧工具及其补丁闭包不进」。回归:`node scripts/check-pack-closure.mjs --strict` 应报 0 缺件(排除项除外);同步面:这 5 个文件都在 `scripts/` 整目录 rsync 面内 ⇒ `sync-scripts.sh#CORE_KEY` **无需增项**(CORE_KEY 只管 `core/**`)。",
|
|
657
|
+
"_engineNoteConfigCatalog": "2026-10-09(配置地基):`pack.engine` 纳入 `core/lib/config-catalog.mjs`(通用配置读取器,L1)与 5 个引擎级配置目录文件 `configs/*.json`(账号/通知与投递/宿主与机器/人事/高级与诊断)。业务线级目录 `verticals/<id>/config.json` **不在这里** —— 它由 `capability_pack.manifest()` 随`manifest.json`/`flows.json` 同批带上(与业务线绑定,不该发给不带该线的包)。不带这两样的后果不是报错而是**静默半残**:页面少一半可配项、`sourceOf()` 全回 missing。",
|
|
658
|
+
"_engineNoteBump20261009d": "2026-10-09(**写步骤失败前先核验真实状态**,生产票 79191341):步骤3/4/8 是**幂等写步骤**,它们的真相都能**只读**验证 ⇒ 失败判定改为「先核验、再判失败」。新增两个引擎件:`scripts/flow_write_verify.py`(三态纯判据 effective/not_effective/unavailable,⛔ `unavailable` 永不等于成功;核验抛异常也一律 unavailable)与 `scripts/flow_status_reconcile.py`(**只读**「表 ⇄ 台账」双向对账,⛔ 不自动改表)。接线在 `orchestrator._execute_steps` 的失败分支(核验为 effective ⇒ 判成功、⛔ 不产生 failed 事件;不可用 ⇒ 仍判失败但文案写明「核验不可用(原因)」)。文案唯一来源仍是 `flow_failure`(`verified_effective_note()` / `unverified_reason()` / `ops_message()`)。⇒ 共用引擎内容变了:**三个有 flow 的能力包一起提版并重盖章**(full 1.3.117→1.3.118 / invoice 1.2.109→1.2.110 / daily-report 1.1.116→1.1.117);`hr` 无 flow(不带 pack.engine)⇒ 不受影响。⚠️ **`hr` 也必须提版(0.1.47→0.1.48)**:它没有 flow,但能力包里**内嵌了派生注册表 JSON**(`capability_pack.pack_digest()` 把 `packed_registry()` 的 sha 当作一个虚拟文件算进整包摘要),所以 `pack.engine` 一变、hr 的整包摘要就变 —— 实测 HEAD 摘要 0c85dd9e(= 线上已部署)→ 工作树 9073e2c2 ⇒ 不提版就会命中 `--check-dl` 的「**同版本、内容摘要不同**」红(同版本覆盖发布形态)。⇒ 四个能力包一起提版并按 `--publish-packs` 发布(发布动作留给交付方)。",
|
|
659
|
+
"_engineNoteCapacity20261010": "引擎级台账(2026-10-10,FULL 自动路径成功率修复批):`scripts/flow_failure.py` 新增 `capacityFull` 失败组(注册表 `failureClasses.capacityFull` 是唯一权威,**排在 needs_human 之前**);`scripts/flow_config.py` 新增配置中心入口 `appointment_max_day()`(env `ARGENT_APPOINTMENT_MAX_DAY` 优先 → 声明 default)与 `catalog_default()`;`configs/advanced.json` 新增 `advanced.appointment.max_day`(**默认 5**,原 3 —— 这是本批**唯一的行为变更**:约 1/3 的 FULL 失败与「最近几天都被平台拒」相关,窗口=3 够不到可约日期);`scripts/flow-requirements.json#failureClasses.capacityFull`(新增类:判据 = 平台原文 `liberar espacio` 等片段 + 分类标记 `capacity_full`)⇒ pack.engine 的四个能力包内容随之变化(**无 flow 的 hr 也变**,按「内容变 ⇒ 版本必变」提版本)。⛔ 本轮**未新增引擎面运行期文件**(`scripts/ml_capacity_probe.py` / `scripts/analyze-full-day.py` 属 full 能力包脚本,见 `capabilities.full.pack.scripts`)。",
|
|
660
|
+
"_engineNoteCapacity20261010b": "引擎级台账(2026-10-10,同批二次收口):`core/contracts/argent.contracts.json` 的 J4-failure-classification 登记的 owner/implementations 行号与 anchor 随 `scripts/flow_failure.py` 重排更新(anchor 收紧成 `GROUPS = (('capacityFull', 'needs_human')`,并补 outputs 一行)⇒ 含该契约文件的三个能力包(full / invoice / daily-report,**不含 hr**)内容随之变化,按「内容变 ⇒ 版本必变」各提一个补丁版本并重新盖章。⛔ 未新增运行期文件。",
|
|
661
|
+
"_engineNoteCapacity20261010c": "引擎级台账(2026-10-10,同批三次收口):`configs/advanced.json` 的 help 小节号纠正为 **§8.72**;`scripts/flow_config.py` 删除未使用的模块级常量 `CATALOG_DIRS`(配置声明的读取只经 `catalog_default()`,那个常量不参与任何判据)⇒ 含这两个文件的三个能力包内容变化,各提一个补丁版本并重新盖章。⛔ 未新增运行期文件、行为零变化。",
|
|
662
|
+
"_engineNoteHostGate20261012": "2026-10-12(宿主支持窗口门禁 · 按设计改正漂移):**引擎面文件 `install-argent.mjs` 改动**(新增 `hostGate()`:判定在克隆/下载/写盘**之前**;窗口外宿主 / 缺 dsh ⇒ **exit 2** + 指引,⛔ 不动已装 dsh;`--install-host`(默认关)成为**唯一**代装入口且只在无 dsh 时生效;新增 `--allow-unsupported-host`(默认关,内部/验证用)放行 + 告警 + 写审计)+同批 `install.sh` / `install.ps1` 两个开关透传 + `scripts/install-one-shot.mjs` 预检文案。engine 是共用清单 ⇒ **四个能力包版本一起前进并重盖章**(含无 flow 的 hr)。回归 `scripts/tests/install-host-gate.test.mjs`(十条判据,纯夹具、零外网)。",
|
|
663
|
+
"_engineNoteSchedule20261012": "2026-10-12(**P1-A 宿主排程批**:静默失败四道闸防线 + 日报试点声明)。① **新增两个文件**(本批核心):`scripts/lib/schedule-probe.mjs`(L1 只读判据 —— 挂载闸 POST /api/schedule/catalog 的 404/200;新鲜度闸 now - lastDelivery.deliveredAt > 1.5×周期;执行闸 = 回执推进 ∧ L1 台账/日志无新事件 ⇒ 红;持久化闸 = 排程域文件可解析 ∧ 关键不变量 —— 坏文件会让宿主**拒绝启动整个 domain**)与 `scripts/argent-schedule.mjs`(L2 CLI:probe/status/check/pause/apply,默认 dry-run,--apply 才写,写 <数据目录>/schedule-audit.jsonl 审计)。⛔ 两者**不进 engine 清单**:它们是运维/巡查档,没有任何包内文件 import 它们(以 check-pack-closure --strict 缺件 0 为证),与既有的 check-production-home.mjs / argent-doctor.mjs 同档;防线的交付面是同步面 scripts/。② engine 清单内**内容变更**三项:scripts/flow_config.py、scripts/vertical-lint.mjs、scripts/lib/registry.mjs。③ 声明面:只有日报那一条流程加 trigger.schedule(其余三条流程的 trigger 逐字节未动)。④ 打包器把 trigger.schedule.promptFile 随包带上 ⇒ 本批**四个能力包一起提版本并重盖章**(无 flow 的 hr 也会变:包内注册表投影含 pack.engine)。⑤ ⛔ 本批**不切投递**:宿主排程 prompt 创建时固定,依赖 flow-trigger.sh --no-wake(尚不存在,P1-B)。",
|
|
664
|
+
"_engineNoteScopeF120261014": "2026-10-14(**F1 修复批:scope 探测 npx 感知 + 探不到返 null + 调用方守卫审计**)。用户 MBP 真机实测触发:`npx @deepseek-ai/dsh@0.2.0-rc.2 web` 形态下 W8 的定时判据恒 `unknown`(根因 = 既存缺口 F1:真源 `resolveDshScope()` 不认 npx,且探不到时回一个**可能不存在**的路径)。① **engine 清单内内容变更**(⇒ 四个能力包一起提版 + 重盖章):`scripts/lib/dsh-scope.mjs` —— `resolveDshScope()` 候选链新增 **npx 缓存档**(复用 `dsh-host-resolve.mjs#npxCacheDirs/scanNpxCache/pickNpxHost`,判据只有一份);**命中判据改为「该 scope 里真的有 dsh 包」**(新增 `hasDshPackage()`,⛔ 不是“目录存在”);**探不到 ⇒ `null`**(⛔ 不再 passthrough 假路径);返回 `{scope, source: profile|npx|global, how}` / `{…, stale:true}`(有壳没内容)/ `null`(未知);多 npx 候选按「最匹配宿主版本 → mtime 最新 → 路径升序」择优且理由进 `how`;新增守卫工厂 `requireDshScope()` / `requireImportTarget()`;`resolveDshScopeDir()` 自动档委托同一人选;`scopeCandidates()` 补 npx 档。② **非 engine 的调用方**逐个审计并改(要干活 ⇒ 响亮失败;可选增强 ⇒ 降级但打印原因):`session-repair-tool-result-content.mjs` / `session-health-scan.mjs` / `dsh-preflight.mjs` / `patches/verify-{hardening,bundled-migrators,transport-diagnostics,session-migration}.mjs` / `validate-preset-schema.mjs` / `repair-unresolved-tools.mjs`(以上 required)+ `dsh-plane.mjs` / `dsh-upgrade-readiness.mjs` / `argent-upgrade.mjs`(optional / 响亮降级)。③ **W8 定时判据吃到修复**:`scripts/lib/schedule-mechanism.mjs` 新增**可选注入** `scopeDirsProbe`(L1 ⛔ 不 import 宿主档),`scripts/argent-schedule.mjs` 注入 `runtimeHostScopeDirs()`(npx 感知;profile 候选优先)⇒ npx 机器上 `argent-schedule.mjs mechanism` 从 `unknown` 变 `native`;⛔ 五态语义与 `conflict` 判据未动、「候选一个都不存在 ⇒ unknown」未放宽。④ **夹具**:新增 `scripts/tests/dsh-scope-npx.test.mjs`(41 断言:npx 命中 / 空壳落选 / 未知即 null / profile·global 回归 / **调用点清单(新增未登记 ⇒ 判红)** / native 探针在 npx 夹具下判 native / 三条有牙自证),并同步 `dsh-scope-resolve` / `bootcheck-scope-resolution` / `dsh-scope-patch-target` 三个既有回归。⑤ 文档:`docs/Argent-宿主适配契约.md` 新增 §3.1.1.1(候选链 + 未知即 null + 调用方纪律),`docs/Argent-0.5.0-适配实施计划.md` §8.1 标记 F1 已收口。",
|
|
665
|
+
"_engineNoteSchedule20261014": "2026-10-14(**0.6.0 W8:定时器双线 + 存量机器迁移**)。本批把「定时怎么来」收敛成**一处声明 + 一处判据**,并给存量机器一条可干跑/可回滚的迁移路径。① **新增** `scripts/lib/schedule-mechanism.mjs`(L1:机制枚举 + 三态探针 `probeNativeSchedule`(available / absent / **unknown**)+ 垫片探针 `probeActivationShim` + 唯一判据 `resolveScheduleMechanism` + 单一调度者 `schedulerConflict` + 同步判据 `detectScheduleMechanismSync`)与 `scripts/lib/deps-migrate.mjs`(L1:遗留 `file:` ⇒ npm 名的**纯计划** + 备份/审计/读回验收/回滚);② **新增** `scripts/flow-timers-plist.sh`(激活垫片的 plist 生成器:纯 stdout、零副作用 ⇒ 可逐字节回归;`flow-timers.sh` 改为调它)—— **按 check-pack-closure 的判据进 engine 清单**(它是 `flow-timers.sh` 的运行期子进程);③ engine 清单内**内容变更**:`scripts/flow_config.py`(新增 `--schedule-declaration`:Python 侧**唯一**读取点)、`scripts/flow-timers.sh`(labelPrefix 从声明面取;缺 interval ⇒ **响亮失败**,⛔ 不再静默 300)、`scripts/lib/registry.mjs`、`scripts/vertical-lint.mjs`(声明面校验);④ **声明面**:本文件顶层新增 `schedule`(`mechanism` / `jobs` / `onConflict`)—— 两条线共用这一处;⑤ `scripts/argent-schedule.mjs` 新增 `mechanism` 子命令与第 ⑤ 道闸(单一调度者);⑥ 存量迁移入口**唯一**:`node scripts/argent-upgrade.mjs migrate-deps`(默认干跑;`--apply` 才写;⛔ 默认不跑包管理器,要跑须 `--allow-package-manager`)。⛔ 本批**不动** `install-argent.mjs` 语义、⛔ 不发布 npm/能力包、⛔ 不重启服务。"
|
|
666
|
+
},
|
|
667
|
+
"billing": {
|
|
668
|
+
"_why": "计费口径的**唯一出处**(2026-09-21 批 C2/C3)。用户已认可的单位:FULL 按成功票 · 发票按成功票(文鳐/鑫中航各自分价)· 日报按店铺数包月 · HR 按员工数包月(轻量日报不计件)。规则:**只算成功**(终态 done)、**一票一结**(同一 caseId 只算一次)、**证据可核**(detail 必须命中 evidence 里的标记,否则进复核清单不计费)。rateYuan / humanMinutes 目前是**占位数字**(用户尚未定价)—— 改这里即改账单,脚本不写死任何金额。",
|
|
669
|
+
"currency": "CNY",
|
|
670
|
+
"laborHourlyYuan": 60,
|
|
671
|
+
"_laborNote": "人工等价用的时薪(占位 60 元/小时):value receipt 用它把‘完成件数’换算成人工成本。",
|
|
672
|
+
"units": {
|
|
673
|
+
"full": {
|
|
674
|
+
"unit": "件(货件作业:建单→预约→标签/箱唛→取消预约)",
|
|
675
|
+
"rateYuan": 8,
|
|
676
|
+
"humanMinutes": 30,
|
|
677
|
+
"evidence": [
|
|
678
|
+
"货件号\\s*[=::]?\\s*\\d{6,}",
|
|
679
|
+
"FULL状态=已完成|全绿|全通|8[//]8|completed_steps=\\[1|箱唛|产品标"
|
|
680
|
+
],
|
|
681
|
+
"_evidenceNote": "真货件号(允许 `货件号=123` / `货件号123` / `货件号:123` 三种写法)+ 任一交付物/完成标记(FULL状态=已完成 / 全绿 / 全通 / 8-8 / completed_steps=[1… / 箱唛 / 产品标)。实测留言有 6 种写法 —— 判据是 2026-09-21 用真台账逐条校准出来的,误判代价不对称:漏算=少收钱(可人工补),多算=多收钱(客户不认)。"
|
|
682
|
+
},
|
|
683
|
+
"invoice": {
|
|
684
|
+
"unit": "件(开票作业:填报→回写→门户导出→大货标签)",
|
|
685
|
+
"rateYuan": 12,
|
|
686
|
+
"humanMinutes": 50,
|
|
687
|
+
"evidence": [
|
|
688
|
+
"产物",
|
|
689
|
+
"回写|已完成|已上传|附件"
|
|
690
|
+
],
|
|
691
|
+
"_evidenceNote": "两条都要命中:① `产物`(覆盖 `产物=…` 与 `4 产物存在(…)`);② 回写/已完成/已上传/附件 之一(收口或回读证据)。实测留言有 5 种写法(含鑫中航‘均已回写 lip 表’)—— 2026-09-21 用真台账逐条校准;漏算=少收钱(可人工补),多算=多收钱(客户不认),故宁严勿松但必须覆盖真交付物写法。"
|
|
692
|
+
},
|
|
693
|
+
"daily-report": {
|
|
694
|
+
"unit": "店×月(日报按店铺数包月,**不按天计件**)",
|
|
695
|
+
"rateYuan": 8,
|
|
696
|
+
"humanMinutes": 15,
|
|
697
|
+
"mode": "per_store_month",
|
|
698
|
+
"evidence": [
|
|
699
|
+
"已推送"
|
|
700
|
+
],
|
|
701
|
+
"_evidenceNote": "只认真正推送过的那条(影子跑/复核留言不算)"
|
|
702
|
+
},
|
|
703
|
+
"hr": {
|
|
704
|
+
"unit": "员工×月(HR 按席位包月,无流程事件)",
|
|
705
|
+
"rateYuan": 0,
|
|
706
|
+
"humanMinutes": 0,
|
|
707
|
+
"mode": "per_seat_month",
|
|
708
|
+
"evidence": []
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
},
|
|
712
|
+
"lease": {
|
|
713
|
+
"_why": "能力租约的**开关与口径**(批 C4,2026-09-21)。服务端签发 72h 租约 + 7 天宽限,客户端执行前查一次(`scripts/lease.py --check <capability>`,离线可验签)。**enforce 默认 false**:能力包已经装在客户机上,贸然开闸会让正在跑的生产流程立刻停摆;上线顺序必须是 ① 部署服务端租约端点 → ② 客户端 --refresh 拿到租约 → ③ 把 enforce 改 true → ④ 观察一周(grace 会先出现,不会直接 deny)。",
|
|
714
|
+
"enforce": false,
|
|
715
|
+
"ttlHours": 72,
|
|
716
|
+
"graceDays": 7,
|
|
717
|
+
"_boundary": "说明白边界:这是**锁**不是保险柜 —— 拿不到租约时我们响亮停住并给人工指南,不删客户数据、不动产物;也不拦客户自己的其它工具。",
|
|
718
|
+
"refreshAheadHours": 12,
|
|
719
|
+
"remindDays": 1,
|
|
720
|
+
"_opsNote": "自动续订:flow-trigger 每轮先跑 (距到期 < refreshAheadHours 才换,避免每 5 分钟打扰服务端);换不到**不算错误**(离线容忍,宽限期内继续跑)。续订提醒:(剩余 < remindDays(默认 1 天)时喊人,供触发器推飞书卡)。"
|
|
721
|
+
},
|
|
722
|
+
"_aliasNote": "2026-09-29 P2a:业务线落位后规范 id 是 `<vertical>.<flow>`。**旧 id → 规范 id 的别名由业务线自己声明**(`verticals/<id>/flows.json#aliases`),引擎侧不出现任何业务线名(门禁 `vertical-lint` 的\"引擎不掺业务词\"会拦)。别名是迁移期事实,退休时机 = 所有调用点与机器配置改完(P2b/P5)。",
|
|
723
|
+
"schedule": {
|
|
724
|
+
"mechanism": "auto",
|
|
725
|
+
"jobs": {
|
|
726
|
+
"source": "scripts/flow-timers.sh",
|
|
727
|
+
"labelPrefix": "com.whyshu.flow-trigger",
|
|
728
|
+
"platform": "darwin",
|
|
729
|
+
"installCommand": "bash {repo}/scripts/flow-timers.sh install --flow {flow}"
|
|
730
|
+
},
|
|
731
|
+
"onConflict": "refuse",
|
|
732
|
+
"_note": "**「定时怎么来」的唯一声明点**(0.6.0 W8,2026-10-14)。取值 `auto | native | activation-shim | none`:`auto` = 按宿主证据决定(探到 `@deepseek-ai/dsh-schedule` ⇒ native,否则按垫片证据)。⭐ 判据**不在这里**:唯一实现是 `scripts/lib/schedule-mechanism.mjs#resolveScheduleMechanism()`;本段只是**声明**(谁在什么条件下被允许),运行期只有两个读取点 —— Node 侧读本段经 `scripts/lib/registry.mjs`(合并唯一真源),Python 侧 `scripts/flow_config.py --schedule-declaration`。`jobs` = **激活垫片**(0.1.7 线)的安装入口清单:`labelPrefix`(LaunchAgent label 前缀)、`installCommand`(模板,占位 `{repo}`/`{flow}`)、`source`(垫片实现文件)。⛔ 两条线**不许同时**调度同一条流程(单一调度者纪律):native 与 shim 同时在 ⇒ 响亮报冲突(`schedule-mechanism.mjs#schedulerConflict()`,`onConflict: refuse` = ⛔ 不静默择一)。⛔ 探测不到时一律 `unknown`(**不假装可用、不静默装 cron**)——F1(`resolveDshScope()` 可能返回不存在的路径且不感知 npx)未修,所以 native 探测必须分三态:available / absent / unknown。"
|
|
733
|
+
},
|
|
734
|
+
"_engineNoteReleaseBudget20261013": "2026-10-13(**放行额度随上游数据变化重置 + 外部时序独立通道**,修「上限用尽后再也不会被拾取」)。① 引擎面内容变更:`scripts/flow_triage.py`(新增上游逐字段稳定哈希判据 —— 变了才把该票的放行计数归零,并写一条**信息性** `policy_apply{policy=release_budget_reset}`;新增**独立通道**分类与长冷却/独立上限,⛔ 不占既有的每票放行上限)、`scripts/flow_claim.py`(`planned` 增记逐字段哈希快照与独立通道标记,⛔ 只加字段)、`scripts/flow_ledger.py`(`policy_apply` 增一个机器可判的政策名,⛔ 不改事件类型)、`scripts/flow_sources/common.py` 与 `scripts/flow_sources/feishu_base.py`(新增**观察列**进投影的判据 —— 不在投影里的列永远观察不到变化)、`core/contracts/argent.contracts.json`(三处 anchor 行号随上述文件重排)。② 每个包的 tgz 里都带一份注册表投影(含 `pack.engine`)⇒ 引擎面一变、**四个包一起提版本并重盖章**(含**无 flow** 的 `hr`;同 0.1.42 / 0.1.52 先例)。⚠️ 本批在同一工作树里经过**多轮收口**(先落实现,再按 vertical-lint 的引擎业务词约束去掉引擎面文案里的业务词,再收口技能/运维文案与契约 anchor)⇒ 以**最终内容**盖章;版本号**未发布**,不存在「内容变而版本没动」的对外窗口。"
|
|
735
|
+
}
|