Hacker Newsに投稿:AI エージェントがプルリクエストのマージ準備ができたかどうかを判断するためのツールを作成しました。

2026/01/17 18:55

Hacker Newsに投稿:AI エージェントがプルリクエストのマージ準備ができたかどうかを判断するためのツールを作成しました。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

**Good To Go は、GitHub のプルリクエストがマージ可能かどうかを評価する決定論的なコマンドラインツールです。すべての CI チェックとコミットステータスを集約し、レビューコメントを実行可能、非実行可能、または曖昧に分類します。スレッド解消状態も追跡し、5 つの明確なステータスコード(READY、ACTION_REQUIRED、UNRESOLVED、CI_FAILING、ERROR)のいずれかとオプションで JSON データを出力します。静かなモード (

-q
) では、終了コードがステータスを反映します(0 = READY、1 = ACTION_REQUIRED、2 = UNRESOLVED、3 = CI_FAILING)。

このツールは複数の CI プロバイダーに対応し、GitHub Actions のワークフローで必須ステータスチェックとして使用できます。また、AI に優しい JSON 出力(

gtg <pr> --format json
)も提供します。破棄されたコメントの状態を永続化する機能 (
--state-path .goodtogo/state.db
) と、新鮮な解析を強制するオプション (
--refresh
) があります。

David Sifry が Claude Code を使って開発した Good To Go は、決定論性、実行可能性、エージェントファースト設計、および曖昧さに対するフェイルオープン処理を重視しています。クイックスタート:

pip install gtg
でインストールし、
GITHUB_TOKEN
を設定してから
gtg <pr>
(または
gtg <pr> --repo owner/repo
)を実行します。詳細は GitHub リポジトリ、PyPI パッケージ、完全なドキュメント、および貢献ガイドをご覧ください。

信頼できるマージ準備サインを提供することで、手動レビューの負担を軽減し、AI エージェントや自動パイプラインが PR を自信を持って処理できるようにします。

本文

AI コーディングエージェント向けの決定論的 PR 準備検出


Good To Go

AI 補助開発に欠けていた要素 ― いつ実際に完了したかを知ること。

誰も語らない問題

AI コーディングエージェントはソフトウェア開発を変革しています。コードを書き、バグを修正し、レビューコメントに応答し、プルリクエスト(PR)を作成できます。しかし、すべてのエージェントが共通して抱える根本的な問題があります。

「PR がマージ準備完了かどうか」を確実に判断できないこと。

想像してください。「CI を修正し、レビューコメントにも対処する」ように AI エージェントに頼んだとき、何が終了したと判断するのでしょう?

  • CI が走っている… 完了? もう一度確認します。さらに…
  • CodeRabbit が 12 件のコメントを残しました… 実際に修正が必要なのはどれで、単なる提案か?
  • レビュアーが「X を使うことを検討してください」と書いたとき、それはブロック要因か単なる思考か?
  • 未解決スレッドがある… しかしコードは最後のコミットで修正済み。

決定論的な答えが無ければ、エージェントは次のように振る舞います:

  1. 無限ループで CI ステータスをポーリングし、トークンを消費する
  2. 早期に諦める ― 「変更をプッシュした」(CI が失敗しているにもかかわらず)
  3. 行動可能なフィードバックを見逃す ― 情報コメントの海に埋もれる
  4. 常に質問し続ける ― 「今は準備できた? 今度はどう?」

解決策:決定論的 PR 分析

Good To Go は、1 つのコマンドで問題を確実に回答します:

これがすべて。1 コマンド、1 答え。

ステータス意味行動
READY
全部クリアマージする
ACTION_REQUIRED
コメントを修正する必要あり対応する
UNRESOLVED
議論が未解決それらを解消する
CI_FAILING
チェックが通っていないビルドを修正する
ERROR
データ取得に失敗トークン/ネットワークを確認

曖昧さゼロ。推測不要。無限ループなし。

仕組み

Good To Go は PR を以下の3次元で分析します:

  1. CI ステータス集約
    GitHub のチェックランとコミットステータスを統合し、単一の Pass/Fail/Pending 状態にまとめます。複数 CI システム、必須 vs 任意チェック、進行中ランの複雑さを扱います。

  2. レビューコメント分類
    すべてのコメントが同じではありません。Good To Go は各コメントを次のように分類します:

    • ACTIONABLE
      – マージ前に修正が必要(ブロッキング課題、重大バグ)
    • NON_ACTIONABLE
      – 無視しても安全(称賛、細かい指摘、既解決項目)
    • AMBIGUOUS
      – 人間の判断が必要(提案・質問)

    事前に組み込まれたパーサは人気自動レビュアーのパターンを理解します:

    • CodeRabbit – Severity 指標 (
      Critical/Major/Minor/Trivial
      )、細かい指摘、解決マーカー
    • Greptile – Severity マーカー、PR 要約検出、行動可能数
    • Claude Code – ブロッキングマーカー、承認パターン、タスク完了サマリー
    • Cursor – バグ severity レベル (
      Critical/High/Medium/Low
      )
  3. スレッド解決追跡
    実際に未解決の議論と、技術的には「未解決」だが後続コミットで既に対処済みのスレッドを区別します。

