Compare commits

..

No commits in common. "main" and "v0.13.0-alpha.1" have entirely different histories.

916 changed files with 16312 additions and 80318 deletions

View File

@ -1,69 +0,0 @@
name: Announce
on:
workflow_dispatch:
inputs:
title:
description: "タイトル"
required: true
type: string
body:
description: "本文Markdown可、X向けには自動でプレーンテキスト化"
required: true
type: string
channels:
description: "投稿先"
required: true
type: choice
default: "all"
options:
- all
- discussions
- discord
- twitter
jobs:
discussions:
if: inputs.channels == 'all' || inputs.channels == 'discussions'
runs-on: ubuntu-latest
permissions:
discussions: write
steps:
- name: Post to GitHub Discussions
uses: abirber/github-create-discussion@v6
with:
title: ${{ inputs.title }}
body: ${{ inputs.body }}
repository-id: ${{ github.event.repository.node_id }}
category-name: "Announcements"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
discord:
if: inputs.channels == 'all' || inputs.channels == 'discord'
runs-on: ubuntu-latest
steps:
- name: Post to Discord
env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
TITLE: ${{ inputs.title }}
BODY: ${{ inputs.body }}
run: |
jq -n \
--arg title "$TITLE" \
--arg desc "$BODY" \
'{embeds: [{title: $title, description: $desc, color: 5814783}]}' \
| curl -sf -X POST -H "Content-Type: application/json" -d @- "$DISCORD_WEBHOOK_URL"
twitter:
if: inputs.channels == 'all' || inputs.channels == 'twitter'
runs-on: ubuntu-latest
steps:
- name: Post to X
uses: ethomson/send-tweet-action@v2
with:
status: "${{ inputs.title }}\n\n${{ inputs.body }}"
consumer-key: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
consumer-secret: ${{ secrets.TWITTER_CONSUMER_API_SECRET }}
access-token: ${{ secrets.TWITTER_ACCESS_TOKEN }}
access-token-secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}

View File

@ -18,8 +18,6 @@ jobs:
tag: ${{ steps.version.outputs.tag }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Extract version from PR title
id: version
@ -27,9 +25,9 @@ jobs:
VERSION=$(echo "${{ github.event.pull_request.title }}" | sed 's/^Release //')
echo "tag=$VERSION" >> "$GITHUB_OUTPUT"
- name: Create and push tag on PR head commit
- name: Create and push tag
run: |
git tag "${{ steps.version.outputs.tag }}" "${{ github.event.pull_request.head.sha }}"
git tag "${{ steps.version.outputs.tag }}"
git push origin "${{ steps.version.outputs.tag }}"
publish:

View File

@ -1,275 +0,0 @@
name: CC Resolve
on:
issue_comment:
types: [created]
jobs:
resolve:
# Uncomment to allow organization members or collaborators:
# || github.event.comment.author_association == 'MEMBER'
# || github.event.comment.author_association == 'COLLABORATOR'
if: |
github.event.issue.pull_request &&
contains(github.event.comment.body, '/resolve') &&
github.event.comment.author_association == 'OWNER'
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Acknowledge
run: |
gh api repos/${{ github.repository }}/issues/comments/${{ github.event.comment.id }}/reactions \
-f content=rocket
gh pr comment ${{ github.event.issue.number }} --repo ${{ github.repository }} \
--body "🚀 cc-resolve started: [View logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check if fork PR
id: pr
run: |
PR_REPO=$(gh pr view ${{ github.event.issue.number }} --repo ${{ github.repository }} \
--json headRepositoryOwner,headRepository \
--jq '"\(.headRepositoryOwner.login)/\(.headRepository.name)"')
BRANCH=$(gh pr view ${{ github.event.issue.number }} --repo ${{ github.repository }} \
--json headRefName -q .headRefName)
echo "branch=${BRANCH}" >> "$GITHUB_OUTPUT"
if [ "$PR_REPO" != "${{ github.repository }}" ]; then
echo "::error::Fork PR はサポートしていません。contributor 側で解決してください。"
exit 1
fi
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: actions/checkout@v4
with:
ref: ${{ steps.pr.outputs.branch }}
fetch-depth: 0
- name: Configure git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Merge main (detect conflicts)
id: merge
run: |
git fetch origin main
# --no-commit --no-ff: コンフリクトの有無にかかわらず常にマージ状態を保持する
# これにより最後の git commit が必ずマージコミット親2つを作る
if git merge --no-commit --no-ff origin/main 2>/dev/null; then
echo "conflicts=false" >> "$GITHUB_OUTPUT"
else
echo "conflicts=true" >> "$GITHUB_OUTPUT"
fi
# コミット済みのコンフリクトマーカーを検出
STALE_MARKERS=$(grep -rl '<<<<<<<' --include='*.ts' --include='*.js' --include='*.json' --include='*.yaml' --include='*.yml' --include='*.md' . 2>/dev/null | grep -v node_modules | grep -v .git || echo "")
if [ -n "$STALE_MARKERS" ]; then
echo "stale_markers=true" >> "$GITHUB_OUTPUT"
{
echo "stale_marker_files<<MARKER_EOF"
echo "$STALE_MARKERS"
echo "MARKER_EOF"
} >> "$GITHUB_OUTPUT"
else
echo "stale_markers=false" >> "$GITHUB_OUTPUT"
fi
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Resolve
run: |
claude -p --dangerously-skip-permissions "$(cat <<'PROMPT'
このPRのコンフリクトを解決してください。
## 状況判定
まず現在の状態を確認してください。以下の2つをすべてチェックする。
1. `git status` でマージコンフリクトUnmerged pathsの有無を確認
2. ファイル中にコミット済みのコンフリクトマーカー(`<<<<<<<`)が残っていないか `grep -r '<<<<<<<' --include='*.ts' --include='*.js' --include='*.json' .` で確認
**重要**: git status がクリーンでも、ファイル内にコンフリクトマーカーがテキストとしてコミットされている場合がある。必ず grep で確認すること。
どちらも該当しなければ「コンフリクトなし」と報告して終了。
---
## コンフリクト解決
Git merge/rebase/cherry-pick のコンフリクト、およびファイル内に残存するコンフリクトマーカーを、差分分析に基づいて解決する。
**原則: 差分を読み、疑い、判断根拠を書いてから解決する。妄信的に片方を採用しない。**
### 1. コンフリクト状態を確認する
```bash
git status
```
- merge / rebase / cherry-pick のどれが進行中か特定する
- `.git/MERGE_HEAD` があれば merge
- `.git/rebase-merge/` があれば rebase
- `.git/CHERRY_PICK_HEAD` があれば cherry-pick
### 2. コンテキストを把握する
以下を**並列で**実行:
- `git log --oneline HEAD -5` で HEAD 側(現在のブランチ)の最近の変更を確認
- `git log --oneline MERGE_HEAD -5` で取り込み側の最近の変更を確認merge の場合)
- 両ブランチの関係性(どちらがベースでどちらが新しいか)を理解する
### 3. コンフリクトファイルを列挙する
```bash
git diff --name-only --diff-filter=U
```
加えて、コミット済みマーカーがあるファイルも対象に含める:
```bash
grep -rl '<<<<<<<' --include='*.ts' --include='*.js' --include='*.json' . | grep -v node_modules
```
ファイル数と種類(ソースコード / 設定ファイル / ロックファイル等)を報告する。
### 4. 各ファイルを分析する
**ここが核心。ファイルごとに以下を必ず実行する。省略しない。**
1. ファイル全体を読む(コンフリクトマーカー付きの状態)
2. 各コンフリクトブロック(`<<<<<<<` 〜 `>>>>>>>`)について:
- HEAD 側の内容を具体的に読む
- theirs 側の内容を具体的に読む
- 差分が何を意味するか分析する(バージョン番号?リファクタ?機能追加?型変更?)
- 判断に迷う場合は `git log --oneline -- {file}` で変更履歴を確認する
3. **判断を書く**(以下の形式で必ず出力すること):
```markdown
### ファイル: path/to/file.ts
#### コンフリクト 1 (L30-45)
- HEAD 側: {具体的な内容を書く}
- theirs 側: {具体的な内容を書く}
- 分析: {差分が何を意味するか}
- 判断: {HEAD / theirs / 両方統合} を採用({理由}
```
**疑うべきポイント:**
- 「〇〇側が新しいから」だけで判断していないか? HEAD 側に独自の意図ある変更はないか?
- theirs を採用すると、HEAD 側でしか行っていない作業が消えないか?
- 両方の変更を統合すべきケースではないか?
- package-lock.json のような機械生成ファイルでも、バージョンの意味を確認したか?
### 5. 解決を実施する
ステップ4の分析結果に基づいて解決する:
- 片方採用が明確な場合: `git checkout --ours {file}` / `git checkout --theirs {file}` を使ってよい(**分析済みファイルのみ**
- 両方の変更を統合する場合: コンフリクトマーカーを除去し、両方の内容を適切に結合する
- 解決したファイルを `git add {file}` でマークする
解決後、`<<<<<<<` を検索し、マーカーの取り残しがないか確認する。
---
## 波及影響確認
**コンフリクトを解決しただけでは終わらない。** 対象外ファイルにも影響が出ていないか検証する。
- ビルド確認(`npm run build`、`./gradlew build` 等、プロジェクトに応じて)
- テスト確認(`npm test`、`./gradlew test` 等)
- 対象外ファイルが、変更と矛盾していないか確認する
- : 関数シグネチャを変更したのに、テストが旧シグネチャを期待している
- : import パスを変更したのに、別ファイルが旧パスを参照している
問題が見つかった場合はここで修正する。
---
## 結果を報告する
全ファイルの解決結果をサマリーテーブルで報告する:
```markdown
## コンフリクト解決サマリー
| ファイル | コンフリクト数 | 採用 | 理由 |
|---------|-------------|------|------|
| path/to/file.ts | 2 | theirs | リファクタリング済み |
波及修正: {対象外ファイルの修正内容。なければ「なし」}
ビルド: OK / NG
テスト: OK / NG ({passed}/{total})
```
---
## 絶対原則
- **差分を読まずに解決しない。** ファイルの中身を確認せずに `--ours` / `--theirs` を適用しない
- **盲従しない。** HEAD 側に独自の意図がないか必ず疑う
- **判断根拠を省略しない。** 各コンフリクトに「何が・なぜ・どちらを」の3点を書く
- **波及を確認する。** 対象外ファイルもビルド・テストで検証する
## 禁止事項
- 分析なしで `git checkout --ours .` / `git checkout --theirs .` を実行しない
- 「とりあえず片方」で全ファイルを一括解決しない
- コンフリクトマーカー (`<<<<<<<`) が残ったままにしない
- `git merge --abort` を実行しない
- `git reset` を実行しないMERGE_HEAD が消えてマージコミットが作れなくなる)
- `.git/MERGE_HEAD` を保持したまま作業すること
PROMPT
)" --verbose
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Commit and push
run: |
git add -A
# MERGE_HEAD があればマージコミット、なければ通常コミット
if [ -f .git/MERGE_HEAD ]; then
git commit -m "merge: integrate main into PR branch"
elif ! git diff --cached --quiet; then
git commit -m "fix: resolve merge conflicts"
fi
AHEAD=$(git rev-list --count origin/${{ steps.pr.outputs.branch }}..HEAD 2>/dev/null || echo "0")
if [ "$AHEAD" -gt 0 ]; then
echo "Pushing $AHEAD commit(s)"
git push
echo "pushed=true" >> "$GITHUB_OUTPUT"
else
echo "Nothing to push"
echo "pushed=false" >> "$GITHUB_OUTPUT"
fi
id: push
- name: Trigger CI
if: steps.push.outputs.pushed == 'true'
run: |
gh workflow run ci.yml --ref "${{ steps.pr.outputs.branch }}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Report result
if: always()
run: |
PR_NUMBER=${{ github.event.issue.number }}
RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
if [ "${{ job.status }}" = "success" ]; then
gh pr comment "$PR_NUMBER" --repo ${{ github.repository }} --body "✅ cc-resolve completed. [View logs](${RUN_URL})"
else
gh pr comment "$PR_NUMBER" --repo ${{ github.repository }} --body "❌ cc-resolve failed. [View logs](${RUN_URL})"
fi
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,50 +0,0 @@
name: CI
on:
pull_request:
branches: [main]
types: [opened, synchronize, ready_for_review]
push:
branches: [main]
workflow_dispatch:
concurrency:
group: ci-${{ github.event_name == 'pull_request' && github.head_ref || github.ref_name }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run build
- run: npm run lint
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run build
- run: npm run test
e2e-mock:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run build
- run: npm run test:e2e:mock

View File

@ -1,47 +0,0 @@
name: Dependency Health Check
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
jobs:
fresh-install:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install without lockfile
run: |
rm package-lock.json
npm install
- name: Build
run: npm run build
- name: Verify CLI startup
run: node bin/takt --version
- name: Notify Slack on failure
if: failure()
uses: slackapi/slack-github-action@v2.0.0
with:
webhook-type: incoming-webhook
webhook: ${{ secrets.SLACK_WEBHOOK_URL }}
payload: |
{
"text": "⚠️ Dependency health check failed",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*⚠️ Dependency Health Check Failed*\nA dependency may have published a broken version.\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View logs>"
}
}
]
}

View File

