create-yss-spec 2.2.5 → 2.2.6
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/README.md +1 -1
- package/package.json +1 -1
- package/template/.agents/skills/code-review/SKILL.md +10 -7
- package/template/.agents/skills/code-review/agents/openai.yaml +1 -1
- package/template/.agents/skills/code-review/references/yss-review-standards.md +54 -0
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +48 -2
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +3 -1
- package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.claude/skills/code-review/SKILL.md +10 -7
- package/template/.claude/skills/code-review/agents/openai.yaml +1 -1
- package/template/.claude/skills/code-review/references/yss-review-standards.md +54 -0
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +48 -2
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +3 -1
- package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.codex/skills/code-review/SKILL.md +10 -7
- package/template/.codex/skills/code-review/agents/openai.yaml +1 -1
- package/template/.codex/skills/code-review/references/yss-review-standards.md +54 -0
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +48 -2
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +3 -1
- package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.cursor/skills/code-review/SKILL.md +10 -7
- package/template/.cursor/skills/code-review/agents/openai.yaml +1 -1
- package/template/.cursor/skills/code-review/references/yss-review-standards.md +54 -0
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +48 -2
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +3 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.hermes/skills/code-review/SKILL.md +10 -7
- package/template/.hermes/skills/code-review/agents/openai.yaml +1 -1
- package/template/.hermes/skills/code-review/references/yss-review-standards.md +54 -0
- package/template/.hermes/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration-contract.yaml +48 -2
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +3 -1
- package/template/.hermes/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.pi/skills/code-review/SKILL.md +10 -7
- package/template/.pi/skills/code-review/agents/openai.yaml +1 -1
- package/template/.pi/skills/code-review/references/yss-review-standards.md +54 -0
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +48 -2
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +3 -1
- package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.qoder/skills/code-review/SKILL.md +10 -7
- package/template/.qoder/skills/code-review/agents/openai.yaml +1 -1
- package/template/.qoder/skills/code-review/references/yss-review-standards.md +54 -0
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +48 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +3 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.trae/skills/code-review/SKILL.md +10 -7
- package/template/.trae/skills/code-review/agents/openai.yaml +1 -1
- package/template/.trae/skills/code-review/references/yss-review-standards.md +54 -0
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +48 -2
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +3 -1
- package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/AGENTS.md +2 -2
- package/template/docs/agents/digital-human-roles.md +1 -1
- package/template/docs/agents/digital-human-roles.yaml +7 -6
- package/template/docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md +1 -0
- package/template/docs/process/harness-process-tailoring.md +1 -0
- package/template/docs/process/implementation-repo-integration.md +10 -0
- package/template/docs/templates/review-report-template.md +36 -1
- package/template/scripts/lib/scenario-checks.mjs +9 -0
- package/template/scripts/lib/skill-registry.mjs +88 -0
- package/template/scripts/verify-digital-human-roles-scenarios +12 -0
- package/template/skills-lock.json +2 -2
- package/template.snapshot.json +4 -4
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: code-review
|
|
3
|
-
description: Use when the user wants to review a branch, PR, committed candidate, uncommitted work-in-progress changes, or changes since a fixed point.
|
|
3
|
+
description: Use when the user wants to review a branch, PR, committed candidate, uncommitted work-in-progress changes, or changes since a fixed point. For YSS implementation, Standards must load Slice contract required_skills plus specialist check inputs such as alibaba-java-code-style and yss-ui; do not add a second generic review skill.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Review of a pinned candidate against a fixed point on two core axes, plus UI fidelity when UI is in scope:
|
|
7
7
|
|
|
8
|
-
- **Standards** — does the code conform to this repo's documented coding standards?
|
|
8
|
+
- **Standards** — does the code conform to this repo's documented coding standards **and**, for YSS slices, the specialist check inputs compiled in [yss-review-standards.md](references/yss-review-standards.md)?
|
|
9
9
|
- **Spec** — does the code faithfully implement the originating issue / spec?
|
|
10
|
-
- **UI fidelity** (only when the change has UI impact) — does the candidate match the confirmed prototype and `yss-design-system` / `yss-ui`? Type-check or claiming "already aligned" is not a pass. Invoke those skills' verification notes; do not collapse this axis into Standards or Spec.
|
|
10
|
+
- **UI fidelity** (only when the change has UI impact) — does the candidate match the confirmed prototype and `yss-design-system` / `yss-ui`? Type-check or claiming "already aligned" is not a pass. Invoke those skills' verification notes; do not collapse this axis into Standards or Spec. YSS page-module conventions stay on Standards.
|
|
11
11
|
|
|
12
12
|
Standards and Spec run as **parallel sub-agents** so they don't pollute each other's context, then this skill aggregates their findings. When UI is in scope, add a separate UI fidelity pass after those two reports (do not merge it into either axis).
|
|
13
13
|
|
|
@@ -60,7 +60,9 @@ Look for the originating spec, in this order:
|
|
|
60
60
|
|
|
61
61
|
### 3. Identify the standards sources
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
Compile sources **before** spawning reviewers. For YSS implementation candidates follow [yss-review-standards.md](references/yss-review-standards.md): run machine checks that exist in the implementation repo; then collect repo docs (`CODING_STANDARDS.md` / `CONTRIBUTING.md` if present), every Slice `required_skills` skill file, the impact-conditioned specialist inputs (`alibaba-java-code-style`, `yss-ui`, `yss-domain`, …), and `docs/templates/review-report-template.md`. Missing applicable coverage is `missing_evidence`, not a pass.
|
|
64
|
+
|
|
65
|
+
Anything in the repo that documents how code should be written, such as `CODING_STANDARDS.md` or `CONTRIBUTING.md`, remains a source. It does **not** replace YSS or Alibaba specialist inputs.
|
|
64
66
|
|
|
65
67
|
On top of whatever the repo documents, the Standards axis always carries the **smell baseline** below — a fixed set of Fowler code smells (_Refactoring_, ch.3) that applies even when a repo documents nothing. Two rules bind it:
|
|
66
68
|
|
|
@@ -87,8 +89,9 @@ Each smell reads *what it is* → *how to fix*; match it against the diff:
|
|
|
87
89
|
**Standards sub-agent prompt** — include:
|
|
88
90
|
|
|
89
91
|
- The full candidate manifest, captured candidate, `candidate_digest`, diff/inventory commands and commit list. For Worktree candidates, explicitly include every untracked file.
|
|
90
|
-
- The list of standards-source files you found in step 3, **plus the smell baseline from step 3** pasted in full
|
|
91
|
-
-
|
|
92
|
+
- The list of standards-source files you found in step 3, **plus the smell baseline from step 3** pasted in full. Paste Fowler smells in full. For YSS specialist inputs, pass the exact skill file paths; the reviewer must read them and cite `skill + rule + location`. Do not summarise away mandatory Alibaba or YSS violations to fit a word cap. The 400-word cap applies only to the Fowler smell section.
|
|
93
|
+
- Machine-check commands, exit codes and evidence from step 3. Tooling failure is a hard Standards violation.
|
|
94
|
+
- The brief: "Report — per file/hunk where relevant — (a) every place the diff violates a documented standard or a required YSS / Alibaba specialist rule: cite the skill or file and the rule; (b) any baseline smell you spot: name it and quote the hunk. Distinguish hard violations from judgement calls — documented-standard and mandatory specialist breaches can be hard, but baseline smells are always judgement calls, and a documented repo standard overrides the baseline. Skip anything the machine checks already enforced. Smell section under 400 words; specialist findings have no word cap."
|
|
92
95
|
|
|
93
96
|
**Spec sub-agent prompt** — include:
|
|
94
97
|
|
|
@@ -100,7 +103,7 @@ If the spec is missing, skip the Spec sub-agent and note this in the final repor
|
|
|
100
103
|
|
|
101
104
|
### 5. Aggregate
|
|
102
105
|
|
|
103
|
-
Present the reports under `## Standards` and `## Spec` headings, verbatim or lightly cleaned. If UI is in scope, add `## UI fidelity` from the separate pass. Do **not** merge or rerank findings — the axes are deliberately separate (see _Why separate axes_).
|
|
106
|
+
Present the reports under `## Standards` and `## Spec` headings, verbatim or lightly cleaned. If UI is in scope, add `## UI fidelity` from the separate pass. Fill `docs/templates/review-report-template.md` specialist tables as part of Standards evidence, not a fourth axis. Do **not** merge or rerank findings — the axes are deliberately separate (see _Why separate axes_). A YSS candidate with blank applicable specialist rows, skipped `required_skills`, or unaddressed mandatory violations is `blocked`, not `completed`. Do not close findings by writing implementation in the review session. `violation` / machine-check failure / blank applicable rows go back to the implementer on the original contract path, then recapture the candidate and rerun every axis. `drift` / `new_impacts` / `required_skills` mismatch mark the contract `stale` and return to Router; do not keep coding on the old contract. `not-applicable` is only for untriggered impacts; mandatory gates have no waiver, only repair or a complete `seam-deferred` record.
|
|
104
107
|
|
|
105
108
|
For Worktree mode, recapture the candidate digest after both reports return. If it differs from `candidate_digest`, mark both reports as reviewing a **stale candidate** and return `blocked`; the caller may start a new review against a new capture, but this invocation must not aggregate findings from different bytes. Recheck the same digest again at the completion/checkpoint boundary.
|
|
106
109
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# YSS 审查标准源与机器检查
|
|
2
|
+
|
|
3
|
+
本文件只服务唯一默认审查技能 `code-review`。Alibaba Java、YSS 前端 / 后端 skill 是 **Standards 轴的专项检查输入**,不是第二个通用审查 skill。
|
|
4
|
+
|
|
5
|
+
权威接线:`yss-product-lifecycle/references/orchestration-contract.yaml` 的 `work-unit.code-review.review_standards_route` 与 `review_input`。报告形状:`docs/templates/review-report-template.md`。
|
|
6
|
+
|
|
7
|
+
## 1. 编译标准源
|
|
8
|
+
|
|
9
|
+
按顺序收集,缺项写 `not-applicable` 及原因,不得省略适用项:
|
|
10
|
+
|
|
11
|
+
1. 仓库文档:`CODING_STANDARDS.md`、`CONTRIBUTING.md` 或实现仓等价文件(若存在)。
|
|
12
|
+
2. Slice Implementation Contract 的 `required_skills`:对每个技能读取 `.agents/skills/<id>/SKILL.md` 及该 skill 指明的 references。
|
|
13
|
+
3. 影响面专项检查输入(与合同并集,不得互相替代):
|
|
14
|
+
- 后端:`alibaba-java-code-style`、`yss-domain`、`yss-application`、`yss-repository`、`yss-web-controller`、`yss-dto`、`mapstruct`、`lombok`
|
|
15
|
+
- UI:`yss-ui`、`yss-design-system`、`yss-page-module-development`
|
|
16
|
+
4. 报告模板中的后端 / 前端门禁表。空着的适用行视为 `missing_evidence`。
|
|
17
|
+
|
|
18
|
+
YSS 页面模块约定(YTable、YssFormily、页面骨架等)走 Standards,不并入 UI fidelity。UI fidelity 只核原型与状态矩阵。
|
|
19
|
+
|
|
20
|
+
审查者只读这些 skill,不得用它们写实现路径。`role.test-engineer` 任务包禁止 `implement` 与脚手架生成器。
|
|
21
|
+
|
|
22
|
+
## 2. 机器检查
|
|
23
|
+
|
|
24
|
+
在派发 Standards / Spec 子审查之前,对实现仓**已登记且当前可执行**的命令实际跑一遍:
|
|
25
|
+
|
|
26
|
+
- 后端优先:切片合同里的 `./mvnw` 验证;若工程已配置 Checkstyle / P3C / Spotless / `validate`,一并执行。
|
|
27
|
+
- 前端优先:切片合同里的 `pnpm` 验证;若存在 `pnpm lint` / `pnpm type-check`,一并执行。
|
|
28
|
+
|
|
29
|
+
记录命令、退出码、时间和证据引用。退出码非 0 记为 Standards **hard violation**。
|
|
30
|
+
|
|
31
|
+
仓库没有对应工具时,该工具行写 `not-applicable` 加原因。可被工具检查的 Alibaba / ESLint 规则若工具没跑、LLM 也没按原文引用规则,不得记 `pass`。无法 lint 的分层、页面骨架、Formily 约定由 LLM 按 skill 原文引用。
|
|
32
|
+
|
|
33
|
+
## 3. 完成阻断
|
|
34
|
+
|
|
35
|
+
出现以下任一情况时,`work-unit.code-review` 不得 `completed`:
|
|
36
|
+
|
|
37
|
+
- 未消费合同 `required_skills` 或漏掉命中影响面的专项检查输入
|
|
38
|
+
- 报告模板适用行空白或只写“符合 YSS / 符合阿里规范”
|
|
39
|
+
- mandatory Alibaba 或 YSS 门禁 `violation` 未关闭
|
|
40
|
+
- 机器检查失败,或可检查规则既无工具结果也无原文引用
|
|
41
|
+
- 用第二个通用审查 skill 代替 `code-review`
|
|
42
|
+
|
|
43
|
+
## 4. Finding 分流与豁免
|
|
44
|
+
|
|
45
|
+
产品切片与模板维护使用**同一闭环**;只是强度不同:切片绑定当前 Slice Implementation Contract,模板维护绑定 L1 / L2 / L3。权威字段:`review_standards_route.finding_disposition`。
|
|
46
|
+
|
|
47
|
+
审查者只记录 finding,不得当场改实现代码。
|
|
48
|
+
|
|
49
|
+
| 类型 | 动作 |
|
|
50
|
+
|---|---|
|
|
51
|
+
| `violation`、机器检查失败、适用行空白、`missing_evidence` | 实现者在**原合同允许路径**内修复;任何修复使候选失效,必须重新捕获并重跑 Standards、Spec、UI fidelity(若命中)和 fresh verification |
|
|
52
|
+
| `drift`、`new_impacts`、`required_skills` 与真实影响不一致 | 合同标 `stale`,回 Router 或更早生命周期阶段;禁止在旧合同上继续编码 |
|
|
53
|
+
|
|
54
|
+
`not-applicable` 仅当影响面未命中。命中后的 mandatory 不得豁免;只允许修复,或写完整 `seam-deferred`(风险、责任人、后续 Ticket、验证计划、目标版本或发布日期)。禁止为日常 Alibaba / YSS 新增生物人豁免门禁;安全 / 公共 API 仍走既有 `TODO-HUMAN-REVIEW` 与生物人门禁。
|
|
@@ -35,7 +35,7 @@ Matt 的 `grill-with-docs`、`to-spec`、`to-tickets`、`implement` 等保留为
|
|
|
35
35
|
| 系统 / 数据架构与工程契约 `stage.system-data-engineering` | OpenAPI Draft/Freeze、数据架构、工程基线、架构审查;按领域影响执行 Tactical DDD Check | `work-unit.technical-analysis`;`yss-router` + `yss-openapi-governance` / `yss-openapi-draft-review`、`codebase-design`、`implementation-repo-onboarding`、`yss-tactical-design` | API/架构契约冻结;无 API 影响有明确记录;战术模型无未解释冲突;脚手架策略满足;`gate.openapi-draft-reviewed`、`gate.design-reviewed`、`gate.openapi-frozen`、`gate.engineering-baseline-accepted`、`gate.architecture-reviewed` |
|
|
36
36
|
| Ticket 正式化 `stage.ticket-formalization` | 功能父 Ticket、垂直切片、Slice Implementation Contract | 原生 `work-unit.ticket-decomposition`;`yss-router`;`to-tickets` 为兼容入口;生命周期复算 | 依赖、验收、测试 seam 可执行;合同已批准、持久化且为当前版本;`gate.slice-contract-approved`、`gate.slice-ready-for-agent` |
|
|
37
37
|
| 垂直切片实现 `stage.vertical-slice-implementation` | 前端/后端代码、TDD 证据、YSS Skill Execution Result | 原生 `work-unit.slice-implementation`;`yss-router` + `tdd`;前端按 `yss-ui` + `yss-page-module-development`,后端按 Router 最小闭包;`implement` 为兼容入口 | 仅接收已完成 Ticket 正式化、已绑定垂直切片且 `ready-for-agent` 公式通过的输入;只写允许路径;业务行为用 `tdd` 的 `behavior-tdd` 模式;UI 影响必须有还原计划 |
|
|
38
|
-
| 验证 / 发布 / 复盘 `stage.verification-release-retrospective` | 不可变候选快照、review 结论、fresh verification、发布 / 回滚证据、复盘记录 | `work-unit.frontend-implementation-verification` + `work-unit.code-review` + `work-unit.release-and-retrospective`;`code-review`
|
|
38
|
+
| 验证 / 发布 / 复盘 `stage.verification-release-retrospective` | 不可变候选快照、review 结论、fresh verification、发布 / 回滚证据、复盘记录 | `work-unit.frontend-implementation-verification` + `work-unit.code-review` + `work-unit.release-and-retrospective`;`code-review` 独立于实现者,Standards 消费合同 `required_skills` 与 YSS / Alibaba 专项检查输入;UI 影响追加 `yss-ui` + `yss-design-system` 的 UI fidelity 轴;发布 / 复盘由生命周期持有 | findings 已按合同分流处理(修复后全轴复审或 stale 回 Router);同一候选快照通过全部审查轴、专项覆盖与验证;UI 影响追加 `gate.frontend-implementation-verified`;`gate.release-ready` 仍须生物人 |
|
|
39
39
|
|
|
40
40
|
## 前端实现还原硬检查
|
|
41
41
|
|
|
@@ -26,7 +26,7 @@ Matt skills 决定如何工作;YSS 生命周期决定是否允许推进;YSS
|
|
|
26
26
|
| 切片 | 原生 `work-unit.ticket-decomposition`;`to-tickets`(用户显式兼容) | 仅在冻结/无影响记录后拆垂直切片,初始 Ticket 状态为 `ready-for-human` |
|
|
27
27
|
| 实现 | 原生 `work-unit.slice-implementation`;`implement`(用户显式兼容) | 当前合同批准并持久化后执行;内部使用 `tdd`,结果回交后再次核验 |
|
|
28
28
|
| Bug | `diagnosing-bugs`、`tdd` | 先建立红色反馈;高风险影响升级上游门禁 |
|
|
29
|
-
| 审查 | `code-review` |
|
|
29
|
+
| 审查 | `code-review` | 唯一默认代码审查入口;审查者独立且不得写实现;Standards 消费 Spec、仓库治理规则、Slice `required_skills` 和 YSS / Alibaba 专项检查输入;finding 按合同分流修复或 stale 回 Router |
|
|
30
30
|
| 跨上下文 | `handoff` | 保存来源、阶段、未决项、命令和下一责任人 |
|
|
31
31
|
| 阶段边界 | `PHASE-BOUNDARIES.md` | 按 `Continue → /clear → /handoff → subagent → /compact` 选择上下文动作;只记录证据,不扩展生命周期状态 |
|
|
32
32
|
| 解释未落地 | `wait-what` | 只重新解释当前结论,不改变阶段、门禁、Ticket 或 `ready-for-agent` |
|
|
@@ -76,7 +76,7 @@ Router 状态映射为:`draft → completed`、`blocked → blocked`、`ready-
|
|
|
76
76
|
|
|
77
77
|
## Review 候选与 Git 授权
|
|
78
78
|
|
|
79
|
-
YSS 调用 `code-review` 前必须形成 review input,至少包含 `review_mode`、`review_base_ref`、`implementation_candidate_ref`、`candidate_snapshot_ref`、`candidate_digest`、`spec_ref`、`ticket_ref`、`slice_contract_ref`、`build_architecture_checklist_ref` 和 `yss_execution_result_refs`,并满足 `orchestration-contract.yaml.review_input.manifest_required_by_mode
|
|
79
|
+
YSS 调用 `code-review` 前必须形成 review input,至少包含 `review_mode`、`review_base_ref`、`implementation_candidate_ref`、`candidate_snapshot_ref`、`candidate_digest`、`spec_ref`、`ticket_ref`、`slice_contract_ref`、`build_architecture_checklist_ref` 和 `yss_execution_result_refs`,并满足 `orchestration-contract.yaml.review_input.manifest_required_by_mode`。Standards 还必须编译 `review_standards_route`:合同 `required_skills`、影响面专项检查输入、报告模板与 `finding_disposition`;机器检查按 `run_if_present` 执行。`committed` 审查 merge-base 到不可变 `HEAD`;`worktree` 一次捕获 merge-base 到 working tree 的 committed、staged、unstaged 和 untracked 内容,使用 `yss-worktree-candidate-v1` 规定的 raw path、uint64 big-endian 长度、tracked/untracked record 和不支持条目阻断规则计算 SHA-256,让两个 Reviewer 消费同一不可变快照,并在返回和完成 checkpoint 复核摘要未变化。缺少输入、候选为空、专项覆盖缺失、未关闭 mandatory `violation`、适用行空白或摘要变化时返回 `blocked`,不能缩小审查范围、另起通用审查 skill、由审查者改实现,或合并不同候选的结论。`violation` 类 finding 交实现者在原合同路径修复后全轴复审;`drift` / `new_impacts` 使合同 `stale` 并回 Router。
|
|
80
80
|
|
|
81
81
|
Matt `implement` 的通用提交指令不构成 YSS Git 授权。只有用户明确给出 `commit_authorized` 为 `true`、非空 `commit_scope` 和 `commit_authorization_ref` 时才能 commit;只有明确给出 `push_authorized` 为 `true`、非空 `push_scope` 和 `push_authorization_ref` 时才能 push。缺少任一字段时保持工作区不变,只输出 checkpoint 判断;不得把 `orchestrate`、实现授权、当前分支、测试通过或负责人要求解释为隐含授权。`git-submodule` 还必须按仓授权、禁止 detached HEAD 提交,并先推子仓再更新父仓 gitlink。
|
|
82
82
|
|
|
@@ -308,8 +308,46 @@ work_unit_routes:
|
|
|
308
308
|
work-unit.code-review:
|
|
309
309
|
native: {source: yss-product-lifecycle, skill: code-review, invocation_mode: model-invoked}
|
|
310
310
|
primary_skill: code-review
|
|
311
|
-
supporting_skills: []
|
|
312
|
-
skills: [code-review]
|
|
311
|
+
supporting_skills: [alibaba-java-code-style, yss-ui, yss-design-system, yss-page-module-development, yss-domain, yss-application, yss-repository, yss-web-controller, yss-dto, mapstruct, lombok]
|
|
312
|
+
skills: [code-review, alibaba-java-code-style, yss-ui, yss-design-system, yss-page-module-development, yss-domain, yss-application, yss-repository, yss-web-controller, yss-dto, mapstruct, lombok]
|
|
313
|
+
review_standards_route:
|
|
314
|
+
unique_default_skill: code-review
|
|
315
|
+
second_generic_review_skill: forbidden
|
|
316
|
+
report_template: docs/templates/review-report-template.md
|
|
317
|
+
contract_required_skills: required
|
|
318
|
+
write_implementation: forbidden
|
|
319
|
+
machine_checks:
|
|
320
|
+
run_if_present: true
|
|
321
|
+
missing_tooling: not-applicable-with-reason
|
|
322
|
+
checkable_rule_without_machine: not-a-pass
|
|
323
|
+
conditional_skills:
|
|
324
|
+
backend_impact: [alibaba-java-code-style, yss-domain, yss-application, yss-repository, yss-web-controller, yss-dto, mapstruct, lombok]
|
|
325
|
+
ui_impact: [yss-ui, yss-design-system, yss-page-module-development]
|
|
326
|
+
not_applicable_reasons:
|
|
327
|
+
backend_impact: no_backend_impact
|
|
328
|
+
ui_impact: no_ui_impact
|
|
329
|
+
finding_disposition:
|
|
330
|
+
same_loop_for: [product-slice, template-maintenance]
|
|
331
|
+
intensity:
|
|
332
|
+
product-slice: slice-contract
|
|
333
|
+
template-maintenance: L1-L2-L3
|
|
334
|
+
reviewer_write_implementation: forbidden
|
|
335
|
+
repair_then_full_rereview:
|
|
336
|
+
kinds: [violation, machine_check_failure, blank_applicable_row, missing_evidence]
|
|
337
|
+
actor: implementer
|
|
338
|
+
on_original_contract: true
|
|
339
|
+
then: recapture_candidate_and_rerun_all_axes
|
|
340
|
+
stale_and_reroute:
|
|
341
|
+
kinds: [drift, new_impacts, required_skills_mismatch]
|
|
342
|
+
mark_contract: stale
|
|
343
|
+
continue_coding_on_old_contract: forbidden
|
|
344
|
+
next: router-or-earlier-lifecycle
|
|
345
|
+
exemption_policy:
|
|
346
|
+
not_applicable: impact_not_triggered_only
|
|
347
|
+
mandatory_waiver: forbidden
|
|
348
|
+
allowed_exits: [repair, seam-deferred-complete]
|
|
349
|
+
new_human_waiver_gate: forbidden
|
|
350
|
+
existing_human_gates_unchanged: true
|
|
313
351
|
applies_when: implementation_candidate_exists
|
|
314
352
|
not_applicable_reason: no_implementation_candidate
|
|
315
353
|
work-unit.release-and-retrospective:
|
|
@@ -394,7 +432,15 @@ review_input:
|
|
|
394
432
|
schema_version: 1
|
|
395
433
|
required: [review_mode, review_base_ref, implementation_candidate_ref, candidate_snapshot_ref, candidate_digest, spec_ref, ticket_ref, slice_contract_ref, build_architecture_checklist_ref, yss_execution_result_refs]
|
|
396
434
|
nullable: [spec_ref]
|
|
435
|
+
unique_default_skill: code-review
|
|
436
|
+
second_generic_review_skill: forbidden
|
|
397
437
|
axes: [standards, spec, ui_fidelity_if_ui_impact]
|
|
438
|
+
standards_sources: [repo_coding_standards, slice_contract_required_skills, specialist_check_inputs, review_report_template]
|
|
439
|
+
completed_requires_specialist_coverage: true
|
|
440
|
+
finding_disposition_required: true
|
|
441
|
+
completed_requires_no_open_mandatory_violations: true
|
|
442
|
+
completed_requires_no_blank_applicable_rows: true
|
|
443
|
+
reviewer_write_implementation: forbidden
|
|
398
444
|
repair_invalidates_candidate: true
|
|
399
445
|
repair_action: recapture_candidate_and_rerun_all_axes
|
|
400
446
|
modes: [committed, worktree]
|
|
@@ -65,7 +65,9 @@ tracker 选择和冲突按 `docs/agents/issue-tracker.md` 裁决:已持久化
|
|
|
65
65
|
- 调用 `code-review` 前先固定 review input:`review_mode`、`review_base_ref`、`implementation_candidate_ref`、`candidate_snapshot_ref`、`candidate_digest`、Spec/Ticket、Slice Implementation Contract、Build Architecture Checklist 和 YSS Skill Execution Result 引用。`committed` 模式审查不可变 `HEAD`;`worktree` 模式一次捕获 committed、staged、unstaged 和 untracked 内容。必须按 `orchestration-contract.yaml.review_input` 的 manifest 按模式必填字段及 `yss-worktree-candidate-v1` 字节流(raw path、uint64 big-endian 长度、tracked/untracked record)计算 SHA-256,两个 Reviewer 必须消费同一不可变快照。返回后或完成 checkpoint 摘要变化时返回 `blocked`,由编排器决定重新审查。候选为空、漏项或 fixed point 不可解析时阻断。
|
|
66
66
|
- 小改动和中等变更可由同一独立执行者完成 `code-review` 与 fresh verification,并在同一报告中分别记录 findings、命令、结果和残余风险。
|
|
67
67
|
- 该执行者必须独立于实现者;新模块、高风险变更、职责冲突或需双人控制时,Reviewer 与 Verifier 分开。
|
|
68
|
-
- `code-review` 是唯一默认代码审查 skill。GitLab、CI、Sonar、Alibaba Java
|
|
68
|
+
- `code-review` 是唯一默认代码审查 skill。GitLab、CI、Sonar、Alibaba Java 与 YSS 前端 / 后端 skill 作为仓库规则或专项检查输入接入 Standards 轴,由 `review_standards_route` 按影响面编译;不再叠加第二个通用审查 skill。漏掉合同 `required_skills`、适用报告行空白、mandatory `violation` 未关闭或可机器检查规则既无工具结果也无原文引用时,不得 `completed`。
|
|
69
|
+
- 产品切片与模板维护共用同一 finding 闭环,强度分别绑定 Slice 合同与 L1 / L2 / L3。`violation`、机器检查失败、适用行空白由实现者在原合同路径修复,再重新捕获候选并全轴复审。`drift`、`new_impacts`、`required_skills` 与真实影响不一致时合同 `stale`,回 Router 或更早阶段,禁止在旧合同上继续编码。审查者不得写实现。`not-applicable` 仅当影响面未命中;命中后 mandatory 不得豁免,只允许修复或完整 `seam-deferred`。禁止为日常 Alibaba / YSS 新增生物人豁免门禁。
|
|
70
|
+
- 独立 Reviewer 必须与实现者不同实例,并在能执行已登记 `pnpm` / `./mvnw` 的运行时中审查。模板源 `.cursor/environment.json` 只服务模板校验,不替代实现仓审查运行时。不为此再创建第二个 Cloud 审查环境或 `/code-review` skill。
|
|
69
71
|
- UI 影响切片将 `UI fidelity` 作为 `code-review` 的条件第三轴;任何修复都会使候选摘要失效,必须重新捕获候选并重跑 Standards、Spec、UI fidelity 和 fresh verification。
|
|
70
72
|
|
|
71
73
|
## Git 授权
|
|
@@ -62,7 +62,7 @@ AND UI 影响切片的前端实现还原计划已通过 schema 校验、`templat
|
|
|
62
62
|
|
|
63
63
|
## Review 与 Git 授权状态
|
|
64
64
|
|
|
65
|
-
进入代码审查时保存 `review_mode`、`review_base_ref`、`implementation_candidate_ref`、`candidate_snapshot_ref`、`candidate_digest` 及 Spec、Ticket、合同、Checklist、YSS Execution Result
|
|
65
|
+
进入代码审查时保存 `review_mode`、`review_base_ref`、`implementation_candidate_ref`、`candidate_snapshot_ref`、`candidate_digest` 及 Spec、Ticket、合同、Checklist、YSS Execution Result 引用,并记录专项检查覆盖与机器检查结果。`worktree` 候选必须一次捕获 committed、staged、unstaged 和 untracked 文件;manifest 的按模式必填字段以及 `yss-worktree-candidate-v1`(raw path、uint64 big-endian 长度、tracked/untracked record、symlink 和不支持条目)以 `orchestration-contract.yaml.review_input` 为唯一执行定义。两个 Reviewer 消费同一不可变快照;返回后或完成 checkpoint 摘要变化则返回 `blocked` 并重新审查。Finding 分流不新增生命周期状态:`violation` 仍在当前合同路径由实现者修复后复审;`drift` / `new_impacts` 把合同标 `stale` 并走既有重路由。该清单只作为审查证据。
|
|
66
66
|
|
|
67
67
|
Git 动作分别保存 `commit_authorized`、`commit_scope`、`commit_authorization_ref`、`push_authorized`、`push_scope`、`push_authorization_ref`。只有授权值严格为 `true`、范围和用户授权引用均非空时才执行相应动作;缺失授权时保持工作区不变并记录 checkpoint 判断。`git-submodule` 另保存每仓授权、`checkout_state` 和先子后父顺序;空 gitlink、detached HEAD 或 `--force` 覆盖挂载点时不得当成普通目录 commit / 脚手架。
|
|
68
68
|
|
package/template/AGENTS.md
CHANGED
|
@@ -58,7 +58,7 @@ README、用户指南、根目录 `CLAUDE.md` 和其他说明文档只引用或
|
|
|
58
58
|
| 系统 / 数据架构与工程契约 `stage.system-data-engineering` | `work-unit.technical-analysis` | `yss-router`;按影响使用 `yss-openapi-governance`、`yss-openapi-draft-review`、`codebase-design`、`implementation-repo-onboarding`、`yss-tactical-design` | OpenAPI Draft / Freeze、数据架构、工程基线、架构审查;无 API 影响记录;必要时 Tactical DDD Check;`gate.openapi-draft-reviewed`、`gate.design-reviewed`、`gate.openapi-frozen`、`gate.engineering-baseline-accepted`、`gate.architecture-reviewed` |
|
|
59
59
|
| Ticket 正式化 `stage.ticket-formalization` | `work-unit.ticket-decomposition` | `yss-product-lifecycle` + `yss-router`;`to-tickets` 仅为显式兼容入口 | 功能父 Ticket、垂直切片、Slice Implementation Contract;切片初始 `ready-for-human`;`gate.slice-contract-approved`、`gate.slice-ready-for-agent` |
|
|
60
60
|
| 垂直切片实现 `stage.vertical-slice-implementation` | `work-unit.slice-implementation` | `yss-router` + `tdd`;UI 影响追加 `yss-ui`、`yss-page-module-development` 及条件专项 skill;`implement` 仅为显式兼容入口 | 前后端代码、TDD、YSS Skill Execution Result;仅允许 `ready-for-agent` 且合同当前 |
|
|
61
|
-
| 验证 / 发布 / 复盘 `stage.verification-release-retrospective` | `work-unit.frontend-implementation-verification`、`work-unit.code-review`、`work-unit.release-and-retrospective` | `code-review
|
|
61
|
+
| 验证 / 发布 / 复盘 `stage.verification-release-retrospective` | `work-unit.frontend-implementation-verification`、`work-unit.code-review`、`work-unit.release-and-retrospective` | `code-review`(唯一入口,Standards 消费 YSS / Alibaba 专项检查输入);UI 影响追加 `yss-ui` + `yss-design-system`;发布 / 复盘由 `yss-product-lifecycle` 持有 | 不可变候选快照、独立审查、findings 按合同分流、fresh verification、发布 / 回滚证据、复盘;UI 影响追加 `gate.frontend-implementation-verified`;`gate.release-ready` |
|
|
62
62
|
|
|
63
63
|
- 生命周期注册表中的条件门禁全部按影响面强制。命中触发条件时必须完成;未命中时只记录 `not-applicable` 及原因,不生成空文档;不得把产物、工作单元或证据统称为门禁。
|
|
64
64
|
- 安全 / 权限不设独立生命周期资料或专属门禁。日常功能不做额外登记、`not-applicable` 或推导校验;只有需求或冻结资产明确要求改变认证、授权、租户隔离、敏感数据或合规行为时,才把该行为写入普通 Spec、API、架构、验收和测试 seam,并仅按实际 UI、API、Backend、Data、High-risk 影响触发既有门禁。普通 action 注册、沿用既有认证中间件、未变化的 `401` / `403`、一般字段、SQL / DDL / 迁移和上传 / 下载本身不构成安全 / 权限专项。
|
|
@@ -114,7 +114,7 @@ README、用户指南、根目录 `CLAUDE.md` 和其他说明文档只引用或
|
|
|
114
114
|
|
|
115
115
|
## 10. 独立审查、验证和追踪
|
|
116
116
|
|
|
117
|
-
- 实现者不能承担命中的独立审查(含数字人)。模板维护按 L1 / L2 / L3 分别使用 self-check / 人工 checkpoint、聚焦独立审查、正式独立审查;模板发布、代码切片和高风险变更仍必须由其他 Agent
|
|
117
|
+
- 实现者不能承担命中的独立审查(含数字人)。模板维护按 L1 / L2 / L3 分别使用 self-check / 人工 checkpoint、聚焦独立审查、正式独立审查;模板发布、代码切片和高风险变更仍必须由其他 Agent 或独立审查者完成。产品切片与模板维护共用同一 finding 闭环:`violation` 由实现者在原合同路径修复后重新捕获并全轴复审;`drift` / `new_impacts` 使合同 `stale` 并回 Router。审查者不得写实现。命中后的 mandatory 不得豁免;未命中才 `not-applicable`。
|
|
118
118
|
- 任何“完成 / 可合并 / 可发布”结论必须基于 fresh verification,不接受“之前跑过”或实现者自述。
|
|
119
119
|
- 会签门禁按 `docs/agents/digital-human-roles.yaml` 的 `gate_policy` 关闭,会签文件经 `scripts/verify-approval-record` 核验;`gate.release-ready`、对外商务承诺和运行时外部副作用仍须生物人。
|
|
120
120
|
- 在会签暂停、handoff、进入实现、合并或发布边界集中同步范围、验证证据、风险、会签点、Ticket 状态和下一步;阻塞、责任人变化或资产单独批准时立即同步。
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
| 执行态 | Explorer / Drafter / Worker / Reviewer / Verifier | 数字人角色 |
|
|
17
17
|
| 运行时绑定 | 如何在 Cursor / Claude / Grok 等落地 | 角色职责本身 |
|
|
18
18
|
|
|
19
|
-
一次数字人任务包同时写明 `task_id`、`work_unit_id`、`actor_id`、数字人角色、执行态、当前 `runtime_id`,以及从角色表复制的 `core_skills` / `forbidden_skills`。可用 `taskPackageDefaults(roleId)`(`scripts/lib/digital-human-roles.mjs
|
|
19
|
+
一次数字人任务包同时写明 `task_id`、`work_unit_id`、`actor_id`、数字人角色、执行态、当前 `runtime_id`,以及从角色表复制的 `core_skills` / `forbidden_skills`。可用 `taskPackageDefaults(roleId)`(`scripts/lib/digital-human-roles.mjs`)读取,禁止手写第二套技能包。`role.test-engineer` 的 core_skills 含 YSS / Alibaba 专项 skill,仅作为 `code-review` Standards 只读输入,不得写实现;finding 交实现者修复或回 Router,审查者不得当场改代码。任务包 canonical Schema 为 `docs/process/schemas/digital-human-task-package.schema.json`,按 `contract.kind` 选择生命周期、切片实现或模板维护合同。
|
|
20
20
|
|
|
21
21
|
## 会签人
|
|
22
22
|
|
|
@@ -157,7 +157,7 @@ roles:
|
|
|
157
157
|
title: YSS 后端工程师
|
|
158
158
|
stages: [stage.system-data-engineering, stage.ticket-formalization, stage.vertical-slice-implementation, stage.verification-release-retrospective]
|
|
159
159
|
draft_artifact_ids: [artifact.openapi-draft, artifact.data-architecture]
|
|
160
|
-
core_skills: [yss-router, yss-tactical-design, yss-domain, yss-application, yss-repository, yss-mybatis, yss-web-controller, yss-dto, yss-exception, yss-validation, tdd, yss-ddd-scaffold-generator]
|
|
160
|
+
core_skills: [yss-router, yss-tactical-design, yss-domain, yss-application, yss-repository, yss-mybatis, yss-web-controller, yss-dto, mapstruct, lombok, alibaba-java-code-style, yss-exception, yss-validation, tdd, yss-ddd-scaffold-generator]
|
|
161
161
|
forbidden_skills: [yss-ui, yss-page-module-development, yss-formily, yss-frontend-scaffold-generator, yss-antd-design, page-list-module, page-form-module]
|
|
162
162
|
description: >-
|
|
163
163
|
Own OpenAPI Draft, data-architecture contributions, and backend tests.
|
|
@@ -172,14 +172,15 @@ roles:
|
|
|
172
172
|
stages: [stage.spec-architecture, stage.vertical-slice-implementation, stage.verification-release-retrospective]
|
|
173
173
|
draft_artifact_ids: [artifact.frontend-implementation-verification]
|
|
174
174
|
owned_evidence_ids: [evidence.fresh-verification, evidence.frontend-implementation-verification]
|
|
175
|
-
core_skills: [tdd, diagnosing-bugs, code-review]
|
|
175
|
+
core_skills: [tdd, diagnosing-bugs, code-review, alibaba-java-code-style, yss-ui, yss-design-system, yss-page-module-development, yss-domain, yss-application, yss-repository, yss-web-controller, yss-dto, mapstruct, lombok]
|
|
176
176
|
forbidden_skills: [yss-ddd-scaffold-generator, yss-frontend-scaffold-generator, implement, to-spec]
|
|
177
177
|
description: >-
|
|
178
178
|
Own test code, defect records, fresh verification, and frontend
|
|
179
|
-
implementation verification evidence. Review every implementation slice
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
179
|
+
implementation verification evidence. Review every implementation slice
|
|
180
|
+
through the unique code-review skill, loading YSS and Alibaba specialist
|
|
181
|
+
skills as read-only Standards sources. Recommend release readiness; do
|
|
182
|
+
not close gate.release-ready. Do not change product scope or write
|
|
183
|
+
feature implementation. Must be a different instance from the implementer.
|
|
183
184
|
|
|
184
185
|
stage_groups:
|
|
185
186
|
- id: group.discovery
|
|
@@ -5,5 +5,6 @@ Matt Pocock Engineering Skills 提供轻量的澄清、实现、TDD、诊断和
|
|
|
5
5
|
## 进入与退出
|
|
6
6
|
|
|
7
7
|
- Matt user-invoked 的 `grill-with-docs`、`to-spec`、`to-tickets` 和 `implement` 必须由用户显式启动,任何 skill 不得自动调用它们;YSS 生命周期只准备、校验和验收其结果。所有 Matt model-invoked skill 仍须遵守 `AGENTS.md` 的阶段、门禁和证据要求,并只能在生命周期允许的工作单元中调用。
|
|
8
|
+
- `code-review` 保持唯一默认审查入口。YSS 适配把 Slice `required_skills`、`alibaba-java-code-style` 与命中的 `yss-ui` / `yss-domain` 等专项 skill 编译为 Standards 检查输入,并要求实现仓已有的 `pnpm` / `./mvnw` 机器检查;禁止再增加第二个通用审查 skill 或专用审查 Cloud 环境来代替这条接线。审查 finding 按编排合同分流:实现者修复后全轴复审,或合同 `stale` 后回 Router;审查者不得写实现。
|
|
8
9
|
- `template-source` 只执行模板维护流程,不生成具体产品 Spec、原型、OpenAPI 或垂直切片 Ticket。
|
|
9
10
|
- Agent 完成工作单元后返回可核验的 evidence refs、变更资产、验证命令、残余风险和下一路由。
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
3. 发布、合并或阶段完成时按整体候选重新判定;不得把共同改变整体语义的修改拆成多个 L1/L2 规避 L3。
|
|
45
45
|
4. RED 用于证明行为差异。L1 不人为构造失败;L2 可使用已有失败、最小 fixture 或现有测试修改前失败;只有行为无法确定性表达时才运行聚焦压力场景。L3 使用 `maintaining-skills` 并执行本节定义的完整 RED、GREEN、REFACTOR 和压力场景要求。
|
|
46
46
|
5. 模板发布候选固定按 L3 聚合验证,但不追溯补造每个既有 L1/L2 修改的独立 RED。
|
|
47
|
+
6. 模板维护与产品切片使用同一 finding 闭环:`violation` / 机器检查失败 / 适用行空白由实施者修复后重新验证并按本表强度复审;`drift` / `new_impacts` 升级影响面并重新分级,禁止在旧合同或旧 checkpoint 上继续编码。审查者不得写实现。未命中的条件项才 `not-applicable`;命中后不得豁免。
|
|
47
48
|
|
|
48
49
|
每个模板维护 checkpoint 使用以下轻量合同;L1/L2 可直接写入主 Ticket 或集中 checkpoint,不要求新增独立文档:
|
|
49
50
|
|
|
@@ -32,6 +32,16 @@ apps/
|
|
|
32
32
|
- Ticket、Slice Implementation Contract、CI 和 Review 证据必须写下实际执行的上述命令。既有仓库缺少 `pnpm` 或 Maven Wrapper 时,先记录受控例外、替代命令和责任人,再执行。
|
|
33
33
|
- 本模板源仓库没有产品 frontend / backend 运行时;模板源维护侧的 Node 校验命令和环境约束只记录在 `.template-source/` 治理区及 CI 配置中,不属于项目实例实现命令。
|
|
34
34
|
|
|
35
|
+
## 1.4 独立审查运行时
|
|
36
|
+
|
|
37
|
+
`work-unit.code-review` 仍使用唯一 skill `code-review`,不新增第二套审查环境或审查 skill。独立 Reviewer 必须与实现者不同 `actor_id`,并在**能执行已登记验证命令**的运行时中工作:
|
|
38
|
+
|
|
39
|
+
- 前端:已登记项目根的 `pnpm` 测试 / type-check / lint(若存在)。
|
|
40
|
+
- 后端:已登记项目根的 `./mvnw` 校验 / 测试;若工程已配置 Checkstyle、P3C 或 Spotless,审查时实际执行。
|
|
41
|
+
- `git-submodule` 必须递归检出;空 gitlink 不得当作「没有工程」。
|
|
42
|
+
- 模板源 `.cursor/environment.json` 只安装模板校验依赖(`jsonschema`、模板 `pnpm`),**不是**实现仓审查运行时。`project-instance` 与实现仓库的 Cloud / CI 环境自行包含 JDK、Maven Wrapper 和 `pnpm`。
|
|
43
|
+
- 审查任务包只写证据路径;专项 skill 只读,不得写实现。审查 finding 按 `review_standards_route.finding_disposition` 分流:`violation` 交实现者修复后全轴复审;`drift` / `new_impacts` 回 Router,不在审查会话中改代码。
|
|
44
|
+
|
|
35
45
|
## 1.3 `repository_scope: git-submodule`
|
|
36
46
|
|
|
37
47
|
当用户明确选择分层接入、且前端 / 后端保持独立 Git 历史、同时挂到 `project-instance` 工作树时,使用 Git submodule,而不是把实现源码复制进 Harness,也不是把 gitlink 登记成 `harness-apps`。
|
|
@@ -63,7 +63,7 @@ Approved / Changes requested / Blocked
|
|
|
63
63
|
| `yss-web-controller` / `yss-dto` 已按影响面落实,CMD / Query / VO / Result 按既有 DTO 体系定义或复用,Controller 不用内部类或非约定包临时承载主要 DTO / VO、不手工分页主要业务集合、不穿透 Repository | pass / violation / not-applicable | |
|
|
64
64
|
| `mapstruct` 已按影响面落实,PO / Domain Model / DTO / VO / CMD / Query 转换使用 MapStruct Convertor / Mapper,未使用 `BeanUtils.copyProperties`、反射拷贝或重复手写字段赋值;例外已记录测试和补齐落点 | pass / violation / not-applicable | |
|
|
65
65
|
| `lombok` 已按影响面落实,POJO 样板代码使用 Lombok,未成片手写 getter/setter、constructor、builder、logger;实体 / POJO 未触发 `@Data` 等反模式或已说明例外 | pass / violation / not-applicable | |
|
|
66
|
-
| `alibaba-java-code-style` 已纳入审查,命名、异常、日志、ORM/MyBatis、Maven、MapStruct / Lombok 注解处理器配置无 blocker | pass / violation / not-applicable | |
|
|
66
|
+
| `alibaba-java-code-style` 已纳入审查,命名、异常、日志、ORM/MyBatis、Maven、MapStruct / Lombok 注解处理器配置无 blocker;可机器检查规则有工具结果或原文引用 | pass / violation / not-applicable | |
|
|
67
67
|
| 后端构建 / 测试 / OpenAPI / CI / Release 命令使用项目根目录 `./mvnw ...`;裸 `mvn ...` 已改正或有受控例外记录 | pass / violation / not-applicable | |
|
|
68
68
|
| 持久化文档正文、章节标题、审查结论和实施说明使用中文;英文模板内容未原样落地 | pass / violation / not-applicable | |
|
|
69
69
|
| 新增或修改的业务类型 / 字段 / OpenAPI property 能追溯到 `CONTEXT.md` 业务术语的 `英文标识` 词干;未登记的新名字已回写词汇表 | pass / violation / not-applicable | |
|
|
@@ -81,6 +81,36 @@ rg -n "class (SingleResult|MultiResult|PageResult|Result)<|public static class .
|
|
|
81
81
|
|---|---|---|
|
|
82
82
|
| | | expected / seam-deferred / violation |
|
|
83
83
|
|
|
84
|
+
## YSS 前端门禁审查
|
|
85
|
+
|
|
86
|
+
> UI 影响切片必填;无 UI 影响写 `not-applicable`。`UI fidelity` 轴只核原型与状态矩阵,不能代替本表。任何 `violation` 都阻断完成 / 可合并结论。
|
|
87
|
+
|
|
88
|
+
| 检查项 | 结论 | 证据 |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `yss-ui` 组件路由已落实:YSS `required` 封装(如 `YTable` / `YTree` / `YssFormily`)未被 AntDV 裸组件或其他重型方案绕过;受控回退有能力缺口记录 | pass / violation / not-applicable | |
|
|
91
|
+
| `yss-page-module-development` 页面骨架已落实:`index.vue` 只编排,请求与分页不堆在页面根组件 | pass / violation / not-applicable | |
|
|
92
|
+
| 切片合同 `required_skills` 中的 Formily / 表格 / 树 / 高度 / 主题 / API 专项 skill 已按影响面引用规则;未命中项有 `not-applicable` 原因 | pass / violation / not-applicable | |
|
|
93
|
+
| 前端验证使用项目根 `pnpm ...`;实际退出码已记录。只做 type-check 或声称“已对齐”不算通过 | pass / violation / not-applicable | |
|
|
94
|
+
| 机器检查(`pnpm lint` / `pnpm type-check` 等已存在脚本)已执行,或缺失工具已写 `not-applicable` 及原因 | pass / violation / not-applicable | |
|
|
95
|
+
|
|
96
|
+
### 前端 smoke check
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
rg -n "from 'ant-design-vue'|<(Table|Tree|Form)[ >]|YFormily|YssFormily|YTable|YTree" apps/frontend
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
命中说明:直接使用 AntDV `Table` / `Tree` / `Form` 不等于自动失败,但必须说明为何未走 YSS 封装。
|
|
103
|
+
|
|
104
|
+
| 命中 | 解释 | 结论 |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| | | expected / seam-deferred / violation |
|
|
107
|
+
|
|
108
|
+
## 机器检查
|
|
109
|
+
|
|
110
|
+
| 命令 | 退出码 | 时间 | 证据 | 结论 |
|
|
111
|
+
|---|---|---|---|---|
|
|
112
|
+
| | | | | pass / violation / not-applicable |
|
|
113
|
+
|
|
84
114
|
## 压力场景验证
|
|
85
115
|
|
|
86
116
|
| 压力场景 | 预期 | 本次结论 |
|
|
@@ -97,5 +127,10 @@ rg -n "class (SingleResult|MultiResult|PageResult|Result)<|public static class .
|
|
|
97
127
|
| Agent 使用 `seam-deferred` 却缺少风险、责任人、后续 Ticket、验证计划或目标版本 / 发布日期 | 应标记为 `violation` 并阻断 | |
|
|
98
128
|
| Agent 返回非空 `new_impacts` 后继续编码或补写旧合同 | 应暂停相关工作单元,将合同标记 `stale`,回到 Router 或更早生命周期阶段 | |
|
|
99
129
|
| Agent 只列验证命令但没有实际结果和执行时间 | 不构成 fresh verification,不得给出 Approved / 可合并结论 | |
|
|
130
|
+
| Agent 用第二个通用审查 skill 代替 `code-review`,或 Standards 未读取合同 `required_skills` / Alibaba / `yss-ui` | 应标记为 `violation` 并阻断完成 | |
|
|
131
|
+
| Agent 把 YSS 页面模块约定并进 UI fidelity,或适用报告行留空 | 应回到 Standards 专项检查,空白行视为 `missing_evidence` | |
|
|
132
|
+
| Agent 在审查会话中直接改实现代码以“关掉” finding | 应标记为 `violation`;finding 交实现者在原合同路径修复,再重新捕获候选并全轴复审 | |
|
|
133
|
+
| Agent 把 `violation` 记为 `not-applicable`,或为日常 Alibaba / YSS 另开生物人豁免门禁 | 应阻断;命中后只允许修复或完整 `seam-deferred`,未命中才 `not-applicable` | |
|
|
134
|
+
| Agent 发现 `drift` / `new_impacts` / `required_skills` 与真实影响不一致后仍在旧合同上编码 | 应将合同标 `stale`,回 Router 或更早生命周期阶段 | |
|
|
100
135
|
|
|
101
136
|
## 签字确认
|
|
@@ -67,6 +67,15 @@ function validateInvocationBoundary(data) {
|
|
|
67
67
|
ensure(Array.isArray(frontendRoute?.conditional_skills?.[impact]) && frontendRoute.conditional_skills[impact].length > 0 && typeof frontendRoute.not_applicable_reasons?.[impact] === "string", `前端条件专项路由缺少 ${impact}`);
|
|
68
68
|
}
|
|
69
69
|
ensure(routes?.["work-unit.frontend-implementation-verification"]?.skills?.includes("code-review") && routes?.["work-unit.frontend-implementation-verification"]?.applies_when === "ui_impact", "前端还原验证未绑定 UI fidelity 审查轴");
|
|
70
|
+
const reviewRoute = routes?.["work-unit.code-review"];
|
|
71
|
+
ensure(reviewRoute?.primary_skill === "code-review" && reviewRoute?.review_standards_route?.unique_default_skill === "code-review" && reviewRoute?.review_standards_route?.second_generic_review_skill === "forbidden", "code-review 不是唯一默认审查入口或允许第二套通用审查 skill");
|
|
72
|
+
ensure(includesAll(reviewRoute?.supporting_skills, ["alibaba-java-code-style", "yss-ui", "yss-domain"]) && includesAll(reviewRoute?.skills, ["code-review", "alibaba-java-code-style", "yss-ui"]), "审查工作单元缺少 YSS / Alibaba 专项检查输入");
|
|
73
|
+
const disposition = reviewRoute?.review_standards_route?.finding_disposition;
|
|
74
|
+
ensure(includesAll(disposition?.same_loop_for, ["product-slice", "template-maintenance"]) && disposition?.reviewer_write_implementation === "forbidden", "审查 finding 闭环未同时覆盖产品切片与模板维护,或允许审查者写实现");
|
|
75
|
+
ensure(includesAll(disposition?.repair_then_full_rereview?.kinds, ["violation", "machine_check_failure", "blank_applicable_row", "missing_evidence"]) && disposition?.repair_then_full_rereview?.actor === "implementer" && disposition?.repair_then_full_rereview?.then === "recapture_candidate_and_rerun_all_axes", "violation 类 finding 未要求实现者修复后全轴复审");
|
|
76
|
+
ensure(includesAll(disposition?.stale_and_reroute?.kinds, ["drift", "new_impacts", "required_skills_mismatch"]) && disposition?.stale_and_reroute?.continue_coding_on_old_contract === "forbidden" && disposition?.stale_and_reroute?.next === "router-or-earlier-lifecycle", "drift / new_impacts 未要求合同 stale 并回 Router");
|
|
77
|
+
ensure(disposition?.exemption_policy?.not_applicable === "impact_not_triggered_only" && disposition?.exemption_policy?.mandatory_waiver === "forbidden" && includesAll(disposition?.exemption_policy?.allowed_exits, ["repair", "seam-deferred-complete"]) && disposition?.exemption_policy?.new_human_waiver_gate === "forbidden", "审查豁免策略允许未命中以外的 not-applicable 或 mandatory 豁免");
|
|
78
|
+
ensure(data.review_input?.unique_default_skill === "code-review" && data.review_input?.second_generic_review_skill === "forbidden" && data.review_input?.completed_requires_specialist_coverage === true && data.review_input?.finding_disposition_required === true && data.review_input?.completed_requires_no_open_mandatory_violations === true && data.review_input?.completed_requires_no_blank_applicable_rows === true && data.review_input?.reviewer_write_implementation === "forbidden" && includesAll(data.review_input?.standards_sources, ["slice_contract_required_skills", "specialist_check_inputs", "review_report_template"]), "review_input 未强制专项检查覆盖或 finding 闭环完成条件");
|
|
70
79
|
for (const id of ["work-unit.spec-synthesis", "work-unit.ticket-decomposition", "work-unit.slice-implementation"]) {
|
|
71
80
|
ensure(routes?.[id]?.native?.source === "yss-product-lifecycle" && routes[id].compatibility?.source === "mattpocock/skills" && routes[id].compatibility.formal_artifact_owner === "explicit-user-entry", `${id} 未分离原生执行定义与 Matt 兼容输入`);
|
|
72
81
|
}
|
|
@@ -47,6 +47,92 @@ function requireString(value, field) {
|
|
|
47
47
|
if (typeof value !== "string" || !value.trim()) fail(`${field} 不能为空`);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
function requireObject(value, field) {
|
|
51
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) fail(`${field} 必须是对象`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function requireStringSet(value, expected, field) {
|
|
55
|
+
if (!Array.isArray(value)) fail(`${field} 必须是数组`);
|
|
56
|
+
const missing = expected.filter((item) => !value.includes(item));
|
|
57
|
+
const extra = value.filter((item) => !expected.includes(item));
|
|
58
|
+
if (missing.length || extra.length) fail(`${field} 必须恰好为 ${expected.join(", ")}`);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function validateFindingDisposition(disposition) {
|
|
62
|
+
requireObject(disposition, "review_standards_route.finding_disposition");
|
|
63
|
+
requireStringSet(disposition.same_loop_for, ["product-slice", "template-maintenance"], "finding_disposition.same_loop_for");
|
|
64
|
+
requireObject(disposition.intensity, "finding_disposition.intensity");
|
|
65
|
+
if (disposition.intensity["product-slice"] !== "slice-contract") fail("产品切片审查强度必须绑定 slice-contract");
|
|
66
|
+
if (disposition.intensity["template-maintenance"] !== "L1-L2-L3") fail("模板维护审查强度必须绑定 L1-L2-L3");
|
|
67
|
+
if (disposition.reviewer_write_implementation !== "forbidden") fail("审查者不得写实现");
|
|
68
|
+
const repair = disposition.repair_then_full_rereview;
|
|
69
|
+
requireObject(repair, "finding_disposition.repair_then_full_rereview");
|
|
70
|
+
requireStringSet(repair.kinds, ["violation", "machine_check_failure", "blank_applicable_row", "missing_evidence"], "finding_disposition.repair_then_full_rereview.kinds");
|
|
71
|
+
if (repair.actor !== "implementer") fail("violation 类 finding 必须由实现者修复");
|
|
72
|
+
if (repair.on_original_contract !== true) fail("violation 类 finding 必须在原合同允许路径内修复");
|
|
73
|
+
if (repair.then !== "recapture_candidate_and_rerun_all_axes") fail("修复后必须重新捕获候选并全轴复审");
|
|
74
|
+
const stale = disposition.stale_and_reroute;
|
|
75
|
+
requireObject(stale, "finding_disposition.stale_and_reroute");
|
|
76
|
+
requireStringSet(stale.kinds, ["drift", "new_impacts", "required_skills_mismatch"], "finding_disposition.stale_and_reroute.kinds");
|
|
77
|
+
if (stale.mark_contract !== "stale") fail("drift / new_impacts 必须将合同标为 stale");
|
|
78
|
+
if (stale.continue_coding_on_old_contract !== "forbidden") fail("合同 stale 后禁止在旧合同上继续编码");
|
|
79
|
+
if (stale.next !== "router-or-earlier-lifecycle") fail("合同 stale 后必须回 Router 或更早生命周期阶段");
|
|
80
|
+
const exemption = disposition.exemption_policy;
|
|
81
|
+
requireObject(exemption, "finding_disposition.exemption_policy");
|
|
82
|
+
if (exemption.not_applicable !== "impact_not_triggered_only") fail("not-applicable 仅允许影响面未命中");
|
|
83
|
+
if (exemption.mandatory_waiver !== "forbidden") fail("命中后的 mandatory 门禁不得豁免");
|
|
84
|
+
requireStringSet(exemption.allowed_exits, ["repair", "seam-deferred-complete"], "finding_disposition.exemption_policy.allowed_exits");
|
|
85
|
+
if (exemption.new_human_waiver_gate !== "forbidden") fail("禁止为日常 Alibaba/YSS 新增生物人豁免门禁");
|
|
86
|
+
if (exemption.existing_human_gates_unchanged !== true) fail("既有 TODO-HUMAN-REVIEW / 生物人门禁不得被审查闭环改写");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function validateReviewInputFinding(reviewInput) {
|
|
90
|
+
if (reviewInput.finding_disposition_required !== true) fail("review_input.finding_disposition_required 必须为 true");
|
|
91
|
+
if (reviewInput.completed_requires_no_open_mandatory_violations !== true) fail("未关闭的 mandatory violation 不得 completed");
|
|
92
|
+
if (reviewInput.completed_requires_no_blank_applicable_rows !== true) fail("适用报告行空白不得 completed");
|
|
93
|
+
if (reviewInput.reviewer_write_implementation !== "forbidden") fail("review_input 禁止审查者写实现");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function validateCodeReviewRoute(route, resolve) {
|
|
97
|
+
if (route.primary_skill !== "code-review") fail("work-unit.code-review 的 primary_skill 必须是唯一默认审查技能 code-review");
|
|
98
|
+
const standards = route.review_standards_route;
|
|
99
|
+
if (!standards || typeof standards !== "object" || Array.isArray(standards)) {
|
|
100
|
+
fail("work-unit.code-review 缺少 review_standards_route");
|
|
101
|
+
}
|
|
102
|
+
if (standards.unique_default_skill !== "code-review") fail("review_standards_route.unique_default_skill 必须为 code-review");
|
|
103
|
+
if (standards.second_generic_review_skill !== "forbidden") fail("禁止叠加第二个通用审查 skill");
|
|
104
|
+
if (standards.write_implementation !== "forbidden") fail("审查专项 skill 不得用于写实现");
|
|
105
|
+
if (standards.contract_required_skills !== "required") fail("Standards 必须消费 Slice 合同 required_skills");
|
|
106
|
+
requireString(standards.report_template, "review_standards_route.report_template");
|
|
107
|
+
if (!existsSync(path.join(ROOT, standards.report_template))) fail(`审查报告模板不存在: ${standards.report_template}`);
|
|
108
|
+
const conditional = standards.conditional_skills;
|
|
109
|
+
if (!conditional || typeof conditional !== "object" || Array.isArray(conditional)) {
|
|
110
|
+
fail("review_standards_route.conditional_skills 必须是对象");
|
|
111
|
+
}
|
|
112
|
+
const union = [];
|
|
113
|
+
for (const [impact, names] of Object.entries(conditional)) {
|
|
114
|
+
if (!Array.isArray(names) || names.length === 0) fail(`review_standards_route.conditional_skills.${impact} 必须是非空数组`);
|
|
115
|
+
for (const name of names) {
|
|
116
|
+
if (!resolve(name)) fail(`审查专项检查输入引用了未登记技能: ${impact} -> ${name}`);
|
|
117
|
+
if (!union.includes(name)) union.push(name);
|
|
118
|
+
}
|
|
119
|
+
if (typeof standards.not_applicable_reasons?.[impact] !== "string") {
|
|
120
|
+
fail(`review_standards_route.not_applicable_reasons.${impact} 必须是字符串`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
for (const name of union) {
|
|
124
|
+
if (!route.supporting_skills.includes(name)) fail(`work-unit.code-review.supporting_skills 缺少专项检查输入 ${name}`);
|
|
125
|
+
if (!route.skills.includes(name)) fail(`work-unit.code-review.skills 缺少专项检查输入 ${name}`);
|
|
126
|
+
}
|
|
127
|
+
if (!route.skills.includes("code-review")) fail("work-unit.code-review.skills 必须包含 code-review");
|
|
128
|
+
const machine = standards.machine_checks;
|
|
129
|
+
if (!machine || typeof machine !== "object" || Array.isArray(machine)) fail("review_standards_route.machine_checks 必须是对象");
|
|
130
|
+
if (machine.run_if_present !== true) fail("review_standards_route.machine_checks.run_if_present 必须为 true");
|
|
131
|
+
if (machine.missing_tooling !== "not-applicable-with-reason") fail("缺少机器检查工具时必须记录 not-applicable 及原因");
|
|
132
|
+
if (machine.checkable_rule_without_machine !== "not-a-pass") fail("可机器检查规则在未跑工具时不得记为 pass");
|
|
133
|
+
validateFindingDisposition(standards.finding_disposition);
|
|
134
|
+
}
|
|
135
|
+
|
|
50
136
|
export function validateSkillRegistry(registry, { lock, routerContract, lifecycleContract, skillSource } = {}) {
|
|
51
137
|
if (!registry || typeof registry !== "object" || Array.isArray(registry)) fail("技能路由注册表必须是对象");
|
|
52
138
|
if (registry.schema_version !== 1) fail("schema_version 必须为 1");
|
|
@@ -256,7 +342,9 @@ export function validateSkillRegistry(registry, { lock, routerContract, lifecycl
|
|
|
256
342
|
}
|
|
257
343
|
if (route.primary_skill === "prototype-review") fail("prototype-review 必须作为独立 supporting skill,不得成为生命周期主技能");
|
|
258
344
|
}
|
|
345
|
+
if (routeId === "work-unit.code-review") validateCodeReviewRoute(route, resolve);
|
|
259
346
|
}
|
|
347
|
+
if (lifecycle.review_input) validateReviewInputFinding(lifecycle.review_input);
|
|
260
348
|
}
|
|
261
349
|
|
|
262
350
|
return { skill_count: skills.length, platform_count: platform.length, status: registry.status };
|
|
@@ -38,6 +38,18 @@ function mustFail(doc, pattern, label) {
|
|
|
38
38
|
|
|
39
39
|
validateDefaultDigitalHumanRoles();
|
|
40
40
|
|
|
41
|
+
const tester = loadDigitalHumanRoles().roles.find((role) => role.id === "role.test-engineer");
|
|
42
|
+
for (const skill of ["code-review", "alibaba-java-code-style", "yss-ui", "yss-page-module-development", "yss-domain", "yss-application", "yss-web-controller", "yss-dto", "mapstruct", "lombok"]) {
|
|
43
|
+
if (!tester.core_skills.includes(skill)) throw new TypeError(`role.test-engineer 缺少只读专项检查 skill: ${skill}`);
|
|
44
|
+
}
|
|
45
|
+
if (tester.forbidden_skills.includes("yss-ui") || tester.forbidden_skills.includes("alibaba-java-code-style")) {
|
|
46
|
+
throw new TypeError("测试工程师不得禁止审查所需的 YSS / Alibaba skill");
|
|
47
|
+
}
|
|
48
|
+
const backend = loadDigitalHumanRoles().roles.find((role) => role.id === "role.backend-engineer");
|
|
49
|
+
if (!backend.core_skills.includes("alibaba-java-code-style") || !backend.core_skills.includes("mapstruct") || !backend.core_skills.includes("lombok")) {
|
|
50
|
+
throw new TypeError("role.backend-engineer 缺少 Alibaba / MapStruct / Lombok");
|
|
51
|
+
}
|
|
52
|
+
|
|
41
53
|
const seven = [
|
|
42
54
|
"role.lifecycle-orchestrator",
|
|
43
55
|
"role.requirements-manager",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"source": "mattpocock/skills",
|
|
58
58
|
"sourceType": "github",
|
|
59
59
|
"skillPath": "skills/engineering/code-review/SKILL.md",
|
|
60
|
-
"effectiveHash": "
|
|
60
|
+
"effectiveHash": "9c0385f372ebc6a0741e35f0c654f5739e3d4aac29083d80e5af56305ce4200c",
|
|
61
61
|
"sourceRevision": "0ab1b63a410a03d3627979a109c8695de27af954",
|
|
62
62
|
"upstreamHash": "12daafb9c4f77deb3c3303dc2e6f8a3c2a0ff7928fc004af959ba18b8bd38068",
|
|
63
63
|
"adaptationRef": "docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md",
|
|
@@ -1398,7 +1398,7 @@
|
|
|
1398
1398
|
"source": "project",
|
|
1399
1399
|
"sourceType": "local",
|
|
1400
1400
|
"skillPath": ".agents/skills/yss-product-lifecycle/SKILL.md",
|
|
1401
|
-
"effectiveHash": "
|
|
1401
|
+
"effectiveHash": "61d56bad65e7176ac36d2f2cdc1ca1eb8d3c8ce9fe9a3423ece0cdb5ef18b43a",
|
|
1402
1402
|
"targets": [
|
|
1403
1403
|
".agents/skills",
|
|
1404
1404
|
".claude/skills",
|
package/template.snapshot.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"templateName": "yss-spec-project-template",
|
|
4
4
|
"templateSource": "github:iloveZzz/yss-spec-project-template",
|
|
5
5
|
"templateRepository": "https://github.com/iloveZzz/yss-spec-project-template.git",
|
|
6
|
-
"requestedRef": "
|
|
7
|
-
"templateCommit": "
|
|
6
|
+
"requestedRef": "4743a3f6805e844be8244c49781eb55f0b3fd644",
|
|
7
|
+
"templateCommit": "4743a3f6805e844be8244c49781eb55f0b3fd644",
|
|
8
8
|
"manifestHash": "10d161eb3f0e426aeefad5d0b9e6c5522d8a4dbacb9edf6ed64285dcb40b1a65",
|
|
9
9
|
"encodedPaths": {
|
|
10
10
|
".codex/skills/data-analytics/.gitignore": ".codex/skills/data-analytics/__yss_dotfile__.gitignore",
|
|
@@ -12,6 +12,6 @@
|
|
|
12
12
|
".codex/skills/product-design/templates/prototype/.npmrc": ".codex/skills/product-design/templates/prototype/__yss_dotfile__.npmrc",
|
|
13
13
|
".gitignore": "__yss_dotfile__.gitignore"
|
|
14
14
|
},
|
|
15
|
-
"snapshotHash": "
|
|
16
|
-
"generatedAt": "2026-08-
|
|
15
|
+
"snapshotHash": "fceef6da9de2136f3c09fe0fb012f0aadf0f1e14c3772880818ad7b325b5f307",
|
|
16
|
+
"generatedAt": "2026-08-30T07:26:02.204Z"
|
|
17
17
|
}
|