メインコンテンツへ移動

TEP(Technical Evidence Pipeline)

git履歴から、確かめられる事実を取り出す方法

TEPは、Griftが使っている方法の名前です。エンジニアのgit履歴から、確かめられる事実を取り出します。誰が何度実行しても、同じ結果になります。

点数や順位はつけず、案件で求められることと項目ごとに並べて、面談で聞くことを具体的にします。

TEPを作った理由

寺田 康佑 Cor.株式会社 代表取締役

2026年8月12日、僕のGitHubの草(contribution)は、1日で280件になりました。8月1日から23日までで2,907件です。GitHubの数え方ではコミットのほかに、Issueやプルリクエスト、レビューも含みます。

AIで量を増やせることは、もう十分に分かりました。でも、この280件で、僕の何が分かるのか。

何を作ったのか。本番のコードを変えたとき、テストも触ったのか。新しく立ち上げたのか、誰かが作ったものを保守したのか。一人で作ったのか、チームで触ったのか。そこまでは、草の濃さだけでは分かりません。

スキルシートの「Java 5年」も同じです。Javaに関わった期間は分かります。でも、その5年で何をしてきたのかは、数字だけでは分かりません。経歴書に書いてあることも、本人の申告のままでは確かめにくい。

期間も量も必要な事実です。ただ、それをそのまま技量に読み替えるのは違う。だから、git履歴から確かめられる事実だけを取り出す方法を作りました。それがTEPです。

健康診断の血圧に、高い・低いの優劣はありません。人によって、状況によって、求められる値が違うだけです。エンジニアの仕事の仕方も、案件によって求められるものが違います。点数で並べるのではなく、案件が求めることと、その人の記録を並べて見られるようにしたい。TEPはそのための方法です。

この話は、noteの「AI時代のプロジェクトをどう評価するのか」に詳しく書きました

TEPが見るもの

TEPが読むのは、git履歴だけです。gitは、エンジニアがコードの変更を記録していく道具です。誰が・いつ・どのファイルを変えたかが変更1件ずつ残り、この1件をコミット、記録をまとめた置き場をリポジトリと呼びます。

TEPはこの記録から、次のことを数えます。

誰の変更か

誰の変更かの区別(帰属の区別)

コミット(変更を記録した1件)ごとに、本人の変更、ほかの人の変更、自動で動くプログラム(bot)の変更、自動で作られたファイルや外から取り込んだコード、コピー元のリポジトリ(fork元)から引き継いだ記録などを、11の分類で分けて数えます。

分からないこと

コードの良し悪しは分かりません。

CLIの出力では origin(11分類)

どの部分を変えたか

変えた部分の区分(作業領域)

変えたファイルの場所と種類から、画面、サーバー側、データ、基盤、テスト、文書、自動化の設定(CI/CD)、監視、設定ファイル、生成物・外部のコード、そのほかの11の区分に分けて、区分ごとに変えたコミットの件数を数えます。

分からないこと

ファイルの名前から機械的に分けるので、職種や得意分野を決めるものではありません。

CLIの出力では surface_profile

どんなペースで変えたか

変更のペース(変更リズム)

直近180日のうち、変更を記録した日が何日あったかを数えます。変更と変更のあいだが何日空いたかも、真ん中の値と長いほうから1割にあたる値で示し、2日以内の間隔と30日以上の間隔の割合も出します。

分からないこと

労働時間や勤怠、意欲、納期を守ったかは分かりません。毎日小さな変更を記録すれば日数は増え、まとめて記録すれば減ります。

CLIの出力では change_rhythm

テストと一緒に変えたか

テストも一緒に変えた割合(テスト併修率)

本番のコード(テストと文書以外)を変えたコミットのうち、同じコミットでテストも変えたものの割合です。

分からないこと

テストが通ったか、テストやコードの質は分かりません。文書や設計が中心の仕事のように、テストが前提でない仕事では低く出るのが自然です。