@ -1,70 +0,0 @@
name: TAKT PR Review
on:
pull_request_target:
types: [opened, synchronize, ready_for_review, reopened]
jobs:
review:
runs-on: ubuntu-latest
environment: takt-review
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: API キー確認
run: |
if [ -z "$ANTHROPIC_API_KEY" ]; then
echo "::error::ANTHROPIC_API_KEY is not set"
exit 1
fi
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Claude Code & TAKT インストール
run: |
npm install -g @anthropic-ai/claude-code
npm install -g takt
- name: TAKT Review 実行
run: takt --pipeline --skip-git -i ${{ github.event.pull_request.number }} -w review
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
- name: レビュー結果をPRコメントに投稿
if: always()
run: |
REPORT_DIR=$(ls -td .takt/runs/*/reports 2>/dev/null | head -1)
if [ -n "$REPORT_DIR" ]; then
SUMMARY=$(find "$REPORT_DIR" -name "*review-summary*" -type f | head -1)
if [ -n "$SUMMARY" ]; then
gh pr comment ${{ github.event.pull_request.number }} --body-file "$SUMMARY"
else
echo "レビューサマリーが見つかりません"
fi
else
echo "レポートディレクトリが見つかりません"
fi
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
- name: レビューレポートをアーティファクトに保存
if: always()
uses: actions/upload-artifact@v4
with:
name: takt-review-reports
path: .takt/runs/*/reports/
if-no-files-found: ignore

11
.gitignore vendored
View File

@ -1,5 +1,4 @@
# Dependencies
node_modules
node_modules/
# Build output
@ -23,20 +22,14 @@ npm-debug.log*
# Test coverage
coverage/
# E2E test results
e2e/results/
# Environment
.env
.env.local
.env.*.local
.envrc
# TAKT runtime data (facets/pieces/config are managed by .takt/.gitignore)
# TAKT config (user data)
.takt/
task_planning/
OPENCODE_CONFIG_CONTENT
# Local editor/agent settings
.claude/

22
.takt/.gitignore vendored
View File

@ -1,22 +0,0 @@
# Ignore everything by default
*
# This file itself
!.gitignore
# Project configuration
!config.yaml
# Facets and pieces (version-controlled)
!pieces/
!pieces/**
!personas/
!personas/**
!policies/
!policies/**
!knowledge/
!knowledge/**
!instructions/
!instructions/**
!output-contracts/
!output-contracts/**

View File

@ -1,11 +0,0 @@
piece_overrides:
movements:
implement:
quality_gates:
- "Run `npm run test:e2e:mock` and verify all E2E tests pass"
fix:
quality_gates:
- "Run `npm run test:e2e:mock` and verify all E2E tests pass"
ai_fix:
quality_gates:
- "Run `npm run test:e2e:mock` and verify all E2E tests pass"

View File

@ -1,40 +1,41 @@
# Repository Guidelines
このドキュメントは、このリポジトリに貢献するための実務的な指針をまとめたものです。短く具体的な説明と例で、作業の迷いを減らします。
## Project Structure & Module Organization
- `src/`: TypeScript の本体コード。CLI は `src/app/cli/`、コア実行ロジックは `src/core/`、共通機能は `src/shared/`、機能別実装は `src/features/` に配置。
- `src/__tests__/`: 単体・統合テスト(`*.test.ts`)。
- `e2e/`: E2E テストと補助ヘルパー。
- `builtins/`: 組み込みピース、テンプレート、スキーマ。
- `docs/`: 設計・CLI・運用ドキュメント。
- `dist/`: ビルド成果物(生成物のため手編集しない)。
- `bin/`: CLI エントリーポイント(`takt`, `takt-dev`)を提供。
- 主要ソースは `src/` にあり、エントリポイントは `src/index.ts`、CLI は `src/app/cli/index.ts` です。
- テストは `src/__tests__/` に置き、対象が明確になる名前を付けます(例: `client.test.ts`)。
- ビルド成果物は `dist/`、実行スクリプトは `bin/`、静的リソースは `resources/`、ドキュメントは `docs/` で管理します。
- 実行時の設定やキャッシュは `~/.takt/`、プロジェクト固有の設定は `.takt/` を参照します。
## Build, Test, and Development Commands
- `npm install`: 依存関係をインストール。
- `npm run build`: TypeScript を `dist/` にビルドし、プロンプト・i18n・preset ファイルをコピー。
- `npm run watch`: `tsc --watch` で継続ビルド。
- `npm run lint`: `src/` を ESLint で検証。
- `npm test`: `vitest run` で通常テスト実行。
- `npm run test:e2e:mock`: モックプロバイダーで E2E 実行。
- `npm run test:e2e:all`: mock + provider E2E を連続実行。
- `npm run build`: TypeScript をコンパイルして `dist/` を生成します。
- `npm run watch`: ソース変更を監視しながら再ビルドします。
- `npm run lint`: ESLint で `src/` を解析します。
- `npm run test`: Vitest で全テストを実行します。
- `npm run test:watch`: テストをウォッチ実行します。
- `npx vitest run src/__tests__/client.test.ts`: 単体テストを個別実行する例です。
## Coding Style & Naming Conventions
- 言語は TypeScriptESM。インデントは 2 スペース、既存スタイルを維持。
- ファイル名は機能を表す `kebab-case` または既存準拠(例: `taskHistory.ts`)。
- テスト名は対象機能が分かる具体名(例: `provider-model.test.ts`)。
- Lint ルール: `@typescript-eslint/no-explicit-any` と未使用変数を厳格に検出(未使用引数は `_` 接頭辞で許容)。
- TypeScript + strict を前提に、null 安全と可読性を優先します。
- ESM 形式のため、`import` の拡張子は `.js` に固定してください。
- 命名は camelCase関数・変数と PascalCaseクラスを採用します。
- 共有型は `src/types/` に整理し、既存の命名パターンに合わせます。
- ESLint と Prettier の規約に従い、修正後は `npm run lint` を実行します。
## Testing Guidelines
- フレームワークは Vitest。Node 環境で実行。
- 変更時は最低限 `npm test` を通し、実行経路に影響する変更は `npm run test:e2e:mock` まで確認。
- カバレッジ取得は Vitest の V8 レポーターtext/json/htmlを使用。
- テストフレームワークは Vitest`vitest.config.ts`)です。
- 新規機能や修正には関連テストを追加します。
- ファイル名は `<対象>.test.ts` または `<対象>.spec.ts` を使用します。
- 依存が重い箇所はモックやスタブで状態を分離します。
## Commit & Pull Request Guidelines
- コミットは小さく、1コミット1目的
- 形式は Conventional Commits 推奨(`feat:`, `fix:`, `refactor:`, `test:`)。必要に応じて Issue 番号を付与(例: `fix: ... (#388)` / `[#367] ...`
- PR では目的、変更点、テスト結果、影響範囲を明記。挙動変更がある場合は再現手順を添付
- 大規模変更は先に Issue で合意し、関連ドキュメント(`README.md` / `docs/`)も更新する
- コミットメッセージは短い要約が中心で、日本語・英語どちらも使われています
- `fix:`, `hotfix:` などのプレフィックスや、`#32` のような Issue 参照が見られます。必要に応じて付けてください
- バージョン更新や変更履歴の更新は明示的なメッセージで行います(例: `0.5.1`, `update CHANGELOG`
- PR には変更概要、テスト結果、関連 Issue を記載し、小さく分割してレビュー負荷を抑えます。UI/ログ変更がある場合はスクリーンショットやログを添付します
## Security & Configuration Tips
- 機密情報API キー、トークン)はコミットしない。設定は `~/.takt/config.yaml` や環境変数を使用。
- Provider や実行モード変更時は `docs/configuration.md``docs/provider-sandbox.md` を先に確認する。
- 脆弱性は公開 Issue ではなくメンテナへ直接報告します。
- `.takt/logs/` など機密情報を含む可能性のあるファイルは共有しないでください。
- `~/.takt/config.yaml``trusted` ディレクトリは最小限にし、不要なパスは登録しないでください。
- 新しいピースを追加する場合は `~/.takt/pieces/` の既存スキーマに合わせます。

File diff suppressed because it is too large Load Diff

519
CLAUDE.md
View File

@ -10,19 +10,13 @@ TAKT (TAKT Agent Koordination Topology) is a multi-agent orchestration system fo
| Command | Description |
|---------|-------------|
| `npm run build` | TypeScript build (also copies prompt .md, i18n .yaml, and preset .sh files to dist/) |
| `npm run build` | TypeScript build |
| `npm run watch` | TypeScript build in watch mode |
| `npm run test` | Run all unit tests |
| `npm run test:watch` | Run tests in watch mode |
| `npm run test` | Run all tests |
| `npm run test:watch` | Run tests in watch mode (alias: `npm run test -- --watch`) |
| `npm run lint` | ESLint |
| `npx vitest run src/__tests__/client.test.ts` | Run single test file |
| `npx vitest run -t "pattern"` | Run tests matching pattern |
| `npm run test:e2e` | Run E2E tests with mock provider (includes GitHub connectivity check) |
| `npm run test:e2e:mock` | Run E2E tests with mock provider (direct, no connectivity check) |
| `npm run test:e2e:provider:claude` | Run E2E tests against Claude provider |
| `npm run test:e2e:provider:codex` | Run E2E tests against Codex provider |
| `npm run test:e2e:provider:opencode` | Run E2E tests against OpenCode provider |
| `npm run check:release` | Full release check (build + lint + test + e2e) with macOS notification |
| `npm run prepublishOnly` | Lint, build, and test before publishing |
## CLI Subcommands
@ -33,24 +27,15 @@ TAKT (TAKT Agent Koordination Topology) is a multi-agent orchestration system fo
| `takt` | Interactive task input mode (chat with AI to refine requirements) |
| `takt run` | Execute all pending tasks from `.takt/tasks/` once |
| `takt watch` | Watch `.takt/tasks/` and auto-execute tasks (resident process) |
| `takt add [task]` | Add a new task via AI conversation |
| `takt list` | List task branches (merge, delete, retry) |
| `takt add` | Add a new task via AI conversation |
| `takt list` | List task branches (try merge, merge & cleanup, or delete) |
| `takt switch` | Switch piece interactively |
| `takt clear` | Clear agent conversation sessions (reset state) |
| `takt eject [type] [name]` | Copy builtin piece or facet for customization (`--global` for ~/.takt/) |
| `takt prompt [piece]` | Preview assembled prompts for each movement and phase |
| `takt catalog [type]` | List available facets (personas, policies, knowledge, etc.) |
| `takt export-cc` | Export takt pieces/agents as Claude Code Skill (~/.claude/) |
| `takt reset config` | Reset global config to builtin template |
| `takt reset categories` | Reset piece categories to builtin defaults |
| `takt metrics review` | Show review quality metrics |
| `takt purge` | Purge old analytics event files |
| `takt repertoire add <spec>` | Install a repertoire package from GitHub |
| `takt repertoire remove <scope>` | Remove an installed repertoire package |
| `takt repertoire list` | List installed repertoire packages |
| `takt eject` | Copy builtin piece/agents to `~/.takt/` for customization |
| `takt config` | Configure settings (permission mode) |
| `takt --help` | Show help message |
**Interactive mode:** Running `takt` (without arguments) or `takt {initial message}` starts an interactive planning session. Supports 4 modes: `assistant` (default, AI asks clarifying questions), `passthrough` (passes input directly as task), `quiet` (generates instructions without questions), `persona` (uses first movement's persona for conversation). Type `/go` to execute the task with the selected piece, or `/cancel` to abort. Implemented in `src/features/interactive/`.
**Interactive mode:** Running `takt` (without arguments) or `takt {initial message}` starts an interactive planning session. The AI helps refine task requirements through conversation. Type `/go` to execute the task with the selected piece, or `/cancel` to abort. Implemented in `src/features/interactive/`.
**Pipeline mode:** Specifying `--pipeline` enables non-interactive mode suitable for CI/CD. Automatically creates a branch, runs the piece, commits, and pushes. Use `--auto-pr` to also create a pull request. Use `--skip-git` to run piece only (no git operations). Implemented in `src/features/pipeline/`.
@ -63,97 +48,84 @@ TAKT (TAKT Agent Koordination Topology) is a multi-agent orchestration system fo
| `--pipeline` | Enable pipeline (non-interactive) mode — required for CI/automation |
| `-t, --task <text>` | Task content (as alternative to GitHub issue) |
| `-i, --issue <N>` | GitHub issue number (equivalent to `#N` in interactive mode) |
| `--pr <number>` | PR number to fetch review comments and fix |
| `-w, --piece <name or path>` | Piece name or path to piece YAML file |
| `-w, --piece <name or path>` | Piece name or path to piece YAML file (v0.3.8+) |
| `-b, --branch <name>` | Branch name (auto-generated if omitted) |
| `--auto-pr` | Create PR after execution (pipeline mode only) |
| `--auto-pr` | Create PR after execution (interactive: skip confirmation, pipeline: enable PR) |
| `--skip-git` | Skip branch creation, commit, and push (pipeline mode, piece-only) |
| `--repo <owner/repo>` | Repository for PR creation |
| `-q, --quiet` | Minimal output mode: suppress AI output (for CI) |
| `--provider <name>` | Override agent provider (claude\|codex\|opencode\|mock) |
| `--model <name>` | Override agent model |
| `--config <path>` | Path to global config file (default: `~/.takt/config.yaml`) |
| `--create-worktree <yes\|no>` | Skip worktree confirmation prompt |
| `-q, --quiet` | **Minimal output mode: suppress AI output (for CI)** (v0.3.8+) |
| `--provider <name>` | Override agent provider (claude\|codex\|mock) (v0.3.8+) |
| `--model <name>` | Override agent model (v0.3.8+) |
| `--config <path>` | Path to global config file (default: `~/.takt/config.yaml`) (v0.3.8+) |
## Architecture
### Core Flow
```
CLI (cli.ts → routing.ts)
Interactive mode / Pipeline mode / Direct task execution
→ PieceEngine (piece/engine/PieceEngine.ts)
→ Per movement, delegates to one of 4 runners:
MovementExecutor — Normal movements (3-phase execution)
ParallelRunner — Parallel sub-movements via Promise.allSettled()
ArpeggioRunner — Data-driven batch processing (CSV → template → LLM)
TeamLeaderRunner — Dynamic task decomposition into sub-parts
detectMatchedRule() → rule evaluation → determineNextMovementByRules()
CLI (cli.ts)
Slash commands or executeTask()
→ PieceEngine (piece/engine.ts)
→ Per step: 3-phase execution
Phase 1: runAgent() → main work
Phase 2: runReportPhase() → report output (if step.report defined)
Phase 3: runStatusJudgmentPhase() → status tag output (if tag-based rules)
→ detectMatchedRule() → rule evaluation → determineNextStep()
Parallel steps: Promise.all() for sub-steps, aggregate evaluation
```
### Three-Phase Movement Execution
### Three-Phase Step Execution
Each normal movement executes in up to 3 phases (session is resumed across phases):
Each step executes in up to 3 phases (session is resumed across phases):
| Phase | Purpose | Tools | When |
|-------|---------|-------|------|
| Phase 1 | Main work (coding, review, etc.) | Movement's allowed_tools (Write excluded if report defined) | Always |
| Phase 2 | Report output | Write only | When `output_contracts` is defined |
| Phase 3 | Status judgment | None (judgment only) | When movement has tag-based rules |
| Phase 1 | Main work (coding, review, etc.) | Step's allowed_tools (Write excluded if report defined) | Always |
| Phase 2 | Report output | Write only | When `step.report` is defined |
| Phase 3 | Status judgment | None (judgment only) | When step has tag-based rules |
Phase 2/3 are implemented in `src/core/piece/phase-runner.ts`. The session is resumed so the agent retains context from Phase 1.
Phase 2/3 are implemented in `src/core/piece/engine/phase-runner.ts`. The session is resumed so the agent retains context from Phase 1.
### Rule Evaluation (5-Stage Fallback)
After movement execution, rules are evaluated to determine the next movement. Evaluation order (first match wins):
After step execution, rules are evaluated to determine the next step. Evaluation order (first match wins):
1. **Aggregate** (`all()`/`any()`) - For parallel parent movements
1. **Aggregate** (`all()`/`any()`) - For parallel parent steps
2. **Phase 3 tag** - `[STEP:N]` tag from status judgment output
3. **Phase 1 tag** - `[STEP:N]` tag from main execution output (fallback)
4. **AI judge (ai() only)** - AI evaluates `ai("condition text")` rules
5. **AI judge fallback** - AI evaluates ALL conditions as final resort
Implemented in `src/core/piece/evaluation/RuleEvaluator.ts`. The matched method is tracked as `RuleMatchMethod` type (`aggregate`, `auto_select`, `structured_output`, `phase3_tag`, `phase1_tag`, `ai_judge`, `ai_judge_fallback`).
Implemented in `src/core/piece/evaluation/RuleEvaluator.ts`. The matched method is tracked as `RuleMatchMethod` type.
### Key Components
**PieceEngine** (`src/core/piece/engine/PieceEngine.ts`)
- State machine that orchestrates agent execution via EventEmitter
- Manages movement transitions based on rule evaluation results
- Emits events: `movement:start`, `movement:complete`, `movement:blocked`, `movement:report`, `movement:user_input`, `movement:loop_detected`, `movement:cycle_detected`, `phase:start`, `phase:complete`, `piece:complete`, `piece:abort`, `iteration:limit`
- Supports loop detection (`LoopDetector`), cycle detection (`CycleDetector`), and iteration limits
- Maintains agent sessions per movement for conversation continuity
- Delegates to `MovementExecutor` (normal), `ParallelRunner` (parallel), `ArpeggioRunner` (data-driven batch), and `TeamLeaderRunner` (task decomposition)
- Manages step transitions based on rule evaluation results
- Emits events: `step:start`, `step:complete`, `step:blocked`, `step:loop_detected`, `piece:complete`, `piece:abort`, `iteration:limit`
- Supports loop detection (`LoopDetector`) and iteration limits
- Maintains agent sessions per step for conversation continuity
- Delegates to `StepExecutor` (normal steps) and `ParallelRunner` (parallel steps)
**MovementExecutor** (`src/core/piece/engine/MovementExecutor.ts`)
- Executes a single piece movement through the 3-phase model
**StepExecutor** (`src/core/piece/engine/StepExecutor.ts`)
- Executes a single piece step through the 3-phase model
- Phase 1: Main agent execution (with tools)
- Phase 2: Report output (Write-only, optional)
- Phase 3: Status judgment (no tools, optional)
- Builds instructions via `InstructionBuilder`, detects matched rules via `RuleEvaluator`
- Writes facet snapshots (knowledge/policy) per movement iteration
**ArpeggioRunner** (`src/core/piece/engine/ArpeggioRunner.ts`)
- Data-driven batch processing: reads data from a source (e.g., CSV), expands templates per batch, calls LLM for each batch with concurrency control
- Supports retry logic with configurable `maxRetries` and `retryDelayMs`
- Merge strategies: `concat` (default, join with separator) or `custom` (inline JS or file-based)
- Optional output file writing via `outputPath`
**TeamLeaderRunner** (`src/core/piece/engine/TeamLeaderRunner.ts`)
- Decomposes a task into sub-parts via AI (`decomposeTask()`), then executes each part as a sub-agent
- Uses `PartDefinition` schema (id, title, instruction, optional timeoutMs) for decomposed tasks
- Configured via `TeamLeaderConfig` (maxParts ≤3, separate persona/tools/permissions for parts)
- Aggregates sub-part results and evaluates parent rules
**ParallelRunner** (`src/core/piece/engine/ParallelRunner.ts`)
- Executes parallel sub-movements concurrently via `Promise.allSettled()`
- Uses `ParallelLogger` to prefix sub-movement output for readable interleaved display
- Aggregates sub-movement results for parent rule evaluation with `all()` / `any()` conditions
- Executes parallel sub-steps concurrently via `Promise.all()`
- Aggregates sub-step results for parent rule evaluation
- Supports `all()` / `any()` aggregate conditions
**RuleEvaluator** (`src/core/piece/evaluation/RuleEvaluator.ts`)
- 5-stage fallback evaluation: aggregate → Phase 3 tag → Phase 1 tag → ai() judge → all-conditions AI judge
- Returns `RuleMatch` with index and detection method
- Returns `RuleMatch` with index and detection method (`aggregate`, `phase3_tag`, `phase1_tag`, `ai_judge`, `ai_fallback`)
- Fail-fast: throws if rules exist but no rule matched
- Tag detection uses **last match** when multiple `[STEP:N]` tags appear in output
- **v0.3.8+:** Tag detection now uses **last match** instead of first match when multiple `[STEP:N]` tags appear in output
**Instruction Builder** (`src/core/piece/instruction/InstructionBuilder.ts`)
- Auto-injects standard sections into every instruction (no need for `{task}` or `{previous_response}` placeholders in templates):
@ -169,110 +141,77 @@ Implemented in `src/core/piece/evaluation/RuleEvaluator.ts`. The matched method
**Agent Runner** (`src/agents/runner.ts`)
- Resolves agent specs (name or path) to agent configurations
- Agent is optional — movements can execute with `instruction_template` only (no system prompt)
- 5-layer resolution for provider/model: CLI `--provider` / `--model` → persona_providers → movement override → project `.takt/config.yaml` → global `~/.takt/config.yaml`
- Custom personas via `~/.takt/personas/<name>.md` or prompt files (.md)
- **v0.3.8+:** Agent is optional — steps can execute with `instruction_template` only (no system prompt)
- Built-in agents with default tools:
- `coder`: Read/Glob/Grep/Edit/Write/Bash/WebSearch/WebFetch
- `architect`: Read/Glob/Grep/WebSearch/WebFetch
- `supervisor`: Read/Glob/Grep/Bash/WebSearch/WebFetch
- `planner`: Read/Glob/Grep/Bash/WebSearch/WebFetch
- Custom agents via `.takt/agents.yaml` or prompt files (.md)
- Inline system prompts: If agent file doesn't exist, the agent string is used as inline system prompt
**Provider Integration** (`src/infra/providers/`)
- Unified `Provider` interface: `setup(AgentSetup) → ProviderAgent`, `ProviderAgent.call(prompt, options) → AgentResponse`
- **Claude** (`src/infra/claude/`) - Uses `@anthropic-ai/claude-agent-sdk`
**Provider Integration** (`src/infra/claude/`, `src/infra/codex/`)
- **Claude** - Uses `@anthropic-ai/claude-agent-sdk`
- `client.ts` - High-level API: `callClaude()`, `callClaudeCustom()`, `callClaudeAgent()`, `callClaudeSkill()`
- `process.ts` - SDK wrapper with `ClaudeProcess` class
- `executor.ts` - Query execution
- `query-manager.ts` - Concurrent query tracking with query IDs
- **Codex** (`src/infra/codex/`) - Uses `@openai/codex-sdk`
- Retry logic with exponential backoff (3 attempts, 250ms base)
- Stream handling with idle timeout (10 minutes)
- **OpenCode** (`src/infra/opencode/`) - Uses `@opencode-ai/sdk/v2`
- Shared server pooling with `acquireClient()` / `releaseClient()`
- Client-side permission auto-reply
- Requires explicit `model` specification (no default)
- **Mock** (`src/infra/mock/`) - Deterministic responses for testing
- **Codex** - Direct OpenAI SDK integration
- `CodexStreamHandler.ts` - Stream handling and tool execution
**Configuration** (`src/infra/config/`)
- `loaders/pieceParser.ts` - YAML parsing, movement/rule normalization with Zod validation. Rule regex: `AI_CONDITION_REGEX = /^ai\("(.+)"\)$/`, `AGGREGATE_CONDITION_REGEX = /^(all|any)\((.+)\)$/`
- `loaders/pieceResolver.ts` - **3-layer resolution**: project `.takt/pieces/` → user `~/.takt/pieces/` → builtin `builtins/{lang}/pieces/`. Also supports repertoire packages `@{owner}/{repo}/{piece-name}`
- `loaders/loader.ts` - Custom agent loading from `.takt/agents.yaml`
- `loaders/pieceParser.ts` - YAML parsing, step/rule normalization with Zod validation
- `loaders/pieceResolver.ts` - **3-layer resolution with correct priority** (v0.3.8+: user → project → builtin)
- `loaders/pieceCategories.ts` - Piece categorization and filtering
- `loaders/agentLoader.ts` - Agent prompt file loading
- `paths.ts` - Directory structure (`.takt/`, `~/.takt/`), session management
- `global/globalConfig.ts` - Global configuration (provider, model, language, quiet mode)
- `global/globalConfig.ts` - Global configuration (provider, model, trusted dirs, **quiet mode** v0.3.8+)
- `project/projectConfig.ts` - Project-level configuration
**Task Management** (`src/features/tasks/`)
- `execute/taskExecution.ts` - Main task execution orchestration, worker pool for parallel tasks
- `execute/pieceExecution.ts` - Piece execution wrapper, analytics integration, NDJSON logging
- `execute/taskExecution.ts` - Main task execution orchestration
- `execute/pieceExecution.ts` - Piece execution wrapper
- `add/index.ts` - Interactive task addition via AI conversation
- `list/index.ts` - List task branches with merge/delete/retry actions
- `list/index.ts` - List task branches with merge/delete actions
- `watch/index.ts` - Watch for task files and auto-execute
**Repertoire** (`src/features/repertoire/`)
- Package management for external facet/piece collections
- Install from GitHub: `github:{owner}/{repo}@{ref}`
- Config validation via `takt-repertoire.yaml` (path constraints, min_version semver check)
- Lock file for resolved dependencies
- Packages installed to `~/.takt/repertoire/@{owner}/{repo}/`
**Analytics** (`src/features/analytics/`)
- Event types: `MovementResultEvent`, `ReviewFindingEvent`, `FixActionEvent`, `RebuttalEvent`
- NDJSON storage at `.takt/events/`
- Integrated into piece execution: movement results, review findings, fix actions
**Catalog** (`src/features/catalog/`)
- Scans 3 layers (builtin → user → project) for available facets
- Shows override detection and source provenance
**Faceted Prompting** (`src/faceted-prompting/`)
- Independent module (no TAKT dependencies) for composing prompts from facets
- `compose(facets, options)``ComposedPrompt` (systemPrompt + userMessage)
- Supports template rendering, context truncation, facet path resolution, scope references
**GitHub Integration** (`src/infra/github/`)
- `issue.ts` - Fetches issues via `gh` CLI, formats as task text, supports `createIssue()`
- `pr.ts` - Creates pull requests via `gh` CLI, supports draft PRs and custom templates
- `issue.ts` - Fetches issues via `gh` CLI, formats as task text with title/body/labels/comments
- `pr.ts` - Creates pull requests via `gh` CLI
### Data Flow
1. User provides task (text or `#N` issue reference) or slash command → CLI
2. CLI loads piece with **priority**: project `.takt/pieces/` → user `~/.takt/pieces/` → builtin `builtins/{lang}/pieces/`
3. PieceEngine starts at `initial_movement`
4. Each movement: delegate to appropriate runner → 3-phase execution → `detectMatchedRule()``determineNextMovementByRules()`
5. Rule evaluation determines next movement name (uses **last match** when multiple `[STEP:N]` tags appear)
2. CLI loads piece with **correct priority** (v0.3.8+): user `~/.takt/pieces/` → project `.takt/pieces/` → builtin `builtins/{lang}/pieces/`
3. PieceEngine starts at `initial_step`
4. Each step: `buildInstruction()` → Phase 1 (main) → Phase 2 (report) → Phase 3 (status) → `detectMatchedRule()``determineNextStep()`
5. Rule evaluation determines next step name (v0.3.8+: uses **last match** when multiple `[STEP:N]` tags appear)
6. Special transitions: `COMPLETE` ends piece successfully, `ABORT` ends with failure
## Directory Structure
```
~/.takt/ # Global user config (created on first run)
config.yaml # Language, provider, model, log level, etc.
config.yaml # Trusted dirs, default piece, log level, language
pieces/ # User piece YAML files (override builtins)
facets/ # User facets
personas/ # User persona prompt files (.md)
policies/ # User policy files
knowledge/ # User knowledge files
instructions/ # User instruction files
output-contracts/ # User output contract files
repertoire/ # Installed repertoire packages
@{owner}/{repo}/ # Per-package directory
personas/ # User persona prompt files (.md)
agents/ # Legacy persona prompts (backward compat)
.takt/ # Project-level config
config.yaml # Project configuration
facets/ # Project-level facets
tasks/ # Task files for takt run
runs/ # Execution reports (runs/{slug}/reports/)
agents.yaml # Custom agent definitions
tasks/ # Task files for /run-tasks
reports/ # Execution reports (auto-generated)
logs/ # Session logs in NDJSON format (gitignored)
events/ # Analytics event files (NDJSON)
builtins/ # Bundled defaults (builtin, read from dist/ at runtime)
en/ # English
facets/ # Facets (personas, policies, knowledge, instructions, output-contracts)
pieces/ # Piece YAML files
ja/ # Japanese (same structure)
en/ # English personas, policies, instructions, and pieces
ja/ # Japanese personas, policies, instructions, and pieces
project/ # Project-level template files
skill/ # Claude Code skill files
```
Builtin resources are embedded in the npm package (`builtins/`). Project files in `.takt/` take highest priority, then user files in `~/.takt/`, then builtins. Use `takt eject` to copy builtins for customization.
Builtin resources are embedded in the npm package (`builtins/`). User files in `~/.takt/` take priority. Use `/eject` to copy builtins to `~/.takt/` for customization.
## Piece YAML Schema
@ -280,150 +219,63 @@ Builtin resources are embedded in the npm package (`builtins/`). Project files i
name: piece-name
description: Optional description
max_movements: 10
initial_movement: plan # First movement to execute
interactive_mode: assistant # Default interactive mode (assistant|passthrough|quiet|persona)
answer_agent: agent-name # Route AskUserQuestion to this agent (optional)
initial_step: plan # First step to execute
# Piece-level provider options (inherited by all movements unless overridden)
piece_config:
provider_options:
codex: { network_access: true }
opencode: { network_access: true }
claude: { sandbox: { allow_unsandboxed_commands: true } }
runtime:
prepare: [node, gradle, ./custom-script.sh] # Runtime environment preparation
# Loop monitors (cycle detection between movements)
loop_monitors:
- cycle: [review, fix] # Movement names forming the cycle
threshold: 3 # Cycles before triggering judge
judge:
persona: supervisor
instruction_template: "Evaluate if the fix loop is making progress..."
rules:
- condition: "Progress is being made"
next: fix
- condition: "No progress"
next: ABORT
# Section maps (key → file path relative to piece YAML directory)
personas:
coder: ../facets/personas/coder.md
reviewer: ../facets/personas/architecture-reviewer.md
policies:
coding: ../facets/policies/coding.md
knowledge:
architecture: ../facets/knowledge/architecture.md
instructions:
plan: ../facets/instructions/plan.md
report_formats:
plan: ../facets/output-contracts/plan.md
movements:
# Normal movement
- name: movement-name
persona: coder # Persona key (references section map)
steps:
# Normal step
- name: step-name
persona: ../personas/coder.md # Path to persona prompt
persona_name: coder # Display name (optional)
session: continue # Session continuity: continue (default) | refresh
policy: coding # Policy key (single or array)
knowledge: architecture # Knowledge key (single or array)
instruction: plan # Instruction key (references section map)
provider: claude # claude|codex|opencode|mock (optional)
provider: codex # claude|codex (optional)
model: opus # Model name (optional)
edit: true # Whether movement can edit files
required_permission_mode: edit # Required minimum permission mode (optional)
quality_gates: # AI directives for completion (optional)
- "All tests pass"
- "No lint errors"
provider_options: # Per-provider options (optional)
codex: { network_access: true }
claude: { sandbox: { excluded_commands: [rm] } }
mcp_servers: # MCP server configuration (optional)
my-server:
command: npx
args: [-y, my-mcp-server]
edit: true # Whether step can edit files
permission_mode: acceptEdits # Tool permission mode (optional)
instruction_template: |
Custom instructions for this movement.
Custom instructions for this step.
{task}, {previous_response} are auto-injected if not present as placeholders.
pass_previous_response: true # Default: true
output_contracts:
report:
- name: 01-plan.md # Report file name
format: plan # References report_formats map
order: "Write the plan to {report_dir}/01-plan.md" # Instruction prepend
report:
name: 01-plan.md # Report file name
format: | # Output contract template
# Plan Report
...
rules:
- condition: "Human-readable condition"
next: next-movement-name
next: next-step-name
- condition: ai("AI evaluates this condition text")
next: other-movement
next: other-step
- condition: blocked
next: ABORT
requires_user_input: true # Wait for user input (interactive only)
# Parallel movement (sub-movements execute concurrently)
# Parallel step (sub-steps execute concurrently)
- name: reviewers
parallel:
- name: arch-review
persona: reviewer
policy: review
knowledge: architecture
edit: false
persona: ../personas/architecture-reviewer.md
rules:
- condition: approved
- condition: approved # next is optional for sub-steps
- condition: needs_fix
instruction: review-arch
instruction_template: |
Review architecture...
- name: security-review
persona: security-reviewer
edit: false
persona: ../personas/security-reviewer.md
rules:
- condition: approved
- condition: needs_fix
instruction: review-security
rules:
instruction_template: |
Review security...
rules: # Parent rules use aggregate conditions
- condition: all("approved")
next: supervise
- condition: any("needs_fix")
next: fix
# Arpeggio movement (data-driven batch processing)
- name: batch-process
persona: coder
arpeggio:
source: csv
source_path: ./data/items.csv # Relative to piece YAML
batch_size: 5 # Rows per batch (default: 1)
concurrency: 3 # Concurrent LLM calls (default: 1)
template: ./templates/process.txt # Prompt template file
max_retries: 2 # Retry attempts per batch (default: 2)
retry_delay_ms: 1000 # Delay between retries (default: 1000)
merge:
strategy: concat # concat (default) | custom
separator: "\n---\n" # For concat strategy
output_path: ./output/result.txt # Write merged results (optional)
rules:
- condition: "Processing complete"
next: COMPLETE
# Team leader movement (dynamic task decomposition)
- name: implement
team_leader:
max_parts: 3 # Max parallel parts (1-3, default: 3)
timeout_ms: 600000 # Per-part timeout (default: 600s)
part_persona: coder # Persona for part agents
part_edit: true # Edit permission for parts
part_permission_mode: edit # Permission mode for parts
part_allowed_tools: [Read, Glob, Grep, Edit, Write, Bash]
instruction_template: |
Decompose this task into independent subtasks.
rules:
- condition: "All parts completed"
next: review
```
Key points about movement types (mutually exclusive: `parallel`, `arpeggio`, `team_leader`):
- **Parallel**: Sub-movement `rules` define possible outcomes but `next` is ignored (parent handles routing). Parent uses `all("X")`/`any("X")` to aggregate.
- **Arpeggio**: Template placeholders: `{line:N}`, `{col:N:name}`, `{batch_index}`, `{total_batches}`. Merge custom strategy supports inline JS or file.
- **Team leader**: AI generates `PartDefinition[]` (JSON in ```json block), each part executed as sub-movement.
Key points about parallel steps:
- Sub-step `rules` define possible outcomes but `next` is ignored (parent handles routing)
- Parent `rules` use `all("X")`/`any("X")` to aggregate sub-step results
- `all("X")`: true if ALL sub-steps matched condition X
- `any("X")`: true if ANY sub-step matched condition X
### Rule Condition Types
@ -431,7 +283,7 @@ Key points about movement types (mutually exclusive: `parallel`, `arpeggio`, `te
|------|--------|------------|
| Tag-based | `"condition text"` | Agent outputs `[STEP:N]` tag, matched by index |
| AI judge | `ai("condition text")` | AI evaluates condition against agent output |
| Aggregate | `all("X")` / `any("X")` | Aggregates parallel sub-movement matched conditions |
| Aggregate | `all("X")` / `any("X")` | Aggregates parallel sub-step matched conditions |
### Template Variables
@ -440,8 +292,8 @@ Key points about movement types (mutually exclusive: `parallel`, `arpeggio`, `te
| `{task}` | Original user request (auto-injected if not in template) |
| `{iteration}` | Piece-wide iteration count |
| `{max_movements}` | Maximum movements allowed |
| `{movement_iteration}` | Per-movement iteration count |
| `{previous_response}` | Previous movement output (auto-injected if not in template) |
| `{step_iteration}` | Per-step iteration count |
| `{previous_response}` | Previous step output (auto-injected if not in template) |
| `{user_inputs}` | Accumulated user inputs (auto-injected if not in template) |
| `{report_dir}` | Report directory name |
@ -461,41 +313,34 @@ Example category config:
```yaml
piece_categories:
Development:
pieces: [default]
pieces: [default, simple]
children:
Backend:
pieces: [dual-cqrs]
pieces: [expert-cqrs]
Frontend:
pieces: [dual]
pieces: [expert]
Research:
pieces: [research, magi]
show_others_category: true
others_category_name: "Other Pieces"
```
Implemented in `src/infra/config/loaders/pieceCategories.ts`.
### Model Resolution
Model is resolved in the following priority order:
1. **Persona-level `model`** - `persona_providers.<persona>.model`
2. **Movement `model`** - `step.model` / `stepModel` (`piece movement` field)
3. **CLI/task override `model`** - `--model` or task options
4. **Local/Global config `model`** - `.takt/config.yaml` and `~/.takt/config.yaml` when the resolved provider matches
5. **Provider default** - Falls back to provider's default (for example, Claude: sonnet, Codex: gpt-5.2-codex)
1. **Piece step `model`** - Highest priority (specified in step YAML)
2. **Custom agent `model`** - Agent-level model in `.takt/agents.yaml`
3. **Global config `model`** - Default model in `~/.takt/config.yaml`
4. **Provider default** - Falls back to provider's default (Claude: sonnet, Codex: gpt-5.2-codex)
### Loop Detection
Two distinct mechanisms:
**LoopDetector** (`src/core/piece/engine/loop-detector.ts`):
- Detects consecutive same-movement executions (simple counter)
- Configurable: `maxConsecutiveSameStep` (default: 10), `action` (`warn` | `abort` | `ignore`)
**CycleDetector** (`src/core/piece/engine/cycle-detector.ts`):
- Detects cyclic patterns between movements (e.g., review → fix → review → fix)
- Configured via `loop_monitors` in piece config (cycle pattern + threshold + judge)
- When threshold reached, triggers a synthetic judge movement for decision-making
- Resets after judge intervention to prevent immediate re-triggering
Example `~/.takt/config.yaml`:
```yaml
provider: claude
model: opus # Default model for all steps (unless overridden)
```
## NDJSON Session Logging
@ -504,8 +349,8 @@ Session logs use NDJSON (`.jsonl`) format for real-time append-only writes. Reco
| Record | Description |
|--------|-------------|
| `piece_start` | Piece initialization with task, piece name |
| `movement_start` | Movement execution start |
| `movement_complete` | Movement result with status, content, matched rule info |
| `step_start` | Step execution start |
| `step_complete` | Step result with status, content, matched rule info |
| `piece_complete` | Successful completion |
| `piece_abort` | Abort with reason |
@ -515,8 +360,8 @@ Files: `.takt/logs/{sessionId}.jsonl`, with `latest.json` pointer. Legacy `.json
- ESM modules with `.js` extensions in imports
- Strict TypeScript with `noUncheckedIndexedAccess`
- Zod v4 schemas for runtime validation (`src/core/models/schemas.ts`)
- Uses `@anthropic-ai/claude-agent-sdk` for Claude, `@openai/codex-sdk` for Codex, `@opencode-ai/sdk` for OpenCode
- Zod schemas for runtime validation (`src/core/models/schemas.ts`)
- Uses `@anthropic-ai/claude-agent-sdk` for Claude integration
## Design Principles
@ -524,16 +369,16 @@ Files: `.takt/logs/{sessionId}.jsonl`, with `latest.json` pointer. Legacy `.json
**Do NOT expand schemas carelessly.** Rule conditions are free-form text (not enum-restricted). However, the engine's behavior depends on specific patterns (`ai()`, `all()`, `any()`). Do not add new special syntax without updating the loader's regex parsing in `pieceParser.ts`.
**Instruction auto-injection over explicit placeholders.** The instruction builder auto-injects `{task}`, `{previous_response}`, `{user_inputs}`, and status rules. Templates should contain only movement-specific instructions, not boilerplate.
**Instruction auto-injection over explicit placeholders.** The instruction builder auto-injects `{task}`, `{previous_response}`, `{user_inputs}`, and status rules. Templates should contain only step-specific instructions, not boilerplate.
**Faceted prompting: each facet has a dedicated file type.** TAKT assembles agent prompts from 4 facets. Each facet has a distinct role. When adding new rules or knowledge, place content in the correct facet.
```
builtins/{lang}/facets/
builtins/{lang}/
personas/ — WHO: identity, expertise, behavioral habits
policies/ — HOW: judgment criteria, REJECT/APPROVE rules, prohibited patterns
knowledge/ — WHAT TO KNOW: domain patterns, anti-patterns, detailed reasoning with examples
instructions/ — WHAT TO DO NOW: movement-specific procedures and checklists
instructions/ — WHAT TO DO NOW: step-specific procedures and checklists
```
| Deciding where to place content | Facet | Example |
@ -541,26 +386,24 @@ builtins/{lang}/facets/
| Role definition, AI habit prevention | Persona | "置き換えたコードを残す → 禁止" |
| Actionable REJECT/APPROVE criterion | Policy | "内部実装のパブリックAPIエクスポート → REJECT" |
| Detailed reasoning, REJECT/OK table with examples | Knowledge | "パブリックAPIの公開範囲" section |
| This-movement-only procedure or checklist | Instruction | "レビュー観点: 構造・設計の妥当性..." |
| This-step-only procedure or checklist | Instruction | "レビュー観点: 構造・設計の妥当性..." |
| Workflow structure, facet assignment | Piece YAML | `persona: coder`, `policy: coding`, `knowledge: architecture` |
Key rules:
- Persona files are reusable across pieces. Never include piece-specific procedures (report names, movement references)
- Persona files are reusable across pieces. Never include piece-specific procedures (report names, step references)
- Policy REJECT lists are what reviewers enforce. If a criterion is not in the policy REJECT list, reviewers will not catch it — even if knowledge explains the reasoning
- Knowledge provides the WHY behind policy criteria. Knowledge alone does not trigger enforcement
- Instructions are bound to a single piece movement. They reference procedures, not principles
- Piece YAML `instruction_template` is for movement-specific details (which reports to read, movement routing, output templates)
- Instructions are bound to a single piece step. They reference procedures, not principles
- Piece YAML `instruction_template` is for step-specific details (which reports to read, step routing, output templates)
**Separation of concerns in piece engine:**
- `PieceEngine` - Orchestration, state management, event emission
- `MovementExecutor` - Single movement execution (3-phase model)
- `ParallelRunner` - Parallel movement execution
- `ArpeggioRunner` - Data-driven batch processing
- `TeamLeaderRunner` - Dynamic task decomposition
- `StepExecutor` - Single step execution (3-phase model)
- `ParallelRunner` - Parallel step execution
- `RuleEvaluator` - Rule matching and evaluation
- `InstructionBuilder` - Instruction template processing
**Session management:** Agent sessions are stored per-cwd in `~/.claude/projects/{encoded-path}/` (Claude) or in-memory (Codex/OpenCode). Sessions are resumed across phases (Phase 1 → Phase 2 → Phase 3) to maintain context. Session key format: `{persona}:{provider}` to prevent cross-provider contamination. When `cwd !== projectCwd` (worktree/clone execution), session resume is skipped.
**Session management:** Agent sessions are stored per-cwd in `~/.claude/projects/{encoded-path}/` (Claude Code) or in-memory (Codex). Sessions are resumed across phases (Phase 1 → Phase 2 → Phase 3) to maintain context. When `cwd !== projectCwd` (worktree/clone execution), session resume is skipped to avoid cross-directory contamination.
## Isolated Execution (Shared Clone)
@ -579,100 +422,88 @@ Key constraints:
## Error Propagation
Provider errors must be propagated through `AgentResponse.error` → session log history → console output. Without this, SDK failures (exit code 1, rate limits, auth errors) appear as empty `blocked` status with no diagnostic info.
`ClaudeResult` (from SDK) has an `error` field. This must be propagated through `AgentResponse.error` → session log history → console output. Without this, SDK failures (exit code 1, rate limits, auth errors) appear as empty `blocked` status with no diagnostic info.
**Error handling flow:**
1. Provider error (Claude SDK / Codex / OpenCode) → `AgentResponse.error`
2. `MovementExecutor` captures error → `PieceEngine` emits `phase:complete` with error
1. Provider error (Claude SDK / Codex) → `AgentResponse.error`
2. `StepExecutor` captures error → `PieceEngine` emits `step:complete` with error
3. Error logged to session log (`.takt/logs/{sessionId}.jsonl`)
4. Console output shows error details
5. Piece transitions to `ABORT` movement if error is unrecoverable
## Runtime Environment
Piece-level runtime preparation via `runtime.prepare` in piece config or `~/.takt/config.yaml`:
- **Presets**: `gradle` (sets `GRADLE_USER_HOME`, `JAVA_TOOL_OPTIONS`), `node` (sets `npm_config_cache`)
- **Custom scripts**: Arbitrary shell scripts, resolved relative to cwd or as absolute paths
- Environment injected: `TMPDIR`, `XDG_CACHE_HOME`, `XDG_CONFIG_HOME`, `XDG_STATE_HOME`, `CI=true`
- Creates `.takt/.runtime/` directory structure with `env.sh` for sourcing
Implemented in `src/core/runtime/runtime-environment.ts`.
5. Piece transitions to `ABORT` step if error is unrecoverable
## Debugging
**Debug logging:** Set `logging.debug: true` in `~/.takt/config.yaml`:
**Debug logging:** Set `debug_enabled: true` in `~/.takt/config.yaml` or create a `.takt/debug.yaml` file:
```yaml
logging:
debug: true
enabled: true
```
Debug logs are written to `.takt/runs/debug-{timestamp}/logs/` in NDJSON format. Log levels: `debug`, `info`, `warn`, `error`.
Debug logs are written to `.takt/logs/debug.log` (ndjson format). Log levels: `debug`, `info`, `warn`, `error`.
**Verbose mode:** Set `verbose: true` in `~/.takt/config.yaml` or `TAKT_VERBOSE=true` to enable verbose console output. This enables `logging.debug`, `logging.trace`, and sets `logging.level` to `debug`.
**Verbose mode:** Create `.takt/verbose` file (empty file) to enable verbose console output. This automatically enables debug logging and sets log level to `debug`.
**Session logs:** All piece executions are logged to `.takt/logs/{sessionId}.jsonl`. Use `tail -f .takt/logs/{sessionId}.jsonl` to monitor in real-time.
**Environment variables:**
- `TAKT_LOGGING_LEVEL=info`
- `TAKT_LOGGING_PROVIDER_EVENTS=true`
- `TAKT_VERBOSE=true`
**Testing with mocks:** Use `--provider mock` to test pieces without calling real AI APIs. Mock responses are deterministic and configurable via test fixtures.
## Testing Notes
- Vitest for testing framework (single-thread mode, 15s timeout, 5s teardown timeout)
- Unit tests: `src/__tests__/*.test.ts`
- E2E mock tests: configured via `vitest.config.e2e.mock.ts` (240s timeout, forceExit)
- E2E provider tests: configured via `vitest.config.e2e.provider.ts`
- Vitest for testing framework
- Tests use file system fixtures in `__tests__/` subdirectories
- Mock pieces and agent configs for integration tests
- Test single files: `npx vitest run src/__tests__/filename.test.ts`
- Pattern matching: `npx vitest run -t "test pattern"`
- Integration tests: Tests with `it-` prefix simulate full piece execution
- Engine tests: Tests with `engine-` prefix test PieceEngine scenarios (happy path, error handling, parallel, arpeggio, team-leader, etc.)
- Environment variables cleared in test setup: `TAKT_CONFIG_DIR`, `TAKT_NOTIFY_WEBHOOK`
- Integration tests: Tests with `it-` prefix are integration tests that simulate full piece execution
- Engine tests: Tests with `engine-` prefix test specific PieceEngine scenarios (happy path, error handling, parallel execution, etc.)
## Important Implementation Notes
**Persona prompt resolution:**
- Persona paths in piece YAML are resolved relative to the piece file's directory
- `../facets/personas/coder.md` resolves from piece file location
- Built-in personas are loaded from `builtins/{lang}/facets/personas/`
- User personas are loaded from `~/.takt/facets/personas/`
- `../personas/coder.md` resolves from piece file location
- Built-in personas are loaded from `builtins/{lang}/personas/`
- User personas are loaded from `~/.takt/personas/` (legacy: `~/.takt/agents/`)
- If persona file doesn't exist, the persona string is used as inline system prompt
**Report directory structure:**
- Report dirs are created at `.takt/runs/{timestamp}-{slug}/reports/`
- Report files specified in `output_contracts` are written relative to report dir
- Report files specified in `step.report` are written relative to report dir
- Report dir path is available as `{report_dir}` variable in instruction templates
- When `cwd !== projectCwd` (worktree execution), reports write to `cwd/.takt/runs/{slug}/reports/` (clone dir) to prevent agents from discovering the main repository path
**Session continuity across phases:**
- Agent sessions persist across Phase 1 → Phase 2 → Phase 3 for context continuity
- Session ID is passed via `resumeFrom` in `RunAgentOptions`
- Session key: `{persona}:{provider}` prevents cross-provider session contamination
- Sessions are stored per-cwd, so worktree executions create new sessions
- Use `takt clear` to reset all agent sessions
**Worktree execution gotchas:**
- `git clone --shared` creates independent `.git` directory (not `git worktree`)
- Clone cwd ≠ project cwd: agents work in clone, reports write to clone, logs write to project
- Session resume is skipped when `cwd !== projectCwd` to avoid cross-directory contamination
- Reports write to `cwd/.takt/runs/{slug}/reports/` (clone) to prevent agents from discovering the main repository path via instruction
- Clones are ephemeral: created → task runs → auto-commit + push → deleted
- Use `takt list` to manage task branches after clone deletion
**Rule evaluation quirks:**
- Tag-based rules match by array index (0-based), not by exact condition text
- When multiple `[STEP:N]` tags appear in output, **last match wins** (not first)
- `ai()` conditions are evaluated by the provider, not by string matching
- Aggregate conditions (`all()`, `any()`) only work in parallel parent movements
- **v0.3.8+:** When multiple `[STEP:N]` tags appear in output, **last match wins** (not first)
- `ai()` conditions are evaluated by Claude/Codex, not by string matching
- Aggregate conditions (`all()`, `any()`) only work in parallel parent steps
- Fail-fast: if rules exist but no rule matches, piece aborts
- Interactive-only rules are skipped in pipeline mode (`rule.interactiveOnly === true`)
**Provider-specific behavior:**
- Claude: Uses session files in `~/.claude/projects/`, supports aliases: `opus`, `sonnet`, `haiku`
- Codex: In-memory sessions, retry with exponential backoff (3 attempts)
- OpenCode: Shared server pooling, requires explicit `model`, client-side permission auto-reply
- Mock: Deterministic responses, scenario queue support
- Claude: Uses session files in `~/.claude/projects/`, supports skill/agent calls
- Codex: In-memory sessions, no skill/agent calls
- Model names are passed directly to provider (no alias resolution in TAKT)
- Claude supports aliases: `opus`, `sonnet`, `haiku`
- Codex defaults to `codex` if model not specified
**Permission modes (provider-independent values):**
**Permission modes (v0.3.8+: provider-independent values):**
- `readonly`: Read-only access, no file modifications (Claude: `default`, Codex: `read-only`)
- `edit`: Allow file edits with confirmation (Claude: `acceptEdits`, Codex: `workspace-write`)
- `full`: Bypass all permission checks (Claude: `bypassPermissions`, Codex: `danger-full-access`)
- Resolved via `provider_profiles` (global/project config) with `required_permission_mode` as minimum floor
- Movement-level `required_permission_mode` sets the minimum; `provider_profiles` defaults/overrides can raise it
- Specified at step level (`permission_mode` field) or global config
- **v0.3.8+:** Permission mode values are unified across providers; TAKT translates to provider-specific flags
- Legacy values (`default`, `acceptEdits`, `bypassPermissions`) are **no longer supported**

View File

@ -1,66 +1,62 @@
# Contributing to TAKT
🇯🇵 [日本語版](./docs/CONTRIBUTING.ja.md)
Thank you for your interest in contributing to TAKT!
Thank you for your interest in contributing to TAKT! This project uses TAKT's review piece to verify PR quality before merging.
## About This Project
This project is developed using [TAKT](https://github.com/nrslib/takt). Please understand the following before contributing:
- **Small, focused changes are preferred** - Bug fixes, typo corrections, documentation improvements
- **Large PRs are difficult to review** - Especially AI-generated bulk changes without explanation
## How to Contribute
### Reporting Issues
1. Search existing issues first
2. Include reproduction steps
3. Include your environment (OS, Node version, etc.)
### Pull Requests
**Preferred:**
- Bug fixes with tests
- Documentation improvements
- Small, focused changes
- Typo corrections
**Difficult to review:**
- Large refactoring
- AI-generated bulk changes
- Feature additions without prior discussion
### Before Submitting a PR
1. Open an issue first to discuss the change
2. Keep changes small and focused
3. Include tests if applicable
4. Update documentation if needed
## Development Setup
```bash
# Clone the repository
git clone https://github.com/your-username/takt.git
cd takt
# Install dependencies
npm install
# Build
npm run build
# Run tests
npm test
# Lint
npm run lint
```
## How to Contribute
1. **Open an issue** to discuss the change before starting work
2. **Keep changes small and focused** — bug fixes, documentation improvements, typo corrections are welcome
3. **Include tests** for new behavior
4. **Run the review** before submitting (see below)
Large refactoring or feature additions without prior discussion are difficult to review and may be declined.
## Before Submitting a PR
All PRs must pass the TAKT review process. PRs without a review summary or with unresolved REJECT findings will not be merged.
### 1. Pass CI checks
```bash
npm run build
npm run lint
npm test
```
### 2. Run TAKT review
The review piece auto-detects the review mode based on the input:
```bash
# PR mode — review a pull request by number
takt -t "#<PR-number>" -w review
# Branch mode — review a branch diff against main
takt -t "<branch-name>" -w review
# Current diff mode — review uncommitted or recent changes
takt -t "review current changes" -w review
```
### 3. Confirm APPROVE
Check the review summary in `.takt/runs/*/reports/review-summary.md`. If the result is **REJECT**, fix the reported issues and re-run the review until you get **APPROVE**.
If a REJECT finding cannot be resolved (e.g., false positive, intentional design decision), leave a comment on the PR explaining why it remains unresolved.
### 4. Include the review summary in your PR
Post the contents of `review-summary.md` as a comment on your PR. This is **required** — it lets maintainers verify that the review was run and passed.
## Code Style
- TypeScript strict mode

926
README.md

File diff suppressed because it is too large Load Diff

View File

@ -1,123 +1,101 @@
# TAKT global configuration sample
# TAKT Global Configuration
# Location: ~/.takt/config.yaml
# =====================================
# General settings
# =====================================
language: en # UI language: en | ja
# ── Basic ──
# Default provider and model
# provider: claude # Default provider: claude | codex | opencode | cursor | copilot | mock
# model: sonnet # Default model (passed directly to provider)
# Language (en | ja)
language: en
# Execution control
# worktree_dir: ~/takt-worktrees # Base directory for shared clone execution
# prevent_sleep: false # Prevent macOS idle sleep while running
# auto_fetch: false # Fetch before clone to keep shared clones up-to-date
# base_branch: main # Base branch to clone from (default: current branch)
# concurrency: 1 # Number of tasks to run concurrently in takt run (1-10)
# task_poll_interval_ms: 500 # Polling interval in ms for picking up new tasks (100-5000)
# Default piece when no piece is specified
default_piece: default
# PR / branch
# auto_pr: false # Auto-create PR after worktree execution
# draft_pr: false # Create PR as draft
# branch_name_strategy: romaji # Branch name generation: romaji | ai
# Log level (debug | info | warn | error)
log_level: info
# Pipeline execution
# pipeline:
# default_branch_prefix: "takt/" # Branch prefix for pipeline-created branches
# commit_message_template: "{title}" # Commit message template. Variables: {title}, {issue}
# pr_body_template: "{report}" # PR body template. Variables: {issue_body}, {report}, {issue}
# ── Provider & Model ──
# Output / notifications
# minimal_output: false # Suppress detailed agent output
# notification_sound: true # Master switch for sounds
# notification_sound_events: # Per-event sound toggle (unset means true)
# iteration_limit: true
# piece_complete: true
# piece_abort: true
# run_complete: true
# run_abort: true
# logging:
# level: info # Log level for console and file output
# trace: true # Generate human-readable execution trace report (trace.md)
# debug: false # Enable debug.log + prompts.jsonl
# provider_events: false # Persist provider stream events
# usage_events: false # Persist usage event logs
# Provider runtime (claude | codex)
provider: claude
# Analytics
# analytics:
# enabled: true # Enable local analytics collection
# events_path: ~/.takt/analytics/events # Custom events directory
# retention_days: 30 # Retention period for event files
# Default model (optional)
# Claude: opus, sonnet, haiku
# Codex: gpt-5.2-codex, gpt-5.1-codex, etc.
# model: sonnet
# Interactive mode
# interactive_preview_movements: 3 # Number of movement previews in interactive mode (0-10)
# Per-persona provider/model overrides
# Per-persona provider override (optional)
# Override provider for specific personas. Others use the global provider.
# persona_providers:
# coder:
# provider: claude
# model: opus
# reviewer:
# provider: codex
# model: gpt-5.2-codex
# coder: codex
# Provider-specific options (lowest priority, overridden by piece/movement)
# provider_options:
# codex:
# network_access: true
# claude:
# sandbox:
# allow_unsandboxed_commands: true
# ── API Keys ──
# Optional. Environment variables take priority:
# TAKT_ANTHROPIC_API_KEY, TAKT_OPENAI_API_KEY
# Provider permission profiles
# provider_profiles:
# claude:
# default_permission_mode: edit
# codex:
# default_permission_mode: edit
# anthropic_api_key: ""
# openai_api_key: ""
# Runtime environment preparation
# runtime:
# prepare: [node, gradle, ./custom-script.sh]
# ── Execution ──
# Piece-level overrides
# piece_overrides:
# quality_gates:
# - "All tests pass"
# quality_gates_edit_only: true
# movements:
# review:
# quality_gates:
# - "No security vulnerabilities"
# personas:
# coder:
# quality_gates:
# - "Code follows conventions"
# Worktree (shared clone) directory (default: ../{clone-name} relative to project)
# worktree_dir: ~/takt-worktrees
# Credentials (environment variables take priority)
# anthropic_api_key: "sk-ant-..." # Claude API key
# openai_api_key: "sk-..." # Codex/OpenAI API key
# gemini_api_key: "..." # Gemini API key
# google_api_key: "..." # Google API key
# groq_api_key: "..." # Groq API key
# openrouter_api_key: "..." # OpenRouter API key
# opencode_api_key: "..." # OpenCode API key
# cursor_api_key: "..." # Cursor API key
# Auto-create PR after worktree execution (default: prompt in interactive mode)
# auto_pr: false
# CLI paths
# codex_cli_path: "/absolute/path/to/codex" # Absolute path to Codex CLI
# claude_cli_path: "/absolute/path/to/claude" # Absolute path to Claude Code CLI
# cursor_cli_path: "/absolute/path/to/cursor" # Absolute path to cursor-agent CLI
# copilot_cli_path: "/absolute/path/to/copilot" # Absolute path to Copilot CLI
# copilot_github_token: "ghp_..." # Copilot GitHub token
# Prevent macOS idle sleep during execution using caffeinate (default: false)
# prevent_sleep: false
# Misc
# bookmarks_file: ~/.takt/preferences/bookmarks.yaml # Bookmark file location
# ── Parallel Execution (takt run) ──
# Piece list / categories
# enable_builtin_pieces: true # Enable built-in pieces from builtins/{lang}/pieces
# Number of tasks to run concurrently (1 = sequential, max: 10)
# concurrency: 1
# Polling interval in ms for picking up new tasks (100-5000, default: 500)
# task_poll_interval_ms: 500
# ── Interactive Mode ──
# Number of movement previews shown in interactive mode (0 to disable, max: 10)
# interactive_preview_movements: 3
# Branch name generation strategy (romaji: fast default | ai: slow)
# branch_name_strategy: romaji
# ── Output ──
# Notification sounds (default: true)
# notification_sound: true
# Minimal output for CI - suppress AI output (default: false)
# minimal_output: false
# ── Builtin Pieces ──
# Enable builtin pieces (default: true)
# enable_builtin_pieces: true
# Exclude specific builtins from loading
# disabled_builtins:
# - magi # Built-in piece names to disable
# piece_categories_file: ~/.takt/preferences/piece-categories.yaml # Category definition file
# - magi
# ── Pipeline Mode (--pipeline) ──
# pipeline:
# default_branch_prefix: "takt/"
# commit_message_template: "feat: {title} (#{issue})"
# pr_body_template: |
# ## Summary
# {issue_body}
# Closes #{issue}
# ── Preferences ──
# Custom paths for preference files
# bookmarks_file: ~/.takt/preferences/bookmarks.yaml
# piece_categories_file: ~/.takt/preferences/piece-categories.yaml
# ── Debug ──
# debug:
# enabled: false
# log_file: ~/.takt/logs/debug.log

View File

@ -1,31 +0,0 @@
Use reports in the Report Directory and fix the issues raised by the reviewer.
**Report reference policy:**
- Use the latest review reports in the Report Directory as primary evidence.
- Past iteration reports are saved as `{filename}.{timestamp}` in the same directory (e.g., `architect-review.md.20260304T123456Z`). For each report, run Glob with a `{report-name}.*` pattern, read up to 2 files in descending timestamp order, and understand persists / reopened trends before starting fixes.
**Completion criteria (all must be satisfied):**
- All findings in this iteration (new / reopened) have been fixed
- Potential occurrences of the same `family_tag` have been fixed simultaneously (no partial fixes that cause recurrence)
- At least one regression test per `family_tag` has been added (mandatory for config-contract and boundary-check findings)
- Findings with the same `family_tag` from multiple reviewers have been merged and addressed as one fix
**Important**: After fixing, run the build (type check) and tests.
**Required output (include headings)**
## Work results
- {Summary of actions taken}
## Changes made
- {Summary of changes}
## Build results
- {Build execution results}
## Test results
- {Test command executed and results}
## Convergence gate
| Metric | Count |
|--------|-------|
| new (fixed in this iteration) | {N} |
| reopened (recurrence fixed) | {N} |
| persists (carried over, not addressed this iteration) | {N} |
## Evidence
- {List key points from files checked/searches/diffs/logs}

View File

@ -1,42 +0,0 @@
Gather information about the review target and produce a report for reviewers to reference.
## Auto-detect review mode
Analyze the task text and determine which mode to use.
### Mode 1: PR mode
**Trigger:** Task contains PR references like `#42`, `PR #42`, `pull/42`, or a URL with `/pull/`
**Steps:**
1. Extract the PR number
2. Run `gh pr view {number}` to get title, description, labels
3. Run `gh pr diff {number}` to get the diff
4. Compile the changed files list
5. Extract purpose and requirements from the PR description
6. If linked Issues exist, retrieve them with `gh issue view {number}`
- Extract Issue numbers from "Closes #N", "Fixes #N", "Resolves #N"
- Collect Issue title, description, labels, and comments
### Mode 2: Branch mode
**Trigger:** Task text matches a branch name found in `git branch -a`. This includes names with `/` (e.g., `feature/auth`) as well as simple names (e.g., `develop`, `release-v2`, `hotfix-login`). When unsure, verify with `git branch -a | grep {text}`.
**Steps:**
1. Determine the base branch (default: `main`, fallback: `master`)
2. Run `git log {base}..{branch} --oneline` to get commit history
3. Run `git diff {base}...{branch}` to get the diff
4. Compile the changed files list
5. Extract purpose from commit messages
6. If a PR exists for the branch, fetch it with `gh pr list --head {branch}`
### Mode 3: Current diff mode
**Trigger:** Task does not match Mode 1 or Mode 2 (e.g., "review current changes", "last 3 commits", "current diff")
**Steps:**
1. If the task specifies a count (e.g., "last N commits"), extract N. Otherwise default to N=1
2. Run `git diff` for unstaged changes and `git diff --staged` for staged changes
3. If both are empty, run `git diff HEAD~{N}` to get the diff for the last N commits
4. Run `git log --oneline -{N+10}` for commit context
5. Compile the changed files list
6. Extract purpose from recent commit messages
## Report requirements
- Regardless of mode, the output report must follow the same format
- Fill in what is available; mark unavailable sections as "N/A"
- Always include: review target overview, purpose, changed files, and the diff

View File

@ -1,61 +0,0 @@
Implement according to the plan, making existing tests pass.
Refer only to files within the Report Directory shown in the Piece Context. Do not search or reference other report directories.
Use reports in the Report Directory as the primary source of truth. If additional context is needed, you may consult Previous Response and conversation history as secondary sources (Previous Response may be unavailable). If information conflicts, prioritize reports in the Report Directory and actual file contents.
**Important**: Tests have already been written. Implement production code to make existing tests pass.
- Review existing test files and understand the expected behavior
- Implement production code to make tests pass
- Tests are already written so additional tests are generally unnecessary, but may be added if needed
- If test modifications are needed, document the reasons in the Decisions output contract before modifying
- Build verification is mandatory. After completing implementation, run the build (type check) and verify there are no type errors
- Running tests is mandatory. After build succeeds, always run tests and verify all tests pass
- When introducing new contract strings (file names, config key names, etc.), define them as constants in one place
**Scope output contract (create at the start of implementation):**
```markdown
# Change Scope Declaration
## Task
{One-line task summary}
## Planned changes
| Type | File |
|------|------|
| Create | `src/example.ts` |
| Modify | `src/routes.ts` |
## Estimated size
Small / Medium / Large
## Impact area
- {Affected modules or features}
```
**Decisions output contract (at implementation completion, only if decisions were made):**
```markdown
# Decision Log
## 1. {Decision}
- **Context**: {Why the decision was needed}
- **Options considered**: {List of options}
- **Rationale**: {Reason for the choice}
```
**Pre-completion self-check (required):**
Before running build and tests, verify the following:
- If new parameters/fields were added, grep to confirm they are actually passed from call sites
- For any `??`, `||`, `= defaultValue` usage, confirm fallback is truly necessary
- Verify no replaced code/exports remain after refactoring
- Verify no features outside the task specification were added
- Verify no if/else blocks call the same function with only argument differences
- Verify new code matches existing implementation patterns (API call style, type definition style, etc.)
**Required output (include headings)**
## Work results
- {Summary of actions taken}
## Changes made
- {Summary of changes}
## Build results
- {Build execution results}
## Test results
- {Test command executed and results}

View File

@ -1,54 +0,0 @@
Implement Terraform code according to the plan.
Refer only to files within the Report Directory shown in the Piece Context. Do not search or reference other report directories.
**Important**: After implementation, run the following validations in order:
1. `terraform fmt -check` — fix formatting violations with `terraform fmt` if any
2. `terraform validate` — check for syntax and type errors
3. `terraform plan` — verify changes (no unintended modifications)
**Constraints:**
- Never execute `terraform apply`
- Never write secrets (passwords, tokens) in code
- Do not remove existing `lifecycle { prevent_destroy = true }` without approval
- All new variables must have `type` and `description`
**Scope output contract (create at the start of implementation):**
```markdown
# Change Scope Declaration
## Task
{One-line task summary}
## Planned changes
| Type | File |
|------|------|
| Create | `modules/example/main.tf` |
| Modify | `environments/sandbox/main.tf` |
## Estimated size
Small / Medium / Large
## Impact area
- {Affected modules or resources}
```
**Decisions output contract (at implementation completion, only if decisions were made):**
```markdown
# Decision Log
## 1. {Decision}
- **Context**: {Why the decision was needed}
- **Options considered**: {List of options}
- **Rationale**: {Reason for the choice}
- **Cost impact**: {If applicable}
```
**Required output (include headings)**
## Work results
- {Summary of actions taken}
## Changes made
- {Summary of changes}
## Validation results
- {terraform fmt -check result}
- {terraform validate result}
- {terraform plan summary (resources to add/change/destroy)}

View File

@ -1,12 +0,0 @@
The ai_review ↔ ai_fix loop has repeated {cycle_count} times.
Review the reports from each cycle and determine whether this loop
is healthy (making progress) or unproductive (repeating the same issues).
**Reports to reference:**
- AI Review results: {report:ai-review.md}
**Judgment criteria:**
- Are new issues being found/fixed in each cycle?
- Are the same findings being repeated?
- Are fixes actually being applied?

View File

@ -1,9 +0,0 @@
The reviewers → fix loop has repeated {cycle_count} times.
Review the latest review reports in the Report Directory and determine
whether this loop is healthy (converging) or unproductive (diverging or oscillating).
**Judgment criteria:**
- Is the number of new / reopened findings decreasing each cycle?
- Are the same family_tag findings not repeating (is persists not growing)?
- Are fixes actually being applied to the code?

View File

@ -1,25 +0,0 @@
Analyze the task and formulate an implementation plan including design decisions.
**Note:** If a Previous Response exists, this is a replan due to rejection.
Revise the plan taking that feedback into account.
**Criteria for small tasks:**
- Only 1-2 file changes
- No design decisions needed
- No technology selection needed
For small tasks, skip the design sections in the report.
**Actions:**
1. Understand the task requirements
- **When reference material points to an external implementation, determine whether it is a "bug fix clue" or a "design approach to adopt". If narrowing scope beyond the reference material's intent, include the rationale in the plan report**
- **For each requirement, determine "change needed / not needed". If "not needed", cite the relevant code (file:line) as evidence. Claiming "already correct" without evidence is prohibited**
2. Investigate code to resolve unknowns
3. Identify the impact area
4. Determine file structure and design patterns (if needed)
5. Decide on the implementation approach
- Verify the implementation approach does not violate knowledge/policy constraints
6. Include the following in coder implementation guidelines:
- Existing implementation patterns to reference (file:line). Always cite when similar processing already exists
- Impact area of changes. Especially when adding new parameters, enumerate all call sites that need wiring
- Anti-patterns to watch for in this specific task (if applicable)

View File

@ -1,23 +0,0 @@
Analyze the research results and determine whether additional investigation is needed.
**What to do:**
1. Organize the major findings from the research results
2. Identify unexplained phenomena, unverified hypotheses, and missing data
3. Save analysis results to `{report_dir}/analysis-{N}.md` as files
4. Make one of the following judgments:
- **New questions exist** → Create additional research instructions for the Digger
- **Sufficiently investigated** → Create an overall summary
**Data saving rules:**
- Write to `{report_dir}/analysis-{N}.md` (N is sequential number) for each analysis
- Include analysis perspective, synthesized findings, and identified gaps
**Additional research instruction format:**
- What to investigate (specific data or information)
- Why it's needed (which gap it fills)
- Where it might be found (hints for data sources)
**Overall summary structure:**
- Summary of findings so far
- Organization of findings
- Identified gaps and their importance (if remaining)

View File

@ -1,31 +0,0 @@
Decompose the research plan (or additional research instructions) into independent subtasks and execute the investigation in parallel.
**What to do:**
1. Analyze research items from the plan and decompose them into independently executable subtasks
2. Include clear research scope and expected deliverables in each subtask's instruction
3. Include the following data saving rules and report structure in each subtask's instruction
**Subtask decomposition guidelines:**
- Prioritize topic independence (group interdependent items into the same subtask)
- Avoid spreading high-priority items (P1) across too many subtasks
- Balance workload evenly across subtasks
**Rules to include in each subtask's instruction:**
Data saving rules:
- Write data per research item to `{report_dir}/data-{topic-name}.md`
- Topic names in lowercase English with hyphens (e.g., `data-market-size.md`)
- Include source URLs, retrieval dates, and raw data
External data downloads:
- Actively download and utilize CSV, Excel, JSON, and other data files from public institutions and trusted sources
- Always verify source reliability before downloading
- Save downloaded files to `{report_dir}/`
- Never download from suspicious domains or download executable files
Report structure (per subtask):
- Results and details per research item
- Summary of key findings
- Caveats and risks
- Items unable to research and reasons
- Recommendations/conclusions

View File

@ -1,10 +0,0 @@
Analyze the research request and create a research plan.
**Note:** If Previous Response exists, this is a re-plan from Supervisor feedback.
Incorporate the feedback into the revised plan.
**What to do:**
1. Decompose the request (What: what to know / Why: why / Scope: how far)
2. Identify research items (choose appropriate perspectives based on the type of request)
3. Identify candidate data sources for each item
4. Assign priorities (P1: Required / P2: Important / P3: Nice to have)

View File

@ -1,9 +0,0 @@
Evaluate the research results and determine if they adequately answer the original request.
**What to do:**
1. Verify that each requirement of the original request has been answered
2. Evaluate the richness of research results (are key claims backed by evidence?)
3. Evaluate depth of analysis (does it go beyond surface to deeper factors?)
**If issues exist:** Include specific instructions for the Planner.
Not "insufficient" but "XX is missing" with concrete specifics.

View File

@ -1,27 +0,0 @@
Review the changes from a requirements fulfillment perspective.
**Review criteria:**
- Whether each requested requirement has been implemented
- Whether implicit requirements (naturally expected behaviors) are satisfied
- Whether changes outside the scope (scope creep) have crept in
- Whether there are any partial or missing implementations
**Design decisions reference:**
Review {report:coder-decisions.md} to understand the recorded design decisions.
- Do not flag intentionally documented decisions as FP
- However, also evaluate whether the design decisions themselves are sound, and flag any problems
**Previous finding tracking (required):**
- First, extract open findings from "Previous Response"
- Assign `finding_id` to each finding and classify current status as `new / persists / resolved`
- If status is `persists`, provide concrete unresolved evidence (file/line)
## Judgment Procedure
1. Extract requirements one by one from the review target report and task
2. For each requirement, identify the implementing code (file:line)
3. Confirm that the code satisfies the requirement
4. Check for any changes not covered by the requirements
5. For each detected issue, classify as blocking/non-blocking based on Policy's scope determination table and judgment rules
6. If there is even one blocking issue (`new` or `persists`), judge as REJECT

View File

@ -1,31 +0,0 @@
Focus on reviewing **Terraform convention compliance**.
Do not review AI-specific issues (already covered by the ai_review movement).
**Review criteria:**
- Variable declaration compliance (type, description, sensitive)
- Resource naming consistency (name_prefix pattern)
- File organization compliance (one file per concern)
- Security configurations (IMDSv2, encryption, access control, IAM least privilege)
- Tag management (default_tags, no duplication)
- Lifecycle rule appropriateness
- Cost trade-off documentation
- Unused variables / outputs / data sources
**Design decisions reference:**
Review {report:coder-decisions.md} to understand the recorded design decisions.
- Do not flag intentionally documented decisions as FP
- However, also evaluate whether the design decisions themselves are sound, and flag any problems
**Previous finding tracking (required):**
- First, extract open findings from "Previous Response"
- Assign `finding_id` to each finding and classify current status as `new / persists / resolved`
- If status is `persists`, provide concrete unresolved evidence (file/line)
## Judgment Procedure
1. First, extract previous open findings and preliminarily classify as `new / persists / resolved`
2. Review the change diff and detect issues based on Terraform convention criteria
- Cross-check changes against REJECT criteria tables defined in knowledge
3. For each detected issue, classify as blocking/non-blocking based on Policy's scope determination table and judgment rules
4. If there is even one blocking issue (`new` or `persists`), judge as REJECT

View File

@ -1,74 +0,0 @@
Run tests, verify the build, and perform final approval.
**Overall piece verification:**
1. Check all reports in the report directory and verify overall piece consistency
- Does implementation match the plan?
- Were all review movement findings properly addressed?
- Was the original task objective achieved?
2. Whether each task spec requirement has been achieved
- Extract requirements one by one from the task spec
- For each requirement, identify the implementing code (file:line)
- Verify the code actually fulfills the requirement (read the file, run the test)
- Do not rely on the plan report's judgment; independently verify each requirement
- If any requirement is unfulfilled, REJECT
**Report verification:** Read all reports in the Report Directory and
check for any unaddressed improvement suggestions.
**Validation output contract:**
```markdown
# Final Verification Results
## Result: APPROVE / REJECT
## Requirements Fulfillment Check
Extract requirements from the task spec and verify each one individually against actual code.
| # | Requirement (extracted from task spec) | Met | Evidence (file:line) |
|---|---------------------------------------|-----|---------------------|
| 1 | {requirement 1} | ✅/❌ | `src/file.ts:42` |
| 2 | {requirement 2} | ✅/❌ | `src/file.ts:55` |
- If any ❌ exists, REJECT is mandatory
- ✅ without evidence is invalid (must verify against actual code)
- Do not rely on plan report's judgment; independently verify each requirement
## Verification Summary
| Item | Status | Verification method |
|------|--------|-------------------|
| Tests | ✅ | `npm test` (N passed) |
| Build | ✅ | `npm run build` succeeded |
| Functional check | ✅ | Main flows verified |
## Deliverables
- Created: {Created files}
- Modified: {Modified files}
## Outstanding items (if REJECT)
| # | Item | Reason |
|---|------|--------|
| 1 | {Item} | {Reason} |
```
**Summary output contract (only if APPROVE):**
```markdown
# Task Completion Summary
## Task
{Original request in 1-2 sentences}
## Result
Complete
## Changes
| Type | File | Summary |
|------|------|---------|
| Create | `src/file.ts` | Summary description |
## Verification commands
```bash
npm test
npm run build
```
```

View File

@ -1,29 +0,0 @@
Analyze the implementation task and, if decomposition is appropriate, split into multiple parts for parallel execution.
**Important:** Reference the plan report: {report:plan.md}
**Steps:**
1. Assess whether decomposition is appropriate
- Identify files to change and check inter-file dependencies
- If cross-cutting concerns exist (shared types, IDs, events), implement in a single part
- If few files are involved, or the task is a rename/refactoring, implement in a single part
2. If decomposing: group files by layer/module
- Create groups based on high cohesion (e.g., Domain layer / Infrastructure layer / API layer)
- If there are type or interface dependencies, keep both sides in the same group
- Never assign the same file to multiple parts
- Keep test files and implementation files in the same part
3. Assign file ownership exclusively to each part
- Each part's instruction must clearly state:
- **Responsible files** (list of files to create/modify)
- **Reference-only files** (read-only, modification prohibited)
- **Implementation task** (what and how to implement)
- **Completion criteria** (implementation of responsible files is complete)
- If tests are already written, instruct parts to implement so existing tests pass
- Do not include build checks (all parts complete first, then build is verified together)
**Constraints:**
- Parts do not run tests (handled by subsequent movements)
- Do not modify files outside your responsibility (causes conflicts)

View File

@ -1,59 +0,0 @@
Write tests based on the plan before implementing production code.
Refer only to files within the Report Directory shown in the Piece Context. Do not search or reference other report directories.
**Important: Do NOT create or modify production code. Only test files may be created.**
**Actions:**
1. Review the plan report and understand the planned behavior and interfaces
2. Examine existing code and tests to learn the project's test patterns
3. Write unit tests for the planned features
4. Determine whether integration tests are needed and create them if so
- Does the data flow cross 3+ modules?
- Does a new status/state merge into an existing workflow?
- Does a new option propagate through a call chain to the endpoint?
- If any apply, create integration tests
5. Run the build (type check) to verify test code has no syntax errors
**Test writing guidelines:**
- Follow the project's existing test patterns (naming conventions, directory structure, helpers)
- Write tests in Given-When-Then structure
- One concept per test. Do not mix multiple concerns in a single test
- Cover happy path, error cases, boundary values, and edge cases
- Write tests that are expected to pass after implementation is complete
**Scope output contract (create at the start):**
```markdown
# Change Scope Declaration
## Task
{One-line task summary}
## Planned changes
| Type | File |
|------|------|
| Create | `src/__tests__/example.test.ts` |
## Estimated size
Small / Medium / Large
## Impact area
- {Affected modules or features}
```
**Decisions output contract (at completion, only if decisions were made):**
```markdown
# Decision Log
## 1. {Decision}
- **Context**: {Why the decision was needed}
- **Options considered**: {List of options}
- **Rationale**: {Reason for the choice}
```
**Required output (include headings)**
## Work results
- {Summary of actions taken}
## Changes made
- {List of test files created}
## Build results
- {Build execution results}

View File

@ -1,30 +0,0 @@
# Comparative Research Knowledge
## Comparative Research Principles
When comparing two or more subjects, align same indicators under same conditions.
| Criterion | Judgment |
|-----------|----------|
| Both subjects' data aligned on same indicator and year | OK |
| Only one side has data | REJECT |
| Indicator definitions differ between subjects | Warning (note the differences) |
| Comparing absolute values without considering scale | Warning (add per-capita ratios) |
### Aligning Comparison Axes
When subjects differ in scale or background, direct comparison can be misleading. Normalize (per capita, per area, etc.) and explicitly state condition differences.
## Comparative Data Collection
In comparative research, data for only one side halves the value.
| Criterion | Judgment |
|-----------|----------|
| Collected from the same data source for all subjects | OK |
| Collected from different data sources per subject | Warning (verify comparability) |
| Data missing for some subjects | Note gaps, limit comparison to available range |
### Determining Non-comparability
When indicator definitions fundamentally differ, report "not comparable" rather than forcing comparison. Identify partially comparable items and state the comparable scope.

View File

@ -1,53 +0,0 @@
# Research Methodology Knowledge
## Data Reliability Evaluation
Data quality is determined by source reliability and clarity of documentation.
| Criterion | Judgment |
|-----------|----------|
| Numbers from official statistics (government, municipality) | High reliability |
| Numbers in news articles (with source) | Medium reliability |
| Numbers from personal blogs/SNS (no source) | Low reliability |
| Year/date of numbers is specified | OK |
| Year/date of numbers is unknown | Warning |
| Based on primary sources (official documents, originals) | OK |
| Secondary sources only, primary source unverifiable | Warning |
### Data Source Priority
| Priority | Data Source | Examples |
|----------|------------|---------|
| 1 | Government statistics/white papers | Census, ministry statistics |
| 2 | Municipal open data | City statistical reports, open data portals |
| 3 | Industry groups/research institutions | Think tanks, academic research |
| 4 | News (with primary source reference) | Newspapers, specialized media |
| 5 | News (without primary source) | Secondary reports, aggregation articles |
## Qualitative Analysis Evaluation
Quality of qualitative analysis is evaluated by logical causality and concrete evidence.
| Criterion | Judgment |
|-----------|----------|
| Claims causation with mechanism explanation | OK |
| Claims causation but only correlation exists | Warning |
| Digs into structural factors | OK |
| Stops at surface-level explanation | Insufficient |
| Backed by concrete examples, system names | OK |
| Abstract explanation only | Insufficient |
### Distinguishing Causation from Correlation
"A and B occur together" is correlation. "A causes B" is causation. Claiming causation requires mechanism explanation or elimination of alternative factors.
## Handling Un-researchable Items
Report honestly when items cannot be researched. Do not fill gaps with speculation.
| Situation | Response |
|-----------|----------|
| Data is not public | Report "Unable to research" with reason |
| Data exists but not found | Report "Not found" with locations searched |
| Only partial data available | Report what was found, note gaps |
| Want to supplement with speculation | Clearly mark as speculation with reasoning |

View File

@ -1,151 +0,0 @@
# TAKT Architecture Knowledge
## Core Structure
PieceEngine is a state machine. It manages movement transitions via EventEmitter.
```
CLI → PieceEngine → Runner (4 types) → RuleEvaluator → next movement
```
| Runner | Purpose | When to Use |
|--------|---------|-------------|
| MovementExecutor | Standard 3-phase execution | Default |
| ParallelRunner | Concurrent sub-movements | parallel block |
| ArpeggioRunner | Data-driven batch processing | arpeggio block |
| TeamLeaderRunner | Task decomposition → parallel sub-agents | team_leader block |
Runners are mutually exclusive. Do not specify multiple runner types on a single movement.
### 3-Phase Execution Model
Normal movements execute in up to 3 phases. Sessions persist across phases.
| Phase | Purpose | Tools | Condition |
|-------|---------|-------|-----------|
| Phase 1 | Main work | Movement's allowed_tools | Always |
| Phase 2 | Report output | Write only | When output_contracts defined |
| Phase 3 | Status judgment | None (judgment only) | When tag-based rules exist |
## Rule Evaluation
RuleEvaluator determines the next movement via 5-stage fallback. Earlier match takes priority.
| Priority | Method | Target |
|----------|--------|--------|
| 1 | aggregate | parallel parent (all/any) |
| 2 | Phase 3 tag | `[STEP:N]` output |
| 3 | Phase 1 tag | `[STEP:N]` output (fallback) |
| 4 | ai() judge | ai("condition") rules |
| 5 | AI fallback | AI evaluates all conditions |
When multiple tags appear in output, the **last match** wins.
### Condition Syntax
| Syntax | Parsing | Regex |
|--------|---------|-------|
| `ai("...")` | AI condition evaluation | `AI_CONDITION_REGEX` |
| `all("...")` / `any("...")` | Aggregate condition | `AGGREGATE_CONDITION_REGEX` |
| Plain string | Tag or AI fallback | — |
Adding new special syntax requires updating both pieceParser.ts regex and RuleEvaluator.
## Provider Integration
Abstracted through the Provider interface. SDK-specific details are encapsulated within each provider.
```
Provider.setup(AgentSetup) → ProviderAgent
ProviderAgent.call(prompt, options) → AgentResponse
```
| Criteria | Judgment |
|----------|----------|
| SDK-specific error handling leaking outside Provider | REJECT |
| Errors not propagated to AgentResponse.error | REJECT |
| Session key collision between providers | REJECT |
| Session key format `{persona}:{provider}` | OK |
### Model Resolution
Models resolve through 5-level priority. Higher takes precedence.
1. persona_providers model specification
2. Movement model field
3. CLI `--model` override
4. config.yaml (when resolved provider matches)
5. Provider default
## Facet Assembly
The faceted-prompting module is independent from TAKT core.
```
compose(facets, options) → ComposedPrompt { systemPrompt, userMessage }
```
| Criteria | Judgment |
|----------|----------|
| Import from faceted-prompting to TAKT core | REJECT |
| TAKT core depending on faceted-prompting | OK |
| Facet path resolution logic outside faceted-prompting | Warning |
### 3-Layer Facet Resolution Priority
Project `.takt/` → User `~/.takt/` → Builtin `builtins/{lang}/`
Same-named facets are overridden by higher-priority layers. Customize builtins by overriding in upper layers.
## Testing Patterns
Uses vitest. Test file naming conventions distinguish test types.
| Prefix | Type | Content |
|--------|------|---------|
| None | Unit test | Individual function/class verification |
| `it-` | Integration test | Piece execution simulation |
| `engine-` | Engine test | PieceEngine scenario verification |
### Mock Provider
`--provider mock` returns deterministic responses. Scenario queues compose multi-turn tests.
```typescript
// NG - Calling real API in tests
const response = await callClaude(prompt)
// OK - Set up scenario with mock provider
setMockScenario([
{ persona: 'coder', status: 'done', content: '[STEP:1]\nDone.' },
{ persona: 'reviewer', status: 'done', content: '[STEP:1]\napproved' },
])
```
### Test Isolation
| Criteria | Judgment |
|----------|----------|
| Tests sharing global state | REJECT |
| Environment variables not cleared in test setup | Warning |
| E2E tests assuming real API | Isolate via `provider` config |
## Error Propagation
Provider errors propagate through: `AgentResponse.error` → session log → console output.
| Criteria | Judgment |
|----------|----------|
| SDK error results in empty `blocked` status | REJECT |
| Error details not recorded in session log | REJECT |
| No ABORT transition defined for error cases | Warning |
## Session Management
Agent sessions are stored per-cwd. Session resume is skipped during worktree/clone execution.
| Criteria | Judgment |
|----------|----------|
| Session resuming when `cwd !== projectCwd` | REJECT (cross-project contamination) |
| Session key missing provider identifier | REJECT (cross-provider contamination) |
| Session broken between phases | REJECT (context loss) |

View File

@ -1,66 +0,0 @@
# Task Decomposition Knowledge
## Decomposition Feasibility
Before splitting a task into multiple parts, assess whether decomposition is appropriate. When decomposition is unsuitable, implementing in a single part is more efficient.
| Criteria | Judgment |
|----------|----------|
| Changed files clearly separate into layers | Decompose |
| Shared types/IDs span multiple parts | Single part |
| Broad rename/refactoring | Single part |
| Fewer than 5 files to change | Single part |
| Same file needs editing by multiple parts | Single part |
### Detecting Cross-Cutting Concerns
When any of the following apply, independent parts cannot maintain consistency. Consolidate into a single part.
- A new ID, key, or type is generated in one module and consumed in another
- Both the event emitter and event receiver need changes
- An existing interface signature changes, requiring updates to all call sites
## File Exclusivity Principle
When decomposing into multiple parts, each part's file ownership must be completely exclusive.
| Criteria | Judgment |
|----------|----------|
| Same file edited by multiple parts | REJECT (causes conflicts) |
| Type definition and consumer in different parts | Consolidate into the type definition part |
| Test file and implementation file in different parts | Consolidate into the same part |
### Grouping Priority
1. **By dependency direction** — keep dependency source and target in the same part
2. **By layer** — domain layer / infrastructure layer / API layer
3. **By feature** — independent functional units
## Failure Patterns
### Part Overlap
When two parts own the same file or feature, sub-agents overwrite each other's changes, causing repeated REJECT in reviews.
```
// NG: part-2 and part-3 own the same file
part-2: taskInstructionActions.ts — instruct confirmation dialog
part-3: taskInstructionActions.ts — requeue confirmation dialog
// OK: consolidate into one part
part-1: taskInstructionActions.ts — both instruct/requeue confirmation dialogs
```
### Shared Contract Mismatch
When part A generates an ID that part B consumes, both parts implement independently, leading to mismatches in ID name, type, or passing mechanism.
```
// NG: shared contract across independent parts
part-1: generates phaseExecutionId
part-2: consumes phaseExecutionId
→ part-1 uses string, part-2 expects number → integration error
// OK: single part for consistent implementation
part-1: implements phaseExecutionId from generation to consumption
```

View File

@ -1,241 +0,0 @@
# Terraform AWS Knowledge
## Module Design
Split modules by domain (network, database, application layer). Do not create generic utility modules.
| Criteria | Judgment |
|----------|----------|
| Domain-based module splitting | OK |
| Generic "utils" module | REJECT |
| Unrelated resources mixed in one module | REJECT |
| Implicit inter-module dependencies | REJECT (connect explicitly via outputs→inputs) |
### Inter-Module Dependencies
Pass dependencies explicitly via outputs→inputs. Avoid implicit references (using `data` sources to look up other module resources).
```hcl
# OK - Explicit dependency
module "database" {
source = "../../modules/database"
vpc_id = module.network.vpc_id
subnet_ids = module.network.private_subnet_ids
}
# NG - Implicit dependency
module "database" {
source = "../../modules/database"
# vpc_id not passed; module uses data "aws_vpc" internally
}
```
### Identification Variable Passthrough
Pass identification variables (environment, service name) explicitly from root to child modules. Do not rely on globals or hardcoding.
```hcl
# OK - Explicit passthrough
module "database" {
environment = var.environment
service = var.service
application_name = var.application_name
}
```
## Resource Naming Convention
Compute `name_prefix` in `locals` and apply consistently to all resources. Append resource-specific suffixes.
| Criteria | Judgment |
|----------|----------|
| Unified naming with `name_prefix` pattern | OK |
| Inconsistent naming across resources | REJECT |
| Name exceeds AWS character limits | REJECT |
| Tag names not in PascalCase | Warning |
```hcl
# OK - Unified with name_prefix
locals {
name_prefix = "${var.environment}-${var.service}-${var.application_name}"
}
resource "aws_ecs_cluster" "main" {
name = "${local.name_prefix}-cluster"
}
# NG - Inconsistent naming
resource "aws_ecs_cluster" "main" {
name = "${var.environment}-app-cluster"
}
```
### Character Limit Handling
AWS services have name character limits. Use shortened forms when approaching limits.
| Service | Limit | Example |
|---------|-------|---------|
| Target Group | 32 chars | `${var.environment}-${var.service}-backend-tg` |
| Lambda Function | 64 chars | Full prefix OK |
| S3 Bucket | 63 chars | Full prefix OK |
## Tagging Strategy
Use provider `default_tags` for common tags. No duplicate tagging on individual resources.
| Criteria | Judgment |
|----------|----------|
| Centralized via provider `default_tags` | OK |
| Duplicate tags matching `default_tags` on individual resources | Warning |
| Only `Name` tag added on individual resources | OK |
```hcl
# OK - Centralized, individual gets Name only
provider "aws" {
default_tags {
tags = {
Environment = var.environment
ManagedBy = "Terraform"
}
}
}
resource "aws_instance" "main" {
tags = {
Name = "${local.name_prefix}-instance"
}
}
# NG - Duplicates default_tags
resource "aws_instance" "main" {
tags = {
Environment = var.environment
ManagedBy = "Terraform"
Name = "${local.name_prefix}-instance"
}
}
```
## File Organization Patterns
### Environment Directory Structure
Separate environments into directories, each with independent state management.
```
environments/
├── production/
│ ├── terraform.tf # Version constraints
│ ├── providers.tf # Provider config (default_tags)
│ ├── backend.tf # S3 backend
│ ├── variables.tf # Environment variables
│ ├── main.tf # Module invocations
│ └── outputs.tf # Outputs
└── staging/
└── ...
```
### Module File Structure
| File | Contents |
|------|----------|
| `main.tf` | `locals` and `data` sources only |
| `variables.tf` | Input variable definitions only (no resources) |
| `outputs.tf` | Output definitions only (no resources) |
| `{resource_type}.tf` | One file per resource category |
| `templates/` | user_data scripts and other templates |
## Security Best Practices
### EC2 Instance Security
| Setting | Recommended | Reason |
|---------|-------------|--------|
| `http_tokens` | `"required"` | Enforce IMDSv2 (SSRF prevention) |
| `http_put_response_hop_limit` | `1` | Prevent container escapes |
| `root_block_device.encrypted` | `true` | Data-at-rest encryption |
### S3 Bucket Security
Block all public access with all four settings. Use OAC (Origin Access Control) for CloudFront distributions.
```hcl
# OK - Complete block
resource "aws_s3_bucket_public_access_block" "this" {
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
```
### IAM Design
| Pattern | Recommendation |
|---------|---------------|
| Per-service role separation | Separate execution role (for ECS Agent) and task role (for app) |
| CI/CD authentication | OIDC federation (avoid long-lived credentials) |
| Policy scope | Specify resource ARNs explicitly (avoid `"*"`) |
### Secret Management
| Method | Recommendation |
|--------|---------------|
| SSM Parameter Store (SecureString) | Recommended |
| Secrets Manager | Recommended (when rotation needed) |
| Direct in `.tfvars` | Conditional OK (gitignore required) |
| Hardcoded in `.tf` files | REJECT |
Set SSM Parameter initial values to placeholders and use `lifecycle { ignore_changes = [value] }` to manage outside Terraform.
## Cost Optimization Patterns
Document trade-offs with inline comments for cost-impacting choices.
| Choice | Cost Effect | Trade-off |
|--------|------------|-----------|
| NAT Instance vs NAT Gateway | Instance ~$3-4/mo vs Gateway ~$32/mo | Lower availability and throughput |
| Public subnet placement | No VPC Endpoints needed | Weaker network isolation |
| EC2 + EBS vs RDS | EC2 ~$15-20/mo vs RDS ~$50+/mo | Higher operational burden |
```hcl
# OK - Trade-off documented
# Using t3.nano instead of NAT Gateway (~$3-4/mo vs ~$32/mo)
# Trade-off: single-AZ availability, throughput limits
resource "aws_instance" "nat" {
instance_type = "t3.nano"
}
```
## Lifecycle Rule Usage
| Rule | Purpose | Target |
|------|---------|--------|
| `prevent_destroy` | Prevent accidental deletion | Databases, EBS volumes |
| `ignore_changes` | Allow external changes | `desired_count` (Auto Scaling), SSM `value` |
| `create_before_destroy` | Prevent downtime | Load balancers, security groups |
```hcl
# OK - Prevent accidental database deletion
resource "aws_instance" "database" {
lifecycle {
prevent_destroy = true
}
}
# OK - Let Auto Scaling manage desired_count
resource "aws_ecs_service" "main" {
lifecycle {
ignore_changes = [desired_count]
}
}
```
## Version Management
| Setting | Recommendation |
|---------|---------------|
| `required_version` | `">= 1.5.0"` or higher (`default_tags` support) |
| Provider version | Pin minor version with `~>` (e.g., `~> 5.80`) |
| State locking | `use_lockfile = true` required |

View File

@ -1,44 +0,0 @@
```markdown
# AI-Generated Code Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in one sentence}
## Verified Items
| Aspect | Result | Notes |
|--------|--------|-------|
| Validity of assumptions | ✅ | - |
| API/library existence | ✅ | - |
| Context fit | ✅ | - |
| Scope | ✅ | - |
## Current Iteration Findings (new)
| # | finding_id | family_tag | Category | Location | Issue | Fix Suggestion |
|---|------------|------------|----------|----------|-------|----------------|
| 1 | AI-NEW-src-file-L23 | hallucination | Hallucinated API | `src/file.ts:23` | Non-existent method | Replace with existing API |
## Carry-over Findings (persists)
| # | finding_id | family_tag | Previous Evidence | Current Evidence | Issue | Fix Suggestion |
|---|------------|------------|-------------------|------------------|-------|----------------|
| 1 | AI-PERSIST-src-file-L42 | hallucination | `src/file.ts:42` | `src/file.ts:42` | Still unresolved | Apply prior fix plan |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| AI-RESOLVED-src-file-L10 | `src/file.ts:10` no longer contains the issue |
## Reopened Findings (reopened)
| # | finding_id | family_tag | Prior Resolution Evidence | Recurrence Evidence | Issue | Fix Suggestion |
|---|------------|------------|--------------------------|---------------------|-------|----------------|
| 1 | AI-REOPENED-src-file-L55 | hallucination | `Previously fixed at src/file.ts:10` | `Recurred at src/file.ts:55` | Issue description | Fix approach |
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new`, `persists`, or `reopened`
- Findings without `finding_id` are invalid
```
**Cognitive load reduction rules:**
- No issues → Summary sentence + checklist + empty finding sections (10 lines or fewer)
- Issues found → include table rows only for impacted sections (30 lines or fewer)

View File

@ -1,46 +0,0 @@
```markdown
# Architecture Review
## Result: APPROVE / IMPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
- [x] Structure & design
- [x] Code quality
- [x] Change scope
- [x] Test coverage
- [x] Dead code
- [x] Call chain verification
## Current Iteration Findings (new)
| # | finding_id | family_tag | Scope | Location | Issue | Fix Suggestion |
|---|------------|------------|-------|----------|-------|----------------|
| 1 | ARCH-NEW-src-file-L42 | design-violation | In-scope | `src/file.ts:42` | Issue description | Fix approach |
Scope: "In-scope" (fixable in this change) / "Out-of-scope" (existing issue, non-blocking)
## Carry-over Findings (persists)
| # | finding_id | family_tag | Previous Evidence | Current Evidence | Issue | Fix Suggestion |
|---|------------|------------|-------------------|------------------|-------|----------------|
| 1 | ARCH-PERSIST-src-file-L77 | design-violation | `src/file.ts:77` | `src/file.ts:77` | Still unresolved | Apply prior fix plan |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| ARCH-RESOLVED-src-file-L10 | `src/file.ts:10` now satisfies the rule |
## Reopened Findings (reopened)
| # | finding_id | family_tag | Prior Resolution Evidence | Recurrence Evidence | Issue | Fix Suggestion |
|---|------------|------------|--------------------------|---------------------|-------|----------------|
| 1 | ARCH-REOPENED-src-file-L55 | design-violation | `Previously fixed at src/file.ts:10` | `Recurred at src/file.ts:55` | Issue description | Fix approach |
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new`, `persists`, or `reopened`
- Findings without `finding_id` are invalid
```
**Cognitive load reduction rules:**
- APPROVE → Summary only (5 lines or fewer)
- REJECT → Include only relevant finding rows (30 lines or fewer)

View File

@ -1,47 +0,0 @@
```markdown
# CQRS+ES Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
| Aspect | Result | Notes |
|--------|--------|-------|
| Aggregate design | ✅ | - |
| Event design | ✅ | - |
| Command/Query separation | ✅ | - |
| Projections | ✅ | - |
| Eventual consistency | ✅ | - |
## Current Iteration Findings (new)
| # | finding_id | family_tag | Scope | Location | Issue | Fix Suggestion |
|---|------------|------------|-------|----------|-------|----------------|
| 1 | CQRS-NEW-src-file-L42 | cqrs-violation | In-scope | `src/file.ts:42` | Issue description | Fix approach |
Scope: "In-scope" (fixable in this change) / "Out-of-scope" (existing issue, non-blocking)
## Carry-over Findings (persists)
| # | finding_id | family_tag | Previous Evidence | Current Evidence | Issue | Fix Suggestion |
|---|------------|------------|-------------------|------------------|-------|----------------|
| 1 | CQRS-PERSIST-src-file-L77 | cqrs-violation | `src/file.ts:77` | `src/file.ts:77` | Still unresolved | Apply prior fix plan |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| CQRS-RESOLVED-src-file-L10 | `src/file.ts:10` now satisfies the rule |
## Reopened Findings (reopened)
| # | finding_id | family_tag | Prior Resolution Evidence | Recurrence Evidence | Issue | Fix Suggestion |
|---|------------|------------|--------------------------|---------------------|-------|----------------|
| 1 | CQRS-REOPENED-src-file-L55 | cqrs-violation | `Previously fixed at src/file.ts:10` | `Recurred at src/file.ts:55` | Issue description | Fix approach |
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new`, `persists`, or `reopened`
- Findings without `finding_id` are invalid
```
**Cognitive load reduction rules:**
- APPROVE → Summary only (5 lines or fewer)
- REJECT → Include only relevant finding rows (30 lines or fewer)

View File

@ -1,45 +0,0 @@
```markdown
# Frontend Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
| Aspect | Result | Notes |
|--------|--------|-------|
| Component design | ✅ | - |
| State management | ✅ | - |
| Performance | ✅ | - |
| Accessibility | ✅ | - |
| Type safety | ✅ | - |
## Current Iteration Findings (new)
| # | finding_id | family_tag | Location | Issue | Fix Suggestion |
|---|------------|------------|----------|-------|----------------|
| 1 | FE-NEW-src-file-L42 | component-design | `src/file.tsx:42` | Issue description | Fix approach |
## Carry-over Findings (persists)
| # | finding_id | family_tag | Previous Evidence | Current Evidence | Issue | Fix Suggestion |
|---|------------|------------|-------------------|------------------|-------|----------------|
| 1 | FE-PERSIST-src-file-L77 | component-design | `src/file.tsx:77` | `src/file.tsx:77` | Still unresolved | Apply prior fix plan |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| FE-RESOLVED-src-file-L10 | `src/file.tsx:10` now satisfies the rule |
## Reopened Findings (reopened)
| # | finding_id | family_tag | Prior Resolution Evidence | Recurrence Evidence | Issue | Fix Suggestion |
|---|------------|------------|--------------------------|---------------------|-------|----------------|
| 1 | FE-REOPENED-src-file-L55 | component-design | `Previously fixed at src/file.tsx:10` | `Recurred at src/file.tsx:55` | Issue description | Fix approach |
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new`, `persists`, or `reopened`
- Findings without `finding_id` are invalid
```
**Cognitive load reduction rules:**
- APPROVE → Summary only (5 lines or fewer)
- REJECT → Include only relevant finding rows (30 lines or fewer)

View File

@ -1,41 +0,0 @@
```markdown
# QA Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
| Aspect | Result | Notes |
|--------|--------|-------|
| Test coverage | ✅ | - |
| Test quality | ✅ | - |
| Error handling | ✅ | - |
| Documentation | ✅ | - |
| Maintainability | ✅ | - |
## Current Iteration Findings (new)
| # | finding_id | family_tag | Category | Location | Issue | Fix Suggestion |
|---|------------|------------|----------|----------|-------|----------------|
| 1 | QA-NEW-src-test-L42 | test-coverage | Testing | `src/test.ts:42` | Missing negative test | Add failure-path test |
## Carry-over Findings (persists)
| # | finding_id | family_tag | Previous Evidence | Current Evidence | Issue | Fix Suggestion |
|---|------------|------------|-------------------|------------------|-------|----------------|
| 1 | QA-PERSIST-src-test-L77 | test-coverage | `src/test.ts:77` | `src/test.ts:77` | Still flaky | Stabilize assertion & setup |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| QA-RESOLVED-src-test-L10 | `src/test.ts:10` now covers error path |
## Reopened Findings (reopened)
| # | finding_id | family_tag | Prior Resolution Evidence | Recurrence Evidence | Issue | Fix Suggestion |
|---|------------|------------|--------------------------|---------------------|-------|----------------|
| 1 | QA-REOPENED-src-test-L55 | test-coverage | `Previously fixed at src/test.ts:10` | `Recurred at src/test.ts:55` | Issue description | Fix approach |
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new`, `persists`, or `reopened`
- Findings without `finding_id` are invalid
```

View File

@ -1,49 +0,0 @@
```markdown
# Requirements Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Requirements Cross-Reference
| # | Requirement (from task) | Satisfied | Evidence (file:line) |
|---|----------------------|-----------|----------------------|
| 1 | {requirement 1} | ✅/❌ | `src/file.ts:42` |
- If even one ❌ exists, REJECT is mandatory
- A ✅ without evidence is invalid (must be verified in actual code)
## Scope Check
| # | Out-of-scope Change | File | Justification |
|---|---------------------|------|---------------|
| 1 | {change not in requirements} | `src/file.ts` | Justified/Unnecessary |
## Current Iteration Findings (new)
| # | finding_id | family_tag | Category | Location | Issue | Fix Suggestion |
|---|------------|------------|----------|----------|-------|----------------|
| 1 | REQ-NEW-src-file-L42 | req-gap | Unimplemented | `src/file.ts:42` | Issue description | Fix suggestion |
## Carry-over Findings (persists)
| # | finding_id | family_tag | Previous Evidence | Current Evidence | Issue | Fix Suggestion |
|---|------------|------------|-------------------|------------------|-------|----------------|
| 1 | REQ-PERSIST-src-file-L77 | req-gap | `file:line` | `file:line` | Unresolved | Fix suggestion |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| REQ-RESOLVED-src-file-L10 | `file:line` now satisfies the requirement |
## Reopened Findings (reopened)
| # | finding_id | family_tag | Prior Resolution Evidence | Recurrence Evidence | Issue | Fix Suggestion |
|---|------------|------------|--------------------------|---------------------|-------|----------------|
| 1 | REQ-REOPENED-src-file-L55 | req-gap | `Previously fixed at file:line` | `Recurred at file:line` | Issue description | Fix approach |
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new`, `persists`, or `reopened`
- Findings without `finding_id` are invalid
```
**Cognitive load reduction rules:**
- APPROVE: Summary only (5 lines or fewer)
- REJECT: Only relevant findings in tables (30 lines or fewer)

View File

@ -1,28 +0,0 @@
```markdown
# Research Report
## Research Overview
{Summarize the original request in 1-2 sentences}
## Key Findings
{Major insights discovered during research, as bullet points}
## Research Results
### {Topic 1}
{Data and analysis results}
### {Topic 2}
{Data and analysis results}
## Data Sources
| # | Source | Type | Reliability |
|---|--------|------|-------------|
| 1 | {Source name/URL} | {Web/Codebase/Literature} | {High/Medium/Low} |
## Conclusions and Recommendations
{Conclusions and recommendations based on research results}
## Remaining Gaps (if any)
- {Items that could not be researched or unverified hypotheses}
```

View File

@ -1,37 +0,0 @@
```markdown
# Review Target
## Overview
| Field | Details |
|-------|---------|
| Mode | PR / Branch / Current Diff |
| Source | PR #{number} / Branch `{name}` / Working tree |
| Title | {title or summary from commits} |
| Labels | {label list, or N/A} |
## Purpose & Requirements
{Purpose and requirements extracted from PR description, commit messages, or task text}
## Linked Issues
{State "N/A" if not applicable}
### Issue #{number}: {Issue title}
- Labels: {label list}
- Description: {Summary of Issue body}
- Key comments: {Summary of relevant comments}
## Commit History
{Include for Branch/Current Diff modes. State "N/A" for PR mode}
| Hash | Message |
|------|---------|
| `{short hash}` | {commit message} |
## Changed Files
| File | Type | Lines Changed |
|------|------|---------------|
| `{file path}` | Added/Modified/Deleted | +{added} -{removed} |
## Diff
{diff output}
```

View File

@ -1,47 +0,0 @@
```markdown
# Security Review
## Result: APPROVE / REJECT
## Severity: None / Low / Medium / High / Critical
## Check Results
| Category | Result | Notes |
|----------|--------|-------|
| Injection | ✅ | - |
| Authentication & Authorization | ✅ | - |
| Data Protection | ✅ | - |
| Dependencies | ✅ | - |
## Current Iteration Findings (new)
| # | finding_id | family_tag | Severity | Type | Location | Issue | Fix Suggestion |
|---|------------|------------|----------|------|----------|-------|----------------|
| 1 | SEC-NEW-src-db-L42 | injection-risk | High | SQLi | `src/db.ts:42` | Raw query string | Use parameterized queries |
## Carry-over Findings (persists)
| # | finding_id | family_tag | Previous Evidence | Current Evidence | Issue | Fix Suggestion |
|---|------------|------------|-------------------|------------------|-------|----------------|
| 1 | SEC-PERSIST-src-auth-L18 | injection-risk | `src/auth.ts:18` | `src/auth.ts:18` | Weak validation persists | Harden validation |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| SEC-RESOLVED-src-db-L10 | `src/db.ts:10` now uses bound parameters |
## Reopened Findings (reopened)
| # | finding_id | family_tag | Prior Resolution Evidence | Recurrence Evidence | Issue | Fix Suggestion |
|---|------------|------------|--------------------------|---------------------|-------|----------------|
| 1 | SEC-REOPENED-src-auth-L55 | injection-risk | `Previously fixed at src/auth.ts:20` | `Recurred at src/auth.ts:55` | Issue description | Fix approach |
## Warnings (non-blocking)
- {Security recommendations}
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new`, `persists`, or `reopened`
- Findings without `finding_id` are invalid
```
**Cognitive load reduction rules:**
- No issues → Checklist only (10 lines or fewer)
- Warnings only → + Warnings in 1-2 lines (15 lines or fewer)
- Vulnerabilities found → + finding tables (30 lines or fewer)

View File

@ -1,48 +0,0 @@
```markdown
# Final Validation Results
## Result: APPROVE / REJECT
## Requirements Fulfillment Check
Extract requirements from the task spec and verify each one individually against actual code.
| # | Requirement (extracted from task spec) | Met | Evidence (file:line) |
|---|---------------------------------------|-----|---------------------|
| 1 | {requirement 1} | ✅/❌ | `src/file.ts:42` |
| 2 | {requirement 2} | ✅/❌ | `src/file.ts:55` |
- If any ❌ exists, REJECT is mandatory
- ✅ without evidence is invalid (must verify against actual code)
- Do not rely on plan report's judgment; independently verify each requirement
## Validation Summary
| Item | Status | Verification Method |
|------|--------|-------------------|
| Tests | ✅ | `npm test` (N passed) |
| Build | ✅ | `npm run build` succeeded |
| Functional check | ✅ | Main flow verified |
## Current Iteration Findings (new)
| # | finding_id | Item | Evidence | Reason | Required Action |
|---|------------|------|----------|--------|-----------------|
| 1 | VAL-NEW-src-file-L42 | Requirement mismatch | `file:line` | Description | Fix required |
## Carry-over Findings (persists)
| # | finding_id | Previous Evidence | Current Evidence | Reason | Required Action |
|---|------------|-------------------|------------------|--------|-----------------|
| 1 | VAL-PERSIST-src-file-L77 | `file:line` | `file:line` | Still unresolved | Apply fix |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| VAL-RESOLVED-src-file-L10 | `file:line` now passes validation |
## Deliverables
- Created: {Created files}
- Modified: {Modified files}
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new` or `persists`
- Findings without `finding_id` are invalid
```

View File

@ -1,47 +0,0 @@
```markdown
# Terraform Convention Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
- [x] Variable declarations (type, description, sensitive)
- [x] Resource naming (name_prefix pattern)
- [x] File structure (one concern per file)
- [x] Security settings
- [x] Tag management
- [x] lifecycle rules
- [x] Cost trade-off documentation
## Current Iteration Findings (new)
| # | finding_id | family_tag | Scope | Location | Issue | Fix Suggestion |
|---|------------|------------|-------|----------|-------|----------------|
| 1 | TF-NEW-file-L42 | tf-convention | In-scope | `modules/example/main.tf:42` | Issue description | Fix approach |
Scope: "In-scope" (fixable in this change) / "Out-of-scope" (existing issue, non-blocking)
## Carry-over Findings (persists)
| # | finding_id | family_tag | Previous Evidence | Current Evidence | Issue | Fix Suggestion |
|---|------------|------------|-------------------|------------------|-------|----------------|
| 1 | TF-PERSIST-file-L77 | tf-convention | `file.tf:77` | `file.tf:77` | Still unresolved | Apply prior fix plan |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| TF-RESOLVED-file-L10 | `file.tf:10` now satisfies the convention |
## Reopened Findings (reopened)
| # | finding_id | family_tag | Prior Resolution Evidence | Recurrence Evidence | Issue | Fix Suggestion |
|---|------------|------------|--------------------------|---------------------|-------|----------------|
| 1 | TF-REOPENED-file-L55 | tf-convention | `Previously fixed at file.tf:10` | `Recurred at file.tf:55` | Issue description | Fix approach |
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new`, `persists`, or `reopened`
- Findings without `finding_id` are invalid
```
**Cognitive load reduction rules:**
- APPROVE → Summary only (5 lines or fewer)
- REJECT → Include only relevant finding rows (30 lines or fewer)

View File

@ -1,46 +0,0 @@
```markdown
# Testing Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
| Aspect | Result | Notes |
|--------|--------|-------|
| Test coverage | ✅ | - |
| Test structure (Given-When-Then) | ✅ | - |
| Test naming | ✅ | - |
| Test independence & reproducibility | ✅ | - |
| Mocks & fixtures | ✅ | - |
| Test strategy (unit/integration/E2E) | ✅ | - |
## Current Iteration Findings (new)
| # | finding_id | family_tag | Category | Location | Issue | Fix Suggestion |
|---|------------|------------|----------|----------|-------|----------------|
| 1 | TEST-NEW-src-test-L42 | test-structure | Coverage | `src/test.ts:42` | Issue description | Fix suggestion |
## Carry-over Findings (persists)
| # | finding_id | family_tag | Previous Evidence | Current Evidence | Issue | Fix Suggestion |
|---|------------|------------|-------------------|------------------|-------|----------------|
| 1 | TEST-PERSIST-src-test-L77 | test-structure | `src/test.ts:77` | `src/test.ts:77` | Unresolved | Fix suggestion |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| TEST-RESOLVED-src-test-L10 | `src/test.ts:10` now has sufficient coverage |
## Reopened Findings (reopened)
| # | finding_id | family_tag | Prior Resolution Evidence | Recurrence Evidence | Issue | Fix Suggestion |
|---|------------|------------|--------------------------|---------------------|-------|----------------|
| 1 | TEST-REOPENED-src-test-L55 | test-structure | `Previously fixed at src/test.ts:10` | `Recurred at src/test.ts:55` | Issue description | Fix approach |
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new`, `persists`, or `reopened`
- Findings without `finding_id` are invalid
```
**Cognitive load reduction rules:**
- APPROVE: Summary only (5 lines or fewer)
- REJECT: Only relevant findings in tables (30 lines or fewer)

View File

@ -1,36 +0,0 @@
```markdown
# Final Validation Results
## Result: APPROVE / REJECT
## Validation Summary
| Item | Status | Verification Method |
|------|--------|-------------------|
| Requirements met | ✅ | Checked against requirements list |
| Tests | ✅ | `npm test` (N passed) |
| Build | ✅ | `npm run build` succeeded |
| Functional check | ✅ | Main flow verified |
## Current Iteration Findings (new)
| # | finding_id | Item | Evidence | Reason | Required Action |
|---|------------|------|----------|--------|-----------------|
| 1 | VAL-NEW-src-file-L42 | Requirement mismatch | `file:line` | Description | Fix required |
## Carry-over Findings (persists)
| # | finding_id | Previous Evidence | Current Evidence | Reason | Required Action |
|---|------------|-------------------|------------------|--------|-----------------|
| 1 | VAL-PERSIST-src-file-L77 | `file:line` | `file:line` | Still unresolved | Apply fix |
## Resolved Findings (resolved)
| finding_id | Resolution Evidence |
|------------|---------------------|
| VAL-RESOLVED-src-file-L10 | `file:line` now passes validation |
## Deliverables
- Created: {Created files}
- Modified: {Modified files}
## Rejection Gate
- REJECT is valid only when at least one finding exists in `new` or `persists`
- Findings without `finding_id` are invalid
```

View File

@ -1,26 +0,0 @@
# Requirements Reviewer
You are a requirements fulfillment verifier. You verify that changes satisfy the original requirements and specifications, and flag any gaps or excess.
## Role Boundaries
**Do:**
- Cross-reference requirements against implementation (whether each requirement is realized in actual code)
- Detect implicit requirements (whether naturally expected behaviors are satisfied)
- Detect scope creep (whether changes unrelated to requirements have crept in)
- Identify unimplemented or partially implemented items
- Flag ambiguity in specifications
**Don't:**
- Review code quality (Architecture Reviewer's job)
- Review test coverage (Testing Reviewer's job)
- Review security concerns (Security Reviewer's job)
- Write code yourself
## Behavioral Principles
- Verify requirements one by one. Never say "broadly satisfied" in aggregate
- Verify in actual code. Do not take "implemented" claims at face value
- Guard the scope. Question any change not covered by the requirements
- Do not tolerate ambiguity. Flag unclear or underspecified requirements
- Pay attention to deletions. Confirm that file or code removals are justified by the requirements

View File

@ -1,45 +0,0 @@
# Research Analyzer
You are a research analyzer. You interpret the Digger's research results, identify unexplained phenomena and newly emerged questions, and create instructions for additional investigation.
## Role Boundaries
**Do:**
- Critically analyze research results
- Identify unexplained phenomena, contradictions, and logical leaps
- Articulate newly emerged questions
- Check for missing quantitative data (claims without numerical evidence)
- Determine whether additional investigation is needed
**Don't:**
- Execute research yourself (Digger's responsibility)
- Design overall research plans (Planner's responsibility)
- Make final quality evaluations (Supervisor's responsibility)
## Behavior
- Do not ask questions. Present analysis results and judgments directly
- Keep asking "why?" — do not settle for surface-level explanations
- Detect gaps in both quantitative and qualitative dimensions
- Write additional research instructions with enough specificity for Digger to act immediately
- If no further investigation is warranted, honestly judge "sufficient" — do not manufacture questions
## Domain Knowledge
### Gap Detection Perspectives
Look for holes in research from these perspectives:
- Unexplained phenomena: facts stated but "why" is unclear
- Unverified hypotheses: speculation treated as fact
- Missing quantitative data: claims without numerical backing
- Newly emerged concepts: terms or concepts that appeared during research needing deeper investigation
- Missing comparisons: data exists for only one side, making contrast impossible
### Additional Research Decision Criteria
When gaps are identified, evaluate on three points:
- Is this gap important to the original request? (Ignore if not)
- Is there a reasonable chance additional research can fill it? (Is public data likely available?)
- Is the research cost (movement consumption) worthwhile?

View File

@ -1,38 +0,0 @@
# Research Digger
You are a research executor. You follow the Planner's research plan and actually execute the research, organizing and reporting results.
## Role Boundaries
**Do:**
- Execute research according to Planner's plan
- Organize and report research results
- Report additional related information discovered during research
- Provide analysis and recommendations based on facts
**Don't:**
- Create research plans (Planner's responsibility)
- Evaluate research quality (Supervisor's responsibility)
- Ask "Should I look into X?" — just investigate it
## Behavior
- Do not ask questions. Research what can be investigated, report what cannot
- Take action. Not "should investigate X" but actually investigate
- Report concretely. Include URLs, numbers, quotes
- Provide analysis. Not just facts, but interpretation and recommendations
## Domain Knowledge
### Available Research Methods
- Web search: general information gathering
- GitHub search: codebase and project research
- Codebase search: files and code within project
- File reading: configuration files, documentation review
### Research Process
1. Execute planned research items in order
2. For each item: execute research, record results, investigate related information
3. Create report when all complete

View File

@ -1,52 +0,0 @@
# Research Planner
You are a research planner. You receive research requests and create specific research plans for the Digger (research executor) without asking questions.
## Role Boundaries
**Do:**
- Analyze and decompose research requests
- Identify research perspectives
- Create specific instructions for the Digger
- Prioritize research items
**Don't:**
- Execute research yourself (Digger's responsibility)
- Evaluate research quality (Supervisor's responsibility)
- Implement or modify code
## Behavior
- Do not ask questions. Make assumptions for unclear points and proceed
- Include all possibilities when multiple interpretations exist
- Do not ask "Is this okay?"
- Do not fear assumptions. State them explicitly and incorporate into the plan
- Prioritize comprehensiveness. Broadly capture possible perspectives
- Write specific instructions that enable Digger to act without hesitation. Abstract instructions are prohibited
## Domain Knowledge
### How to Create Research Plans
**Step 1: Decompose the Request**
Decompose from these perspectives:
- What: what do they want to know
- Why: why do they want to know (infer)
- Scope: how far should we investigate
**Step 2: Identify Research Perspectives**
List possible perspectives:
- Research for direct answers
- Related information and background
- Comparison and alternatives
- Risks and caveats
**Step 3: Prioritize**
| Priority | Definition |
|----------|------------|
| P1: Required | Cannot answer without this |
| P2: Important | Improves answer quality |
| P3: Nice to have | If time permits |

View File

@ -1,55 +0,0 @@
# Research Supervisor
You are a research quality evaluator. You evaluate the research results and determine if they adequately answer the user's request.
## Role Boundaries
**Do:**
- Evaluate research result quality
- Provide specific return instructions when gaps exist
- Judge adequacy of answers against the original request
**Don't:**
- Execute research yourself (Digger's responsibility)
- Create research plans (Planner's responsibility)
- Ask the user for additional information
## Behavior
- Evaluate strictly. But do not ask questions
- If gaps exist, point them out specifically and return to Planner
- Do not demand perfection. Approve if 80% answered
- Not "insufficient" but "XX is missing" — be specific
- When returning, clarify the next action
## Domain Knowledge
### Evaluation Perspectives
**1. Answer Relevance**
- Does it directly answer the user's question?
- Is the conclusion clearly stated?
- Is evidence provided?
**2. Research Comprehensiveness**
- Are all planned items researched?
- Are important perspectives not missing?
- Are related risks and caveats investigated?
**3. Information Reliability**
- Are sources specified?
- Is there concrete data (numbers, URLs, etc.)?
- Are inferences and facts distinguished?
### Judgment Criteria
**APPROVE conditions (all must be met):**
- Clear answer to user's request exists
- Conclusion has sufficient evidence
- No major research gaps
**REJECT conditions (any triggers rejection):**
- Important research perspectives missing
- Request interpretation was wrong
- Research results are shallow (not concrete)
- Sources unclear

View File

@ -1,30 +0,0 @@
# Terraform Coder
You are a Terraform/AWS infrastructure implementation specialist. You write safe, maintainable infrastructure code following IaC principles.
## Role Boundaries
**Do:**
- Create and modify Terraform code (.tf files)
- Design modules and define variables
- Implement security configurations (IAM, security groups, encryption)
- Make cost optimization decisions and document trade-offs
**Don't:**
- Implement application code (implementation agent's responsibility)
- Make final infrastructure design decisions (planning/design agent's responsibility)
- Apply changes to production (`terraform apply` is never executed)
## Behavioral Principles
- Safety over speed. Infrastructure misconfigurations have greater impact than application bugs
- Don't guess configurations; verify with official documentation
- Never write secrets (passwords, tokens) in code
- Document trade-offs with inline comments for cost-impacting choices
- Security is strict by default. Only relax explicitly with justification
**Be aware of AI's bad habits:**
- Writing nonexistent resource attributes or provider arguments → Prohibited (verify with official docs)
- Casually opening security groups to `0.0.0.0/0` → Prohibited
- Writing unused variables or outputs "just in case" → Prohibited
- Adding `depends_on` where implicit dependencies suffice → Prohibited

View File

@ -1,25 +0,0 @@
# Terraform Reviewer
You are an IaC (Infrastructure as Code) convention specialist reviewer. You verify that Terraform code complies with project conventions and security standards.
## Role Boundaries
**Do:**
- Verify Terraform convention compliance (naming, file organization, variable declarations)
- Validate security configurations (IAM least privilege, encryption, access control)
- Detect cost impacts and verify trade-off documentation
- Validate `lifecycle` rule appropriateness
**Don't:**
- Write code yourself (only provide findings and fix suggestions)
- Review AI-specific issues (separate review agent's responsibility)
- Review application code (design review agent's responsibility)
- Execute `terraform plan` (validation agent's responsibility)
## Behavioral Principles
- No compromises on security issues. Missing encryption or public access exposure is an immediate REJECT
- Enforce naming consistency. Even one off-convention name gets flagged
- Flag cost-impacting choices that lack trade-off documentation
- No "conditional approvals". If there are issues, reject
- Never miss unused variables/outputs/data sources

View File

@ -1,27 +0,0 @@
# Testing Reviewer
You are a test code quality specialist. You evaluate test structure, naming, coverage, independence, and verify the reliability of the test suite.
## Role Boundaries
**Do:**
- Evaluate test structure (Given-When-Then / Arrange-Act-Assert)
- Verify test naming conventions
- Assess test coverage (whether new behaviors and bug fixes have tests)
- Verify test independence and reproducibility
- Check appropriateness of mocks and fixtures
- Evaluate test strategy (unit/integration/E2E selection)
**Don't:**
- Review error handling or logging (QA Reviewer's job)
- Review security concerns (Security Reviewer's job)
- Review architecture decisions (Architecture Reviewer's job)
- Write code yourself
## Behavioral Principles
- Untested code is not trustworthy. New behaviors must have tests
- Structure matters. Demand improvements for tests that lack clear Given-When-Then
- Ensure independence. Flag tests that depend on execution order or external state
- Names convey intent. Verify that test names clearly describe the behavior under test
- Balance coverage. Suggest both removing unnecessary tests and adding missing cases

View File

@ -1,48 +0,0 @@
# Research Policy
Defines shared behavioral norms and data quality standards for research agents.
## Principles
| Principle | Standard |
|-----------|----------|
| Autonomous action | Do not ask questions. Make assumptions for unclear points |
| Fact-speculation separation | Always mark speculation as speculation |
| Quantitative priority | Back claims with numerical evidence |
| Source citation | Cite URL, statistics name, survey year |
| Honest reporting | Report un-researchable items as "Unable to research" |
| 80% standard | Do not demand perfection. 80% answer is sufficient |
## Autonomous Action
Act autonomously in all cases. Do not ask the user for confirmation.
| Situation | Response | Judgment |
|-----------|----------|----------|
| Unclear points exist | Make assumptions and proceed. State assumptions explicitly | OK |
| Multiple interpretations possible | Include all interpretations in research scope | OK |
| Asking "Is this okay?" | — | REJECT |
| Asking "Should I look into X?" | — | REJECT |
| Cannot decide whether to research | Research it. Over-research is better than under-research | OK |
## Data Quality
| Criterion | Judgment |
|-----------|----------|
| Numbers without source citation | REJECT |
| Speculation presented as fact | REJECT |
| Comparison indicators not aligned | REJECT |
| Claiming contrast with only one side's data | REJECT |
| Hiding un-researchable items | REJECT |
| Reporting un-researchable honestly | OK |
| Numbers with source (URL, statistics name, year) | OK |
| Speculation clearly marked as such | OK |
## Report Quality
| Criterion | Judgment |
|-----------|----------|
| Conclusion not clearly stated | REJECT |
| Conclusion without evidence | REJECT |
| Only listing facts without analysis | Warning |
| Conclusion + evidence + analysis present | OK |

View File

@ -1,88 +0,0 @@
# Terraform Policy
Prioritize safety and maintainability. Write infrastructure code following consistent conventions.
## Principles
| Principle | Criteria |
|-----------|----------|
| Security by Default | Security is strict by default. Relaxation requires explicit justification |
| Fail Fast | No defaults for required values. Missing values must error immediately |
| Naming Consistency | Unified resource naming via `name_prefix` pattern |
| Least Privilege | IAM scoped to minimum necessary actions and resources |
| Cost Awareness | Document trade-offs with inline comments |
| DRY | Compute common values in `locals`. Eliminate duplication |
| One File One Concern | Split files by resource category |
## Variable Declarations
| Criteria | Judgment |
|----------|----------|
| Missing `type` | REJECT |
| Missing `description` | REJECT |
| Sensitive value without `sensitive = true` | REJECT |
| Default on environment-dependent value | REJECT |
| Default on constant value (port numbers, etc.) | OK |
```hcl
# REJECT - no type/description
variable "region" {}
# REJECT - sensitive value without sensitive flag
variable "db_password" {
type = string
}
# OK - constant value with default
variable "container_port" {
type = number
description = "Container port for the application"
default = 8080
}
```
## Security
| Criteria | Judgment |
|----------|----------|
| EC2 without IMDSv2 (`http_tokens != "required"`) | REJECT |
| Unencrypted EBS/RDS | REJECT |
| S3 without public access block | REJECT |
| Security group with unnecessary `0.0.0.0/0` | REJECT |
| IAM policy with `*` resource (no valid reason) | REJECT |
| Direct SSH access (when SSM is viable) | REJECT |
| Hardcoded secrets | REJECT |
| Missing `lifecycle { prevent_destroy = true }` on critical data | Warning |
## Naming Convention
| Criteria | Judgment |
|----------|----------|
| `name_prefix` pattern not used | REJECT |
| Resource name missing environment identifier | REJECT |
| Tag names not in PascalCase | Warning |
| Name exceeds AWS character limits | REJECT |
## File Organization
| Criteria | Judgment |
|----------|----------|
| Resource definitions mixed in `main.tf` | REJECT |
| Resources defined in `variables.tf` | REJECT |
| Multiple resource categories in one file | Warning |
| Unused variable / output / data source | REJECT |
## Tag Management
| Criteria | Judgment |
|----------|----------|
| Provider `default_tags` not configured | REJECT |
| Tags duplicated between `default_tags` and individual resources | Warning |
| Missing `ManagedBy = "Terraform"` tag | Warning |
## Cost Management
| Criteria | Judgment |
|----------|----------|
| Cost-impacting choice without documentation | Warning |
| High-cost resource without alternative consideration | Warning |

View File

@ -8,7 +8,6 @@ Review the code for AI-specific issues:
- Plausible but incorrect patterns
- Compatibility with the existing codebase
- Scope creep detection
- Scope shrinkage detection (missing task requirements)
## Judgment Procedure

View File

@ -0,0 +1,13 @@
Address the reviewer's feedback.
Use reports in the Report Directory shown in the Piece Context and fix the issues raised by the reviewer.
Use files in the Report Directory as primary evidence. If additional context is needed, you may consult Previous Response and conversation history as secondary sources (Previous Response may be unavailable). If information conflicts, prioritize reports in the Report Directory and actual file contents.
**Required output (include headings)**
## Work results
- {Summary of actions taken}
## Changes made
- {Summary of changes}
## Test results
- {Command executed and results}
## Evidence
- {List key points from files checked/searches/diffs/logs}

View File

@ -6,9 +6,7 @@ Use reports in the Report Directory as the primary source of truth. If additiona
- Add unit tests for newly created classes and functions
- Update relevant tests when modifying existing code
- Test file placement: follow the project's conventions
- Build verification is mandatory. After completing implementation, run the build (type check) and verify there are no type errors
- Running tests is mandatory. After build succeeds, always run tests and verify results
- When introducing new contract strings (file names, config key names, etc.), define them as constants in one place
- Running tests is mandatory. After completing implementation, always run tests and verify results
**Scope output contract (create at the start of implementation):**
```markdown
@ -40,21 +38,10 @@ Small / Medium / Large
- **Rationale**: {Reason for the choice}
```
**Pre-completion self-check (required):**
Before running build and tests, verify the following:
- If new parameters/fields were added, grep to confirm they are actually passed from call sites
- For any `??`, `||`, `= defaultValue` usage, confirm fallback is truly necessary
- Verify no replaced code/exports remain after refactoring
- Verify no features outside the task specification were added
- Verify no if/else blocks call the same function with only argument differences
- Verify new code matches existing implementation patterns (API call style, type definition style, etc.)
**Required output (include headings)**
## Work results
- {Summary of actions taken}
## Changes made
- {Summary of changes}
## Build results
- {Build execution results}
## Test results
- {Test command executed and results}
- {Command executed and results}

View File

@ -0,0 +1,18 @@
Analyze the task and formulate an implementation plan including design decisions.
**Note:** If a Previous Response exists, this is a replan due to rejection.
Revise the plan taking that feedback into account.
**Criteria for small tasks:**
- Only 1-2 file changes
- No design decisions needed
- No technology selection needed
For small tasks, skip the design sections in the report.
**Actions:**
1. Understand the task requirements
2. Investigate code to resolve unknowns
3. Identify the impact area
4. Determine file structure and design patterns (if needed)
5. Decide on the implementation approach

View File

@ -3,20 +3,11 @@ Do not review AI-specific issues (already covered by the ai_review movement).
**Review criteria:**
- Structural and design validity
- Modularization (high cohesion, low coupling, no circular dependencies)
- Functionalization (single responsibility per function, operation discoverability, consistent abstraction level)
- Code quality
- Appropriateness of change scope
- Test coverage
- Dead code
- Call chain verification
- Scattered hardcoding of contract strings (file names, config key names)
**Design decisions reference:**
Review {report:coder-decisions.md} to understand the recorded design decisions.
- Do not flag intentionally documented decisions as FP
- However, also evaluate whether the design decisions themselves are sound, and flag any problems
**Previous finding tracking (required):**
- First, extract open findings from "Previous Response"
@ -27,6 +18,5 @@ Review {report:coder-decisions.md} to understand the recorded design decisions.
1. First, extract previous open findings and preliminarily classify as `new / persists / resolved`
2. Review the change diff and detect issues based on the architecture and design criteria above
- Cross-check changes against REJECT criteria tables defined in knowledge
3. For each detected issue, classify as blocking/non-blocking based on Policy's scope determination table and judgment rules
4. If there is even one blocking issue (`new` or `persists`), judge as REJECT

View File

@ -11,15 +11,8 @@ AI-specific issue review is not needed (already covered by the ai_review movemen
**Note**: If this project does not use the CQRS+ES pattern,
review from a general domain design perspective instead.
**Design decisions reference:**
Review {report:coder-decisions.md} to understand the recorded design decisions.
- Do not flag intentionally documented decisions as FP
- However, also evaluate whether the design decisions themselves are sound, and flag any problems
## Judgment Procedure
1. Review the change diff and detect issues based on the CQRS and Event Sourcing criteria above
- Cross-check changes against REJECT criteria tables defined in knowledge
2. For each detected issue, classify as blocking/non-blocking based on Policy's scope determination table and judgment rules
3. If there is even one blocking issue, judge as REJECT

View File

@ -11,15 +11,8 @@ Review the changes from a frontend development perspective.
**Note**: If this project does not include a frontend,
proceed as no issues found.
**Design decisions reference:**
Review {report:coder-decisions.md} to understand the recorded design decisions.
- Do not flag intentionally documented decisions as FP
- However, also evaluate whether the design decisions themselves are sound, and flag any problems
## Judgment Procedure
1. Review the change diff and detect issues based on the frontend development criteria above
- Cross-check changes against REJECT criteria tables defined in knowledge
2. For each detected issue, classify as blocking/non-blocking based on Policy's scope determination table and judgment rules
3. If there is even one blocking issue, judge as REJECT

View File

@ -7,12 +7,6 @@ Review the changes from a quality assurance perspective.
- Logging and monitoring
- Maintainability
**Design decisions reference:**
Review {report:coder-decisions.md} to understand the recorded design decisions.
- Do not flag intentionally documented decisions as FP
- However, also evaluate whether the design decisions themselves are sound, and flag any problems
**Previous finding tracking (required):**
- First, extract open findings from "Previous Response"
- Assign `finding_id` to each finding and classify current status as `new / persists / resolved`
@ -22,6 +16,5 @@ Review {report:coder-decisions.md} to understand the recorded design decisions.
1. First, extract previous open findings and preliminarily classify as `new / persists / resolved`
2. Review the change diff and detect issues based on the quality assurance criteria above
- Cross-check changes against REJECT criteria tables defined in knowledge
3. For each detected issue, classify as blocking/non-blocking based on Policy's scope determination table and judgment rules
4. If there is even one blocking issue (`new` or `persists`), judge as REJECT

View File

@ -4,15 +4,8 @@ Review the changes from a security perspective. Check for the following vulnerab
- Data exposure risks
- Cryptographic weaknesses
**Design decisions reference:**
Review {report:coder-decisions.md} to understand the recorded design decisions.
- Do not flag intentionally documented decisions as FP
- However, also evaluate whether the design decisions themselves are sound, and flag any problems
## Judgment Procedure
1. Review the change diff and detect issues based on the security criteria above
- Cross-check changes against REJECT criteria tables defined in knowledge
2. For each detected issue, classify as blocking/non-blocking based on Policy's scope determination table and judgment rules
3. If there is even one blocking issue, judge as REJECT

View File

@ -7,14 +7,8 @@ Review the changes from a test quality perspective.
- Completeness (unnecessary tests, missing cases)
- Appropriateness of mocks and fixtures
**Design decisions reference:**
Review {report:coder-decisions.md} to understand the recorded design decisions.
- Do not flag intentionally documented decisions as FP
- However, also evaluate whether the design decisions themselves are sound, and flag any problems
## Judgment Procedure
1. Cross-reference the test plan/test scope reports in the Report Directory with the implemented tests
1. Cross-reference the test plan report ({report:00-test-plan.md}) with the implemented tests
2. For each detected issue, classify as blocking/non-blocking based on Policy's scope determination table and judgment rules
3. If there is even one blocking issue, judge as REJECT

View File

@ -0,0 +1,55 @@
Run tests, verify the build, and perform final approval.
**Overall piece verification:**
1. Whether the plan and implementation results are consistent
2. Whether findings from each review movement have been addressed
3. Whether the original task objective has been achieved
**Report verification:** Read all reports in the Report Directory and
check for any unaddressed improvement suggestions.
**Validation output contract:**
```markdown
# Final Verification Results
## Result: APPROVE / REJECT
## Verification Summary
| Item | Status | Verification method |
|------|--------|-------------------|
| Requirements met | ✅ | Cross-checked with requirements list |
| Tests | ✅ | `npm test` (N passed) |
| Build | ✅ | `npm run build` succeeded |
| Functional check | ✅ | Main flows verified |
## Deliverables
- Created: {Created files}
- Modified: {Modified files}
## Outstanding items (if REJECT)
| # | Item | Reason |
|---|------|--------|
| 1 | {Item} | {Reason} |
```
**Summary output contract (only if APPROVE):**
```markdown
# Task Completion Summary
## Task
{Original request in 1-2 sentences}
## Result
Complete
## Changes
| Type | File | Summary |
|------|------|---------|
| Create | `src/file.ts` | Summary description |
## Verification commands
```bash
npm test
npm run build
```
```

View File

@ -148,61 +148,6 @@ if (!safePath.startsWith(path.resolve(baseDir))) {
- Resource exhaustion attack possibility → Warning
- Infinite loop possibility → REJECT
## Multi-Tenant Data Isolation
Prevent data access across tenant boundaries. Authorization (who can operate) and scoping (which tenant's data) are separate concerns.
| Criteria | Verdict |
|----------|---------|
| Reads are tenant-scoped but writes are not | REJECT |
| Write operations use client-provided tenant ID | REJECT |
| Endpoint using tenant resolver has no authorization control | REJECT |
| Some paths in role-based branching don't account for tenant resolution | REJECT |
### Read-Write Consistency
Apply tenant scoping to both reads and writes. Scoping only one side creates a state where data cannot be viewed but can be modified.
When adding a tenant filter to reads, always add tenant verification to corresponding writes.
### Write-Side Tenant Verification
For write operations, use the tenant ID resolved from the authenticated user, not from the request body.
```kotlin
// NG - Trusting client-provided tenant ID
fun create(request: CreateRequest) {
service.create(request.tenantId, request.data)
}
// OK - Resolve tenant from authentication
fun create(request: CreateRequest) {
val tenantId = tenantResolver.resolve()
service.create(tenantId, request.data)
}
```
### Authorization-Resolver Alignment
When a tenant resolver assumes a specific role (e.g., staff), the endpoint must have corresponding authorization controls. Without authorization, unexpected roles can access the endpoint and cause the resolver to fail.
```kotlin
// NG - Resolver assumes STAFF but no authorization control
fun getSettings(): SettingsResponse {
val tenantId = tenantResolver.resolve() // Fails for non-STAFF
return settingsService.getByTenant(tenantId)
}
// OK - Authorization ensures correct role
@Authorized(roles = ["STAFF"])
fun getSettings(): SettingsResponse {
val tenantId = tenantResolver.resolve()
return settingsService.getByTenant(tenantId)
}
```
For endpoints with role-based branching, verify that tenant resolution succeeds on all paths.
## OWASP Top 10 Checklist
| Category | Check Items |

View File

@ -0,0 +1,25 @@
```markdown
# AI-Generated Code Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in one sentence}
## Verified Items
| Aspect | Result | Notes |
|--------|--------|-------|
| Validity of assumptions | ✅ | - |
| API/library existence | ✅ | - |
| Context fit | ✅ | - |
| Scope | ✅ | - |
## Issues (if REJECT)
| # | Category | Location | Issue |
|---|----------|----------|-------|
| 1 | Hallucinated API | `src/file.ts:23` | Non-existent method |
```
**Cognitive load reduction rules:**
- No issues → Summary sentence + checklist only (10 lines or fewer)
- Issues found → + Issues in table format (25 lines or fewer)

View File

@ -0,0 +1,35 @@
```markdown
# Architecture Review
## Result: APPROVE / IMPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
- [x] Structure & design
- [x] Code quality
- [x] Change scope
- [x] Test coverage
- [x] Dead code
- [x] Call chain verification
## Previous Open Findings
| finding_id | Previous Status | Current Status (new/persists/resolved) | Evidence |
|------------|-----------------|-----------------------------------------|----------|
| ARCH-EXAMPLE-src-file-L42 | open | persists | `src/file.ts:42` |
## Issues (if REJECT)
| # | finding_id | Status (new/persists) | Scope | Location | Issue | Fix Suggestion |
|---|------------|-----------------------|-------|----------|-------|----------------|
| 1 | ARCH-EXAMPLE-src-file-L42 | new | In-scope | `src/file.ts:42` | Issue description | Fix approach |
Scope: "In-scope" (fixable in this change) / "Out-of-scope" (existing issue, non-blocking)
## Existing Issues (reference, non-blocking)
- {Record of existing issues unrelated to the current change}
```
**Cognitive load reduction rules:**
- APPROVE → Summary only (5 lines or fewer)
- REJECT → Issues in table format (30 lines or fewer)

View File

@ -0,0 +1,27 @@
```markdown
# CQRS+ES Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
| Aspect | Result | Notes |
|--------|--------|-------|
| Aggregate design | ✅ | - |
| Event design | ✅ | - |
| Command/Query separation | ✅ | - |
| Projections | ✅ | - |
| Eventual consistency | ✅ | - |
## Issues (if REJECT)
| # | Scope | Location | Issue | Fix Suggestion |
|---|-------|----------|-------|----------------|
| 1 | In-scope | `src/file.ts:42` | Issue description | Fix approach |
Scope: "In-scope" (fixable in this change) / "Out-of-scope" (existing issue, non-blocking)
## Existing Issues (reference, non-blocking)
- {Record of existing issues unrelated to the current change}
```

View File

@ -0,0 +1,22 @@
```markdown
# Frontend Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
| Aspect | Result | Notes |
|--------|--------|-------|
| Component design | ✅ | - |
| State management | ✅ | - |
| Performance | ✅ | - |
| Accessibility | ✅ | - |
| Type safety | ✅ | - |
## Issues (if REJECT)
| # | Location | Issue | Fix Suggestion |
|---|----------|-------|----------------|
| 1 | `src/file.tsx:42` | Issue description | Fix approach |
```

View File

@ -9,15 +9,18 @@
### Objective
{What needs to be achieved}
### Reference Material Findings (when reference material exists)
{Overview of reference implementation's approach and key differences from current implementation}
### Scope
{Impact area}
### Approaches Considered (when design decisions exist)
| Approach | Adopted? | Rationale |
|----------|----------|-----------|
### Design Decisions (only when design is needed)
#### File Structure
| File | Role |
|------|------|
| `src/example.ts` | Overview |
#### Design Patterns
- {Adopted patterns and where they apply}
### Implementation Approach
{How to proceed}
@ -25,10 +28,6 @@
## Implementation Guidelines (only when design is needed)
- {Guidelines the Coder should follow during implementation}
## Out of Scope (only when items exist)
| Item | Reason for exclusion |
|------|---------------------|
## Open Questions (if any)
- {Unclear points or items that need confirmation}
```

View File

@ -0,0 +1,27 @@
```markdown
# QA Review
## Result: APPROVE / REJECT
## Summary
{Summarize the result in 1-2 sentences}
## Reviewed Aspects
| Aspect | Result | Notes |
|--------|--------|-------|
| Test coverage | ✅ | - |
| Test quality | ✅ | - |
| Error handling | ✅ | - |
| Documentation | ✅ | - |
| Maintainability | ✅ | - |
## Previous Open Findings
| finding_id | Previous Status | Current Status (new/persists/resolved) | Evidence |
|------------|-----------------|-----------------------------------------|----------|
| QA-EXAMPLE-src-file-L42 | open | persists | `src/file.ts:42` |
## Issues (if REJECT)
| # | finding_id | Status (new/persists) | Category | Issue | Fix Suggestion |
|---|------------|-----------------------|----------|-------|----------------|
| 1 | QA-EXAMPLE-src-file-L42 | new | Testing | Issue description | Fix approach |
```

View File

@ -0,0 +1,23 @@
```markdown
# Review Summary
## Overall Verdict: APPROVE / REJECT
## Summary
{Integrate all review results in 2-3 sentences}
## Review Results
| Review | Result | Key Findings |
|--------|--------|-------------|
| Architecture | APPROVE/REJECT | {Overview} |
| Security | APPROVE/REJECT | {Overview} |
| AI Anti-pattern | APPROVE/REJECT | {Overview} |
## Critical Issues
| # | Severity | Source | Location | Issue |
|---|----------|--------|----------|-------|
| 1 | High | Security | `file:line` | Description |
## Improvement Suggestions
- {Consolidated suggestions from all reviews}
```

View File

@ -0,0 +1,28 @@
```markdown
# Security Review
## Result: APPROVE / REJECT
## Severity: None / Low / Medium / High / Critical
## Check Results
| Category | Result | Notes |
|----------|--------|-------|
| Injection | ✅ | - |
| Authentication & Authorization | ✅ | - |
| Data Protection | ✅ | - |
| Dependencies | ✅ | - |
## Vulnerabilities (if REJECT)
| # | Severity | Type | Location | Fix Suggestion |
|---|----------|------|----------|----------------|
| 1 | High | SQLi | `src/db.ts:42` | Use parameterized queries |
## Warnings (non-blocking)
- {Security recommendations}
```
**Cognitive load reduction rules:**
- No issues → Checklist only (10 lines or fewer)
- Warnings present → + Warnings in 1-2 lines (15 lines or fewer)
- Vulnerabilities found → + Table format (30 lines or fewer)

View File

@ -0,0 +1,22 @@
```markdown
# Final Validation Results
## Result: APPROVE / REJECT
## Validation Summary
| Item | Status | Verification Method |
|------|--------|-------------------|
| Requirements met | ✅ | Checked against requirements list |
| Tests | ✅ | `npm test` (N passed) |
| Build | ✅ | `npm run build` succeeded |
| Functional check | ✅ | Main flow verified |
## Deliverables
- Created: {Created files}
- Modified: {Modified files}
## Incomplete Items (if REJECT)
| # | Item | Reason |
|---|------|--------|
| 1 | {Item} | {Reason} |
```

Some files were not shown because too many files have changed in this diff Show More