workproof 0.1.3 → 0.3.0

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.
package/README.tr.md CHANGED
@@ -11,9 +11,10 @@
11
11
  </p>
12
12
 
13
13
  workproof, bir git deposunu tek bir yazar için doğrulanabilir bir mühendislik raporuna
14
- çevirir; hiçbir kod göstermeden. Paylaşamadığınız depoda çalıştırırsınız. Okuyan kişi altı
15
- figür, her birinin arkasındaki tam komutu, her birinin neyi gösteremediğini ve bir hash alır.
16
- Aynı depoya sahip herkes `verify` çalıştırıp sayıların yeniden üretilip üretilmediğini görür.
14
+ çevirir; hiçbir kod göstermeden. Paylaşamadığınız depoda çalıştırırsınız. Okuyan kişi on üç
15
+ figür, her birinin arkasındaki tam komutu, her birinin neyi gösteremediğini ve herkesin
16
+ çevrimdışı yeniden hesaplayabileceği bir hash alır. Bir verimlilik ölçütü değildir: neyin
17
+ hayatta kaldığını ve neye dokunulduğunu ölçer, her sayının altına kendi sınırlarını yazar.
17
18
 
18
19
  ## 30 saniye
19
20
 
@@ -23,148 +24,338 @@ npx workproof
23
24
  ```
24
25
 
25
26
  Bu, `workproof-report.md` (bir özgeçmişe, portfolyoya, vize başvurusuna yapıştırın) ve
26
- `workproof-report.json` (araçlar ve doğrulama için) dosyalarını yazar. Birinin raporunu
27
- kontrol etmek için:
27
+ `workproof-report.json` (araçlar ve doğrulama için) dosyalarını yazar. Aşağıdaki örneğin
28
+ arkasındaki gerçek çalıştırma, [langchain-ai/openwiki](https://github.com/langchain-ai/openwiki)
29
+ deposunun `1e6d54c` sürümünde:
28
30
 
29
31
  ```
30
- npx workproof verify workproof-report.json
32
+ $ npx workproof --author "Colin Francis" --sample 5
33
+ fingerprint key 9dc900a6227a1faaaa17d774565afbf3 (keep it to compare reports or to verify the fingerprint; it is not stored)
34
+ openwiki: reading history...
35
+ openwiki: 369 commits read
36
+ openwiki: blaming files (1 in 5 sample)...
37
+ openwiki: blamed 123 of 547 files
38
+ wrote workproof-report.md and workproof-report.json in 2.7s
39
+
40
+ $ npx workproof check workproof-report.json
41
+ schema ok
42
+ hash ok 63d4fd1373b06b090086a653d52dfed234edcf35645bce3a34137a0447049355
43
+
44
+ $ npx workproof verify workproof-report.json --fingerprint-key 9dc900a6227a1faaaa17d774565afbf3
45
+ schema ok
46
+ hash ok 63d4fd1373b06b090086a653d52dfed234edcf35645bce3a34137a0447049355
47
+ openwiki: fingerprint ok
48
+ all figures reproduce
31
49
  ```
32
50
 
51
+ `check` için yalnızca JSON gerekir. `verify` için depo gerekir.
52
+
33
53
  ## Bir rapor neye benzer
34
54
 
35
- Bu, [langchain-ai/openwiki](https://github.com/langchain-ai/openwiki) deposunun `1e6d54c`
36
- sürümünde bir bakımcı için 5 Eylül 2026'da `--author "Colin Francis" --sample 5` ile alınan
37
- gerçek çıktıdır; yollar ve e-postalar gizli (varsayılanlar):
55
+ openwiki deposunun `1e6d54c` sürümünde bir bakımcı için 5 Eylül 2026'da
56
+ `--author "Colin Francis" --sample 5` ile alınan gerçek çıktı; yollar ve e-postalar gizli
57
+ (varsayılanlar). Tam raporda her figürün altında git komutuyla `How:` ve
58
+ `What this cannot show:` satırları da vardır; burada yer için kesildi.
38
59
 
39
60
  ```
40
61
  ## openwiki
41
62
 
42
- HEAD 1e6d54cdfeec · fingerprint 82aa401bbba056f1 · identities: Colin Francis
63
+ HEAD 1e6d54cdfeec · fingerprint a1b19a27aab4a577 · identities: Colin Francis
64
+
65
+ excluded 64 bot commits and 1 generated, vendored or lock file (2.2% of lines added)
43
66
 
44
67
  ### Tenure window
45
68
  2026-07-06 to 2026-09-03 (60 days)
46
69
 
47
70
  ### Share of commits in tenure
48
- 71 of 295 non-merge commits, 24.1%
71
+ 71 of 233 non-merge commits, 30.5%
49
72
 