CLIの出力では test co-change

テストの付け方(検証の形)

テストを触ったコミットの割合、テストの種類(単体・結合・E2E・契約)、不具合の修正(fix・revert)のうちテストも一緒に変えたものの割合を出します。

分からないこと

テストの担当(QA)に向いているかは分かりません。

CLIの出力では verification_profile

どんなリポジトリでどう関わったか

リポジトリの様子(リポジトリの文脈)

関わった人の数、いちばん多く変更した人が占める割合(名前は出しません)、取り込み(マージ)の記録の割合、使っている言語、活動の密度など、数値が出たリポジトリの様子を並べます。

分からないこと

個人の能力や、チームの優劣は分かりません。分類であって、序列ではありません。

CLIの出力では context profile

関わり方

本人の同意が記録されているときだけ、新しいファイルを作ったコミット、既にあるファイルを直したコミット、取り込み(マージ)のコミット、本人が付けたリリースの印の数などを出します。

分からないこと

職種を決めるものではありません。CLIが確かめるのは同意が記録されていることで、同意そのものではありません。

CLIの出力では role_profile

すぐに直したか

傾向の記録で、合否には使いません。

修正でのやり直し(手戻り率)

21日以内に触ったファイルを、修正(fix)や取り消し(revert)などの件名で、もう一度変えたコミットの割合です。

分からないこと

バグの件数や品質ではありません。件名の付け方で出方が変わるので、人と比べたり合否に使ったりしません。

CLIの出力では corrective rework

同じファイルへの戻り(磨き直し)

本番のコードの同じファイルに、21日以内にもう一度手を入れたコミットの割合です。

分からないこと

手戻りや不具合の件数ではありません。

CLIの出力では path retouch

いまのコードはどれくらい新しいか

計測を指定したときだけ出します。

いまのコードの新しさ(定着率)

いまのコードに残っている行が、書かれてからどれくらい経っているかを、180日を目安に重みを付けて平均した値です。1に近いほど、最近書かれた行が多いことを表します。

分からないこと

180日後に残った行の割合や、コードの品質ではありません。リポジトリ全体の値で、一人ひとりの値ではありません。

CLIの出力では survival(--survival を付けたとき)

用語の対応表(このページの言い方・サイトの用語・CLIの出力での名前)

CLIの出力や文書を読むときの手がかりです。サイトのほかのページでは真ん中の列の用語を括弧に添えています。

git履歴から数えた値
サイトの用語 検査値
CLIの出力では observed value(kind: observed の value と unit)
誰の変更かの区別
サイトの用語 帰属の区別
CLIの出力では origin(11分類)
変えた部分の区分
サイトの用語 作業領域
CLIの出力では surface_profile
変更のペース
サイトの用語 変更リズム
CLIの出力では change_rhythm
テストも一緒に変えた割合
サイトの用語 テスト併修率
CLIの出力では test co-change
テストの付け方
サイトの用語 検証の形
CLIの出力では verification_profile
リポジトリの様子
サイトの用語 リポジトリの文脈
CLIの出力では context profile
関わり方
サイトの用語 関わり方
CLIの出力では role_profile
修正でのやり直し
サイトの用語 手戻り率
CLIの出力では corrective rework
同じファイルへの戻り
サイトの用語 磨き直し
CLIの出力では path retouch
いまのコードの新しさ
サイトの用語 定着率
CLIの出力では survival(--survival を付けたとき)
案件側が書き出す要求
サイトの用語 案件側の宣言
CLIの出力では grift project(project-v1)
項目ごとの並び
サイトの用語 軸ごとの並び
CLIの出力では grift align(alignment-v1)
チームで見るとき
サイトの用語 チーム単位の充足
CLIの出力では grift align --team
数えられなかったもの
サイトの用語 未観測
CLIの出力では not_observed(理由のコード付き)
git履歴から確かめられる事実を取り出す方法
サイトの用語 TEP
CLIの出力では Technical Evidence Pipeline

