refactor: redesign workflow trigger — signal entails workflow #205

Merged
xingyue merged 1 commits from refactor/204-workflow-trigger into main 2026-04-27 13:28:48 +00:00
Owner

What

Redesign sense compute → workflow trigger:Signal 和 Workflow 从互斥改为蕴含关系。

Changes

  • ComputeResult<T>: null | { signal: T; workflow: WorkflowTrigger | null } — signal 必须,workflow 附带
  • WorkflowTrigger: 结构化四参数 { name, maxRounds, prompt, dryRun },去掉 pipe 分隔
  • Kernel: 先 bus.emit(signal)startWorkflow() — 保持因果链
  • CLI: nerve workflow trigger <name> --max-rounds N --prompt "..." --dry-run
  • 向后兼容: 裸返回值(非 { signal } 结构)仍作为 signal-only 处理
  • 新增 sense-workflow-directive.test.ts,kernel 集成测试增加顺序断言

Breaking Changes

  • { workflow: "name|n|prompt" } 字符串格式不再支持
  • CLI --payload JSON 参数改为 --max-rounds / --prompt / --dry-run

Verification

  • pnpm run build
  • pnpm -r test
  • pnpm run check

Fixes #204

## What Redesign sense compute → workflow trigger:Signal 和 Workflow 从互斥改为蕴含关系。 ## Changes - **`ComputeResult<T>`**: `null | { signal: T; workflow: WorkflowTrigger | null }` — signal 必须,workflow 附带 - **`WorkflowTrigger`**: 结构化四参数 `{ name, maxRounds, prompt, dryRun }`,去掉 pipe 分隔 - **Kernel**: 先 `bus.emit(signal)` 再 `startWorkflow()` — 保持因果链 - **CLI**: `nerve workflow trigger <name> --max-rounds N --prompt "..." --dry-run` - **向后兼容**: 裸返回值(非 `{ signal }` 结构)仍作为 signal-only 处理 - 新增 `sense-workflow-directive.test.ts`,kernel 集成测试增加顺序断言 ## Breaking Changes - `{ workflow: "name|n|prompt" }` 字符串格式不再支持 - CLI `--payload` JSON 参数改为 `--max-rounds` / `--prompt` / `--dry-run` ## Verification - `pnpm run build` ✅ - `pnpm -r test` ✅ - `pnpm run check` ✅ Fixes #204
xiaomo added 2 commits 2026-04-27 13:06:36 +00:00
Breaking change: compute() returns null | { signal: T; workflow: WorkflowTrigger | null }
- WorkflowTrigger is a structured type (name, maxRounds, prompt, dryRun)
- Signal is always emitted before workflow launch (causal chain)
- CLI: nerve workflow trigger <name> --max-rounds N --prompt '...' --dry-run
- Remove pipe-separated directive format

Fixes #204
xiaomo force-pushed refactor/204-workflow-trigger from b6ed499f4f to c937191761 2026-04-27 13:11:19 +00:00 Compare
Owner

Code Review — 星月

Looks Good

  1. 设计思路清晰 — Signal 和 Workflow 从互斥改为蕴含关系,{ signal: T; workflow: WorkflowTrigger | null } 语义明确,因果链 signal→workflow 的顺序在 kernel 里正确落地
  2. 结构化 WorkflowTrigger — 去掉 "name|n|prompt" pipe 格式换成类型安全的对象,大幅降低解析出错概率
  3. 向后兼容routeSenseComputeOutput 对没有 signal key 的裸返回值兜底为 signal-only,不 break 老 sense
  4. 测试覆盖充分 — 新增 sense-workflow-directive.test.ts 纯单测,kernel 集成测试加了顺序断言(sigAt < launchAt),e2e 同步更新
  5. kernel 提取 handleSenseWorkerSignal — 从 handleWorkerMessage 内联逻辑拆出来,可读性好很多

⚠️ Warnings

  1. sense-worker.ts 双重 route — worker 里调了 routeSenseComputeOutput(result.value) 取 signal 做 persist,但 sendSignal(senseName, result.value) 发的是原始值,到 kernel 又 route 一次。逻辑无 bug,但两次解析是多余的。建议 worker 只做 persist + 转发 routed 结果,或完全只在 kernel 做 route。

  2. routeSenseComputeOutput 返回 Result 后的失败语义变更 — 无效 workflow 现在会让整个 compute 输出被丢弃(kernel !routeResult.ok 直接 return),之前的行为是 fallback 成 signal-only。如果 sense 返回了正确 signal 但 workflow 格式不对,signal 也不会发。如果是有意设计,建议在 PR 描述里标注;如果不是,考虑 invalid workflow 时降级为 signal-only + log warning。

💡 Suggestions

  • examples 里 cpu-usage / nerve-health 这种永远不需要 workflow 的 sense,可以继续用裸返回值简写来展示兼容性,留一个 example 展示显式写法即可,不用每个都写 workflow: null

Verdict: 接近 LGTM 👍 主要看 ⚠️2 是否有意为之。

## Code Review — 星月 ⭐ ### ✅ Looks Good 1. **设计思路清晰** — Signal 和 Workflow 从互斥改为蕴含关系,`{ signal: T; workflow: WorkflowTrigger | null }` 语义明确,因果链 signal→workflow 的顺序在 kernel 里正确落地 2. **结构化 WorkflowTrigger** — 去掉 `"name|n|prompt"` pipe 格式换成类型安全的对象,大幅降低解析出错概率 3. **向后兼容** — `routeSenseComputeOutput` 对没有 `signal` key 的裸返回值兜底为 signal-only,不 break 老 sense 4. **测试覆盖充分** — 新增 `sense-workflow-directive.test.ts` 纯单测,kernel 集成测试加了顺序断言(`sigAt < launchAt`),e2e 同步更新 5. **kernel 提取 `handleSenseWorkerSignal`** — 从 `handleWorkerMessage` 内联逻辑拆出来,可读性好很多 ### ⚠️ Warnings 1. **sense-worker.ts 双重 route** — worker 里调了 `routeSenseComputeOutput(result.value)` 取 signal 做 persist,但 `sendSignal(senseName, result.value)` 发的是原始值,到 kernel 又 route 一次。逻辑无 bug,但两次解析是多余的。建议 worker 只做 persist + 转发 routed 结果,或完全只在 kernel 做 route。 2. **`routeSenseComputeOutput` 返回 `Result` 后的失败语义变更** — 无效 workflow 现在会让整个 compute 输出被丢弃(kernel `!routeResult.ok` 直接 return),之前的行为是 fallback 成 signal-only。如果 sense 返回了正确 signal 但 workflow 格式不对,signal 也不会发。如果是有意设计,建议在 PR 描述里标注;如果不是,考虑 invalid workflow 时降级为 signal-only + log warning。 ### 💡 Suggestions - examples 里 cpu-usage / nerve-health 这种永远不需要 workflow 的 sense,可以继续用裸返回值简写来展示兼容性,留一个 example 展示显式写法即可,不用每个都写 `workflow: null` --- **Verdict: 接近 LGTM** 👍 主要看 ⚠️2 是否有意为之。
xiaomo force-pushed refactor/204-workflow-trigger from c937191761 to e159a9b7ca 2026-04-27 13:23:35 +00:00 Compare
xingyue approved these changes 2026-04-27 13:28:40 +00:00
xingyue left a comment
Owner

LGTM! Refactor 设计清晰,测试充分。—— 星月

LGTM! Refactor 设计清晰,测试充分。—— 星月 ⭐
xingyue merged commit ea7e064177 into main 2026-04-27 13:28:48 +00:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
No Label
2 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: uncaged/nerve#205