grift-cli 0.5.4__tar.gz → 0.5.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of grift-cli might be problematic. Click here for more details.

Files changed (126) hide show
  1. {grift_cli-0.5.4 → grift_cli-0.5.6}/CHANGELOG.md +42 -1
  2. {grift_cli-0.5.4 → grift_cli-0.5.6}/PKG-INFO +32 -7
  3. {grift_cli-0.5.4 → grift_cli-0.5.6}/README.en.md +47 -7
  4. {grift_cli-0.5.4 → grift_cli-0.5.6}/README.md +31 -6
  5. {grift_cli-0.5.4 → grift_cli-0.5.6}/action.yml +8 -8
  6. grift_cli-0.5.6/docs/en/corpus-protocol.md +43 -0
  7. grift_cli-0.5.6/docs/en/coverage-map.md +38 -0
  8. grift_cli-0.5.6/docs/en/export-schema.md +22 -0
  9. grift_cli-0.5.6/docs/en/identity-schema.md +32 -0
  10. grift_cli-0.5.6/docs/en/metrics-guide.md +175 -0
  11. grift_cli-0.5.6/docs/en/norms.md +69 -0
  12. grift_cli-0.5.6/docs/en/persona-answers.md +33 -0
  13. grift_cli-0.5.6/docs/en/report-schema.md +41 -0
  14. {grift_cli-0.5.4 → grift_cli-0.5.6}/docs/metrics-guide.md +103 -24
  15. {grift_cli-0.5.4 → grift_cli-0.5.6}/docs/norms.md +5 -2
  16. {grift_cli-0.5.4 → grift_cli-0.5.6}/pyproject.toml +1 -1
  17. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_cli/__main__.py +56 -31
  18. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/contribute.py +8 -4
  19. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/version.py +2 -2
  20. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_contribute.py +8 -3
  21. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_default_report_path.py +5 -5
  22. grift_cli-0.5.6/tests/test_intake_disclosure.py +114 -0
  23. grift_cli-0.5.6/tests/test_verb_semantics.py +113 -0
  24. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_verify.py +20 -4
  25. grift_cli-0.5.4/.github/workflows/publish-testpypi.yml +0 -30
  26. {grift_cli-0.5.4 → grift_cli-0.5.6}/.github/workflows/ci.yml +0 -0
  27. {grift_cli-0.5.4 → grift_cli-0.5.6}/.github/workflows/kpi-monthly.yml +0 -0
  28. {grift_cli-0.5.4 → grift_cli-0.5.6}/.github/workflows/publish.yml +0 -0
  29. {grift_cli-0.5.4 → grift_cli-0.5.6}/.gitignore +0 -0
  30. {grift_cli-0.5.4 → grift_cli-0.5.6}/LICENSE +0 -0
  31. {grift_cli-0.5.4 → grift_cli-0.5.6}/corpus/AD-PILOT-20260822.md +0 -0
  32. {grift_cli-0.5.4 → grift_cli-0.5.6}/corpus/DISCRIMINANT-v2026.09.md +0 -0
  33. {grift_cli-0.5.4 → grift_cli-0.5.6}/corpus/DISCRIMINANT-v2026.11.md +0 -0
  34. {grift_cli-0.5.4 → grift_cli-0.5.6}/corpus/ad-pilot.json +0 -0
  35. {grift_cli-0.5.4 → grift_cli-0.5.6}/corpus/manifest.toml +0 -0
  36. {grift_cli-0.5.4 → grift_cli-0.5.6}/corpus/pins-v2026.09.toml +0 -0
  37. {grift_cli-0.5.4 → grift_cli-0.5.6}/corpus/pins-v2026.11.toml +0 -0
  38. {grift_cli-0.5.4 → grift_cli-0.5.6}/corpus/v2026.09/distributions.json +0 -0
  39. {grift_cli-0.5.4 → grift_cli-0.5.6}/corpus/v2026.11/distributions.json +0 -0
  40. {grift_cli-0.5.4 → grift_cli-0.5.6}/docs/corpus-protocol.md +0 -0
  41. {grift_cli-0.5.4 → grift_cli-0.5.6}/docs/coverage-map.md +0 -0
  42. {grift_cli-0.5.4 → grift_cli-0.5.6}/docs/export-schema.md +0 -0
  43. {grift_cli-0.5.4 → grift_cli-0.5.6}/docs/identity-schema.md +0 -0
  44. {grift_cli-0.5.4 → grift_cli-0.5.6}/docs/persona-answers.md +0 -0
  45. {grift_cli-0.5.4 → grift_cli-0.5.6}/docs/report-schema.md +0 -0
  46. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/README.md +0 -0
  47. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/coverage.md +0 -0
  48. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G1-click.json +0 -0
  49. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G10-scvi-tools.json +0 -0
  50. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G11-kilo.json +0 -0
  51. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G12-httpx.json +0 -0
  52. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G13-voicevox.json +0 -0
  53. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G2-gitignore.json +0 -0
  54. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G3-spoon-knife.json +0 -0
  55. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G4-express.json +0 -0
  56. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G5-typer.json +0 -0
  57. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G6-claude-code.json +0 -0
  58. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G7-axios.json +0 -0
  59. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G8-co.json +0 -0
  60. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/expected/G9-pyscript.json +0 -0
  61. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/identity/G1-click.toml +0 -0
  62. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/identity/example.toml +0 -0
  63. {grift_cli-0.5.4 → grift_cli-0.5.6}/golden/pins.toml +0 -0
  64. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/admission_v2026_11.py +0 -0
  65. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/build_dist_v2026_11.py +0 -0
  66. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/build_distributions.py +0 -0
  67. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/check_forbidden_vocab.py +0 -0
  68. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/corpus_ad_pilot.py +0 -0
  69. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/corpus_run.py +0 -0
  70. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/discriminant_v2026.py +0 -0
  71. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/discriminant_v2026_11.py +0 -0
  72. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/gen_coverage_table.py +0 -0
  73. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/gen_golden_expected.py +0 -0
  74. {grift_cli-0.5.4 → grift_cli-0.5.6}/scripts/hygiene_grep.py +0 -0
  75. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_cli/__init__.py +0 -0
  76. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/__init__.py +0 -0
  77. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/activity.py +0 -0
  78. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/analyze.py +0 -0
  79. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/cochange.py +0 -0
  80. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/context_profile.py +0 -0
  81. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/core_period.py +0 -0
  82. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/data/v2026.09/distributions.json +0 -0
  83. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/data/v2026.11/distributions.json +0 -0
  84. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/export.py +0 -0
  85. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/gitutil.py +0 -0
  86. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/identity.py +0 -0
  87. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/lineage.py +0 -0
  88. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/observation.py +0 -0
  89. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/origin.py +0 -0
  90. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/paths.py +0 -0
  91. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/reference.py +0 -0
  92. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/report.py +0 -0
  93. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/rework.py +0 -0
  94. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/schema.py +0 -0
  95. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/scope.py +0 -0
  96. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/survival.py +0 -0
  97. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/tests_observed.py +0 -0
  98. {grift_cli-0.5.4 → grift_cli-0.5.6}/src/tep_core/verify.py +0 -0
  99. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/conftest.py +0 -0
  100. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/coverage_matrix.py +0 -0
  101. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/git_fixture.py +0 -0
  102. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_activity.py +0 -0
  103. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_cli.py +0 -0
  104. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_cochange.py +0 -0
  105. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_context_profile.py +0 -0
  106. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_coverage.py +0 -0
  107. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_discriminant_claims.py +0 -0
  108. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_export.py +0 -0
  109. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_export_recipe.py +0 -0
  110. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_forbidden_vocab.py +0 -0
  111. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_gitutil.py +0 -0
  112. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_golden.py +0 -0
  113. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_h5_swarm.py +0 -0
  114. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_hygiene.py +0 -0
  115. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_identity_validation.py +0 -0
  116. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_lifecycle_v2.py +0 -0
  117. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_not_observed.py +0 -0
  118. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_origin.py +0 -0
  119. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_persona_answers.py +0 -0
  120. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_release_gate.py +0 -0
  121. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_report.py +0 -0
  122. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_rework.py +0 -0
  123. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_schema.py +0 -0
  124. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_scope.py +0 -0
  125. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_shared_block.py +0 -0
  126. {grift_cli-0.5.4 → grift_cli-0.5.6}/tests/test_survival.py +0 -0
