From c97bea3239a341f2b47647c92b9b4735b1c9f3ee Mon Sep 17 00:00:00 2001 From: inman Date: Wed, 9 Sep 2026 18:42:20 +0800 Subject: [PATCH] docs: publish business instruction 0.5.127 --- .../20-architecture/system-overview.md | 2 +- .project-docs/30-worklog/current-state.md | 4 +- ...siness-instruction-batch-child-7e3c1a94.md | 63 ++++++++++++++++ README.md | 2 +- agent设计规范/README.md | 6 +- agent设计规范/business-adaptation-registry.md | 14 ++-- agent设计规范/business-behavior-registry.md | 2 +- .../templates/business-input-templates.md | 58 +++++++++++---- .../test-fixtures/lwlt-lifecycle/release-gate.md | 5 +- archive/releases/2026-09-09/README.md | 6 ++ ...t-0.5.170-skills-0.5.126-docx-0.5.126.json | 69 ++++++++++++++++++ .../2026-09-09}/老挝联泰AI指令表-0.5.126.docx | Bin control-plane/src/business-routes.ts | 2 +- control-plane/test/program-parser.test.ts | 3 +- dist/release-manifest.json | 12 +-- dist/老挝联泰AI指令表-0.5.127.docx | Bin 0 -> 31570 bytes tools/business-input-templates.test.mjs | 31 ++++++-- tools/repository-hygiene.test.mjs | 5 +- 18 files changed, 234 insertions(+), 50 deletions(-) create mode 100644 .project-docs/30-worklog/tasks/20260909-business-instruction-batch-child-7e3c1a94.md create mode 100644 archive/releases/2026-09-09/README.md create mode 100644 archive/releases/2026-09-09/release-manifest-0.5.170-skills-0.5.126-docx-0.5.126.json rename {dist => archive/releases/2026-09-09}/老挝联泰AI指令表-0.5.126.docx (100%) create mode 100644 dist/老挝联泰AI指令表-0.5.127.docx diff --git a/.project-docs/20-architecture/system-overview.md b/.project-docs/20-architecture/system-overview.md index cca3bec..9ed96c6 100644 --- a/.project-docs/20-architecture/system-overview.md +++ b/.project-docs/20-architecture/system-overview.md @@ -29,7 +29,7 @@ Authenticated employee manual or account-bound AgentBus input is routed through - Each enabled AgentBus channel owns one active non-admin employee account. Inbound work uses that account and route allowlist, persists the same account as immutable task assignee, and is returned only to that account's executable feed. A team-lead channel may additionally carry its leader's lower-priority proactive summary outbox; those rows use explicit destination/conversation routing and never become executable task traffic. - Each employee account has one expected ERP identity and at most one fresh browser execution worker. The extension accepts ERP identity only from exactly one `#Lable_UserName` login node and normalized full equality; missing, duplicate, blank, substring-only, or unrelated body-text matches fail closed without returning the observed identity. Concurrent fresh workers, unbound channels, or unassigned tasks also fail closed. Browser claims, active-execution checks, and confirmed FIFO are serialized per immutable task assignee, so one account cannot block or occupy another account's queue. - Administrators have no task read or execution model. Task lists/details, attachments, artifacts, lifecycle mutations, SSE history/live events, browser claims, plugin-result ingestion, and browser cleanup commands require a `team_lead` or `user` session matching `assigned_user_id`; the team-lead dashboard and notification outbox remain separate read projections. -- Extension `0.5.170` is the current manually published plugin baseline, Program parser `v1.0.7` owns the new shared-child batch directive, and the five Skills plus operator instruction DOCX remain at `0.5.126`. The batch adapter enumerates and validates every matching shared-plan parent before the first write, executes in date/tid order, and stops without retry at the first blocked, failed, or uncertain result. The extension retains an idle-proof and guarded-reload message protocol, but the active control plane has no extension-release tables, ECS host mapping, OSS publication endpoint, Cloud Assistant dispatcher, or platform trigger; required migration is 023. +- Extension `0.5.170` is the current manually published plugin baseline, Program parser `v1.0.7` owns the new shared-child batch directive, the five Skills remain at `0.5.126`, and the operator instruction DOCX is `0.5.127`. The batch adapter enumerates and validates every matching shared-plan parent before the first write, executes in date/tid order, and stops without retry at the first blocked, failed, or uncertain result. The extension retains an idle-proof and guarded-reload message protocol, but the active control plane has no extension-release tables, ECS host mapping, OSS publication endpoint, Cloud Assistant dispatcher, or platform trigger; required migration is 023. - Creator and manual input-turn attribution remain durable while business input stays encrypted at rest. Routine removal is reversible archive/restore. Separately confirmed force delete physically removes an authorized task regardless of lifecycle state, retains only a minimal non-content deletion audit marker, and cannot undo an ERP write that already occurred. - Unknown, ambiguous, unverified, or post-write-uncertain states fail closed; automatic retries must not create duplicate writes. - PostgreSQL is the sole required durable database/state middleware, and the production artifact provider is OSS. Redis, message queues, MongoDB, and search services are not runtime dependencies. diff --git a/.project-docs/30-worklog/current-state.md b/.project-docs/30-worklog/current-state.md index f043182..96941ed 100644 --- a/.project-docs/30-worklog/current-state.md +++ b/.project-docs/30-worklog/current-state.md @@ -4,6 +4,7 @@ This file is the integrated default-branch snapshot. Feature tasks record progre ## Integrated Through +- Integration task `20260909-business-instruction-batch-child-7e3c1a94` synchronized operator input catalog/DOCX `0.5.127` with all 19 system routes, adding the copyable `散拼团多个新增子单` entry while keeping that route Program-only and leaving the five Skills at `0.5.126`. - Source commit `be17f6c` from feature task `20260908-leader-webhook-api-7c4e9a12`, integrated as merge commit `295409b`, for organization-level external Webhook delivery of privacy-bounded leader summaries, migration `023_leader_summary_webhook_delivery`, and AUTH-005's one-attempt accepted-versus-delivered boundary. - Source commit `6ac90f8` from feature task `20260908-shared-child-batch-create-4e7c2a91`, integrated as merge commit `0d20544`, for Program-only `shared_child_order_batch_create`, parser `v1.0.7`, migration `022_shared_child_order_batch_create`, complete pre-write target enumeration, deterministic stop-on-first-non-success execution, and extension `0.5.170`. - Commit `bb115a3` from integration task `20260908-remove-maintain-project-docs-requirement-6d8a31f2` removed the deleted external project-document Skill/task-registry dependency and retained repository-local worktree and project-memory gates. @@ -42,7 +43,7 @@ This file is the integrated default-branch snapshot. Feature tasks record progre ## Current Focus -Operate the repository's current extension `0.5.170`, Program parser `v1.0.7`, Skill/business-instruction `0.5.126`, roster normalizer `v1.4.0`, and migrations through `023_leader_summary_webhook_delivery` safely. The machine registry contains 19 routes; the external Agent remains limited to its original 18 and the two passenger-list routes plus shared-child batch creation are Program-only. Administrators manage accounts, channels, employee grants, parser routing, automation settings, and audit but never enter the task data plane. Team leads/users own normal task operations through immutable assignment; same-account work remains FIFO and single-active while distinct accounts are independent. Team leads alone receive the read-only assignee-based dashboard. Future privacy-bounded organization summaries use one protected external Webhook and a separate encrypted one-attempt outbox, not a leader AgentBus route. Database migration, extension reload, route grants, service rollout, live ERP validation, and any external Webhook canary remain separately authorized runtime work. Server-side automatic extension updating is not part of the active main line. +Operate the repository's current extension `0.5.170`, Program parser `v1.0.7`, Skills `0.5.126`, business-instruction `0.5.127`, roster normalizer `v1.4.0`, and migrations through `023_leader_summary_webhook_delivery` safely. The machine registry and operator input catalog contain 19 routes; the external Agent remains limited to its original 18 and the two passenger-list routes plus shared-child batch creation are Program-only. Administrators manage accounts, channels, employee grants, parser routing, automation settings, and audit but never enter the task data plane. Team leads/users own normal task operations through immutable assignment; same-account work remains FIFO and single-active while distinct accounts are independent. Team leads alone receive the read-only assignee-based dashboard. Future privacy-bounded organization summaries use one protected external Webhook and a separate encrypted one-attempt outbox, not a leader AgentBus route. Database migration, extension reload, route grants, service rollout, live ERP validation, and any external Webhook canary remain separately authorized runtime work. Server-side automatic extension updating is not part of the active main line. ## Recently Completed @@ -77,6 +78,7 @@ Operate the repository's current extension `0.5.170`, Program parser `v1.0.7`, S - 2026-09-08: Added Program-only shared-child batch creation across an inclusive departure-date range. Every product-matching parent is enumerated and validated before the first write; execution is ordered by date/tid, stops at the first blocked/failed/uncertain result, and never retries a write automatically. Parser `v1.0.7`, migration 022, and extension `0.5.170` are synchronized. - 2026-09-08: Replaced only the leader-summary AgentBus transport with an organization-level external Webhook. AUTH-005 and migration 023 retain future-only encrypted/privacy-bounded projection, mark only strict gateway success as accepted rather than delivered, and terminate rejected or uncertain attempts without automatic retry. - 2026-09-08: Removed the deleted external project-document Skill and task-registry requirement; repository-local Git worktree checks and `.project-docs/` remain the active collaboration and memory boundary. +- 2026-09-09: Advanced the operator input catalog and generated DOCX to `0.5.127`, covering all 19 routes with a new copyable Program-only `散拼团多个新增子单` section while leaving Agent Prompt and Skill packages unchanged. ## In Progress diff --git a/.project-docs/30-worklog/tasks/20260909-business-instruction-batch-child-7e3c1a94.md b/.project-docs/30-worklog/tasks/20260909-business-instruction-batch-child-7e3c1a94.md new file mode 100644 index 0000000..698b9b6 --- /dev/null +++ b/.project-docs/30-worklog/tasks/20260909-business-instruction-batch-child-7e3c1a94.md @@ -0,0 +1,63 @@ +# Task: Update business instruction table for batch shared-child creation + +## Identity + +- Task ID: 20260909-business-instruction-batch-child-7e3c1a94 +- Mode: Integration +- Branch: main +- Worktree: /Users/inmanx/Documents/lwltAPI +- Base commit: 75b9f2ede991c3f8d37465f80d4856f771e54051 +- Owner: codex +- Status: Ready for push verification + +## Scope + +- Add the integrated Program-only `散拼团多个新增子单` route to the canonical operations input template. +- Bump the business-input contract and DOCX delivery version without changing any Skill or external-Agent route. +- Rebuild the versioned DOCX, synchronize the release manifest and README, visually inspect every rendered page, and place the verified current copy on the user's Desktop. +- Commit the verified release and push `main` to `origin/main` without force after confirming the remote remains at the selected base. + +## Worktree Safety + +- Existing changes in this worktree: none. +- Relevant concurrent worktree: `/Users/inmanx/Documents/lwltAPI-shared-child-batch-create-4e7c2a91`, clean and already integrated into `main`. +- Overlap result: Clear. + +## Constraints + +- Preserve `shared_child_order_batch_create` as Program-only. +- Do not add it to the Agent prompt, external-Agent directive registry, or any Skill package. +- Keep the Markdown template as the sole editable source and generate the DOCX only through `tools/build_business_instruction_docx.py`. +- Use bundled workspace dependencies and complete render-to-PNG inspection before delivery. + +## Outcome + +- Advanced the canonical operator input catalog and generated DOCX from `0.5.126`/18 items to `0.5.127`/19 items. +- Added section 5, `散拼团多个新增子单`, with a directly copyable template and example while preserving `shared_child_order_batch_create` as Program-only and absent from the external Agent prompt, Agent/Skill registry table, and all Skill packages. +- Synchronized the route contract constant, repository documentation, release gate, README, regression expectations, and `dist/release-manifest.json`. +- Corrected the canonical architecture snapshot so it distinguishes the unchanged five Skills at `0.5.126` from the operator instruction DOCX at `0.5.127`. +- Archived the former `0.5.126` DOCX and its exact release-manifest snapshot under `archive/releases/2026-09-09/`, generated `dist/老挝联泰AI指令表-0.5.127.docx`, and copied the verified artifact to the user's Desktop. The superseded Desktop copy was moved to Trash and remains recoverable. + +## Verification + +- Rebuilt the DOCX from `agent设计规范/templates/business-input-templates.md` with the governed builder and bundled workspace dependencies. +- Rendered the final DOCX to 13 PNG pages with the bundled LibreOffice/Poppler stack and configured Chinese fonts; visually inspected every page with no clipping, missing glyphs, orphaned explanatory text, or broken hierarchy. +- Parsed the DOCX package to confirm all operation headings 1 through 19, the new template/example fields, version/scope text, and absence of unresolved document tokens. +- Verified source SHA-256 `652af8ef645ae56af2dd9990f74b8078de230cb9b87acd13c289d1f4dae0738a`, builder SHA-256 `c162884210da22e3b78368749b66f1f177df5e9fc6155f4fd9954bd516d187f1`, and DOCX SHA-256 `e1b8ae5a98d550ab0785692a01cf1c87b99e4edfaea39e4edbbab7341e585f29`; the Desktop copy is byte-identical to `dist`. +- `node --test tools/business-input-templates.test.mjs` — 16/16 passed. +- `node --run check:repo` — 10/10 passed. +- `node --run check` — passed. +- `node --run test:control-plane` — 183/183 passed. +- `node --run test:legacy` — 278/278 passed. +- `node --run build` — passed. +- A fresh release-push gate reran all required checks. The initial repository-hygiene pass found only two generated `.DS_Store` files; both were moved out of the repository, after which `node --run check:repo` passed 10/10 and `node --run test:legacy` passed 278/278. +- `git diff --check` — passed after the final project-memory edits. +- Remote push and final remote-tip verification are pending the release commit. + +## Follow-ups + +- No documentation follow-up is required. Deployment, extension reload, route grants, and live ERP writes remain separate explicitly authorized runtime work. + +## Promotion Candidates + +- Promote the operator input catalog/DOCX `0.5.127` and its 19-item scope into the integrated current-state snapshot; no Agent/Skill behavior changes are promoted. diff --git a/README.md b/README.md index c9ffac5..935189b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ ## 当前发布基线 - Chrome 扩展制品版本由 [发布清单](dist/release-manifest.json) 定义;运行中的浏览器版本必须通过实时握手确认,不写入静态交接文档。 -- 五个业务 Skill:`0.5.126`;运营 DOCX:`0.5.126`。 +- 五个业务 Skill:`0.5.126`;运营 DOCX:`0.5.127`。 - Agent Prompt:`ltjt-agent-prompt-v1.8-independent-headcount-categories`。 - 控制面确定性解析器:`ltjt-program-parser-v1.0.7`;19 项路由中三项固定为 Program-only(两项名单及散拼批量子单),其余路由由操作台逐项晋级;新增批量子单不进入外部 Agent 路由。 - 独立团/散拼子单名单固定为 Program-only:文字用于业务定位,名单由单个 `.xls`/`.xlsx` 附件确定性规范化;附件到齐前任务保持等待。 diff --git a/agent设计规范/README.md b/agent设计规范/README.md index ff9533e..e8a3a09 100644 --- a/agent设计规范/README.md +++ b/agent设计规范/README.md @@ -8,7 +8,7 @@ 4. [运营业务 AI 输入模板总表](templates/business-input-templates.md):业务人员可直接复制的“模板 + 示例”双段式输入目录;模板首行是业务指令,后续逐行业务字段。 5. [业务适配模板](templates/business-adaptation-template.md):新增业务的一页式交接模板。 6. [AgentBus 用户回复契约](agentbus-reply-contract.md):执行完成后的受理通知、成功回执、失败回传和文件交付边界。 -7. [确定性业务路由注册表](../control-plane/src/business-routes.ts):手工与 AgentBus 共用的 18 项程序解析路由、兼容指令、唯一完整字段签名、必填项、类型、action、对象类型和版本的唯一机器源。 +7. [确定性业务路由注册表](../control-plane/src/business-routes.ts):手工与 AgentBus 共用的 19 项程序解析路由、兼容指令、唯一完整字段签名、必填项、类型、action、对象类型和版本的唯一机器源。 第一个已真实验证的参考业务是[独立团批量下单](businesses/team_order_batch_create.md)。 @@ -18,7 +18,7 @@ - `agent-prompt.md`:云端 Agent 的业务识别、字段提取和标准 JSON 返回提示词。 - `business-behavior-registry.md`:维护人员使用的业务行为与内部实现映射参考,不直接作为云端 Agent Prompt 内容。 -- `templates/business-input-templates.md`:当前 18 项运营输入的统一契约;每项都有相邻的模板和示例,按“最小必填 + 其余选填”区分字段。独立团信息修改和安排变更归入修改类;暂缓需求与测试删除不进入当前生产用户入口。 +- `templates/business-input-templates.md`:当前 19 项运营输入的统一契约;每项都有相邻的模板和示例,按“最小必填 + 其余选填”区分字段。散拼团多个新增子单和两项名单固定走 Program Parser,不进入外部 Agent;独立团信息修改和安排变更归入修改类,暂缓需求与测试删除不进入当前生产用户入口。 - `skills/lwlt-newbooking/SKILL.md`:解析独立团批量/单个下单、散拼母团计划和散拼具体子单输入。 - `skills/lwlt-updating/SKILL.md`:解析三类修改输入中的全部用户明确业务目标;插件按已验证能力自动执行或转人工复核。 - `skills/lwlt-arrangement/SKILL.md`:解析五类新增安排和酒店离店日/房间数变更输入。 @@ -29,7 +29,7 @@ ## 边界 -云端 Agent Prompt 及对应 Skill 与业务系统确定性解析器通常是并列的解析实现,均只输出解析态 operation。两项名单 route 是明确例外:固定走 Program Parser,原始 Excel 先由控制面程序规范化,不进入 AI Prompt。两类解析共享最终契约,不查询业务对象,不读取当前值,不生成内部引用,也不描述任务如何执行。控制面在任务创建时固化解析策略;后续执行层负责对象解析、候选匹配和实际操作。本目录不负责调用或操作业务系统。 +云端 Agent Prompt 及对应 Skill 与业务系统确定性解析器通常是并列的解析实现,均只输出解析态 operation。两项名单 route 和散拼团多个新增子单是明确例外,固定走 Program Parser;其中原始 Excel 先由控制面程序规范化,不进入 AI Prompt。两类解析共享最终契约,不查询业务对象,不读取当前值,不生成内部引用,也不描述任务如何执行。控制面在任务创建时固化解析策略;后续执行层负责对象解析、候选匹配和实际操作。本目录不负责调用或操作业务系统。 运行时 Skill 包只保留 `SKILL.md`、必要的 `agents/openai.yaml` 和按需加载的业务 references;宿主接入说明、示例和维护路线放在 `test-fixtures/` 或维护文档中。 diff --git a/agent设计规范/business-adaptation-registry.md b/agent设计规范/business-adaptation-registry.md index 4c7244b..0a87451 100644 --- a/agent设计规范/business-adaptation-registry.md +++ b/agent设计规范/business-adaptation-registry.md @@ -1,6 +1,6 @@ # 业务适配登记表 -这是跨会话和交付的 Agent/Skill 业务入口。它回答三个问题:业务人员怎么输入、ERP 怎么执行、Skill 在哪里维护。运营统一复制入口见[运营业务 AI 输入模板总表](templates/business-input-templates.md),AI 业务路由参考见 [business-behavior-registry.md](business-behavior-registry.md),19 项确定性解析的指令、字段、action 和版本唯一机器源见 [`control-plane/src/business-routes.ts`](../control-plane/src/business-routes.ts)。其中下表与外部 Agent 继续覆盖原 18 项;新增的散拼批量子单只由 Program 入口接受,不加入 Agent/Skill 指令登记。该机器路由、任务级解析模式快照和组织全自动化规则对获授权员工的手工与 AgentBus 新任务全局共用,来源只负责输入和回执适配;AgentBus 渠道必须绑定一个员工平台账号,并使用该账号的业务白名单、任务归属、唯一云电脑 worker 和唯一登录节点精确 ERP 身份门禁。ERP 领取队列按不可变的任务归属账号分别保持 FIFO 与单活跃执行,不同账号互不阻塞;管理员只进入账号、渠道、解析策略、自动化设置和审计管理面,不创建、查看、修改、领取或删除业务任务。 +这是跨会话和交付的 Agent/Skill 业务入口。它回答三个问题:业务人员怎么输入、ERP 怎么执行、Skill 在哪里维护。运营统一复制入口见[运营业务 AI 输入模板总表](templates/business-input-templates.md),其中覆盖全部 19 项系统输入;AI 业务路由参考见 [business-behavior-registry.md](business-behavior-registry.md),19 项确定性解析的指令、字段、action 和版本唯一机器源见 [`control-plane/src/business-routes.ts`](../control-plane/src/business-routes.ts)。下表与外部 Agent 继续覆盖原 18 项;新增的散拼批量子单只由 Program 入口接受,不加入 Agent/Skill 指令登记。该机器路由、任务级解析模式快照和组织全自动化规则对获授权员工的手工与 AgentBus 新任务全局共用,来源只负责输入和回执适配;AgentBus 渠道必须绑定一个员工平台账号,并使用该账号的业务白名单、任务归属、唯一云电脑 worker 和唯一登录节点精确 ERP 身份门禁。ERP 领取队列按不可变的任务归属账号分别保持 FIFO 与单活跃执行,不同账号互不阻塞;管理员只进入账号、渠道、解析策略、自动化设置和审计管理面,不创建、查看、修改、领取或删除业务任务。 ## 状态定义 @@ -20,13 +20,13 @@ | `team_order_create` | 独立团单个下单 | [`lwlt-newbooking`](skills/lwlt-newbooking/SKILL.md) / `team_order_create` | [业务入口](businesses/team_order_create.md) | [ERP 流程](businesses/team_order_create.md) | [Skill actions](skills/lwlt-newbooking/references/actions-and-fields.md) | 已真实验证 | | `shared_plan_create` | 散拼团新增计划 | [`lwlt-newbooking`](skills/lwlt-newbooking/SKILL.md) / `shared_plan_create` | [业务入口](businesses/shared_plan_create.md) | [ERP 流程](businesses/shared_plan_create.md) | [Skill actions](skills/lwlt-newbooking/references/actions-and-fields.md) | 单个/批量母团已重复验证;E2E3/E2E4 均证明批量每日期具体子单、客户与 15+1,统一发布仍待批准 | | `shared_child_order_create` | 散拼团单个新增子单/计划 | [`lwlt-newbooking`](skills/lwlt-newbooking/SKILL.md) / `shared_child_order_create` | [业务入口](businesses/shared_child_order_create.md) | [ERP 流程](businesses/shared_child_order_create.md) | [Skill actions](skills/lwlt-newbooking/references/actions-and-fields.md) | 已重复真实创建并完成后续全生命周期;仍受统一发布门槛约束 | -| `passenger_list_import` | 独立团/散拼子单名单导入/补充 | [`lwlt-lifecycle`](skills/lwlt-lifecycle/SKILL.md) / `passenger_list_import`(Program-only) | [统一输入模板 §5—6](templates/business-input-templates.md);文字定位 + 单个 `.xls/.xlsx` 附件;程序在前 100 行自动定位唯一 ERP 字段表头,按精确语义从任意表头行和列顺序中只选择必需字段,并读取其下连续名单数据;身份证、年龄、源证件类型和其他普通额外列忽略且不输出 | 识别 route 后等待附件 → 程序规范化为加密 13 列 TSV,并从唯一严格`领队`备注行提取姓名/电话 → 读取 ERP 游客位 → 未确认的占用序号要求覆盖确认;确认后所有指定序号强制覆写(同值也写)→ `DaoRuDones` → 原生游客位不足时返回“名单 N 人超过 ERP 最多 M 人”且不保存 → 恢复未指定行 → 投影领队联系人 → 完整写前投影 → 父页原生保存;ERP 明确返回成功即完成,不再逐行写后回查 | 用户模板 `.xls` 已只读通过 25 行规范化及单一领队行结构核验;解析阶段不以初始 16/31 行作统一静态上限,5000 为技术上限;执行时以精确 ERP 页面实际物化游客位为准。2026-08-28 一笔散拼子单 25 行及领队联系人已持久化全等;另一次独立团 25 人只物化 16 位并在保存前安全阻断 | 名单与领队联系人真实写入已有一笔证据;`0.5.155` 起确认覆盖同值也写,`0.5.156` 起容量不足使用人数/上限业务提示并仅在技术详情保留原始 blocker;其他对象/边界继续按发布门槛分级 | +| `passenger_list_import` | 独立团/散拼子单名单导入/补充 | [`lwlt-lifecycle`](skills/lwlt-lifecycle/SKILL.md) / `passenger_list_import`(Program-only) | [统一输入模板 §6—7](templates/business-input-templates.md);文字定位 + 单个 `.xls/.xlsx` 附件;程序在前 100 行自动定位唯一 ERP 字段表头,按精确语义从任意表头行和列顺序中只选择必需字段,并读取其下连续名单数据;身份证、年龄、源证件类型和其他普通额外列忽略且不输出 | 识别 route 后等待附件 → 程序规范化为加密 13 列 TSV,并从唯一严格`领队`备注行提取姓名/电话 → 读取 ERP 游客位 → 未确认的占用序号要求覆盖确认;确认后所有指定序号强制覆写(同值也写)→ `DaoRuDones` → 原生游客位不足时返回“名单 N 人超过 ERP 最多 M 人”且不保存 → 恢复未指定行 → 投影领队联系人 → 完整写前投影 → 父页原生保存;ERP 明确返回成功即完成,不再逐行写后回查 | 用户模板 `.xls` 已只读通过 25 行规范化及单一领队行结构核验;解析阶段不以初始 16/31 行作统一静态上限,5000 为技术上限;执行时以精确 ERP 页面实际物化游客位为准。2026-08-28 一笔散拼子单 25 行及领队联系人已持久化全等;另一次独立团 25 人只物化 16 位并在保存前安全阻断 | 名单与领队联系人真实写入已有一笔证据;`0.5.155` 起确认覆盖同值也写,`0.5.156` 起容量不足使用人数/上限业务提示并仅在技术详情保留原始 blocker;其他对象/边界继续按发布门槛分级 | | `order_update_shared_plan` / `order_update_shared_child` | 散拼母团容量/散拼子单住宿说明 | [`lwlt-updating`](skills/lwlt-updating/SKILL.md) | [统一输入模板:修改](templates/business-input-templates.md) | `DoInfoSP` / `DoInfo_order`;写前读取当前值 | 母团容量、子单住宿说明通过;用户只填目标值;无年份定位日期取任务日后的下一次发生日 | Skill 全量解析;仅已验证字段自动执行,其他字段保留并转人工复核 | -| `order_update_independent` | 独立团信息修改 | [`lwlt-updating`](skills/lwlt-updating/SKILL.md) / `order_update_independent` | [统一输入模板 §14](templates/business-input-templates.md) | `DoInfoJH`;写前读取当前值;SGL/TWN 分别映射 `frenshu0`/`frenshu1`,成人/占床儿童/不占床儿童/领队分别映射 `darenshu`/`xiaorenshu`/`ertrenshu`/`quanrenshu` | 标间数 `8→9→8` 已有明确响应和 fresh GET;无年份定位/目标日期取下一次发生日;SGL/TWN 与四类人数待新版本授权 ERP 实写复测 | Skill 全量解析;当前插件执行标间数、SGL/TWN 与四类人数,其他目标保留并转人工复核 | -| `arrangement_guide` / `arrangement_vehicle` / `arrangement_hotel` / `arrangement_transport` / `arrangement_other` | 安排导游/用车/酒店/大交通/其他备案 | [`lwlt-arrangement`](skills/lwlt-arrangement/SKILL.md) | [统一输入模板 §7—11](templates/business-input-templates.md) | 五类 action-specific `DoInfo_*`,全类 `create|clear`;酒店另有窄 `update` | 两类团队共 10 create + 10 clear;酒店资源/房型由唯一 ERP 模糊匹配结果带入;大交通和其他/备案的结算单位组合候选按下拉顺序首条原生联动,其他/备案数量可选,省略时保留 ERP 默认值;散拼母团无子单时 ERP 禁止安排酒店并隐藏提交入口,插件在三项页面证据同时成立时提示先新增子单 | 已真实验证;非酒店 update 和酒店其他字段阻断 | -| `arrangement_hotel` | 安排变更 | [`lwlt-arrangement`](skills/lwlt-arrangement/SKILL.md) / `arrangement_hotel` | [统一输入模板 §15](templates/business-input-templates.md) | fresh 查询 → 精确未安排或未确认酒店行 → `DoInfo_jiudian` → 双回查 | `2026-09-12/8 → 2026-09-13/9`,备注与资源保持;无年份目标离店日取下一次发生日 | 窄能力已真实验证;其他目标转人工复核 | -| `order_cancel` / `order_restore` | 取消与恢复 | [`lwlt-lifecycle`](skills/lwlt-lifecycle/SKILL.md) | [统一输入模板 §16—17](templates/business-input-templates.md) | 列表取消或编辑页状态;列表恢复禁用 | 三类对象及母子传播共 7 次状态验证通过;无年份定位日期取任务日后的下一次发生日 | 已接入分段执行链;统一发布待批准 | -| `confirmation_export` | 导出团队文件 | [`lwlt-confirmation`](skills/lwlt-confirmation/SKILL.md) / `confirmation_export` | [统一输入模板 §18](templates/business-input-templates.md);`游客名单`=独立团/散拼具体子单,`整团游客信息`=散拼母团 | 唯一解析业务对象后取得 ERP 文件源内容 + SHA-256;游客文件按 kind 分流:独立团/子单 `orders_Visitor.asp?did&tid`,散拼母团整团游客 `orders_Visitor.asp?tid`;整团类型必须单独导出且不得携带子单 did。游客源保留原始 `.xls` 归档并生成真实 `.xlsx` 供移动端/AgentBus;其余类型转 PDF,失败回退源文件 | 独立团/具体子单 ERP 源读取已有 40/40 证据;散拼母团 tid-only 源有历史真实只读证据,本次已接入严格 Program/Schema/validator/插件分流,仍待新版运行态只读复测;后台附件、XLSX/PDF 转换、鉴权下载和 OSS provider 已接入 | 已接入;母团整团游客新分支待授权运行态只读复测,外发仍延后 | +| `order_update_independent` | 独立团信息修改 | [`lwlt-updating`](skills/lwlt-updating/SKILL.md) / `order_update_independent` | [统一输入模板 §15](templates/business-input-templates.md) | `DoInfoJH`;写前读取当前值;SGL/TWN 分别映射 `frenshu0`/`frenshu1`,成人/占床儿童/不占床儿童/领队分别映射 `darenshu`/`xiaorenshu`/`ertrenshu`/`quanrenshu` | 标间数 `8→9→8` 已有明确响应和 fresh GET;无年份定位/目标日期取下一次发生日;SGL/TWN 与四类人数待新版本授权 ERP 实写复测 | Skill 全量解析;当前插件执行标间数、SGL/TWN 与四类人数,其他目标保留并转人工复核 | +| `arrangement_guide` / `arrangement_vehicle` / `arrangement_hotel` / `arrangement_transport` / `arrangement_other` | 安排导游/用车/酒店/大交通/其他备案 | [`lwlt-arrangement`](skills/lwlt-arrangement/SKILL.md) | [统一输入模板 §8—12](templates/business-input-templates.md) | 五类 action-specific `DoInfo_*`,全类 `create|clear`;酒店另有窄 `update` | 两类团队共 10 create + 10 clear;酒店资源/房型由唯一 ERP 模糊匹配结果带入;大交通和其他/备案的结算单位组合候选按下拉顺序首条原生联动,其他/备案数量可选,省略时保留 ERP 默认值;散拼母团无子单时 ERP 禁止安排酒店并隐藏提交入口,插件在三项页面证据同时成立时提示先新增子单 | 已真实验证;非酒店 update 和酒店其他字段阻断 | +| `arrangement_hotel` | 安排变更 | [`lwlt-arrangement`](skills/lwlt-arrangement/SKILL.md) / `arrangement_hotel` | [统一输入模板 §16](templates/business-input-templates.md) | fresh 查询 → 精确未安排或未确认酒店行 → `DoInfo_jiudian` → 双回查 | `2026-09-12/8 → 2026-09-13/9`,备注与资源保持;无年份目标离店日取下一次发生日 | 窄能力已真实验证;其他目标转人工复核 | +| `order_cancel` / `order_restore` | 取消与恢复 | [`lwlt-lifecycle`](skills/lwlt-lifecycle/SKILL.md) | [统一输入模板 §17—18](templates/business-input-templates.md) | 列表取消或编辑页状态;列表恢复禁用 | 三类对象及母子传播共 7 次状态验证通过;无年份定位日期取任务日后的下一次发生日 | 已接入分段执行链;统一发布待批准 | +| `confirmation_export` | 导出团队文件 | [`lwlt-confirmation`](skills/lwlt-confirmation/SKILL.md) / `confirmation_export` | [统一输入模板 §19](templates/business-input-templates.md);`游客名单`=独立团/散拼具体子单,`整团游客信息`=散拼母团 | 唯一解析业务对象后取得 ERP 文件源内容 + SHA-256;游客文件按 kind 分流:独立团/子单 `orders_Visitor.asp?did&tid`,散拼母团整团游客 `orders_Visitor.asp?tid`;整团类型必须单独导出且不得携带子单 did。游客源保留原始 `.xls` 归档并生成真实 `.xlsx` 供移动端/AgentBus;其余类型转 PDF,失败回退源文件 | 独立团/具体子单 ERP 源读取已有 40/40 证据;散拼母团 tid-only 源有历史真实只读证据,本次已接入严格 Program/Schema/validator/插件分流,仍待新版运行态只读复测;后台附件、XLSX/PDF 转换、鉴权下载和 OSS provider 已接入 | 已接入;母团整团游客新分支待授权运行态只读复测,外发仍延后 | 测试对象的 `order_delete` 回收能力仍保留在 Schema、插件和生命周期测试夹具中,但不属于生产运营业务,不登记为用户输入入口。 diff --git a/agent设计规范/business-behavior-registry.md b/agent设计规范/business-behavior-registry.md index 8c2cc6a..d67cd98 100644 --- a/agent设计规范/business-behavior-registry.md +++ b/agent设计规范/business-behavior-registry.md @@ -2,7 +2,7 @@ 这是业务行为名称与内部 Skill 的参考映射表。业务人员通常把业务行为放在第一行,方便 Agent 快速定位;这不是必须严格遵守的命令格式,也不要求业务人员知道 `lwlt-newbooking`、`lwlt-updating`、`lwlt-arrangement` 或 `lwlt-confirmation` 这些内部 Skill 名称。 -运营可直接复制的标准输入见[运营业务 AI 输入模板总表](templates/business-input-templates.md)。业务的完整三项交付(用户输入模板与示例、ERP 操作流程、Skill 适配)见 [业务适配登记表](business-adaptation-registry.md);本表只负责路由,不替代业务适配包。 +运营可直接复制的 19 项系统输入见[运营业务 AI 输入模板总表](templates/business-input-templates.md)。其中`散拼团多个新增子单`固定走 Program Parser,不进入本表或外部 Agent;其余业务的完整三项交付(用户输入模板与示例、ERP 操作流程、Skill 适配)见 [业务适配登记表](business-adaptation-registry.md)。本表只负责 Agent/Skill 路由,不替代业务适配包。 ## 识别原则 diff --git a/agent设计规范/templates/business-input-templates.md b/agent设计规范/templates/business-input-templates.md index 253cdb6..fc1bf6b 100644 --- a/agent设计规范/templates/business-input-templates.md +++ b/agent设计规范/templates/business-input-templates.md @@ -1,7 +1,7 @@ # 运营业务 AI 输入模板总表 -交付版本:0.5.126 -适用范围:当前 18 项运营业务输入;执行能力以生命周期发布门槛为准。 +交付版本:0.5.127 +适用范围:当前 19 项运营业务输入;执行能力以生命周期发布门槛为准。 本文件用于向系统提交 ERP 业务需求。复制对应模板填写;示例只供参考,不要直接用于生产业务。 @@ -15,6 +15,7 @@ 6. 人数可写 `15+1`;用房可写 `8标1单`。 7. 客户、产品、导游、酒店和供应商只填写名称或搜索关键词;需要唯一匹配时,信息不足会要求补充。 8. 名单业务必须随文字发送一份 `.xls` 或 `.xlsx` 附件;附件到齐前不会解析或执行,且只走程序解析,不走 AI。 +9. `散拼团多个新增子单`固定走程序解析,不走 AI;系统逐日查找日期范围内所有产品匹配的散拼母团,再为每个母团创建一个相同子单。 字段统一写`预订客户`;历史写法`预定客户`仍可识别。 @@ -124,6 +125,31 @@ 人数:15+1 ``` +### 5. 散拼团多个新增子单 + +#### 模板 + +```text +散拼团多个新增子单 +预订客户(必填):<具体子单客户名称或唯一搜索关键词> +出发日期(必填): +产品名称(必填):<散拼母团产品名称或唯一搜索关键词> +领队(选填):<领队姓名或唯一搜索关键词> +人数(必填):<每个子单使用的x+x人数格式> +特殊要求(选填):<每个子单使用的其他业务要求> +``` + +#### 示例 + +```text +散拼团多个新增子单 +预订客户:广东衡阳 +出发日期:11-01到11-30 +产品名称:广东衡阳6D +领队:张三 +人数:15+1 +``` + ## 三、游客名单 名单只通过一份 `.xls` 或 `.xlsx` 附件提交,不再粘贴到文字输入框。系统识别名单业务后会等待附件,附件到齐后只走程序解析。 @@ -132,7 +158,7 @@ 若游客是领队,在该行`备注`只填`领队`,并确保同一行`姓名`和`电话`已填写;一份名单最多一位。系统会把这两个值同步到 ERP `联系人/领队人`和`电话`。其他备注不触发联系人写入;没有领队标记时保留 ERP 原信息。正文里的`领队`仍只是选填的查单关键词。 -### 5. 导入独立团名单 +### 6. 导入独立团名单 #### 模板 @@ -159,7 +185,7 @@ 示例同时附一份名单工作簿。 -### 6. 导入散拼子单名单 +### 7. 导入散拼子单名单 #### 模板 @@ -190,7 +216,7 @@ 以下操作只新增团队安排,不维护客户、导游、酒店或供应商资料。 -### 7. 安排导游 +### 8. 安排导游 #### 模板 @@ -210,7 +236,7 @@ 备注:首日机场接团 ``` -### 8. 安排用车 +### 9. 安排用车 #### 模板 @@ -233,7 +259,7 @@ 数量:1 ``` -### 9. 安排酒店 +### 10. 安排酒店 #### 模板 @@ -260,7 +286,7 @@ 酒店搜索可填写酒店名,也可包含房型关键词;离店日期必须晚于入住日期。 -### 10. 安排大交通 +### 11. 安排大交通 #### 模板 @@ -283,7 +309,7 @@ 交通日期:11-03 ``` -### 11. 安排其他/备案 +### 12. 安排其他/备案 #### 模板 @@ -312,7 +338,7 @@ ## 五、修改 -### 12. 修改散拼母团计划收客数 +### 13. 修改散拼母团计划收客数 #### 模板 @@ -335,7 +361,7 @@ 目标计划收客数:30 ``` -### 13. 追加散拼子单订房说明 +### 14. 追加散拼子单订房说明 #### 模板 @@ -360,7 +386,7 @@ 追加内容:领队单住 ``` -### 14. 独立团信息修改 +### 15. 独立团信息修改 #### 模板 @@ -388,7 +414,7 @@ 只填写需要修改的目标。人数中未出现的类别保持原值;需要清零时单独写明,例如`婴儿改为0`。 -### 15. 安排变更 +### 16. 安排变更 #### 模板 @@ -413,7 +439,7 @@ ## 六、取消与恢复 -### 16. 取消订单 +### 17. 取消订单 #### 模板 @@ -435,7 +461,7 @@ 产品名称:老挝好时光 ``` -### 17. 恢复订单 +### 18. 恢复订单 #### 模板 @@ -464,7 +490,7 @@ ## 七、导出团队文件 -### 18. 导出团队文件 +### 19. 导出团队文件 #### 模板 diff --git a/agent设计规范/test-fixtures/lwlt-lifecycle/release-gate.md b/agent设计规范/test-fixtures/lwlt-lifecycle/release-gate.md index 649afa5..a809500 100644 --- a/agent设计规范/test-fixtures/lwlt-lifecycle/release-gate.md +++ b/agent设计规范/test-fixtures/lwlt-lifecycle/release-gate.md @@ -5,14 +5,15 @@ - Chrome 插件:`0.5.170` - Agent Prompt:`ltjt-agent-prompt-v1.8-independent-headcount-categories` - 生命周期契约:`ltjt-lifecycle-v2.9-roster-leader-contact-2026-08` -- 五个 Skill:`0.5.126`;运营 DOCX:`0.5.126` +- 五个 Skill:`0.5.126`;运营 DOCX:`0.5.127` - 发布状态:核心窄能力已有真实证据;一笔名单附件 Program-only 任务已把 25 行及唯一领队联系人正确保存到 ERP,后续只读逐字段核验全等。两种写后逐行读取方式都曾在真实成功写入后产生假阴性;名单在全部写前门禁通过后,以父表单 ERP 明确成功响应作为终结证据,不再执行写后逐行回查或自动名单对账。`0.5.155` 规定确认覆盖的指定序号同值也写;`0.5.156` 把原生游客位不足统一映射为包含名单人数和 ERP 实际上限的业务提示,原技术 blocker 仅留技术详情。`0.5.157` 新增散拼母团“整团游客信息”的 `shared_plan + visitor-list + tid-only` 窄分支,静态契约与回归已通过,仍待授权后的新版运行态只读复测。`0.5.158` 把正式控制面 `https://lwlt.nianxx.cn` 同步加入 Popup、后台、Manifest 权限和 content script 精确白名单;其他 HTTPS origin 仍保持阻断。`0.5.159` 修复 MV3 后台恢复被中断后持久化 `running` 永久阻断插件派发的问题:仅在内存恢复 Promise 已不存在时收敛为 `interrupted`,真实活动恢复仍保持阻断,下一次成功只读保活把状态归零为 `idle`。`0.5.160` 为独立团单个下单写前漂移增加仅字段名诊断,并把数字后缀动态应收字段纳入保护。`0.5.161` 等待客户、跟单人和销售人原生 lookup 数据就绪后才开始单团预检;生产反馈证明仅检查 lookup 数据仍不足。`0.5.162` 进一步要求页面 jQuery Ajax 在预检前归零,并在 `GetProduct` 后等待原生 `ajaxStop` 再应用最终业务字段。`0.5.163` 按生产操作方明确要求恢复 `0.5.156` 的实际校验范围:核心订单字段继续写前阻断,带编号的动态 `ys_*` 应收行不再纳入保护哈希,允许 ERP 原生回调在预检后调整这些字段。`0.5.164` 新增平台账号、AgentBus 渠道、唯一云电脑 worker 与 ERP 登录身份四方一致门禁;旧未绑定渠道和历史未归属 AgentBus 任务默认不执行。`0.5.165` 让散拼新增计划和独立团批量下单在本地候选未命中时先使用表单原生非空产品检索,实测两类表单均能由完整关键词唯一返回目标产品;本轮未勾选或保存,自动选择与写入仍由原门禁保护。新增独立团房型/人数映射仍待实写;未验证宽能力继续失败关闭。 - `0.5.166` 在散拼母团列表入口加入立即检查、100ms 条件轮询和 15 秒总超时;每次探测都重新取得当前主 iframe document,按钮一旦可用便立即继续。该等待只发生在点击前,不固定拖慢快速页面,也不触发业务写入重试。 - `0.5.167` 保留插件侧的空闲证明和受控重载安全协议,并继续包含 `0.5.166` 的散拼入口自适应等待。中央服务私有 OSS/ECS 云助手编排及迁移 019 已按用户决定从主线撤回,因此这些插件更新消息在当前主线没有服务端触发方,属于休眠能力;插件仍按现有人工发布/加载流程使用。 - `0.5.168` 将 ERP 身份门禁从整页子串搜索收紧为唯一 `#Lable_UserName` 登录节点的规范化精确全等;缺失、重复、空白、子串或其他页面文字命中均不再让云电脑进入可执行状态,观察到的账号文本不离开扩展。 - `0.5.170` 保留全部执行门禁,并新增 Program-only 散拼批量子单的“完整只读枚举后逐单执行、首错停止、不自动重试”门禁;ERP 写入不确定后的人工只读核验责任仍明确绑定到任务归属账号,管理员仍完全不进入任务数据面。 -- 名单工作簿 normalizer `v1.4.0` 与业务输入/Skill `0.5.126` 改为只选择 12 个必需源字段;身份证、年龄、源证件类型及其他普通额外列不参与行识别、字段校验或 canonical 输出。必需字段完整性、宏/外链、全局超链接和外部公式等安全门槛保持失败关闭。 +- 运营输入/DOCX `0.5.127` 补齐第 19 项`散拼团多个新增子单`的可复制模板与示例;该入口仍固定为 Program-only,不进入 Agent Prompt 或 Skill。 +- 名单工作簿 normalizer `v1.4.0`、Skill `0.5.126` 与业务输入 `0.5.127` 继续只选择 12 个必需源字段;身份证、年龄、源证件类型及其他普通额外列不参与行识别、字段校验或 canonical 输出。必需字段完整性、宏/外链、全局超链接和外部公式等安全门槛保持失败关闭。 运行中的浏览器版本必须实时握手确认。当前制品文件名和 SHA-256 只看 [`../../../dist/release-manifest.json`](../../../dist/release-manifest.json),不从历史日志推断。 diff --git a/archive/releases/2026-09-09/README.md b/archive/releases/2026-09-09/README.md new file mode 100644 index 0000000..9ce6c86 --- /dev/null +++ b/archive/releases/2026-09-09/README.md @@ -0,0 +1,6 @@ +# 2026-09-09 发布归档 + +本目录只保存被新版本替代的历史发布物,不定义当前运行规则。当前制品文件名和 SHA-256 只以根目录 [`../../../dist/release-manifest.json`](../../../dist/release-manifest.json) 为准。 + +- `release-manifest-0.5.170-skills-0.5.126-docx-0.5.126.json`:补齐散拼团多个新增子单运营模板前的历史清单快照。 +- `老挝联泰AI指令表-0.5.126.docx`:被 `0.5.127` 的 19 项完整运营输入表替代;旧版缺少`散拼团多个新增子单`。 diff --git a/archive/releases/2026-09-09/release-manifest-0.5.170-skills-0.5.126-docx-0.5.126.json b/archive/releases/2026-09-09/release-manifest-0.5.170-skills-0.5.126-docx-0.5.126.json new file mode 100644 index 0000000..a38905f --- /dev/null +++ b/archive/releases/2026-09-09/release-manifest-0.5.170-skills-0.5.126-docx-0.5.126.json @@ -0,0 +1,69 @@ +{ + "manifest_version": 1, + "generated_on": "2026-09-08", + "baselines": { + "chrome_extension": "0.5.170", + "skills": "0.5.126", + "business_instruction_docx": "0.5.126", + "agent_prompt": "ltjt-agent-prompt-v1.8-independent-headcount-categories" + }, + "artifacts": [ + { + "kind": "chrome_extension", + "version": "0.5.170", + "path": "dist/ltjt-order-assistant-0.5.170.zip", + "source": "chrome-extension/ltjt-order-assistant", + "sha256": "c041d13f468f46f1130668ae67701342b0dd920c5be20c5b47b97732384f48d8" + }, + { + "kind": "skill", + "name": "lwlt-arrangement", + "version": "0.5.126", + "path": "dist/lwlt-arrangement-0.5.126.skill", + "source": "agent设计规范/skills/lwlt-arrangement", + "sha256": "83770befe3a8e4048eacaeacb567c5139bf8a0b3a49f2b1513c26383422f2a9c" + }, + { + "kind": "skill", + "name": "lwlt-confirmation", + "version": "0.5.126", + "path": "dist/lwlt-confirmation-0.5.126.skill", + "source": "agent设计规范/skills/lwlt-confirmation", + "sha256": "543507ed8b68c183d2df6722061b0e927ebb728de4bf254d15f83311c9264018" + }, + { + "kind": "skill", + "name": "lwlt-lifecycle", + "version": "0.5.126", + "path": "dist/lwlt-lifecycle-0.5.126.skill", + "source": "agent设计规范/skills/lwlt-lifecycle", + "sha256": "fff3879d9a4143c34ae51e091b91411e55382ad3f5d77c99d6202a005b1ddbd9" + }, + { + "kind": "skill", + "name": "lwlt-newbooking", + "version": "0.5.126", + "path": "dist/lwlt-newbooking-0.5.126.skill", + "source": "agent设计规范/skills/lwlt-newbooking", + "sha256": "5eb6a7bf5649a0fcee3fbee488a124e1b1d018a642a3a49ebb5439ccf20ccc2f" + }, + { + "kind": "skill", + "name": "lwlt-updating", + "version": "0.5.126", + "path": "dist/lwlt-updating-0.5.126.skill", + "source": "agent设计规范/skills/lwlt-updating", + "sha256": "3bd665207649cbb8e0e5ebb012c916720201fe160eea62bccdf1c3a1f0275d1d" + }, + { + "kind": "business_instruction_docx", + "version": "0.5.126", + "path": "dist/老挝联泰AI指令表-0.5.126.docx", + "source": "agent设计规范/templates/business-input-templates.md", + "builder": "tools/build_business_instruction_docx.py", + "sha256": "052611d9b700afe66b02a9b3e3b456fc245ac46541d338980f2fa4ff2e41de14", + "source_sha256": "3ea8efd5174c0d4ab59972fb30fac2f8c6dfe7308f4e3fdb6e5b5e7c9c76258b", + "builder_sha256": "c162884210da22e3b78368749b66f1f177df5e9fc6155f4fd9954bd516d187f1" + } + ] +} diff --git a/dist/老挝联泰AI指令表-0.5.126.docx b/archive/releases/2026-09-09/老挝联泰AI指令表-0.5.126.docx similarity index 100% rename from dist/老挝联泰AI指令表-0.5.126.docx rename to archive/releases/2026-09-09/老挝联泰AI指令表-0.5.126.docx diff --git a/control-plane/src/business-routes.ts b/control-plane/src/business-routes.ts index c78ea3a..fa16bd7 100644 --- a/control-plane/src/business-routes.ts +++ b/control-plane/src/business-routes.ts @@ -76,7 +76,7 @@ export function effectiveParserModeForRoute(route: BusinessRouteDefinition, conf } const PROGRAM_VERSION = 'ltjt-program-parser-v1.0.7'; -export const BUSINESS_INPUT_CONTRACT_VERSION = 'business-input-templates-0.5.126'; +export const BUSINESS_INPUT_CONTRACT_VERSION = 'business-input-templates-0.5.127'; const lookupFields = ({ customerRequired = true } = {}): ProgramFieldDefinition[] => [ { key: 'order_no', label: '单号', aliases: ['团号', '订单号'], kind: 'text' }, diff --git a/control-plane/test/program-parser.test.ts b/control-plane/test/program-parser.test.ts index 9ed6896..eea0f9d 100644 --- a/control-plane/test/program-parser.test.ts +++ b/control-plane/test/program-parser.test.ts @@ -170,11 +170,10 @@ test('machine routes stay synchronized with their declared Program or Agent boun for (const route of BUSINESS_ROUTES) { const directivePattern = new RegExp(route.directive.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); const actionPattern = new RegExp(route.action.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); + assert.match(template, directivePattern, route.routeId); if (route.routeId === 'shared_child_order_batch_create') { - assert.doesNotMatch(template, directivePattern, 'Program-only batch route must not be added to the Agent/operator template'); assert.doesNotMatch(registry, actionPattern, 'Program-only batch route must not be added to the Agent adaptation registry'); } else { - assert.match(template, directivePattern, route.routeId); assert.match(registry, actionPattern, route.routeId); } assert.match(`${initialMigration}\n${batchMigration}`, new RegExp(`'${route.routeId}'`), route.routeId); diff --git a/dist/release-manifest.json b/dist/release-manifest.json index a38905f..0f2ee05 100644 --- a/dist/release-manifest.json +++ b/dist/release-manifest.json @@ -1,10 +1,10 @@ { "manifest_version": 1, - "generated_on": "2026-09-08", + "generated_on": "2026-09-09", "baselines": { "chrome_extension": "0.5.170", "skills": "0.5.126", - "business_instruction_docx": "0.5.126", + "business_instruction_docx": "0.5.127", "agent_prompt": "ltjt-agent-prompt-v1.8-independent-headcount-categories" }, "artifacts": [ @@ -57,12 +57,12 @@ }, { "kind": "business_instruction_docx", - "version": "0.5.126", - "path": "dist/老挝联泰AI指令表-0.5.126.docx", + "version": "0.5.127", + "path": "dist/老挝联泰AI指令表-0.5.127.docx", "source": "agent设计规范/templates/business-input-templates.md", "builder": "tools/build_business_instruction_docx.py", - "sha256": "052611d9b700afe66b02a9b3e3b456fc245ac46541d338980f2fa4ff2e41de14", - "source_sha256": "3ea8efd5174c0d4ab59972fb30fac2f8c6dfe7308f4e3fdb6e5b5e7c9c76258b", + "sha256": "e1b8ae5a98d550ab0785692a01cf1c87b99e4edfaea39e4edbbab7341e585f29", + "source_sha256": "652af8ef645ae56af2dd9990f74b8078de230cb9b87acd13c289d1f4dae0738a", "builder_sha256": "c162884210da22e3b78368749b66f1f177df5e9fc6155f4fd9954bd516d187f1" } ] diff --git a/dist/老挝联泰AI指令表-0.5.127.docx b/dist/老挝联泰AI指令表-0.5.127.docx new file mode 100644 index 0000000000000000000000000000000000000000..81d5ba5e774c51b227f4d4e6574585ebfa23b608 GIT binary patch literal 31570 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%0Dc_DZT(| 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

