@istuen/openxenon 0.1.7

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.
@@ -0,0 +1,423 @@
1
+ ---
2
+ name: oxn-work
3
+ description: 发起 + 驱动 OpenXenon Work v1.1(创建 work.oxn + tasks/<name>/task.oxn,注入 domain;含 v1.1 8 阶段流程:init→migrate→create→add-task→validate→lock→run→submit/status,强制 lock 边界守卫 .work.planLock)
4
+ ---
5
+ # /oxn-work — 发起 + 驱动 OpenXenon Work v1.1
6
+
7
+ ## 目标
8
+
9
+ 依据 Blueprint 创建一个 **Work + 至少一个 Task** 的工作区,并在 v1.1 hard-switch 之后强制走 8 阶段流程:
10
+ - `work.oxn` — workspace 编排器(声明 ref 池 + task DAG)
11
+ - `tasks/<name>/task.oxn` — 单 blueprint 执行 + 显式 align
12
+
13
+ v1.1 hard-switch 之后,原 `oxn-leader` 已并入 `oxn work`,无独立 leader skill。
14
+
15
+ > **v1.1 升级要点**:所有 work 操作必须先 `work validate` 写 `.work` 静态门禁卡,再 `work lock` 锁住,然后才能 `work run`。Lock 后任何 `.oxn` 资产漂移 = `IAP_ALIGN_LOCK_HASH_MISMATCH`。
16
+
17
+ ## 前置条件
18
+
19
+ - 已在 OXN 项目根目录
20
+ - 项目已 `oxn init` 初始化(存在 `.openxenon/` 边界)
21
+ - 必须有 Blueprint(位于 `.openxenon/blueprints/<name>.oxn`),用 `oxn blueprint create` 创建
22
+ - **可选**:有 DDD Domain(位于 `.openxenon/domains/<kebab>.oxn`),用 `oxn domain create` 创建
23
+
24
+ ## Intent-Align 范式提醒
25
+
26
+ - **Domain** = 业务 Intent(term/ban/invariant)
27
+ - **Blueprint** = 技术 Intent(slot 拓扑)
28
+ - **Work** = Align 编排器(声明 ref 池)
29
+ - **Task** = Align 执行单元(align 1 blueprint + N domains)
30
+ - **Part / Probe** = **不是独立资产**,**内联**在 `task { part { probe {} } }` 块里
31
+
32
+ ## v1.1 8 阶段流程图
33
+
34
+ ```
35
+ init → migrate → create → add-task → validate → lock → run → submit / status
36
+ │ │
37
+ ▼ ▼
38
+ .work .work.planLock
39
+ 静态门禁卡 4 组件 hash
40
+ (workOxn/workDomains/
41
+ blueprints/tasks +
42
+ allHash)
43
+ 锁后任何漂移 →
44
+ IAP_ALIGN_LOCK_HASH_MISMATCH
45
+ ```
46
+
47
+ **8 阶段详解**:
48
+ - **0**: `oxn work migrate`(V0→V1 布局迁移,PR-10;新建 work 可跳过)
49
+ - **1**: `oxn work create`(建 work 骨架)
50
+ - **2**: `oxn work add-task`(建至少 1 个 task.oxn)
51
+ - **3**: `oxn work validate`(校验 work.oxn + 写 `.work`)
52
+ - **4**: `oxn work lock`(锁住:写 planLock + 4 组件 hash)
53
+ - **5**: `oxn work run`(启动状态机;要求 lock 完成)
54
+ - **6**: `oxn work submit`(推进 task 内 part)
55
+ - **7**: `oxn work status`(查询 work 状态)
56
+
57
+ ## 创建 Work + Task(v1.1 8 步)
58
+
59
+ ### 步骤 0(V0→V1 迁移,可选):`oxn work migrate`
60
+
61
+ ```bash
62
+ oxn work migrate <work-name>
63
+ # 把 V0 布局 works/<w>/work-state.json 等迁移到 V1 布局 .run/
64
+ # 原 V0 文件备份到 .migrated-v0/(不删,留审计)
65
+ ```
66
+
67
+ ### 步骤 1:创建 Domain(可选)
68
+
69
+ ```bash
70
+ oxn domain create MemberContext
71
+ oxn domain validate MemberContext
72
+ ```
73
+
74
+ ### 步骤 2:创建 Work 编排
75
+
76
+ ```bash
77
+ oxn work create <work-name> --blueprint <bp>
78
+ # 编辑 .openxenon/works/<work>/work.oxn
79
+ ```
80
+
81
+ 或手写:
82
+
83
+ ```oxn
84
+ work "MyFeature" {
85
+ context { goal = "..."; constraints = []; loop_policy { max_iterations = 3 } }
86
+ domain "MemberContext" ref "@prj/domains/MemberContext";
87
+ blueprint "dev-workflow" ref "@prj/blueprints/dev-workflow";
88
+ task "step1" {
89
+ domain "MemberContext";
90
+ blueprint "dev-workflow";
91
+ part "build" { skill_context = "..." }
92
+ deps = [];
93
+ }
94
+ }
95
+ ```
96
+
97
+ ### 步骤 3:创建至少一个 Task
98
+
99
+ ```bash
100
+ oxn work add-task \
101
+ --work <work-name> \
102
+ --task-name <task-name> \
103
+ --blueprint <blueprint-name> \
104
+ [--domain <DomainName>]
105
+ ```
106
+
107
+ ### 步骤 4:编辑 task 内容(手写 `task.oxn`)
108
+
109
+ ### 步骤 5:`work validate`
110
+
111
+ ```bash
112
+ oxn work validate <work-name> --json
113
+ # 校验 work.oxn + 写 .work 静态门禁卡(assets 快照:域/蓝图 fileHash)
114
+ # planLock 此时为 null(未锁)
115
+ ```
116
+
117
+ ### 步骤 6:`work lock`
118
+
119
+ ```bash
120
+ oxn work lock <work-name> --json
121
+ # 计算 4 组件 hash:
122
+ # workOxnHash = SHA-256(work.oxn)
123
+ # workDomainsHash = SHA-256(concatenated domain.oxn files)
124
+ # blueprintsHash = SHA-256(concatenated blueprint.oxn files)
125
+ # tasksHash = SHA-256(concatenated task.oxn files)
126
+ # 写入 .work.planLock + allHash
127
+ # 锁后任何 .oxn 资产漂移 = IAP_ALIGN_LOCK_HASH_MISMATCH
128
+ ```
129
+
130
+ `oxn work unlock`(解锁,清 planLock 保留 assets)
131
+
132
+ ### 步骤 7:驱动状态机
133
+
134
+ ```bash
135
+ oxn work run --work-file <work>/work.oxn --json
136
+ oxn work submit --work <w> --task <t> --json
137
+ oxn work status --work <w> --json
138
+ ```
139
+
140
+ ## 参考命令
141
+
142
+ | 想做什么 | 命令 |
143
+ |---|---|
144
+ | 初始化项目边界 | `oxn init` |
145
+ | 创建一个 Blueprint 骨架 | `oxn blueprint create <name> [--slots <list>]` |
146
+ | 创建一个 Domain 骨架 | `oxn domain create <Name>` |
147
+ | 验证 Blueprint / Domain | `oxn {blueprint,domain} validate <name>` |
148
+ | 列出所有 Domain | `oxn domain list` |
149
+ | **v1.1 V0→V1 布局迁移** | `oxn work migrate <w>` |
150
+ | 创建 work 骨架(含 task 块) | `oxn work create <w> --blueprint <bp>` |
151
+ | 列出 work 下所有 task | `oxn work list-tasks --work <w>` |
152
+ | 查看 task 状态 | `oxn work task-status --work <w> --task <t>` |
153
+ | 获取 AI 上下文(**全量隔离**) | `oxn work context --work <w> --task <t>` |
154
+ | **v1.1 校验 work.oxn + 写 .work** | `oxn work validate <w>` |
155
+ | **v1.1 锁 work(planLock + 4 组件 hash)** | `oxn work lock <w>` |
156
+ | **v1.1 解锁 work** | `oxn work unlock <w>` |
157
+ | 启动 work 状态机 | `oxn work run --work-file <work.oxn>` |
158
+ | 推进 task 内 part | `oxn work submit --work <w> --task <t>` |
159
+ | 查询 work 状态 | `oxn work status --work <w>` |
160
+
161
+ ## V0→V1 路径映射
162
+
163
+ v1.1 把 work 运行时状态从 work.oxn 同级目录搬到 `.run/` 子目录,方便 lock 守卫写静态卡:
164
+
165
+ | V0 路径 | V1 路径 |
166
+ |---|---|
167
+ | `works/<w>/work-state.json` | `works/<w>/.run/state.json` |
168
+ | `works/<w>/work-trace.jsonl` | `works/<w>/.run/trace.jsonl` |
169
+ | `works/<w>/work-frozen.json` | `works/<w>/.run/frozen.json` |
170
+ | `works/<w>/tasks/<t>/task-state.json` | `works/<w>/tasks/<t>/state.json` |
171
+ | `works/<w>/tasks/<t>/task-trace.jsonl` | `works/<w>/tasks/<t>/trace.jsonl` |
172
+ | `works/<w>/tasks/<t>/task-frozen.json` | `works/<w>/tasks/<t>/frozen.json` |
173
+ | (无) | `works/<w>/.work`(静态门禁卡) |
174
+ | (无) | `works/<w>/.migrated-v0/<rel>`(V0 备份) |
175
+
176
+ 更紧凑表达(grep 模式):
177
+ - V0: `works/<w>/work-{state,trace,frozen}.{json,jsonl}`
178
+ - V1: `works/<w>/.run/{state,trace,frozen}.{json,jsonl}`
179
+
180
+ 迁移工具:`oxn work migrate <w>`(V0 备份到 `.migrated-v0/` 供审计,不删)。
181
+
182
+ ## v1.1 错误处理速查
183
+
184
+ | 错误码 | 触发条件 | 行动 |
185
+ |---|---|---|
186
+ | `IAP_ALIGN_CHECKLIST_MISSING` | task.part.intent_checklist 必填缺失 | YIELD_TO_HUMAN |
187
+ | `IAP_ALIGN_LOCK_NOT_FOUND` | .work.planLock 缺失/未锁 | YIELD_TO_HUMAN:未调 `oxn work lock` / init 缺失 |
188
+ | `IAP_ALIGN_LOCK_HASH_MISMATCH` | 4 组件 hash 之一漂移(workOxn/workDomains/blueprints/tasks) | YIELD_TO_HUMAN:context.component 字段定位漂移源 |
189
+ | `IAP_ALIGN_WORK_REMOVED` | work.oxn 失踪但 .work 还在(锁后被破坏) | YIELD_TO_HUMAN(区别于 WORK_NOT_FOUND:两个都无) |
190
+
191
+ 三剑客守卫次序:先校验 planLock 存在 → 再校验 4 组件 hash → 最后校验 work.oxn 存在。
192
+
193
+ ## 反模式
194
+
195
+ - **不要跳过 validate+lock 直接 run** — 触发 `IAP_ALIGN_LOCK_NOT_FOUND`
196
+ - **不要绕过 lock 守卫跑生产** — 无 `--force` 后门
197
+ - **不要在锁后修改 .oxn** — 触发 `IAP_ALIGN_LOCK_HASH_MISMATCH`(planLock 已冻 4 组件 hash)
198
+ - **不要删 .work 文件** — 丢失静态门禁卡 = LOCK_NOT_FOUND
199
+ - **不要先 submit 后 run** — `work run` 是 setup,`submit` 是 advance
200
+ - **不要跳过 task 创建** — `work run` 会 fail-fast 拦截(`OXN_TASK_OXN_MISSING`)
201
+ - **不要在 work.oxn 引用 task.oxn 不存在的 task 名** — `work run` 校验失败
202
+ - **不要把 ref 与 align 混为一谈** — `domain "X" ref "..."` 是 work 级声明,task 内 `domain "X"` 是 align
203
+ - **不要在 task 块外加 `part` 字段** — part 必须嵌套在 task 块内
204
+ - **不要写 `task "X" align "Y.Z"`** — 已废弃,改为 `task "X" { blueprint "Y"; part "Z" }`
205
+ - **不要写 `inject "X"`** — 已废弃,改为 task 内 `domain "X"`
206
+ - **不要在 Domain 用 `noun`/`verb`/`domain_rules`** — 改为 `term`/`ban`/`invariant`
207
+ - **不要在 Blueprint 加 `expectation`/`rule` 块** — 已删除,验证由 Probe 承担
208
+ - **不要写 `work "X" ref "@oxn/blueprints/Y"`** — 已废弃,改为 `blueprint "Y" ref "...";` 声明
209
+ - **不要写 `oxn work new`** — 改用 `oxn work create`
210
+ - **不要试图 `oxn part new` / `oxn probe new`** — Part / Probe **不是独立资产**,在 task 块内联写
211
+
212
+ ## .work 静态门禁卡(v1.1 新增)
213
+
214
+ **v1.1 新增** `.work` 静态门禁卡:planLock(4 组件 hash)+ assets(域/蓝图 fileHash)+ context(goal/constraints/maxIterations)+ diagnostics(PR-14 软警告)。写一次后只读。
215
+
216
+ ```json
217
+ {
218
+ "planLock": {
219
+ "workOxnHash": "64-hex SHA-256",
220
+ "workDomainsHash": "64-hex SHA-256",
221
+ "blueprintsHash": "64-hex SHA-256",
222
+ "tasksHash": "64-hex SHA-256",
223
+ "allHash": "64-hex SHA-256(4 组件综合)"
224
+ },
225
+ "assets": { "domains": [...], "blueprints": [...] },
226
+ "context": { "goal": "...", "constraints": [...], "maxIterations": 5 }
227
+ }
228
+ ```
229
+
230
+ `planLock` 内 `workOxnHash` / `workDomainsHash` / `blueprintsHash` / `tasksHash` / `allHash` 与 4 组件 hash 一起做 lock 守卫。
231
+
232
+ ## work.oxn 4 大模式(AI 创作模板库)
233
+
234
+ > 下面 4 个模式对应 `src/oxl/examples/works/` 下的真实范例,可直接 fork 改写。
235
+
236
+ ### 模式 1:单域单 task(explore 类)
237
+
238
+ **适用**:探索性工作(摸清一个域的结构 / 收集信息),不需要完整流水线。
239
+
240
+ **骨架**(参考 `examples/works/explore-dsl/work.oxn`):
241
+
242
+ ```oxn
243
+ work "explore-dsl" {
244
+ context {
245
+ goal = "探索 OXL 语法结构,生成分析报告"
246
+ constraints = ["使用 oxn 命令而非直接读源码"]
247
+ loop_policy { max_iterations = 3 }
248
+ }
249
+ domain "DSLContext" ref "@prj/domains/dsl-context"
250
+ blueprint "explore-analyze-report" ref "@prj/blueprints/explore-analyze-report"
251
+
252
+ task "explore" {
253
+ domain "DSLContext"
254
+ blueprint "explore-analyze-report"
255
+ deps = []
256
+ part "explore" {
257
+ skill_context = "探索 grammar/schema/validator/compiler 四个子模块"
258
+ acceptance = [
259
+ "已读 src/oxl/langium/oxn.langium",
260
+ "已用 oxn dev compile 跑通一个范例",
261
+ "输出 .openxenon/works/<w>/report.md"
262
+ ]
263
+ }
264
+ }
265
+ }
266
+ ```
267
+
268
+ **口诀**:1 work + 1 task + 1 domain + 1 blueprint(slot 数 = task 数)。
269
+
270
+ ### 模式 2:单域多 part(develop 类)
271
+
272
+ **适用**:单域深度开发(一个限界上下文内的完整实现)。
273
+
274
+ ```oxn
275
+ work "develop-member" {
276
+ context {
277
+ goal = "实现新会员注册功能"
278
+ constraints = [
279
+ "必须使用 MemberContext.term.Member,不能用 User/Customer",
280
+ "密码必须 hash 后存储"
281
+ ]
282
+ loop_policy { max_iterations = 5 }
283
+ }
284
+ domain "MemberContext" ref "@prj/domains/member-context"
285
+ blueprint "dev-workflow" ref "@prj/blueprints/dev-workflow"
286
+
287
+ task "register-member" {
288
+ domain "MemberContext"
289
+ blueprint "dev-workflow"
290
+ deps = []
291
+ part "develop" { skill_context = "实现 Member 注册功能" }
292
+ part "test" { skill_context = "为 Member 注册写单测" }
293
+ part "verify" { skill_context = "端到端验证注册流程" }
294
+ }
295
+ }
296
+ ```
297
+
298
+ **口诀**:1 work + 1 task(带多 part,对齐 blueprint 的多个 slot)+ 1 domain。Part 数 = Blueprint slot 数。
299
+
300
+ ### 模式 3:多 task 串行(fix 类)
301
+
302
+ ```oxn
303
+ work "fix-issue" {
304
+ context {
305
+ goal = "修复 work state 在 submit 后未及时持久化的 bug"
306
+ constraints = ["不破坏现有 leader 状态机", "frozen.json 路径不能改"]
307
+ loop_policy { max_iterations = 5 }
308
+ }
309
+ domain "WorkContext" ref "@prj/domains/work-context"
310
+ blueprint "fix-issue" ref "@prj/blueprints/fix-issue"
311
+
312
+ task "diagnose" { domain "WorkContext"; blueprint "fix-issue"; deps = []
313
+ part "diagnose" { skill_context = "复现 bug,记录现场" }
314
+ }
315
+ task "locate" { domain "WorkContext"; blueprint "fix-issue"; deps = ["diagnose"]
316
+ part "locate" { skill_context = "定位根本原因" }
317
+ }
318
+ task "fix" { domain "WorkContext"; blueprint "fix-issue"; deps = ["locate"]
319
+ part "fix" { skill_context = "实施修复方案" }
320
+ }
321
+ task "verify" { domain "WorkContext"; blueprint "fix-issue"; deps = ["fix"]
322
+ part "verify" { skill_context = "验证修复结果" }
323
+ }
324
+ }
325
+ ```
326
+
327
+ **口诀**:N task 链式 `deps`,每个 task align 同一个 blueprint 的不同 slot。Domain 共享。
328
+
329
+ ### 模式 4:跨域编排(onboarding 类)
330
+
331
+ ```oxn
332
+ work "NewUserOnboarding" {
333
+ context {
334
+ goal = "完成新会员注册并发放欢迎福利"
335
+ constraints = ["不能直接读订单库", "必须调用订单上下文的能力"]
336
+ loop_policy { max_iterations = 5 }
337
+ }
338
+
339
+ domain "MemberContext" ref "@prj/domains/MemberContext"
340
+ domain "OrderContext" ref "@prj/domains/OrderContext"
341
+ blueprint "dev-workflow" ref "@prj/blueprints/dev-workflow"
342
+
343
+ task "RegisterMember" {
344
+ domain "MemberContext"
345
+ blueprint "dev-workflow"
346
+ deps = []
347
+ part "develop" {
348
+ skill_context = "实现 Member 注册 API,密码必须加密"
349
+ }
350
+ }
351
+ }
352
+ ```
353
+
354
+ **口诀**:work 级声明 N 个 domain,每个 task 按需 inject 1 个;domain 内部用 `term / ban / invariant` 三件套表达统一语言与硬规则;`invariant` 写法决策(1 条→单块单条 / 同主题→单块多条 / 异主题→多块按 `// ── <主题> ──` 分组)见 oxn-cli skill 的「invariant 写法决策树」章节,三者 IR 等价。
355
+
356
+ ### 模式选择速查
357
+
358
+ | 你的需求 | 选哪个模式 | 关键标志 |
359
+ |---|---|---|
360
+ | 摸清一个域、写报告 | 模式 1(explore) | 1 task + 1 blueprint slot |
361
+ | 单域完整开发 | 模式 2(develop) | 1 task 多 part(= blueprint 多 slot) |
362
+ | bug 修复、流程化诊断 | 模式 3(fix) | N task 串行 deps |
363
+ | 跨多个限界上下文 | 模式 4(onboarding) | work 级 N domain + task 按需 inject |
364
+
365
+ ## git 工作空间指引(v0.0.27+)
366
+
367
+ OXN 在 git worktree 场景下提供 **builtin `git-workflow` 蓝图**(`src/builtin/blueprints/git-workflow.oxn`),4 阶段 slot 全部对接 L1 git 适配器(`src/infra/git/workspace.ts`)+ 4 个 catalog 探针(`git-clean` / `git-branch-exists` / `git-status-clean` / `git-merge-feasible`)。
368
+
369
+ **核心边界**:**OXN 永远不替人 commit / push / merge**。它只观察并产出可合并性证据,让人类在 `git merge` 时消费。
370
+
371
+ ### 派生 builtin 蓝图(标准 cp 约定)
372
+
373
+ ```bash
374
+ oxn init
375
+ cp src/builtin/blueprints/git-workflow.oxn .openxenon/blueprints/git-workflow.oxn
376
+ oxn domain create ProgramContext # 至少含 term: WorkingTree / Branch / MergeCommit
377
+ oxn blueprint validate git-workflow
378
+ ```
379
+
380
+ ### 与 work 8 阶段流程集成
381
+
382
+ ```bash
383
+ oxn work create gw-feat-x --blueprint git-workflow
384
+ oxn work add-task gw-feat-x --task ship --blueprint git-workflow --domain ProgramContext
385
+ # 编辑 work.oxn + tasks/ship/task.oxn(4 part = 4 slot)
386
+ oxn work validate gw-feat-x --json
387
+ oxn work lock gw-feat-x --json
388
+ ```
389
+
390
+ ### 人工 git 操作(OXN 不参与)
391
+
392
+ ```bash
393
+ git worktree add -b feat/gw-feat-x ../wt-feat-x
394
+ cd ../wt-feat-x && $EDITOR files && git add -A && git commit -m "feat: ..."
395
+ cd -
396
+ oxn work run gw-feat-x --json
397
+ oxn work submit gw-feat-x --task ship --json # 4 次(4 part = 4 slot)
398
+ oxn work status gw-feat-x --json # overallStatus = passed
399
+ ```
400
+
401
+ ### 拿到可合并性证据(关键)
402
+
403
+ `oxn work context` 不暴露 `checkMergeFeasibility`(写工作空间 → 违反 OXN 不替人决策边界)。要拿到证据,**手工调探针**或读 L1 适配器:
404
+
405
+ ```bash
406
+ # E2E 测试演示(src/cli/__tests__/work-git-workspace-e2e.test.ts)
407
+ # 调 checkMergeFeasibility(branch, 'main', worktreePath):
408
+ # → can_ff_merge / can_merge_clean / has_conflicts / dirty_worktree / unknown
409
+ ```
410
+
411
+ ### 不做的事
412
+
413
+ - ❌ `oxn work create --worktree`(方案 C,未实现)
414
+ - ❌ OXN 替人 commit / merge(哲学边界)
415
+ - ❌ 锁后漂移源 `.oxn`(不会触发 planLock — 锁的是 per-work slim 索引 `works/<w>/blueprints.json`)
416
+
417
+ ### 进一步阅读
418
+
419
+ - 详细设计:`docs/architecture/git-workflow-workspace.md`
420
+ - 4 probe 注册:`src/kernel/verdicts/catalog.ts:390-491`
421
+ - L1 适配器:`src/infra/git/workspace.ts:1-317`
422
+ - E2E 端到端验证:`src/cli/__tests__/work-git-workspace-e2e.test.ts`
423
+