patina-cli 3.11.0 → 4.0.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.
Files changed (193) hide show
  1. package/.patina.default.yaml +29 -29
  2. package/CHANGELOG.md +53 -0
  3. package/NOTICE +21 -0
  4. package/README.md +117 -224
  5. package/README_JA.md +134 -77
  6. package/README_KR.md +132 -74
  7. package/README_ZH.md +137 -80
  8. package/SKILL.md +11 -20
  9. package/artifacts/rebaseline-2025/README.md +147 -0
  10. package/artifacts/rebaseline-2025/human-controls.public.jsonl +250 -0
  11. package/artifacts/rebaseline-2025/intake.example.jsonl +2 -0
  12. package/artifacts/rebaseline-2025/intake.local.example.jsonl +25 -0
  13. package/artifacts/rebaseline-2025/prompts.template.jsonl +7 -0
  14. package/artifacts/rebaseline-2025/sources.ko-public.jsonl +39 -0
  15. package/assets/brand/patina-badge.svg +18 -0
  16. package/assets/brand/patina-mark.svg +8 -0
  17. package/assets/demo/README.md +79 -0
  18. package/core/scoring.md +12 -12
  19. package/core/standalone-prompt.md +3 -1
  20. package/core/stylometry.md +93 -22
  21. package/docs/API.md +1554 -0
  22. package/docs/AUTHENTICATION.md +50 -26
  23. package/docs/AUTHENTICATION_KR.md +54 -29
  24. package/docs/BRANDING.md +9 -8
  25. package/docs/CLI.md +55 -14
  26. package/docs/COOKBOOK.md +8 -21
  27. package/docs/DEMO.md +32 -5
  28. package/docs/EXIT-CODES.md +2 -3
  29. package/docs/FALSE-POSITIVES.md +63 -0
  30. package/docs/FAQ.md +9 -1
  31. package/docs/FAQ_KR.md +3 -1
  32. package/docs/FLAG-PARITY.md +33 -47
  33. package/docs/ISSUE-WAVES.md +57 -0
  34. package/docs/PATTERNS-EN.md +67 -3
  35. package/docs/PATTERNS-JA.md +68 -2
  36. package/docs/PATTERNS-KO.md +70 -7
  37. package/docs/PATTERNS-ZH.md +67 -3
  38. package/docs/PATTERNS.md +5 -5
  39. package/docs/RESEARCH-DOCS-PLATFORM.md +54 -0
  40. package/docs/ROADMAP.md +46 -66
  41. package/docs/TRANSLATIONESE-KO.md +51 -0
  42. package/docs/audits/2026-05-deep-research.md +3 -1
  43. package/docs/benchmarks/README.md +51 -0
  44. package/docs/benchmarks/detector-comparison.json +69 -9
  45. package/docs/benchmarks/detector-comparison.md +10 -5
  46. package/docs/benchmarks/katfish-ko-latest.json +657 -0
  47. package/docs/benchmarks/katfish-ko-latest.md +77 -0
  48. package/docs/benchmarks/latest.json +1183 -108
  49. package/docs/benchmarks/latest.md +84 -60
  50. package/docs/benchmarks/lexicon-freshness-en-2026-05-22.json +1121 -0
  51. package/docs/benchmarks/lexicon-freshness-en-2026-05-22.md +136 -0
  52. package/docs/benchmarks/rebaseline-latest.json +381 -0
  53. package/docs/benchmarks/rebaseline-latest.md +121 -0
  54. package/docs/benchmarks/register-stratified-latest.json +164 -0
  55. package/docs/benchmarks/register-stratified-latest.md +99 -0
  56. package/docs/benchmarks/register-stratified.md +43 -0
  57. package/docs/integrations/github-action.md +44 -11
  58. package/docs/integrations/playground.md +58 -0
  59. package/docs/integrations/pre-commit.md +5 -5
  60. package/docs/integrations/release.md +5 -3
  61. package/docs/integrations/static-sites.md +83 -0
  62. package/docs/research/2025-rebaseline-plan.md +71 -2
  63. package/docs/research/2026-rebaseline.md +102 -0
  64. package/docs/research/adversarial-mps.md +41 -0
  65. package/docs/research/ai-human-metrics.md +35 -23
  66. package/docs/research/human-eval-panel.md +42 -0
  67. package/docs/research/judge-agreement.md +24 -0
  68. package/docs/research/ko-2025-corpus-sources.md +135 -0
  69. package/docs/research/lexicon-freshness-audit.md +64 -0
  70. package/docs/research/zh-ja-lexicon-calibration.md +60 -0
  71. package/docs/social/patina-launch-copy.md +173 -100
  72. package/docs/social/patina-launch-execution.md +94 -0
  73. package/docs/social/patina-launch-korean-first.md +83 -0
  74. package/docs/social/signs-of-ai-writing.md +26 -0
  75. package/docs/social/signs-of-ai-writing_KR.md +26 -0
  76. package/lexicon/ai-en.md +21 -24
  77. package/lexicon/ai-ja.md +158 -0
  78. package/lexicon/ai-ko.md +9 -9
  79. package/lexicon/ai-zh.md +158 -0
  80. package/lexicon/provenance/ai-en.json +970 -0
  81. package/lexicon/provenance/ai-ja.json +542 -0
  82. package/lexicon/provenance/ai-ko.json +866 -0
  83. package/lexicon/provenance/ai-zh.json +542 -0
  84. package/package.json +49 -8
  85. package/patterns/en-communication.md +5 -0
  86. package/patterns/en-content.md +5 -0
  87. package/patterns/en-filler.md +5 -0
  88. package/patterns/en-language.md +29 -1
  89. package/patterns/en-structure.md +5 -0
  90. package/patterns/en-style.md +5 -0
  91. package/patterns/en-viral-hook.md +42 -2
  92. package/patterns/ja-communication.md +5 -0
  93. package/patterns/ja-content.md +5 -0
  94. package/patterns/ja-filler.md +5 -0
  95. package/patterns/ja-language.md +33 -1
  96. package/patterns/ja-structure.md +12 -0
  97. package/patterns/ja-style.md +5 -0
  98. package/patterns/ja-viral-hook.md +41 -2
  99. package/patterns/ko-communication.md +5 -0
  100. package/patterns/ko-content.md +5 -0
  101. package/patterns/ko-filler.md +5 -0
  102. package/patterns/ko-language.md +33 -1
  103. package/patterns/ko-structure.md +25 -6
  104. package/patterns/ko-style.md +5 -0
  105. package/patterns/ko-viral-hook.md +38 -2
  106. package/patterns/zh-communication.md +5 -0
  107. package/patterns/zh-content.md +5 -0
  108. package/patterns/zh-filler.md +5 -0
  109. package/patterns/zh-language.md +37 -1
  110. package/patterns/zh-structure.md +12 -0
  111. package/patterns/zh-style.md +5 -0
  112. package/patterns/zh-viral-hook.md +38 -2
  113. package/playground/README.md +55 -0
  114. package/playground/analytics.js +4 -0
  115. package/playground/analyzer.js +883 -0
  116. package/playground/app.js +157 -0
  117. package/playground/data/lexicons.js +343 -0
  118. package/playground/index.html +138 -0
  119. package/playground/styles.css +267 -0
  120. package/profiles/namuwiki.md +111 -0
  121. package/scripts/adversarial-mps-report.mjs +201 -0
  122. package/scripts/badge-json.mjs +79 -0
  123. package/scripts/benchmark-report.mjs +56 -9
  124. package/scripts/check-release-metadata.mjs +0 -2
  125. package/scripts/detector-comparison.mjs +7 -7
  126. package/scripts/generate-playground-data.mjs +77 -0
  127. package/scripts/katfish-calibration.mjs +464 -0
  128. package/scripts/lexicon-freshness.mjs +485 -0
  129. package/scripts/lint.mjs +1 -1
  130. package/scripts/precommit-score.mjs +4 -3
  131. package/scripts/prose-score.mjs +81 -5
  132. package/scripts/rebaseline-intake.mjs +242 -0
  133. package/scripts/rebaseline-score.mjs +268 -0
  134. package/scripts/rebaseline-summary.mjs +773 -0
  135. package/scripts/rebaseline-web-collect.mjs +410 -0
  136. package/scripts/update-benchmark-ranges.mjs +1 -0
  137. package/src/api.js +69 -105
  138. package/src/auth.js +50 -2
  139. package/src/backends/claude-cli.js +19 -4
  140. package/src/backends/codex-cli.js +19 -3
  141. package/src/backends/contract.js +230 -1
  142. package/src/backends/gemini-cli.js +18 -5
  143. package/src/backends/index.js +87 -12
  144. package/src/backends/kimi-cli.js +161 -0
  145. package/src/cli.js +577 -567
  146. package/src/commands/doctor.js +2 -2
  147. package/src/config.js +29 -0
  148. package/src/errors.js +53 -1
  149. package/src/features/discourse-tells.js +68 -0
  150. package/src/features/index.js +82 -8
  151. package/src/features/lexicon.js +40 -6
  152. package/src/features/markup-leakage.js +69 -0
  153. package/src/features/segment.js +41 -0
  154. package/src/features/signal-strength.js +81 -0
  155. package/src/features/stylometry.js +231 -1
  156. package/src/features/translationese.js +127 -0
  157. package/src/loader.js +76 -0
  158. package/src/logger.js +22 -23
  159. package/src/model-defaults.js +55 -0
  160. package/src/ouroboros.js +31 -0
  161. package/src/output.js +102 -90
  162. package/src/prompt-builder.js +103 -68
  163. package/src/providers.js +51 -4
  164. package/src/scoring.js +210 -2
  165. package/src/security.js +75 -0
  166. package/tests/fixtures/live-quality/en/public-docs-01.md +26 -0
  167. package/tests/fixtures/live-quality/ko/public-docs-01.md +26 -0
  168. package/tests/fixtures/suspect-zones/expected-ranges.json +207 -16
  169. package/tests/fixtures/suspect-zones/ja/ai/ja-ai-04-lexicon.md +11 -0
  170. package/tests/fixtures/suspect-zones/ja/natural/ja-nat-04-lexicon-cold.md +11 -0
  171. package/tests/fixtures/suspect-zones/ko/ai/ko-ai-02.md +4 -5
  172. package/tests/fixtures/suspect-zones/ko/ai/ko-ai-07-ko-diagnostic.md +11 -0
  173. package/tests/fixtures/suspect-zones/zh/ai/zh-ai-04-lexicon.md +11 -0
  174. package/tests/fixtures/suspect-zones/zh/natural/zh-nat-04-lexicon-cold.md +11 -0
  175. package/tests/quality/README.md +188 -11
  176. package/tests/quality/adversarial-mps/fixtures.jsonl +10 -0
  177. package/tests/quality/benchmark.mjs +39 -1
  178. package/tests/quality/dogfood.mjs +5 -3
  179. package/tests/quality/live-fixtures.jsonl +2 -0
  180. package/tests/quality/live-quality.mjs +596 -0
  181. package/tests/quality/ranking-metrics.mjs +136 -0
  182. package/tests/quality/rebaseline-manifest.example.jsonl +5 -0
  183. package/vercel.json +53 -0
  184. package/SKILL-MAX.md +0 -455
  185. package/docs/internal/HARNESS.md +0 -14
  186. package/docs/internal/README.md +0 -14
  187. package/docs/internal/WARP.md +0 -23
  188. package/patina-max/SKILL.md +0 -523
  189. package/patina-max/composite.py +0 -457
  190. package/src/cache.js +0 -106
  191. package/src/commands/init.js +0 -208
  192. package/src/manifest.js +0 -162
  193. package/src/max-mode.js +0 -207
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "generatedBy": "node scripts/update-benchmark-ranges.mjs",
4
- "generatedAt": "2026-05-20T03:49:33.350Z",
5
- "fixtureCount": 34,
4
+ "generatedAt": "2026-05-21T16:23:44.811Z",
5
+ "fixtureCount": 39,
6
6
  "tolerances": {
7
7
  "cv": 0.025,
8
8
  "mattr": 0.03,
@@ -17,6 +17,7 @@
17
17
  "predicted_hot": true,
18
18
  "detectors": {
19
19
  "burstiness": true,
20
+ "koDiagnostics": false,
20
21
  "mattr": false,
21
22
  "lexicon": false
22
23
  },
@@ -44,6 +45,7 @@
44
45
  "predicted_hot": true,
45
46
  "detectors": {
46
47
  "burstiness": true,
48
+ "koDiagnostics": false,
47
49
  "mattr": false,
48
50
  "lexicon": false
49
51
  },
@@ -71,6 +73,7 @@
71
73
  "predicted_hot": true,
72
74
  "detectors": {
73
75
  "burstiness": true,
76
+ "koDiagnostics": false,
74
77
  "mattr": false,
75
78
  "lexicon": false
76
79
  },
@@ -98,6 +101,7 @@
98
101
  "predicted_hot": true,
99
102
  "detectors": {
100
103
  "burstiness": true,
104
+ "koDiagnostics": false,
101
105
  "mattr": false,
102
106
  "lexicon": false
103
107
  },
@@ -125,6 +129,7 @@
125
129
  "predicted_hot": true,
126
130
  "detectors": {
127
131
  "burstiness": true,
132
+ "koDiagnostics": false,
128
133
  "mattr": false,
129
134
  "lexicon": false
130
135
  },
@@ -152,6 +157,7 @@
152
157
  "predicted_hot": true,
153
158
  "detectors": {
154
159
  "burstiness": true,
160
+ "koDiagnostics": false,
155
161
  "mattr": false,
156
162
  "lexicon": false
157
163
  },
@@ -179,6 +185,7 @@
179
185
  "predicted_hot": false,
180
186
  "detectors": {
181
187
  "burstiness": false,
188
+ "koDiagnostics": false,
182
189
  "mattr": false,
183
190
  "lexicon": false
184
191
  },
@@ -206,6 +213,7 @@
206
213
  "predicted_hot": false,
207
214
  "detectors": {
208
215
  "burstiness": false,
216
+ "koDiagnostics": false,
209
217
  "mattr": false,
210
218
  "lexicon": false
211
219
  },
@@ -233,6 +241,7 @@
233
241
  "predicted_hot": false,
234
242
  "detectors": {
235
243
  "burstiness": false,
244
+ "koDiagnostics": false,
236
245
  "mattr": false,
237
246
  "lexicon": false
238
247
  },
@@ -260,6 +269,7 @@
260
269
  "predicted_hot": false,
261
270
  "detectors": {
262
271
  "burstiness": false,
272
+ "koDiagnostics": false,
263
273
  "mattr": false,
264
274
  "lexicon": false
265
275
  },
@@ -287,6 +297,7 @@
287
297
  "predicted_hot": false,
288
298
  "detectors": {
289
299
  "burstiness": false,
300
+ "koDiagnostics": false,
290
301
  "mattr": false,
291
302
  "lexicon": false
292
303
  },
@@ -314,6 +325,7 @@
314
325
  "predicted_hot": true,
315
326
  "detectors": {
316
327
  "burstiness": true,
328
+ "koDiagnostics": false,
317
329
  "mattr": false,
318
330
  "lexicon": false
319
331
  },
@@ -341,6 +353,7 @@
341
353
  "predicted_hot": true,
342
354
  "detectors": {
343
355
  "burstiness": true,
356
+ "koDiagnostics": false,
344
357
  "mattr": false,
345
358
  "lexicon": false
346
359
  },
@@ -368,6 +381,7 @@
368
381
  "predicted_hot": true,
369
382
  "detectors": {
370
383
  "burstiness": true,
384
+ "koDiagnostics": false,
371
385
  "mattr": false,
372
386
  "lexicon": false
373
387
  },
@@ -387,6 +401,44 @@
387
401
  ],