AI エージェント向けに設計

Good To Go は AI エージェントの動作に合わせて設計されています:

  • 意味ある終了コード
    デフォルトモードは「解析可能な状態なら必ず

    0
    」を返します。AI エージェントは JSON 出力をパースし、終了コードをエラーと解釈しません。

    # AI フレンドリー(デフォルト):exit 0 + parse JSON
    gtg 123 --format json
    
    # シェルスクリプト向け:意味ある終了コード
    gtg 123 -q   # 静かモード、終了コードのみ
    
  • 構造化された出力
    すべての応答はエージェントがアクションを起こすために必要な情報だけを含みます:

    {
      "status": "ACTION_REQUIRED",
      "action_items": [
        "Fix CRITICAL comment from coderabbit in src/db.py:42",
        "Resolve thread started by @reviewer in api.py"
      ],
      "actionable_comments": [...],
      "ci_status": {...},
      "threads": {...}
    }
    
  • 状態永続化
    エージェントセッション間で既に処理済みの項目を追跡します:

    gtg 123 --state-path .goodtogo/state.db   # キャンセルしたコメントを記憶
    gtg 123 --refresh                         # 強制的に再分析
    

ユースケース

  • CI ゲートとして

    gtg
    を必須ステータスチェックに設定し、PR が本当に準備できるまでマージをブロックします。

    - name: Check PR readiness
      run: gtg $ --semantic-codes
    
  • エージェントワークフロー内で – 無限ポーリングの代わりに確実な答えを AI エージェントへ渡します。

    result = subprocess.run(["gtg", pr_number, "--format", "json"], ...)
    data = json.loads(result.stdout)
    
    if data["status"] == "READY":
        merge_pr()
    elif data["status"] == "ACTION_REQUIRED":
        for item in data["action_items"]:
            address_feedback(item)
    
  • PR シェパード – PR のライフサイクル全体を監視します。

    while true; do
      gtg 123 -q
      case $? in
        0) echo "Ready to merge!"; break ;;
        1) handle_comments ;;
        2) resolve_threads ;;
        3) wait_for_ci ;;
      esac
      sleep 60
    done
    

クイックスタート

# インストール
pip install gtg

# GitHub トークンを設定
export GITHUB_TOKEN=ghp_...

# PR をチェック(git origin からリポジトリ自動検出)
gtg 123

# 明示的にリポジトリ指定
gtg 123 --repo owner/repo

# 人間が読める形式で表示
gtg 123 --format text

フィロソフィー

Good To Go は PR ワークフローに関して以下の意見を持ちます:

  • ヒューリスティックより決定論 – どんな PR も常に1つのステータスしか持たない
  • 完全性より行動可能性 – 必要なアクションだけを提示し、すべてではなく
  • エージェント第一設計 – 構造化出力・意味あるデフォルト・状態永続化
  • 不確実時はオープンにする – 人間レビューへフラグを立て、ブロックにはしない

リンク集

  • GitHub リポジトリ
  • PyPI パッケージ
  • 完全ドキュメント
  • コントリビューションガイド

Claude Code で作成:David Sifry

同じ日のほかのニュース

一覧に戻る →

2026/01/18 5:44

トルコ語の格変化をベースとするプログラミング言語

