evaluate
エージェントの実行ステップを構造化されたフィードバックで確認できます。ユーザーが「評価してほしい」「ステップを確認したい」といった指示をした場合や、結果に満足していない場合に使用します。
description の原文を見る
Review agent execution steps with structured feedback. Use when user says evaluate, review steps, or is not satisfied with the result.
SKILL.md 本文
評価スキル
エージェントの実行ステップのインタラクティブなステップバイステップレビュー。エージェント実行ループの各ステップでエージェントが何をしたかをユーザーが確認でき、ターゲット化されたフィードバックを記入できるHTMLページを作成します。
使用時期
- ユーザーが
/evaluateを呼び出したとき - ユーザーが結果に満足しておらず、正確なフィードバックを提供したいとき
- 複雑なタスク後に、実行パスをレビューしたいとき
すべてのタスク後に使用しないでください。評価が必要な場合のみ使用してください。
フロー
- 現在のセッションでの自分の行動を反省する
- 各ステップ(MATCH、THINK、ACT、VERIFY、LEARN)について、何をしたかを記述する
- 埋め込まれたデータを含むHTMLを生成する
- ブラウザで開く
- ユーザーが各ステップの横にコメントを記入し、「Copy Feedback」をクリック
- ユーザーがフィードバックをチャットに貼り付け
- エージェントはステップごとのフィードバックを解析し、修正を適用(スキル更新、再実行など)
ステップ1:反省
現在のセッションを分析し、各ステップを正直に記述してください:
- MATCH: どのスキルが選択されましたか?理由は何ですか?またはなぜマッチしなかったのですか?
- THINK: 予想される結果は何でしたか?どの検証基準が定義されましたか?
- ACT: どのツールが呼び出されましたか?何の順序で?何が並列で何が順序立てて実行されましたか?
- VERIFY: 何がチェックされましたか?成功または失敗しましたか?スキル監査の問題はありますか?
- LEARN: 何か更新されましたか?そうでない場合、なぜですか?
具体的に記述してください。ファイルパス、ツール名、実際の値を含めてください。ユーザーは正確に何が起こったかを見る必要があります。
ステップ2:HTMLを生成
自己完結型のHTMLファイルを /tmp/evaluate-{timestamp}.html に書き込み、データをインライン埋め込みします。以下のテンプレートを使用してください。
__TASK_DESCRIPTION__ および各 __STEP_*__ プレースホルダーを、反省から得た実際のコンテンツに置き換えてください。HTMLセーフなテキストを使用してください(<、>、& をエスケープ)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Evaluate - Step Review</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Helvetica Neue', sans-serif;
background: #1a1a2e;
color: #e0e0e0;
line-height: 1.6;
min-height: 100vh;
}
.header {
padding: 1.5rem 2rem;
border-bottom: 1px solid #2a2a4a;
display: flex;
align-items: center;
justify-content: space-between;
}
.header h1 {
font-size: 1.4rem;
font-weight: 600;
color: #fff;
}
.header .task-label {
font-size: 0.85rem;
color: #888;
margin-top: 0.25rem;
}
.copy-btn {
background: #6c5ce7;
color: #fff;
border: none;
padding: 0.6rem 1.5rem;
border-radius: 6px;
font-size: 0.9rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
}
.copy-btn:hover { background: #5a4bd1; }
.copy-btn.copied { background: #27ae60; }
.container {
padding: 1.5rem 2rem;
max-width: 1400px;
margin: 0 auto;
}
.step {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
margin-bottom: 1rem;
}
.step-card {
background: #16213e;
border: 1px solid #2a2a4a;
border-radius: 8px;
padding: 1.25rem;
}
.step-label {
display: inline-block;
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
padding: 0.2rem 0.6rem;
border-radius: 4px;
margin-bottom: 0.75rem;
}
.step-match .step-label { background: #2d3a8c; color: #8b9cf7; }
.step-think .step-label { background: #1a5c3a; color: #6bcf8e; }
.step-act .step-label { background: #8c5a2d; color: #f7c98b; }
.step-verify .step-label { background: #5c1a5c; color: #cf6bcf; }
.step-learn .step-label { background: #1a4a5c; color: #6bb8cf; }
.step-content {
font-size: 0.9rem;
color: #c0c0c0;
white-space: pre-wrap;
}
.feedback-card {
background: #1e1e3a;
border: 1px solid #3a3a5a;
border-radius: 8px;
padding: 1.25rem;
display: flex;
flex-direction: column;
}
.feedback-card label {
font-size: 0.75rem;
color: #888;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-bottom: 0.5rem;
}
.feedback-card textarea {
flex: 1;
min-height: 80px;
background: #12122a;
border: 1px solid #2a2a4a;
border-radius: 6px;
color: #e0e0e0;
font-family: inherit;
font-size: 0.9rem;
padding: 0.75rem;
resize: vertical;
line-height: 1.5;
}
.feedback-card textarea:focus {
outline: none;
border-color: #6c5ce7;
}
.feedback-card textarea::placeholder {
color: #555;
}
@media (max-width: 900px) {
.step { grid-template-columns: 1fr; }
.container { padding: 1rem; }
}
</style>
</head>
<body>
<div class="header">
<div>
<h1>Evaluate - Step Review</h1>
<div class="task-label">__TASK_DESCRIPTION__</div>
</div>
<button class="copy-btn" onclick="copyFeedback()">Copy Feedback</button>
</div>
<div class="container">
<div class="step step-match">
<div class="step-card">
<div class="step-label">1. Match</div>
<div class="step-content">__STEP_MATCH__</div>
</div>
<div class="feedback-card">
<label>Your feedback on MATCH</label>
<textarea id="fb-match" placeholder="Was the right skill chosen? Should a different one be used?"></textarea>
</div>
</div>
<div class="step step-think">
<div class="step-card">
<div class="step-label">2. Think</div>
<div class="step-content">__STEP_THINK__</div>
</div>
<div class="feedback-card">
<label>Your feedback on THINK</label>
<textarea id="fb-think" placeholder="Was the expected result correct? Were verification criteria good?"></textarea>
</div>
</div>
<div class="step step-act">
<div class="step-card">
<div class="step-label">3. Act</div>
<div class="step-content">__STEP_ACT__</div>
</div>
<div class="feedback-card">
<label>Your feedback on ACT</label>
<textarea id="fb-act" placeholder="Were the right tools used? Correct order? Missing steps?"></textarea>
</div>
</div>
<div class="step step-verify">
<div class="step-card">
<div class="step-label">4. Verify</div>
<div class="step-content">__STEP_VERIFY__</div>
</div>
<div class="feedback-card">
<label>Your feedback on VERIFY</label>
<textarea id="fb-verify" placeholder="Was verification thorough? Missed checks?"></textarea>
</div>
</div>
<div class="step step-learn">
<div class="step-card">
<div class="step-label">5. Learn</div>
<div class="step-content">__STEP_LEARN__</div>
</div>
<div class="feedback-card">
<label>Your feedback on LEARN</label>
<textarea id="fb-learn" placeholder="Should something be updated? Skill, CLAUDE.md, memory?"></textarea>
</div>
</div>
</div>
<script>
function copyFeedback() {
const steps = ['match', 'think', 'act', 'verify', 'learn'];
const labels = { match: 'MATCH', think: 'THINK', act: 'ACT', verify: 'VERIFY', learn: 'LEARN' };
let output = '## Evaluation Feedback\n';
let hasAny = false;
for (const step of steps) {
const agentEl = document.querySelector(`.step-${step} .step-content`);
const fbEl = document.getElementById(`fb-${step}`);
const feedback = fbEl.value.trim();
if (feedback) {
hasAny = true;
output += `\n### ${labels[step]}\n`;
output += `**Agent:** ${agentEl.textContent.trim()}\n`;
output += `**Feedback:** ${feedback}\n`;
}
}
if (!hasAny) {
output += '\nNo feedback provided - all steps OK.\n';
}
navigator.clipboard.writeText(output).then(() => {
const btn = document.querySelector('.copy-btn');
btn.textContent = 'Copied!';
btn.classList.add('copied');
setTimeout(() => {
btn.textContent = 'Copy Feedback';
btn.classList.remove('copied');
}, 2000);
});
}
</script>
</body>
</html>
ステップ3:ブラウザで開く
open /tmp/evaluate-{timestamp}.html
ユーザーに伝えてください:「評価ページをブラウザで開きました。気に入らなかったステップにコメントを記入し、Copy Feedbackをクリックして、ここに貼り付けてください。」
ステップ4:フィードバックを解析して修正
ユーザーがフィードバックを貼り付け直したとき(形式:## Evaluation Feedback と ### STEP_NAME セクション)、各ステップを解析します:
- 各
**Feedback:**行を読む - 修正が必要なもの:
- MATCH フィードバック -> スキルの frontmatter description または CLAUDE.md のスキルマッチングルールを更新
- THINK フィードバック -> スキルの説明(予想される結果、検証基準)を更新
- ACT フィードバック -> スキルのステップ、ツール使用法、操作順序を更新
- VERIFY フィードバック -> スキルで検証チェックを追加・更新
- LEARN フィードバック -> スキルの既知の問題を更新、防止ルールを追加
- 適切なファイルに修正を適用する
- Git コミット:
evaluate: {skill} - {何が変更されたか} - タスクを再実行する必要がある場合、エージェント実行ループを通して再実行
既知の問題
- ブラウザのクリップボードAPIにはHTTPSまたはlocalhostが必要です。クリップボード機能が失敗した場合、ユーザーは出力領域からテキストを手動で選択できます。
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- VCasecnikovs
- リポジトリ
- VCasecnikovs/klava
- ライセンス
- Apache-2.0
- 最終更新
- 2026/4/25
Source: https://github.com/VCasecnikovs/klava / ライセンス: Apache-2.0