Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# G02 工作流与现有 Standard golden 的可解释差异

对照对象:仓库已冻结示例 `examples/editorial.workflow.js`(及其 `editorial.compiled.mjs` / `editorial.mmd`),它是 Standard 八类节点的回归 golden,由 `tests/runtime/golden.test.mjs` 维护。本文件只解释差异,不更新该 golden,也不把 editorial 的能力记为 Interactive 已实现。

| 维度 | editorial golden | G02 `feature-review.workflow.js` | 说明 |
|---|---|---|---|
| 产品目的 | 编辑审批:起草、并行审阅、循环修复、人工批准、发布 | 功能变更评审:入口门禁、需求分析、技术设计、独立评审、终态 | 都是“分析/评审/结论”类闭环,但业务对象不同 |
| 节点种类 | Action、Agent、Parallel、Condition、Loop、Verification、Human、Terminal | Condition、Agent、Terminal | G02 必须同时通过 Interactive P0-A 功能门禁,因此不放入尚未实现可恢复路径的节点 |
| 条件路由 | `styleOk && factOk` 决定进入批准或质量循环 | `materialsReady` 决定是否进入分析;`reviewApproved` 决定成功或失败终态 | 都由编译后的 JS 调用 `evalWhen` / Interactive `advance()` 求值,而不是由模型选择下一节点 |
| 重试 | 起草 Agent `retries: 1`;另有 Loop 质量预算 | 仅评审 Agent `retries: 1`;分析/设计 `retries: 0` | G02 用 Schema 校验失败演示一次可控重试,不引入 Loop |
| 并行 | `reviews` 并行 style/fact,`all_succeeded` | 无 | Parallel 属于 Standard 已实现、Interactive 未实现(P1/P2) |
| 人工/动作 | Human 批准/拒绝;Action 准备、修复、修订、发布 | 无 | 这些是 Standard 已实现语义;Interactive 要到 P0-B。G02 不把它们算进 Interactive 验收 |
| 编译器 | 同一套 Standard 静态分析器与 `flowkit compile` | 同一分析器;另外再走 `compileInteractive` 生成独立的 `.interactive.mjs` | 没有第二套 DSL 解析器 |
| 执行入口 | Standard `run()` | 同时演示 Standard `run()` 与 Interactive Coordinator/Trusted Host | Interactive 产物不能用 Standard `run()` 加载,反之亦然 |
| Agent 输出来源 | 示例适配器按 Skill 词汇生成固定对象,不调用真实模型 | 成功/拒绝路径的 Agent 正文由 Grok 在看到 Pending 后撰写;非法评审是脚本负例 | 证据等级不同,见夹具说明 |