388
402
  "lexicon_hits": []
389
403
  },
404
+ "ja-ai-04-lexicon": {
405
+ "path": "tests/fixtures/suspect-zones/ja/ai/ja-ai-04-lexicon.md",
406
+ "lang": "ja",
407
+ "class": "ai",
408
+ "expected_hot": true,
409
+ "predicted_hot": true,
410
+ "detectors": {
411
+ "burstiness": false,
412
+ "koDiagnostics": false,
413
+ "mattr": false,
414
+ "lexicon": true
415
+ },
416
+ "cv_band": "high",
417
+ "cv_range": [
418
+ 0.535,
419
+ 0.585
420
+ ],
421
+ "mattr_band": "high",
422
+ "mattr_range": [
423
+ 0.773,
424
+ 0.833
425
+ ],
426
+ "lexicon_density_range": [
427
+ 58.83,
428
+ 68.83
429
+ ],
430
+ "lexicon_hits": [
431
+ "まとめると",
432
+ "結論として",
433
+ "重要なのは",
434
+ "デジタル時代において",
435
+ "~が求められます",
436
+ "新たな可能性を切り開く",
437
+ "今後ますます重要になる",
438
+ "多様なニーズに応える",
439
+ "理解を深める"
440
+ ]
441
+ },
390
442
  "ja-nat-01": {
391
443
  "path": "tests/fixtures/suspect-zones/ja/natural/ja-nat-01.md",
392
444
  "lang": "ja",
@@ -395,6 +447,7 @@
395
447
  "predicted_hot": false,
396
448
  "detectors": {
397
449
  "burstiness": false,
450
+ "koDiagnostics": false,
398
451
  "mattr": false,
399
452
  "lexicon": false
400
453
  },
@@ -422,6 +475,7 @@
422
475
  "predicted_hot": false,
423
476
  "detectors": {
424
477
  "burstiness": false,
478
+ "koDiagnostics": false,
425
479
  "mattr": false,
426
480
  "lexicon": false
427
481
  },
@@ -449,6 +503,7 @@
449
503
  "predicted_hot": false,
450
504
  "detectors": {
451
505
  "burstiness": false,
506
+ "koDiagnostics": false,
452
507
  "mattr": false,
453
508
  "lexicon": false
454
509
  },
@@ -468,6 +523,34 @@
468
523
  ],