数え方の決まり

数え方と件数を一緒に出す

どの数値にも「何件のうち何件か」と、数え方の版、どの時点の記録を数えたかを付けます。たとえば(架空の例)、本番のコードを変えた40件のコミットのうち12件で、テストも一緒に変えていたとします。割合だけなら0.3ですが、TEPは「40件のうち12件」と読める形で残します。数えた件数が20件に満たないときは、割合を出さずに件数だけを示します。

見えないものは「見えない」と書く

記録がない、件数が少ない、テストの仕組みが見つからないなど、数えられなかったものは0にせず、理由を付けて「未観測」と出します。非公開の仕事や、育児・病気などでgitに写らない期間を、実績がないとは読みません。利用規範の第1条で決めています。

誰が何度実行しても同じ結果

計測にAI(LLM)を使わないので、同じリポジトリの同じ時点を同じ版のGriftで数えれば、誰が何度実行しても同じ数値になります。受け取った人は grift verify で計算し直し、一致(VERIFIED)・不一致(MISMATCH)・検証不能(CANNOT_VERIFY)を確かめられます。保存したレポートを書き換えていれば、不一致として分かります。

手元で動き、外に送らない

Grift CLIはエンジニアのPCの中だけで動き、当社へデータを自動で送る機能はありません。ネットワークを使うのは、公開リポジトリの情報を取りに行くなど、本人が明示したときだけです。共有するかどうか、どのリポジトリを出すかは本人が決めます。選んで出したことも、受け取る側に分かる形で残ります。

TEPがしないこと

TEPは、1つにまとめた点数(合成スコア)、人を並べた順位、合否、「この人を薦める」という推薦を出しません。違う観測を1つの数に丸めると、何をどの件数で数えたかが消えてしまうからです。案件の要求と並べるときも、総合点や推薦にはまとめません。判断するのは人です。

使い方の決まりもあります。数値だけで足切りする、記録がないことを実績がないと読む、本人の同意なく他人を測る、組織の人を常に比べる評価表に使う、といった使い方は、利用規範(norms・7条)でTEPと呼ばないことにしています。

利用規範(norms)を読む

自己申告の診断との違い

人に順位をつけない点は、MBTIのような自己申告の性格診断と同じです。違うのは、何を元にして、何を出すかです。

  • 元にするもの

    自己申告の性格診断(MBTIなど)

    質問への本人の回答

    TEP

    gitに残った変更の記録

  • ごまかしやすさ

    自己申告の性格診断(MBTIなど)

    答え方しだいで結果が変わり、見せたい自分に寄せて答えることもできる

    TEP

    記録の量は増やせる(毎日小さな変更を記録すれば、変更を記録した日数は増える)。TEPは量を点数にせず、誰の変更かを分けて、件数と一緒に出す。レポートを書き換えれば、計算し直したときに食い違いが分かる

  • ラベル

    自己申告の性格診断(MBTIなど)

    タイプの名前が付く

    TEP

    タイプや等級の名前は付けない。数えた値と件数だけを出す

  • 案件と照らせるか

    自己申告の性格診断(MBTIなど)

    結果は性格の傾向で、案件で求める作業とは物差しが違う

    TEP

    案件が求める作業の区分・テストの種類・変更のペースと、項目ごとに並べられる

どちらが優れているという話ではありません。自己申告の診断は、本人が自分をどう捉えているかを知る手がかりになります。TEPは、受け取った側がgitに残った仕事の仕方を確かめるための方法です。目的が違う道具です。

使い方