结论:G02 有意使用 P0-A 可执行子集来验证“意图 → DSL → 真实 JS Program → 程序决定分支”的产品闭环;完整八类节点的 Standard 行为仍以 editorial golden 为准,不在本阶段扩展 Interactive。
38 changes: 38 additions & 0 deletions docs/evidence/g02-intent-js-closed-loop-20261112/HASHES.sha256
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
8df70cd1af7dd9b0b5ea2c2143815c8aca862696f580fa46b21f726c021ec592 examples/g02/feature-review.workflow.js
5c2f8a1e4ce0faeeb2d95176bcd3b5c70dd270e1096f20d1bc2b69360f995ed5 examples/g02/feature-review.compiled.mjs
8d811766fd1d58456ce4e58cc2a2f04c4d1e36dd683f86496c2df946cb15eded examples/g02/feature-review.interactive.mjs
82be98702a59ae251265a0eae9bbe4a3e60654d88bb16f96ac24f5f93166aa6b examples/g02/feature-review.mmd
26653dd276028a77660f9268c22c2c1a023bbc8352d0f69a0d7159e6b36f5b08 examples/g02/skills/analyze.md
c14f956000b3bf9e3786af50a85c01d2b282b087f4cc4606ccffa47616ae0ba9 examples/g02/skills/design.md
464ddaea7cce6f7d2479db0b3fa91d36fd75e28a346661b19c5b29d70decf5ed examples/g02/skills/review.md
9ea9606d0aca8dbb15478fbdccf511cd2ac9672cd51cf4aa1f190f2d390a0acb examples/g02/README.md
d47177cd5bacd17727c10da4efe32ab07758762a8d909b47c58c7ebbae4aaf67 examples/g02/run-interactive.mjs
dc533fb324204cbddeb62a5046fd18779e3a4137095ca4b0aadc8bd74a57e56d tests/fixtures/g02/turns-review-false.json
3aec13cf3fc8f851350656a879aa391e33cd33defe1c73b6552107174e311637 tests/fixtures/g02/turns-success-retry.json
d4380d813435a1249ebc2515b82ba00842ffab73bbbf03b41cb2b118f0d48119 tests/interactive/g02-product-closed-loop.test.mjs
aa4712816a41cd509c7d00227b253b187526e32b130c1ce6df79444435808054 docs/evidence/g02-intent-js-closed-loop-20261112/README.md
acccfc9b1782863557884ce4b8263e47d8130bbae8bfa918567009a2a6a4333b docs/evidence/g02-intent-js-closed-loop-20261112/07-standard-golden-diff.md
8f62bacd12654004b5b75c98b5279281001b99cb6a029a641b412319478fe45e docs/evidence/g02-intent-js-closed-loop-20261112/cli/00-timestamp.txt
19eaf43821a7660ec323a87c8457bf74823beb296c39f5e01aa8a683aa50f061 docs/evidence/g02-intent-js-closed-loop-20261112/cli/attempt-01-check.exit.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 docs/evidence/g02-intent-js-closed-loop-20261112/cli/attempt-01-check.stderr.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 docs/evidence/g02-intent-js-closed-loop-20261112/cli/attempt-01-check.stdout.txt
19eaf43821a7660ec323a87c8457bf74823beb296c39f5e01aa8a683aa50f061 docs/evidence/g02-intent-js-closed-loop-20261112/cli/attempt-01-compile.exit.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 docs/evidence/g02-intent-js-closed-loop-20261112/cli/attempt-01-compile.stderr.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 docs/evidence/g02-intent-js-closed-loop-20261112/cli/attempt-01-compile.stdout.txt
95e4d85ba0a5f006130163dbcd634f16334ca086ecb9c123e3d38f5291510951 docs/evidence/g02-intent-js-closed-loop-20261112/cli/attempt-01-interactive-compile.json
1017181cab7dee17344997bf532bdd82e4589c930e8aba27ec2734fe2409fcee docs/evidence/g02-intent-js-closed-loop-20261112/execution/00-env.txt
d83a6c9a84da539a1cba34f1d9e77c7df4d862dbef8bc096b85702b49d7f0364 docs/evidence/g02-intent-js-closed-loop-20261112/execution/interactive-run.exit.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 docs/evidence/g02-intent-js-closed-loop-20261112/execution/interactive-run.stderr.txt
56e24cf17a253f42a96289540473b9839b5ed69f2c5ace49b6102f10e7eda3ee docs/evidence/g02-intent-js-closed-loop-20261112/execution/interactive-run.stdout.json
e01a5b5252b8a0bffd0b9e9d7e80311beeae9e4d9eeea0faabcdf8a3c3bf249e docs/evidence/g02-intent-js-closed-loop-20261112/execution/local-g02-tests.exit.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 docs/evidence/g02-intent-js-closed-loop-20261112/execution/local-g02-tests.stderr.txt
46ba14286185325effe1e611f53750ac8ee7be01ab81fd40e0ddf79cfeec211b docs/evidence/g02-intent-js-closed-loop-20261112/execution/local-g02-tests.stdout.txt
9cdac5e8dac099f5d7ddcc978954fe17e9419d6c329fb6b8896ba51e991948a3 docs/evidence/g02-intent-js-closed-loop-20261112/execution/local-npm-test.summary.txt
05e2066203713f7c9f74d74b965ab2b12dc57d2c27843728cfabd5edae29875c docs/evidence/g02-intent-js-closed-loop-20261112/execution/r02-pending-counts-measured.json
b16a74729a277c11d5e28daf8b2691f248250d8b4221cc7129fb659ee306d56c docs/evidence/g02-intent-js-closed-loop-20261112/execution/standard-run.exit.txt
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 docs/evidence/g02-intent-js-closed-loop-20261112/execution/standard-run.stderr.txt
e0785102cc8fd7a28f4bb6a851581a84371e27638c035267d8896f04a4932e7c docs/evidence/g02-intent-js-closed-loop-20261112/execution/standard-run.stdout.json
be60fe6a557e18f6b34e1360b536f137c9711a5ab69a5afd0eb093636eef17c4 docs/evidence/g02-intent-js-closed-loop-20261112/dsl-generation/00-prompt.md
76ddeea02e9ef200a170c0768f044c7d8f2d07a8b3b13c0f22f75abfe9226dd4 docs/evidence/g02-intent-js-closed-loop-20261112/dsl-generation/00-user-intent.md
ef2b7b97991a24ea539d55a2c071bbeaba520956a4567ecbc5455a1d85798d0e docs/evidence/g02-intent-js-closed-loop-20261112/dsl-generation/attempt-01-notes.md
8df70cd1af7dd9b0b5ea2c2143815c8aca862696f580fa46b21f726c021ec592 docs/evidence/g02-intent-js-closed-loop-20261112/dsl-generation/attempt-01-raw.workflow.js
15 changes: 15 additions & 0 deletions docs/evidence/g02-intent-js-closed-loop-20261112/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# G02 证据目录(2026-11-12,Asia/Shanghai)

