@surlymochan/evalid 0.0.0-stage → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -0
- package/LICENSE +21 -0
- package/README.md +315 -2
- package/RELEASE_NOTES.md +102 -0
- package/atoms/registry.json +758 -0
- package/bin/xflow.js +7208 -0
- package/docs/adoption/README.md +128 -0
- package/docs/adoption/openflow-release-hardening.md +61 -0
- package/docs/benchmark-openflow-vs-gstack-superpowers-openspec-2026-05-25.md +81 -0
- package/docs/compatibility.md +52 -0
- package/docs/competitive-benchmark.md +108 -0
- package/docs/corps-operator-guide.md +75 -0
- package/docs/demo-proof.md +126 -0
- package/docs/examples-gallery.md +115 -0
- package/docs/fixtures/tracker-item.json +7 -0
- package/docs/goal-vs-codex.md +129 -0
- package/docs/gstack-comparison.md +88 -0
- package/docs/install-upgrade.md +133 -0
- package/docs/integrations.md +49 -0
- package/docs/launch-demo.md +123 -0
- package/docs/launch-dossier.md +180 -0
- package/docs/methodology.md +149 -0
- package/docs/npm-publish-handoff.md +83 -0
- package/docs/openspec-migration.md +106 -0
- package/docs/public-benchmark.md +68 -0
- package/docs/public-release.md +145 -0
- package/docs/quality-assessment.md +139 -0
- package/docs/quickstart.md +156 -0
- package/docs/reviewer-guide.md +43 -0
- package/docs/spec-kit-benchmark.md +73 -0
- package/docs/super-assistant-comparison.md +106 -0
- package/docs/superpowers-comparison.md +82 -0
- package/docs/team-adoption.md +123 -0
- package/docs/tooling-matrix.md +91 -0
- package/docs/walkthrough.md +76 -0
- package/docs/workflow-manual.md +1125 -0
- package/package.json +83 -4
- package/prompts/pencil-draft.md +46 -0
- package/prompts/pencil-refine.md +46 -0
- package/prompts/phase-artifact.md +24 -0
- package/prompts/phase-execution.md +32 -0
- package/schemas/competitor-reconstruction-contract.schema.json +91 -0
- package/schemas/llm-design-review-aggregate.schema.json +83 -0
- package/schemas/visual-benchmark.schema.json +978 -0
- package/schemas/workflow.schema.json +100 -0
- package/scripts/run-tests.mjs +23 -0
- package/scripts/takein_digest.py +139 -0
- package/specs/README.md +118 -0
- package/specs/architecture.md +36 -0
- package/specs/product.md +33 -0
- package/specs/workflow.md +349 -0
- package/src/agent_team/atoms/codex-app-bridge.js +8 -0
- package/src/agent_team/atoms/design/competitor-reconstruction-review.js +44 -0
- package/src/agent_team/atoms/design/contract-freeze.js +8 -0
- package/src/agent_team/atoms/design/generation-contract.js +442 -0
- package/src/agent_team/atoms/design/reconstruction-pack.js +246 -0
- package/src/agent_team/atoms/design/reference-surface-lock.js +49 -0
- package/src/agent_team/atoms/patch-challenge.js +19 -0
- package/src/agent_team/atoms/pencil/accept.js +9 -0
- package/src/agent_team/atoms/pencil/draft.js +365 -0
- package/src/agent_team/atoms/pencil/refine.js +229 -0
- package/src/agent_team/atoms/phase-run-dispatch.js +8 -0
- package/src/agent_team/atoms/team-run.js +380 -0
- package/src/agent_team/atoms/visual/aesthetic-review.js +231 -0
- package/src/agent_team/atoms/visual/benchmark-repair-plan.js +291 -0
- package/src/agent_team/atoms/visual/benchmark.js +1652 -0
- package/src/agent_team/atoms/visual/design-selection.js +23 -0
- package/src/agent_team/atoms/visual/direction-synthesis.js +124 -0
- package/src/agent_team/atoms/visual/dom-rect-export.js +129 -0
- package/src/agent_team/atoms/visual/image-diff.js +186 -0
- package/src/agent_team/atoms/visual/layout-competition.js +8 -0
- package/src/agent_team/atoms/visual/page-evidence-capture.js +806 -0
- package/src/agent_team/atoms/visual/playwright-runtime.js +8 -0
- package/src/agent_team/atoms/visual/review-aggregate.js +87 -0
- package/src/agent_team/atoms/visual/review.js +77 -0
- package/src/agent_team/atoms/visual/visual-report.js +197 -0
- package/src/agent_team/atoms/visual/visual-token-export.js +417 -0
- package/src/agent_team/common.js +311 -0
- package/src/core/atoms/agent-invoke.js +684 -0
- package/src/core/atoms/event/ingest.js +30 -0
- package/src/core/atoms/experience/digest.js +55 -0
- package/src/core/atoms/gate/artifact-verify.js +83 -0
- package/src/core/atoms/gate/competitor-contract-validate.js +119 -0
- package/src/core/atoms/gate/evidence-collect.js +64 -0
- package/src/core/atoms/gate/payload-from-phase-run.js +78 -0
- package/src/core/atoms/gate/visual-benchmark-validate.js +183 -0
- package/src/core/atoms/gate/workbench.js +79 -0
- package/src/core/atoms/intake/classify.js +15 -0
- package/src/core/atoms/intake/design-skill-select.js +16 -0
- package/src/core/atoms/intake/preview-or-refine.js +19 -0
- package/src/core/atoms/intake/recommend.js +20 -0
- package/src/core/atoms/intake/research-same-category.js +19 -0
- package/src/core/atoms/intervention/create.js +30 -0
- package/src/core/atoms/memory/manage.js +27 -0
- package/src/core/atoms/memory/mount.js +13 -0
- package/src/core/atoms/mission/create.js +19 -0
- package/src/core/atoms/mission/list.js +14 -0
- package/src/core/atoms/mission/show.js +26 -0
- package/src/core/atoms/notify/checkpoint.js +46 -0
- package/src/core/atoms/phase-run/complete.js +42 -0
- package/src/core/atoms/phase-run/fail.js +40 -0
- package/src/core/atoms/phase-run/persist.js +39 -0
- package/src/core/atoms/phase-run/start.js +30 -0
- package/src/core/atoms/plugin/run.js +76 -0
- package/src/core/atoms/policy/gate.js +90 -0
- package/src/core/atoms/policy/resolve.js +11 -0
- package/src/core/atoms/storage/sync.js +57 -0
- package/src/core/atoms/workflow/advance.js +25 -0
- package/src/core/atoms/workflow/guard.js +127 -0
- package/src/core/atoms/workflow/state-load.js +37 -0
- package/src/core/bindings.js +37 -0
- package/src/core/change-artifacts.js +134 -0
- package/src/core/competitive-score.js +265 -0
- package/src/core/concurrency-policy.js +35 -0
- package/src/core/execution-log.js +108 -0
- package/src/core/intake-recommendation.js +134 -0
- package/src/core/memory-state.js +62 -0
- package/src/core/mission-state.js +780 -0
- package/src/core/pending-gates.js +66 -0
- package/src/core/phase-cost.js +116 -0
- package/src/core/phase-run-read.js +27 -0
- package/src/core/policy-overlay.js +180 -0
- package/src/core/state-store.js +201 -0
- package/src/core/workflow-executor.js +998 -0
- package/src/core/workflow-integrity.js +111 -0
- package/src/core/workflow-loader.js +163 -0
- package/src/core/workflow-rerun.js +84 -0
- package/src/core/workflow-state.js +119 -0
- package/src/server.js +1307 -0
- package/workflows/corps.yaml +479 -0
- package/workflows/yolo.yaml +233 -0
- package/xflow/README.md +76 -0
- package/xflow/aha/SKILL.md +82 -0
- package/xflow/aha/scripts/append_aha.py +50 -0
- package/xflow/archive/scripts/archive_change.py +338 -0
- package/xflow/archive/templates/merge-design.md +54 -0
- package/xflow/archive/templates/merge-workflow.md +26 -0
- package/xflow/atoms/__init__.py +6 -0
- package/xflow/atoms/a1_issue_create_or_patch.py +70 -0
- package/xflow/atoms/a2_branch_create_and_link.py +42 -0
- package/xflow/atoms/a3_repo_doctor.py +11 -0
- package/xflow/atoms/a4_project_set_status.py +11 -0
- package/xflow/atoms/a5_archive_commit_push_close.py +11 -0
- package/xflow/atoms/a6_pr_create.py +72 -0
- package/xflow/atoms/b1_change_scaffold.py +11 -0
- package/xflow/atoms/b2_status_read.py +16 -0
- package/xflow/atoms/b2b_status_write.py +20 -0
- package/xflow/atoms/b3_status_transition.py +27 -0
- package/xflow/atoms/b4_handoff_scaffold_or_refresh.py +11 -0
- package/xflow/atoms/b5_aha_append.py +11 -0
- package/xflow/atoms/b6_takein_digest.py +11 -0
- package/xflow/atoms/b6b_lookback_digest.py +11 -0
- package/xflow/atoms/b7_change_mission_bind.py +43 -0
- package/xflow/atoms/c1_mem.py +54 -0
- package/xflow/atoms/e6_gate_local_precheck.py +23 -0
- package/xflow/atoms/h1_design_lite_gate.py +74 -0
- package/xflow/atoms/i6a_tdd_run.py +104 -0
- package/xflow/atoms/i6b_tdd_proof_validate.py +165 -0
- package/xflow/atoms/i6c_tdd_quality_review.py +357 -0
- package/xflow/atoms/j1_tests_run.py +129 -0
- package/xflow/atoms/j4a_spec_consistency_structural.py +105 -0
- package/xflow/atoms/j4b_spec_delta_review.py +316 -0
- package/xflow/atoms/j4c_openspec_migration_map.py +121 -0
- package/xflow/atoms/j4d_spec_clarify_gate.py +373 -0
- package/xflow/atoms/j6_cr_review.py +443 -0
- package/xflow/atoms/k1_artifacts_complete_check.py +39 -0
- package/xflow/atoms/k2_merge_snippets_apply.py +11 -0
- package/xflow/atoms/k3_handoff_refresh.py +14 -0
- package/xflow/atoms/k4_mem_lesson_persist.py +65 -0
- package/xflow/atoms/k5_archive_publish.py +21 -0
- package/xflow/atoms/k6_aha_merge.py +42 -0
- package/xflow/atoms/tdd_lib.py +747 -0
- package/xflow/corps/SKILL.md +109 -0
- package/xflow/exec/scripts/set_issue_in_progress.py +159 -0
- package/xflow/goal/SKILL.md +150 -0
- package/xflow/handoff/SKILL.md +95 -0
- package/xflow/handoff/scripts/scaffold_handoff.py +304 -0
- package/xflow/lookback/SKILL.md +66 -0
- package/xflow/lookback/scripts/lookback_digest.py +46 -0
- package/xflow/openissue/scripts/open_issue_flow.py +438 -0
- package/xflow/plan/SKILL.md +38 -0
- package/xflow/ralph/SKILL.md +123 -0
- package/xflow/scripts/check_installed_xflow_skill_sync.sh +44 -0
- package/xflow/scripts/common.py +480 -0
- package/xflow/scripts/doctor.py +278 -0
- package/xflow/scripts/sync_installed_xflow_skill.sh +134 -0
- package/xflow/takein/SKILL.md +81 -0
- package/xflow/takein/scripts/takein_digest.py +88 -0
- package/xflow/yolo/SKILL.md +66 -0
- package/xflow/yolo/scripts/scaffold_specs_change.py +673 -0
- package/xflow/yolo/scripts/yolo_gate.py +312 -0
- package/xflow/yolo/templates/DESIGN.md +179 -0
|
@@ -0,0 +1,1125 @@
|
|
|
1
|
+
# evalid Workflow Manual
|
|
2
|
+
|
|
3
|
+
> 版本:2026-04-17 · 适用于 evalid main 分支
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 目录
|
|
8
|
+
|
|
9
|
+
1. [架构概览](#1-架构概览)
|
|
10
|
+
2. [两条 track](#2-两条-track)
|
|
11
|
+
3. [28-phase 规范目录](#3-28-phase-规范目录)
|
|
12
|
+
4. [Yolo Workflow(lite)](#4-yolo-workflowlite)
|
|
13
|
+
5. [Corps Workflow(heavy)](#5-corps-workflowheavy)
|
|
14
|
+
6. [Gate 类型](#6-gate-类型)
|
|
15
|
+
7. [原子分组参考](#7-原子分组参考)
|
|
16
|
+
8. [状态机](#8-状态机)
|
|
17
|
+
9. [CLI 参考](#9-cli-参考)
|
|
18
|
+
10. [本地 Release Checklist](#10-本地-release-checklist)
|
|
19
|
+
11. [环境变量](#11-环境变量)
|
|
20
|
+
12. [常见问题](#12-常见问题)
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 1. 架构概览
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
28
|
+
│ L2 CLI / Skill 入口 │
|
|
29
|
+
│ │
|
|
30
|
+
│ xflow:plan xflow:yolo xflow:corps │
|
|
31
|
+
│ xflow:handoff xflow:takein xflow:lookback │
|
|
32
|
+
│ xflow:aha │
|
|
33
|
+
└────────────────────────────┬────────────────────────────────────┘
|
|
34
|
+
│ yolo: xflow workflow run <yaml>
|
|
35
|
+
│ corps: xflow corps + xflow proof
|
|
36
|
+
┌────────────────────────────▼────────────────────────────────────┐
|
|
37
|
+
│ L1 Workflow 定义 │
|
|
38
|
+
│ │
|
|
39
|
+
│ workflows/yolo.yaml (lite, 12 phases, no HTTP) │
|
|
40
|
+
│ workflows/corps.yaml (heavy, 28 phases, needs HTTP) │
|
|
41
|
+
│ atoms/registry.json (atom ID → 实现文件) │
|
|
42
|
+
│ schemas/workflow.schema.json │
|
|
43
|
+
│ schemas/competitor-reconstruction-contract.schema.json │
|
|
44
|
+
│ schemas/visual-benchmark.schema.json │
|
|
45
|
+
│ schemas/llm-design-review-aggregate.schema.json │
|
|
46
|
+
│ │
|
|
47
|
+
│ src/core/workflow-loader.js ← YAML解析 + AJV schema校验 │
|
|
48
|
+
│ src/core/workflow-executor.js ← phase迭代 + atom分发 + gate路由 │
|
|
49
|
+
└────────────────────────────┬────────────────────────────────────┘
|
|
50
|
+
│ atom dispatch
|
|
51
|
+
┌────────────────────────────▼────────────────────────────────────┐
|
|
52
|
+
│ L0 原子组件(85 atoms,每个只有一处实现) │
|
|
53
|
+
│ │
|
|
54
|
+
│ xflow/atoms/*.py A/B/C/E6/H1/I6/J/K (lite) │
|
|
55
|
+
│ src/core/atoms/**/*.js D/E/F/G/E3/E4/E7 (heavy) │
|
|
56
|
+
│ src/agent_team/atoms/**/*.js H2-H6d/I1-I5/J5 (heavy) │
|
|
57
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**单一 executor**:所有 workflow 共用同一个 `workflow-executor.js`。YAML 差异只在于 phase 列表和 atom 配置,不在执行引擎。
|
|
61
|
+
|
|
62
|
+
共享记忆族已拆到独立的 `as-xmem` 项目,不参与 workflow track 划分。
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## 2. 两条 track
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
┌──────────────┬──────────────────────────┐
|
|
70
|
+
│ yolo │ corps │
|
|
71
|
+
├──────────────┼──────────────────────────┤
|
|
72
|
+
track │ lite │ heavy │
|
|
73
|
+
phases │ 12 │ 26 │
|
|
74
|
+
HTTP server │ 不需要 │ 必须(port 8787) │
|
|
75
|
+
GitHub CLI (gh) │ 必须 │ 必须 │
|
|
76
|
+
Pencil │ 不需要 │ 必须 │
|
|
77
|
+
设计循环 │ 仅 lite gate │ 完整 8-phase 设计环 │
|
|
78
|
+
多 agent │ 否 │ 是(I1.team.run) │
|
|
79
|
+
mission DB │ 否 │ 是(SQLite state.sqlite) │
|
|
80
|
+
适用场景 │ 后端/文档/ │ 新用户界面/视觉设计/ │
|
|
81
|
+
│ 基础设施/ │ 多模块产品/正式评审 │
|
|
82
|
+
│ 小 UI 修改 │ │
|
|
83
|
+
└──────────────┴──────────────────────────┘
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 3. 28-phase 规范目录
|
|
89
|
+
|
|
90
|
+
这是两条 workflow 共用的完整 phase 目录。任何 workflow YAML 只能从这里取 phase,不得自行定义。
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
┌─────────────────────────────── Intake ──────────────────────────────────┐
|
|
94
|
+
│ 01 change-init scaffold 变更目录 + 可选 mission 绑定 │
|
|
95
|
+
│ 02 explore 同类竞品调研(corps) │
|
|
96
|
+
│ 03 brainstorm 多路径方案生成 │
|
|
97
|
+
│ 04 risk_review 结构化不确定性识别(corps) │
|
|
98
|
+
│ 05 clarify 驱动性问题澄清(corps) │
|
|
99
|
+
│ 06 proposal 收敛一条主路径,锁定范围 │
|
|
100
|
+
│ 07 proposal-consistency 确定性漂移扫描:proposal vs specs/AHA.md │
|
|
101
|
+
└──────────────────────────────────────────────────────────────────────────┘
|
|
102
|
+
|
|
103
|
+
┌─────────────────────────────── Design ──────────────────────────────────┐
|
|
104
|
+
│ 08 design_contract_freeze 锁定 journey/模块/视觉/验收基线(corps) │
|
|
105
|
+
│ 09 competitor_reconstruction_review 冻结竞品模块/主链路/业务逻辑红线 │
|
|
106
|
+
│ + 主参考面锁定 + structured reconstruction pack + generation contract │
|
|
107
|
+
│ 10 visual_direction_synthesis 多方向视觉生成与对比(corps heavy) │
|
|
108
|
+
│ 11 layout_competition 首屏多布局竞争(corps heavy) │
|
|
109
|
+
│ 12 design_selection 冻结获胜方案 + Pencil 交接(corps heavy) │
|
|
110
|
+
│ 13 ux_design_brief 翻译 contract → design brief(corps) │
|
|
111
|
+
│ 14 pencil_draft 真实 Pencil/agent_invoke 生成 .pen │
|
|
112
|
+
│ 15 llm_design_review advisory benchmark + 视觉/逻辑评审 │
|
|
113
|
+
│ 16 pencil_refine 真实 Pencil/agent_invoke 聚焦修订 │
|
|
114
|
+
│ 17 llm_design_recheck 修订后严格 benchmark 复检 │
|
|
115
|
+
│ 18 design_accept 验收设计 + Pencil attestation(corps) │
|
|
116
|
+
└──────────────────────────────────────────────────────────────────────────┘
|
|
117
|
+
|
|
118
|
+
┌─────────────────────────────── Plan ────────────────────────────────────┐
|
|
119
|
+
│ 19 plan 实现路径规划 + plan.md(复用优先) │
|
|
120
|
+
└──────────────────────────────────────────────────────────────────────────┘
|
|
121
|
+
|
|
122
|
+
┌──────────────────────────── Issue / Branch ─────────────────────────────┐
|
|
123
|
+
│ 20 openissue configured issue route + branch + 关联 │
|
|
124
|
+
│ 21 set-in-progress project item → In Progress │
|
|
125
|
+
└──────────────────────────────────────────────────────────────────────────┘
|
|
126
|
+
|
|
127
|
+
┌─────────────────────────────── Execute ─────────────────────────────────┐
|
|
128
|
+
│ 21 tdd red → green → refactor + 结构化 proof 文件 │
|
|
129
|
+
│ 22 execute 在锁定范围内实现 │
|
|
130
|
+
└──────────────────────────────────────────────────────────────────────────┘
|
|
131
|
+
|
|
132
|
+
┌──────────────────────────── Verify / Review ────────────────────────────┐
|
|
133
|
+
│ 23 verify-consistency impl vs proposal/plan/specs/AHA.md 漂移检查 │
|
|
134
|
+
│ 24 review 对抗性代码评审 + patch-challenge(corps) │
|
|
135
|
+
│ 25 qa 行为 + 视觉验证,截图支持(corps) │
|
|
136
|
+
│ 26 gate_final 镜像 frozen contract,pass/fail/needs-human │
|
|
137
|
+
└──────────────────────────────────────────────────────────────────────────┘
|
|
138
|
+
|
|
139
|
+
┌─────────────────────────────── Archive ─────────────────────────────────┐
|
|
140
|
+
│ 27 archive artifact 检查 + merge snippets + commit + push │
|
|
141
|
+
│ + close issue + project Done │
|
|
142
|
+
└──────────────────────────────────────────────────────────────────────────┘
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 4. Yolo Workflow(lite)
|
|
148
|
+
|
|
149
|
+
### 调用
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
CHANGE_ID=<id> xflow workflow run workflows/yolo.yaml
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Phase 流程图
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
用户输入
|
|
159
|
+
│
|
|
160
|
+
▼
|
|
161
|
+
┌──────────────────────┐
|
|
162
|
+
│ 01 change-init │ atoms: B1 scaffold + B2b status.write + B7 bind
|
|
163
|
+
│ gate: deterministic │◄─── E6 pre-openissue
|
|
164
|
+
└──────────┬───────────┘
|
|
165
|
+
│ pass
|
|
166
|
+
▼
|
|
167
|
+
┌──────────────────────┐
|
|
168
|
+
│ 03 brainstorm │ atoms: B3 transition
|
|
169
|
+
│ gate: human ⏸ │◄─── 等待 xflow gate ack brainstorm
|
|
170
|
+
└──────────┬───────────┘
|
|
171
|
+
│ ack
|
|
172
|
+
▼
|
|
173
|
+
┌──────────────────────┐ 条件:仅 change_type = frontend
|
|
174
|
+
│ 09 design-check │ atoms: H1 lite_gate + B3 transition [可选]
|
|
175
|
+
│ gate: deterministic │◄─── H1 检查 DESIGN.md 是否有必要 section
|
|
176
|
+
└──────────┬───────────┘
|
|
177
|
+
│
|
|
178
|
+
▼
|
|
179
|
+
┌──────────────────────┐
|
|
180
|
+
│ 06 proposal │ atoms: B3 transition
|
|
181
|
+
│ gate: artifact-verify│◄─── 检查 proposal.md 是否存在
|
|
182
|
+
└──────────┬───────────┘
|
|
183
|
+
│ exist
|
|
184
|
+
▼
|
|
185
|
+
┌──────────────────────┐
|
|
186
|
+
│ 07 proposal-check │ atoms: J4a structural + B3 transition
|
|
187
|
+
│ gate: deterministic │◄─── J4a 扫描 proposal vs specs 漂移
|
|
188
|
+
└──────────┬───────────┘
|
|
189
|
+
│ pass
|
|
190
|
+
▼
|
|
191
|
+
┌──────────────────────┐
|
|
192
|
+
│ 18 plan │ atoms: B3 transition
|
|
193
|
+
│ gate: artifact-verify│◄─── 检查 plan.md
|
|
194
|
+
└──────────┬───────────┘
|
|
195
|
+
│ exist
|
|
196
|
+
▼
|
|
197
|
+
┌──────────────────────┐
|
|
198
|
+
│ 19 openissue │ atoms: A1 issue + A2 branch + B2b status
|
|
199
|
+
│ gate: deterministic │◄─── E6 post-openissue
|
|
200
|
+
└──────────┬───────────┘
|
|
201
|
+
│ pass
|
|
202
|
+
▼
|
|
203
|
+
┌──────────────────────┐
|
|
204
|
+
│ 20 set-in-progress │ atoms: A4 project status + A3 doctor
|
|
205
|
+
│ gate: deterministic │◄─── E6 pre-exec
|
|
206
|
+
└──────────┬───────────┘
|
|
207
|
+
│ pass
|
|
208
|
+
▼
|
|
209
|
+
┌──────────────────────┐
|
|
210
|
+
│ 21a tdd-red │ atoms: I6a(red) + I6b(red)
|
|
211
|
+
│ 21b tdd-green │ atoms: I6a(green) + I6b(green) + I6c quality
|
|
212
|
+
│ gate: artifact-verify│◄─── red 必须失败;green/refactor 必须通过
|
|
213
|
+
└──────────┬───────────┘
|
|
214
|
+
│ exist
|
|
215
|
+
▼
|
|
216
|
+
┌──────────────────────┐
|
|
217
|
+
│ 22 execute │ atoms: B3 transition
|
|
218
|
+
│ gate: human ⏸ │◄─── 等待 xflow gate ack execute
|
|
219
|
+
└──────────┬───────────┘
|
|
220
|
+
│ ack
|
|
221
|
+
▼
|
|
222
|
+
┌──────────────────────┐
|
|
223
|
+
│ 23 verify-consist. │ atoms: J1 tests.run + J4a structural + J4b delta
|
|
224
|
+
│ gate: deterministic │◄─── J4a 漂移扫描 + J4b spec delta review
|
|
225
|
+
└──────────┬───────────┘
|
|
226
|
+
│ pass
|
|
227
|
+
▼
|
|
228
|
+
┌──────────────────────┐
|
|
229
|
+
│ 27 archive │ atoms: K1 + K6 + K3 + K4 + A5 commit/push/close + A6 PR
|
|
230
|
+
│ gate: deterministic │◄─── E6 pre-archive
|
|
231
|
+
└──────────┬───────────┘
|
|
232
|
+
│ pass
|
|
233
|
+
▼
|
|
234
|
+
完成 ✓
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### 关键产物
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
specs/changes/<change_id>/
|
|
241
|
+
├── status.json (B2b + B3 维护,贯穿全程)
|
|
242
|
+
├── proposal.md (gate: artifact-verify @ phase 06)
|
|
243
|
+
├── plan.md (gate: artifact-verify @ phase 18)
|
|
244
|
+
├── findings.md (optional, research-heavy changes)
|
|
245
|
+
├── progress.md (optional, long-running changes)
|
|
246
|
+
├── tdd/
|
|
247
|
+
│ ├── red-0.json (I6a/I6b @ phase 21a, passed:false)
|
|
248
|
+
│ ├── green-0.json (I6a/I6b @ phase 21b, passed:true)
|
|
249
|
+
│ └── quality-0.json (I6c @ phase 21b, test quality review)
|
|
250
|
+
├── merge-product.md (A5 @ archive)
|
|
251
|
+
├── merge-architecture.md
|
|
252
|
+
└── merge-workflow.md
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 5. Corps Workflow(heavy)
|
|
258
|
+
|
|
259
|
+
### 调用
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
# 需要先启动 HTTP server
|
|
263
|
+
xflow serve --port 8787 &
|
|
264
|
+
CHANGE_ID=<id> xflow workflow run workflows/corps.yaml
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Phase 流程图
|
|
268
|
+
|
|
269
|
+
```
|
|
270
|
+
用户输入
|
|
271
|
+
│
|
|
272
|
+
▼
|
|
273
|
+
┌──────────────────┐
|
|
274
|
+
│ 01 change-init │ B1 + D1 mission.create + B7 bind + B2b
|
|
275
|
+
│ gate: artifact │◄── status.json 存在
|
|
276
|
+
└────────┬─────────┘
|
|
277
|
+
│
|
|
278
|
+
▼
|
|
279
|
+
┌──────────────────┐
|
|
280
|
+
│ 02 explore │ G3 research + G2 classify + D3a + I1.team + D3c
|
|
281
|
+
│ gate: llm-judge │◄── LLM 评审 explore.json 质量
|
|
282
|
+
└────────┬─────────┘
|
|
283
|
+
│
|
|
284
|
+
▼
|
|
285
|
+
┌──────────────────┐
|
|
286
|
+
│ 03 brainstorm │ D3a + I1.team + D3c
|
|
287
|
+
│ gate: llm-judge │◄── LLM 评审 brainstorm.json
|
|
288
|
+
└────────┬─────────┘
|
|
289
|
+
│
|
|
290
|
+
▼
|
|
291
|
+
┌──────────────────┐
|
|
292
|
+
│ 04 risk_review │ D3a + I1.team + D3c
|
|
293
|
+
│ gate: llm-judge │◄── LLM 评审 risk_review.json
|
|
294
|
+
└────────┬─────────┘
|
|
295
|
+
│
|
|
296
|
+
▼
|
|
297
|
+
┌──────────────────┐
|
|
298
|
+
│ 05 clarify │ D3a + I1.team + D3c
|
|
299
|
+
│ gate: human ⏸ │◄── 人工确认澄清结果
|
|
300
|
+
└────────┬─────────┘
|
|
301
|
+
│ ack
|
|
302
|
+
▼
|
|
303
|
+
┌──────────────────┐
|
|
304
|
+
│ 06 proposal │ D3a + I1.team + J5 evidence + E4 payload + D3c + B3
|
|
305
|
+
│ gate: artifact │◄── proposal.md + proposal.json 存在
|
|
306
|
+
└────────┬─────────┘
|
|
307
|
+
│
|
|
308
|
+
▼
|
|
309
|
+
┌──────────────────┐
|
|
310
|
+
│ 07 prop-check │ J4a structural
|
|
311
|
+
│ gate: determin. │◄── 确定性漂移扫描
|
|
312
|
+
└────────┬─────────┘
|
|
313
|
+
│
|
|
314
|
+
▼
|
|
315
|
+
┌──────────────────────────────────────────────────────────┐
|
|
316
|
+
│ 设计循环(phases 08–17) │
|
|
317
|
+
│ │
|
|
318
|
+
│ 08 design_contract_freeze G4 + H2 │
|
|
319
|
+
│ gate: artifact ◄── design_contract.json │
|
|
320
|
+
│ │ │
|
|
321
|
+
│ 09 competitor_reconstruction_review H2b │
|
|
322
|
+
│ gate: artifact ◄── competitor_reconstruction_review │
|
|
323
|
+
│ │ │
|
|
324
|
+
│ 10 visual_direction_synthesis H3a │
|
|
325
|
+
│ gate: llm-judge │
|
|
326
|
+
│ │ │
|
|
327
|
+
│ 11 layout_competition H3b │
|
|
328
|
+
│ gate: llm-judge │
|
|
329
|
+
│ │ │
|
|
330
|
+
│ 12 design_selection H3c │
|
|
331
|
+
│ gate: human ⏸ ◄── 人工选定方向 │
|
|
332
|
+
│ │ │
|
|
333
|
+
│ 13 ux_design_brief D3a + I1.team + D3c │
|
|
334
|
+
│ gate: artifact ◄── ux_design_brief.json │
|
|
335
|
+
│ │ │
|
|
336
|
+
│ 14 pencil_draft H4a │
|
|
337
|
+
│ gate: artifact ◄── pencil_output.pen │
|
|
338
|
+
│ │ │
|
|
339
|
+
│ 15 llm_design_review H5 + H6 + H5b │
|
|
340
|
+
│ gate: deterministic(advisory) ◄── H6b validate │
|
|
341
|
+
│ │ │
|
|
342
|
+
│ 16 pencil_refine H6c + H4b │
|
|
343
|
+
│ gate: artifact ◄── benchmark_repair_plan + .pen │
|
|
344
|
+
│ │ │
|
|
345
|
+
│ 17 llm_design_recheck H5 + H6 + H5b + H6d │
|
|
346
|
+
│ gate: deterministic ◄── benchmark + aesthetic_review │
|
|
347
|
+
│ gate: deterministic(strict) ◄── H6b validate │
|
|
348
|
+
│ │ │
|
|
349
|
+
│ 18 design_accept H4c │
|
|
350
|
+
│ gate: human ⏸ ◄── 人工验收 + attestation │
|
|
351
|
+
└──────────────────────────┬───────────────────────────────┘
|
|
352
|
+
│
|
|
353
|
+
▼
|
|
354
|
+
┌──────────────────┐
|
|
355
|
+
│ 18 plan │ D3a + I1.team + E4 + D3c
|
|
356
|
+
│ gate: artifact │◄── plan.json + plan.md
|
|
357
|
+
└────────┬─────────┘
|
|
358
|
+
│
|
|
359
|
+
▼
|
|
360
|
+
┌──────────────────┐
|
|
361
|
+
│ 19 openissue │ A1 + A2 + B2b
|
|
362
|
+
│ gate: determin. │◄── E6 post-openissue
|
|
363
|
+
└────────┬─────────┘
|
|
364
|
+
│
|
|
365
|
+
▼
|
|
366
|
+
┌──────────────────┐
|
|
367
|
+
│ 20 set-in-prog │ A4 + A3 doctor
|
|
368
|
+
│ gate: determin. │◄── E6 pre-exec
|
|
369
|
+
└────────┬─────────┘
|
|
370
|
+
│
|
|
371
|
+
▼
|
|
372
|
+
┌──────────────────┐
|
|
373
|
+
│ 21a tdd-red │ I6a(red) + I6b(red)
|
|
374
|
+
│ 22 execute │ implementation happens here
|
|
375
|
+
│ 21b tdd-green │ I6a(green) + I6b(green) + I6c quality
|
|
376
|
+
│ gate: artifact │◄── red-0.json + green-0.json + quality-0.json
|
|
377
|
+
└────────┬─────────┘
|
|
378
|
+
│
|
|
379
|
+
▼
|
|
380
|
+
┌──────────────────┐
|
|
381
|
+
│ 22 execute │ I2 dispatch + I4 patch.challenge
|
|
382
|
+
│ gate: artifact │◄── execute artifacts 存在
|
|
383
|
+
└────────┬─────────┘
|
|
384
|
+
│
|
|
385
|
+
▼
|
|
386
|
+
┌──────────────────┐
|
|
387
|
+
│ 24 review │ I4 patch.challenge(review) + J5 evidence
|
|
388
|
+
│ gate: llm-judge │◄── LLM 评审 review.json
|
|
389
|
+
└────────┬─────────┘
|
|
390
|
+
│
|
|
391
|
+
▼
|
|
392
|
+
┌──────────────────┐
|
|
393
|
+
│ 25 qa │ J1 tests + H5 visual(qa) + E5 artifact + J5 evidence
|
|
394
|
+
│ gate: artifact │◄── qa_acceptance.json
|
|
395
|
+
└────────┬─────────┘
|
|
396
|
+
│
|
|
397
|
+
▼
|
|
398
|
+
┌──────────────────┐
|
|
399
|
+
│ 26 gate_final │ J5 evidence + E3 workbench + K1 complete_check
|
|
400
|
+
│ gate: human ⏸ │◄── 最终人工放行(gate_final.json 含 recommendation)
|
|
401
|
+
└────────┬─────────┘
|
|
402
|
+
│ ack
|
|
403
|
+
▼
|
|
404
|
+
┌──────────────────┐
|
|
405
|
+
│ 27 archive │ K1 + K6 + K3 + K4 + A5 commit/push/close + A6 PR
|
|
406
|
+
│ gate: determin. │◄── E6 pre-archive
|
|
407
|
+
└────────┬─────────┘
|
|
408
|
+
│
|
|
409
|
+
▼
|
|
410
|
+
完成 ✓
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### 关键产物
|
|
414
|
+
|
|
415
|
+
```
|
|
416
|
+
specs/changes/<change_id>/
|
|
417
|
+
├── status.json
|
|
418
|
+
├── explore.json
|
|
419
|
+
├── brainstorm.json
|
|
420
|
+
├── risk_review.json
|
|
421
|
+
├── clarify.json
|
|
422
|
+
├── proposal.md + proposal.json
|
|
423
|
+
├── design_contract.json
|
|
424
|
+
├── competitor_reconstruction_review.json
|
|
425
|
+
├── reference_surface_lock.json
|
|
426
|
+
├── reconstruction_pack.json
|
|
427
|
+
├── generation_contract.json
|
|
428
|
+
├── design_system_pack.json
|
|
429
|
+
├── image_reference_set.json
|
|
430
|
+
├── visual_direction_synthesis.json
|
|
431
|
+
├── layout_competition.json
|
|
432
|
+
├── design_selection.json
|
|
433
|
+
├── ux_design_brief.json
|
|
434
|
+
├── pencil_output.pen
|
|
435
|
+
├── pencil_output.attestation.json
|
|
436
|
+
├── plan.md + plan.json
|
|
437
|
+
├── findings.md (optional, research-heavy changes)
|
|
438
|
+
├── progress.md (optional, long-running changes)
|
|
439
|
+
├── tdd/
|
|
440
|
+
│ ├── red-0.json
|
|
441
|
+
│ └── green-0.json
|
|
442
|
+
├── review.json
|
|
443
|
+
├── qa_acceptance.json
|
|
444
|
+
├── gate_final.json ← E3.gate.workbench 输出,含 recommendation
|
|
445
|
+
├── evidence/
|
|
446
|
+
│ └── gate_final.json
|
|
447
|
+
├── merge-product.md
|
|
448
|
+
├── merge-architecture.md
|
|
449
|
+
├── merge-workflow.md
|
|
450
|
+
└── merge-design.md
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## 6. Gate 类型
|
|
456
|
+
|
|
457
|
+
每个 phase 结束时执行一个 gate,决定是否推进。
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
┌─────────────────────┬──────────────────────────────────────────────────────┐
|
|
461
|
+
│ gate 类型 │ 行为 │
|
|
462
|
+
├─────────────────────┼──────────────────────────────────────────────────────┤
|
|
463
|
+
│ skip │ 无条件通过,直接进下一 phase │
|
|
464
|
+
│ │ │
|
|
465
|
+
│ deterministic │ 调用 E6.gate.local_precheck (yolo_gate.py) │
|
|
466
|
+
│ │ 脚本检查 artifact 存在性 + status.json 字段 │
|
|
467
|
+
│ │ 结果:pass / fail(fail → on_fail 策略) │
|
|
468
|
+
│ │ │
|
|
469
|
+
│ artifact-verify │ executor 直接检查 YAML 中声明的 artifacts 路径 │
|
|
470
|
+
│ │ 所有 optional:false 的文件必须存在 │
|
|
471
|
+
│ │ 结果:pass / fail │
|
|
472
|
+
│ │ │
|
|
473
|
+
│ llm-judge │ yolo: 返回 needs_human(无 HTTP server) │
|
|
474
|
+
│ │ corps: 发起 phase-run,LLM 判断 │
|
|
475
|
+
│ │ 结果:pass / fail / needs_human │
|
|
476
|
+
│ │ │
|
|
477
|
+
│ human │ 写 .as-xflow/pending-gates/<phase>.json │
|
|
478
|
+
│ │ workflow 停止,等待人工 ack │
|
|
479
|
+
│ │ 恢复:xflow gate ack <phase> │
|
|
480
|
+
│ │ 结果:approved(ack 后)/ pending(未 ack) │
|
|
481
|
+
└─────────────────────┴──────────────────────────────────────────────────────┘
|
|
482
|
+
|
|
483
|
+
on_fail 策略:
|
|
484
|
+
stop → 打印阻断原因,退出非零,workflow 暂停
|
|
485
|
+
advance-with-warning → 记录警告,继续推进(用于 TDD 等容错场景)
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### Human Gate 生命周期
|
|
489
|
+
|
|
490
|
+
```
|
|
491
|
+
phase 执行完毕
|
|
492
|
+
│
|
|
493
|
+
▼
|
|
494
|
+
写 .as-xflow/pending-gates/<phase>.json
|
|
495
|
+
{ status: "pending", created_at: "..." }
|
|
496
|
+
│
|
|
497
|
+
▼
|
|
498
|
+
workflow 退出(exit code 1)
|
|
499
|
+
输出:Human gate: phase "<phase>" — ack to proceed
|
|
500
|
+
|
|
501
|
+
用户检查后 ────────────────────────────────►
|
|
502
|
+
│
|
|
503
|
+
xflow gate ack <phase>
|
|
504
|
+
│
|
|
505
|
+
▼
|
|
506
|
+
.as-xflow/pending-gates/<phase>.json
|
|
507
|
+
{ status: "approved" }
|
|
508
|
+
│
|
|
509
|
+
重新运行: │
|
|
510
|
+
xflow workflow run <yaml> ◄─────────────────┘
|
|
511
|
+
│
|
|
512
|
+
▼
|
|
513
|
+
executor 读 pending-gates/<phase>.json
|
|
514
|
+
status = "approved" → 跳过该 phase,继续下一 phase
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## 7. 原子分组参考
|
|
520
|
+
|
|
521
|
+
### 速记口诀
|
|
522
|
+
|
|
523
|
+
```
|
|
524
|
+
A 管 GitHub B 管本地状态 C 管个人记忆(不透明)
|
|
525
|
+
D 管数据库 E 管 gate 引擎 F 管 mission 记忆
|
|
526
|
+
G 管调研 H 管设计循环 I 管执行
|
|
527
|
+
J 管验证 K 管收尾归档
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### 各组职责详解
|
|
531
|
+
|
|
532
|
+
```
|
|
533
|
+
┌────┬──────────────────────────────────────────────────────────────────────┐
|
|
534
|
+
│ 组 │ 全称 一句话定位 track 数量 │
|
|
535
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
536
|
+
│ A │ Actions on 操 GitHub 表面:开 issue、建分支、 lite 6 │
|
|
537
|
+
│ │ GitHub 推代码、开 PR、关 issue │
|
|
538
|
+
│ │ 唯一和远程 repo 交互的一组 │
|
|
539
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
540
|
+
│ │ A1 issue.create_or_patch 创建或更新 issue │
|
|
541
|
+
│ │ A2 branch.create_and_link 创建分支并关联 issue │
|
|
542
|
+
│ │ A3 repo.doctor repo/branch/checkout/issue 就绪检查 │
|
|
543
|
+
│ │ A4 project.set_status GitHub Project 状态列 │
|
|
544
|
+
│ │ A5 archive.commit_push_close commit+push+close issue │
|
|
545
|
+
│ │ A6 pr.create 创建 PR │
|
|
546
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
547
|
+
│ B │ Build / 变更"行政"组:建目录、读写 lite 9 │
|
|
548
|
+
│ │ Bookkeeping status.json、记录 stage 转换 │
|
|
549
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
550
|
+
│ │ B1 change.scaffold 初始化 specs/changes/<id>/ │
|
|
551
|
+
│ │ B2/B2b status.read/write 读写 status.json │
|
|
552
|
+
│ │ B3 status.transition stage/status 合法转换(脚本强制校验) │
|
|
553
|
+
│ │ B4 handoff.scaffold_or_refresh 刷新 HANDOFF.md │
|
|
554
|
+
│ │ B5 aha.append 写 AHA.md 条目 │
|
|
555
|
+
│ │ B6/B6b takein/lookback 摘要读取 │
|
|
556
|
+
│ │ B7 change_mission.bind ★ 唯一写 bindings.json(yolo↔corps 耦合点)│
|
|
557
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
558
|
+
│ C │ Cli-use- 个人记忆,刻意设计成不透明 lite 1 │
|
|
559
|
+
│ │ memory 其他原子不能碰 cli-use-memory 目录 │
|
|
560
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
561
|
+
│ │ C1 mem 全部子命令透传给 mem.sh(1889 行,原样保留) │
|
|
562
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
563
|
+
│ D │ Database / 操 SQLite state.sqlite:创建 mission、 heavy 9 │
|
|
564
|
+
│ │ Mission 记录 phase-run。corps 专属,yolo 不用 │
|
|
565
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
566
|
+
│ │ D1 mission.create 创建 mission 行 │
|
|
567
|
+
│ │ D2/D2b mission.list/show 查询 mission 状态 │
|
|
568
|
+
│ │ D3a/b/c/d phase_run.* phase-run 生命周期(start/persist/complete/fail)│
|
|
569
|
+
│ │ D4 event.ingest 惰性事件入库 │
|
|
570
|
+
│ │ D5 intervention.create 创建人工干预记录 │
|
|
571
|
+
│ │ D6 mission.diagnostics 诊断 mission 健康状态 │
|
|
572
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
573
|
+
│ E │ Engine workflow 状态管理 + gate 路由 heavy+lite 7 │
|
|
574
|
+
│ │ E6 是最重要的:所有 deterministic gate │
|
|
575
|
+
│ │ 的唯一真值来源 │
|
|
576
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
577
|
+
│ │ E1 workflow.state_load 读 workflow-state.json │
|
|
578
|
+
│ │ E2 workflow.guard gate token + 命令执行 │
|
|
579
|
+
│ │ E3 gate.workbench 合成 gate_final.json(verdict 在产物里) │
|
|
580
|
+
│ │ E4 gate.payload_from_phase_run 从 phase-run 提取 gate payload │
|
|
581
|
+
│ │ E5 artifact.verify artifact manifest 检查 │
|
|
582
|
+
│ │ E6 gate.local_precheck ★ 所有 deterministic gate 唯一实现(lite)│
|
|
583
|
+
│ │ E7 workflow.advance 推进 workflow cursor │
|
|
584
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
585
|
+
│ F │ Foreign 给当前 mission 挂载/审批记忆条目 heavy 2 │
|
|
586
|
+
│ │ memory corps 专属 │
|
|
587
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
588
|
+
│ │ F1 memory_item.manage 列出/审批/拒绝记忆条目 │
|
|
589
|
+
│ │ F2 memory.mount 挂载记忆到当前 mission │
|
|
590
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
591
|
+
│ G │ Gather 收集竞品数据、分类需求、选设计技能 heavy 4 │
|
|
592
|
+
│ │ corps 的 explore/clarify 阶段用 │
|
|
593
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
594
|
+
│ │ G1 intake.preview_or_refine 预览或细化需求蓝图 │
|
|
595
|
+
│ │ G2 intake.classify 分类:功能/视觉/基础设施 │
|
|
596
|
+
│ │ G3 research.same_category 同类竞品调研 │
|
|
597
|
+
│ │ G4 design_skill.select 选择设计技能路径 │
|
|
598
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
599
|
+
│ H │ Human 设计循环,lite 和 heavy 不重叠 mixed 19 │
|
|
600
|
+
│ │ interface / H1 是 lite 的 DESIGN.md 检查 │
|
|
601
|
+
│ │ Design H2–H6 是 corps 的完整设计环 │
|
|
602
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
603
|
+
│ │ H1 design.lite_gate DESIGN.md 卫生检查(lite) │
|
|
604
|
+
│ │ H2 design.contract_freeze 锁定设计合约(heavy) │
|
|
605
|
+
│ │ H2b/d/e/f competitor/generation 竞品复刻合同/主参考/拆解包/生成约束 │
|
|
606
|
+
│ │ H3a/b/c visual.* 视觉方向合成/布局竞争/方案选定 │
|
|
607
|
+
│ │ H4a/b/c pencil.* draft/refine/accept + attestation │
|
|
608
|
+
│ │ H5 visual.review 多模态视觉评审 │
|
|
609
|
+
│ │ H5b visual.review.aggregate 聚合并行视觉评审结果 │
|
|
610
|
+
│ │ H6 visual.benchmark 视觉基准促进校准 │
|
|
611
|
+
│ │ H6c visual.benchmark_repair_plan unresolved benchmark → repair loop │
|
|
612
|
+
│ │ H6d visual.aesthetic_review 高审美合同 + image reference + Pencil 边界 │
|
|
613
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
614
|
+
│ I │ Implementation 执行。重型的走 corps,I6 是 heavy+lite 6 │
|
|
615
|
+
│ │ yolo 也用的 TDD proof 记录 │
|
|
616
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
617
|
+
│ │ I1 team.run 多 agent 团队执行(heavy) │
|
|
618
|
+
│ │ I2 phase_run.dispatch 派发执行任务 │
|
|
619
|
+
│ │ I4 patch.challenge 对抗性 patch 评审 │
|
|
620
|
+
│ │ I5 codex.app_bridge Codex 应用桥接 │
|
|
621
|
+
│ │ I6a tdd.run 运行测试命令 + 写 proof(lite) │
|
|
622
|
+
│ │ I6b tdd.proof_validate 重算 proof 绑定,在快照上重跑命令(lite) │
|
|
623
|
+
│ │ I6c tdd.quality_review 测试质量、红绿命令、skip/弱断言; │
|
|
624
|
+
│ │ tdd_mode=refactor|docs 时替代 red 证明 │
|
|
625
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
626
|
+
│ J │ Judge / 验证层:确定性测试 + 漂移扫描 + 证据收集 mixed 3 │
|
|
627
|
+
│ │ Verify │
|
|
628
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
629
|
+
│ │ J1 tests.run 运行 plan.md 中的验证命令(lite) │
|
|
630
|
+
│ │ J4a spec_consistency.struct 确定性漂移扫描:impl vs proposal/specs │
|
|
631
|
+
│ │ J4b spec_delta.review 生成 proposal/plan/tasks/spec delta 摘要 │
|
|
632
|
+
│ │ J4c openspec.migration_map 生成 OpenSpec → xflow 迁移映射报告 │
|
|
633
|
+
│ │ J5 gate.evidence_collect 收集证据包(heavy) │
|
|
634
|
+
├────┼──────────────────────────────────────────────────────────────────────┤
|
|
635
|
+
│ K │ Knit / 归档收尾:合并产物、持久化经验、关闭变更 lite 6 │
|
|
636
|
+
│ │ Archive │
|
|
637
|
+
│ ├──────────────────────────────────────────────────────────────────────┤
|
|
638
|
+
│ │ K1 artifacts.complete_check 验证必要 artifact 齐全 │
|
|
639
|
+
│ │ K2 merge_snippets.apply standalone merge-*.md → root specs │
|
|
640
|
+
│ │ K3 handoff.refresh 刷新 HANDOFF.md │
|
|
641
|
+
│ │ K4 mem.lesson_persist 持久化 lesson → cli-use-memory │
|
|
642
|
+
│ │ K5 archive.publish standalone 终态记录(workflow archive 不用)│
|
|
643
|
+
│ │ K6 aha.merge merge AHA 条目到 root AHA.md │
|
|
644
|
+
└────┴──────────────────────────────────────────────────────────────────────┘
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
---
|
|
648
|
+
|
|
649
|
+
## 8. 状态机
|
|
650
|
+
|
|
651
|
+
### status.json — `status` 字段
|
|
652
|
+
|
|
653
|
+
```
|
|
654
|
+
draft ──────────────► active ──────────────► done
|
|
655
|
+
│ │ ▲
|
|
656
|
+
│ ▼ │
|
|
657
|
+
└────────────────► blocked ─────────────────┘
|
|
658
|
+
|
|
659
|
+
draft : change-init 创建时的初始状态
|
|
660
|
+
active : openissue 完成后转入
|
|
661
|
+
blocked : 遇到阻断性问题
|
|
662
|
+
done : archive 完成后终态(不可逆)
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
### status.json — `current_stage` 字段
|
|
666
|
+
|
|
667
|
+
```
|
|
668
|
+
change-init
|
|
669
|
+
│
|
|
670
|
+
├──► design-check (仅 frontend)
|
|
671
|
+
│
|
|
672
|
+
▼
|
|
673
|
+
brainstorm ──► proposal-freeze ──► proposal-consistency-check
|
|
674
|
+
│
|
|
675
|
+
▼
|
|
676
|
+
plan
|
|
677
|
+
│
|
|
678
|
+
▼
|
|
679
|
+
openissue
|
|
680
|
+
│
|
|
681
|
+
▼
|
|
682
|
+
tdd
|
|
683
|
+
│
|
|
684
|
+
▼
|
|
685
|
+
execute
|
|
686
|
+
│
|
|
687
|
+
▼
|
|
688
|
+
verify
|
|
689
|
+
│
|
|
690
|
+
▼
|
|
691
|
+
archive (终态)
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
合法转换由 `common.py:record_stage_transition()` 强制校验,不允许跳跃。
|
|
695
|
+
|
|
696
|
+
---
|
|
697
|
+
|
|
698
|
+
## 9. CLI 参考
|
|
699
|
+
|
|
700
|
+
```
|
|
701
|
+
xflow workflow run <yaml> 运行 workflow(从当前或上次断点续)
|
|
702
|
+
xflow workflow run <yaml> --dry-run 只解析打印,不执行
|
|
703
|
+
xflow workflow validate <yaml> 校验 YAML schema + atom registry(只作 preflight)
|
|
704
|
+
xflow corps --title <title> corps 重型流程唯一执行入口(需带竞品/模块/主链路合同)
|
|
705
|
+
xflow proof --track corps 校验执行日志 + artifacts,并写 corps_proof.json
|
|
706
|
+
xflow gate ack <phase> 确认 human gate,允许 workflow 继续
|
|
707
|
+
xflow atom list 列出所有已注册原子
|
|
708
|
+
xflow atom show <id> 显示原子详情(track/type/schema)
|
|
709
|
+
xflow atom run <id> [--with ...] 单独执行一个原子
|
|
710
|
+
xflow serve [--port 8787] 启动 HTTP server(corps 必须)
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
### workflow run 常用参数
|
|
714
|
+
|
|
715
|
+
```bash
|
|
716
|
+
# 基本
|
|
717
|
+
CHANGE_ID=my-feature xflow workflow run workflows/yolo.yaml
|
|
718
|
+
|
|
719
|
+
# 使用独立 project root(测试/隔离场景)
|
|
720
|
+
CHANGE_ID=my-feature XFLOW_PROJECT_ROOT=/path/to/project xflow workflow run workflows/yolo.yaml
|
|
721
|
+
|
|
722
|
+
# corps(需要先启动 server)
|
|
723
|
+
xflow serve &
|
|
724
|
+
xflow corps --title "my feature" --change-type frontend --change-id my-feature
|
|
725
|
+
xflow proof --track corps --change-id my-feature
|
|
726
|
+
|
|
727
|
+
# 竞品复刻型 corps(benchmark contract 为正式二选一)
|
|
728
|
+
xflow corps \
|
|
729
|
+
--title "Competitor-aligned product workbench" \
|
|
730
|
+
--change-type frontend \
|
|
731
|
+
--change-id competitor-workbench \
|
|
732
|
+
--competitor-product CompetitorX \
|
|
733
|
+
--required-modules navigation \
|
|
734
|
+
--required-modules workspace \
|
|
735
|
+
--required-modules detail \
|
|
736
|
+
--target-surfaces primary_workspace \
|
|
737
|
+
--target-surfaces detail_drawer \
|
|
738
|
+
--primary-journeys create_to_review \
|
|
739
|
+
--primary-journeys review_to_complete \
|
|
740
|
+
--business-logic-invariants domain_invariant_a \
|
|
741
|
+
--reference-scenarios-json '[{"id":"desktop-main","viewport":{"width":1440,"height":900},"reference_image":"refs/competitor-main.png","screenshot_image":"output/main.png","diff_metrics":{"structural_similarity":0.94},"layout_contract":{"workspace_patterns":["header_with_split_workspace","filters_above_list","list_detail_master_detail"],"expected_columns":2,"required_panels":["list","detail"]},"layout_observations":{"dom_rects":[{"panel_id":"header","selector":"[data-panel=header]","left":0,"top":0,"width":1440,"height":64},{"panel_id":"filters","selector":"[data-panel=filters]","left":0,"top":64,"width":920,"height":56},{"panel_id":"list","selector":"[data-panel=list]","left":0,"top":120,"width":920,"height":780},{"panel_id":"detail","selector":"[data-panel=detail]","left":920,"top":120,"width":520,"height":780},{"panel_id":"main","selector":"[data-panel=main]","left":0,"top":120,"width":920,"height":780}]}}]'
|
|
742
|
+
|
|
743
|
+
# 或者改走 capture_url + reference_image 这条正式路径,
|
|
744
|
+
# 让 H6.visual.benchmark 在 phase 内自动抓页面证据
|
|
745
|
+
xflow corps \
|
|
746
|
+
--title "Competitor-aligned product workbench" \
|
|
747
|
+
--change-type frontend \
|
|
748
|
+
--change-id competitor-workbench \
|
|
749
|
+
--competitor-product CompetitorX \
|
|
750
|
+
--primary-reference-surface desktop_primary_workspace \
|
|
751
|
+
--required-modules workspace \
|
|
752
|
+
--required-modules detail \
|
|
753
|
+
--capture-url http://127.0.0.1:4174/ \
|
|
754
|
+
--reference-image refs/competitor-main.png
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
对于 `corps` 来说,这两条 benchmark 输入路径是正式 contract,而不是推荐项:
|
|
758
|
+
|
|
759
|
+
- `reference_scenarios_json`
|
|
760
|
+
- `capture_url + reference_image`
|
|
761
|
+
- `primary_reference_surface`
|
|
762
|
+
- 当 `corps` 入口识别到 competitor-led UI 语义时,这条 benchmark contract 不再只是推荐项,而会变成默认强制项;缺少证据路径时入口直接 fail fast
|
|
763
|
+
- 在进入视觉生成前,workflow 还会冻结 `reference_surface_lock.json`、`reconstruction_pack.json`、`generation_contract.json`
|
|
764
|
+
- `reconstruction_pack.json` 不应只停留在模块级;现在还会沉淀 `component_blueprint` 和 `relationship_graph`,用一组通用 UI primitive 临时拆解当前参考面,而不是依赖一套产品专名百科
|
|
765
|
+
- `generation_contract.json` 现在会把这些 primitive 编译成 `staged_generation`、`geometry_hints`、`token_hints` 与 `repair_policy`,供 `pencil_draft` / `pencil_refine` 直接消费
|
|
766
|
+
|
|
767
|
+
如果 `visual_benchmark.json` 没声明自己来自这两条路径之一,`H6b.visual.benchmark_validate` 会直接返回 `visual_benchmark_input_contract_missing`。
|
|
768
|
+
如果 `primary_reference_surface` 缺失,`corps` 入口会在 competitor-led strict mode 下直接拒绝继续。
|
|
769
|
+
|
|
770
|
+
如果目标是竞品级商业化还原,除了布局合同,也应补上视觉 token 合同:
|
|
771
|
+
|
|
772
|
+
- `visual_token_contract`
|
|
773
|
+
- `observed_visual_tokens`
|
|
774
|
+
|
|
775
|
+
目前 benchmark 支持进入 deterministic gate 的 token 维度包括:
|
|
776
|
+
|
|
777
|
+
- `font_families_required`
|
|
778
|
+
- `font_weights_required`
|
|
779
|
+
- `text_size_range`
|
|
780
|
+
- `min_touch_target_size`
|
|
781
|
+
- `bottom_sheet_handle_required`
|
|
782
|
+
- `tabbar_active_state_required`
|
|
783
|
+
- `floating_primary_action_required`
|
|
784
|
+
- `segmented_control_active_state_required`
|
|
785
|
+
- `icon_density_range`
|
|
786
|
+
- `icon_size_range`
|
|
787
|
+
|
|
788
|
+
当 benchmark 首轮仍然 unresolved 时,`corps` 现在会自动进入 repair loop:
|
|
789
|
+
|
|
790
|
+
- `llm_design_review` 用 advisory gate 记录问题而不直接终止
|
|
791
|
+
- `benchmark_repair_plan.json` 从 diff / hotspots / missing checks 自动生成聚焦修复任务
|
|
792
|
+
- repair plan 不再只是 page-level 建议,而会下沉为 component-local `repair_targets`
|
|
793
|
+
- `pencil_draft` 现在按 shell -> primary_focus -> secondary_focus -> polish 的 staged generation 写出首版生成意图
|
|
794
|
+
- `pencil_refine` 消费 repair plan 修订设计,并且只改 repair targets;未命中的组件应默认保留,不再整页重抹
|
|
795
|
+
- `llm_design_recheck` 再做一次严格 benchmark gate,并由 `H6d.visual.aesthetic_review` 检查高审美合同、`image_reference_set.json` 真实产物、Pencil 边界和 benchmark 结果
|
|
796
|
+
- `line_height_range`
|
|
797
|
+
- `letter_spacing_range`
|
|
798
|
+
- `radius_range`
|
|
799
|
+
- `border_width_range`
|
|
800
|
+
- `border_styles_required`
|
|
801
|
+
- `border_weight_tiers_required`
|
|
802
|
+
- `color_roles`
|
|
803
|
+
- `shadow_signatures_required`
|
|
804
|
+
- `shadow_strength_tiers_required`
|
|
805
|
+
- `spacing_scale`
|
|
806
|
+
- `list_row_height_range`
|
|
807
|
+
- `toolbar_control_density_range`
|
|
808
|
+
- `detail_block_spacing_scale`
|
|
809
|
+
- `component_family_consistency`
|
|
810
|
+
|
|
811
|
+
### 高审美 UI 合同
|
|
812
|
+
|
|
813
|
+
`corps` 不再把 Pencil 当作唯一的审美来源。Pencil 的职责是生成和修订可编辑产品表面;高审美目标应由 `generation_contract.json` 中的 `visual_constraints.aesthetic_standard` 和 `visual_constraints.image_reference_generation` 明确表达,再由 `H6d.visual.aesthetic_review` 验收。
|
|
814
|
+
|
|
815
|
+
默认合同要求:
|
|
816
|
+
|
|
817
|
+
- `aesthetic_standard.level = high`
|
|
818
|
+
- 维度覆盖 composition、hierarchy、typography、color/material、density/spacing、interaction-state polish
|
|
819
|
+
- `design_system_pack.json` 必须 materialize 一份通用设计系统实践包,把 Lovable 式 React/component/design-system 约束、Open Design/Open CoDesign 式本地 artifact preview/refine loop、OpenUI 式组件白名单/结构化生成思想编译为可验证合同
|
|
820
|
+
- `design_system_pack.json` 必须声明 practice sources、allowed primitives、required states、token policy、preview loop;缺失 loading/empty/error/selected/hover/focus 等状态会被 H6d 判为未吸收
|
|
821
|
+
- image reference 使用 `gpt_image_v2_style_reference` 这类宿主配置的图像生成能力产出参考帧、组件密度 sheet、状态 polish sheet,并落成 `image_reference_set.json`
|
|
822
|
+
- `image_reference_set.json` 必须列出 `primary_surface_reference_frame`、`component_density_sheet`、`state_polish_sheet`,且每个条目都指向真实存在的 reference artifact
|
|
823
|
+
- Pencil 输出必须保持 editable,不能用 bitmap mockup 替代 DOM/Pencil 可验证产物
|
|
824
|
+
- benchmark 场景必须全 pass,且 aesthetic score 达到 `min_accept_score`
|
|
825
|
+
|
|
826
|
+
`capture-page-evidence` 与 `export-visual-tokens` 会从页面 snapshot 半自动抽取:
|
|
827
|
+
|
|
828
|
+
- `font_families`
|
|
829
|
+
- `font_weights`
|
|
830
|
+
- `text_sizes`
|
|
831
|
+
- `icon_density_values`
|
|
832
|
+
- `icon_size_values`
|
|
833
|
+
- `line_heights`
|
|
834
|
+
- `letter_spacings`
|
|
835
|
+
- `radius_values`
|
|
836
|
+
- `border_widths`
|
|
837
|
+
- `border_styles`
|
|
838
|
+
- `border_weight_tiers`
|
|
839
|
+
- `color_roles`
|
|
840
|
+
- `shadow_signatures`
|
|
841
|
+
- `shadow_strength_tiers`
|
|
842
|
+
- `list_row_heights`
|
|
843
|
+
- `toolbar_control_density_values`
|
|
844
|
+
- `detail_block_spacing_values`
|
|
845
|
+
- `component_family_consistency`
|
|
846
|
+
|
|
847
|
+
其中 `component_family_consistency` 适合拿来约束同类控件别“长得像亲戚但不是一家人”,例如:
|
|
848
|
+
|
|
849
|
+
- `toolbar_controls.max_text_size_delta`
|
|
850
|
+
- `toolbar_controls.max_radius_delta`
|
|
851
|
+
- `list_rows.max_line_height_delta`
|
|
852
|
+
- `detail_blocks.max_border_width_delta`
|
|
853
|
+
|
|
854
|
+
如果目标 surface 是移动端(iOS / Android / H5),现在至少已经有两层更像移动端的基础验收:
|
|
855
|
+
|
|
856
|
+
- 触控目标:`min_touch_target_size`
|
|
857
|
+
- 移动端布局模式:`compact_top_nav`、`bottom_tabbar_docked`、`bottom_sheet_over_content`
|
|
858
|
+
- 移动端硬门:`safe_area_top_panels`、`safe_area_bottom_panels`、`keyboard_aware_panels`
|
|
859
|
+
- 移动端交互人体工学:`thumb_reach_primary_action_panels`、`bottom_sheet_handle_required`、`tabbar_active_state_required`、`floating_primary_action_required`、`segmented_control_active_state_required`
|
|
860
|
+
- 手势态采样:`capture_states_json` 里可声明 `swipe_selector`、`drag_selector`、`drag_to_selector`、`scroll_selector`
|
|
861
|
+
- 多帧动效采样:state 可声明 `expect_motion`、`sample_frames`、`frame_interval_ms`、`min_motion_changed_frames`
|
|
862
|
+
- 多视口 baseline:可用 `viewport_variants_json` 扩展 `capture_url` 路径,或声明 `benchmark_matrix_contract` 来要求多个 scenario / state variant 一起过线
|
|
863
|
+
- 平台原生物理感:`visual_token_contract.required_platform_physics_profiles` 可要求 `ios_spring`、`android_ripple`、`mobile_h5_smooth`
|
|
864
|
+
- richer semantic detection: `observed_visual_tokens.component_semantics` 现在可自动识别 `loading_state`、`skeleton_state`、`error_state`、`search_active`
|
|
865
|
+
- HTML compare viewer: `H6.visual.benchmark` 会写 `visual_benchmark_report.html`;CLI 也可用 `xflow visual render-report` 或在 `capture-page-evidence` / `diff-images` 上加 `--report-output`
|
|
866
|
+
|
|
867
|
+
如果目标页面是典型工作台,而不是单一静态页,也可以补上:
|
|
868
|
+
|
|
869
|
+
- `state_contract.required_workbench_states`
|
|
870
|
+
|
|
871
|
+
当前支持进入 gate 的标准工作台态类型包括:
|
|
872
|
+
|
|
873
|
+
- `detail_open`
|
|
874
|
+
- `active_filter`
|
|
875
|
+
- `selected_item`
|
|
876
|
+
- `bulk_select_mode`
|
|
877
|
+
|
|
878
|
+
这时 benchmark 会生成 `state_contract_checks`;缺失要求态时,`H6b.visual.benchmark_validate` 会返回:
|
|
879
|
+
|
|
880
|
+
- `visual_benchmark_state_contract_checks_missing`
|
|
881
|
+
- `visual_benchmark_state_contract_checks_unresolved`
|
|
882
|
+
|
|
883
|
+
如果还要进一步约束“同一类组件在 hover / active / selected 等状态下是不是同一套语言”,可以补:
|
|
884
|
+
|
|
885
|
+
- `state_family_contract`
|
|
886
|
+
|
|
887
|
+
例如:
|
|
888
|
+
|
|
889
|
+
- `toolbar_controls.required_variants`
|
|
890
|
+
- `toolbar_controls.max_pixel_diff_spread`
|
|
891
|
+
- `toolbar_controls.max_layout_shift_spread`
|
|
892
|
+
- `toolbar_controls.min_distinct_surface_colors`
|
|
893
|
+
- `toolbar_controls.min_distinct_shadow_strength_tiers`
|
|
894
|
+
- `toolbar_controls.required_timing_functions`
|
|
895
|
+
- `toolbar_controls.max_radius_spread`
|
|
896
|
+
- `toolbar_controls.max_border_width_spread`
|
|
897
|
+
- `toolbar_controls.max_transition_duration_spread`
|
|
898
|
+
- `toolbar_controls.max_animation_duration_spread`
|
|
899
|
+
|
|
900
|
+
这时 benchmark 会生成 `state_family_checks`,缺失或漂移过大时会返回:
|
|
901
|
+
|
|
902
|
+
- `visual_benchmark_state_family_checks_missing`
|
|
903
|
+
- `visual_benchmark_state_family_checks_unresolved`
|
|
904
|
+
|
|
905
|
+
状态证据里也可以带 `state_visual_tokens`,用于表达 hover / active / selected 态下的颜色、阴影、圆角、边框、transition/animation token;`capture_url` 路径下 benchmark 会自动从每个 state 的 snapshot 节点里抽出这批 token。
|
|
906
|
+
- `spacing_values`
|
|
907
|
+
|
|
908
|
+
对于交互型产品,还可以在采集阶段显式声明多状态采样:
|
|
909
|
+
|
|
910
|
+
- `capture_states_json`
|
|
911
|
+
- `auto_discover_states`
|
|
912
|
+
- `state_limit`
|
|
913
|
+
|
|
914
|
+
每个 state 是一段通用动作定义,例如:
|
|
915
|
+
|
|
916
|
+
```json
|
|
917
|
+
[
|
|
918
|
+
{ "id": "hover-row", "hover_selector": "[data-row=\"r1\"]", "wait_ms": 80 },
|
|
919
|
+
{ "id": "detail-open", "click_selector": "[data-open-detail]", "wait_ms": 120 }
|
|
920
|
+
]
|
|
921
|
+
```
|
|
922
|
+
|
|
923
|
+
`capture-page-evidence` 会额外产出每个 state 的 screenshot,并把对应节点并入 snapshot;`H6.visual.benchmark` 在 `capture_url + reference_image` 路径下也会保留 `state_evidence`,供后续 benchmark/proof 使用。
|
|
924
|
+
|
|
925
|
+
当 `state_evidence` 存在时,benchmark 还会自动生成 `state_transition_checks`,默认要求这些状态相对基态存在可见 diff;否则 `H6b.visual.benchmark_validate` 会返回:
|
|
926
|
+
|
|
927
|
+
- `visual_benchmark_state_transition_checks_missing`
|
|
928
|
+
- `visual_benchmark_state_transition_checks_unresolved`
|
|
929
|
+
|
|
930
|
+
如果某个状态有明确竞品参考态图,也可以直接在 state 上补 `reference_image`。这时 `state_transition_checks` 会优先拿该状态截图去对比对应参考态,而不是只和基态比较。
|
|
931
|
+
|
|
932
|
+
自动发现的 state 会附带:
|
|
933
|
+
|
|
934
|
+
- `priority_score`
|
|
935
|
+
- `priority_reason`
|
|
936
|
+
- `source=auto_discovered`
|
|
937
|
+
|
|
938
|
+
这样后续可以优先消费更接近主链路的候选态,而不是把所有 hover/click 都等价看待。
|
|
939
|
+
|
|
940
|
+
除了 panel 级结构和 state 级 diff,benchmark 现在也支持更细的组件节奏 token:
|
|
941
|
+
|
|
942
|
+
- `list_row_height_range`
|
|
943
|
+
- `toolbar_control_density_range`
|
|
944
|
+
- `detail_block_spacing_scale`
|
|
945
|
+
|
|
946
|
+
对应的自动抽取值是:
|
|
947
|
+
|
|
948
|
+
- `list_row_heights`
|
|
949
|
+
- `toolbar_control_density_values`
|
|
950
|
+
- `detail_block_spacing_values`
|
|
951
|
+
|
|
952
|
+
如果需要检查工作台的对齐节奏,还可以在 `layout_contract` 里补:
|
|
953
|
+
|
|
954
|
+
- `alignment_grid_step`
|
|
955
|
+
- `alignment_grid_tolerance`
|
|
956
|
+
- `alignment_grid_panels`
|
|
957
|
+
|
|
958
|
+
这会自动生成 `layout-grid-alignment-*` 结构检查,用来判断关键面板是否落在统一栅格上。
|
|
959
|
+
|
|
960
|
+
对应场景会自动生成 `token_checks`。只要声明了 `visual_token_contract`,但 `token_checks` 缺失或 unresolved,`H6b.visual.benchmark_validate` 会分别返回:
|
|
961
|
+
|
|
962
|
+
- `visual_benchmark_token_checks_missing`
|
|
963
|
+
- `visual_benchmark_token_checks_unresolved`
|
|
964
|
+
|
|
965
|
+
如果已经有页面 DOM 快照 JSON,可以先用 CLI 导出 `dom_rects`:
|
|
966
|
+
|
|
967
|
+
```bash
|
|
968
|
+
xflow visual export-dom-rects \
|
|
969
|
+
--project-root /path/to/project \
|
|
970
|
+
--input fixtures/dom-snapshot.json \
|
|
971
|
+
--output .as-xflow/dom-rects.json \
|
|
972
|
+
--json
|
|
973
|
+
```
|
|
974
|
+
|
|
975
|
+
也可以直接抓页面证据,再算真实图像差异:
|
|
976
|
+
|
|
977
|
+
```bash
|
|
978
|
+
xflow visual capture-page-evidence \
|
|
979
|
+
--url http://127.0.0.1:4174/ \
|
|
980
|
+
--snapshot-output .as-xflow/page-snapshot.json \
|
|
981
|
+
--screenshot-output output/playwright/page-evidence.png \
|
|
982
|
+
--dom-rects-output .as-xflow/dom-rects.json \
|
|
983
|
+
--visual-tokens-output .as-xflow/visual-tokens.json \
|
|
984
|
+
--capture-states-json '[{"id":"hover-row","hover_selector":"[data-row=\"r1\"]","wait_ms":80}]' \
|
|
985
|
+
--auto-discover-states \
|
|
986
|
+
--state-limit 4 \
|
|
987
|
+
--reference refs/competitor-main.png \
|
|
988
|
+
--width 1440 \
|
|
989
|
+
--height 900 \
|
|
990
|
+
--json
|
|
991
|
+
```
|
|
992
|
+
|
|
993
|
+
如果只想从已有 snapshot 单独导出视觉 token,可以用:
|
|
994
|
+
|
|
995
|
+
```bash
|
|
996
|
+
xflow visual export-visual-tokens \
|
|
997
|
+
--project-root /path/to/project \
|
|
998
|
+
--input fixtures/dom-snapshot.json \
|
|
999
|
+
--output .as-xflow/visual-tokens.json \
|
|
1000
|
+
--json
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
如果只想单独算图像差异,仍然可以用:
|
|
1004
|
+
|
|
1005
|
+
```bash
|
|
1006
|
+
xflow visual diff-images \
|
|
1007
|
+
--reference refs/competitor-main.png \
|
|
1008
|
+
--candidate output/playwright/page-evidence.png \
|
|
1009
|
+
--json
|
|
1010
|
+
```
|
|
1011
|
+
|
|
1012
|
+
对 `xflow:corps` 来说,对话里的 AI 不应绕过脚本自行完成流程;它只代表人类做前期需求澄清、human gate 确认,以及最后检查 `corps_proof.json` 是否 `ok=true`。
|
|
1013
|
+
|
|
1014
|
+
---
|
|
1015
|
+
|
|
1016
|
+
## 10. 本地 Release Checklist
|
|
1017
|
+
|
|
1018
|
+
本地 release 的目标是先证明仓库正确,再刷新安装版 `xflow` skill。不要直接手写 `SKILLHUB=... skills_sync.sh xflow`;使用仓库内受测入口,避免 prune 掉 as-skillhub 管理的其他 skills。
|
|
1019
|
+
|
|
1020
|
+
```bash
|
|
1021
|
+
npm run drift:scan
|
|
1022
|
+
npm run verify
|
|
1023
|
+
npm run skill:sync
|
|
1024
|
+
npm run skill:diff
|
|
1025
|
+
npm run release:pack
|
|
1026
|
+
```
|
|
1027
|
+
|
|
1028
|
+
`npm run drift:scan` 是 targeted active-surface 漂移扫描,用于快速确认根文档、规范、workflow YAML、skill 文档和必要测试入口没有回退到旧 gate、旧 atom 数量或旧 archive 顺序;历史 `specs/changes/**` 不属于 active surface。
|
|
1029
|
+
|
|
1030
|
+
等价的一步命令:
|
|
1031
|
+
|
|
1032
|
+
```bash
|
|
1033
|
+
npm run release:local
|
|
1034
|
+
```
|
|
1035
|
+
|
|
1036
|
+
`npm run skill:sync` 调用:
|
|
1037
|
+
|
|
1038
|
+
```bash
|
|
1039
|
+
sh xflow/scripts/sync_installed_xflow_skill.sh
|
|
1040
|
+
```
|
|
1041
|
+
|
|
1042
|
+
该脚本默认从 evalid 同步 `xflow/`,并把 as-skillhub `skills/` 作为额外 source 传给 shared sync,使安装目录中的其他 managed skills 仍可被 prune 阶段正确解析。
|
|
1043
|
+
|
|
1044
|
+
`npm run skill:diff` 调用:
|
|
1045
|
+
|
|
1046
|
+
```bash
|
|
1047
|
+
sh xflow/scripts/check_installed_xflow_skill_sync.sh
|
|
1048
|
+
```
|
|
1049
|
+
|
|
1050
|
+
该脚本只读检查仓库 `xflow/` 与安装目录 `~/.codex/skills/xflow` 是否同步,并允许安装目录保留 `.skillhub-source` 作为来源元数据。若 `~/.codex/skills` 不存在,可通过 `XFLOW_INSTALLED_SKILL_DIR` 显式指向其他安装目录。
|
|
1051
|
+
|
|
1052
|
+
`npm run release:pack` 在 verify、drift scan 和 skill diff 之后执行 `npm pack --dry-run`。包内容由 `package.json.files` 和 `.npmignore` 共同约束,必须排除本地 agent 配置、测试目录、`__pycache__` 和 `.pyc`。
|
|
1053
|
+
|
|
1054
|
+
---
|
|
1055
|
+
|
|
1056
|
+
## 11. 环境变量
|
|
1057
|
+
|
|
1058
|
+
```
|
|
1059
|
+
┌──────────────────────┬─────────────────────────────────────────────────────┐
|
|
1060
|
+
│ 变量 │ 说明 │
|
|
1061
|
+
├──────────────────────┼─────────────────────────────────────────────────────┤
|
|
1062
|
+
│ CHANGE_ID │ 必须。变更标识符,用于定位 specs/changes/<id>/ │
|
|
1063
|
+
│ XFLOW_PROJECT_ROOT │ 可选。覆盖默认的 process.cwd() 作为项目根目录 │
|
|
1064
|
+
│ PORT │ 可选。HTTP server 端口,默认 8787 │
|
|
1065
|
+
│ AGENTOS_HTTP │ 可选。设置为 1 表示 HTTP server 可用(影响 httpAvailable()) │
|
|
1066
|
+
│ AS_XFLOW_HTTP │ 同上,二选一均可 │
|
|
1067
|
+
└──────────────────────┴─────────────────────────────────────────────────────┘
|
|
1068
|
+
```
|
|
1069
|
+
|
|
1070
|
+
---
|
|
1071
|
+
|
|
1072
|
+
## 12. 常见问题
|
|
1073
|
+
|
|
1074
|
+
### workflow 停在 human gate 怎么恢复?
|
|
1075
|
+
|
|
1076
|
+
```bash
|
|
1077
|
+
# 查看当前挂起的 gate
|
|
1078
|
+
ls .as-xflow/pending-gates/
|
|
1079
|
+
|
|
1080
|
+
# 确认 gate
|
|
1081
|
+
xflow gate ack <phase-id>
|
|
1082
|
+
|
|
1083
|
+
# 重新运行(从断点续)
|
|
1084
|
+
CHANGE_ID=<id> xflow workflow run workflows/yolo.yaml
|
|
1085
|
+
```
|
|
1086
|
+
|
|
1087
|
+
### atom 报 `load_status()` 错误
|
|
1088
|
+
|
|
1089
|
+
`load_status(project_root, change_id)` 返回 `(Path, dict)` tuple,不是单独的 dict。
|
|
1090
|
+
```python
|
|
1091
|
+
# 错误
|
|
1092
|
+
status = load_status(root, change_id)
|
|
1093
|
+
status.update(fields) # AttributeError: 'tuple' has no attribute 'update'
|
|
1094
|
+
|
|
1095
|
+
# 正确
|
|
1096
|
+
path, status = load_status(root, change_id)
|
|
1097
|
+
status.update(fields)
|
|
1098
|
+
save_status(path, status)
|
|
1099
|
+
```
|
|
1100
|
+
|
|
1101
|
+
### artifact-verify gate 失败
|
|
1102
|
+
|
|
1103
|
+
检查对应 artifact 文件是否已写入正确路径:
|
|
1104
|
+
```bash
|
|
1105
|
+
ls specs/changes/<change_id>/
|
|
1106
|
+
# 确认 proposal.md / plan.md 等文件存在
|
|
1107
|
+
```
|
|
1108
|
+
|
|
1109
|
+
### 多个测试互相污染状态
|
|
1110
|
+
|
|
1111
|
+
并发测试时必须用独立的 `XFLOW_PROJECT_ROOT`:
|
|
1112
|
+
```javascript
|
|
1113
|
+
const projectRoot = mkdtempSync(join(tmpdir(), 'xflow-test-'));
|
|
1114
|
+
spawnSync('node', ['bin/xflow.js', 'workflow', 'run', yaml], {
|
|
1115
|
+
env: { ...process.env, CHANGE_ID: 'test-1', XFLOW_PROJECT_ROOT: projectRoot }
|
|
1116
|
+
});
|
|
1117
|
+
```
|
|
1118
|
+
|
|
1119
|
+
### corps workflow 的 llm-judge gate 一直返回 needs_human
|
|
1120
|
+
|
|
1121
|
+
在没有 HTTP server 的情况下,`llm-judge` 默认退化为 `needs_human`。
|
|
1122
|
+
确认 HTTP server 已启动:
|
|
1123
|
+
```bash
|
|
1124
|
+
curl http://localhost:8787/api/health # 应返回 {"ok":true}
|
|
1125
|
+
```
|