469
524
  "lexicon_hits": []
470
525
  },
526
+ "ja-nat-04-lexicon-cold": {
527
+ "path": "tests/fixtures/suspect-zones/ja/natural/ja-nat-04-lexicon-cold.md",
528
+ "lang": "ja",
529
+ "class": "natural",
530
+ "expected_hot": false,
531
+ "predicted_hot": false,
532
+ "detectors": {
533
+ "burstiness": false,
534
+ "koDiagnostics": false,
535
+ "mattr": false,
536
+ "lexicon": false
537
+ },
538
+ "cv_band": "mid",
539
+ "cv_range": [
540
+ 0.371,
541
+ 0.421
542
+ ],
543
+ "mattr_band": "high",
544
+ "mattr_range": [
545
+ 0.722,
546
+ 0.782
547
+ ],
548
+ "lexicon_density_range": [
549
+ 0,
550
+ 5
551
+ ],
552
+ "lexicon_hits": []
553
+ },
471
554
  "ko-ai-01": {
472
555
  "path": "tests/fixtures/suspect-zones/ko/ai/ko-ai-01.md",
473
556
  "lang": "ko",
@@ -476,8 +559,9 @@
476
559
  "predicted_hot": true,
477
560
  "detectors": {
478
561
  "burstiness": true,
562
+ "koDiagnostics": false,
479
563
  "mattr": false,
480
- "lexicon": true
564
+ "lexicon": false
481
565
  },
482
566
  "cv_band": "low",
483
567
  "cv_range": [
@@ -505,8 +589,9 @@
505
589
  "predicted_hot": true,
506
590
  "detectors": {
507
591
  "burstiness": true,
592
+ "koDiagnostics": false,
508
593
  "mattr": false,
509
- "lexicon": true
594
+ "lexicon": false
510
595
  },
511
596
  "cv_band": "low",
512
597
  "cv_range": [
@@ -519,12 +604,10 @@
519
604
  0.85
520
605
  ],
521
606
  "lexicon_density_range": [
522
- 14.608,
523
- 24.608
607
+ 0,
608
+ 5
524
609
  ],
525
- "lexicon_hits": [
526
- "환경"
527
- ]
610
+ "lexicon_hits": []
528
611
  },
529
612
  "ko-ai-03": {
530
613
  "path": "tests/fixtures/suspect-zones/ko/ai/ko-ai-03.md",
@@ -534,8 +617,9 @@
534
617
  "predicted_hot": true,
535
618
  "detectors": {
536
619
  "burstiness": true,
620
+ "koDiagnostics": false,
537
621
  "mattr": false,
538
- "lexicon": true
622
+ "lexicon": false
539
623
  },
540
624
  "cv_band": "low",
541
625
  "cv_range": [
@@ -563,6 +647,7 @@
563
647
  "predicted_hot": true,
564
648
  "detectors": {
565
649
  "burstiness": true,
650
+ "koDiagnostics": false,
566
651
  "mattr": false,
567
652
  "lexicon": false
568
653
  },
@@ -590,6 +675,7 @@
590
675
  "predicted_hot": true,
591
676
  "detectors": {
592
677
  "burstiness": true,
678
+ "koDiagnostics": true,
593
679
  "mattr": false,
594
680
  "lexicon": false
595
681
  },
@@ -617,8 +703,9 @@
617
703
  "predicted_hot": true,
618
704
  "detectors": {
619
705
  "burstiness": true,
706
+ "koDiagnostics": false,
620
707
  "mattr": false,
621
- "lexicon": true
708
+ "lexicon": false
622
709
  },
623
710
  "cv_band": "low",
624
711
  "cv_range": [
@@ -631,12 +718,38 @@
631
718
  1.03
632
719
  ],
633
720
  "lexicon_density_range": [
634
- 16.739,
635
- 26.739
721
+ 0,
722
+ 5
636
723
  ],
637
- "lexicon_hits": [
638
- "흐름"
639
- ]
724
+ "lexicon_hits": []
725
+ },
726
+ "ko-ai-07-ko-diagnostic": {
727
+ "path": "tests/fixtures/suspect-zones/ko/ai/ko-ai-07-ko-diagnostic.md",
728
+ "lang": "ko",
729
+ "class": "ai",
730
+ "expected_hot": true,
731
+ "predicted_hot": true,
732
+ "detectors": {
733
+ "burstiness": false,
734
+ "koDiagnostics": true,
735
+ "mattr": false,
736
+ "lexicon": false
737
+ },
738
+ "cv_band": "mid",
739
+ "cv_range": [
740
+ 0.392,
741
+ 0.442
742
+ ],
743
+ "mattr_band": "high",
744
+ "mattr_range": [
745
+ 0.925,
746
+ 0.985
747
+ ],
748
+ "lexicon_density_range": [
749
+ 0,
750
+ 5
751
+ ],
752
+ "lexicon_hits": []
640
753
  },
641
754
  "ko-nat-01": {
642
755
  "path": "tests/fixtures/suspect-zones/ko/natural/ko-nat-01.md",
@@ -646,6 +759,7 @@
646
759
  "predicted_hot": false,
647
760
  "detectors": {
648
761
  "burstiness": false,
762
+ "koDiagnostics": false,
649
763
  "mattr": false,
650
764
  "lexicon": false
651
765
  },
@@ -673,6 +787,7 @@
673
787
  "predicted_hot": false,
674
788
  "detectors": {
675
789
  "burstiness": false,
790
+ "koDiagnostics": false,
676
791
  "mattr": false,
677
792
  "lexicon": false
678
793
  },
@@ -700,6 +815,7 @@
700
815
  "predicted_hot": false,
701
816
  "detectors": {
702
817
  "burstiness": false,
818
+ "koDiagnostics": false,
703
819
  "mattr": false,
704
820
  "lexicon": false
705
821
  },
@@ -727,6 +843,7 @@
727
843
  "predicted_hot": false,
728
844
  "detectors": {
729
845
  "burstiness": false,
846
+ "koDiagnostics": false,
730
847
  "mattr": false,
731
848
  "lexicon": false
732
849
  },
@@ -754,6 +871,7 @@
754
871
  "predicted_hot": false,
755
872
  "detectors": {
756
873
  "burstiness": false,
874
+ "koDiagnostics": false,
757
875
  "mattr": false,
758
876
  "lexicon": false
759
877
  },
@@ -781,6 +899,7 @@
781
899
  "predicted_hot": true,
782
900
  "detectors": {
783
901
  "burstiness": true,
902
+ "koDiagnostics": false,
784
903
  "mattr": false,
785
904
  "lexicon": false
786
905
  },
@@ -808,6 +927,7 @@
808
927
  "predicted_hot": true,
809
928
  "detectors": {
810
929
  "burstiness": true,
930
+ "koDiagnostics": false,
811
931
  "mattr": false,
812
932
  "lexicon": false
813
933
  },
@@ -835,6 +955,7 @@
835
955
  "predicted_hot": true,
836
956
  "detectors": {
837
957
  "burstiness": true,
958
+ "koDiagnostics": false,
838
959
  "mattr": false,
839
960
  "lexicon": false
840
961
  },
@@ -854,6 +975,45 @@
854
975
  ],
855
976
  "lexicon_hits": []
856
977
  },
978
+ "zh-ai-04-lexicon": {
979
+ "path": "tests/fixtures/suspect-zones/zh/ai/zh-ai-04-lexicon.md",
980
+ "lang": "zh",
981
+ "class": "ai",
982
+ "expected_hot": true,
983
+ "predicted_hot": true,
984
+ "detectors": {
985
+ "burstiness": false,
986
+ "koDiagnostics": false,
987
+ "mattr": false,
988
+ "lexicon": true
989
+ },
990
+ "cv_band": "high",
991
+ "cv_range": [
992
+ 0.723,
993
+ 0.773
994
+ ],
995
+ "mattr_band": "high",
996
+ "mattr_range": [
997
+ 0.864,
998
+ 0.924
999
+ ],
1000
+ "lexicon_density_range": [
1001
+ 87.593,
1002
+ 97.593
1003
+ ],
1004
+ "lexicon_hits": [
1005
+ "总而言之",
1006
+ "总的来说",
1007
+ "值得注意的是",
1008
+ "在数字时代",
1009
+ "从长远来看",
1010
+ "不仅~而且",
1011
+ "为~提供了新的可能",
1012
+ "优化整体流程",
1013
+ "形成良性循环",
1014
+ "为未来奠定基础"
1015
+ ]
1016
+ },
857
1017
  "zh-nat-01": {
858
1018
  "path": "tests/fixtures/suspect-zones/zh/natural/zh-nat-01.md",
859
1019
  "lang": "zh",
@@ -862,6 +1022,7 @@
862
1022
  "predicted_hot": false,
863
1023
  "detectors": {
864
1024
  "burstiness": false,
1025
+ "koDiagnostics": false,
865
1026
  "mattr": false,
866
1027
  "lexicon": false
867
1028
  },
@@ -889,6 +1050,7 @@
889
1050
  "predicted_hot": false,
890
1051
  "detectors": {
891
1052
  "burstiness": false,
1053
+ "koDiagnostics": false,
892
1054
  "mattr": false,
893
1055
  "lexicon": false
894
1056
  },
@@ -916,6 +1078,7 @@
916
1078
  "predicted_hot": false,
917
1079
  "detectors": {
918
1080
  "burstiness": false,
1081
+ "koDiagnostics": false,
919
1082
  "mattr": false,
920
1083
  "lexicon": false
921
1084
  },
@@ -934,6 +1097,34 @@
934
1097
  5
935
1098
  ],
936
1099
  "lexicon_hits": []
1100
+ },
1101
+ "zh-nat-04-lexicon-cold": {
1102
+ "path": "tests/fixtures/suspect-zones/zh/natural/zh-nat-04-lexicon-cold.md",
1103
+ "lang": "zh",
1104
+ "class": "natural",
1105
+ "expected_hot": false,
1106
+ "predicted_hot": false,
1107
+ "detectors": {
1108
+ "burstiness": false,
1109
+ "koDiagnostics": false,
1110
+ "mattr": false,
1111
+ "lexicon": false
1112
+ },
1113
+ "cv_band": "mid",
1114
+ "cv_range": [
1115
+ 0.362,
1116
+ 0.412
1117
+ ],
1118
+ "mattr_band": "high",
1119
+ "mattr_range": [
1120
+ 0.901,
1121
+ 0.961
1122
+ ],
1123
+ "lexicon_density_range": [
1124
+ 0,
1125
+ 5
1126
+ ],
1127
+ "lexicon_hits": []
937
1128
  }