本目录保存 G02「真实用户意图 → Workflow DSL → 可执行 JavaScript → Standard / Interactive P0-A 执行」的原始输入、编译日志和本地复现输出。它不是新的需求或技术设计,也不构成独立复审 PASS。

| 路径 | 内容 |
|---|---|
| `dsl-generation/` | Grok 生成 `.workflow.js` 时的完整输入、第一次原始输出,以及“一次通过、无第二次尝试”的说明 |
| `cli/` | 官方 `flowkit compile` / `flowkit check` 与 `compileInteractive` 的原始输出、退出码和 Program 身份 |
| `execution/` | Standard `run()`、Interactive 夹具重放、本地 `node --test` 的原始日志 |
| `07-standard-golden-diff.md` | 与 `examples/editorial.workflow.js` golden 的可解释差异 |
| `HASHES.sha256` | 上述文件及示例/夹具的 SHA-256 |

证据分级:编译与 JS/SQLite 执行为 P;`source=grok-model` 为 M 层结果消费(6 次消费 / 5 份独立正文 / 1 次复用并重新绑定 Pending 身份,不是 6 次独立模型推理);`source=scripted-invalid` 是脚本负例。`pendingAtEnd` 只描述终态帧;`publishedPendingCount` 来自实际执行 route。本环境用 Node 和 FlowKit CLI 执行 JavaScript,**不得**标为 N-PASS 或原生安全 Host 来源认证。GitHub CI 7/7 只证明仓库回归,不证明原生 Grok 工具或跨用户 OS 隔离。

正式审查请同时使用 GitHub PR、精确 HEAD、本目录与交接包中的 `STAGE-REVIEW-REPORT.md`。
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
2026-11-12 17:10:07 CST
node: v24.22.1
cwd: /workspace/flowkit
HEAD: 7e5960fc570f0cd91a5ff8e9fe6029345932442f
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
exit=0
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
exit=0
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"timestamp": "2026-11-12T09:10:12.013Z",
"diagnostics": [],
"artifactPath": "/workspace/flowkit/examples/g02/feature-review.interactive.mjs",
"programIdentity": {
"workflowId": "g02-feature-review",
"workflowVersion": "1.0.0",
"sourceHash": "sha256:8df70cd1af7dd9b0b5ea2c2143815c8aca862696f580fa46b21f726c021ec592",
"compilerVersion": "1.0.0",
"programAbiVersion": 1,
"semanticsVersion": "interactive-state-machine-v1",
"checkpointSchemaVersion": 1,
"canonicalizationVersion": "jcs-rfc8785-v1",
"implementedStage": "P0-A",
"artifactHash": "sha256:8d811766fd1d58456ce4e58cc2a2f04c4d1e36dd683f86496c2df946cb15eded"
},
"codeBytes": 15015,
"codeSha256": "8d811766fd1d58456ce4e58cc2a2f04c4d1e36dd683f86496c2df946cb15eded"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# G02 DSL 生成:Grok Build 原始模型输入