50
73
  ### Cadence
51
74
  9 active weeks of 9, 7.9 commits per active week, longest streak 9 weeks
52
75
  1 of 21 release tags in tenure
53
76
 
54
77
  ### Footprint
55
- 694 files touched
78
+ 693 files touched
56
79
  16 directories with a commit share at or above the threshold (paths hidden; run with --paths)
57
- languages by lines added: TypeScript 80.4%, JSON 9.6%, Markdown 7.0%, JavaScript 1.6%, YAML 1.4%
80
+ languages by lines added: TypeScript 81.4%, JSON 9.7%, Markdown 7.1%, JavaScript 1.6%, YAML 0.2%
81
+
82
+ ### Test-file changes and documents created
83
+ 393 of 656 test-file changes, 59.9%
84
+ 101 documents created
85
+
86
+ ### Files authored
87
+ 455 of 555 files alive at HEAD, 82.0% (degree of authorship)
88
+
89
+ ### Major-contributor components
90
+ major contributor in 59 of 65 directories (at least 5% of commits)
91
+
92
+ ### Commit size
93
+ median 166 lines, 90th percentile 9,234, 6 commits over 10,000 lines
58
94
 
59
- ### Tests and documentation
60
- 393 of 657 test-file changes, 59.8%
61
- 116 documents authored
95
+ ### Co-authored commits
96
+ 119 commits by others naming the author in a Co-authored-by trailer
97
+
98
+ ### Absence factor
99
+ 4 authors cover half the commits; the author ranks 1 of 71 by commit count
100
+
101
+ ### AI-assisted commits
102
+ 1 commit declares an AI tool in a trailer, 1.4% of the author's commits
62
103
 
63
104
  ### Surviving lines at HEAD
64
- 23,317 of 33,038 surviving lines, 70.6% (files 123/548, sample 1 in 5)
65
- ```
105
+ 23,317 of 33,038 surviving lines, 70.6% (files 123/547, sample 1 in 5)
66
106
 
67
- Her figürün altında rapor iki satır daha basar: onu üreten git komutuyla `How:` ve
68
- `What this cannot show:`. Son bölüm `Integrity`: rapor hash'i ve depo parmak izi.
107
+ ### Survival by cohort
108
+ 2026: 23,317 lines
109
+ ```
69
110
 
70
- İki payı birlikte okuyun. Bu kişi penceresindeki commit'lerin %24,1'ini ve hâlâ yaşayan
71
- satırların %70,6'sını yazmış. Bir commit sayısı onu küçük bir katkıcı olarak adlandırırdı. Bu
72
- boşluk, iki yönde de, bir raporun birinin işi hakkında söyleyebileceği en dürüst şeydir.
111
+ İlk satırı ve iki payı birlikte okuyun. Altmış dört bot commit'i daha hiçbir şey
112
+ sayılmadan paydadan çıktı; bu, aynı kişinin eski sürümde %24,1 görünen commit payını
113
+ %30,5'e taşıdı. Penceresindeki insan commit'lerinin %30,5'ini ve hâlâ yaşayan satırların
114
+ %70,6'sını yazmış. Tek başına commit sayısı onu yetmiş bir katkıcıdan biri diye
115
+ adlandırırdı. Bu boşluk, iki yönde de, bir raporun birinin işi hakkında söyleyebileceği en
116
+ dürüst şeydir.
73
117
 
74
118
  ## Ne ölçer
75
119
 
76
- Altı figürün hepsi git'ten gelir, başka hiçbir şeyden değil.
120
+ Her figür git'ten gelir, başka hiçbir şeyden değil. Bot commit'leri ile üretilmiş, vendored,
121
+ kilit ve snapshot dosyaları hiçbir figür hesaplanmadan önce çıkarılır (bkz. Oyun ve yanlılık).
77
122
 
78
123
  | figür | ne | neyi gösteremez |
79
124
  |---|---|---|
80
125
  | Görev penceresi | yazarın ilk ve son commit'i, ya da `--since/--until` | ilk commit'ten önceki ya da sonuncudan sonraki iş |
81
- | Commit payı | penceredeki merge dışı commit'ler içinde yazarın merge dışı commit'leri | neyin sağ kaldığı; bir yazım hatası ile bir alt sistem aynı sayılır |
126
+ | Commit payı | penceredeki insan merge dışı commit'leri içinde yazarınkiler | neyin sağ kaldığı; bir yazım hatası ile bir alt sistem aynı sayılır |
82
127
  | Tempo | aktif haftalar, aktif hafta başına commit, en uzun seri, penceredeki sürüm etiketleri ve yazarınkiler | bir commit'lik hafta ile kırk commit'lik hafta ikisi de aktif sayılır |