938
1129
  }
939
1130
  }
@@ -0,0 +1,11 @@
1
+ ---
2
+ fixture_id: ja-ai-04-lexicon
3
+ language: ja
4
+ class: ai
5
+ expected_hot: true
6
+ why_designed_this_way: |
7
+ Lexicon-only Japanese fixture. It clusters high-precision AI guidance phrases while varying rhythm so lexicon, not burstiness, is the intended hot signal.
8
+ topic: 学習アプリ
9
+ ---
10
+
11
+ 結論として、使い方は変わりました。デジタル時代において、学習アプリは新たな可能性を切り開く存在であり、ユーザー体験を向上させながら多様なニーズに応える設計が求められます。重要なのは、便利さだけで判断しないことです。まとめると、こうした仕組みは理解を深めるきっかけになり、今後ますます重要になるでしょう。
@@ -0,0 +1,11 @@
1
+ ---
2
+ fixture_id: ja-nat-04-lexicon-cold
3
+ language: ja
4
+ class: natural
5
+ expected_hot: false
6
+ why_designed_this_way: |
7
+ Japanese natural counterexample for the new lexicon. It keeps concrete sensory detail and avoids the guidance-summary phrases in ai-ja.md.
8
+ topic: 朝の駅
9
+ ---
10
+
11
+ 朝の駅はまだ眠そうだった。改札の横で駅員が落とし物の傘を三本並べ、濡れた床に黄色い札を置いた。ホームに上がると、隣の高校生が片方だけ手袋をしていて、もう片方の手で缶コーヒーを包んでいた。電車が来るまでの二分、誰も急に話し出さないのがよかった。
@@ -4,12 +4,11 @@ language: ko
4
4
  class: ai