记录时间:2026-11-12,Asia/Shanghai。
角色:Grok Bot / Grok Build,作为真实模型阅读用户意图,并按 FlowKit 现有 DSL 生成 `.workflow.js`。
本文件是生成尝试使用的完整输入。输出见同目录 `attempt-NN-raw.workflow.js`;若编译失败,后续尝试会完整保留,不会覆盖本输入或更早输出。

## 用户意图

见仓库文件 `examples/g02/user-intent.md`(生成时已完整阅读,内容与该文件一致)。

## 已阅读的现有 DSL 约束(摘自仓库,不是新语法)

- 从 `@devcodex-labs/flowkit/dsl` 导入 `defineWorkflow` 以及节点构造器。Agent 步骤使用 `node()`,并提供 `agent` 或 `skill`;条件使用 `condition()`;终态使用 `terminal()`。
- `export default defineWorkflow({ id, version, name, nodes })`。
- `id` 必须是 kebab-case,最多 64 字符;`version` 遵循 SemVer 2.0。
- Agent 节点需要 `name`、`agent` 或 `skill`、对象类型的 `output` schema、`next`。`retries` 为 0–10 的整数;缺省为 2。`inputs` 声明从 State 读取的键,缺失键进入 `missing`,不得被合成 null。
- 条件节点 `branches` 为 1–20 项,最后一项的 `when` 必须是 `'true'`。`when` 是针对 State 的表达式字符串,不能包含换行或反斜杠。
- 终端节点 `status` 只能是 `succeeded` 或 `failed`。
- 工作流文件名必须以 `.workflow.js` 或 `.workflow.ts` 结尾。
- Interactive P0-A 只允许 Condition / Terminal / 基本 Agent(无 Agent verify/checkStep,无 Human/Action/Loop/Parallel)。本任务的 DSL 必须能通过 `compileInteractive(..., { featureStage: 'P0-A' })`,因此不放入 P0-A 未实现的节点。
- 参考已有示例:`examples/interactive/c01-live-chatgpt.workflow.js`、`examples/editorial.workflow.js` 的构造方式。不要复制 C01 的业务文本,本任务是独立的功能变更评审闭环。

## 生成要求

只输出一份完整的、可保存为 `feature-review.workflow.js` 的 ESM 源码。不要输出 Mermaid、JSON 节点计划或伪代码来代替 DSL。节点后继必须写在 DSL 里,让编译后的 JS Program 做路由。
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# G02 用户意图(真实任务原文)

记录时间:2026-11-12,Asia/Shanghai。
本文件是 Grok Build 在生成本阶段 `.workflow.js` 时实际阅读的用户任务原文,未事后改写需求。

## 任务名称

内部「功能变更评审」可执行闭环。

## 任务正文

请为 FlowKit 内部维护团队设计一个可重复执行的「功能变更评审」工作流,用来处理维护者提交的功能请求。要求如下:

