成果ルール
セッションの仕事のうち何を成果として数えるか、判定で何が送られ、いくらかかるか
成果ルールは、セッションの仕事のうち何を成果として数えるかをワークスペースが決める設定です。プラットフォームはセッションが実際にしたこと(根拠)を記録し、ルールに合う根拠を成果として残します。成果はセッション詳細の成果物タブと、サイドバーの「成果」画面に表示されます。成果物タブにはセッションが残したすべて(成果、根拠になる PR とレビュー、out/ のファイル、GitHub 作業)が並び、成果はそのうちルールで判定したものです。
根拠と成果
根拠はプラットフォームが自分で見た事実で、成果はルールに合った根拠です。根拠の種類はコードで固定されていて、人は追加できません。
| 根拠の種類 | 内容 | 成果になると |
|---|---|---|
PR (github_pull_request) | セッションが開いた PR。オープン・マージなど状態が変わると根拠も変わる | すぐ集計 |
レビュー (github_review) | セッションが提出した PR レビュー | すぐ集計 |
out/ ファイル (out_file) | セッションが最後の checkpoint の out/ に残したファイル | 人が確認してから集計 |
会話 (conversation) | セッションの会話 | 人が確認してから集計 |
out/ ファイルと会話はエージェントが書いた文章なので、人が確認するまで集計に入りません。成果を直接作る API はありません。人は確認か却下だけを行います。
区分、成果 type、ルール
コンソールの設定 > ワークスペース > 成果ルールで決めます。変更できるのはワークスペースの owner と admin だけで、ほかのメンバーは読むだけです。
- 区分はルールをまとめる大分類です。名前は 1〜32 文字で、変えると過去の成果も新しい名前の下に表示されます。使用中のルールが残っている区分はアーカイブできません。
- 成果 type は成果の種類です。組み込み type が三つ(
pull_request、code_review、document)あり、人がさらに作れます。人が作った type は名前、key、根拠の種類一つからなり、その成果はタイトル・リンク・根拠の種類・根拠 id だけを持ちます。key と根拠の種類は作成後に変えられません。ワークスペースごとにアーカイブしていない type は 50 個までです。 - ルールは区分の下の一行で、タイトル一つ、成果 type 一つ、成果の定義一つを持ちます。成果 type 一つは使用中のルール一つにだけ使います。別の定義が必要なら type を新しく作ります。使用中のルールはワークスペースごとに 30 個までです。
ルールを編集すると新しいバージョンができます。すでに数えた成果はそのときのバージョンを指したまま残ります。「マージされた PR だけ」のような根拠の状態による条件は、成果の定義の文に書きます。
すぐ認めるとLuna 判定
ルールごとに判定方法を選びます。
| 判定方法 | 動作 | 費用 |
|---|---|---|
すぐ認める (always) | その種類の根拠が初めてできたとき、条件なしで数える | なし |
Luna 判定 (luna) | Luna(OpenAI Decisions API、gpt-6-luna)に成果の定義と根拠を送り、「はい」の確率を受け取る。確率がしきい値(既定 0.9)以上なら数える | 判定ごと |
Luna は文章を作らず、yes・no とその確率だけを答えます。確率は成果に「定義に合う確率」として残ります。根拠が変わると(PR がマージされると)、そのセッションの Luna の組をすべてもう一度問います。問う内容全体(ルールバージョン、根拠、しきい値)が直前の判定と同じなら送りません。確認または却下した成果は、もう一度判定しても変わりません。
Luna 判定には、運用者が追加した openai_decisions 接続が必要です。接続を保存する機能はまだ入っていないため、今は Luna ルールは判定されず「判定器なし」のまま残ります。すぐ認めるルールは接続なしで動きます。
判定のタイミングと上限
設定 > ワークスペース > 成果ルールの判定設定カードで決めます。根拠のないセッションは判定しません。判定は最後のきっかけから 2 分たってから動き、判定器は 30 秒ごとに仕事を拾います。そのため成果はふつうきっかけから 2〜3 分後に表示されます。
| 設定 | 既定値 | 意味 |
|---|---|---|
| 根拠ができたとき・変わったとき | オン | PR のオープン・マージ、レビュー提出、out/ ファイル |
| N ターンごと | オフ | オンにすると 5〜100 ターンごと。会話の根拠 type のルールがあるときだけ意味がある |
| セッションが止まったとき | オフ | 待機・一時停止・終了のときに一回 |
| 会話を送る | 直近 20 ターン | 会話ルールに送る会話。送らない、または直近 20 ターン(最大 16,000 トークン、ツール結果を除く) |
| 1 日の予算 | $1 | ワークスペースの 1 日の Luna 判定費用の上限。超えるとその日の Luna 判定は翌日(UTC 0 時)に回す。すぐ認めるルールはそのときも数える |
| セッションごとの上限 | 20 回 | セッション一つで Luna を呼んだ判定の回数の上限。すぐ認めるルールは数えない |
判定が失敗すると(エラー、10 秒のタイムアウト、応答形式のエラー)、1 分、5 分、30 分後に三回までやり直します。それでも失敗すると、セッション詳細に理由が表示されます。owner と admin はセッション詳細からもう一度判定できます。ルールを編集しても、過去のセッションを自動でもう一度判定することはありません。
OpenAI に送られるデータ
OpenAI にデータを送るのは Luna 判定のルールだけです。ルール一つと根拠一つを組にし、組ごとに質問を一つ送ります。ルールは自分の type の根拠の種類とだけ組になります。
| 根拠の種類 | 送るもの |
|---|---|
| PR | 成果の定義、リポジトリ、番号、状態、マージ時刻、変更行数、PR タイトル(200 文字) |
| レビュー | 成果の定義、リポジトリ、番号、レビューの event |
out/ ファイル | 成果の定義、パス、サイズ、ファイルの先頭 2,000 文字 |
| 会話 | 成果の定義、直近 20 ターンの抜粋(最大 16,000 トークン、ツール結果を除く)。会話を送るが「送らない」なら送らない |
- PR 本文とレビュー本文は送りません。レビュー本文は保存もしません。
- PR タイトル、ファイルの内容、会話は誰でも書ける文章なので、「信頼しない入力」と示して送ります。判定器がだまされても変わるのはその組一つの はい・いいえだけで、成果のタイトルやリンクなどの欄はプラットフォームが根拠から埋めます。
- リクエストは egress proxy を通り、接続のキーは proxy だけが付けます。
費用
Luna の価格は入力 100 万トークンあたり $0.10 で、出力は無料です。
| 根拠 | 組一つの入力 | 組一つ |
|---|---|---|
| PR・レビューの要約 | 約 600 トークン | 約 $0.00006 |
| ファイルの先頭 2,000 文字 | 約 1,200 トークン | 約 $0.00012 |
| 直近の会話の抜粋 | 約 16,500 トークン | 約 $0.00165 |
判定一回(PR・レビューの根拠、組四つ)は約 $0.00025 です。既定の 1 日の予算 $1 で、このような判定を約 4,000 回行えます。
判定費用はセッション費用とは別に数えます。成果画面の「成果あたり費用」は、期間内のすべてのセッション費用を集計される成果の数で割った値です。成果のないセッションの費用も含み、判定費用は含みません。
権限
| 操作 | 誰が |
|---|---|
| 区分・成果 type・ルール・判定設定を読む | ワークスペースのメンバー |
| 区分・成果 type・ルール・判定設定を変える、セッションをもう一度判定する | owner、admin |
| 成果を確認・却下する | owner、admin、そのエージェントの管理者 |
| 判定費用と過去 30 日の数を見る(設定画面) | ワークスペース全体の使用量を読める人(owner) |
ルールと判定設定の変更、成果の確認・却下、セッションの再判定は API key では呼べず、人の Web ログインの cookie でだけ呼べます。確認・却下と再判定には、そのセッションを読む権限も必要です。変更のたびに receipt が残り、成果の定義の本文は receipt に載せません。
API で成果を読む
セッション一つの成果は sessions:read の key で読みます。
curl -sS "$API/v1/sessions/$SESSION_ID/achievements" -H "Authorization: Bearer $KEY" \
| jq -c '.items[] | {title, judge, review_state}'{"title":"JeongJaeSoon/werft-sandbox#33","judge":"always","review_state":"auto"}期間内の成果の数と成果あたり費用は GET /v1/usage/achievements で読みます。範囲の規則は GET /v1/usage/summary と同じです。
curl -sS "$API/v1/usage/achievements?scope=me&since=$SINCE" -H "Authorization: Bearer $KEY" \
| jq -c '{achievement_count, needs_review_count, cost_usd, cost_per_achievement_usd, judge_cost_usd}'{"achievement_count":1,"needs_review_count":0,"cost_usd":"0.000105","cost_per_achievement_usd":"0.000105","judge_cost_usd":"0.000000"}リファレンス: GET /v1/sessions/{id}/achievements、GET /v1/usage/achievements、GET /v1/achievement-rules