新增 AutoRDO 需求清洗工作台与消息中枢,迭代 OneOS V2 设计规范及租赁合同/工作台/车辆等原型,同步云效技能与导航注册;并归档一批 legacy 原型快照。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
王冕
2026-07-28 15:50:35 +08:00
parent b14425da5a
commit 5d51a6bf7a
1393 changed files with 488042 additions and 10046 deletions

View File

@@ -0,0 +1,49 @@
# 验收清单与回报
## apply 后必须自检
| # | 项 | 通过标准 |
|---|---|---|
| 1 | 需求编号 | 回报含 ONEOS-xx |
| 2 | 任务编号 | 交付/分析/设计凡新建或操作均回报编号;禁止只报标题 |
| 3 | 编号区块 | 需求「工作项编号(系统)」与实际一致 |
| 4 | ASSOCIATED | **仅交付**详情关联项可见需求(`createWorkitemRelationInfo=ASSOCIATED`;禁止 PARENT 冒充) |
| 5 | SUB | **必过**:分析/设计 create 用 `TASK_SUB→交付`(含 `parent`+`parentIdentifier`交付「子项」tab 须可见。与 ASSOCIATED 同 create 互斥,阶段任务关联项可空(见 live-api.md |
| 6 | 计划开始 | 未误覆盖已有值 |
| 7 | 阶段日历工时 | 有计划完成时已写入;脚注存在;回报用语正确 |
| 8 | 交棒 | 需求=待开发;交付负责人=何斐(交棒场景) |
| 9 | 占位风险 | 交付仍占位时首行标红 |
| 10 | 负向 | 本轮**无**【开发】/【测试】任务;未按标题查重 |
设计完成额外AutoPRD 段已写交付非占位除非失败停下ZIP+截图已挂或已列出缺项。
迭代额外:只挂【交付】(需求不挂);版本号符合递增规则。
## 回报模板(精简)
```text
【YunxiaoPM】
风险:(若有占位交棒则首行标红)
需求ONEOS-xx | 状态=…
交付ONEOS-a | 负责人=…
分析ONEOS-b | …(无则写无)
设计ONEOS-c | …(无则写无)
阶段日历工时:分析 Hh / 设计 Hh若本轮写入
附件:…(若本轮)
迭代:…(若本轮)
下一步:请技术经理使用开发 Skill交棒后
```
## 适合全自动 vs 人工门禁
| 适合全自动 | 建议半自动/人工门禁 |
|---|---|
| 建单、打标签、挂迭代、写描述、建交付树、改状态、交棒负责人、幂等查重 | **PJ 云效项目点选**、受理(已确认)、是否快轨、设计完成是否真可开发、跨需求优先级与迭代容量、回退与取消 |
## 实写性能2026-07-23 复盘)
| 项 | 要求 |
|---|---|
| 改状态 | 只用 `status/transit`(见 [live-api.md](live-api.md) |
| 改【交付】负责人 | 只用 `PATCH …/{id}` + `propertyKey=assignedTo` |
| 极速复测 | `scripts/live_create_fast.py`;默认不开浏览器 |

View File

@@ -0,0 +1,22 @@
# 口令面
```text
记录需求:…;项目=必选·Plan 点选);优先级=紧急|高|中|低;标签=…;提交部门=…;提交人=…;推进至=暂不推进|已确认|分析中|设计中|设计完成|待开发|待开发(快轨)
受理确认ONEOS-xx
开始分析ONEOS-xx → 【交付】+【分析】并回报编号
开始设计ONEOS-xx交付任务=…;分析任务=… → 【设计】+收口分析
设计完成ONEOS-xx设计任务=…;原型=…
交棒开发ONEOS-xx交付任务=… → 待开发 + 该编号负责人=何斐
快轨待开发ONEOS-xx → 待开发 +【交付】+【设计】(无【分析】)+ 交付负责人=何斐
编号直推:分析任务=ONEOS-b / 设计任务=ONEOS-c → 收口未完成计划完成 + 需求待开发 + 交付交棒何斐
创建迭代:版本类型=主|副|子;交付任务=ONEOS-a,ONEOS-b,…;名称前缀=…
AutoRDO粘贴聊天/附录音)→ 再记录需求
```
版本自动规则:取同前缀下最大 `Vx.y.z`(旧 `Vx.y` 视为 `Vx.y.0`)再按主/副/子递增;迭代名=`{前缀}{新版本}`
**PJ 项目**:新建需求/迭代前须点选云效项目(实时列表);禁止默认直指。见 [project-selection.md](project-selection.md)。
后续推进口令**优先显式带任务编号**;未带则读「工作项编号(系统)」;仍无则询问;**禁止按标题补全**。
YunxiaoPM 回报止于交棒;可一句「请技术经理使用开发 Skill」。

View File

@@ -0,0 +1,95 @@
# 压缩点选(`1a2b3a4d`
记录需求 Plan **默认**用编号题 + 字母选项;用户可用一行压缩答复确认。
## Plan 展示模板
```text
请回复压缩点选1a2b3a4d
(数字=题号,字母=选项;大小写不敏感;可写 1A2B3A4D
1. 类型
A. 新增
B. 优化
2. 项目(云效实时列表;建议项可标★)
A. 01_ONEOSONEOS
B. 02_小羚羚APPXLLAPP
C. …
3. 优先级
A. 紧急
B. 高
C. 中
D. 低
4. 标签(云效候选;建议项可标★)
A. 故障管理★
B. 还车应结款
C. …
```
可选续题(口令已齐则可写入清单、压缩串可不含):
```text
5. 推进至 …
6. 迭代 …
```
## 解析规则
| 规则 | 说明 |
|---|---|
| 形态 | `(题号)(字母)` 连续拼接,如 `1a2b3a4d` |
| 题号 | `1`=类型 `2`=项目 `3`=优先级 `4`=标签;可扩展 `5` `6` |
| 字母 | `a`→第 1 项 … `z`→第 26 项;超出选项数 → 非法,停 |
| 缺题 | 该题若口令已唯一预填且列表唯一命中,可用预填;否则停并追问缺题 |
| 多答同题 | 后写覆盖先写 |
| 非法字符 | 停,重贴模板 |
解析成功后 Plan 回显人话确认一行,例如:
```text
已解析 1a2b3a4d → 类型=新增;项目=02_小羚羚APP优先级=紧急;标签=D 项名)
确认后回复「执行」
```
用户再回「执行」才 apply仍守 Plan 门禁)。
## 与口令预填
口令已写 `类型新增项目01_ONEOS优先级标签故障管理` 时:
- 对应选项标 ★,并给出**建议压缩串**(如 `1a2a3b4a`),用户可直接改字母或整段重答。
- **不得**因有预填而跳过展示字母表;压缩确认(或逐题点选)仍是门禁。
## 标签未命中 → 自动重拉一次候选并重生选项
「标签无法对应」:口令标签名在**当前标签候选**中 0 命中(或多命中无法唯一)。
| 步骤 | 动作 |
|---|---|
| 1 | **自动重拉一次**标签候选(见下「标签候选来源」;强制刷新,不用旧缓存) |
| 2 | 用新列表**重新生成 4.A/B/C…** 选择项 |
| 3 | 回报:`已自动重拉标签列表(因无法对应)`;请用户重答 `4x` 或整串 |
| 4 | 仍无法对应 → 停;**禁止**第 3 次空转;**禁止**猜 tagId |
> 说明:此处重拉的是**标签候选列表**,不是项目列表。项目无法对应仍走 [project-selection.md](project-selection.md) 的「自动重拉一次」。
### 标签候选来源(当前已验证路径)
1. `runtime-ids.json``tags`
2. 目标项目(或预填项目)下近期工作项 `tag` 字段聚合去重
3. 重拉 = 再请求工作项列表聚合 + 合并 runtime命中后可回写 `tags` 缓存
(专用 `tag/list` Cookie API 尚未稳定;有稳定端点后改写入 `live-api.md` 并切换。)
## 项目列表顺序
生成 2. 选项时:口令预填/建议项目置 **A** 并标 ★,其余按云效返回顺序接 B/C/…。
## Agent 义务
1. 记录需求进 Plan 时必须输出本模板(至少 14 题)。
2. 收到压缩串先解析回显,再等「执行」。
3. 标签/项目无法对应:各自动重拉**一次**并刷新对应题选项。

View File

@@ -0,0 +1,69 @@
# 需求描述 vs 交付描述
两类描述职责不同;禁止混写;禁止建【交付】时把 AutoPRD 六大块提前塞进交付描述。
## A. 需求描述 · AutoRDO 清洗
| 项 | 规则 |
|---|---|
| 触发 | 对话建需求 / 碎片材料入库 |
| 调用 | **必须**使用独立 Skill「**`$AutoRDO`**」(`AutoRDO/SKILL.md`;本 Skill 不内嵌清洗细则) |
| 输入 | 聊天记录、录音、口述材料 |
| 处理 | 保留原意;书面化;去口头禅;**去除结尾句号**(细则在 AutoRDO `references/rules.md` |
| 输出 | 写入 `## 原始诉求AutoRDO` |
| 不做 | 本阶段不写 AutoPRD 六大块;不要求已有原型;不覆盖已有「产品说明」 |
口令:`AutoRDO…` → 确认后 `记录需求:【新增】标题;描述=整理稿;推进至=…`
## B. 交付描述
### B1. 标准路径(分析中起建交付)
| 时机 | 【交付】描述 |
|---|---|
| 首次创建起至设计完成前 | 固定文案:`等待设计任务完成后自动填入` |
| 设计完成时 | 用 AutoPRD「产品说明」正文替换占位 |
### B2. 无单快轨建交付(覆盖 B1
| 口令/材料 | 【交付】描述 |
|---|---|
| 手工描述(无指定原型) | **同步需求**当前手工/AutoRDO 正文;禁止占位 |
| 指定原型页面 | `$oneos-autoprd` 从原型生成写入;禁止占位 |
| 既无正文又无原型 | 才允许占位并标红风险 |
快轨【设计】描述始终复制需求当前描述正文(见 [fast-track.md](fast-track.md))。
## C. 需求描述双段模板(不可互相覆盖)
```markdown
## 原始诉求AutoRDO
(清洗稿;设计完成也不删除)
## 产品说明AutoPRD
(六大块+对象存储链接;未设计完成前可无此节或写「待设计完成后填入」)
## 工作项编号(系统)
- 交付:…
- 分析:…
- 设计:…
```
## D. 设计完成 · AutoPRD + 附件
前提:设计任务完成且已关联对应原型页。
1. 调用 **`$oneos-autoprd`AutoPRD**,产出并落盘 `.spec/requirements-prd.md` + 标注同步:
- 对象存储预览链接:`{baseUrl}/{prototype-id}/index.html`(禁止加 `prototypes/` 前缀、禁止去掉 `index.html`
- 产品说明 Markdown总览/角色/流程/状态/风险/交付等,见 AutoPRD 模板)
2. 写入需求 `## 产品说明AutoPRD`**禁止覆盖** `## 原始诉求AutoRDO` / `## 工作项编号(系统)`
3. 【交付】描述:按**交付任务编号**用产品说明正文**替换**占位(细则见 AutoPRD `references/yunxiao-delivery-sync.md`);可附「原始诉求见需求描述」。**创建【交付】时不得提前灌 MD。**
4. 附件(需求 +【交付】均挂;失败则不得声称成功):
- Make「导出 HTML含源码」ZIP → [make-export-attach.md](make-export-attach.md)
- Make「复制截图」全交互页 → 同上
缺原型 / AutoPRD 失败 / 导出或截图失败 → **不得**报到设计完成并宣称附件齐全;停下并列出缺项。
执行顺序:先 AutoPRD 落盘与附件就绪 → 再改需求/交付描述与设计计划完成 → 最后改需求状态。
**禁止**加载 `yunxiao-requirement-lifecycle`;阶段任务树只由本 SkillYunxiaoPMapp创建。

View File

@@ -0,0 +1,47 @@
# 无单快轨到待开发
适用:口令明确「快轨」或「推进至待开发」且当前需求尚无标准分析路径任务(或用户确认跳过分析)。
## 动作表
| 对象 | 动作 |
|---|---|
| 需求 | 状态 → **待开发****预计工时=2**、**实际工时=2**(覆盖同日 8h 日历工时默认);标签按口令;更新编号区块 |
| 【交付】 | 无则新建ASSOCIATED→需求勿用 PARENT负责人→何斐**计划开始=创建当日**`79`**不写**计划完成;**描述双路径**(见下);**标签与需求相同**;更新编号区块 |
| 【设计】 | **必须新建****TASK_SUB→交付**(交付「子项」须可见);**描述=复制需求当前描述正文**;计划开始/完成均=当日create 后 `field/value``79`+`80`);任务→完成态;**标签与需求相同**;建后再尝试 **ASSOCIATED→原始需求**Cookie 常失败,见 live-api失败须标红**子项优先于关联项**);更新编号区块 |
| 【分析】 | **禁止创建** |
## 交付描述双路径A1
| 口令/材料 | 【交付】描述 |
|---|---|
| **手工描述**(无指定原型) | 同步需求当前手工/AutoRDO 正文(与设计一致可复制 document |
| **指定原型页面** | 调用 `$oneos-autoprd`,从原型生成 AutoPRD「产品说明」写入【交付】 |
| 既无手工可同步正文、又无原型 | 才允许占位 `等待设计任务完成后自动填入`Plan 勾选交棒占位风险,回报首行标红 |
有手工或原型时**禁止**交棒占位。
## AutoPRD
- 快轨默认可不跑 AutoPRD**例外**:口令指定原型 → 交付走 AutoPRD 路径(上表)。
- 口令同时「设计完成 + 原型」时仍按步骤 4 灌需求产品说明段。
## 查重
只认任务编号。已有分析单不得因「快轨」被删除。
## 回报必含
- 需求 / 交付 / 设计编号
- 「快轨:未建分析;设计已同步需求描述并当日收口」
- 交付描述来源:手工同步 / AutoPRD / 占位(若占位则首行标红)
- 需求预计工时=2、实际工时=2
- 设计关联项含需求编号;交付子项含设计编号
## 与标准 / 编号直推对比
```text
标准:分析中→交付+分析 → 设计中→设计+收口分析 → 设计完成→收口设计 → 待开发交棒
快轨(无既有阶段单):→ 待开发:新建交付+设计+交棒何斐(无分析;设计当日收口;需求工时 2+2
编号直推:已有分析/设计编号 → 收口空计划完成 → 待开发+交付交棒(不新建冗余单)
```

View File

@@ -0,0 +1,20 @@
# 交棒门禁与回退最小集
## 交棒门禁(待开发)
| 情形 | 规则 |
|---|---|
| 【交付】描述已是 AutoPRD 正式说明(非占位) | 允许交棒Plan 正常列交付任务编号 + 负责人→何斐 |
| 【交付】描述仍为 `等待设计任务完成后自动填入` | **仍允许交棒**,但 Plan **必须**勾选风险项「交付描述仍为占位,技术侧仅可凭需求 AutoRDO 稿理解」;回报**首行标红**该风险;**禁止**静默交棒假装材料齐全 |
| 口令同时带原型且要求设计完成 | 先走步骤 4AutoPRD+附件)成功,再交棒,不再勾占位风险 |
## 回退 / 变更(最小集 · 兼容计划开始不篡改)
| 场景 | 规则 |
|---|---|
| 待开发 → 退回设计中 | 需求状态回退;【交付】负责人可改回创建人/产品;**交付计划开始不改**;若需重做设计 → **新开**设计任务编号(旧设计保持已收口,不改其计划开始);更新「工作项编号(系统)」中的设计编号为新号 |
| 设计完成后需求大变 | 不自动改状态Plan 询问是否回退设计中并新开设计编号;更新 AutoPRD 段AutoRDO 段保留并追加「变更纪要」 |
| 取消需求 | 关联任务标取消/废止;不删编号区块;不改已写计划开始 |
| 度量含义 | 交付计划开始保留 = 全周期仍从首次开工起算;回退重做会拉长日历工时——回报注明「含回退重做」 |
凡写云效的回退仍须走 Plan 门禁。

View File

@@ -0,0 +1,14 @@
# 交接契约(开发 Skill 入口)
YunxiaoPMapp 与开发 Skill **不要**互相 include 全文;仅认下列契约。
```text
PM 完成交棒 → 需求=待开发;【交付】任务编号=ONEOS-xx负责人=何斐ASSOCIATED 需求
若交付描述仍为占位 → 回报已标红风险
开发 Skill 入口 → 认「需求编号 + 交付任务编号」
占位时只可信需求「原始诉求AutoRDO」并有权要求产品补设计完成
```
共享常量(项目 ID、何斐 ID、节假日日历可引用本 Skill 的 `assets/` 短路径,勿加载整份对方规则。
测试 Skill 另开;本契约不覆盖提测/缺陷。

View File

@@ -0,0 +1,242 @@
# 云效实写 APIYunxiaoPMapp 已验证)
`verified_at`: 2026-07-25 · **项目须门禁 PJ 点选**(见 [project-selection.md](project-selection.md));历史验证样本项目为 `01_ONEOS` / 原「统一运营管理平台」(`last_selected.spaceIdentifier``assets/runtime-ids.json`,禁止未点选即使用)。
本文件只记**已跑通**的写法;禁止再盲试 `updateStatus` / 错误 `updateFieldValue` POST。
## 认证
- CookieChrome 域 `.aliyun.com` / `devops.aliyun.com``browser_cookie3` 或 Playwright storage
- Header`x-xsrf-token` = cookie `XSRF-TOKEN`URL 解码后)
- `Origin` / `Referer``https://devops.aliyun.com`
## 建单
`POST|PUT /projex/api/workitem/workitem?_input_charset=utf-8`
创建响应 `result.identifier` / `serialNumber` 即编号真相;**禁止按标题查重**。
## 改负责人(已通)
```http
PATCH /projex/api/workitem/workitem/{id}?_input_charset=utf-8
{"propertyKey":"assignedTo","propertyValue":"<userId>","operateType":"COVER"}
```
交棒:【交付】`propertyValue` = 何斐 ID。
## 打标签(已通)
```http
PATCH /projex/api/workitem/workitem/{id}?_input_charset=utf-8
{"workitemIdentifier":"{id}","propertyKey":"tag","propertyValue":"<tagId>[,<tagId>]","operateType":"COVER"}
```
## 改状态(已通 · 唯一推荐)
```http
POST /projex/api/workitem/workitem/{id}/status/transit?_input_charset=utf-8
{"fromStatus":"<status.identifier>","toStatus":"<status.identifier>"}
```
成功:`code=200``result=true`。失败时 `errorMsg` 含「不能流转」。
### 需求状态 ID本项目
| 显示名 | identifier |
|---|---|
| 待处理 | `100005` |
| 已确认 | `32` |
| 分析中 | `154395` |
| 设计中 | `156603` |
| 设计完成 | `307012` |
| 待开发 | `1582fc929d429111b925309493` |
### 任务状态 ID
| 显示名 | identifier |
|---|---|
| 待处理 | `100005` |
| 已完成 | `100014` |
### 极速交棒跳转(工作流允许)
从「待处理」菜单可见直达「设计完成」;推荐最少跳:
```text
待处理 → 设计完成 → 待开发
```
标准路径若需看板留痕,可走完整链:已确认→分析中→设计中→设计完成→待开发(仍用本 API勿开 UI
### 禁止(已证伪)
| 写法 | 结果 |
|---|---|
| `PATCH …/updateStatus` + `statusIdentifier` | `400 不能为空` |
| `PATCH …/{id}` + `propertyKey=status` | `property not found` |
| Playwright 点左侧/列表上的状态色块(`x<1100` | 假成功、状态不落库 |
仅当 `status/transit` 不可用时,才用 UI右侧详情状态钮`getBoundingClientRect().x > 1100`+ `.next-menu-item`
## 计划开始/完成 · 提交部门/人 · 预计工时2026-07-27 修订)
**通用字段写入(已通):**
```http
POST /projex/api/workitem/workitem/field/value/{workitemId}?_input_charset=utf-8
Content-Type: application/x-www-form-urlencoded
fieldValueList=[{"fieldIdentifier":"79","value":"2026-07-27 12:00:00"},{"fieldIdentifier":"3132597a9718d1c282b7ba5a0c","value":""},{"fieldIdentifier":"9e01269e96f91fbb97d36bf5b3","value":""}]
```
| 字段 | fieldIdentifier | value |
|---|---|---|
| 计划开始 | `79` | `YYYY-MM-DD HH:mm:ss`(推荐正午)或 epoch ms 字符串 |
| 计划完成 | `80` | 同上 |
| 提交部门 | `3132597a9718d1c282b7ba5a0c` | 纯文本 |
| 提交人 | `9e01269e96f91fbb97d36bf5b3` | 纯文本 |
**预计工时 `101586`:禁止直接改字段**(报「不可直接修改」)。须登记:
```http
POST /projex/api/workitem/workitem/time/estimate?_input_charset=utf-8
{"workitemIdentifier":"<id>","spentTime":8,"type":"develop","description":"","recordUserIdentifier":"<userId>","forCreate":false,"containsRestDay":false}
```
删除多余预估:`DELETE /projex/api/workitem/workitem/time/estimate/{workitemId}/{estimateId}`
列表:`GET …/time/estimate/list?workitemIdentifier=`
旧写法 `PATCH …/updateWorkitemFieldValue` 对上述自定义字段常 `400 不能为空`,勿再优先使用。
## 父子 / 子项 / 关联项(已通 · 2026-07-23 修订 · 子项优先)
### 关联项(【交付】强制 · ASSOCIATED
任务详情「关联项」只认 `ASSOCIATED`。**仅【交付】**建单时 `createWorkitemRelationInfo` 必须指向**需求**
```json
{
"createWorkitemRelationInfo": {
"relatedWorkitemIdentifier": "<需求id>",
"relatedToRelationIdentifier": "ASSOCIATED"
}
}
```
校验:
```http
GET /projex/api/workitem/v2/workitem/{id}/relation/workitem/list/by-relation-category?category=ASSOCIATED&isForward=true
```
`result` 含该需求即通过。
### 禁止(关联项)
| 写法 | 结果 |
|---|---|
| `relatedToRelationIdentifier=PARENT` 把交付挂需求 | 详情可能有 parent**关联项仍为空** |
| 分析/设计只用 `ASSOCIATED→需求` + `parentIdentifier` | 关联项可能有,**交付子项仍为空**ONEOS-246/247 |
| 建后再 `POST …/relation/record` 补关系 | Cookie 路径下常报「不能关联相同的工作项」 |
| `createWorkitemRelationList` | 不落 ASSOCIATED |
### 子项(【分析】/【设计】强制 · TASK_SUB
「子项」页读 `PARENT_SUB` / `TASK_SUB`,分析/设计**必须**
```json
{
"parent": "<交付id>",
"parentIdentifier": "<交付id>",
"createWorkitemRelationInfo": {
"relatedWorkitemIdentifier": "<交付id>",
"relatedToRelationIdentifier": "TASK_SUB"
}
}
```
同一 create 只能带一条 `createWorkitemRelationInfo`
`ASSOCIATED→需求``TASK_SUB→交付` **不能同时写**
**产品优先级交付「子项」tab > 阶段任务「关联项」。**
交付本身仍必须 `ASSOCIATED→需求`。标准路径下分析/设计的「关联项」允许为空。
**无单快轨例外(设计双挂):** create 用 `TASK_SUB→交付` 后,须再补 **ASSOCIATED→原始需求**,使设计详情「关联项」可见需求。
```http
POST /projex/api/workitem/workitem/{id}/relation/record?_input_charset=utf-8
{"relationIdentifier":"ASSOCIATED","toWorkitemIdentifier":"<id>"}
```
**已证伪Cookie · 2026-07-27** 凡工作项**已创建**后再 `relation/record` 补挂(含 ASSOCIATED / TASK_SUB常报「不能关联相同的工作项」与是否已有父项无关。`createWorkitemRelationList` 亦不落 ASSOCIATED。
**可行路径:**
| 目标 | 做法 |
|---|---|
| 交付「子项」可见设计(优先) | create 带 `TASK_SUB→交付` |
| 设计「关联项」可见需求 | create 带 `ASSOCIATED→需求`(与上互斥,同 create 只能一条) |
| 双挂 | 需个人 `x-yunxiao-token` OpenAPICookie 路径**不得**声称成功 |
产品默认:**子项优先**;关联项失败须在回报中标红并列出缺项。
校验子项:
```http
GET /projex/api/workitem/v2/workitem/{id}/relation/workitem/list/by-relation-category?category=PARENT_SUB&isForward=true
```
结果须含对应分析/设计 identifier。
校验设计关联项:
```http
GET /projex/api/workitem/v2/workitem/{id}/relation/workitem/list/by-relation-category?category=ASSOCIATED&isForward=true
```
`result` 须含原始需求 identifier。
### 无单快轨字段默认2026-07-27
| 对象 | 规则 |
|---|---|
| 【设计】描述 | 复制需求 document HTML |
| 【设计】`79`/`80` | 当日 `12:00:00` / `23:59:59`create 后 `field/value`(勿 create 同时带 79+80 |
| 【交付】描述 | 手工同步需求正文或原型→AutoPRD禁止无故占位 |
| 【交付】`79` | 创建当日;不写 `80` |
| 【交付】/【设计】标签 | 与需求相同,`PATCH propertyKey=tag` |
| 需求预计工时 | `time/estimate` **spentTime=2**(先删多余预估) |
| 需求实际工时 | `POST …/workitem/time`body 用 **`actualTime`**(非 spentTime+ `gmtStart`/`gmtEnd` epoch ms 字符串;见 `runtime-ids.json` `fields.actual_hours` |
| 描述更新 | `PATCH …/workitem/{id}/document``{"content":"<html>","formatType":"RICHTEXT"}` |
## 迭代挂接(已通 · 2026-07-27 · 只挂交付)
创建迭代:`POST /projex/api/workspace/sprint`(必填 `staffIds`;可写 `capacityHours`)。
挂【交付】到迭代:
```http
PATCH /projex/api/workitem/workitem/{id}?_input_charset=utf-8
{"workitemIdentifier":"{id}","propertyKey":"sprint","propertyValue":"{sprintId}","operateType":"COVER"}
```
清空误挂(如需求):`propertyValue:""` + `operateType:"COVER"`
**校验**必须读 `/extra`(详情主接口常不含 sprint 字段,禁止据此判失败):
```http
GET /projex/api/workitem/workitem/{id}/extra?_input_charset=utf-8
result.sprint[].identifier / name
```
产品规则:**只挂【交付】**;需求 / 分析 / 设计默认不挂(除非口令显式)。
### 极速建单注意
1. Cookie 只刷一次;全程纯 HTTP默认**不开浏览器**。
2. 交付建完后,【分析】与【设计】**并行**创建(均 TASK_SUB→交付标准/快轨两树可并行。
3. 状态用 `transit` + **本地追踪 fromStatus**(禁止每次 GET负责人在交棒场景下**创建时即何斐**。
4. 建单 `fieldValueList` 可带计划开始 `79`**不要**在 create 同时写 `79+80`(同日会 400
5. 标签必须 PATCHcreate 带 tag 不落库);可与建子任务重叠;快轨交付/设计须与需求同标签。
6. `requests.Session` keep-alive**禁止**对共享 opener 加全局锁。
7. 脚本入口:`scripts/live_create_fast.py`v5快轨描述/计划/标签/工时 2+2/设计 ASSOCIATED 补挂)。

View File

@@ -0,0 +1,59 @@
# 2026-07-23 真实建单复盘与极速优化
## 测试结论
标准 + 快轨均可建到「待开发」交棒;交付树、标签「故障管理」、快轨无【分析】均正确。
| 轮次 | 编号 |
|---|---|
| 第一轮(探测+UI | ONEOS-141147 |
| 极速 v1 | ONEOS-148154 |
| 极速 v2 | ONEOS-164177含中间探针 |
## 过程问题(已修)
| # | 问题 | 根因 | 修复 |
|---|---|---|---|
| 1 | 状态改不动 / 假成功 | 误用 `updateStatus`UI 点列表区 | `POST …/status/transit` |
| 2 | 负责人改不成 | `updateFieldValue` 错 | `PATCH …/{id}` + `assignedTo` |
| 3 | 状态 ID 不全 | 未抓网络 | 写入 `runtime-ids.json` |
| 4 | 极慢 | Playwright + 串行探测 | 纯 HTTP + 并行 |
| 5 | v1 仍偏慢 | 多余 GET、串行 PATCH 计划、交棒再改负责人 | 见下节 v2 |
## 性能对比
| 口径 | 优化前(第一轮) | 极速 v1 | 极速 v2本轮 |
|---|---|---|---|
| 会话墙钟 | ≈ **17.9 分钟** | — | — |
| 两路径并行建单墙钟 | ≈4.1 分钟自动化 | **4.4 s** | **2.2 s** |
| 标准单路径 | 失败反复 | 3.7 s | **2.2 s** |
| 快轨单路径 | 失败反复 | 3.7 s | **2.1 s** |
| 浏览器 | 多次 | 无 | 无 |
相对第一轮会话 ≈ **490×**;相对 v1 再快约 **2×**
## v2 压榨点(已落地)
1. `status/transit` **本地追踪** `fromStatus`,跳过每次 GET。
2. 建单 `fieldValueList` 带**计划开始(79)**;计划完成不在 create 写(同日会 400
3. 【交付】创建时负责人直接 **何斐**(省 PATCH
4. `requests.Session` keep-alive**去掉全局锁**(否则并行失效)。
5. 打标签与建子任务 **重叠**;两路径并行。
6. 交棒后汇总用创建响应,校验 GET 移出主路径计时。
## 探针结论(未采用)
| 尝试 | 结果 |
|---|---|
| create `fieldValueList` 带 tag | 建单成功但标签不落库 → 仍须 PATCH |
| create 同时写 79+80 | `400 计划…转化异常` |
| urllib 全局 lock + 单 opener | 并行被串行化,单路径 ≈4 s |
## 仍可再压(收益变小)
1. 标签 API 若将来支持 create 落库,可再少 24 次 PATCH。
2. HTTP/2 或连接预热DNS/TLS 复用到进程级)。
3. 业务允许「建单即待开发」且平台支持初始状态 → 少 2 次 transit。
4. 计划完成改为交棒后异步补写(当前故意跳过)。
脚本:`scripts/live_create_fast.py`mode=`live_create_fast_v2`)。

View File

@@ -0,0 +1,53 @@
# Make 导出与截图附件
设计完成(步骤 4且已关联原型页时需求与【交付】均挂附件。任一侧失败 → 不得声称设计完成附件齐全。
## 1. 导出 HTML含源码ZIP
与 Make「发布 → 导出 HTML含源码」对齐。
优先本地 Make Admin
```http
GET {adminOrigin}/api/export-html?path={prototypePath}&projectId={projectId}&includeSource=true
```
| 参数 | 要求 |
|---|---|
| `path` | 原型路径(如 `prototypes/oneos-h5-vehicle-assets` |
| `includeSource` | **必须** `true` |
| 响应 | ZIP`PK` 头);文件名建议 `{prototype-id}-html-source.zip` |
失败时:提示用户在 Make 客户端对该原型执行「发布 → 导出 HTML含源码把 ZIP 路径发回。
**禁止**用「仅对象存储链接」冒充已附带源码包。
## 2. 复制截图(全交互页)
1. Make「发布 → **复制截图**」(或等价:导出该原型主界面及所有交互页截图)。
2. 上传到需求附件与【交付】附件。
3. 缺页/失败 → 列出缺项,不得报成功。
## 3. 挂载范围
同一 ZIP / 同一批截图:
1. 上传到需求 identifier
2. 上传到【交付】任务 identifier
优先 API未知 upload 端点时用已登录浏览器在详情页「附件」上传。
## 4. 与对象存储的关系
| 产物 | 用途 |
|---|---|
| `{baseUrl}/{id}/index.html` | AutoPRD 描述内可点预览链接 |
| 导出 ZIP含源码 | 附件,供开发离线打开 |
| 交互页截图 | 附件,供评审/开发对照 |
三者职责不同,不可互相替代。
## 负向
- 不得导出错误原型页(须 Plan 确认原型路径/名称)。
- 不得把别的需求的旧 ZIP 复用到新需求。
- 快轨交棒默认不跑本附件流程(除非口令同时设计完成+原型)。

View File

@@ -0,0 +1,60 @@
# 交付树模型与关联约定
## 真相源
```text
需求状态 = 阶段看板唯一真相(分析中/设计中/待开发…)
【交付】任务 = 该需求的交付容器(每需求最多 1 条)
【分析】/【设计】 = YunxiaoPMapp 在交付下建的阶段子项
【开发】/【测试】 = 另属开发 Skill / 测试 Skill不进本包
ASSOCIATED = 横向挂钩(【交付】 ↔ 需求)
SUB / TASK_SUB = 纵向拆解(交付 → 分析/设计)
```
## 关系验收
| 关系 | 用在哪里 | 验收 | 优先级 |
|---|---|---|---|
| ASSOCIATED | **仅【交付】** ↔ 需求 | 交付详情「关联项」能看到需求(**强制** | 交付必过 |
| TASK_SUB | 【分析】/【设计】 → 【交付】 | 交付详情「子项」能看到阶段任务(**强制** | 阶段任务必过 |
建单规则Cookie 路径 · 同一 create 只能一条 `createWorkitemRelationInfo`
| 对象 | `createWorkitemRelationInfo` | 另写字段 |
|---|---|---|
| 【交付】 | `ASSOCIATED` → 需求 | — |
| 【分析】/【设计】 | `TASK_SUB` → 交付 | `parent` + `parentIdentifier` = 交付 |
**禁止**对分析/设计只写 `parentIdentifier` + `ASSOCIATED→需求`关联项可能有但交付「子项」仍为空ONEOS-246/247 已复现)。
勿用 `PARENT` 冒充关联项。细则见 [live-api.md](live-api.md)。
## 禁止
| 禁止 | 说明 |
|---|---|
| 创建或描述【开发】/【测试】 | 口令与回报均不出现 |
| 分析/设计未挂成交付子项(无 TASK_SUB | 交付「子项」为 0交棒验收失败 |
| 用任务名称/标题做唯一性或查重 | 不得 `subject` 匹配复用 |
| 同一需求认定多个交付任务编号 | 列出编号请人合并后再继续 |
| 功能模块标签用「分析/设计/交付」 | 模块标签打在需求(可选交付)上 |
## 任务标题(仅展示)
- 【交付】+ 需求标题
- 【分析】+ 需求标题
- 【设计】+ 需求标题
标题可改,**不参与查重**。
## 任务编号唯一性
**唯一允许的查重/复用渠道:云效任务编号**(如 `ONEOS-99` / `serialNumber`)。
| 场景 | 正确 | 错误 |
|---|---|---|
| 首次创建【交付】 | 建单成功后回报并写入「工作项编号(系统)」 | 下次用标题搜 |
| 复用【交付】 | 口令或编号区块带 `交付任务=ONEOS-xx` | list 后按 subject 相等 |
| 判断是否已有交付 | 编号区块或交付 ASSOCIATED 编号集合 | 数【交付】开头标题 |
| 分析/设计幂等 | 仅已登记编号 | 按【分析】+需求标题 |
按编号命中则复用;**计划开始已有值禁止改写**。

View File

@@ -0,0 +1,35 @@
# 编号直推到待开发
适用:标准路径已建过【分析】和/或【设计】,用**任务编号**一口气推到待开发交棒。
## 入口(只认编号)
```text
交棒开发:需求=ONEOS-xx交付任务=ONEOS-a分析任务=ONEOS-b设计任务=ONEOS-c
交棒开发:分析任务=ONEOS-b → 由分析 ASSOCIATED/SUB 反查需求与交付
交棒开发:设计任务=ONEOS-c → 同上反查
```
禁止用标题猜。编号对不上关联树 → 停下列出关联,不瞎改。
## 动作表
| 对象 | 动作 |
|---|---|
| 需求 | 状态 → **待开发**(按云效连跳) |
| 【交付】 | **必须**用交付任务编号定位;负责人→何斐;不改计划开始;不写计划完成;描述仍占位则保持(除非同时设计完成+原型+AutoPRD |
| 【分析】 | 若有编号:计划完成若为空 → 写当日并推工时;**不新建**第二条 |
| 【设计】 | 若有编号:计划完成若为空 → 写当日并推工时;**不新建**第二条 |
| 仅有分析、尚无设计 | **不强制补建【设计】**(与无单快轨区分);回报注明「无设计任务编号」 |
| 仅有设计、无分析 | 收口设计 + 交棒;**不补建分析** |
## 与无单快轨区别
| | 无单快轨 | 编号直推 |
|---|---|---|
| 前提 | 尚无分析/设计阶段单(或明确跳过分析) | 已有分析和/或设计**任务编号** |
| 【分析】 | 禁止创建 | 有编号则收口,无则不建 |
| 【设计】 | 必须新建且当日收口 | 有编号则收口;仅分析无设计时不强制新建 |
| 定位 | 新建后登记编号 | **仅任务编号**定位/反查 |
仍不创建【开发】/【测试】。交棒占位风险见 [handoff-and-rollback.md](handoff-and-rollback.md)。

View File

@@ -0,0 +1,73 @@
# 门禁 PJ · 云效项目选择(强制点选)
**新建需求 / 新建任务树 / 创建迭代 / 其它写入依赖 `spaceIdentifier`** 的操作,项目必须由用户从云效实时列表**点选**。禁止静默使用 `runtime-ids.json` 里的默认 `project.spaceIdentifier`
## 何时触发
| 场景 | 是否必须选项目 |
|---|---|
| 记录需求 / 无单快轨新建 | **必须** |
| 创建迭代(新挂项目空间) | **必须**(与需求同项目时沿用已锁定项,仍须在 Plan 写出项目名+ID |
| 仅推进已有编号(受理确认、开始分析…) | **不必重选**以该编号所在项目为准Plan 写出项目名 |
| 只读查询 | 不强制 |
## 执行顺序(建单前)
1. **实时拉取**云效项目列表Cookie + XSRF
```http
GET /projex/api/workspace/project/search/list
?category=Project&scope=all&toPage=1&pageSize=100
&conditions={"conditionGroups":[[]]}
&extraConditions= + public
&orderBy={"fieldIdentifier":"gmtCreate","format":"input","order":"desc","className":"date"}
&_input_charset=utf-8
```
2. 将结果整理为单选列表:`{name}{customCode}`;选项 id 用 `identifier`spaceId
3. **AskQuestion / Plan 单选**「PJ. 云效项目」;未点选 → **禁止 create**
4. 「批准 Plan」≠ 已选项目Plan 里仍是空选项或写「默认 01_ONEOS」而未点选 → 停。
5. 用户点选后:本轮 apply 全程使用该 `spaceIdentifier`;回报写清项目名 + customCode + spaceId。
6. 拉取成功后可回写 `assets/runtime-ids.json``projects_catalog`(缓存);**缓存不得当作已选项**。
## 无法对应 → 自动重拉一次
「无法对应」任一成立即触发:
| # | 情形 |
|---|---|
| 1 | 口令/预填的项目名、customCode、别名在**当前列表**中 0 命中 |
| 2 | 口令给出的 spaceId / identifier 不在当前列表 |
| 3 | 用户点选的选项 id 在 apply 前校验时已不在列表(列表过期) |
| 4 | 仅命中 `projects_catalog` 缓存、与本次实时列表不一致 |
| 5 | 首次拉取失败后改用了缓存,用户按缓存点选后 create 报项目/空间无效 |
**动作(固定一次):**
1. **立即再调一次**同一 `project/search/list`(强制网络,不用缓存)。
2. 用新列表重新做匹配 / 刷新 Plan 单选选项;可回写 `projects_catalog`
3. 回报注明:`已自动重拉项目列表(因无法对应)`
4. **仍无法对应** → 停,展示最新列表请用户重选;**禁止**再自动拉第 3 次;**禁止**猜一个 spaceId 继续建单。
匹配规则(名/码):忽略大小写;`name` 全等或包含;`customCode` 全等;`name_aliases` 全等。多命中视为无法唯一对应 → 重拉后仍多命中则请用户点选,不自动选定。
## 禁止
- 未询问就写入 `project.spaceIdentifier`(即便 catalog 标了 `suggested`
- 按口令里的「统一运营管理平台」字符串静默映射而不展示列表点选(口令仅作**预填建议**,仍须用户确认点选)
- API 失败时擅自沿用上次默认;应展示 `projects_catalog` 缓存并标明「离线缓存,请确认」,仍须点选;用户确认后若仍无法对应 → 走上一节「自动重拉一次」
- 多项目并行建单却共用一个未确认的 spaceId
- 「无法对应」时循环重拉超过 1 次,或跳过点选直接建单
## 口令预填
```text
记录需求:…;项目=01_ONEOS
```
若口令已含项目名/编号前缀且在实时列表中**唯一命中**Plan 可预勾该选项但仍须用户确认0 命中或多命中 → **先自动重拉一次**再匹配;仍 0/多 → 不预勾,只展示最新列表。
## 脚本
`scripts/list_projects.py`stdout JSON `projects[]`
带查询时:`python3 scripts/list_projects.py --match '01_ONEOS'` —— 0 命中/多命中则自动重拉一次再匹配(`refetched: true`)。

View File

@@ -0,0 +1,58 @@
# 记录需求 · 元字段(优先级 / 标签 / 提交部门 / 提交人)
建单前消费网页 / AutoRDO / 口令中的四类元信息。细则与 `assets/runtime-ids.json` 对齐;**禁止臆造未验证的 fieldIdentifier**。
## 口令形态
```text
记录需求:…;优先级=紧急|高|中|低;标签=…;提交部门=…;提交人=…;推进至=…
```
四字段均可选出现;网页或 AutoRDO 提示里已带的值与口令等价。
## Plan 是否追问
记录需求 **一律**走 [compact-select.md](compact-select.md) 字母表(类型/项目/优先级/标签),即使用户口令已写齐;给出建议压缩串,等用户回 `1a2b3a4d`(或改字母)并「执行」。
| 条件 | 行为 |
|---|---|
| 口令已含类型/项目/优先级/标签 | 对应选项标 ★ + 建议压缩串;**仍须**压缩确认或显式点选 |
| 标签名 0 命中 / 多命中 | **自动重拉一次**标签候选并重生 4.A/B/C…仍失败则停 |
| 仅缺提交部门/提交人 | 压缩 14 确认后,缺则追问或写入描述页脚 |
| 仅缺「推进至」等 | 按既有口令规则;可作 5. 题字母表 |
## 写入策略
### 优先级(已验证)
- 映射:`runtime-ids.json``priority`(紧急 / 高 / 中 / 低)。
- create 时写入 `fieldIdentifier: "priority"`(与 [live-api.md](live-api.md) / `live_create_fast.py` 一致)。
- 未给优先级时Plan 追问;脚本默认「中」仅作既有兜底,口令/网页有值时以用户值为准。
### 标签(已验证)
- 映射:`runtime-ids.json``tags`(按显示名取 tagId
- 标签须 **PATCH** `propertyKey: "tag"`create 带 tag 不落库)。
- 口令/网页给出的标签名若不在候选:按 [compact-select.md](compact-select.md) **自动重拉一次**标签列表并重生选项;仍无则停在 Plan勿猜 ID。
### 提交部门 / 提交人(已验证 · 2026-07-27 · ONEOS-293
| 字段 | fieldIdentifier |
|---|---|
| 提交部门 | `3132597a9718d1c282b7ba5a0c` |
| 提交人 | `9e01269e96f91fbb97d36bf5b3` |
| 规则 | 说明 |
|---|---|
| **写入** | `POST /projex/api/workitem/workitem/field/value/{workitemId}``Content-Type: application/x-www-form-urlencoded`,参数 `fieldValueList` = JSON 数组字符串 `[{"fieldIdentifier","value"}]` |
| **形态** | 均为普通文本 input非人员选择器口令值原样写入 |
| **页脚** | 仍可在描述页脚重复一份,便于检索;**不能替代**字段写入 |
| **计划开始** | 字段 `79`,同一 `field/value` API推荐 `YYYY-MM-DD 12:00:00`。快轨:【交付】/【设计】创建当日写入;【设计】另写计划完成 `80`=`当日 23:59:59` |
| **预计工时** | 字段 `101586` **禁止**直接 PATCH`POST …/time/estimate``spentTime`)登记;删多余用 `DELETE …/time/estimate/{workitemId}/{estimateId}` |
| **实际工时** | `POST …/workitem/time`body **`actualTime`**(非 spentTime+ `gmtStart`/`gmtEnd`epoch ms 字符串);快轨待开发需求默认 **2** |
| **描述更新** | `PATCH …/workitem/{id}/document``{"content","formatType":"RICHTEXT"}` |
| **快轨标签** | 【交付】【设计】建单后 `PATCH propertyKey=tag``propertyValue` 与需求 tagId 一致(多标签逗号拼接) |
## 与描述双段的关系
页脚元信息写在「原始诉求」段末或整篇描述末尾均可,**不得覆盖** `## 产品说明AutoPRD` / `## 工作项编号(系统)` 区块(见 [description-split.md](description-split.md))。

View File

@@ -0,0 +1,63 @@
# 创建迭代并关联交付
产品经理可将已交棒(或已有编号)的多条【交付】任务打进同一云效迭代。
## 口令
```text
创建迭代:版本类型=副;交付任务=ONEOS-a,ONEOS-b,ONEOS-c名称前缀=统一运营管理平台PC端
创建迭代:版本类型=子;交付任务=ONEOS-99名称前缀=统一运营管理平台PC端
```
| 参数 | 规则 |
|---|---|
| 交付任务 | **1..N 个任务编号**(逗号分隔);禁止用标题凑数 |
| 版本类型 | 主 / 副 / 子;未点选则停下询问,禁止默认猜 |
| 名称前缀 | 可选;缺省 `统一运营管理平台PC端`。最终名=`{前缀}{版本号}` |
## 版本号 `V{主}.{副}.{子}`
| 版本类型 | 含义 | 递增 |
|---|---|---|
| **主** | 功能重制 | 主+1副→0子→0V1.3.2→V2.0.0 |
| **副** | 新功能上线 | 副+1子→0V1.3.2→V1.4.0 |
| **子** | bug/优化 | 子+1V1.3.2→V1.3.3 |
### 取基线再递增
1. 拉取当前项目云效迭代列表。
2. 从迭代**名称**解析 `V数字.数字.数字`;旧名 `V数字.数字` 视为 `.0`
3. 同名称前缀内取**最大**版本为基线(主→副→子比较);避免 PC 与小程序串号。
4. 按用户点选类型递增,写入新迭代名称。
5. 无一可解析版本:基线 `V0.0.0` 再递增主→V1.0.0副→V0.1.0子→V0.0.1);或口令显式给起始版本。
禁止:手填与规则冲突的版本号却声称自动生成;禁止用交付标题推断版本类型。
## 创建与关联
| 步骤 | 动作 |
|---|---|
| 1 | 算出新版本 → 拼迭代全名 |
| 2 | 创建迭代(起止日期口令未给则询问或用项目默认,禁止瞎填) |
| 3 | **只挂【交付】**N 个交付任务挂迭代;交付失败不得报完成 |
| 4 | 幂等:同名迭代已存在 → 不新建,补挂尚未关联的交付,回报「复用迭代」 |
| 5 | 回报迭代名、版本号、identifier、已关联交付编号、失败编号 |
**禁止**把需求挂进迭代(需求侧「迭代」字段保持空)。不挂【分析】/【设计】除非口令显式点名。
**不**在本步创建【开发】/【测试】。仍须 Plan 门禁。
### 挂接 API已通 · 校验走 `/extra`
```http
PATCH /projex/api/workitem/workitem/{id}?_input_charset=utf-8
{"workitemIdentifier":"{id}","propertyKey":"sprint","propertyValue":"{sprintId}","operateType":"COVER"}
```
校验(详情主接口**不**含 sprint勿用其判空
```http
GET /projex/api/workitem/workitem/{id}/extra?_input_charset=utf-8
result.sprint[].identifier
```
清空误挂的需求迭代:同上 PATCH`propertyValue:""` + `operateType:"COVER"`(或 `CLEAR`)。

View File

@@ -0,0 +1,63 @@
# 标准路径:待处理 → 待开发交棒
人员/状态等常量见 [../assets/runtime-ids.json](../assets/runtime-ids.json)。**项目空间**须按 [project-selection.md](project-selection.md) 点选,禁止默认直指。查重只用任务编号。
## 步骤 0创建需求
| 云效动作 | 落地 |
|---|---|
| 新建产品类需求 | POST 建单;标题 `【新增】`/`【优化】` |
| 需求描述 | **先** AutoRDO 清洗再写入 `## 原始诉求AutoRDO`;本步不写 AutoPRD |
| 默认状态 | **待处理**;不建任务、不改负责人 |
| 可选推进 | 口令点选目标状态;未选则停在待处理 |
## 步骤 1受理 → 已确认
| 云效动作 | 落地 |
|---|---|
| 状态 | 待处理 → **已确认** |
| 任务 | **仍不建**交付/分析/设计 |
若用户只「创建」未受理:只提示「受理后请推进至已确认」,不自动跳。
## 步骤 2分析中
| 对象 | 动作 |
|---|---|
| 【交付】 | 无则新建;标题 `【交付】`+需求标题;**ASSOCIATED→需求**(勿用 PARENT负责人=创建人/产品;**计划开始仅空时写当日**;不写计划完成;描述=`等待设计任务完成后自动填入`;更新编号区块 |
| 【分析】 | 新建;**TASK_SUB→交付**`parent`+`parentIdentifier`+`createWorkitemRelationInfo=TASK_SUB`);交付「子项」须可见;计划开始=当日(仅空时);负责人默认可=创建人;更新编号区块 |
| 需求 | 状态=`分析中` |
## 步骤 3设计中
| 对象 | 动作 |
|---|---|
| 【交付】 | 已存在则按编号复用;没有则补建;**不改交付计划开始**;不写交付计划完成 |
| 【设计】 | 新建;**TASK_SUB→交付**(同分析);计划开始=当日(仅空时);更新编号区块 |
| 【分析】 | **计划完成**=状态更新日;推算阶段日历工时(见 work-hours |
| 需求 | 状态=`设计中` |
## 步骤 4设计完成
| 对象 | 动作 |
|---|---|
| 【设计】 | 计划完成=当日;推算工时;任务→完成态 |
| 需求 | AutoPRD 写入 `## 产品说明`;挂 ZIP+截图;状态=`设计完成` |
| 【交付】 | 不换负责人;不改计划开始;不写计划完成;描述改为 AutoPRD 正文;同样挂附件 |
顺序与失败门禁见 [description-split.md](description-split.md)。
## 步骤 5待开发交棒本 Skill 终点 · 标准路径)
| 对象 | 动作 |
|---|---|
| 需求 | 状态=`待开发` |
| 【交付】 | 按**任务编号**定位;**负责人→何斐**;不改计划开始;不写计划完成 |
| 【分析】/【设计】 | 不新建;不改已有计划开始;前序未收口按步骤 3/4 处理 |
执行 [handoff-and-rollback.md](handoff-and-rollback.md) §交棒门禁。
**不做:** 【开发】/【测试】、仓库、分支、提测。
快轨 / 编号直推见专文。创建迭代见 [sprint.md](sprint.md)。

View File

@@ -0,0 +1,73 @@
# 计划时间与阶段日历工时
适用于【交付】/【分析】/【设计】统一口径。
## 用途
| 对象 | 计划开始→计划完成 |
|---|---|
| 【交付】 | 需求开工→上线全周期(本 Skill **不**写交付计划完成;上线由后续段) |
| 【分析】 | 分析阶段时长 |
| 【设计】 | 设计阶段时长 |
## 计划开始(不可篡改)
| 对象 | 首次写入 | 之后 |
|---|---|---|
| 【交付】 | 首次进入分析中且字段为空 → 当日 | **禁止覆盖** |
| 【分析】 | 首次创建且为空 → 当日 | **禁止覆盖** |
| 【设计】 | 首次创建且为空 → 当日 | **禁止覆盖** |
日期写入形态:中国时区正午 epoch ms 字符串,见 [../assets/runtime-ids.json](../assets/runtime-ids.json) `fields.plan_start`
## 计划完成
| 环节 | 写计划完成的对象 |
|---|---|
| 推进到设计中 | 【分析】= 状态更新日 |
| 推进到设计完成 | 【设计】= 状态更新日 |
| 无单快轨建设计 | 【设计】= 当日(同轮收口) |
| 编号直推收口 | 口令涉及的分析/设计若计划完成为空 → 当日 |
| 上线/关闭 | 【交付】计划完成(**本 Skill 暂不写** |
## 预计工时 = 阶段日历工时Lead Time
有计划完成且已有计划开始时,写入该对象云效「预计工时」:
```text
workdays = 0
从计划开始日到计划完成日(含首尾)逐日:
周六或周日 → 跳过(除非该日是调休补班)
法定放假日 → 跳过
调休补班日(含周末上班)→ 计入
其余周一~周五 → 计入
预计工时(小时) = workdays × 8
```
**禁止**用「(结束日 开始日 + 1× 8」日历天数算法。
### 语义与脚注(强制)
- 正式名称:**阶段日历工时****不是**投入人天/排期负荷。
- 任务描述末尾固定脚注:
`【系统】预计工时=阶段日历工时工作日×8非人力投入预估`
- 回报写「阶段日历工时 Hh」**禁止**写「需投入 Hh」。
- 本 Skill **不自动写**「人力投入预估」。
### 日历数据源
- 使用 [../assets/cn-workday-calendar.json](../assets/cn-workday-calendar.json)(按自然年;跨年须覆盖起止两侧年份)。
- 缺当年日历 → **停下**提示补日历;**禁止**静默按「仅去周末」算完并报成功。
- 计算脚本:[../scripts/workday_hours.py](../scripts/workday_hours.py)
```bash
python3 scripts/workday_hours.py 2026-03-06 2026-03-09
```
缺计划开始则只写结束、不推工时,回报提示。
## 示例
- 开始=周五、结束=下周一(无节假日)→ 五+一 → 16h
- 区间全在法定放假内 → 0h
- 某周日为调休补班且落在区间内 → 该日计入 8h

View File

@@ -0,0 +1,22 @@
# 工作项编号(系统)
## 权威源
需求描述固定区块(机器可解析;人工只读即可):
```markdown
## 工作项编号(系统)
- 交付ONEOS-xx
- 分析ONEOS-yy无则写无
- 设计ONEOS-zz无则写无
```
## 规则
1. **禁止**仅靠本地会话映射当唯一真相。
2. 每次新建/登记交付·分析·设计编号后,**立即 PATCH 更新该区块**(只改本区块,不动 AutoRDO / AutoPRD 正文)。
3. 操作顺序:口令显式编号 > 读本区块 > ASSOCIATED/SUB 反查校验。
4. 三者冲突 → 停下人工;**仍禁止按标题猜**。
5. 本地缓存仅加速,启动以云效该区块为准。
6. 区块出现两个交付编号 → 停止并列号请人合并。
7. 取消需求:关联任务标取消/废止;**不删**本区块(留痕)。