docs-drift 0.1.0__py3-none-any.whl

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.
Files changed (131) hide show
  1. docs_drift/__init__.py +7 -0
  2. docs_drift/analysis.py +52 -0
  3. docs_drift/baseline.py +70 -0
  4. docs_drift/cli.py +871 -0
  5. docs_drift/collaboration.py +282 -0
  6. docs_drift/config.py +113 -0
  7. docs_drift/docs/__init__.py +1 -0
  8. docs_drift/docs/defaults.py +250 -0
  9. docs_drift/docs/discover.py +172 -0
  10. docs_drift/docs/extract_blocks.py +596 -0
  11. docs_drift/docs/extract_inline.py +561 -0
  12. docs_drift/docs/pipeline.py +234 -0
  13. docs_drift/docs/preprocess.py +71 -0
  14. docs_drift/docs/sections.py +247 -0
  15. docs_drift/errors.py +119 -0
  16. docs_drift/fix/__init__.py +1 -0
  17. docs_drift/fix/edits.py +124 -0
  18. docs_drift/fix/model.py +139 -0
  19. docs_drift/fix/rules.py +232 -0
  20. docs_drift/git_safety.py +35 -0
  21. docs_drift/graph/queries/evidence_path.cypher +6 -0
  22. docs_drift/history.py +412 -0
  23. docs_drift/history_cache.py +62 -0
  24. docs_drift/ids.py +50 -0
  25. docs_drift/index/__init__.py +211 -0
  26. docs_drift/index/base.py +239 -0
  27. docs_drift/index/config.py +185 -0
  28. docs_drift/index/js_cli.py +211 -0
  29. docs_drift/index/js_routes.py +68 -0
  30. docs_drift/index/js_symbols.py +219 -0
  31. docs_drift/index/python_cli.py +370 -0
  32. docs_drift/index/python_routes.py +102 -0
  33. docs_drift/index/python_source.py +20 -0
  34. docs_drift/index/python_symbols.py +335 -0
  35. docs_drift/index/queries/javascript.scm +4 -0
  36. docs_drift/index/queries/typescript.scm +4 -0
  37. docs_drift/index/routes_common.py +16 -0
  38. docs_drift/index/tasks.py +131 -0
  39. docs_drift/index/ts_parser.py +20 -0
  40. docs_drift/limits.py +18 -0
  41. docs_drift/llm/__init__.py +7 -0
  42. docs_drift/llm/candidates.py +81 -0
  43. docs_drift/llm/client.py +185 -0
  44. docs_drift/llm/pricing.py +54 -0
  45. docs_drift/llm/privacy.py +63 -0
  46. docs_drift/llm/prompts/rewrite_v1.md +9 -0
  47. docs_drift/llm/prompts/verify_v1.md +12 -0
  48. docs_drift/llm/prompts.py +28 -0
  49. docs_drift/llm/retrieve.py +60 -0
  50. docs_drift/llm/types.py +68 -0
  51. docs_drift/llm/verify.py +179 -0
  52. docs_drift/lsp.py +199 -0
  53. docs_drift/match/__init__.py +5 -0
  54. docs_drift/match/commands.py +201 -0
  55. docs_drift/match/defaults.py +79 -0
  56. docs_drift/match/engine.py +319 -0
  57. docs_drift/match/rename.py +69 -0
  58. docs_drift/models.py +249 -0
  59. docs_drift/ownership.py +70 -0
  60. docs_drift/policy.py +81 -0
  61. docs_drift/portfolio.py +147 -0
  62. docs_drift/py.typed +0 -0
  63. docs_drift/report/__init__.py +38 -0
  64. docs_drift/report/common.py +31 -0
  65. docs_drift/report/github.py +22 -0
  66. docs_drift/report/html.py +106 -0
  67. docs_drift/report/json.py +17 -0
  68. docs_drift/report/junit.py +30 -0
  69. docs_drift/report/markdown.py +58 -0
  70. docs_drift/report/partials/body.html +19 -0
  71. docs_drift/report/partials/report.css +12 -0
  72. docs_drift/report/partials/script.js +95 -0
  73. docs_drift/report/portfolio.html +14 -0
  74. docs_drift/report/report.html +8 -0
  75. docs_drift/report/sarif.py +68 -0
  76. docs_drift/report/terminal.py +90 -0
  77. docs_drift/report/vendor/CYTOSCAPE-LICENSE +19 -0
  78. docs_drift/report/vendor/cytoscape.min.js +32 -0
  79. docs_drift/report/workflow.html +12 -0
  80. docs_drift/review.py +113 -0
  81. docs_drift/safe_files.py +19 -0
  82. docs_drift/scanning.py +202 -0
  83. docs_drift/schemas/SARIF-LICENSE.md +7 -0
  84. docs_drift/schemas/SARIF-NOTICES.txt +3 -0
  85. docs_drift/schemas/sarif-schema-2.1.0.json +3389 -0
  86. docs_drift/schemas/scan-result.v1.json +1024 -0
  87. docs_drift/setup.py +130 -0
  88. docs_drift/snapshots.py +100 -0
  89. docs_drift/support.py +31 -0
  90. docs_drift/watch.py +157 -0
  91. docs_drift/web/__init__.py +1 -0
  92. docs_drift/web/__main__.py +23 -0
  93. docs_drift/web/app.py +289 -0
  94. docs_drift/web/cleanup.py +23 -0
  95. docs_drift/web/examples/clean-repo.json +646 -0
  96. docs_drift/web/examples/fastapi-svc.json +723 -0
  97. docs_drift/web/examples/files-to-prompt.json +3366 -0
  98. docs_drift/web/examples/judge-fixture.json +226 -0
  99. docs_drift/web/examples/manifest.json +89 -0
  100. docs_drift/web/examples/node-tool.json +823 -0
  101. docs_drift/web/examples/py-cli.json +1267 -0
  102. docs_drift/web/examples/rich-cli-reviewed.json +7855 -0
  103. docs_drift/web/examples/rich-cli.json +8010 -0
  104. docs_drift/web/examples/verification.json +16 -0
  105. docs_drift/web/git.py +274 -0
  106. docs_drift/web/jobs.py +352 -0
  107. docs_drift/web/settings.py +50 -0
  108. docs_drift/web/static/demo.css +37 -0
  109. docs_drift/web/static/demo.js +184 -0
  110. docs_drift/web/static/evidence/correction-verification.json +28 -0
  111. docs_drift/web/static/evidence/flow-highlights-2026-10-22.png +0 -0
  112. docs_drift/web/static/evidence/fresh-scan.json +7855 -0
  113. docs_drift/web/static/evidence/review.json +44 -0
  114. docs_drift/web/static/evidence/rich-cli-correction.patch +20 -0
  115. docs_drift/web/static/evidence/runtime.json +26 -0
  116. docs_drift/web/static/evidence/saved-scan.json +8010 -0
  117. docs_drift/web/static/evidence/usage-card-supplied.png +0 -0
  118. docs_drift/web/templates/base.html +34 -0
  119. docs_drift/web/templates/case.html +13 -0
  120. docs_drift/web/templates/landing.html +90 -0
  121. docs_drift/web/templates/scan.html +2 -0
  122. docs_drift/web/templates/voice.html +1 -0
  123. docs_drift/web/validation.py +47 -0
  124. docs_drift/web/worker.py +152 -0
  125. docs_drift/workflow_cli.py +96 -0
  126. docs_drift/workspaces.py +128 -0
  127. docs_drift-0.1.0.dist-info/METADATA +331 -0
  128. docs_drift-0.1.0.dist-info/RECORD +131 -0
  129. docs_drift-0.1.0.dist-info/WHEEL +4 -0
  130. docs_drift-0.1.0.dist-info/entry_points.txt +2 -0
  131. docs_drift-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,1267 @@
