yoi/tickets/workflow-crate-extraction.md

4.0 KiB
Raw Blame History

Workflow を memory crate から独立させる

背景

tickets/workflow-directory-layout.md で Workflow の物理配置を .insomnia/workflow/ に分離した。これにより Workflow は概念上 memory statesession-derived / generatedと別物として整理されたが、ソースコード上は依然として crates/memory/ 配下に同居している:

  • crates/memory/src/workflow.rsWorkflowRecord / WorkflowRegistry / WorkflowSource / load_workflows / WorkflowLoadError / WORKFLOW_DESCRIPTION_HARD_CAP / ResidentWorkflowEntry / ShadowedSkill
  • crates/memory/src/schema/workflow.rsWorkflowFrontmatter
  • crates/memory/src/skill.rsSkill → Workflow projection
  • crates/memory/src/linter/mod.rs::lint_workflow(人間編集向けの workflow linter
  • crates/memory/src/error.rs::LintError::WorkflowWriteForbidden

memory crate のドメインは「decisions / requests / summary / knowledge / staging / consolidation」に絞り、Workflow は独立した crate に出す。tickets/internal-worker-workflow.md で内部 Worker の Workflow 化が予定されており、bundled default や internal_role 追加の置き場として独立 crate がある方が自然。

要件

crate の分離

crates/workflow/ を新設し、上記の Workflow 関連型 / 関数 / スキーマ / Skill projection / human-edit linter を移す。

  • 新 crate からは memory crate に依存しないか、WorkspaceLayout 経由で薄く依存するに留める
  • crates/memory/ から workflow 関連の pub use 再エクスポートは削除(呼び出し側が新 crate を直接 import する)
  • Workflow 用の linter は memory crate の Linter を共有しないでよい場合は単独で持つ。共有が必要なら共通部分を別 crate例: crates/lint-common/)に切る判断を行う

WorkspaceLayout の扱い

workflow_dir() / workflow_path() が memory crate に残るかは設計判断:

  • memory crate に残し、workflow crate がそれを利用する形でよい
  • 別 crate例: crates/workspace-layout/)に切り出す場合は memory / workflow 両方が参照する形にする

どちらでもよいが、結果として循環依存を生まないこと。

既存 use site の更新

  • crates/pod/pod.rs / prompt/system.rs / workflow/mod.rs
  • crates/tui/
  • その他 memory::Workflow* を import している箇所

これらが新 crate を import する形に書き換わる。

Skill ingestion の所属

SKILL.md パーサと WorkflowRecord への projection は workflow crate に同居する。Skills は外部入力だが最終的に Workflow registry に流れるので、workflow crate を窓口にする方がレイヤとして自然。

scope deny の整理

crates/memory/src/scope.rs::deny_write_rules は memory / knowledge / workflow の 3 ディレクトリを deny している。workflow crate 側で .insomnia/workflow/ の deny を表明し、Pod 起動時に両方を合成する形にするか、あるいは scope deny は呼び出し側podで集約する形に再設計する。

範囲外

  • Workflow の機能変更frontmatter schema 変更、resolver 改修等)
  • bundled default Workflow 機構(tickets/internal-worker-workflow.md の対象)
  • memory crate 内部の他モジュール再編

完了条件

  • crates/workflow/ crate が独立して存在し、WorkflowRecord / WorkflowRegistry / load_workflows / WorkflowFrontmatter / Skill projection / human-edit linter がそこに住む
  • memory crate に workflow / skill 関連のソースが残っていないreexport も無し)
  • 既存テストが新構造で通る
  • 既存呼び出し側pod / tui 等)が新 crate を import する形に更新されている
  • scope deny が memory / workflow を矛盾なく合成できる構成になっている

参照

  • 直前: tickets/workflow-directory-layout.mdgit log
  • 後続: tickets/internal-worker-workflow.md
  • 関連: docs/plan/workflow.md