From 9e50e9df4b95a42cc88858e8c616368ba9d3203d Mon Sep 17 00:00:00 2001 From: nrslib <38722970+nrslib@users.noreply.github.com> Date: Sat, 7 Feb 2026 21:58:42 +0900 Subject: [PATCH] =?UTF-8?q?README=E5=88=B7=E6=96=B0:=20agent=E2=86=92perso?= =?UTF-8?q?na,=20=E3=82=BB=E3=82=AF=E3=82=B7=E3=83=A7=E3=83=B3=E3=83=9E?= =?UTF-8?q?=E3=83=83=E3=83=97=E5=B0=8E=E5=85=A5,=20=E5=88=B6=E5=BE=A1?= =?UTF-8?q?=E3=83=BB=E7=AE=A1=E7=90=86=E3=82=BB=E3=82=AF=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ピース例・カスタムピース例にセクションマップ(personas/policies/knowledge)を追加 - agent: → persona: に全面置換、ディレクトリ構造も agents/ → personas/ に更新 - dist/resources/ → builtins/ に修正 - 「TAKTが制御・管理するもの」セクションを追加(制御: ルーティング・権限・記録、管理: ペルソナ・ポリシー・ナレッジ) - ドキュメントファイル名を prompt-composition → faceted-prompting にリネーム - Faceted Prompting ドキュメントの Policy 配置とエンジン説明を修正 - クローン作成時の進捗ログを追加 --- README.md | 108 +++++++++++------- docs/README.ja.md | 104 +++++++++++------ ...position.ja.md => faceted-prompting.ja.md} | 2 +- ...pt-composition.md => faceted-prompting.md} | 50 ++++---- .../tasks/execute/selectAndExecute.ts | 1 + src/features/tasks/execute/taskExecution.ts | 1 + 6 files changed, 163 insertions(+), 103 deletions(-) rename docs/{prompt-composition.ja.md => faceted-prompting.ja.md} (99%) rename docs/{prompt-composition.md => faceted-prompting.md} (95%) diff --git a/README.md b/README.md index c0bafbc..ea8fe39 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **T**ask **A**gent **K**oordination **T**ool - Define how AI agents coordinate, where humans intervene, and what gets recorded — in YAML -TAKT runs multiple AI agents (Claude Code, Codex) through YAML-defined workflows. Each step — who runs, what's allowed, what happens on failure — is declared in a piece file, not left to the agent. +TAKT runs multiple AI agents (Claude Code, Codex) through YAML-defined workflows. Each step — who runs, what they see, what's allowed, what happens on failure — is declared in a piece file, not left to the agent. TAKT is built with TAKT itself (dogfooding). @@ -24,6 +24,21 @@ You can read every term as standard workflow language (piece = workflow, movemen - Multi-agent coordination needs structure — pieces define who does what, in what order, with what permissions - CI/CD integration needs guardrails — pipeline mode runs agents non-interactively with full audit logs +## What TAKT Controls and Manages + +TAKT **controls** agent execution and **manages** prompt components. + +| | Concern | Description | +|---|---------|-------------| +| Control | **Routing** | State transition rules (who runs when) | +| Control | **Tools & Permissions** | Readonly, edit, full access (what's allowed) | +| Control | **Recording** | Session logs, reports (what gets captured) | +| Manage | **Personas** | Agent roles and expertise (who they act as) | +| Manage | **Policies** | Coding standards, quality criteria, prohibitions (what to uphold) | +| Manage | **Knowledge** | Domain knowledge, architecture info (what to reference) | + +Personas, policies, and knowledge are managed as independent files and freely combined across workflows ([Faceted Prompting](./docs/faceted-prompting.md)). Change a policy in one file and every workflow using it gets the update. + ## What TAKT is NOT - **Not an autonomous engineer** — TAKT coordinates agents but doesn't decide what to build. You provide the task, TAKT governs the execution. @@ -235,7 +250,7 @@ In pipeline mode, PRs are not created unless `--auto-pr` is specified. # Interactively switch pieces takt switch -# Copy builtin pieces/agents to project .takt/ for customization +# Copy builtin pieces/personas to project .takt/ for customization takt eject # Copy to ~/.takt/ (global) instead @@ -244,7 +259,7 @@ takt eject --global # Clear agent conversation sessions takt clear -# Deploy builtin pieces/agents as Claude Code Skill +# Deploy builtin pieces/personas as Claude Code Skill takt export-cc # Preview assembled prompts for each movement and phase @@ -296,9 +311,21 @@ name: default max_iterations: 10 initial_movement: plan +# Section maps — key: file path (relative to this YAML) +personas: + planner: ../personas/planner.md + coder: ../personas/coder.md + reviewer: ../personas/architecture-reviewer.md + +policies: + coding: ../policies/coding.md + +knowledge: + architecture: ../knowledge/architecture.md + movements: - name: plan - agent: ../agents/default/planner.md + persona: planner model: opus edit: false rules: @@ -308,7 +335,9 @@ movements: Analyze the request and create an implementation plan. - name: implement - agent: ../agents/default/coder.md + persona: coder + policy: coding + knowledge: architecture edit: true permission_mode: edit rules: @@ -320,7 +349,8 @@ movements: Implement based on the plan. - name: review - agent: ../agents/default/architecture-reviewer.md + persona: reviewer + knowledge: architecture edit: false rules: - condition: Approved @@ -331,13 +361,13 @@ movements: Review the implementation from architecture and code quality perspectives. ``` -### Agentless Movements +### Persona-less Movements -The `agent` field is optional. When omitted, the movement executes using only the `instruction_template` without a system prompt. This is useful for simple tasks that don't require agent behavior customization. +The `persona` field is optional. When omitted, the movement executes using only the `instruction_template` without a system prompt. This is useful for simple tasks that don't require persona customization. ```yaml - name: summarize - # No agent specified — uses instruction_template only + # No persona specified — uses instruction_template only edit: false rules: - condition: Summary complete @@ -346,11 +376,11 @@ The `agent` field is optional. When omitted, the movement executes using only th Read the report and provide a concise summary. ``` -You can also write an inline system prompt as the `agent` value (if the specified file doesn't exist): +You can also write an inline system prompt as the `persona` value (if the specified file doesn't exist): ```yaml - name: review - agent: "You are a code reviewer. Focus on readability and maintainability." + persona: "You are a code reviewer. Focus on readability and maintainability." edit: false instruction_template: | Review code quality. @@ -364,14 +394,14 @@ Execute sub-movements in parallel within a movement and evaluate with aggregate - name: reviewers parallel: - name: arch-review - agent: ../agents/default/architecture-reviewer.md + persona: reviewer rules: - condition: approved - condition: needs_fix instruction_template: | Review architecture and code quality. - name: security-review - agent: ../agents/default/security-reviewer.md + persona: security-reviewer rules: - condition: approved - condition: needs_fix @@ -417,10 +447,10 @@ TAKT includes multiple builtin pieces: Use `takt switch` to switch pieces. -## Builtin Agents +## Builtin Personas -| Agent | Description | -|-------|-------------| +| Persona | Description | +|---------|-------------| | **planner** | Task analysis, spec investigation, implementation planning | | **architect-planner** | Task analysis and design planning: investigates code, resolves unknowns, creates implementation plans | | **coder** | Feature implementation, bug fixing | @@ -431,12 +461,12 @@ Use `takt switch` to switch pieces. | **conductor** | Phase 3 judgment specialist: reads reports/responses and outputs status tags | | **supervisor** | Final validation, approval | -## Custom Agents +## Custom Personas -Create agent prompts in Markdown files: +Create persona prompts in Markdown files: ```markdown -# ~/.takt/agents/my-agents/reviewer.md +# ~/.takt/personas/my-reviewer.md You are a code reviewer specialized in security. @@ -463,10 +493,10 @@ The model string is passed to the Codex SDK. If unspecified, defaults to `codex` ``` ~/.takt/ # Global configuration directory ├── config.yaml # Global config (provider, model, piece, etc.) -├── pieces/ # User piece definitions (override builtins) +├── pieces/ # User piece definitions (override builtins) │ └── custom.yaml -└── agents/ # User agent prompt files (.md) - └── my-agent.md +└── personas/ # User persona prompt files (.md) + └── my-persona.md .takt/ # Project-level configuration ├── config.yaml # Project config (current piece, etc.) @@ -480,7 +510,7 @@ The model string is passed to the Codex SDK. If unspecified, defaults to `codex` └── {sessionId}.jsonl # NDJSON session log per piece execution ``` -Builtin resources are embedded in the npm package (`dist/resources/`). User files in `~/.takt/` take priority. +Builtin resources are embedded in the npm package (`builtins/`). User files in `~/.takt/` take priority. ### Global Configuration @@ -615,9 +645,13 @@ description: Custom piece max_iterations: 5 initial_movement: analyze +personas: + analyzer: ~/.takt/personas/analyzer.md + coder: ../personas/coder.md + movements: - name: analyze - agent: ~/.takt/agents/my-agents/analyzer.md + persona: analyzer edit: false rules: - condition: Analysis complete @@ -626,7 +660,7 @@ movements: Thoroughly analyze this request. - name: implement - agent: ~/.takt/agents/default/coder.md + persona: coder edit: true permission_mode: edit pass_previous_response: true @@ -639,19 +673,15 @@ movements: > **Note**: `{task}`, `{previous_response}`, `{user_inputs}` are automatically injected into instructions. Explicit placeholders are only needed if you want to control their position in the template. -### Specifying Agents by Path +### Specifying Personas by Path -In piece definitions, specify agents using file paths: +Map keys to file paths in section maps, then reference keys from movements: ```yaml -# Relative path from piece file -agent: ../agents/default/coder.md - -# Home directory -agent: ~/.takt/agents/default/coder.md - -# Absolute path -agent: /path/to/custom/agent.md +# Section maps (relative to piece file) +personas: + coder: ../personas/coder.md + reviewer: ~/.takt/personas/my-reviewer.md ``` ### Piece Variables @@ -673,11 +703,11 @@ Variables available in `instruction_template`: Elements needed for each piece movement: -**1. Agent** - Markdown file containing system prompt: +**1. Persona** - Referenced by section map key (used as system prompt): ```yaml -agent: ../agents/default/coder.md # Path to agent prompt file -agent_name: coder # Display name (optional) +persona: coder # Key from personas section map +persona_name: coder # Display name (optional) ``` **2. Rules** - Define routing from movement to next movement. The instruction builder auto-injects status output rules, so agents know which tags to output: @@ -787,7 +817,7 @@ export TAKT_OPENAI_API_KEY=sk-... ## Documentation -- [Faceted Prompting](./docs/prompt-composition.md) - Separation of Concerns for AI prompts (Persona, Stance, Instruction, Knowledge, Report Format) +- [Faceted Prompting](./docs/faceted-prompting.md) - Separation of Concerns for AI prompts (Persona, Policy, Instruction, Knowledge, Output Contract) - [Piece Guide](./docs/pieces.md) - Creating and customizing pieces - [Agent Guide](./docs/agents.md) - Configuring custom agents - [Changelog](../CHANGELOG.md) - Version history diff --git a/docs/README.ja.md b/docs/README.ja.md index f8a548b..a556a7e 100644 --- a/docs/README.ja.md +++ b/docs/README.ja.md @@ -2,7 +2,7 @@ **T**ask **A**gent **K**oordination **T**ool - AIエージェントの協調手順・人の介入ポイント・記録をYAMLで定義する -TAKTは複数のAIエージェント(Claude Code、Codex)をYAMLで定義されたワークフローに従って実行します。各ステップで誰が実行し、何を許可し、失敗時にどうするかはピースファイルに宣言され、エージェント任せにしません。 +TAKTは複数のAIエージェント(Claude Code、Codex)をYAMLで定義されたワークフローに従って実行します。各ステップで誰が実行し、何を見て、何を許可し、失敗時にどうするかはピースファイルに宣言され、エージェント任せにしません。 TAKTはTAKT自身で開発されています(ドッグフーディング)。 @@ -20,6 +20,21 @@ TAKTはオーケストラをイメージした音楽メタファで用語を統 - マルチエージェントの協調には構造が必要 — ピースが誰が何をどの順序でどの権限で行うかを定義する - CI/CD連携にはガードレールが必要 — パイプラインモードが非対話でエージェントを実行し、完全な監査ログを残す +## TAKTが制御・管理するもの + +TAKTはエージェントの実行を**制御**し、プロンプトの構成要素を**管理**します。 + +| | 対象 | 説明 | +|---|------|------| +| 制御 | **ルーティング** | 状態遷移ルール(誰がいつ動くか) | +| 制御 | **ツール・権限** | 読み取り専用・編集可・フルアクセス(何を許可するか) | +| 制御 | **記録** | セッションログ・レポート(何を残すか) | +| 管理 | **ペルソナ** | エージェントの役割・専門性(誰として振る舞うか) | +| 管理 | **ポリシー** | コーディング規約・品質基準・禁止事項(何を守るか) | +| 管理 | **ナレッジ** | ドメイン知識・アーキテクチャ情報(何を参照するか) | + +ペルソナ・ポリシー・ナレッジは独立したファイルとして管理され、ワークフロー間で自由に組み合わせられます([Faceted Prompting](./faceted-prompting.ja.md))。ポリシーを1ファイル変更すれば、それを使うすべてのワークフローに反映されます。 + ## TAKTとは何でないか - **自律型AIエンジニアではない** — TAKTはエージェントを協調させるが、何を作るかは決めない。タスクを与えるのはあなたで、TAKTは実行を統制する。 @@ -292,9 +307,21 @@ name: default max_iterations: 10 initial_movement: plan +# セクションマップ — キー: ファイルパス(このYAMLからの相対パス) +personas: + planner: ../personas/planner.md + coder: ../personas/coder.md + reviewer: ../personas/architecture-reviewer.md + +policies: + coding: ../policies/coding.md + +knowledge: + architecture: ../knowledge/architecture.md + movements: - name: plan - agent: ../agents/default/planner.md + persona: planner model: opus edit: false rules: @@ -304,7 +331,9 @@ movements: リクエストを分析し、実装計画を作成してください。 - name: implement - agent: ../agents/default/coder.md + persona: coder + policy: coding + knowledge: architecture edit: true permission_mode: edit rules: @@ -316,7 +345,8 @@ movements: 計画に基づいて実装してください。 - name: review - agent: ../agents/default/architecture-reviewer.md + persona: reviewer + knowledge: architecture edit: false rules: - condition: 承認 @@ -327,13 +357,13 @@ movements: アーキテクチャとコード品質の観点で実装をレビューしてください。 ``` -### エージェントレスムーブメント +### ペルソナレスムーブメント -`agent` フィールドは省略可能です。省略した場合、ムーブメントはシステムプロンプトなしで `instruction_template` のみを使って実行されます。これはエージェントの動作カスタマイズが不要なシンプルなタスクに便利です。 +`persona` フィールドは省略可能です。省略した場合、ムーブメントはシステムプロンプトなしで `instruction_template` のみを使って実行されます。これはペルソナのカスタマイズが不要なシンプルなタスクに便利です。 ```yaml - name: summarize - # agent未指定 — instruction_templateのみを使用 + # persona未指定 — instruction_templateのみを使用 edit: false rules: - condition: 要約完了 @@ -342,11 +372,11 @@ movements: レポートを読んで簡潔な要約を提供してください。 ``` -また、`agent` の値としてインラインシステムプロンプトを記述することもできます(指定されたファイルが存在しない場合): +また、`persona` の値としてインラインシステムプロンプトを記述することもできます(指定されたファイルが存在しない場合): ```yaml - name: review - agent: "あなたはコードレビュアーです。可読性と保守性に焦点を当ててください。" + persona: "あなたはコードレビュアーです。可読性と保守性に焦点を当ててください。" edit: false instruction_template: | コード品質をレビューしてください。 @@ -360,14 +390,14 @@ movements: - name: reviewers parallel: - name: arch-review - agent: ../agents/default/architecture-reviewer.md + persona: reviewer rules: - condition: approved - condition: needs_fix instruction_template: | アーキテクチャとコード品質をレビューしてください。 - name: security-review - agent: ../agents/default/security-reviewer.md + persona: security-reviewer rules: - condition: approved - condition: needs_fix @@ -413,10 +443,10 @@ TAKTには複数のビルトインピースが同梱されています: `takt switch` でピースを切り替えられます。 -## ビルトインエージェント +## ビルトインペルソナ -| エージェント | 説明 | -|------------|------| +| ペルソナ | 説明 | +|---------|------| | **planner** | タスク分析、仕様調査、実装計画 | | **architect-planner** | タスク分析と設計計画: コード調査、不明点の解決、実装計画の作成 | | **coder** | 機能の実装、バグ修正 | @@ -427,12 +457,12 @@ TAKTには複数のビルトインピースが同梱されています: | **conductor** | Phase 3 判定専用: レポートやレスポンスを読み取り、ステータスタグを出力 | | **supervisor** | 最終検証、バリデーション、承認 | -## カスタムエージェント +## カスタムペルソナ -Markdown ファイルでエージェントプロンプトを作成: +Markdown ファイルでペルソナプロンプトを作成: ```markdown -# ~/.takt/agents/my-agents/reviewer.md +# ~/.takt/personas/my-reviewer.md あなたはセキュリティに特化したコードレビュアーです。 @@ -459,10 +489,10 @@ Claude Code はエイリアス(`opus`、`sonnet`、`haiku`、`opusplan`、`def ``` ~/.takt/ # グローバル設定ディレクトリ ├── config.yaml # グローバル設定(プロバイダー、モデル、ピース等) -├── pieces/ # ユーザーピース定義(ビルトインを上書き) +├── pieces/ # ユーザーピース定義(ビルトインを上書き) │ └── custom.yaml -└── agents/ # ユーザーエージェントプロンプトファイル(.md) - └── my-agent.md +└── personas/ # ユーザーペルソナプロンプトファイル(.md) + └── my-persona.md .takt/ # プロジェクトレベルの設定 ├── config.yaml # プロジェクト設定(現在のピース等) @@ -476,7 +506,7 @@ Claude Code はエイリアス(`opus`、`sonnet`、`haiku`、`opusplan`、`def └── {sessionId}.jsonl # ピース実行ごとの NDJSON セッションログ ``` -ビルトインリソースはnpmパッケージ(`dist/resources/`)に埋め込まれています。`~/.takt/` のユーザーファイルが優先されます。 +ビルトインリソースはnpmパッケージ(`builtins/`)に埋め込まれています。`~/.takt/` のユーザーファイルが優先されます。 ### グローバル設定 @@ -611,9 +641,13 @@ description: カスタムピース max_iterations: 5 initial_movement: analyze +personas: + analyzer: ~/.takt/personas/analyzer.md + coder: ../personas/coder.md + movements: - name: analyze - agent: ~/.takt/agents/my-agents/analyzer.md + persona: analyzer edit: false rules: - condition: 分析完了 @@ -622,7 +656,7 @@ movements: このリクエストを徹底的に分析してください。 - name: implement - agent: ~/.takt/agents/default/coder.md + persona: coder edit: true permission_mode: edit pass_previous_response: true @@ -635,19 +669,15 @@ movements: > **Note**: `{task}`、`{previous_response}`、`{user_inputs}` は自動的にインストラクションに注入されます。テンプレート内での位置を制御したい場合のみ、明示的なプレースホルダーが必要です。 -### エージェントをパスで指定する +### ペルソナをパスで指定する -ピース定義ではファイルパスを使ってエージェントを指定します: +セクションマップでキーとファイルパスを対応付け、ムーブメントからキーで参照します: ```yaml -# ピースファイルからの相対パス -agent: ../agents/default/coder.md - -# ホームディレクトリ -agent: ~/.takt/agents/default/coder.md - -# 絶対パス -agent: /path/to/custom/agent.md +# セクションマップ(ピースファイルからの相対パス) +personas: + coder: ../personas/coder.md + reviewer: ~/.takt/personas/my-reviewer.md ``` ### ピース変数 @@ -669,11 +699,11 @@ agent: /path/to/custom/agent.md 各ピースのムーブメントに必要な要素: -**1. エージェント** - システムプロンプトを含むMarkdownファイル: +**1. ペルソナ** - セクションマップのキーで参照(system promptとして使用): ```yaml -agent: ../agents/default/coder.md # エージェントプロンプトファイルのパス -agent_name: coder # 表示名(オプション) +persona: coder # personas セクションマップのキー +persona_name: coder # 表示名(オプション) ``` **2. ルール** - ムーブメントから次のムーブメントへのルーティングを定義。インストラクションビルダーがステータス出力ルールを自動注入するため、エージェントはどのタグを出力すべきか把握できます: @@ -783,7 +813,7 @@ export TAKT_OPENAI_API_KEY=sk-... ## ドキュメント -- [Faceted Prompting](./prompt-composition.ja.md) - AIプロンプトへの関心の分離(Persona, Policy, Instruction, Knowledge, Output Contract) +- [Faceted Prompting](./faceted-prompting.ja.md) - AIプロンプトへの関心の分離(Persona, Policy, Instruction, Knowledge, Output Contract) - [Piece Guide](./pieces.md) - ピースの作成とカスタマイズ - [Agent Guide](./agents.md) - カスタムエージェントの設定 - [Changelog](../CHANGELOG.md) - バージョン履歴 diff --git a/docs/prompt-composition.ja.md b/docs/faceted-prompting.ja.md similarity index 99% rename from docs/prompt-composition.ja.md rename to docs/faceted-prompting.ja.md index 77394cf..2959bf1 100644 --- a/docs/prompt-composition.ja.md +++ b/docs/faceted-prompting.ja.md @@ -408,7 +408,7 @@ movements: **エンジンにとって:** - プロンプト組み立ては決定的 — 同じワークフロー定義とファイルからは同じプロンプトが構築される -- ポリシーの配置を最適化できる(例: 「Lost in the Middle」効果に対抗するためプロンプトの先頭と末尾に配置) +- ポリシーの配置を最適化できる(例: recency効果を活用して末尾に配置し、制約遵守を強化) - 各関心を他の部分に影響を与えずにステップごとに注入・省略・上書きできる ## まとめ diff --git a/docs/prompt-composition.md b/docs/faceted-prompting.md similarity index 95% rename from docs/prompt-composition.md rename to docs/faceted-prompting.md index 218beb5..3fa4609 100644 --- a/docs/prompt-composition.md +++ b/docs/faceted-prompting.md @@ -49,15 +49,17 @@ System Prompt: User Message: ┌──────────────────────────────────────────────────┐ - │ Policy — rules, prohibitions, quality standards │ │ Knowledge — reference materials for judgment │ │ Instruction — step-specific procedures │ │ Output Contract — output structure definition │ + │ Policy — rules, prohibitions, quality standards │ └──────────────────────────────────────────────────┘ ``` Persona is the agent's **identity** — it doesn't change across tasks. Placing it in the system prompt shapes all LLM responses. The remaining four change per step and are composed into the user message. +Placing Policy at the end of the user message is a deliberate design choice. LLMs are strongly influenced by what they read last (recency effect). Constraints such as prohibitions and REJECT criteria are more likely to be followed when placed immediately before output generation. The flow of Knowledge → Instruction → Policy also follows a natural cognitive order: "understand the context → understand the task → confirm the constraints." + Below are typical file examples for each facet. #### Persona — `personas/architecture-reviewer.md` @@ -213,31 +215,9 @@ You evaluate code structure, design, and maintainability. **User Message:** ```markdown -## Policy - -# Coding Policy - -## Principles - -| Principle | Standard | -|-----------|----------| -| DRY | 3+ duplications → REJECT | -| Fail Fast | Reject invalid state early | -| Least Privilege | Minimal scope necessary | - -## Prohibitions - -- **Unused code** — no "just in case" methods, no future-use fields -- **Direct object mutation** — create new objects with spread operators -- **Fallback abuse** — don't hide uncertainty with `?? 'default'` - ---- - ## Knowledge -# Architecture Knowledge - -## Layer Structure +### Layer Structure Dependency direction: upper layers → lower layers (reverse prohibited) @@ -247,7 +227,7 @@ Dependency direction: upper layers → lower layers (reverse prohibited) | Service | Business logic | Repository | | Repository | Data access | None | -## File Organization +### File Organization | Criteria | Judgment | |----------|----------| @@ -302,6 +282,24 @@ Output your report in the following format. |---|----------|-------|-----| | 1 | `src/file.ts:42` | Issue description | How to fix | \``` + +--- + +## Policy + +### Principles + +| Principle | Standard | +|-----------|----------| +| DRY | 3+ duplications → REJECT | +| Fail Fast | Reject invalid state early | +| Least Privilege | Minimal scope necessary | + +### Prohibitions + +- **Unused code** — no "just in case" methods, no future-use fields +- **Direct object mutation** — create new objects with spread operators +- **Fallback abuse** — don't hide uncertainty with `?? 'default'` ``` Independent files are assembled into a single prompt at runtime. Change a file's content and the prompt changes; point to different files and the combination changes. @@ -410,7 +408,7 @@ The key distinction: existing approaches either decompose *tasks* (what to do) o **For the engine:** - Prompt assembly is deterministic — given the same workflow definition and files, the same prompt is built -- Policy placement can be optimized (e.g., placed at top and bottom to counter the "Lost in the Middle" effect) +- Policy placement can be optimized (e.g., placed at the end to leverage recency effect for better constraint adherence) - Concerns can be injected, omitted, or overridden per step without touching other parts ## Summary diff --git a/src/features/tasks/execute/selectAndExecute.ts b/src/features/tasks/execute/selectAndExecute.ts index 061a810..03f97ac 100644 --- a/src/features/tasks/execute/selectAndExecute.ts +++ b/src/features/tasks/execute/selectAndExecute.ts @@ -114,6 +114,7 @@ export async function confirmAndCreateWorktree( info('Generating branch name...'); const taskSlug = await summarizeTaskName(task, { cwd }); + info('Creating clone...'); const result = createSharedClone(cwd, { worktree: true, taskSlug, diff --git a/src/features/tasks/execute/taskExecution.ts b/src/features/tasks/execute/taskExecution.ts index 9170e22..e625d66 100644 --- a/src/features/tasks/execute/taskExecution.ts +++ b/src/features/tasks/execute/taskExecution.ts @@ -240,6 +240,7 @@ export async function resolveTaskExecution( info('Generating branch name...'); const taskSlug = await summarizeTaskName(task.content, { cwd: defaultCwd }); + info('Creating clone...'); const result = createSharedClone(defaultCwd, { worktree: data.worktree, branch: data.branch,