1. 入口先检查材料是否齐全(状态字段 `materialsReady`)。若材料不齐全,流程必须直接失败结束,不得调用任何 Agent。
2. 若材料齐全,按固定顺序执行三个 Agent 步骤,模型不得自行选择下一个节点:
- 需求分析:阅读功能请求 `request`,输出 `requirementSummary`(字符串)。
- 技术设计:基于上一节点的需求分析,输出 `designSummary`(字符串)。
- 独立评审:同时阅读需求摘要和技术设计摘要,输出 `reviewApproved`(布尔)和 `reviewNotes`(字符串)。评审结果必须符合约定的 JSON 对象 schema;非法输出允许重试一次。
3. 评审通过则成功结束;评审不通过则失败结束,并给出可核查终态。
4. 流程推进、条件分支、重试与后继节点必须由 FlowKit 编译出的 JavaScript Program 决定,而不是由模型在回答里指定下一个节点。
5. 只使用 FlowKit 现有 DSL 语法,不要发明第二套解析器、模型网关或独立 FlowKit Server。Interactive 验收仅使用已实现的 P0-A 子集:Condition、Terminal、基本 Agent。Standard 可用同一份 DSL 展示已实现的 Agent/Condition/Terminal 语义;Loop/Action/Human/Parallel 不是本任务的必要步骤,对照现有 editorial golden 说明差异即可。

## 本次实际提交的功能请求(作为工作流输入 `request`)

为 FlowKit 维护者增加一条只读的工作流运行摘要查看能力:在不修改现有 Standard Root 六个 API、不引入独立 FlowKit Server 的前提下,允许受信 Host 读取一次运行的终态状态(succeeded/failed/errored)、terminal 节点和公开投影,便于排障。不在本阶段实现 adminTerminate,也不改变 Interactive P0-A 的节点范围。

说明:上述功能请求只是本工作流要评审的业务对象,G02 阶段本身并不实现该能力。
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# DSL 生成尝试记录

- 尝试次数:1。第一次输出已通过官方 `flowkit compile` 与 `flowkit check`(exit code 0,无诊断),以及 `compileInteractive({ featureStage: 'P0-A', skillCheck: true })`。因此没有 attempt-02。
- 原始输入:`00-prompt.md`、`00-user-intent.md`
- 原始输出(生成后、编译前原样保留):`attempt-01-raw.workflow.js`
- 采纳结果:该文件字节与 `examples/g02/feature-review.workflow.js` 一致,SHA-256 `8df70cd1af7dd9b0b5ea2c2143815c8aca862696f580fa46b21f726c021ec592`
- 编译命令与退出码:见 `../cli/`
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { defineWorkflow, condition, node, terminal } from '@devcodex-labs/flowkit/dsl';

export default defineWorkflow({
id: 'g02-feature-review',
version: '1.0.0',
name: '功能变更评审闭环',
nodes: [
condition('gate', {
name: '检查材料是否齐全',
branches: [
{ when: 'materialsReady', next: 'analyze' },
{ when: 'true', next: 'rejected' },
],
}),
node('analyze', {
name: '需求分析',
agent: 'analyze',
inputs: ['request'],
output: {
type: 'object',
properties: { requirementSummary: { type: 'string' } },
required: ['requirementSummary'],
additionalProperties: false,
},
retries: 0,
next: 'design',
}),
node('design', {
name: '技术设计',
agent: 'design',
inputs: ['requirementSummary'],
output: {
type: 'object',
properties: { designSummary: { type: 'string' } },
required: ['designSummary'],
additionalProperties: false,
},
retries: 0,
next: 'review',
}),
node('review', {
name: '独立评审',
agent: 'review',
inputs: ['requirementSummary', 'designSummary'],
output: {
type: 'object',
properties: {
reviewApproved: { type: 'boolean' },
reviewNotes: { type: 'string' },
},
required: ['reviewApproved', 'reviewNotes'],
additionalProperties: false,
},
retries: 1,
next: 'decide',
}),
condition('decide', {
name: '根据评审结论分流',
branches: [
{ when: 'reviewApproved', next: 'accepted' },
{ when: 'true', next: 'rejected' },
],
}),
terminal('accepted', { name: '评审通过', status: 'succeeded' }),
terminal('rejected', { name: '评审未通过或材料不齐', status: 'failed' }),
],
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
2026-11-12 17:56:18 CST
node v24.22.1
HEAD 689e0bd97127bf32116bdfa37f88b8e013f3adb2 (pre-commit working tree for G02-R01/R02)
note=R01/R02 evidence refresh; pending counts measured from run-interactive.mjs route, not hardcoded
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
interactive_exit=0
Loading