chore: auto release commit (2026-07-14 11:56:45)
All checks were successful
技能自动化发布 / release (push) Successful in 5s

This commit is contained in:
2026-07-14 11:56:46 +08:00
parent a7baba7210
commit af7a43a702
17 changed files with 1239 additions and 123 deletions

View File

@@ -454,33 +454,41 @@ metadata:
也就是说,`cli/app.py` 的职责是:
1. 打印帮助
2. 定义 `run / logs / log-get / health / version`
3. 把参数转交给 `service.task_service`
2. 定义 `run / logs / log-get / health / version`(及业务子命令)
3. 把参数转交给 `service.task_service`(或薄适配后再进 domain service
不要在 `cli/app.py` 里直接写:
- 浏览器自动化
- 子进程调用兄弟技能
- SQLite 逻辑
- 与 toolbar / cron / agent 来源相关的业务分叉
## 10. `service` 层怎么写
`service` 是核心层。
`service` 是核心层。推荐拆分(**单业务内核、多入口**
通常可以这样拆:
```text
cli/app.py → 只解析参数
service/task_service.py → job_context / emit / checkpoint / finish / 错误转换
service/<domain>_service.py → 唯一业务内核(同步、处理、统计等)
db/*_repository.py → 事务与读写
assets/actions.json → placements / bind / executionProfile / entrypoint
```
- `task_service.py`
放命令编排、参数兜底、结果分流(例如 `cmd_run`
通常还可以有:
- `sibling_bridge.py`
放通用兄弟技能子进程工具(`call_sibling_json`**具体调用哪个 slug 由业务在 `task_service.py` 决定**,不要在本文件硬编码发布类专用 helper
放通用兄弟技能子进程工具(`call_sibling_json`**具体调用哪个 slug 由业务在 `task_service.py` 或 domain service 决定**,不要在本文件硬编码发布类专用 helper
- `xxx_playwright.py`(按需新建)
浏览器后台自动化 **不在模板默认结构中**;若确有需要,按命名约定自建模块并在 `task_service.py` 引用
浏览器后台自动化 **不在模板默认结构中**;若确有需要,按命名约定自建模块并由 domain / task_service 引用
- `entitlement_service.py`
放鉴权逻辑
禁止toolbar / cron / Agent / CLI 各自复制一套采集或同步实现;为兼容旧命令再写第二套内核。
### 日志要求(`cmd_run` / 核心业务)
`service` 层是**关键业务日志**的落点,须遵循 [`LOGGING.md`](LOGGING.md)
@@ -497,7 +505,9 @@ metadata:
推荐流向是:
`cli.app` -> `service.task_service` -> `service.sibling_bridge` / (可选)`service.xxx_playwright` -> `db`
`cli.app` -> `service.task_service` -> `service.<domain>_service` -> `db`
(旁路:`sibling_bridge` / 可选 `xxx_playwright` 仅由 service 调用)
## 11. `db` 层怎么写
@@ -525,13 +535,14 @@ metadata:
若技能需要出现在宿主**数据管理按钮**、**技能详情**、**定时任务**或 **Agent 直接调用**中,提供 `assets/actions.json`。
- **运行时金标准**见 [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md)sync/async、任务中心、Agent 禁令)
- 字段契约见 [`references/ACTIONS.md`](../references/ACTIONS.md)
- **运行时金标准**见 [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md)
- 字段契约见 [`references/ACTIONS.md`](../references/ACTIONS.md)`placements` / `bind.tables` / `executionProfile` 正交)
- JSON Schema 见 [`assets/schemas/skill-actions.schema.json`](../assets/schemas/skill-actions.schema.json)
- 模板最小示例仅暴露 `health` / `version` / `config-path`(均显式 `executionProfile: "sync"`
- 模板最小示例仅暴露 `health` / `version` / `config-path`(均显式 `executionProfile: "sync"`**不**自动加 toolbar
- 含 `toolbar` 的 Action**必须**声明合法 `bind.tables``POLICY-SKILL-ACTION-003`
- 含浏览器 RPA / 长耗时的业务技能:**必须**增加至少一条 `"executionProfile": "async"` 且 `placements` 含 `agent` 的 action`POLICY-SKILL-ACTION-001`
- 没有宿主直接操作需求时,**可以删除** `actions.json`;删除后勿保留失效引用
- 复制为新技能后,scaffold 会自动将 `your-skill-slug` 与 `your_skill_slug` 替换为新 slug后者用于 `LOG_LOGGER_NAME` 等下划线形式action 业务命令由技能作者自行调整
- scaffold **不会**移除 Schema 中的 `bind` 支持,**不会**生成平台业务 Action 业务表名;仅替换占位 slug
宿主执行方式:
@@ -543,22 +554,31 @@ CLI 必须提供稳定退出码、结构化成功输出,以及 `ERROR:<CODE>:`
### 编排范式:单内核 + 多入口
长任务 / RPA 技能推荐拆分(勿把 `job_context` 塞进纯业务内核):
长任务 / RPA / 数据同步技能推荐拆分(勿把 `job_context` 塞进纯业务内核):
```text
<domain>_service.sync_*(...) # 唯一业务内核:读外源 → 写本地库(或核心处理)
cmd_sync_* (...) # 编排job_context + 调用内核 + emit/finishasync 时)
CLI / Action / cron / Agent # 全部进入同一 cmd_* → 同一内核
```
RPA 批量亦可:
```text
execute_single_<biz>(...) # 鉴权 + 业务 + task_log无 job_context
cmd_run(...) # 单条job_context + execute_single + finish
cmd_run_pick(N, ...) # 批量顺序job_context + for-loop + emit(progress) + finish(partial|success|failed)
cmd_run_pick(N, ...) # 批量顺序job_context + for-loop + emit(progress) + finish
cmd_stats() # 只读 syncJSON无 job_context
```
- 批量数量用 **`pickCount` / `--pick N` 参数**(任意正整数),不写死条数。
- **顺序执行、不并发**同一浏览器 Profile / account lease。
- 详情见 [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md) §5§6
- **同步数据**与**宿主表导出**职责分离:同步不写 CSV/Excel表导出交给数据管理
- 详情见 [`SKILL_ACTION_RUNTIME.md`](SKILL_ACTION_RUNTIME.md);契约样例见 `tests/samples/test_sync_contract.py.sample`、`tests/samples/test_action_core_contract.py.sample`。
### 队列 + pick可选
有「待处理列表」时:队列表 `pending → processing → success/failed`;数据管理录入或 `import-*` 入库;`run --pick N` 消费;失败用 `reset` 回 `pending`不自动重试。Manifest 上配置 `*-run-pick`asynctoolbar/cron/agent
有「待处理列表」时:队列表 `pending → processing → success/failed`;数据管理录入或 `import-*` 入库;`run --pick N` 消费;失败用 `reset` 回 `pending`不自动重试。Manifest 上配置 `*-run-pick`常见为 async + toolbar/cron/agent;有 toolbar 则须 `bind.tables`)。
## 12. 如何接兄弟技能

View File

@@ -29,17 +29,25 @@
| POLICY-CONTROL-003 | `scripts/service/*.py` 不得裸 `asyncio.sleep`RPA 等待须 `interruptible_sleep` | development/RPA.md §0.1 | hard | 扫描 service 层 Python | `tests/test_development_policy_guard.py::TestPolicyControl003` |
| POLICY-DATA-PATH-001 | 技能拥有路径须经 `resolve_data_path` / `get_*_dir``.env.example` 禁止 `./` CWD 相对路径;业务代码禁止 `abspath(config.get(...))` | development/DATA_PATHS.md | hard | 扫描 `.env.example``scripts/**/*.py` | `tests/test_development_policy_guard.py::TestPolicyDataPath001` |
| POLICY-SKILL-ACTION-001 | 存在 `development/SKILL_ACTION_RUNTIME.md`schema 含 `executionProfile`;业务技能(非模板占位 slug若 service 含 `RpaVideoSession``actions.json` 须有 `executionProfile=async` 且 placements 含 `agent` 的 action | development/SKILL_ACTION_RUNTIME.mdreferences/ACTIONS.md | hard | 文档/schema/manifest 检查 | `tests/test_development_policy_guard.py::TestPolicySkillAction001` |
| POLICY-SKILL-ACTION-002 | 每个 Action 必须显式声明 `executionProfile`,且只能是 `sync``async` | development/SKILL_ACTION_RUNTIME.mdreferences/ACTIONS.mdassets/schemas/skill-actions.schema.json | hard | schema required + manifest 扫描 | `tests/test_development_policy_guard.py::TestPolicySkillAction002``tests/test_actions_manifest.py` |
| POLICY-SKILL-ACTION-003 | toolbar Action 必须声明合法非空 `bind.tables`snake_case、唯一 | references/ACTIONS.mdassets/schemas/skill-actions.schema.json | hard | schema if/then + manifest 扫描 | `tests/test_development_policy_guard.py::TestPolicySkillAction003``tests/test_actions_manifest.py` |
| POLICY-SKILL-ACTION-004 | `placements``executionProfile` 正交文档不得把数据管理入口与异步执行方式硬绑定Schema 须接受 toolbar/cron/agent/skill-detail × sync/async 全部组合 | development/SKILL_ACTION_RUNTIME.mdreferences/ACTIONS.mdassets/schemas/skill-actions.schema.json | hard | Schema 4×2 矩阵校验 + 文档禁止短语扫描 | `tests/test_actions_manifest.py::test_schema_allows_all_placement_execution_profile_combinations``tests/test_development_policy_guard.py::TestPolicySkillAction004` |
| POLICY-ARCH-CORE-001 | 同一业务能力的 Action、CLI、Agent、cron、数据管理入口复用同一业务内核文档要求已声明 | development/DEVELOPMENT.mddevelopment/SKILL_ACTION_RUNTIME.md | hard文档标记 / soft语义 | 文档关键表述存在性;真实复用靠 sample/review | `tests/test_development_policy_guard.py::TestPolicyArchCore001``tests/samples/test_action_core_contract.py.sample` |
| POLICY-DATA-SYNC-001 | 同步型业务须遵循幂等、事务、完整性与空结果保护(文档已声明) | references/SCHEMA.mddevelopment/SKILL_ACTION_RUNTIME.md | hard文档标记 / soft语义 | 文档关键表述存在性;完整语义靠 sample/review | `tests/test_development_policy_guard.py::TestPolicyDataSync001``tests/samples/test_sync_contract.py.sample` |
---
## 暂不自动检测(软规则)
以下规范仍须人工遵守或依赖 code review / AI 提示词**不**做成默认测试,避免误伤
以下规范仍须人工遵守或依赖 code review / AI 提示词 / sample 契约,**不**做成脆弱关键字扫描
| 规则摘要 | 来源 | 原因 |
|----------|------|------|
| `cli/` 只解析参数、不写业务逻辑 | development/DEVELOPMENT.md §9 | 需语义理解,无法可靠静态判定 |
| `service/` 编排流向与模块拆分粒度 | development/DEVELOPMENT.md §10 | 架构软约束 |
| `service/` 编排流向与模块拆分粒度 | development/DEVELOPMENT.md §10 | 架构软约束;见 `test_action_core_contract.py.sample` |
| 是否真正复用同一业务内核 / 是否按 source 分叉 | development/SKILL_ACTION_RUNTIME.md §5 | 需调用图与人工审查 |
| 是否满足完整快照语义 / 空结果保护实现 | references/SCHEMA.md | 见 `test_sync_contract.py.sample` |
| 是否把系统导出与业务同步混淆 | references/ACTIONS.mdSCHEMA.md | 文档 + sample勿做源码关键词误报扫描 |
| `db/` 层不得调浏览器或拼业务流程 | development/DEVELOPMENT.md §11 | 需跨文件调用图 |
| slug 命名语义verb-noun-platform | development/NAMING.md | 部分覆盖于 `tests/test_slug_naming.py`,非本矩阵 hard policy |
| 复制模板不得保留 `.git` / template marker | development/DEVELOPMENT.md §4 | 由 `tests/test_scaffold_guard.py` 守护,属脚手架场景 |
@@ -48,3 +56,4 @@
| adapter 四档契约测试覆盖 timeout/unauthorized 等 | development/ADAPTER.md §contract tests | 需业务实现后人工补测 |
| `SKILL.md` / `constants.SKILL_SLUG` 一致性 | development/DEVELOPMENT.md §16 | 已有 `tests/test_skill_metadata.py` |
| platform_kit_min_version >= 1.2.0 | development/RUNTIME.md | 已有 `tests/test_platform_import.py` |
| 宿主按 `bind.tables` 过滤 toolbar 按钮 | references/ACTIONS.md | 待宿主升级后完整生效;模板侧已强制显式绑定 |

View File

@@ -6,8 +6,8 @@
| 文档 | 职责 |
|------|------|
| 本文 | sync/async、任务中心、Agent 禁令、编排范式、队列 pick |
| [`../references/ACTIONS.md`](../references/ACTIONS.md) | `actions.json` 字段、placements、inputSchema |
| 本文 | sync/async、任务中心、Agent 禁令、单内核编排、队列 pick、同步 vs 导出 |
| [`../references/ACTIONS.md`](../references/ACTIONS.md) | `actions.json` 字段、placements、`bind.tables`inputSchema |
| [`LOGGING.md`](LOGGING.md) | `job_context` / `emit` / `finish` / Run Journal |
| [`DATA_PATHS.md`](DATA_PATHS.md) | 下载/导入等落盘路径 |
@@ -18,10 +18,12 @@
## 1. 核心原则
1. **宿主管调度,技能管业务** — 不自行实现任务中心 / Job 轮询 / 后台守护进程。
2. **长耗时 = async** — 开浏览器、RPA、HTTP 大文件下载等必须 `executionProfile: "async"`,进**任务中心**
3. **Agent 禁止 `exec` 直跑长任务 CLI** — 必须 `run_skill_action`;禁止 `exec python main.py run` + `process poll` 干等
4. **进度走 Journal**`emit` / `video.add_step` → Run JournalUI / Skill Run Card / 任务中心展示;**不靠 stdout 流**
5. **显式声明 `executionProfile`** — 宿主省略时默认 `async`;模板要求每个 action **写明** `sync` `async`,避免歧义
2. **单业务内核、多入口** — 数据管理、定时任务、Agent、技能详情与直接 CLI 复用同一 domain service禁止按入口复制业务逻辑
3. **五职责正交**`placements` / `bind.tables` / `executionProfile` / `entrypoint` / domain service 各管一事(见 ACTIONS.md
4. **长耗时建议 async** — 开浏览器、RPA、HTTP 大文件下载等建议 `executionProfile: "async"`,进**任务中心**;这是选择建议,**不**限制可以出现在哪些 placement
5. **Agent 禁止 `exec` 直跑长任务 CLI** — 必须 `run_skill_action`;禁止 `exec python main.py run` + `process poll` 干等
6. **进度走 Journal**`emit` / `video.add_step` → Run JournalUI / Skill Run Card / 任务中心展示;**不靠 stdout 流**。
7. **显式声明 `executionProfile`** — 每个 action **必须**写明 `sync``async`;禁止依赖宿主缺省;禁止第三种模糊模式(`auto` / `background` / `deferred` 等)。
---
@@ -29,62 +31,76 @@
| 值 | 宿主行为 | 超时 | 任务中心 |
|----|----------|------|----------|
| **`sync`** | 内联等待 CLI 结束,把结果直接返回调用方 | 默认约 **30s**`SKILL_ACTION_SYNC_TIMEOUT_MS` | ❌ 不进 |
| **`async`** | 后台 spawn Job立即返回 `jobId` | Job 本身无默认墙钟上限(可暂停/停止) | ✅ 进入 |
| **省略** | 宿主视为 **async** | 同 async | ✅ |
| **`sync`** | 调用方等待 CLI 结束,直接返回结构化结果或结构化错误;**不**创建后台 Job | 默认约 **30s**`SKILL_ACTION_SYNC_TIMEOUT_MS` | ❌ 不进 |
| **`async`** | 后台 spawn Job立即返回 `jobId``emit` / `checkpoint` / `finish`;长任务应支持暂停/停止/取消检查 | Job 本身无默认墙钟上限 | ✅ 进入 |
### 硬规则
直接执行 CLI终端等待进程结束。宿主经 Action 调用同一 CLI再按 `executionProfile` 分流。技能不得自建任务中心。
| 场景 | 必须 |
### 选择建议(不是 placement 硬限制)
| 场景 | 建议 |
|------|------|
| 浏览器 / Playwright / RPA 主路径 | `async` + 建议 `confirmation` |
| 单次可能超过 ~20s 的网络/下载 | `async` |
| `health` / `version` / `config-path` / 纯统计 / 快速导入 | `sync` |
| 数据管理 **toolbar** | **只放 async**(宿主前端对 sync 结果会报错) |
| 单次可能超过 ~20s 的网络/下载/同步 | `async` |
| `health` / `version` / `config-path` / 纯统计 / 秒级查询 | `sync` |
| 任意 placement含 toolbar | 允许 sync 或 async以 manifest 为准 |
### Agent 路径启发式(宿主行为,技能作者需知)
合法:`sync|async` × `toolbar|cron|agent|skill-detail`
- 显式写了 `executionProfile` → 以显式为准
- 未写时:描述含「统计 / 检查 / 不启动浏览器」等只读语义 → Agent 侧可当 **sync**;有 `confirmation` 的副作用 → **async**
- **模板要求一律显式写出**,不要依赖启发式。
历史说明:旧文档曾错误地把数据管理按钮入口与异步执行方式绑死。该约束**已废止**;模板测试与 Schema **不得**再建立「入口位置决定 sync/async」一类硬耦合。宿主省略 `executionProfile` 时的兼容行为以宿主实现为准,**新技能不得依赖**
---
## 3. 入口如何感知 sync / async
## 3. 入口如何感知 sync / async
个入口统一走 `POST /api/skill-actions/run`,带 `source.kind`
个入口统一走 `POST /api/skill-actions/run`可能`source.kind`
| 入口 | `source.kind` | 推荐 |
|------|---------------|------|
| **Agent** | `agent` | `run_skill_action`长任务 async秒回 jobId |
| **数据管理** | `data-management` | toolbar 按钮触发 async action |
| **定时任务** | `cron` | Cron 配置 async action + `pickCount` 等参数 |
| 入口 | 常见 `source.kind` | 说明 |
|------|-------------------|------|
| **Agent** | `agent` | `run_skill_action`按 manifest 的 executionProfile 执行 |
| **数据管理** | `data-management` | toolbar 按钮;须 `bind.tables` |
| **定时任务** | `cron` | Cron 配置参数后调用同一 Action |
| **技能详情** | (依宿主) | 与上同一 CLI / 同一业务内核 |
技能 **不要** 在 Python 里为三个入口写三套分支;宿主读 manifest 分流。
技能 **不要** 在 Python 里`source` / placement 写业务分叉;宿主读 manifest 分流展示与等待策略
---
## 4. Action 分类与 placements 矩阵
## 4. Action 分类与 placements(示例,不是限制)
| Action 类型 | `executionProfile` | 典型 placements | `confirmation` |
|-------------|--------------------|-----------------|----------------|
| 运行检查 / 版本 / 配置路径 | `sync` | `skill-detail`, `agent`(只读) | 无 |
下表只表示常见组合示例。**placements 以 manifest 为准sync/async 不影响展示入口。**
| Action 类型 | 常见 `executionProfile` | 常见 placements | `confirmation` |
|-------------|-------------------------|-----------------|----------------|
| 运行检查 / 版本 / 配置路径 | `sync` | `skill-detail`, `agent` | 无 |
| 库 / 队列统计 | `sync` | `skill-detail`, `agent` | 无 |
| 数据导入 / 失败重置 | `sync` | `skill-detail`, `agent` | 可选 |
| **单条**副作用 RPA | `async` | `agent`, `skill-detail` | **必须** |
| **批量顺序** RPApick | `async` | **`toolbar`**, `cron`, `agent` | **必须** |
| 外源 → 本地库同步 | `sync` `async` | 可含 `toolbar`(须 `bind.tables`)、`cron``agent` | 可选 |
| 数据导入 / 失败重置 | `sync``async` | `skill-detail`, `agent` | 可选 |
| **单条**副作用 RPA | `async`(建议) | `agent`, `skill-detail` | **建议** |
| **批量顺序** RPApick | `async`(建议) | `toolbar`, `cron`, `agent` | **建议** |
禁忌:
- 高副作用 async action 不要默认只挂 `toolbar`(应有 confirmation
- 高副作用 action 不要默认只挂 `toolbar`(应有 confirmation
-`sensitive` 参数的 action 不要挂 `toolbar` / `cron`(除非有明确安全设计)。
- 不要为了「按钮多」暴露所有 CLI 子命令。
- 不要按入口复制多套采集 / 同步 / 处理实现。
---
## 5. 技能内编排范式(单内核 + 多入口)
推荐结构(对齐 create-account / download-video 金标准)
推荐分层
```text
scripts/cli/app.py # 参数解析 → 调用 task / service
scripts/service/task_service.py # job_context / emit / checkpoint / finish / 错误转换
scripts/service/<domain>_service.py # 唯一业务内核
scripts/db/*_repository.py # 只负责读写与事务
assets/actions.json # 声明入口、参数、placement、executionProfile、bind
```
长任务 / RPA 常见拆分(勿把 `job_context` 塞进纯业务内核):
```text
execute_single_<biz>(...) # 纯业务:鉴权 + 核心逻辑 + task_log不含 job_context
@@ -95,19 +111,20 @@ cmd_stats() # 只读 syncJSON stdout无 job_context
要点:
1. **`job_context` 只包编排层**`cmd_run` / `cmd_run_pick`),不包 `execute_single_*`
2. 批量 **顺序、不并发**;数量由参数 `pickCount` / `--pick N` 传入(不写死 100/200
1. **`job_context` 只包编排层**`cmd_run` / `cmd_run_pick`),不包 `execute_single_*` / domain service
2. 批量 **顺序、不并发**;数量由参数 `pickCount` / `--pick N` 传入。
3. pick 循环内:`checkpoint()` + `emit("正在处理 {i}/{total}", progress={...})`
4. 结束:全成功 `finish(success)`;部分失败 `finish(partial)`;全失败 `finish(failed)`
5. 同一浏览器 Profile / account lease**禁止并发**;顺序执行 + lease 即可
5. 同一浏览器 Profile / account lease**禁止并发**。
6. 兼容旧命令(例如旧 export 需先刷新)必须调用同一 sync / domain 内核,禁止重写采集逻辑。
详见 [`LOGGING.md`](LOGGING.md) §2.5 与 `scripts/service/task_service.py` 示范。
详见 [`LOGGING.md`](LOGGING.md) §2.5 与 `scripts/service/task_service.py` 示范。可复用契约样例见 `tests/samples/test_action_core_contract.py.sample``tests/samples/test_sync_contract.py.sample`
---
## 6. 队列 + pick可选Type B 批量)
有「待处理列表」的技能(账号开通、视频下载、帖子发布等)建议:
有「待处理列表」的技能建议:
| 能力 | 约定 |
|------|------|
@@ -116,7 +133,7 @@ cmd_stats() # 只读 syncJSON stdout无 job_context
| 消费 | `run --pick N`,默认仅 `pending` |
| 重试 | `reset` 或数据管理改 `pending`**failed 不要自动重试** |
| 批次 | 可选 `batch_id`,便于筛选与任务中心对照 |
| Manifest | `*-run-pick``async``placements``toolbar` / `cron` / `agent``inputSchema.pickCount` |
| Manifest | `*-run-pick`建议 `async``placements` 按需`toolbar` / `cron` / `agent`;有 toolbar 则 `bind.tables` 必填 |
批量有两种合理形态(都是**顺序**
@@ -125,11 +142,23 @@ cmd_stats() # 只读 syncJSON stdout无 job_context
| 一次 `run-pick` 处理 N 条 | **1** 条 Job | 同类 RPA、同 Profile、定时消费队列 |
| Agent/UI 触发 N 次单条 `run` | **N** 条 Job | 每条独立追踪 / 独立重试 |
默认优先 **一次 pick、一条 Job**(与 create-account `--pick`、download `--pick` 一致)
默认优先 **一次 pick、一条 Job**
---
## 7. Agent / SKILL.md 契约(复制后必改)
## 7. 业务同步与系统导出
| 能力 | 方向 | 负责方 |
|------|------|--------|
| 同步 / refresh / collect | 外部来源 → 技能本地 SQLite | 技能 domain service |
| 导出当前数据表 | 本地库 → CSV/Excel | **宿主**数据管理统一导出 |
| 特殊业务报告 | 多表合并 / 特殊格式 / 附加计算 | 仅系统导出不足时提供 `export-*` |
同步 Action 默认写库、不写导出文件。通用幂等 / 事务 / 空结果保护见 [`../references/SCHEMA.md`](../references/SCHEMA.md)。
---
## 8. Agent / SKILL.md 契约(复制后必改)
业务技能 `SKILL.md` 应明确:
@@ -137,20 +166,25 @@ cmd_stats() # 只读 syncJSON stdout无 job_context
2. **禁止**对长任务使用 `exec` + `process poll`
3. 单条 vs 批量 action id 与参数(如 `url` / `pickCount`)。
4. 长任务进度看**任务中心** / Skill Run Card不等 CLI stdout。
5. 多入口复用同一业务内核;异步 Action 进入任务中心。
模板源仓库的 `SKILL.md` 含占位段落scaffold 后按业务改写。
---
## 8. Policy
## 9. Policy
自动检测索引见 [`POLICY_MATRIX.md`](POLICY_MATRIX.md)
- **POLICY-SKILL-ACTION-001**`SKILL_ACTION_RUNTIME.md` 存在schema 含 `executionProfile`;有 RPA 的业务技能须声明 async agent action。
- **POLICY-SKILL-ACTION-001**Runtime 文档存在schema 含 `executionProfile`;有 RPA 的业务技能须声明 async agent action。
- **POLICY-SKILL-ACTION-002**:每个 Action 显式声明 `executionProfile`sync/async
- **POLICY-SKILL-ACTION-003**toolbar Action 必须声明合法 `bind.tables`
- **POLICY-SKILL-ACTION-004**placements 与 executionProfile 正交(文档/测试不得写死耦合)。
- **POLICY-ARCH-CORE-001** / **POLICY-DATA-SYNC-001**:见矩阵;完整语义多用 sample / code review。
---
## 9. 与宿主 API参考
## 10. 与宿主 API参考
| API | 用途 |
|-----|------|
@@ -160,3 +194,5 @@ cmd_stats() # 只读 syncJSON stdout无 job_context
| `GET /api/skill-actions/jobs/{jobId}` | 单 Job 详情 / 事件 |
Agent 工具(插件):`list_skill_actions``get_skill_action``run_skill_action`;正常对话**不要**轮询 `get_skill_action_job`(交给 UI / 任务中心)。
表级 `bind.tables` 过滤依赖宿主支持旧宿主忽略绑定时toolbar Action 可能在技能全部数据表显示——新技能仍须显式绑定,待宿主升级后完整按表过滤生效。