?C89BH?a?teD(^+BhsWj@QF)ys3JRn9qHk}J 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 literal 0 HcmV?d00001 diff --git a/tools/business-input-templates.test.mjs b/tools/business-input-templates.test.mjs index 7471cbe..fe1832c 100644 --- a/tools/business-input-templates.test.mjs +++ b/tools/business-input-templates.test.mjs @@ -69,12 +69,18 @@ const deferredDirectives = [ '团队文件上传' ]; -const allDirectives = [ +const agentDirectives = [ ...executableDirectives.slice(0, 13), ...narrowModificationDirectives, ...executableDirectives.slice(13) ]; +const allDirectives = [ + ...agentDirectives.slice(0, 4), + '散拼团多个新增子单', + ...agentDirectives.slice(4) +]; + const skillContracts = { 'agent设计规范/skills/lwlt-newbooking/references/input-contract.md': [ '独立团单个下单', @@ -116,6 +122,7 @@ const minimumLabels = { 独立团批量下单: ['发团日期', '预订客户', '产品搜索', '预估人数', '用房数量', '发团周期'], 散拼团新增计划: ['发团日期', '产品搜索', '计划收客数', '用房数量'], 散拼团单个新增子单: ['预订客户', '出发日期', '人数'], + 散拼团多个新增子单: ['预订客户', '出发日期', '产品名称', '人数'], 导入独立团名单: ['预订客户', '出发日期'], 导入散拼子单名单: ['预订客户', '出发日期'], 安排导游: ['团号', '导游搜索'], @@ -178,10 +185,10 @@ const assertTwoBlockContract = (document, directives, source) => { } }; -test('catalog has exactly 18 ordered operations with adjacent template and example blocks', () => { +test('catalog has exactly 19 ordered operations with adjacent template and example blocks', () => { assert.deepEqual( operationSections.map((section) => section.number), - Array.from({ length: 18 }, (_, index) => index + 1) + Array.from({ length: 19 }, (_, index) => index + 1) ); assert.deepEqual(operationSections.map((section) => section.directive), allDirectives); @@ -348,8 +355,8 @@ test('user templates never request ERP internal identifiers and use canonical cu } }); -test('all current directives are routed to their Skill contract in the same two-block format', () => { - for (const directive of allDirectives) { +test('all Agent directives are routed to their Skill contract in the same two-block format', () => { + for (const directive of agentDirectives) { assert.ok(registry.includes(`\`${directive}\``), `registry missing ${directive}`); } @@ -358,6 +365,16 @@ test('all current directives are routed to their Skill contract in the same two- } }); +test('shared-child batch stays Program-only while remaining copyable from the operator catalog', () => { + const directive = '散拼团多个新增子单'; + const section = sectionByDirective.get(directive); + assert.ok(section, `${directive}: missing operator template`); + assert.match(catalog, /`散拼团多个新增子单`固定走程序解析,不走 AI/); + assert.doesNotMatch(registry, /^\|[^\n]*`散拼团多个新增子单`[^\n]*\|$/m); + assert.equal(skillRuntimeText.includes('shared_child_order_batch_create'), false); + assert.equal(mainPrompt.includes('shared_child_order_batch_create'), false); +}); + test('the four detailed business pages use adjacent template and example blocks', () => { for (const [relativePath, directive] of Object.entries(businessPages)) { const document = read(relativePath); @@ -481,7 +498,7 @@ test('independent-order updates preserve broad parser targets while arrangement assert.doesNotMatch(catalog, /需求登记:/); }); -test('deferred items 19 to 21 are absent from current user and Skill input contracts', () => { +test('deferred items 20 to 22 are absent from current user and Skill input contracts', () => { const currentInputSurface = [ catalog, ...Object.keys(skillContracts).map((relativePath) => read(relativePath)) @@ -491,7 +508,7 @@ test('deferred items 19 to 21 are absent from current user and Skill input contr assert.doesNotMatch(currentInputSurface, new RegExp(directive)); } - assert.doesNotMatch(catalog, /^### (?:19|20|21)\./m); + assert.doesNotMatch(catalog, /^### (?:20|21|22)\./m); }); test('new business adaptation template enforces the two-block writing convention', () => { diff --git a/tools/repository-hygiene.test.mjs b/tools/repository-hygiene.test.mjs index 0fcae78..dcf7afa 100644 --- a/tools/repository-hygiene.test.mjs +++ b/tools/repository-hygiene.test.mjs @@ -304,8 +304,9 @@ test('single-source and generated-output boundaries remain explicit', async () = const diagnoseServer = await readFile(path.join(ROOT, 'infra/diagnose-server.sh'), 'utf8'); const gitignore = await readFile(path.join(ROOT, '.gitignore'), 'utf8'); - assert.match(template, /^交付版本:0\.5\.126\s*$/mu); - assert.match(template, /^适用范围:当前 18 项运营业务输入;执行能力以生命周期发布门槛为准。\s*$/mu); + assert.match(template, /^交付版本:0\.5\.127\s*$/mu); + assert.match(template, /^适用范围:当前 19 项运营业务输入;执行能力以生命周期发布门槛为准。\s*$/mu); + assert.match(template, /^### 5\. 散拼团多个新增子单\s*$/mu); assert.doesNotMatch(template, /^事实基线:/mu); assert.equal(tsconfig.compilerOptions.outDir, '.build'); assert.match(packageJson.scripts.start, /\.build\/control-plane/u);