Imported from EkeMinusYou/isucon-template (
AGENTS.md). Install upstream withnpx skills add EkeMinusYou/isucon-template. Copyright stays with the author.
AGENTS.md
目的と改善判断の原則
公式ルールと正当性要件を満たし、最終スコア(目標100万点)を最大化する。
Evidenceに基づいて判断する
- 時間・処理量・待ち・capacityを同じ単位・母数で比較し、同一RUN・時間窓のEvidenceで判断する。割合だけで律速を決めない
- 時間窓は、分析DBが入口のリクエスト数の推移から決めた負荷区間(
load_windows)を既定とする - 得点の伸び方は、参加者向けベンチ出力が負荷中に定期的に出す進捗(負荷の増減とその理由など)の推移で把握する。そこから得点を制約している要因(負荷増加の条件、エラー・タイムアウト、資源・待ち、得点ロジック)を特定し、改善の優先度を決める。進捗行の解釈ビューは
tools/contest/analysis-schema/に置く - 欠損成果物を0扱いせず、
run.jsonのartifact statusとmissingを確認する。失敗RUNもfinalizeし、成果物全体はtask artifacts-runで確認する - 数値集計・時系列結合・RUN横断解析は既存DuckDB(
task q -- "SQL")を優先し、tools/analysis/sources.yaml・tools/analysis/schema/・既存ビューを使う。未対応処理や単純確認は別手段可。DuckDB利用のために計測基盤を変更しない
現行構成からの追加改善を考える
- 得点機会の数・価値・損失と、現行実装に残る仕事・待ち・転送・資源消費と発生条件をEvidenceで確認し、追加・補完・置換による増減、正当性、得点寄与を現行と比較する。効果量が未確定でも、根拠・仮説・評価条件があれば次へ進める
ISUCONでの変更方針
- 一般的な本番サービスの無停止移行、旧実装との互換運用、既存データの保持を暗黙の必須条件にしない
- 競技時間には制限があるため、テストと確認は正当性・安全性・変更判断に必要な範囲へ最小限に絞り、網羅的な検証や将来の問題に備えた確認へ時間を広げない
- 作業記録は、ユーザーから明示的に指示された場合にファイルへ保存する。通常は会話で報告する
- 会話はユーザーの指定により、このリポジトリの全セッションをCodex・Claude Codeのフックで
docs/conversation/へ自動保存・ローカルcommitする。スキル指定を条件にせず、エージェントが同じ会話を手動で重複保存しない - 修正と必要な確認が完了したら、変更単位でcommitすることを既定動作とする
POST /initializeは負荷走行・得点計測の対象外なので、初期化時間の短縮より負荷時の性能と得点を優先する。公式の完了時間制限、初期状態の再現性、正当性を守り、正常完了の範囲で初期化時の処理量増加を許容する- 受理済みデータは通常のサービス・OS再起動後も取得可能にする。電源断・強制リセットへの耐性は要件とせず、そのための実装・検証は追加しない
isucon-agentへの改善依頼には、仮説の選定・実装・正規deploy・ベンチ実行・結果分析と次の改善を含む。必要なデプロイやサービス操作の許可を都度求めず、自律的に進める。相談・調査のみ等の明示的な範囲指定は優先する- 依頼された改善に必要な破壊的変更は許可済みとする。競技DB・テーブルの破棄と再作成、スキーマや配置の変更、不要なコード・設定・ファイルの削除を許容し、破壊的であることだけを理由に再確認しない。
- 将来のロールバックだけを目的とする実装・検証は追加しない。必要になった時点でコードと変更履歴から対応する。不要になったコードとファイルは削除する
- まず既存のTaskfile・設定・公式初期化処理で目的を満たす。競技DBを再作成して負荷時の書込みを追試で取得できるようにする。DB配置変更は接続先設定と
task db-recreateによる再作成を使う。独自スクリプトや運用手順は理解・保守の負担になるため、依頼の範囲内の最小変更を優先する
禁止事項と作業上の制約
調査・ベンチ実行
- 当該競技やベンチマーカーをインターネットで調べない
- ベンチは
task benchで実行する。setupでは初回ベンチと、計測の補修に必要な再実行まで行い、結果と成果物を確認する - ベンチマーカーのソースコードを解析しない
編集・デプロイ
- 全操作の入口と構成の正本は
Taskfile.yml。冒頭のAPP_NAME、SERVICE、DB_NAME、ALL_HOSTS、IP、*_HOSTSを競技ごとに更新し、競技ごとのvarsは# >>> contest values >>>区画に閉じ込める。templateへの差分抽出はtools/template/README.mdを参照する - 競技固有・解法固有のタスクは
Taskfile.contest.ymlへ置き、Taskfile.ymlは汎用のまま保つ。両ファイルは同一の名前空間なのでタスク名を重複させない。汎用側から呼ぶ場合はhookタスク名で参照する - 競技固有の設定・ツールは
tools/contest/へ置く。tools/の他のディレクトリは、そこを参照する側であっても競技非依存に保つ。分けられない値は該当行へ# contest:コメントを残す。詳細はtools/contest/README.md - サーバー上で直接編集せず、
task setup-*で取得し、ローカル編集後にtask deploy-*で反映する - アプリはGo実装を編集・deploy対象とする。Node実装(
webapp/node/)を含む他言語の参考実装は参照専用とし、編集せず正規deploy経路へ混ぜない - Goアプリとcollectorは、実ホストで確認した
TARGET_OS/TARGET_ARCHへローカルでクロスコンパイルする nginx/conf.d/upstream.confはtask genの生成物なので手編集しないtask deploy-*はreload/restart、task apply-rolesはサービスのenable/disableを伴う。実行前に対象ホストと影響を確認する- サーバーの状態を変えるtaskは競技固有taskも含めて
{{.OPERATION_LOCK}}を通し、ベンチRUNと全worktree共通の操作ロック(tools/bench/operation-lock.sh)で直列化する。ロック中で失敗したら表示された保持者の終了を待ち、ロックを手で消さない。読み取り専用の確認は並行してよい - ベンチ開始時に、各ホストの配布物が計測するworktreeの内容と一致するか(
deployctl verify)とservice状態(check-roles)を検査し、不一致ならRUNを始めない。止まったら計測するworktreeからdeployし直す