紹介会社・SESの営業の方、案件の担当の方へ

  1. 候補者に実行してもらう

    候補者本人に、手元でGrift CLIを実行してもらいます。共有するかどうか、どのリポジトリを出すかは本人が決めます。

  2. 案件で求めることを書き出す(grift project)

    案件で求める作業の区分、テストの種類、変更のペースなどを、案件側が項目ごとに書き出します。書かなかった項目は「要求なし」として扱い、0や不足にはなりません。

  3. 候補者の記録と並べる(grift align)

    案件側の要求と候補者の記録を項目ごとに並べ、重なり・範囲外・0件・未観測・要求なしの5通りで示します。総合点・順位・合否・推薦は計算しません。

  4. 面談で聞くことを決める

    「範囲外」や「0件」は、能力が足りないという意味ではありません。並びを見て、何があったのかを聞くきっかけにしてください。

  5. チームで見る(grift align --team)

    要求を満たす人数だけを出し、一人ひとりの数値は出しません。3人未満のチームでは集計しません。2人だと、誰が満たしていないかが分かってしまうためです。

重なり
記録が案件の求める項目や範囲と重なっている
CLIの出力では overlap
範囲外
記録の値が案件の書いた範囲の外にある。能力が足りないという意味ではない
CLIの出力では outside_declared_range
0件
数えた範囲で、その項目の記録が0件だった
CLIの出力では observed_zero
未観測
記録が渡されていない、件数が少ないなどで、比べられなかった
CLIの出力では not_observed
要求なし
案件側がその項目を求めていない
CLIの出力では not_declared
架空の例です。ある案件の要求と、候補者の記録を並べたときの見え方を示します。数値と項目は説明のためのもので、実在の人や案件ではありません。
  • サーバー側の変更

    案件側の要求
    求める
    候補者の記録
    31件のうち12件
    並び
    重なり
  • 直近180日に変更を記録した日数

    案件側の要求
    20日以上
    候補者の記録
    14日
    並び
    範囲外
  • 結合テスト

    案件側の要求
    求める
    候補者の記録
    0件
    並び
    0件
  • レビューなどの記録(GitHubなどから書き出したもの)

    案件側の要求
    求める
    候補者の記録
    渡されていない
    並び
    未観測
  • データの変更

    案件側の要求
    書いていない
    候補者の記録
    31件のうち3件
    並び
    要求なし

「範囲外」の項目からは「直近の半年は、どんな時期でしたか」と聞けます。結合テストが「0件」でも、別のリポジトリや非公開の仕事で書いていたのかもしれません。並びは答えではなく、聞くことを決める材料です。

いまはCLIでの操作です。営業向けの画面はテスト導入(PoC)に向けて準備を進めています。

エンジニアの方へ

  1. Python 3.11以上の環境で pipx install grift-cli を実行し、リポジトリの中で grift report を実行します。変えた部分の区分や変更のペースまで見るときは grift repo を使います。
  2. 出てきた数字が自分の経験と合っているかを確かめてください。数字だけでは誤解されそうなところや違和感があれば、GitHubのIssuesで教えてください。
  3. 共有するかどうか、どのリポジトリを出すかは自分で決められます。非公開のリポジトリでも、集計した値だけを渡せます。コードを相手に見せる必要はありません。
  4. 受け取った人は grift verify で計算し直せます。数えられなかったものは「未観測」と書かれ、非公開の仕事やgitに写らない期間を、実績がないとは読まない決まりです。

次に読むもの

資料ダウンロード

まずは資料で、Griftの中身を確かめる

Grift CLIが何を取り出し、何を出さないかを、20ページの資料にまとめています。申し込みなしでダウンロードできます。

  • git履歴から何を取り出し、何を出さないか
  • 測る項目と、数値の読み方(分子と分母)
  • エンジニア本人と紹介会社さまの使い方
  • よくある質問

2026年8月時点(Grift CLI v0.5)の資料です。最新の使い方はGitHubのREADMEをご覧ください。

次の一歩

自社の推薦や採用の業務で、確かめてみませんか。

紹介会社さま・SES企業さま・自社開発企業さまのテスト導入(PoC)は、Cor.株式会社のAI受付で承っています。エンジニアの方は、GitHubからすぐに試せます。