1
+ {
2
+ "schema_version": 1,
3
+ "repo_path": "py-cli-demo",
4
+ "head_sha": "3fb52f15482ad07d8de83c72fc4ad3ab46dd9548",
5
+ "scan_time": "2026-10-18T12:17:37.317525Z",
6
+ "config_used": {
7
+ "docs": [
8
+ "README.md",
9
+ "docs/**/*.md",
10
+ "*.md"
11
+ ],
12
+ "exclude": [
13
+ "node_modules/**",
14
+ ".venv/**",
15
+ "vendor/**",
16
+ "CHANGELOG.md",
17
+ "**/CHANGELOG.md"
18
+ ],
19
+ "languages": "auto",
20
+ "ignore": [],
21
+ "min_confidence": 0.6,
22
+ "llm": {
23
+ "enabled": false,
24
+ "model": null,
25
+ "max_claims": 40,
26
+ "concurrency": 4,
27
+ "timeout": 60.0,
28
+ "budget": 0.5,
29
+ "redact_paths": []
30
+ },
31
+ "history": {
32
+ "max_commits": 2000,
33
+ "show_emails": false
34
+ }
35
+ },
36
+ "docs": [
37
+ {
38
+ "path": "README.md",
39
+ "content_hash": "3316a5c3dcde86fdc71f0de1ba2e77454354ed7d4dcf639aa47cedc2162feab9",
40
+ "format": "markdown"
41
+ }
42
+ ],
43
+ "sections": [
44
+ {
45
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
46
+ "doc_path": "README.md",
47
+ "heading": "py-cli",
48
+ "heading_level": 1,
49
+ "heading_path": [
50
+ "py-cli"
51
+ ],
52
+ "start_line": 1,
53
+ "end_line": 10,
54
+ "context": "current",
55
+ "historical_spans": []
56
+ }
57
+ ],
58
+ "claims": [
59
+ {
60
+ "claim_id": "claim_72525e8a5ba9710e2e22c07f82e841e2dbaab5da7d34a56bfbca975a227ccb0b",
61
+ "kind": "cli_command",
62
+ "raw_text": "serve",
63
+ "value": "serve",
64
+ "qualifier": null,
65
+ "expected_default": null,
66
+ "doc_path": "README.md",
67
+ "line": 3,
68
+ "column": 15,
69
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
70
+ "extraction": "inline_code",
71
+ "extraction_confidence": 0.8,
72
+ "locations": [
73
+ {
74
+ "line": 3,
75
+ "column": 15,
76
+ "raw_text": "serve",
77
+ "extraction": "inline_code"
78
+ }
79
+ ],
80
+ "extraction_sources": [
81
+ "inline_code"
82
+ ],
83
+ "group_key": "72d5bb9585619439996e42559956d3b8cb709725b7ac660c7811cce895178f24"
84
+ },
85
+ {
86
+ "claim_id": "claim_8ed4cec49e3a4c86e8ad548b85452e088ae736718c1e6952b86b5a914bbf0447",
87
+ "kind": "cli_flag",
88
+ "raw_text": "--port",
89
+ "value": "--port",
90
+ "qualifier": "serve",
91
+ "expected_default": null,
92
+ "doc_path": "README.md",
93
+ "line": 4,
94
+ "column": 19,
95
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
96
+ "extraction": "inline_code",
97
+ "extraction_confidence": 0.9,
98
+ "locations": [
99
+ {
100
+ "line": 4,
101
+ "column": 19,
102
+ "raw_text": "--port",
103
+ "extraction": "inline_code"
104
+ }
105
+ ],
106
+ "extraction_sources": [
107
+ "inline_code"
108
+ ],
109
+ "group_key": "1ecb12b79ea589080cede10fd90598dfd2f239bc7de2d50744a59ebbffc78d22"
110
+ },
111
+ {
112
+ "claim_id": "claim_dd0782dde6f1cdb48fa2d33ca485be5a45b91f1987cc791d2e01004f16a3d6ca",
113
+ "kind": "cli_flag",
114
+ "raw_text": "--host",
115
+ "value": "--host",
116
+ "qualifier": "serve",
117
+ "expected_default": null,
118
+ "doc_path": "README.md",
119
+ "line": 5,
120
+ "column": 19,
121
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
122
+ "extraction": "inline_code",
123
+ "extraction_confidence": 0.9,
124
+ "locations": [
125
+ {
126
+ "line": 5,
127
+ "column": 19,
128
+ "raw_text": "--host",
129
+ "extraction": "inline_code"
130
+ }
131
+ ],
132
+ "extraction_sources": [
133
+ "inline_code"
134
+ ],
135
+ "group_key": "f972fd1df1dc0bd8842019fdfdfc35e508a675057ab5c90d78e5e33abbb6693c"
136
+ },
137
+ {
138
+ "claim_id": "claim_47eeff5744595c6eb689bd4c442fb20a2af0035286a725a35fae61ebbb3ccd2b",
139
+ "kind": "cli_flag",
140
+ "raw_text": "--workers",
141
+ "value": "--workers",
142
+ "qualifier": null,
143
+ "expected_default": null,
144
+ "doc_path": "README.md",
145
+ "line": 6,
146
+ "column": 7,
147
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
148
+ "extraction": "inline_code",
149
+ "extraction_confidence": 0.9,
150
+ "locations": [
151
+ {
152
+ "line": 6,
153
+ "column": 7,
154
+ "raw_text": "--workers",
155
+ "extraction": "inline_code"
156
+ }
157
+ ],
158
+ "extraction_sources": [
159
+ "inline_code"
160
+ ],
161
+ "group_key": "acbb8e0fa89f433763cfe879d96c3c9f72c7d28e560541fb6091a0889bcb1a0a"
162
+ },
163
+ {
164
+ "claim_id": "claim_5f2199daeec9e79f6ef17af18d53109eb79f967fe9b7512433afe6780161c526",
165
+ "kind": "env_var",
166
+ "raw_text": "APP_DEBUG",
167
+ "value": "APP_DEBUG",
168
+ "qualifier": null,
169
+ "expected_default": null,
170
+ "doc_path": "README.md",
171
+ "line": 7,
172
+ "column": 7,
173
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
174
+ "extraction": "inline_code",
175
+ "extraction_confidence": 0.95,
176
+ "locations": [
177
+ {
178
+ "line": 7,
179
+ "column": 7,
180
+ "raw_text": "APP_DEBUG",
181
+ "extraction": "inline_code"
182
+ }
183
+ ],
184
+ "extraction_sources": [
185
+ "inline_code"
186
+ ],
187
+ "group_key": "66917398ee27c17d8e6751f3dfc8f2f7e4ea49852209a256d162b57a66ca18ab"
188
+ },
189
+ {
190
+ "claim_id": "claim_3e4a78859ff7e5aa9a087b4ac2fbe545e5615d96016374321ac2175a11e957f6",
191
+ "kind": "cli_command",
192
+ "raw_text": "migrate",
193
+ "value": "migrate",
194
+ "qualifier": null,
195
+ "expected_default": null,
196
+ "doc_path": "README.md",
197
+ "line": 8,
198
+ "column": 11,
199
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
200
+ "extraction": "inline_code",
201
+ "extraction_confidence": 0.8,
202
+ "locations": [
203
+ {
204
+ "line": 8,
205
+ "column": 11,
206
+ "raw_text": "migrate",
207
+ "extraction": "inline_code"
208
+ }
209
+ ],
210
+ "extraction_sources": [
211
+ "inline_code"
212
+ ],
213
+ "group_key": "834074339b2d46fabf87e7e5a64da1f21e5d8c0b79cb3393137dc84918641788"
214
+ },
215
+ {
216
+ "claim_id": "claim_9191832fb5fd440e0c6473790ccc5f658b6bb32163005e9cf84d6925199cbbec",
217
+ "kind": "make_target",
218
+ "raw_text": "make test",
219
+ "value": "test",
220
+ "qualifier": null,
221
+ "expected_default": null,
222
+ "doc_path": "README.md",
223
+ "line": 10,
224
+ "column": 5,
225
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
226
+ "extraction": "inline_code",
227
+ "extraction_confidence": 0.9,
228
+ "locations": [
229
+ {
230
+ "line": 10,
231
+ "column": 5,
232
+ "raw_text": "make test",
233
+ "extraction": "inline_code"
234
+ }
235
+ ],
236
+ "extraction_sources": [
237
+ "inline_code"
238
+ ],
239
+ "group_key": "764f3bd8b9b1519486c80dd313e5b49b91463ab1995554e7b6ce73922e207a06"
240
+ },
241
+ {
242
+ "claim_id": "claim_7aee9594e82a9f081ea1474997448ab4196be0a27cc6f2cc54a73a918d46a488",
243
+ "kind": "default_value",
244
+ "raw_text": "(default 8000)",
245
+ "value": "--port",
246
+ "qualifier": "cli_flag",
247
+ "expected_default": "8000",
248
+ "doc_path": "README.md",
249
+ "line": 4,
250
+ "column": 28,
251
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
252
+ "extraction": "prose_pattern",
253
+ "extraction_confidence": 0.55,
254
+ "locations": [
255
+ {
256
+ "line": 4,
257
+ "column": 28,
258
+ "raw_text": "(default 8000)",
259
+ "extraction": "prose_pattern"
260
+ }
261
+ ],
262
+ "extraction_sources": [
263
+ "prose_pattern"
264
+ ],
265
+ "group_key": "8b9c5d8e378ba4247c4a102849cfb73bf437fc3535536467236fc7838309e5c4"
266
+ },
267
+ {
268
+ "claim_id": "claim_6e52d632a8898cceaf094d0ece49c88ce5657fc2cb03e4b190aff2cc3146b3f3",
269
+ "kind": "default_value",
270
+ "raw_text": "(default 127.0.0.1)",
271
+ "value": "--host",
272
+ "qualifier": "cli_flag",
273
+ "expected_default": "127.0.0.1",
274
+ "doc_path": "README.md",
275
+ "line": 5,
276
+ "column": 28,
277
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
278
+ "extraction": "prose_pattern",
279
+ "extraction_confidence": 0.55,
280
+ "locations": [
281
+ {
282
+ "line": 5,
283
+ "column": 28,
284
+ "raw_text": "(default 127.0.0.1)",
285
+ "extraction": "prose_pattern"
286
+ }
287
+ ],
288
+ "extraction_sources": [
289
+ "prose_pattern"
290
+ ],
291
+ "group_key": "c8ea7e0762aab84248045ebdd5c25d9deb962d6017d894fd80759b44ff131dd6"
292
+ },
293
+ {
294
+ "claim_id": "claim_0ddc043944f8c1b30f1c40e0aa64cdc5d8f10259074ba7769279304b72a52160",
295
+ "kind": "default_value",
296
+ "raw_text": "default is `4`",
297
+ "value": "--workers",
298
+ "qualifier": "cli_flag",
299
+ "expected_default": "4",
300
+ "doc_path": "README.md",
301
+ "line": 6,
302
+ "column": 19,
303
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
304
+ "extraction": "prose_pattern",
305
+ "extraction_confidence": 0.55,
306
+ "locations": [
307
+ {
308
+ "line": 6,
309
+ "column": 19,
310
+ "raw_text": "default is `4`",
311
+ "extraction": "prose_pattern"
312
+ }
313
+ ],
314
+ "extraction_sources": [
315
+ "prose_pattern"
316
+ ],
317
+ "group_key": "79ddd206ba56690096f61d53bdd1a47f71d3226d545739edea8581f7ba997773"
318
+ }
319
+ ],
320
+ "symbols": [
321
+ {
322
+ "symbol_id": "symbol_3d0b5b3ba9044ac3fbff1e1459399e15635ce176e92517afb2b243dc55d4a463",
323
+ "kind": "make_target",
324
+ "name": "test",
325
+ "qualified_name": "test",
326
+ "aliases": [],
327
+ "default": null,
328
+ "file": "Makefile",
329
+ "line": 1,
330
+ "language": "make",
331
+ "framework": null,
332
+ "parent_id": null,
333
+ "exported": false,
334
+ "decorators": [],
335
+ "derived": false,
336
+ "setting_group": null,
337
+ "authoritative": true,
338
+ "raw_path": null,
339
+ "handler": null,
340
+ "partial_prefix": false,
341
+ "ts_type": false
342
+ },
343
+ {
344
+ "symbol_id": "symbol_f46984ed055ff7b810b6bd47684db9f280e5c3b3d4c7ae72814c81b144493a60",
345
+ "kind": "function",
346
+ "name": "main",
347
+ "qualified_name": "cli.main",
348
+ "aliases": [],
349
+ "default": null,
350
+ "file": "cli.py",
351
+ "line": 4,
352
+ "language": "python",
353
+ "framework": null,
354
+ "parent_id": null,
355
+ "exported": true,
356
+ "decorators": [],
357
+ "derived": false,
358
+ "setting_group": null,
359
+ "authoritative": true,
360
+ "raw_path": null,
361
+ "handler": null,
362
+ "partial_prefix": false,
363
+ "ts_type": false
364
+ },
365
+ {
366
+ "symbol_id": "symbol_27a6dcff770a5fe755888fc3f70445d6ede2a44a0bcc0c5f6bd68d8a03b561b4",
367
+ "kind": "cli_command",
368
+ "name": "serve",
369
+ "qualified_name": "cli.serve",
370
+ "aliases": [],
371
+ "default": null,
372
+ "file": "cli.py",
373
+ "line": 7,
374
+ "language": "python",
375
+ "framework": "argparse",
376
+ "parent_id": null,
377
+ "exported": false,
378
+ "decorators": [],
379
+ "derived": false,
380
+ "setting_group": null,
381
+ "authoritative": true,
382
+ "raw_path": null,
383
+ "handler": null,
384
+ "partial_prefix": false,
385
+ "ts_type": false
386
+ },
387
+ {
388
+ "symbol_id": "symbol_b1aff1c29930fa208e11ddcc45d6650ad414d3d157b3528b8b0f696973d46765",
389
+ "kind": "cli_flag",
390
+ "name": "--listen",
391
+ "qualified_name": "cli.serve.--listen",
392
+ "aliases": [],
393
+ "default": "8000",
394
+ "file": "cli.py",
395
+ "line": 8,
396
+ "language": "python",
397
+ "framework": "argparse",
398
+ "parent_id": null,
399
+ "exported": false,
400
+ "decorators": [],
401
+ "derived": false,
402
+ "setting_group": null,
403
+ "authoritative": true,
404
+ "raw_path": null,
405
+ "handler": null,
406
+ "partial_prefix": false,
407
+ "ts_type": false
408
+ },
409
+ {
410
+ "symbol_id": "symbol_20488fa73d5cffe8005a388c57bc41a467fdeb50a55a9c1e347da8fddae98d2f",
411
+ "kind": "cli_flag",
412
+ "name": "--host",
413
+ "qualified_name": "cli.serve.--host",
414
+ "aliases": [],
415
+ "default": "127.0.0.1",
416
+ "file": "cli.py",
417
+ "line": 9,
418
+ "language": "python",
419
+ "framework": "argparse",
420
+ "parent_id": null,
421
+ "exported": false,
422
+ "decorators": [],
423
+ "derived": false,
424
+ "setting_group": null,
425
+ "authoritative": true,
426
+ "raw_path": null,
427
+ "handler": null,
428
+ "partial_prefix": false,
429
+ "ts_type": false
430
+ },
431
+ {
432
+ "symbol_id": "symbol_0f9006638800848074f8dca81f512cd6922bbb37243a8ab5c5ed4b65db3df373",
433
+ "kind": "cli_flag",
434
+ "name": "--workers",
435
+ "qualified_name": "cli.serve.--workers",
436
+ "aliases": [],
437
+ "default": "8",
438
+ "file": "cli.py",
439
+ "line": 10,
440
+ "language": "python",
441
+ "framework": "argparse",
442
+ "parent_id": null,
443
+ "exported": false,
444
+ "decorators": [],
445
+ "derived": false,
446
+ "setting_group": null,
447
+ "authoritative": true,
448
+ "raw_path": null,
449
+ "handler": null,
450
+ "partial_prefix": false,
451
+ "ts_type": false
452
+ },
453
+ {
454
+ "symbol_id": "symbol_34705d4897c16f937d1a0193e24a8ed69a18933b6663d0be5ebec8e2f71e27bd",
455
+ "kind": "cli_command",
456
+ "name": "db-upgrade",
457
+ "qualified_name": "cli.db-upgrade",
458
+ "aliases": [],
459
+ "default": null,
460
+ "file": "cli.py",
461
+ "line": 11,
462
+ "language": "python",
463
+ "framework": "argparse",
464
+ "parent_id": null,
465
+ "exported": false,
466
+ "decorators": [],
467
+ "derived": false,
468
+ "setting_group": null,
469
+ "authoritative": true,
470
+ "raw_path": null,
471
+ "handler": null,
472
+ "partial_prefix": false,
473
+ "ts_type": false
474
+ },
475
+ {
476
+ "symbol_id": "symbol_72c12062f3b6a0340f97b890f08d459d6487e6e4a295e6a0ab790bcc2c21f256",
477
+ "kind": "env_var",
478
+ "name": "APP_LOG_LEVEL",
479
+ "qualified_name": "cli.APP_LOG_LEVEL",
480
+ "aliases": [],
481
+ "default": "INFO",
482
+ "file": "cli.py",
483
+ "line": 12,
484
+ "language": "python",
485
+ "framework": null,
486
+ "parent_id": null,
487
+ "exported": false,
488
+ "decorators": [],
489
+ "derived": false,
490
+ "setting_group": null,
491
+ "authoritative": true,
492
+ "raw_path": null,
493
+ "handler": null,
494
+ "partial_prefix": false,
495
+ "ts_type": false
496
+ }
497
+ ],
498
+ "findings": [
499
+ {
500
+ "claim": {
501
+ "claim_id": "claim_72525e8a5ba9710e2e22c07f82e841e2dbaab5da7d34a56bfbca975a227ccb0b",
502
+ "kind": "cli_command",
503
+ "raw_text": "serve",
504
+ "value": "serve",
505
+ "qualifier": null,
506
+ "expected_default": null,
507
+ "doc_path": "README.md",
508
+ "line": 3,
509
+ "column": 15,
510
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
511
+ "extraction": "inline_code",
512
+ "extraction_confidence": 0.8,
513
+ "locations": [
514
+ {
515
+ "line": 3,
516
+ "column": 15,
517
+ "raw_text": "serve",
518
+ "extraction": "inline_code"
519
+ }
520
+ ],
521
+ "extraction_sources": [
522
+ "inline_code"
523
+ ],
524
+ "group_key": "72d5bb9585619439996e42559956d3b8cb709725b7ac660c7811cce895178f24"
525
+ },
526
+ "matched_symbol": {
527
+ "symbol_id": "symbol_27a6dcff770a5fe755888fc3f70445d6ede2a44a0bcc0c5f6bd68d8a03b561b4",
528
+ "kind": "cli_command",
529
+ "name": "serve",
530
+ "qualified_name": "cli.serve",
531
+ "aliases": [],
532
+ "default": null,
533
+ "file": "cli.py",
534
+ "line": 7,
535
+ "language": "python",
536
+ "framework": "argparse",
537
+ "parent_id": null,
538
+ "exported": false,
539
+ "decorators": [],
540
+ "derived": false,
541
+ "setting_group": null,
542
+ "authoritative": true,
543
+ "raw_path": null,
544
+ "handler": null,
545
+ "partial_prefix": false,
546
+ "ts_type": false
547
+ },
548
+ "verdict": "ok",
549
+ "suggestion": null,
550
+ "evidence": [
551
+ {
552
+ "file": "cli.py",
553
+ "line": 7,
554
+ "text": "cli.serve",
555
+ "end_line": null
556
+ }
557
+ ],
558
+ "introduced_by": null,
559
+ "confidence": 0.95,
560
+ "reasons": [
561
+ "cli_command serve matches cli.serve at cli.py:7."
562
+ ],
563
+ "decided_by": "rules",
564
+ "replayed": false,
565
+ "package": "py-cli",
566
+ "doc_text": "The CLI has a `serve` subcommand."
567
+ },
568
+ {
569
+ "claim": {
570
+ "claim_id": "claim_8ed4cec49e3a4c86e8ad548b85452e088ae736718c1e6952b86b5a914bbf0447",
571
+ "kind": "cli_flag",
572
+ "raw_text": "--port",
573
+ "value": "--port",
574
+ "qualifier": "serve",
575
+ "expected_default": null,
576
+ "doc_path": "README.md",
577
+ "line": 4,
578
+ "column": 19,
579
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
580
+ "extraction": "inline_code",
581
+ "extraction_confidence": 0.9,
582
+ "locations": [
583
+ {
584
+ "line": 4,
585
+ "column": 19,
586
+ "raw_text": "--port",
587
+ "extraction": "inline_code"
588
+ }
589
+ ],
590
+ "extraction_sources": [
591
+ "inline_code"
592
+ ],
593
+ "group_key": "1ecb12b79ea589080cede10fd90598dfd2f239bc7de2d50744a59ebbffc78d22"
594
+ },
595
+ "matched_symbol": {
596
+ "symbol_id": "symbol_b1aff1c29930fa208e11ddcc45d6650ad414d3d157b3528b8b0f696973d46765",
597
+ "kind": "cli_flag",
598
+ "name": "--listen",
599
+ "qualified_name": "cli.serve.--listen",
600
+ "aliases": [],
601
+ "default": "8000",
602
+ "file": "cli.py",
603
+ "line": 8,
604
+ "language": "python",
605
+ "framework": "argparse",
606
+ "parent_id": null,
607
+ "exported": false,
608
+ "decorators": [],
609
+ "derived": false,
610
+ "setting_group": null,
611
+ "authoritative": true,
612
+ "raw_path": null,
613
+ "handler": null,
614
+ "partial_prefix": false,
615
+ "ts_type": false
616
+ },
617
+ "verdict": "renamed",
618
+ "suggestion": "--listen",
619
+ "evidence": [
620
+ {
621
+ "file": "README.md",
622
+ "line": 4,
623
+ "text": "--port",
624
+ "end_line": null
625
+ },
626
+ {
627
+ "file": "cli.py",
628
+ "line": 1,
629
+ "text": "- serve.add_argument(\"--port\", type=int, default=8000)\n+ serve.add_argument(\"--listen\", type=int, default=8000)",
630
+ "end_line": null
631
+ }
632
+ ],
633
+ "introduced_by": {
634
+ "sha": "450a93d2afb517459abbb7ca15b4a87692553a21",
635
+ "short_sha": "450a93d",
636
+ "author_name": "Author hidden",
637
+ "author_email": null,
638
+ "date": "2026-10-02T09:00:00Z",
639
+ "summary": "Rename port to listen"
640
+ },
641
+ "confidence": 0.92,
642
+ "reasons": [
643
+ "No indexed cli_flag named --port was found. Closest indexed candidates: --host (cli.py:9), --workers (cli.py:10), --listen (cli.py:8).",
644
+ "Git history confirms this name changed to --listen.",
645
+ "Git history changed this name in 450a93d."
646
+ ],
647
+ "decided_by": "rules",
648
+ "replayed": false,
649
+ "package": "py-cli",
650
+ "doc_text": "- `serve` accepts `--port` (default 8000)."
651
+ },
652
+ {
653
+ "claim": {
654
+ "claim_id": "claim_dd0782dde6f1cdb48fa2d33ca485be5a45b91f1987cc791d2e01004f16a3d6ca",
655
+ "kind": "cli_flag",
656
+ "raw_text": "--host",
657
+ "value": "--host",
658
+ "qualifier": "serve",
659
+ "expected_default": null,
660
+ "doc_path": "README.md",
661
+ "line": 5,
662
+ "column": 19,
663
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
664
+ "extraction": "inline_code",
665
+ "extraction_confidence": 0.9,
666
+ "locations": [
667
+ {
668
+ "line": 5,
669
+ "column": 19,
670
+ "raw_text": "--host",
671
+ "extraction": "inline_code"
672
+ }
673
+ ],
674
+ "extraction_sources": [
675
+ "inline_code"
676
+ ],
677
+ "group_key": "f972fd1df1dc0bd8842019fdfdfc35e508a675057ab5c90d78e5e33abbb6693c"
678
+ },
679
+ "matched_symbol": {
680
+ "symbol_id": "symbol_20488fa73d5cffe8005a388c57bc41a467fdeb50a55a9c1e347da8fddae98d2f",
681
+ "kind": "cli_flag",
682
+ "name": "--host",
683
+ "qualified_name": "cli.serve.--host",
684
+ "aliases": [],
685
+ "default": "127.0.0.1",
686
+ "file": "cli.py",
687
+ "line": 9,
688
+ "language": "python",
689
+ "framework": "argparse",
690
+ "parent_id": null,
691
+ "exported": false,
692
+ "decorators": [],
693
+ "derived": false,
694
+ "setting_group": null,
695
+ "authoritative": true,
696
+ "raw_path": null,
697
+ "handler": null,
698
+ "partial_prefix": false,
699
+ "ts_type": false
700
+ },
701
+ "verdict": "ok",
702
+ "suggestion": null,
703
+ "evidence": [
704
+ {
705
+ "file": "cli.py",
706
+ "line": 9,
707
+ "text": "cli.serve.--host",
708
+ "end_line": null
709
+ }
710
+ ],
711
+ "introduced_by": null,
712
+ "confidence": 0.95,
713
+ "reasons": [
714
+ "cli_flag --host matches cli.serve.--host at cli.py:9."
715
+ ],
716
+ "decided_by": "rules",
717
+ "replayed": false,
718
+ "package": "py-cli",
719
+ "doc_text": "- `serve` accepts `--host` (default 127.0.0.1)."
720
+ },
721
+ {
722
+ "claim": {
723
+ "claim_id": "claim_47eeff5744595c6eb689bd4c442fb20a2af0035286a725a35fae61ebbb3ccd2b",
724
+ "kind": "cli_flag",
725
+ "raw_text": "--workers",
726
+ "value": "--workers",
727
+ "qualifier": null,
728
+ "expected_default": null,
729
+ "doc_path": "README.md",
730
+ "line": 6,
731
+ "column": 7,
732
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
733
+ "extraction": "inline_code",
734
+ "extraction_confidence": 0.9,
735
+ "locations": [
736
+ {
737
+ "line": 6,
738
+ "column": 7,
739
+ "raw_text": "--workers",
740
+ "extraction": "inline_code"
741
+ }
742
+ ],
743
+ "extraction_sources": [
744
+ "inline_code"
745
+ ],
746
+ "group_key": "acbb8e0fa89f433763cfe879d96c3c9f72c7d28e560541fb6091a0889bcb1a0a"
747
+ },
748
+ "matched_symbol": {
749
+ "symbol_id": "symbol_0f9006638800848074f8dca81f512cd6922bbb37243a8ab5c5ed4b65db3df373",
750
+ "kind": "cli_flag",
751
+ "name": "--workers",
752
+ "qualified_name": "cli.serve.--workers",
753
+ "aliases": [],
754
+ "default": "8",
755
+ "file": "cli.py",
756
+ "line": 10,
757
+ "language": "python",
758
+ "framework": "argparse",
759
+ "parent_id": null,
760
+ "exported": false,
761
+ "decorators": [],
762
+ "derived": false,
763
+ "setting_group": null,
764
+ "authoritative": true,
765
+ "raw_path": null,
766
+ "handler": null,
767
+ "partial_prefix": false,
768
+ "ts_type": false
769
+ },
770
+ "verdict": "ok",
771
+ "suggestion": null,
772
+ "evidence": [
773
+ {
774
+ "file": "cli.py",
775
+ "line": 10,
776
+ "text": "cli.serve.--workers",
777
+ "end_line": null
778
+ }
779
+ ],
780
+ "introduced_by": null,
781
+ "confidence": 0.95,
782
+ "reasons": [
783
+ "cli_flag --workers matches cli.serve.--workers at cli.py:10."
784
+ ],
785
+ "decided_by": "rules",
786
+ "replayed": false,
787
+ "package": "py-cli",
788
+ "doc_text": "- The `--workers` default is `4`."
789
+ },
790
+ {
791
+ "claim": {
792
+ "claim_id": "claim_5f2199daeec9e79f6ef17af18d53109eb79f967fe9b7512433afe6780161c526",
793
+ "kind": "env_var",
794
+ "raw_text": "APP_DEBUG",
795
+ "value": "APP_DEBUG",
796
+ "qualifier": null,
797
+ "expected_default": null,
798
+ "doc_path": "README.md",
799
+ "line": 7,
800
+ "column": 7,
801
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
802
+ "extraction": "inline_code",
803
+ "extraction_confidence": 0.95,
804
+ "locations": [
805
+ {
806
+ "line": 7,
807
+ "column": 7,
808
+ "raw_text": "APP_DEBUG",
809
+ "extraction": "inline_code"
810
+ }
811
+ ],
812
+ "extraction_sources": [
813
+ "inline_code"
814
+ ],
815
+ "group_key": "66917398ee27c17d8e6751f3dfc8f2f7e4ea49852209a256d162b57a66ca18ab"
816
+ },
817
+ "matched_symbol": {
818
+ "symbol_id": "symbol_72c12062f3b6a0340f97b890f08d459d6487e6e4a295e6a0ab790bcc2c21f256",
819
+ "kind": "env_var",
820
+ "name": "APP_LOG_LEVEL",
821
+ "qualified_name": "cli.APP_LOG_LEVEL",
822
+ "aliases": [],
823
+ "default": "INFO",
824
+ "file": "cli.py",
825
+ "line": 12,
826
+ "language": "python",
827
+ "framework": null,
828
+ "parent_id": null,
829
+ "exported": false,
830
+ "decorators": [],
831
+ "derived": false,
832
+ "setting_group": null,
833
+ "authoritative": true,
834
+ "raw_path": null,
835
+ "handler": null,
836
+ "partial_prefix": false,
837
+ "ts_type": false
838
+ },
839
+ "verdict": "missing",
840
+ "suggestion": "APP_LOG_LEVEL",
841
+ "evidence": [
842
+ {
843
+ "file": "README.md",
844
+ "line": 7,
845
+ "text": "APP_DEBUG",
846
+ "end_line": null
847
+ },
848
+ {
849
+ "file": "cli.py",
850
+ "line": 1,
851
+ "text": "- debug = os.environ.get(\"APP_DEBUG\", \"0\")\n- return parser.parse_args(), debug\n+ log_level = os.environ.get(\"APP_LOG_LEVEL\", \"INFO\")\n+ return parser.parse_args(), log_level",
852
+ "end_line": null
853
+ }
854
+ ],
855
+ "introduced_by": {
856
+ "sha": "f686fb7b16409911edc904a10bd26afcf3682487",
857
+ "short_sha": "f686fb7",
858
+ "author_name": "Author hidden",
859
+ "author_email": null,
860
+ "date": "2026-10-04T09:00:00Z",
861
+ "summary": "Replace debug environment variable with log level"
862
+ },
863
+ "confidence": 0.92,
864
+ "reasons": [
865
+ "No indexed env_var named APP_DEBUG was found. Closest indexed candidates: APP_LOG_LEVEL (cli.py:12).",
866
+ "Git history changed this name in f686fb7."
867
+ ],
868
+ "decided_by": "rules",
869
+ "replayed": false,
870
+ "package": "py-cli",
871
+ "doc_text": "- Set `APP_DEBUG` to enable debug logging."
872
+ },
873
+ {
874
+ "claim": {
875
+ "claim_id": "claim_3e4a78859ff7e5aa9a087b4ac2fbe545e5615d96016374321ac2175a11e957f6",
876
+ "kind": "cli_command",
877
+ "raw_text": "migrate",
878
+ "value": "migrate",
879
+ "qualifier": null,
880
+ "expected_default": null,
881
+ "doc_path": "README.md",
882
+ "line": 8,
883
+ "column": 11,
884
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
885
+ "extraction": "inline_code",
886
+ "extraction_confidence": 0.8,
887
+ "locations": [
888
+ {
889
+ "line": 8,
890
+ "column": 11,
891
+ "raw_text": "migrate",
892
+ "extraction": "inline_code"
893
+ }
894
+ ],
895
+ "extraction_sources": [
896
+ "inline_code"
897
+ ],
898
+ "group_key": "834074339b2d46fabf87e7e5a64da1f21e5d8c0b79cb3393137dc84918641788"
899
+ },
900
+ "matched_symbol": {
901
+ "symbol_id": "symbol_34705d4897c16f937d1a0193e24a8ed69a18933b6663d0be5ebec8e2f71e27bd",
902
+ "kind": "cli_command",
903
+ "name": "db-upgrade",
904
+ "qualified_name": "cli.db-upgrade",
905
+ "aliases": [],
906
+ "default": null,
907
+ "file": "cli.py",
908
+ "line": 11,
909
+ "language": "python",
910
+ "framework": "argparse",
911
+ "parent_id": null,
912
+ "exported": false,
913
+ "decorators": [],
914
+ "derived": false,
915
+ "setting_group": null,
916
+ "authoritative": true,
917
+ "raw_path": null,
918
+ "handler": null,
919
+ "partial_prefix": false,
920
+ "ts_type": false
921
+ },
922
+ "verdict": "renamed",
923
+ "suggestion": "db-upgrade",
924
+ "evidence": [
925
+ {
926
+ "file": "README.md",
927
+ "line": 8,
928
+ "text": "migrate",
929
+ "end_line": null
930
+ },
931
+ {
932
+ "file": "cli.py",
933
+ "line": 1,
934
+ "text": "- commands.add_parser(\"migrate\")\n+ commands.add_parser(\"db-upgrade\")",
935
+ "end_line": null
936
+ }
937
+ ],
938
+ "introduced_by": {
939
+ "sha": "3fb52f15482ad07d8de83c72fc4ad3ab46dd9548",
940
+ "short_sha": "3fb52f1",
941
+ "author_name": "Author hidden",
942
+ "author_email": null,
943
+ "date": "2026-10-05T09:00:00Z",
944
+ "summary": "Rename the database upgrade subcommand"
945
+ },
946
+ "confidence": 0.92,
947
+ "reasons": [
948
+ "No indexed cli_command named migrate was found. Closest indexed candidates: db-upgrade (cli.py:11).",
949
+ "Git history confirms this name changed to db-upgrade.",
950
+ "Git history changed this name in 3fb52f1."
951
+ ],
952
+ "decided_by": "rules",
953
+ "replayed": false,
954
+ "package": "py-cli",
955
+ "doc_text": "- Use the `migrate` subcommand to upgrade the database."
956
+ },
957
+ {
958
+ "claim": {
959
+ "claim_id": "claim_9191832fb5fd440e0c6473790ccc5f658b6bb32163005e9cf84d6925199cbbec",
960
+ "kind": "make_target",
961
+ "raw_text": "make test",
962
+ "value": "test",
963
+ "qualifier": null,
964
+ "expected_default": null,
965
+ "doc_path": "README.md",
966
+ "line": 10,
967
+ "column": 5,
968
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
969
+ "extraction": "inline_code",
970
+ "extraction_confidence": 0.9,
971
+ "locations": [
972
+ {
973
+ "line": 10,
974
+ "column": 5,
975
+ "raw_text": "make test",
976
+ "extraction": "inline_code"
977
+ }
978
+ ],
979
+ "extraction_sources": [
980
+ "inline_code"
981
+ ],
982
+ "group_key": "764f3bd8b9b1519486c80dd313e5b49b91463ab1995554e7b6ce73922e207a06"
983
+ },
984
+ "matched_symbol": {
985
+ "symbol_id": "symbol_3d0b5b3ba9044ac3fbff1e1459399e15635ce176e92517afb2b243dc55d4a463",
986
+ "kind": "make_target",
987
+ "name": "test",
988
+ "qualified_name": "test",
989
+ "aliases": [],
990
+ "default": null,
991
+ "file": "Makefile",
992
+ "line": 1,
993
+ "language": "make",
994
+ "framework": null,
995
+ "parent_id": null,
996
+ "exported": false,
997
+ "decorators": [],
998
+ "derived": false,
999
+ "setting_group": null,
1000
+ "authoritative": true,
1001
+ "raw_path": null,
1002
+ "handler": null,
1003
+ "partial_prefix": false,
1004
+ "ts_type": false
1005
+ },
1006
+ "verdict": "ok",
1007
+ "suggestion": null,
1008
+ "evidence": [
1009
+ {
1010
+ "file": "Makefile",
1011
+ "line": 1,
1012
+ "text": "test",
1013
+ "end_line": null
1014
+ }
1015
+ ],
1016
+ "introduced_by": null,
1017
+ "confidence": 0.95,
1018
+ "reasons": [
1019
+ "make_target test matches test at Makefile:1."
1020
+ ],
1021
+ "decided_by": "rules",
1022
+ "replayed": false,
1023
+ "package": "py-cli",
1024
+ "doc_text": "Run `make test` to check the project."
1025
+ },
1026
+ {
1027
+ "claim": {
1028
+ "claim_id": "claim_7aee9594e82a9f081ea1474997448ab4196be0a27cc6f2cc54a73a918d46a488",
1029
+ "kind": "default_value",
1030
+ "raw_text": "(default 8000)",
1031
+ "value": "--port",
1032
+ "qualifier": "cli_flag",
1033
+ "expected_default": "8000",
1034
+ "doc_path": "README.md",
1035
+ "line": 4,
1036
+ "column": 28,
1037
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
1038
+ "extraction": "prose_pattern",
1039
+ "extraction_confidence": 0.55,
1040
+ "locations": [
1041
+ {
1042
+ "line": 4,
1043
+ "column": 28,
1044
+ "raw_text": "(default 8000)",
1045
+ "extraction": "prose_pattern"
1046
+ }
1047
+ ],
1048
+ "extraction_sources": [
1049
+ "prose_pattern"
1050
+ ],
1051
+ "group_key": "8b9c5d8e378ba4247c4a102849cfb73bf437fc3535536467236fc7838309e5c4"
1052
+ },
1053
+ "matched_symbol": null,
1054
+ "verdict": "unverifiable",
1055
+ "suggestion": null,
1056
+ "evidence": [
1057
+ {
1058
+ "file": "README.md",
1059
+ "line": 4,
1060
+ "text": "(default 8000)",
1061
+ "end_line": null
1062
+ }
1063
+ ],
1064
+ "introduced_by": {
1065
+ "sha": "450a93d2afb517459abbb7ca15b4a87692553a21",
1066
+ "short_sha": "450a93d",
1067
+ "author_name": "Author hidden",
1068
+ "author_email": null,
1069
+ "date": "2026-10-02T09:00:00Z",
1070
+ "summary": "Rename port to listen"
1071
+ },
1072
+ "confidence": 0.3,
1073
+ "reasons": [
1074
+ "No authoritative indexed default was available for this subject."
1075
+ ],
1076
+ "decided_by": "rules",
1077
+ "replayed": false,
1078
+ "package": "py-cli",
1079
+ "doc_text": "- `serve` accepts `--port` (default 8000)."
1080
+ },
1081
+ {
1082
+ "claim": {
1083
+ "claim_id": "claim_6e52d632a8898cceaf094d0ece49c88ce5657fc2cb03e4b190aff2cc3146b3f3",
1084
+ "kind": "default_value",
1085
+ "raw_text": "(default 127.0.0.1)",
1086
+ "value": "--host",
1087
+ "qualifier": "cli_flag",
1088
+ "expected_default": "127.0.0.1",
1089
+ "doc_path": "README.md",
1090
+ "line": 5,
1091
+ "column": 28,
1092
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
1093
+ "extraction": "prose_pattern",
1094
+ "extraction_confidence": 0.55,
1095
+ "locations": [
1096
+ {
1097
+ "line": 5,
1098
+ "column": 28,
1099
+ "raw_text": "(default 127.0.0.1)",
1100
+ "extraction": "prose_pattern"
1101
+ }
1102
+ ],
1103
+ "extraction_sources": [
1104
+ "prose_pattern"
1105
+ ],
1106
+ "group_key": "c8ea7e0762aab84248045ebdd5c25d9deb962d6017d894fd80759b44ff131dd6"
1107
+ },
1108
+ "matched_symbol": {
1109
+ "symbol_id": "symbol_20488fa73d5cffe8005a388c57bc41a467fdeb50a55a9c1e347da8fddae98d2f",
1110
+ "kind": "cli_flag",
1111
+ "name": "--host",
1112
+ "qualified_name": "cli.serve.--host",
1113
+ "aliases": [],
1114
+ "default": "127.0.0.1",
1115
+ "file": "cli.py",
1116
+ "line": 9,
1117
+ "language": "python",
1118
+ "framework": "argparse",
1119
+ "parent_id": null,
1120
+ "exported": false,
1121
+ "decorators": [],
1122
+ "derived": false,
1123
+ "setting_group": null,
1124
+ "authoritative": true,
1125
+ "raw_path": null,
1126
+ "handler": null,
1127
+ "partial_prefix": false,
1128
+ "ts_type": false
1129
+ },
1130
+ "verdict": "ok",
1131
+ "suggestion": null,
1132
+ "evidence": [
1133
+ {
1134
+ "file": "README.md",
1135
+ "line": 5,
1136
+ "text": "(default 127.0.0.1)",
1137
+ "end_line": null
1138
+ },
1139
+ {
1140
+ "file": "cli.py",
1141
+ "line": 9,
1142
+ "text": "cli.serve.--host default=127.0.0.1",
1143
+ "end_line": null
1144
+ }
1145
+ ],
1146
+ "introduced_by": null,
1147
+ "confidence": 0.95,
1148
+ "reasons": [
1149
+ "Documented default '127.0.0.1' matches code."
1150
+ ],
1151
+ "decided_by": "rules",
1152
+ "replayed": false,
1153
+ "package": "py-cli",
1154
+ "doc_text": "- `serve` accepts `--host` (default 127.0.0.1)."
1155
+ },
1156
+ {
1157
+ "claim": {
1158
+ "claim_id": "claim_0ddc043944f8c1b30f1c40e0aa64cdc5d8f10259074ba7769279304b72a52160",
1159
+ "kind": "default_value",
1160
+ "raw_text": "default is `4`",
1161
+ "value": "--workers",
1162
+ "qualifier": "cli_flag",
1163
+ "expected_default": "4",
1164
+ "doc_path": "README.md",
1165
+ "line": 6,
1166
+ "column": 19,
1167
+ "section_id": "section_5fc49b2082ff4ad1d790c979601885b2ccef380f1a4298d374c8981abe363618",
1168
+ "extraction": "prose_pattern",
1169
+ "extraction_confidence": 0.55,
1170
+ "locations": [
1171
+ {
1172
+ "line": 6,
1173
+ "column": 19,
1174
+ "raw_text": "default is `4`",
1175
+ "extraction": "prose_pattern"
1176
+ }
1177
+ ],
1178
+ "extraction_sources": [
1179
+ "prose_pattern"
1180
+ ],
1181
+ "group_key": "79ddd206ba56690096f61d53bdd1a47f71d3226d545739edea8581f7ba997773"
1182
+ },
1183
+ "matched_symbol": {
1184
+ "symbol_id": "symbol_0f9006638800848074f8dca81f512cd6922bbb37243a8ab5c5ed4b65db3df373",
1185
+ "kind": "cli_flag",
1186
+ "name": "--workers",
1187
+ "qualified_name": "cli.serve.--workers",
1188
+ "aliases": [],
1189
+ "default": "8",
1190
+ "file": "cli.py",
1191
+ "line": 10,
1192
+ "language": "python",
1193
+ "framework": "argparse",
1194
+ "parent_id": null,
1195
+ "exported": false,
1196
+ "decorators": [],
1197
+ "derived": false,
1198
+ "setting_group": null,
1199
+ "authoritative": true,
1200
+ "raw_path": null,
1201
+ "handler": null,
1202
+ "partial_prefix": false,
1203
+ "ts_type": false
1204
+ },
1205
+ "verdict": "default_changed",
1206
+ "suggestion": "8",
1207
+ "evidence": [
1208
+ {
1209
+ "file": "README.md",
1210
+ "line": 6,
1211
+ "text": "default is `4`",
1212
+ "end_line": null
1213
+ },
1214
+ {
1215
+ "file": "cli.py",
1216
+ "line": 10,
1217
+ "text": "cli.serve.--workers default=8",
1218
+ "end_line": null
1219
+ },
1220
+ {
1221
+ "file": "cli.py",
1222
+ "line": 10,
1223
+ "text": "- serve.add_argument(\"--workers\", type=int, default=4)\n+ serve.add_argument(\"--workers\", type=int, default=8)",
1224
+ "end_line": null
1225
+ }
1226
+ ],
1227
+ "introduced_by": {
1228
+ "sha": "397bff7d54a7a3861ccf619af032c19c9a646d9d",
1229
+ "short_sha": "397bff7",
1230
+ "author_name": "Author hidden",
1231
+ "author_email": null,
1232
+ "date": "2026-10-03T09:00:00Z",
1233
+ "summary": "Increase the worker default"
1234
+ },
1235
+ "confidence": 0.95,
1236
+ "reasons": [
1237
+ "Documented default '4' differs from code default '8'."
1238
+ ],
1239
+ "decided_by": "rules",
1240
+ "replayed": false,
1241
+ "package": "py-cli",
1242
+ "doc_text": "- The `--workers` default is `4`."
1243
+ }
1244
+ ],
1245
+ "timings": {
1246
+ "docs": 0.25881719996687025,
1247
+ "index": 0.1598179999855347,
1248
+ "match": 0.06125590001465753,
1249
+ "history": 0.40663330000825226
1250
+ },
1251
+ "warnings": [],
1252
+ "suppressed": [],
1253
+ "historical_ignored": 0,
1254
+ "llm_usage": {},
1255
+ "packages": [
1256
+ {
1257
+ "name": "py-cli",
1258
+ "root": ".",
1259
+ "language": "unknown",
1260
+ "commands": []
1261
+ }
1262
+ ],
1263
+ "docs_repo_path": null,
1264
+ "remote_url": "https://github.com/docs-drift/py-cli-demo",
1265
+ "baselined": 0,
1266
+ "package_version": "0.1.0"
1267
+ }