@@ -4,13 +4,54 @@
4
4
 
5
5
  タグ・PyPI・リポ public 化は本ファイルの記載対象外(人間ゲート)。
6
6
 
7
+ ## [0.5.6] — 2026-08-23
8
+
9
+ 公開後検収で発見の仕様記述↔実挙動の矛盾 3 件(D-1/D-2/D-3)を解消するホットフィックス。
10
+
11
+ ### Fixed
12
+
13
+ - **動詞の意味を確定: `analyze` = 表示(stdout)・`report` = 記録(`.grift/`)**。README 日英の 2 語動詞表の analyze 行(「`.grift/` を生成」と誤記)を訂正
14
+ - **D-3b**: 裸 `grift analyze` の既定スコープを **repo** に統一(パス明示の従来モードは既定 tenant のまま不変)
15
+ - **D-3a**: `grift report --scope {repo,tenant}`(既定 repo)を追加
16
+ - D-2 文書: report の help「default: ./out」誤記を `.grift/` に訂正・docstring/examples を動詞意味確定版に更新
17
+ - **errata(0.5.5 の記載について)**: 0.5.5 の README/EVIDENCE に「裸 `grift analyze` が `.grift/` を自動生成する」との記述があったが、実挙動は stdout 出力のみ(`.grift/` は `grift report` が作る)。本版で文書をバイナリに合わせ、動詞意味を上記のとおり確定した
18
+ - CHANGELOG の受け口 URL 表記を tep-contributions に統一
19
+
20
+ ### Added(報告規律・恒久)
21
+
22
+ - **「wheel 実測」節の各 claim には実行コマンドと生ログを添付する**(0.5.5 で裸 analyze の claim が公開 wheel で再現しなかった件の再発防止)
23
+
24
+ ### テスト(反証)
25
+
26
+ - 裸 analyze が `.grift/` を作らず stdout へ出すピン / 裸 analyze の scope=repo ピン / パス明示の既定 tenant 維持ピン / 裸 report が `.grift/` を書き scope=repo のピン / `report --scope tenant` のピン / help 文言の golden(`./out` 残存なし)
27
+
28
+ ## [0.5.5] — 2026-08-23
29
+
30
+ UX 統一(2語動詞 + `.grift/` 出力)+ contribute 受け口の実運用化 + 全ドキュメント日英対応。
31
+
32
+ ### Changed
33
+
34
+ - **基本操作はすべて `grift <動詞>` の2語で完結**: `grift analyze`(対象=カレント・出力=`.grift/`)・`grift report`(常に HEAD を再分析)・`grift verify`(`.grift/report.json` をカレントリポで再計算)・`grift contribute`(`.grift/report.json` から payload 組立)。明示指定は従来どおり引数で
35
+ - **出力先を `.grift/` に統一**(旧 `./out`・`.grift-out` は読み取り互換のみ)。`.gitignore` への `.grift/` 追加を推奨・リポ標準 `.gitignore` に同梱
36
+ - Action の作業ディレクトリも `.grift/` へ・既定ピン 0.5.5
37
+
38
+ ### Added
39
+
40
+ - **contribute 受け口リポ [grift-contributions](https://github.com/Cor-Incorporated/grift-contributions) を開設**: README(日英)・CONTRIBUTING・schema 検証 CI(`tep-contribution-v1`・メール形状拒否・禁止キー検査)。`grift contribute` の確認文が提出先と手順を明示
41
+ - **全公開ドキュメントの英語版を `docs/en/` に追加**: norms / metrics-guide(v2・帯規約・インベントリ・関連ツール節を含む完全英訳)/ report-schema / export-schema / identity-schema / corpus-protocol / coverage-map / persona-answers
42
+ - 読み方ガイド v2(帯規約の統一定義・全観測インベントリ・関連ツール節・表記確定)
43
+
44
+ ### Removed
45
+
46
+ - publish-testpypi ワークフロー(TestPyPI シークレット不在による恒久失敗のため削除)
47
+
7
48
  ## [0.5.4] — 2026-08-23
8
49
 
9
50
  `grift report` の stale 出力問題を解消 + 表示の版残存を一掃。
10
51
 
11
52
  ### Fixed
12
53
 
13
- - **`grift report`(引数なし)は既存の `./out/report.json` があっても常に現在の HEAD を再分析**する(提唱者実測で検出: 旧仕様は既存 JSON を再表示し、2コミット目以降の SHA が古いまま残った — 自己証明の罹患として重大)。再分析なしの再レンダリングは引数指定時のみ
54
+ - **`grift report`(引数なし)は既存の `./out/report.json` があっても常に現在の HEAD を再分析**する(提唱者実測で検出: 旧仕様は既存 JSON を再表示し、2コミット目以降の SHA が古いまま残った — 自己証明の信頼性を損なう重大な問題として処理)。再分析なしの再レンダリングは引数指定時のみ
14
55
  - README 日英: Action 使用例を `@v0.5.4` へ・**PyPI 欄を版に依存しない表記に変更**(「最新 0.5.2」等の古い版番号が残り続ける問題を構造的に解消)・`grift report` を「初回の簡単導線」として条件付きで説明(主 CTA は `grift analyze . --scope repo --out ./out` を維持)
15
56
  - action.yml 既定ピンを 0.5.4 へ
16
57
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: grift-cli
3
- Version: 0.5.4
3
+ Version: 0.5.6
4
4
  Summary: Deterministic TEP evidence metrics from a single git repository. No LLM.
5
5
  Project-URL: Homepage, https://github.com/Cor-Incorporated/grift-cli
6
6
  Author: TEP contributors
@@ -36,17 +36,27 @@ Named after the Grift product line.
36
36
 
37
37
  コミット数・行数・「活動量」は、エージェントと生成コードの時代に簡単に膨らむ。grift は git だけから、TEP の帰属(誰の仕事か)と検証層(test co-change ほか)を**決定論的に**出す。LLM は使わない。合成スコアも等級語彙も出さない。
38
38
 
39
- ## 5分で始める
39
+ ## 5分で始める(2語で基本操作)
40
40
 
41
41
  ```bash
42
42
  pipx install grift-cli
43
- grift analyze ./my-repo --scope repo --out ./out
43
+ cd your-repo
44
+ grift analyze # 分析結果を stdout に表示(repo スコープ)
45
+ grift verify # .grift/report.json を現在のリポジトリで再計算・突合
44
46
  ```
45
47
 
46
- - `--scope tenant`(既定): `.tep/identity.toml` に載った人の仕事 = **証拠用**
47
- - `--scope repo`: bot 以外の全人間コミット = **プロセス観測・参照分布用**
48
+ 基本操作はすべて **`grift <動詞>` の2語**で完結します。動詞の意味は「**analyze = 表示(stdout)**・**report = 記録(`.grift/`)**」です:
48
49
 
49
- **初回の簡単導線**: リポジトリ内で `grift report` だけでも現在の HEAD を分析して `./out/report.md` と `report.json` を書き出します(既存の `./out/report.json` があっても常に再分析します)。**確実に指定条件で測りたいとき・CI では `grift analyze . --scope repo --out ./out` を使ってください**(`report` は repo スコープ固定の省略形です)。
50
+ | 2語コマンド | 動作 |
51
+ |---|---|
52
+ | `grift analyze` | カレントリポジトリを**stdout に表示**(repo スコープ・`.grift/` は作らない) |
53
+ | `grift report` | 分析して `.grift/report.{json,md}` に**記録**(常に現在の HEAD を再分析・既定 repo スコープ・`--scope tenant` 可) |
54
+ | `grift verify` | `.grift/report.json` を同条件で再計算し改ざんを検出(VERIFIED / MISMATCH / CANNOT_VERIFY) |
55
+ | `grift contribute` | `.grift/report.json` から opt-in 提出 payload を組む(**何も送信しない**) |
56
+
57
+ - **`.grift/` は出力専用ディレクトリ**です(無ければ自動作成)。リポジトリの `.gitignore` に `.grift/` を追加することを推奨します
58
+ - カスタム指定(対象パス・スコープ・出力先を明示)は従来どおり引数・オプションで: `grift analyze path --scope tenant --identity .tep/identity.toml --out dir`
59
+ - `--scope tenant`(既定): `.tep/identity.toml` に載った人の仕事 = **証拠用**/`--scope repo`: bot 以外の全人間コミット = **プロセス観測・参照分布用**
50
60
 
51
61
  参照分布 v2026.09 は **repo スコープ同士**でのみ照合する。tenant の値を repo 分布に載せない(混ぜたら分布が嘘になる)。
52
62
 
@@ -72,7 +82,18 @@ report.json の全フィールド定義は [docs/report-schema.md](docs/report-s
72
82
 
73
83
  ## データ提出(grift contribute・明示的 opt-in)
74
84
 
75
- `grift contribute <repo-scopeのreport.json> --out contribution.json` は **TEP Report 集計と参照分布 vNext** への提出 payload を組み立てる。**CLI は何も送信しない(自動送信は恒久禁止)** — payload 全文を表示し、「この提出は公開リポジトリに載る」ことを明示した上で、提出はあなた自身が PR で行う。payload は repo スコープ集計値 + context_profile(クラス級)+ 定義版のみで、canonical_id・メール・パス・repo 名・tenant スコープ値は含まない(`docs/norms.md` 保持・削除条項参照)。
85
+ **TEP Report 集計と参照分布 vNext** への提出は、次の3段階で完結します:
86
+
87
+ ```bash
88
+ grift report # ① repo スコープの report を作る
89
+ grift contribute --out .grift/contribution.json # ② payload を組み・全文を確認
90
+ # ③ payload を [tep-contributions](https://github.com/Cor-Incorporated/tep-contributions) に PR で提出
91
+ ```
92
+
93
+ - **CLI は何も送信しません(自動送信は恒久禁止)**。payload 全文が表示され、「この提出は公開リポジトリに載る」ことが明示されます
94
+ - payload は repo スコープ集計値 + context_profile(クラス級)+ 定義版のみ。**canonical_id・メール・パス・repo 名・tenant スコープ値は含まれません**
95
+ - 受け口リポ(tep-contributions)の CI が schema(`tep-contribution-v1`)と個人情報形状(メール等)を機械検証します
96
+ - 用途は「TEP Report 集計と参照分布 vNext」に限定。保持期間は次回年次 Report まで・撤回は issue で受け付けます(`docs/norms.md` 保持・削除条項)
76
97
 
77
98
  例(click、tenant スコープ。ゴールデン G1):
78
99
 
@@ -82,6 +103,10 @@ report.json の全フィールド定義は [docs/report-schema.md](docs/report-s
82
103
 
83
104
  母数 20 未満では率も分布位置も出さない(`insufficient_population`。件数の生表示のみ)。
84
105
 
106
+ ## 指標の読み方(非エンジニア向け)
107
+
108
+ すべての指標について「何を測っているか・高い/低いで何がわかるか・公開リポジトリ117件の分布上の目安」を [docs/metrics-guide.md](docs/metrics-guide.md) に平易にまとめています。初めてレポートを見る方はまずこちらを。誤読しやすい点(例: corrective rework はバグ件数ではない、dormant は放置ではない)も表にしてあります。
109
+
85
110
  ## 指標と限界
86
111
 
87
112
  | 指標 | 何の証拠か | 限界 |
@@ -13,18 +13,28 @@ The conditions for calling a use "TEP-compliant" are defined in [docs/norms.md](
13
13
 
14
14
  Commit counts, line counts, and “activity” inflate easily once agents and generated code are in the loop. grift reads git only and emits TEP provenance (whose work) and a verification layer (test co-change and related metrics) **deterministically**. No LLM. No composite score. No skill-rank labels.
15
15
 
16
- ## Start in five minutes
16
+ ## Start in five minutes (two-word verbs)
17
17
 
18
18
  ```bash
19
19
  pipx install grift-cli
20
- grift analyze ./my-repo --scope repo --out ./out
20
+ cd your-repo
21
+ grift analyze # analyze and print to stdout (repo scope)
22
+ grift verify # recompute .grift/report.json against the current repo
21
23
  ```
22
24
 
23
- **Quickest first run**: inside a repository, `grift report` alone analyzes the
24
- current HEAD and writes `./out/report.md` and `report.json` (it always
25
- re-analyzes, even if `./out/report.json` already exists). For explicit
26
- control and CI, use `grift analyze . --scope repo --out ./out` (`report` is a
27
- fixed repo-scope shorthand).
25
+ Every basic operation is just **`grift <verb>`**. Verb semantics:
26
+ **analyze = display (stdout)** · **report = record (`.grift/`)**:
27
+
28
+ | Verb | Action |
29
+ |---|---|
30
+ | `grift analyze` | Analyze the current repository and **print to stdout** (repo scope; does not create `.grift/`) |
31
+ | `grift report` | Analyze and **record into `.grift/report.{json,md}`** (always re-analyzes the current HEAD; repo scope by default, `--scope tenant` available) |
32
+ | `grift verify` | Recompute `.grift/report.json` under recorded provenance (VERIFIED / MISMATCH / CANNOT_VERIFY) |
33
+ | `grift contribute` | Build an opt-in submission payload from `.grift/report.json` (**never sends**) |
34
+
35
+ - **`.grift/` is the dedicated output directory** (auto-created). Adding `.grift/` to your `.gitignore` is recommended
36
+ - Custom invocations keep the explicit form: `grift analyze path --scope tenant --identity .tep/identity.toml --out dir`
37
+ - `--scope tenant` (default): the identity.toml members' work = **evidence** / `--scope repo`: all human commits = **process observation & reference distributions**
28
38
 
29
39
  - `--scope tenant` (default): work matched in `.tep/identity.toml` = **evidence**
30
40
  - `--scope repo`: all non-bot human commits = **process observation and reference distributions**
@@ -59,6 +69,36 @@ The full field-by-field definition of report.json lives in [docs/report-schema.m
59
69
 
60
70
  `grift analyze <repo> --export <dir>` writes commits.ndjson (one row per commit: origin / actor / cochange), actors.json (attribution and engagement per canonical_id), and export-meta.json (with `config_digest`). **No raw emails or author strings are ever exported.** Aggregates in report.json remain authoritative for narrative. Details: [docs/export-schema.md](docs/export-schema.md).
61
71
 
72
+ ## Opt-in data submission (grift contribute)
73
+
74
+ Submissions to the **TEP Report and the next reference distribution** take three steps:
75
+
76
+ ```bash
77
+ grift report # 1) create a repo-scope report
78
+ grift contribute --out .grift/contribution.json # 2) build & review the payload
79
+ # 3) submit the payload as a PR to tep-contributions
80
+ # https://github.com/Cor-Incorporated/tep-contributions
81
+ ```
82
+
83
+ - **The CLI never sends anything** (automatic transmission is permanently
84
+ forbidden). The full payload is printed and the flow states explicitly that
85
+ it will appear in a public repository
86
+ - The payload carries repo-scope aggregates + class-level context + definition
87
+ versions only — **no canonical_id, emails, paths, repo names, or
88
+ tenant-scope values**
89
+ - The intake repository's CI mechanically validates the schema
90
+ (`tep-contribution-v1`) and rejects email-shaped content
91
+ - Use is limited to "TEP Report aggregation and the next reference
92
+ distribution"; retained until the next annual Report; withdrawal via issue
93
+
94
+ ## How to read the metrics (for non-engineers)
95
+
96
+ [docs/metrics-guide.md](docs/metrics-guide.md) explains every metric in plain
97
+ language: what it measures, what high/low values suggest, and rough ranges
98
+ from a 117-repository public corpus. Common misreadings (e.g. corrective
99
+ rework is not a bug count; dormant does not mean abandoned) are listed in a
100
+ table. Read this first if you are new to the reports.
101
+
62
102
  ## Metrics and limits
63
103
 
64
104
  | Metric | What it is evidence of | Limit |
@@ -13,17 +13,27 @@ Named after the Grift product line.
13
13
 
14
14
  コミット数・行数・「活動量」は、エージェントと生成コードの時代に簡単に膨らむ。grift は git だけから、TEP の帰属(誰の仕事か)と検証層(test co-change ほか)を**決定論的に**出す。LLM は使わない。合成スコアも等級語彙も出さない。
15
15
 
16
- ## 5分で始める
16
+ ## 5分で始める(2語で基本操作)
17
17
 
18
18
  ```bash
19
19
  pipx install grift-cli
20
- grift analyze ./my-repo --scope repo --out ./out
20
+ cd your-repo
21
+ grift analyze # 分析結果を stdout に表示(repo スコープ)
22
+ grift verify # .grift/report.json を現在のリポジトリで再計算・突合
21
23
  ```
22
24
 
23
- - `--scope tenant`(既定): `.tep/identity.toml` に載った人の仕事 = **証拠用**
24
- - `--scope repo`: bot 以外の全人間コミット = **プロセス観測・参照分布用**
25
+ 基本操作はすべて **`grift <動詞>` の2語**で完結します。動詞の意味は「**analyze = 表示(stdout)**・**report = 記録(`.grift/`)**」です:
25
26
 
26
- **初回の簡単導線**: リポジトリ内で `grift report` だけでも現在の HEAD を分析して `./out/report.md` と `report.json` を書き出します(既存の `./out/report.json` があっても常に再分析します)。**確実に指定条件で測りたいとき・CI では `grift analyze . --scope repo --out ./out` を使ってください**(`report` は repo スコープ固定の省略形です)。
27
+ | 2語コマンド | 動作 |
28
+ |---|---|
29
+ | `grift analyze` | カレントリポジトリを**stdout に表示**(repo スコープ・`.grift/` は作らない) |
30
+ | `grift report` | 分析して `.grift/report.{json,md}` に**記録**(常に現在の HEAD を再分析・既定 repo スコープ・`--scope tenant` 可) |
31
+ | `grift verify` | `.grift/report.json` を同条件で再計算し改ざんを検出(VERIFIED / MISMATCH / CANNOT_VERIFY) |
32
+ | `grift contribute` | `.grift/report.json` から opt-in 提出 payload を組む(**何も送信しない**) |
33
+
34
+ - **`.grift/` は出力専用ディレクトリ**です(無ければ自動作成)。リポジトリの `.gitignore` に `.grift/` を追加することを推奨します
35
+ - カスタム指定(対象パス・スコープ・出力先を明示)は従来どおり引数・オプションで: `grift analyze path --scope tenant --identity .tep/identity.toml --out dir`
36
+ - `--scope tenant`(既定): `.tep/identity.toml` に載った人の仕事 = **証拠用**/`--scope repo`: bot 以外の全人間コミット = **プロセス観測・参照分布用**
27
37
 
28
38
  参照分布 v2026.09 は **repo スコープ同士**でのみ照合する。tenant の値を repo 分布に載せない(混ぜたら分布が嘘になる)。
29
39
 
@@ -49,7 +59,18 @@ report.json の全フィールド定義は [docs/report-schema.md](docs/report-s
49
59
 
50
60
  ## データ提出(grift contribute・明示的 opt-in)
51
61
 
52
- `grift contribute <repo-scopeのreport.json> --out contribution.json` は **TEP Report 集計と参照分布 vNext** への提出 payload を組み立てる。**CLI は何も送信しない(自動送信は恒久禁止)** — payload 全文を表示し、「この提出は公開リポジトリに載る」ことを明示した上で、提出はあなた自身が PR で行う。payload は repo スコープ集計値 + context_profile(クラス級)+ 定義版のみで、canonical_id・メール・パス・repo 名・tenant スコープ値は含まない(`docs/norms.md` 保持・削除条項参照)。
62
+ **TEP Report 集計と参照分布 vNext** への提出は、次の3段階で完結します:
63
+
64
+ ```bash
65
+ grift report # ① repo スコープの report を作る
66
+ grift contribute --out .grift/contribution.json # ② payload を組み・全文を確認
67
+ # ③ payload を [tep-contributions](https://github.com/Cor-Incorporated/tep-contributions) に PR で提出
68
+ ```
69
+
70
+ - **CLI は何も送信しません(自動送信は恒久禁止)**。payload 全文が表示され、「この提出は公開リポジトリに載る」ことが明示されます
71
+ - payload は repo スコープ集計値 + context_profile(クラス級)+ 定義版のみ。**canonical_id・メール・パス・repo 名・tenant スコープ値は含まれません**
72
+ - 受け口リポ(tep-contributions)の CI が schema(`tep-contribution-v1`)と個人情報形状(メール等)を機械検証します
73
+ - 用途は「TEP Report 集計と参照分布 vNext」に限定。保持期間は次回年次 Report まで・撤回は issue で受け付けます(`docs/norms.md` 保持・削除条項)
53
74
 
54
75
  例(click、tenant スコープ。ゴールデン G1):
55
76
 
@@ -59,6 +80,10 @@ report.json の全フィールド定義は [docs/report-schema.md](docs/report-s
59
80
 
60
81
  母数 20 未満では率も分布位置も出さない(`insufficient_population`。件数の生表示のみ)。
61
82
 
83
+ ## 指標の読み方(非エンジニア向け)
84
+
85
+ すべての指標について「何を測っているか・高い/低いで何がわかるか・公開リポジトリ117件の分布上の目安」を [docs/metrics-guide.md](docs/metrics-guide.md) に平易にまとめています。初めてレポートを見る方はまずこちらを。誤読しやすい点(例: corrective rework はバグ件数ではない、dormant は放置ではない)も表にしてあります。
86
+
62
87
  ## 指標と限界
63
88
 
64
89
  | 指標 | 何の証拠か | 限界 |
@@ -16,7 +16,7 @@ inputs:
16
16
  version:
17
17
  description: "grift-cli version to install (pinned)"
18
18
  required: false
19
- default: "0.5.4"
19
+ default: "0.5.6"
20
20
  comment:
21
21
  description: "Opt-in: post the shared block as a PR comment (default off)"
22
22
  required: false
@@ -36,16 +36,16 @@ runs:
36
36
  GRIFT_SCOPE: ${{ inputs.scope }}
37
37
  run: |
38
38
  set -euo pipefail
39
- mkdir -p .grift-out
40
- grift analyze . --scope "$GRIFT_SCOPE" --format both --out .grift-out
39
+ mkdir -p .grift
40
+ grift analyze . --scope "$GRIFT_SCOPE" --format both --out .grift
41
41
  # Shared block = the copy-pasteable summary section of report.md.
42
42
  # Extract from '## Shared block' to the next '## ' heading.
43
- awk '/^## Shared block/{flag=1;next}/^## /{flag=0}flag' .grift-out/report.md > .grift-out/shared-block.md
44
- cat .grift-out/shared-block.md >> "$GITHUB_STEP_SUMMARY"
43
+ awk '/^## Shared block/{flag=1;next}/^## /{flag=0}flag' .grift/report.md > .grift/shared-block.md
44
+ cat .grift/shared-block.md >> "$GITHUB_STEP_SUMMARY"
45
45
  {
46
46
  echo "### grift (observation only — no pass/fail)"
47
47
  echo '```'
48
- cat .grift-out/shared-block.md
48
+ cat .grift/shared-block.md
49
49
  echo '```'
50
50
  echo "_読み方: 本レポートは証拠であり判定ではない(TEP norms 参照: https://github.com/Cor-Incorporated/grift-cli/blob/main/docs/norms.md)_"
51
51
  } >> "$GITHUB_STEP_SUMMARY"
@@ -54,7 +54,7 @@ runs:
54
54
  uses: actions/upload-artifact@v4
55
55
  with:
56
56
  name: grift-report
57
- path: .grift-out/
57
+ path: .grift/
58
58
  retention-days: 30
59
59
 
60
60
  - name: Post PR comment (explicit opt-in only)
@@ -66,7 +66,7 @@ runs:
66
66
  const body = [
67
67
  '### grift (observation only — no pass/fail)',
68
68
  '```',
69
- fs.readFileSync('.grift-out/shared-block.md', 'utf8').trim(),
69
+ fs.readFileSync('.grift/shared-block.md', 'utf8').trim(),
70
70
  '```',
71
71
  '_読み方: 本レポートは証拠であり判定ではない(TEP norms 参照)_'
72
72
  ].join('\n');
@@ -0,0 +1,43 @@
1
+ # Corpus protocol (v0.5) — write kill criteria before running
2
+
3
+ Japanese original: [corpus-protocol.md](../corpus-protocol.md).
4
+
5
+ Goal: test **discriminatory power** and **game resistance** — not whether
6
+ anyone is "senior." Named-person scorecards are forbidden.
7
+
8
+ ## Groups
9
+
10
+ | Group | Represents |
11
+ |---|---|
12
+ | A | High verification culture |
13
+ | B | Notable individual works (repo URLs only in public docs) |
14
+ | C | AI-heavy / vibe-coding (2024+) |
15
+ | D | Template / fork / no-tests |
16
+ | E | Private ground truth (Grift-only; never copied here) |
17
+
18
+ ## Kill criteria (registered before measurement)
19
+
20
+ - Test co-change is discarded if the A-vs-D medians differ by < 0.10 or the
21
+ ranges fully overlap
22
+ - `corrective_rework_rate` is **observational only** (subject-convention
23
+ confounding; demoted from evidence). `path_retouch_rate` likewise. Line-level
24
+ retry is v0.6
25
+ - Survival is opt-in (`--survival`); killed if a repo exceeds 120s wall time
26
+ - If a metric is killed, keep origin/attribution as the floor. Never invent a
27
+ composite score to replace it
28
+
29
+ ## Tier definitions
30
+
31
+ Tier 1 (observation status): D expected `not_observed` or pending
32
+ attribution; identity-bearing A expected observed + narratable. Population
33
+ < 20 → no rate, no decile, raw counts only. Tier 2 (rates, only if both
34
+ groups have n ≥ 2 narratable): direction ≥ 0.10, ranges not fully contained,
35
+ Cliff's δ ≥ 0.33 — else `inconclusive_small_n`.
36
+
37
+ ## Verbatim record
38
+
39
+ Verdicts (separated and fail alike) are recorded verbatim in
40
+ `corpus/DISCRIMINANT-*.md`. v2026.09 history: A vs C `separated` / A vs D
41
+ `inconclusive_small_n` / corrective A vs C `fail_tier2`. v2026.11: A vs D
42
+ `separated` (δ 0.9198, n 18/18) / A vs C `fail_tier2` (δ 0.291 — the grown C
43
+ pool reduced separation; criteria were not lowered).
@@ -0,0 +1,38 @@
1
+ # Coverage map — questions → observations (v1, introduced with PR-A)
2
+
3
+ Japanese original: [coverage-map.md](../coverage-map.md). 21 questions
4
+ (adjudicated). ★ = not yet implemented. Every feature addition starts by
5
+ updating this table.
6
+
7
+ ## Hirer/manager questions
8
+
9
+ | # | Question | Answering observations | Status |
10
+ |---|---|---|---|
11
+ | Q1 | Can they actually build? | test co-change · survival · activity days · core period (existing) | Implemented |
12
+ | Q2 | Which domains/technologies? | language timeline ★ · domain paths ★ · test_frameworks · language_composition / dependency_manifests / monorepo markers (PR-A) | Partial |
13
+ | Q3 | Can they work in a team? | cross_author ★ · co_authored_share ★ · pr_flow_share (PR-A) · collaboration_class (PR-A) | Partial |
14
+ | Q4 | Maintainer or fire-and-forget? | self_maintenance ★ · dependency_update_share ★ · post_release_fixes ★ · fix/revert authorship ★ | v0.6a |
15
+ | Q5 | Transparent about AI-era work? | declared_ai_assist ★ × its co-change · generated_or_vendor | v0.6a (PR-B) |
16
+ | Q6 | Do they persist? | tenure · cadence descriptors ★ · release_cadence / actor_turnover (PR-A, repo level) | Partial |
17
+ | Q7 | Founding experience? | founder timing ★ · scaffold ★ · release creation ★ · pr_flow_share (PR-A) | Partial |
18
+ | Q8 | What scale/state of repos? | context_profile v2 (PR-A) · contribution-time repo scale ★ | Partial |
19
+
20
+ ## Engineer questions (same observations, self-attestation reading)
21
+
22
+ | # | Question | Status |
23
+ |---|---|---|
24
+ | E1 | Assets, not volume | survival (implemented) · adopted_creations ★ |
25
+ | E2 | Breadth and depth | language_composition (PR-A) · domain composition ★ · portfolio (v0.6b) |
26
+ | E3 | Can handle others' code | cross_author ★ (PR-B) |
27
+ | E4 | Uses AI with verification | declared_ai_assist × co-change ★ (PR-B) |
28
+ | E5 | Returns for maintenance | self_maintenance ★ · post_release_fixes ★ (PR-B) |
29
+ | E6 | Founded something | founder timing ★ · scaffold ★ · release ★ (PR-B) |
30
+
31
+ ## Not answerable from git (boundary, stated explicitly)
32
+
33
+ Code-review quality · communication · requirements analysis (the first two
34
+ are Grift-side API/human evaluation territory; requirements is permanently
35
+ out). Repo significance/popularity **grades** (permanently excluded — a repo
36
+ grade joins with attribution into a personal grade in one JOIN). Absence of
37
+ private careers / gap contents (outside TEP; norms article 1). "No
38
+ declaration = no AI use" inference (permanently forbidden).
@@ -0,0 +1,22 @@
1
+ # export-v1 — opt-in machine-ingestion output (frozen 2026-08-22)
2
+
3
+ Japanese original: [export-schema.md](../export-schema.md). Field tables are
4
+ mirrored; the Japanese original is authoritative.
5
+
6
+ - `grift analyze <repo> --export <dir>` writes three files:
7
+ `commits.ndjson` (one row per commit: sha/ts/origin(11-class)/
8
+ actor(canonical_id|null)/bot/is_merge/prod+test path counts/
9
+ cochange(bool|null — only production-changing commits carry a value)/
10
+ subject_class(fix|revert|other)), `actors.json` (canonical_id,
11
+ attribution_state, commits, active_days, first_ts/last_ts, core_period —
12
+ attribution and engagement only; per-actor quality metrics are permanently
13
+ excluded), and `export-meta.json` (schema `tep-export-v1`,
14
+ `config_digest`, definition versions, `analysis_scope`)
15
+ - **Raw emails and raw author strings are never exported.** The no-`@`
16
+ property is enforced by tests
17
+ - report and export share `prepare_inputs()` — a single implementation
18
+ - Narrative numbers must come from report.json aggregates (ruling 5);
19
+ consumers recompute from commits.ndjson and abort ingestion on mismatch
20
+ - `config_digest`: sha256 over the canonical JSON of the normalized identity
21
+ + definition versions + flags (full spec in the Japanese original)
22
+ - `--export` never changes the stdout contract
@@ -0,0 +1,32 @@
1
+ # Identity file schema (identity-v1)
2
+
3
+ Japanese original: [identity-schema.md](../identity-schema.md).
4
+
5
+ | Field | Meaning |
6
+ |---|---|
7
+ | `canonical_id` | Durable pseudonymous id (never an email; no personal scorecards) |
8
+ | `emails` | Raw git author emails mapped to this actor (local file only) |
9
+ | `github_login` | Optional |
10
+ | `attribution_state` | `verified` / `claimed` / `inferred` / `unresolved` / `external` / `bot` |
11
+
12
+ ## canonical_id validity (F-P10-3, version-managed)
13
+
14
+ `canonical_id` must **fullmatch**:
15
+
16
+ ```
17
+ ^[a-z0-9][a-z0-9._-]{0,63}$
18
+ ```
19
+
20
+ Lowercase alphanumeric start; then lowercase alphanumerics and `.` `_` `-`;
21
+ length 1–64. **`@`, whitespace, control characters, uppercase, and multi-byte
22
+ characters are invalid** (this pattern — not a blocklist — is what makes the
23
+ export's no-`@` contract data-independent). Duplicates are rejected. The
24
+ regex must match the implementation (`tep_core.identity.CANONICAL_ID_PATTERN`)
25
+ verbatim; `tests/test_identity_validation.py` enforces the doc↔code parity.
26
+
27
+ | Version | Pattern | Introduced |
28
+ |---|---|---|
29
+ | 1 | `^[a-z0-9][a-z0-9._-]{0,63}$` | 2026-08-22 (F-P10-3) |
30
+
31
+ `tenant.email_patterns` are regexes; a match counts as tenant membership
32
+ (state `inferred`). Empty/missing file: `pending_attribution = true`.
@@ -0,0 +1,175 @@
1
+ # How to read grift reports — a plain-language metric guide (v2, 2026-08-23)
2
+
3
+ Japanese original: [metrics-guide.md](../metrics-guide.md).
4
+
5
+ **Audience**: non-engineers. **Principle restated**: every number is a record
6
+ of observed fact, not a grade. Standalone pass/fail decisions and
7
+ person-to-person comparisons are non-compliant with the TEP norms
8
+ ([en/norms.md](norms.md)). What is not written (= not observed) did not
9
+ "not happen." Reference values come from a 117-repository public corpus
10
+ (v2026.11, repo scope) and field measurements (requests / flask / GitHub CLI
11
+ / chalk).
12
+
13
+ ---
14
+
15
+ ## Decile notation (the one definition used throughout)
16
+
17
+ **Decile N = the band containing the top (100−10N)% of values.** Formally,
18
+ with corpus boundaries d₁…d₁₀: **band N = (d(N−1), dN]** (left-open,
19
+ right-closed). Decile 5 = the middle band (50–60% from the bottom); decile
20
+ 10 = the top 10% band.
21
+
22
+ - Example: click's test co-change 0.3178 falls in 0.2894 < 0.3178 ≤ 0.4871,
23
+ hence **decile 9** (the top-20% band)
24
+ - Every band mention in this guide carries a plain-language translation
25
+ (e.g. "decile 7 (the top 30–40% band)")
26
+
27
+ ---
28
+
29
+ ## Full observation inventory (what appears in a report)
30
+
31
+ grift reports consist of three layers. **A layer is a promise about how the
32
+ number may be used.**
33
+
34
+ ### Attribution layer (origin, 11 classes) — "whose/what work is this commit?"
35
+
36
+ | Class | One-line definition |
37
+ |---|---|
38
+ | tenant_unique | Original (non-merge) commits by identity-matched workers |
39
+ | tenant_merge_or_sync | Tenant merge commits (PR flow; repos without upstream lineage) |
40
+ | upstream_sync | Tenant merges that pull upstream (fork-lineage repos) |
41
+ | inherited_upstream | Other people's (upstream-side) commits under fork lineage |
42
+ | tenant_derivative | Judged only with a parent repo provided: work derived from it |
43
+ | external_upstream_contribution | Judged only with a parent repo: work flowing back upstream |
44
+ | template_inherited | Judged only with a template provided: template-derived parts |
45
+ | generated_or_vendor | Commits touching only generated/vendored files |
46
+ | bot | Automation-account commits |
47
+ | ambiguous_origin | Author information missing — cannot be judged |
48
+ | unresolved | Human commits not matching the identity (no names shown) |
49
+
50
+ ### Evidence layer — "changes accompanied by verification"
51
+
52
+ | Observation | One-line definition |
53
+ |---|---|
54
+ | test co-change | Share of production changes whose same commit also changed tests |
55
+ | survival | Share of lines still present after 180 days (`--survival` only) |
56
+
57
+ ### Observational layer — "tendency records (not evidence claims)"
58
+
59
+ | Observation | One-line definition |
60
+ |---|---|
61
+ | corrective rework | Share of commits quickly redoing recently touched paths with fix/revert subjects |
62
+ | path retouch | Share of commits re-touching the same files within 21 days |
63
+ | revert_rate | Share of revert commits |
64
+
65
+ ### Context layer (context profile) — "what kind of repo is this"
66
+
67
+ | Observation | One-line definition |
68
+ |---|---|
69
+ | collaboration_class | solo / small_team / community |
70
+ | lifecycle_stage (+ active_days_180d / days_since_last_human_commit) | Activity density (the class is always printed with the two raw observations) |
71
+ | resolved_human_actors / top_actor_share | Contributor count (upstream/bot excluded) and top-author share (no names) |
72
+ | pr_flow_share | Share of merge (PR) commits |
73
+ | scale / repo_age_days | Size (commits, span, top dirs, tags) and repo age |
74
+ | actor_turnover | Yearly join/leave counts |
75
+ | release_cadence | Tag frequency (releases/year) |
76
+ | conventional_commit_share / issue_link_density | Conventional subjects (`feat:` etc.) / `#N` references |
77
+ | language_composition / dependency_manifests / monorepo_markers | Language mix / dependency files / monorepo signs |
78
+ | test_file_ratio / docs_share | Test/docs path touches |
79
+
80
+ ---
81
+
82
+ ## Evidence: test co-change
83
+
84
+ **Unit**: ratio (0.0–1.0). **Population**: commits that changed production code.
85
+
86
+ **What it measures**: of the commits that changed production code, the share
87
+ that changed tests in the same commit — read from git history, not
88
+ self-reports. Docs-only changes are excluded from the population.
89
+
90
+ **How to read it**:
91
+
92
+ - **High (≥ 0.233 = above the top edge of decile 7, i.e. the top-30% band)**:
93
+ the habit of accompanying production changes with tests is established
94
+ - **Middle (0.109–0.161 = decile 5, the middle band)**: where most public
95
+ repositories sit
96
+ - **Low / 0**: no test substrate, or tests not synchronized. **Not "bad"** —
97
+ docs-centric repos, design phases, and tooling legitimately land low
98
+ - **not observed**: no test framework or directory detected. Cannot be
99
+ measured ≠ zero
100
+
101
+ **Corpus bands (v2026.11, n=68, repo scope)**: decile 5 = (0.1089, 0.1613] ·
102
+ decile 7 = (0.1613, 0.233] · decile 10 = (0.4871, 0.6948]. Field examples:
103
+ GitHub CLI 0.37 · flask 0.20 · chalk 0.18 · requests 0.12 (2026-08).
104
+
105
+ ---
106
+
107
+ ## Observational: corrective rework & path retouch
108
+
109
+ **Not evidence claims.** Corrective rework = share of commits redoing paths
110
+ touched within 21 days with fix/revert subjects; path retouch = share
111
+ re-touching the same files in 21 days. Subject-convention dependent —
112
+ unsuitable for comparisons or pass/fail. Use high values as interview
113
+ questions ("what happened in this period?"), not verdicts. Low values do not
114
+ prove few bugs.
115
+
116
+ **Corpus bands (v2026.11, n=101)**: decile 5 = (0.0683, 0.0972] · deciles
117
+ 9–10 = (0.1904, 0.4818].
118
+
119
+ ---
120
+
121
+ ## Survival (optional)
122
+
123
+ `--survival` only (τ=180d). 1.0-near values = lines mostly still present.
124
+ Reference distribution planned for v2027 — no high/low judgment provided yet.
125
+
126
+ ---
127
+
128
+ ## Context: collaboration & lifecycle
129
+
130
+ - **collaboration_class**: solo (top author ≥ 90%) / small_team (≤5 people) /
131
+ community. Examples: requests 802 / flask 870 / GitHub CLI 722 → community
132
+ - **lifecycle_stage**: always read with the two raw observations.
133
+ active = active_days_180d ≥ 12 / maintained = 3–11 / dormant = ≤ 2.
134
+ Density does **not** distinguish development from maintenance (a
135
+ high-density operational repo is legitimately active); density was chosen
136
+ over recency so bulk housekeeping cannot fake freshness
137
+
138
+ ---
139
+
140
+ ## Related tools (lineage & design differences — no superiority claims)
141
+
142
+ | Name | In one line |
143
+ |---|---|
144
+ | **machuz/eis (Engineering Impact Signal)** | TEP's survival observation adopts EIS-style blame sampling as its lineage; the designs differ in fact: EIS reduces 7 axes with fixed weights to a 0-100 composite score with type labels and team side-by-sides; TEP forbids composite scores, weighting, and grade vocabulary by design (the six prohibitions / norms), and secures trust via discriminant validation, `grift verify`, and no-transmission |
145
+ | DORA | Four delivery-performance metrics and benchmarks; TEP's norm-style usage guidelines follow the DORA pattern |
146
+ | SPACE | A satisfaction/performance/activity/communication/efficiency/flow framework; agrees with TEP that productivity is not one number |
147
+ | GitClear | Commercial code-health (technical debt, rework) research and SaaS; overlapping observations, but TEP never emits person-comparison tables and the CLI transmits nothing |
148
+ | MSR | The academic field of mining software repositories; much of TEP's git-derived tooling applies its findings |
149
+ | bus factor | The degree to which a project stalls when key developers leave; top_actor_share / collaboration_class answer this question observationally |
150
+
151
+ ---
152
+
153
+ ## Common misreadings
154
+
155
+ | Misreading | Correct reading |
156
+ |---|---|
157
+ | "Low co-change = can't write tests" | Docs/design/tooling work lands low legitimately; reading absence as inability is non-compliant (norm 1) |
158
+ | "High corrective rework = buggy" | Subject-convention dependent; neither a bug count nor quality |
159
+ | "dormant = abandoned" | Mature repos with long maintenance cycles exist; reading gaps negatively is non-compliant |
160
+ | "Decile 9 > decile 5 person" | Deciles are positions (bands) among same-scope repos; standalone cutoffs and comparison tables are non-compliant (norm 2) |
161
+ | "No decile = hiding something" | Suppressed by rule when population <20 or corpus n<30 |
162
+
163
+ ---
164
+
165
+ ## When a number is absent (not observed)
166
+
167
+ `no_test_framework_or_directory` (no test substrate) ·
168
+ `insufficient_population` (<20 commits) · `pending_attribution` (identity
169
+ unset) · `scope_is_tenant` (distributions are repo-scope only) ·
170
+ `survival_scan_disabled` (`--survival` only).
171
+
172
+ ---
173
+
174
+ *This is the plain-language companion of docs/report-schema.md (the
175
+ authoritative, machine-validated reference).*