83
- | Ayak izi | dokunulan dosyalar, commit payı eşiğin üstündeki dizinler, eklenen satıra göre diller | üretilmiş ve vendored dosyalar commit'leyeni şişirir |
84
- | Testler ve dokümanlar | test dosyası değişikliklerinin payı, yazılan dokümanlar | test vakaları, kapsam ya da bir dokümanın kalitesi |
85
- | Hayatta kalan satırlar | HEAD'de yaşayan satırların payı, deterministik dosya örneği üzerinde `git blame -w -M`, [surviving-lines](https://github.com/Bubblegunn/surviving-lines) ile | liyakat; bilerek silinen kod kimseye sayılmaz |
128
+ | Ayak izi | dokunulan dosyalar, commit payı eşiğin üstündeki dizinler, eklenen satıra göre diller | dışlama listelerinin kaçırdığı her şey yine sayılır |
129
+ | Test dosyası değişiklikleri ve oluşturulan dokümanlar | test dosyası değişikliklerinin payı; en eski commit'i yazara ait `.md`, `.mdx`, `.rst` dosyaları | test vakaları, kapsam ya da bir dokümanın kalitesi |
130
+ | Yazarı olunan dosyalar | HEAD'de yaşayan ve yazarın yazarlık derecesinin (Avelino ve ark.) en az 3,293 ve dosya maksimumunun %75'inin üstünde olduğu dosyalar | katsayılar başka sistemlerde uydurulmuştur; ilk yazarlık sonraki yeniden yazımlardan ağır basar |
131
+ | Ana katkıcı olunan bileşenler | yazarın commit'lerin en az %5'ine sahip olduğu dizinler (Bird ve ark.) | commit teması bir yazım hatası ile bir alt sistemi aynı görür |
132
+ | Commit büyüklüğü | commit başına eklenen artı silinen satırın medyanı ve 90. yüzdeliği; 10.000 satırı aşan commit'ler | büyüklük değer değildir; import'lar ve biçimlendirmeler 90. yüzdeliği belirler |
133
+ | Ortak yazarlı commit'ler | başkalarının `Co-authored-by` satırında yazarı andığı commit'ler | bu satırları merge eden yazar; eksik ya da yanlış olabilir |
134
+ | Yokluk faktörü | commit'lerin yarısını kapsayan en küçük yazar kümesi (CHAOSS) ve yazarın sırası | birleştirilmemiş birden çok e-posta birden çok kişi sayılır |
135
+ | Yapay zeka destekli commit'ler | satırlarında ya da adında Claude, Cursor, Copilot, Codex, Gemini, ChatGPT, Aider, Devin ya da Windsurf beyan eden yazar commit'leri | eksik bir beyan, yardımsız yazıldığının kanıtı değildir |
136
+ | Hayatta kalan satırlar | HEAD'de yaşayan satırların payı; deterministik dosya örneği üzerinde tek `git blame -w -M` geçişi, `.git-blame-ignore-revs` dikkate alınır | liyakat; bilerek silinen kod kimseye sayılmaz |
137
+ | Yıla göre hayatta kalma | yazarın hayatta kalan satırları, onlara son dokunan commit'in yılına göre | yeni yıllar ölmek için daha az zaman bulmuştur |
86
138
 
87
139
  ## Doğrulama nasıl çalışır
88
140
 