5
5
  expected_hot: true
6
6
  why_designed_this_way: |
7
- MATTR only. The paragraph cycles the same narrow vocabulary cluster throughout:
7
+ Burstiness only. The paragraph cycles the same narrow vocabulary cluster throughout:
8
8
  원격근무/재택근무, 직원/구성원, 업무/일, 생산성/효율 — four content-word pairs reused
9
- in every sentence with minor grammatical variation. Estimated raw-token MATTR (window=50):
10
- ~0.48 (low band < 0.55). Sentence lengths vary slightly (14, 11, 15, 12, 13) giving
11
- CV 0.14 (mid-low, not flagged by burstiness alone) only MATTR triggers hot.
12
- No catalogued patterns: no chatbot phrases, no ~적 stacking, no 다양한/혁신적 hype terms.
9
+ in every sentence with minor grammatical variation. Sentence lengths are still tightly packed
10
+ (10, 9, 11, 11, 10 어절) so CV stays ~0.07 (low band), while MATTR is healthy enough not to fire.
11
+ The removed common KO lexicon entries should no longer be needed for this fixture to stay hot.
13
12
  topic: 원격근무
14
13
  ---
15
14
 
@@ -0,0 +1,11 @@
1
+ ---
2
+ fixture_id: ko-ai-07-ko-diagnostic
3
+ language: ko
4
+ class: ai
5
+ expected_hot: true
6
+ register: workplace-summary
7
+ source_type: synthetic
8
+ model_family: local-fixture
9
+ notes: "Korean diagnostic composite: no comma rhythm, regular eojeol lengths, low suffix-class diversity; legacy burstiness/MATTR/lexicon stay cold."
10
+ ---
11
+ 아침 회의는 기록을 확인합니다. 담당자는 오늘 진행할 항목을 차례대로 검토합니다. 화면은 변경된 값을 보여주고 팀은 같은 절차를 다시 확인합니다. 마지막으로 결과는 공유합니다.
@@ -0,0 +1,11 @@
1
+ ---
2
+ fixture_id: zh-ai-04-lexicon
3
+ language: zh
4
+ class: ai
5
+ expected_hot: true
6
+ why_designed_this_way: |
7
+ Lexicon-only Chinese fixture. The paragraph uses multiple high-precision AI scaffold phrases while varying sentence lengths so lexicon, not burstiness, is the intended hot signal.
8
+ topic: 写作工具
9
+ ---
10
+
11
+ 总而言之,工具已经变了。在数字时代,写作工具不仅提升效率而且改善体验;从长远来看,它为远程协作提供了新的可能,也在优化整体流程、形成良性循环,并为未来奠定基础。值得注意的是,团队仍要看具体工作,而不是只相信口号。总的来说,这种变化值得继续观察。
@@ -0,0 +1,11 @@
1
+ ---
2
+ fixture_id: zh-nat-04-lexicon-cold
3
+ language: zh
4
+ class: natural
5
+ expected_hot: false
6
+ why_designed_this_way: |
7
+ Chinese natural counterexample for the new lexicon. It uses concrete timing, sensory detail, and uneven sentence length without AI scaffold phrases.
8
+ topic: 夜市
9
+ ---
10
+
11
+ 雨停以后,巷口的摊灯一盏盏亮起来。卖豆花的人把塑料凳往屋檐下挪,手上还沾着水;旁边小孩等不及,先捏了一块炸糕,烫得直甩手。我本来只想买葱油饼,后来站了十分钟,听见锅边的油声和老板娘催丈夫找零钱,才想起伞还落在公交车上。