## Japanese Translation: **(全ての重要ポイントを組み込んだもの)** --- ## Kip – ケースベース型研究言語 Kip は、トルコ語の格変化を型システムと構文に埋め込む実験的プログラミング言語です。名詞格接尾辞と母音調和を用いて引数関係を表現し、関数引数の順序を柔軟に変更できる一方で意味は明確に保たれます。 ### コア機能 | 機能 | 説明 | |------|------| | **引数順序** | 格接尾辞が役割を決定します。例:`(5'le 3'ün farkını) yaz.` と `(3'ün 5'le farkını) yaz.` は同じ意味です。 | | **帰納型** | トルコ語構文で宣言します。例:`Bir doğal-sayı ya sıfır ya da bir doğal-sayının ardılı olabilir.` | | **多相型** | 同様に宣言します。例:`Bir (öğe listesi) ya boş ya da bir öğenin bir öğe listesine eki olabilir.` | | **パターンマッチング** | 条件付き接尾辞 `-sa/-se` を使用し、入れ子パターンとワイルドカード `_` をサポートします。 | | **定数** | キーワード `diyelim` で宣言します。例:`sıfırın ardılına bir diyelim.` | | **組み込み型** | 整数 (`tam-sayı`) – 算術、比較、階乗;文字列 (`dizge`) – 長さ、連結、整数へのパース。 | | **I/Oプリミティブ** | 出力:`yazmak/yaz`;入力:`okumak/oku`;シーケンス接尾辞 `-ip/-ıp/-up/-üp`。 | ### 形態論と実装 * Kip はトルコ語の形態解析に TRmorph の有限状態変換器を利用します。曖昧な単語はすべてのパースで表現され、アポストロフィで解消できます。 * コンパイラは Foma(パッケージマネージャ経由)と Haskell Stack を使用し、REPL (`stack exec kip`) で実行するかファイルを `--exec` で実行します。WASM プレイグラウンドは `playground/` 以下にあります。 ### プロジェクト状況 Kip は研究専用プロジェクトです。構文と挙動は進化する可能性があります。キャッシュされたバイトコードファイル (`.iz`) は、コンパイラが変更されると無効になります。 --- この要約はすべての主要ポイントを反映し、元のテキストに忠実でありながらメインメッセージを明確かつ簡潔に保っています。

2026/01/17 20:15

ASCII文字はピクセルではない:ASCIIレンダリングの深掘り解析

## Japanese Translation: **概要** この記事では、各文字を多次元「形状ベクトル」でモデル化することで鮮明で高コントラストのASCII画像を生成できるインタラクティブな画像→ASCIIレンダラーを紹介しています。従来の最近傍サンプリングはセルごとに1ピクセルとして扱い、ジャギーやぼやけた出力が生じます。スーパーサンプリングはジャギーを減らしますが、単一の輝度値へ平均化するためエッジがまだぼやけてしまいます。 新しい手法では、セルの上/下と左/右の半分を小さな円でサンプリングし、各グリフがどのように空間を占有しているかを捉えます。これにより6次元(方向性コントラスト用の外部サンプリングをオプションで追加)形状ベクトルが生成されます。このベクトル空間で最近傍検索を行い、グリッドセルごとに最適な文字を選択します。ベクトル要素を指数関数的に上げることでコントラストを増幅し(全体の対比を高めつつ均一な勾配を保持)、さらに隣接セルをサンプリングする方向性コントラストでシャープ化します。 フレームごとのユークリッド距離計算とサンプリング収集によるパフォーマンスボトルネックは、**k‑d木インデックス**、**量子化キーを用いたキャッシュ**、およびサンプリングとコントラスト段階の **GPUアクセラレーション** を組み合わせて解消し、モバイルデバイスでもスムーズなFPSを実現しています。著者はさらに、各文字に異なる色/明度を割り当てる方法や高次元サンプリングベクトルの探索などの拡張可能性についても概説しています。 最後に、読者は将来の投稿でこれらの開発内容を取り上げる予定のメールリストへの登録を勧められています。

2026/01/18 7:19

ライトモード・インフレーション (Note: “ライトモード”は「軽い(低エネルギー)モード」を指し、物理学や宇宙論の文脈で使われることが多いです。)

## Japanese Translation: **改善された概要** この記事は、macOS のライトモードウィンドウが過去 16 年で徐々に明るくなってきたことを示しており、Snow Leopard(2012)では平均明度が約 71 %だったのが、Mac OS Tahoe ではほぼ 100 %に上昇しています。著者はスクリーンショットをクロップし、Pillow を使ってグレースケールへ変換した後、ピクセル平均強度を算出することで測定しました。この分析は画面全体やアプリケーションの明るさではなく、**ウィンドウクロム**に特化しています。2020 年末に M1 MacBook Air にアップグレード(Big Sur でウィンドウ明度が 85 %から 97 %に増加)した後、著者はダークモードへ切り替えました。ダークモードは Mojave(2018)で導入されました。本研究では、典型的なライトモードウィンドウの最も暗い色が Tahoe では 97 %明度に達する一方、Snow Leopard では 90 %であることを指摘しています。また、iOS 26 の HDR 実装は一部要素を 100 %以上の白に押し上げる可能性があり、知覚される明るさを過大評価する恐れがあると述べています。 著者は、このより明るい UI デザインへの移行がコントラストバイアスによってダーク背景をより魅力的にしていると主張し、ユーザーの目の疲労を軽減しつつアプリ間の視覚的区別を保つために中程度のグレー(約 50 %)インターフェースを推奨しています。将来のデザインへのインスピレーションとして、著者はより高い明るさレベルにもかかわらず、Yosemite などの古い macOS スタイルを好んでいます。 このバージョンは主要なポイントすべてを保持し、ダークモード導入に関する余計な因果推論を削除し、ウィンドウクロムへの焦点を明確にしています。