89
- - JSON deponun HEAD'ini, bir **parmak izi** (kök commit ve normalleştirilmiş remote adresinin
90
- sha256'sı; depo adı verilmeden tanımlanır), kullanılan kimlik adlarını, `surviving-lines`
91
- sürümünü, her parametreyi ve parametreler ile figürlerin bir **hash**'ini taşır.
92
- - `workproof verify report.json` her figürü gösterdiğiniz depoda yeniden hesaplar ve bir
93
- eşleşme tablosu basar. HEAD rapordan beri ilerlediyse bunu söyler ve hangi figürlerin
94
- değiştiğini gösterir.
95
- - Bir işe alım yöneticisinin iki şeye ihtiyacı vardır: rapor ve depoya okuma erişimi (ya da
96
- şirket içinde tek komutu çalıştıracak bir çalışan). Depodan hiçbir şey çıkmaz.
141
+ Üç komut; okuyanın elinde olması gerekenlere göre artan sırada.
142
+
143
+ - `workproof check report.json` için yalnızca dosya gerekir. Belgeyi
144
+ [schema/report.schema.json](schema/report.schema.json) ile doğrular ve hash'i yeniden
145
+ hesaplar: parametreler ile figürlerin [RFC 8785](https://www.rfc-editor.org/rfc/rfc8785)
146
+ kanonik JSON'u üzerinde sha256. Değiştirilmiş bir figür `hash mismatch: report says X,
147
+ content hashes to Y` basar ve 1 ile çıkar. Git yok, yok.
148
+ - `workproof verify report.json` için depo gerekir. Önce `check` çalıştırır, parmak izini
149
+ karşılaştırır (`--fingerprint-key` ile; onsuz karşılaştırmayı atlar ve bunu söyler),
150
+ HEAD'i karşılaştırır, sonra her figürü yeniden hesaplayıp farkları basar. Başka bir depodan
151
+ gelen rapor parmak izinde durur. HEAD rapordan beri ilerlediyse bunu söyler ve hangi
152
+ figürlerin değiştiğini gösterir.
153
+ - `workproof attest report.json`, konusu rapor hash'i olan bir [in-toto](https://in-toto.io)
154
+ v1 beyanı olarak `report.intoto.json` yazar; beyanın yüklemi araç sürümünü, parametreleri,
155
+ HEAD'i, anahtarlı parmak izini, git sürümünü ve dışlama sayılarını taşır, başka hiçbir
156
+ şeyi: figür yok, remote yok, yol yok, e-posta yok. `--local ~/.ssh/id_ed25519` beyanı
157
+ `ssh-keygen -Y sign` ile `workproof` ad alanında imzalar; ayrık imzayı ve bir DSSE zarfını
158
+ yazar. Açık anahtarınıza sahip herkes şöyle kontrol eder:
159
+
160
+ ```
161
+ ssh-keygen -Y verify -f allowed_signers -I you@example.com -n workproof \
162
+ -s workproof-report.intoto.json.sig < workproof-report.intoto.json
163
+ ```
164
+
165
+ `allowed_signers` tek satırdır, `you@example.com ssh-ed25519 AAAA...`; anahtar,
166
+ GitHub'ın `https://github.com/<you>.keys` adresinde sunduğu anahtardır.
167
+
168
+ GitHub Action'da `attest: "true"` aynı beyanı [Sigstore](https://www.sigstore.dev) ile
169
+ anahtarsız imzalar: cosign SHA ile sabitlenmiş bir action'dan kurulur ve
170
+ `cosign attest-blob`, `workproof-report.sigstore.json` dosyasını yazar. Okuyan şöyle
171
+ doğrular:
172
+
173
+ ```
174
+ cosign verify-blob-attestation workproof-report.json \
175
+ --bundle workproof-report.sigstore.json \
176
+ --type https://workproof.dev/attestation/v1 \
177
+ --certificate-oidc-issuer https://token.actions.githubusercontent.com \
178
+ --certificate-identity-regexp '^https://github.com/<owner>/<repo>/'
179
+ ```
180
+
181
+ Bunun kanıtladığı: bu JSON tam olarak o depoda, o commit'te çalışan bir iş akışı tarafından
182
+ üretildi ve o zamandan beri değişmedi. Kanıtlamadığı: figürlerin doğru olduğu (bunun için
183
+ `verify` çalıştırın) ya da iş akışının hangi depoyu çektiği konusunda dürüst olduğu. Açmadan
184
+ önce iki uyarı. Fulcio sertifikası iş akışının çalıştığı depoyu adıyla anar ve Rekor
185
+ şeffaflık günlüğü herkese açık ve kalıcıdır. Özel kod için belgelenen kalıp, raporu tutan ve
186
+ attest adımını çalıştıran küçük bir açık depodur; böylece özel deponun adı günlüğe hiç
187
+ ulaşmaz.
97
188
 
98
189
  ## Gizlilik
99
190
 
100
191
  - Kod içeriği, asla. Araç `git log --numstat` ve `git blame` okur ve sayılar üretir.
101
192
  - Varsayılan olarak dosya yolu yok. `--paths`, yapılandırılan `--depth` (varsayılan 2)
102
193
  derinliğinde dizin adları ekler, dosya asla.
103
- - Varsayılan olarak e-posta adresi yok. `--emails` ekler; onsuz, yazdığınız `--author`
104
- bile saklanan parametrelerde `(email hidden)` ile değiştirilir.
194
+ - Varsayılan olarak e-posta adresi yok. `--emails` ekler; onsuz, yazdığınız `--author` bile
195
+ saklanan parametrelerde `(email hidden)` ile değiştirilir. GitHub noreply adresleri
196
+ (`<id>+<login>@users.noreply.github.com`) bayrak olsun olmasın asla yazılmaz, çünkü
197
+ kullanıcı adı adresin içindedir.
198
+ - Konu dışı kişilerin adları asla yazılmaz. Yokluk faktörü figürü yalnızca sayı taşır.
199
+ - Parmak izi, rapor başına üretilen 16 baytlık bir anahtarla `HMAC-SHA256(anahtar, kök commit
200
+ + remote)` değeridir. Anahtar bir kez basılır ve hiçbir yerde saklanmaz; böylece açık bir
201
+ depo parmak izinden geri bulunamaz. Aynı deponun raporlarında anahtarı yeniden kullanmak
202
+ için `--fingerprint-key` verin.
105
203
  - İsteğe bağlı anlatı (`--narrate`) figürleri, yalnızca figürleri, seçtiğiniz bir model uç
106
- noktasına gönderir (`WORKPROOF_API_URL`, `WORKPROOF_API_KEY`, `WORKPROOF_MODEL`;
107
- OpenAI uyumlu ya da Anthropic). Paragraf "Generated narrative (not verified)" başlığı
108
- altına eklenir ve hash'in dışındadır.
204
+ noktasına gönderir (`WORKPROOF_API_URL`, `WORKPROOF_API_KEY`, `WORKPROOF_MODEL`; OpenAI
205
+ uyumlu ya da Anthropic). Paragraf "Generated narrative (not verified)" başlığı altına
206
+ eklenir ve hash'in dışındadır.
109
207
 
110
208
  ## Seçenekler
111
209
 
112
210
  ```
113
211
  workproof [options] [--repo <dir>]...
114
- workproof verify <report.json> [--repo <dir>]...
115
-
116
- --author <email|name> identity to report on (repeatable; default: git config user.email)
117
- --repo <dir> repository to analyse (repeatable; several produce one combined report)
118
- --since / --until override the tenure window
119
- --sample <n> blame every n-th file (default: 1; 7 for very large repositories)
120
- --max-commits <n> read only the newest n commits (escape hatch for enormous histories)
121
- --depth <n> directory depth for ownership (default: 2)
122
- --paths include directory paths
123
- --emails include author emails
124
- --narrate append a model-written paragraph
125
- --out <basename> output basename (default: workproof-report)
126
- --json print the JSON to stdout instead of writing files
212
+ workproof check <report.json>
213
+ workproof verify <report.json> [--repo <dir>]... [--fingerprint-key <hex>]
214
+ workproof attest <report.json> [--local <ssh-key>]
215
+
216
+ --author <email|name> identity to report on (repeatable; default: git config user.email)
217
+ --repo <dir> repository to analyse (repeatable; several produce one combined report)
218
+ --since / --until override the tenure window
219
+ --sample <n> blame every n-th file (default: 1; 7 for very large repositories)
220
+ --seed <text> salt for the blame file sample
221
+ --exclude <glob> also drop files matching the glob (repeatable)
222
+ --no-exclusions count bot commits and generated, vendored, lock and snapshot files
223
+ --copies pass -C to git blame so copied lines follow their origin
224
+ --ignore-revs-file <f> blame ignore-revs file (default: .git-blame-ignore-revs at the root)
225
+ --fingerprint-key <hex> reuse a fingerprint key so two reports of one repository match
226
+ --max-commits <n> read only the newest n commits (escape hatch for enormous histories)
227
+ --depth <n> directory depth for ownership (default: 2)
228
+ --paths include directory paths
229
+ --emails include author emails
230
+ --narrate append a model-written paragraph
231
+ --badge also write <out>.badge.json, a shields.io endpoint document
232
+ --out <basename> output basename (default: workproof-report)
233
+ --format <mode> write markdown, json, or both (default: both); json prints to stdout
234
+ --json same as --format json
127
235
  ```
128
236
 
129
237
  Depodaki bir `.mailmap`, bir yazarın birden çok adresini birleştirir. Geçmiş okunurken ve
130
- dosyalar blame'lenirken ilerleme satırları stderr'e gider, uzun bir çalıştırma canlı
131
- görünür; yüz binlerce commit'lik bir geçmişte `--max-commits` okumayı sınırlar ve rapor bunu
132
- kaydeder.
238
+ dosyalar blame'lenirken ilerleme satırları stderr'e gider. Her git çağrısı
239
+ `diff.renames=true`, `diff.algorithm=myers`, `diff.indentHeuristic=true` ve
240
+ `core.autocrlf=false` ile çalışır; rapor git sürümünü, blame bayraklarını, ignore-revs
241
+ dosyasını ve tohumu kaydeder. Böylece farklı varsayılanlara sahip iki makine aynı sonucu verir
242
+ ve `verify` bir ortam farkını bir düzenlemeden ayırt edebilir.
243
+
244
+ ## Rozet
133
245
 
134
- ## Oyunlanabilir mi?
246
+ `--badge`, raporun yanına [shields.io endpoint biçiminde](https://shields.io/badges/endpoint-badge)
247
+ `workproof-report.badge.json` yazar:
135
248
 
136
- Kısmen; rapor, oyunun görünmesi için tasarlandı.
249
+ ```json
250
+ { "schemaVersion": 1, "label": "workproof", "message": "70.6% surviving lines · 60 days", "color": "1f3fbf" }
251
+ ```
137
252
 
138
- - Commit spam'i commit payını ve tempoyu oynatır, başka bir şeyi değil. Hayatta kalan satırlar
139
- HEAD'deki `git blame`'den gelir; bin boş commit sıfır hayatta kalan satır ekler ve iki pay
140
- yan yana basılır.
141
- - Bir kütüphaneyi vendor'lamak eklenen satırları şişirir. Diller figürü ve (`--paths` ile)
142
- sahiplenilen dizin listesi o satırların nereye düştüğünü gösterir; inceleyen, satırların
143
- çoğunu `vendor` ya da `node_modules` adlı bir dizinin sahiplendiğini görür.
144
- - Yazarlığı değiştirmek için geçmişi yeniden yazmak kök commit'i ya da HEAD'i değiştirir;
145
- eski bir rapordaki parmak izi ve HEAD eşleşmez olur.
146
- - Doğrulayıcı aynı depoya karşı çalışır. Yeniden üretilemeyen bir rapor, hiç rapor
147
- olmamasından kötüdür; aracın dayandığı teşvik budur.
253
+ Açık bir depoya (portfolyonuz, bir gist) commit'leyin ve shields'ı ham URL'ye yönlendirin:
254
+
255
+ ```
256
+ ![workproof](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/<you>/<repo>/main/workproof-report.badge.json&style=flat-square)
257
+ ```
258
+
259
+ Rozet bir iddiadır, kanıt değil. JSON raporu yanında tutun; okuyanın doğruladığı rapordur,
260
+ rozet yalnızca onu bulma yoludur.
261
+
262
+ ## GitHub Action
263
+
264
+ Depo, bir checkout üzerinde workproof'u çalıştıran, `check` yapan, in-toto beyanını yazan ve
265
+ pull request'e başlık figürleriyle tek bir yapışkan yorum bırakan bir composite action
266
+ içerir. `fetch-depth: 0` zorunludur, yoksa figürlerin geldiği geçmiş eksiktir; `author`
267
+ zorunludur, çünkü bir GitHub kullanıcı adı commit kimliklerine güvenilir biçimde eşlenmez.
268
+
269
+ ```yaml
270
+ name: workproof
271
+ on:
272
+ pull_request:
273
+ permissions:
274
+ contents: read
275
+ pull-requests: write
276
+ id-token: write # only for attest: "true"
277
+ jobs:
278
+ report:
279
+ runs-on: ubuntu-latest
280
+ steps:
281
+ - uses: actions/checkout@v4
282
+ with:
283
+ fetch-depth: 0
284
+ - uses: actions/setup-node@v4
285
+ with:
286
+ node-version: 22
287
+ - uses: Bubblegunn/workproof@v0
288
+ with:
289
+ author: ada@example.com
290
+ sample: "1"
291
+ attest: "false"
292
+ ```
148
293
 
149
- Yakalayamadığı: gerçekten büyük ama düşük değerli bir katkı. Referanslar bunun içindir.
294
+ `@v0`, bakımcının her 0.x sürümünde en yeniye taşıdığı hareketli bir etikettir; action'ın
295
+ altınızda hiç değişmemesini istiyorsanız bir commit SHA'sına sabitleyin. Girdiler kabuğa
296
+ ortam değişkenleriyle ulaşır, betiğe hiçbir zaman yerleştirilmez. Yorum sonraki push'larda
297
+ yerinde güncellenir (bir işaret taşır) ve `workproof-report.json`, `.intoto.json` ile
298
+ `.predicate.json` bir `upload-artifact` adımı için çalışma alanında kalır. Yalnızca dosyaları
299
+ üretmek için `comment: "false"` verin.
300
+
301
+ ## Oyun ve yanlılık
302
+
303
+ Kısmen oyunlanabilir; rapor, oyunun görünmesi için tasarlandı. Bir sayıya güvenmeden önce
304
+ okuyanın bilmesi gereken on üç şey.
305
+
306
+ 1. Commit spam'i commit payını ve tempoyu oynatır, başka bir şeyi değil. Hayatta kalan
307
+ satırlar HEAD'deki `git blame`'den gelir; bin boş commit sıfır hayatta kalan satır ekler
308
+ ve iki pay yan yana basılır.
309
+ 2. Bir kütüphaneyi vendor'lamak eklenen satırları şişirir. Vendored dizinler, kilit
310
+ dosyaları, snapshot'lar, küçültülmüş varlıklar ve üretilmiş çıktılar yerleşik listelerle ve
311
+ `.gitattributes` içindeki `linguist-generated` ya da `linguist-vendored` ile dışlanır;
312
+ rapor ne kadarının dışlandığını basar. Listelerin kaçırdığı yine sayılır; `--exclude` onu
313
+ kapsar ve glob parametrelere kaydedilir.
314
+ 3. Bot commit'leri (`dependabot[bot]`, `renovate[bot]`, GitHub uygulama kimlikleri) her
315
+ paydadan çıkar. İnsan gibi adı olan bir bot tespit edilmez; sezgisel yöntem yoktur.
316
+ 4. Bir biçimlendirme commit'i, `.git-blame-ignore-revs` içinde listelenmediyse dokunduğu her
317
+ satırı alır. Rapor hangi dosyanın kullanıldığını ya da hiç kullanılmadığını söyler.
318
+ 5. `--since`, `--until`, `--sample`, `--seed` ve `--exclude` hepsi göze hoş görünen bir
319
+ pencere ya da örnek seçme yoludur. Her biri parametrelerde saklanır ve hash'lenir.
320
+ 6. Yazarlığı değiştirmek için geçmişi yeniden yazmak kök commit'i ya da HEAD'i değiştirir;
321
+ eski bir rapordaki parmak izi ve HEAD eşleşmez olur.
322
+ 7. Yazarlık derecesi başka sistemlerde uydurulmuş katsayılar kullanır. İlk yazarlık sonraki
323
+ yeniden yazımlardan ağır basar; başkasının sıfırdan yeniden yazdığı bir dosya ilk yazarında
324
+ kalabilir.
325
+ 8. `Co-authored-by` satırlarını merge eden yazar. Eksik, yanlış ya da bir squash-merge
326
+ arayüzünün eklediği olabilir; satırsız eşli çalışma görünmezdir.
327
+ 9. Yapay zeka destekli demek, bir satır ya da yazar adı öyle demiş demektir. Satırın
328
+ yokluğu yardımsız yazıldığının kanıtı değildir; blame her satırı insana yazar, dolayısıyla
329
+ yazarlık artık anlamayı ima etmez. Bu commit'ler başka hiçbir figürden dışlanmaz.
330
+ 10. Yokluk faktörü e-posta adresi sayar. Birleştirilmemiş birden çok adresi olan bir yazar
331
+ birden çok kişi sayılır; bir `.mailmap` ekleyin.
332
+ 11. Oluşturulan dokümanlar, en eski commit'i yazara ait dosyaları sayar. Tek satırlık bir
333
+ README ile bir tasarım belgesi aynı sayılır.
334
+ 12. Test dosyası değişiklikleri, test yollarıyla eşleşen dosya değişiklikleridir; test
335
+ vakası, assertion ya da kapsam değildir.
336
+ 13. Doğrulayıcı aynı depoya karşı çalışır. Yeniden üretilemeyen bir rapor, hiç rapor
337
+ olmamasından kötüdür; aracın dayandığı teşvik budur. Hiçbir figürün yakalamadığı:
338
+ gerçekten büyük ama düşük değerli bir katkı. Referanslar bunun içindir.
150
339
 
151
340
  ## Adaylar için
152
341
 
153
342
  Gurur duyduğunuz ve gösteremediğiniz her depoda çalıştırın. Markdown'ı portfolyonuza, zaten
154
343
  yazacağınız cümlenin ("frontend'i ben yaptım") yanına koyun ve sayılar cümleyi taşısın. JSON'u
155
- saklayın; inceleyenin doğruladığı odur.
344
+ ve parmak izi anahtarını saklayın; inceleyenin doğruladığı JSON'dur.
156
345
 
157
346
  ## İşe alanlar için
158
347
 
159
- JSON'u ve adayın eski şirketinden birinin üzerinde `npx workproof verify` çalıştırmasını
160
- isteyin. Tablo ya yeniden üretilir ya üretilmez. Depo ilerlediyse araç hangi figürlerin
161
- değiştiğini ve bunun neden beklendiğini söyler.
348
+ JSON'u isteyin. `npx workproof check` bir saniyede düzenlenip düzenlenmediğini söyler. Sonra
349
+ adayın eski şirketinden birinin üzerinde `npx workproof verify` çalıştırmasını isteyin. Tablo
350
+ ya yeniden üretilir ya üretilmez. Depo ilerlediyse araç hangi figürlerin değiştiğini ve bunun
351
+ neden beklendiğini söyler.
162
352
 
163
353
  ## Vize ve göç kanıtı için
164
354
 
165
355
  workproof, en güçlü işin özel depolarda olduğu ve "bana güven"in kanıt sayılmadığı bir
166
356
  Birleşik Krallık Global Talent başvurusu için yapıldı. Bir rapor, yöntemi ekli bir ölçümdür,
167
- bir tavsiye değil; orada bulunmuş insanların mektuplarıyla birlikte kullanın.
357
+ bir tavsiye değil; orada bulunmuş insanların mektuplarıyla ve okuyan depoya ulaşamıyorsa bir
358
+ attestation ile birlikte kullanın.
168
359
 
169
360
  ## Bunu yapmaz
170
361
 
@@ -175,8 +366,10 @@ Hayatta kalmayı ve etkinliği ölçer; kaliteyi, incelemeyi, tasarımı ya da m
175
366
 
176
367
  Yöntem
177
368
  [How to show engineering ownership when the repositories are private](https://efe-genc-portfolio.vercel.app/writing/showing-ownership-private-repositories/)
178
- yazısında anlatılıyor. Blame örneklemesi workproof'un tek bağımlılığı olan
179
- [surviving-lines](https://github.com/Bubblegunn/surviving-lines) paketidir.
369
+ yazısında anlatılıyor. Örnekleyici ve glob yardımcıları workproof'un tek bağımlılığı olan
370
+ [surviving-lines](https://github.com/Bubblegunn/surviving-lines) paketinden gelir. Yazarlık
371
+ derecesi Avelino, Hora ve Valente (2016), ana katkıcı Bird ve ark. (2011), yokluk faktörü
372
+ CHAOSS Contributor Absence Factor tanımını izler.
180
373
 
181
374
  ## Geliştirme
182
375
 
@@ -11,6 +11,18 @@ export interface Params {
11
11
  emails: boolean;
12
12
  /** Escape hatch for enormous histories: read only the newest n commits. */
13
13
  maxCommits?: number;
14
+ /** Drop bot commits and generated, vendored, lock and snapshot files (default true). */
15
+ exclusions?: boolean;
16
+ /** Extra globs to drop, with surviving-lines semantics. */
17
+ exclude?: string[];
18
+ /** Salt for the blame file sample. */
19
+ seed?: string;
20
+ /** Pass -C to git blame so copied lines follow their origin. */
21
+ copies?: boolean;
22
+ /** A blame ignore-revs file other than .git-blame-ignore-revs at the root. */
23
+ ignoreRevsFile?: string;
24
+ /** Key for the repository fingerprint; generated per report when absent. */
25
+ fingerprintKey?: string;
14
26
  }
15
27
  export interface AnalyseHooks {
16
28
  /** Called with short status lines while history is read and files are blamed. */
@@ -20,13 +32,38 @@ export interface RepoReport {
20
32
  name: string;
21
33
  head: string;
22
34
  fingerprint: string;
35
+ /** True when the fingerprint is an HMAC under a key the report does not carry. */
36
+ fingerprintKeyed?: boolean;
23
37
  identity: {
24
38
  emails: string[];
25
39
  names: string[];
26
40
  count: number;
27
41
  };
42
+ /** What the figures were computed with, so a verifier can tell a drift from an edit. */
43
+ environment: {
44
+ git: string;
45
+ blame: string[];
46
+ ignoreRevs: string | null;
47
+ seed: string;
48
+ };
49
+ /** What left the denominators before any figure was computed. */
50
+ excluded: {
51
+ botCommits: number;
52
+ files: number;
53
+ linesAddedShare: number;
54
+ enabled: boolean;
55
+ };
28
56
  figures: Figure<any>[];
29
57
  }
30
- /** sha256 of the root commit and the normalised remote: identifies a repository without naming it. */
31
- export declare function fingerprint(root: string, remote: string): string;
58
+ /** A fresh 16-byte fingerprint key as hex. Printed once, stored nowhere. */
59
+ export declare const newFingerprintKey: () => string;
60
+ /** GitHub noreply addresses carry the login in the local part, so they are never written out. */
61
+ export declare const publicEmail: (email: string) => string;
62
+ /**
63
+ * Identifies a repository without naming it. Keyed: HMAC-SHA256 under a per-report key of
64
+ * the root commit and the normalised remote, so a reader cannot look a public repository
65
+ * up from its fingerprint. Unkeyed (no key given): plain sha256, kept for callers that
66
+ * want a stable public identifier.
67
+ */
68
+ export declare function fingerprint(root: string, remote: string, key?: string): string;
32
69
  export declare function analyseRepo(cwd: string, params: Params, hooks?: AnalyseHooks): Promise<RepoReport>;