@xenos1996/usa 2.25.2 → 2.26.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 (51) hide show
  1. package/USA.md +3 -0
  2. package/dist/cli-audit.d.ts.map +1 -1
  3. package/dist/cli-audit.js +6 -0
  4. package/dist/cli-audit.js.map +1 -1
  5. package/dist/cli-docs.d.ts +18 -0
  6. package/dist/cli-docs.d.ts.map +1 -0
  7. package/dist/cli-docs.js +416 -0
  8. package/dist/cli-docs.js.map +1 -0
  9. package/dist/cli-help.d.ts.map +1 -1
  10. package/dist/cli-help.js +18 -0
  11. package/dist/cli-help.js.map +1 -1
  12. package/dist/cli.d.ts.map +1 -1
  13. package/dist/cli.js +4 -0
  14. package/dist/cli.js.map +1 -1
  15. package/dist/config.d.ts +1 -1
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +15 -1
  18. package/dist/config.js.map +1 -1
  19. package/dist/engine/audit.d.ts +8 -0
  20. package/dist/engine/audit.d.ts.map +1 -1
  21. package/dist/engine/audit.js +63 -0
  22. package/dist/engine/audit.js.map +1 -1
  23. package/dist/engine/docs-audit.d.ts +125 -0
  24. package/dist/engine/docs-audit.d.ts.map +1 -0
  25. package/dist/engine/docs-audit.js +405 -0
  26. package/dist/engine/docs-audit.js.map +1 -0
  27. package/dist/engine/docs-impact.d.ts +62 -0
  28. package/dist/engine/docs-impact.d.ts.map +1 -0
  29. package/dist/engine/docs-impact.js +165 -0
  30. package/dist/engine/docs-impact.js.map +1 -0
  31. package/dist/engine/docs-invariants.d.ts +66 -0
  32. package/dist/engine/docs-invariants.d.ts.map +1 -0
  33. package/dist/engine/docs-invariants.js +667 -0
  34. package/dist/engine/docs-invariants.js.map +1 -0
  35. package/dist/engine/docs-taxonomy.d.ts +72 -0
  36. package/dist/engine/docs-taxonomy.d.ts.map +1 -0
  37. package/dist/engine/docs-taxonomy.js +294 -0
  38. package/dist/engine/docs-taxonomy.js.map +1 -0
  39. package/dist/engine/gate.d.ts +5 -1
  40. package/dist/engine/gate.d.ts.map +1 -1
  41. package/dist/engine/gate.js +14 -3
  42. package/dist/engine/gate.js.map +1 -1
  43. package/dist/types.d.ts +8 -0
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/util/project.d.ts +4 -0
  46. package/dist/util/project.d.ts.map +1 -1
  47. package/dist/util/project.js +9 -1
  48. package/dist/util/project.js.map +1 -1
  49. package/package.json +3 -1
  50. package/rules/core/supply-chain.yaml +23 -4
  51. package/rules/docs-taxonomy.yaml +3362 -0
@@ -0,0 +1,3362 @@
1
+ # =============================================================================
2
+ # USA — Documentation universe taxonomy (schema: usa-doc-taxonomy-v1)
3
+ # -----------------------------------------------------------------------------
4
+ # The full documentation universe: 14 categories, 220 artifact types, the
5
+ # ownership class of each, when it is expected (tier), how the engine detects
6
+ # that it exists (patterns), when it applies to a project (applies_when over
7
+ # detector facts), which source changes can invalidate it (sources), and how
8
+ # artifacts depend on each other (derives_from / syncs_with).
9
+ #
10
+ # This is the single machine-readable home for every documentation obligation
11
+ # USA knows — no sync relationship lives only in human memory.
12
+ #
13
+ # Fields (per artifact)
14
+ # id global number 1..220 (Appendix A ordering)
15
+ # cat category id (A1..A14, see `categories` below)
16
+ # name artifact name
17
+ # tier 0..4 — when the artifact is expected (Appendix B policy:
18
+ # Tier 0-1 from day one, Tier 2-3 progressively, Tier 4 as
19
+ # the project matures; see docs/documentation-audit.md)
20
+ # kind ownership class: canonical | derived | generated |
21
+ # reference | example | index
22
+ # patterns globs that detect presence. Leading `!` negates (e.g.
23
+ # '!README.md' excludes the root README from per-module
24
+ # matches). Empty list = not mechanically trackable: the
25
+ # engine reports it as MANUAL, never MISSING.
26
+ # applies_when optional predicate over detector facts (same shape as rule
27
+ # `applies_when`). Absent = always applicable.
28
+ # sources optional globs of source files whose change invalidates the
29
+ # artifact (impact analysis). `any-source` means any
30
+ # non-document change. Absent = no mechanical source linkage
31
+ # (human-governed artifact).
32
+ # derives_from ids of upstream artifacts: when an upstream is affected,
33
+ # this one is too (transitive impact walks these edges).
34
+ # syncs_with ids of peers that must stay mutually consistent.
35
+ # alias_rule id of an existing rule that already reports this artifact's
36
+ # absence (avoids double-counting in the main audit).
37
+ # notes optional free text.
38
+ #
39
+ # Honesty discipline: patterns must be specific enough that "present" means
40
+ # "this kind of document exists" — a bare '**/*.md' would make every artifact
41
+ # present, which is a silent false negative of every missing-document check.
42
+ # Artifacts that cannot be reliably matched get patterns: [] and MANUAL status.
43
+ # =============================================================================
44
+
45
+ schema: usa-doc-taxonomy-v1
46
+
47
+ categories:
48
+ - { id: A1, name: 'Project & Governance' }
49
+ - { id: A2, name: 'Requirements & Specifications' }
50
+ - { id: A3, name: 'Architecture & Design' }
51
+ - { id: A4, name: 'Source Code Documentation' }
52
+ - { id: A5, name: 'API Documentation' }
53
+ - { id: A6, name: 'Configuration Documentation' }
54
+ - { id: A7, name: 'Testing Documentation' }
55
+ - { id: A8, name: 'Operations, DevOps & SRE' }
56
+ - { id: A9, name: 'Security Documentation' }
57
+ - { id: A10, name: 'User-Facing Documentation' }
58
+ - { id: A11, name: 'Developer & Contributor Documentation' }
59
+ - { id: A12, name: 'Compliance, Legal & Audit' }
60
+ - { id: A13, name: 'Analytics, Metrics & Reporting' }
61
+ - { id: A14, name: 'Meta-Documentation' }
62
+
63
+ artifacts:
64
+ # ---------------------------------------------------------------- A1 (15)
65
+ - {
66
+ id: 1,
67
+ cat: A1,
68
+ name: 'Project charter / vision',
69
+ tier: 4,
70
+ kind: canonical,
71
+ patterns: ['**/CHARTER*', 'docs/charter*', '**/charter*.md', 'VISION.md', '**/vision.md'],
72
+ }
73
+ - {
74
+ id: 2,
75
+ cat: A1,
76
+ name: 'Project plan',
77
+ tier: 4,
78
+ kind: canonical,
79
+ patterns:
80
+ ['**/PROJECT_PLAN*', 'docs/project-plan*', '**/project-plan*.md', 'PROJECT_PLAN.md'],
81
+ }
82
+ - {
83
+ id: 3,
84
+ cat: A1,
85
+ name: 'Scope statement',
86
+ tier: 4,
87
+ kind: canonical,
88
+ patterns: ['**/SCOPE*.md', 'docs/scope*', '**/scope-statement*'],
89
+ }
90
+ - {
91
+ id: 4,
92
+ cat: A1,
93
+ name: 'Stakeholder register',
94
+ tier: 4,
95
+ kind: canonical,
96
+ patterns: ['**/STAKEHOLDERS*', 'docs/stakeholders*', '**/stakeholder*.md'],
97
+ }
98
+ - {
99
+ id: 5,
100
+ cat: A1,
101
+ name: 'RACI matrix',
102
+ tier: 4,
103
+ kind: canonical,
104
+ patterns: ['**/RACI*.md', 'docs/raci*', '**/raci*.md'],
105
+ }
106
+ - {
107
+ id: 6,
108
+ cat: A1,
109
+ name: 'Risk register',
110
+ tier: 3,
111
+ kind: canonical,
112
+ patterns: ['**/RISK_REGISTER*', '**/risk-register*.md', '**/risks.md', 'docs/risks*'],
113
+ sources: ['**/risk*', '**/risks*'],
114
+ }
115
+ - {
116
+ id: 7,
117
+ cat: A1,
118
+ name: 'Changelog',
119
+ tier: 0,
120
+ kind: canonical,
121
+ patterns: ['CHANGELOG*', '**/CHANGELOG*'],
122
+ syncs_with: [8],
123
+ sources: ['any-source'],
124
+ }
125
+ - {
126
+ id: 8,
127
+ cat: A1,
128
+ name: 'Release notes',
129
+ tier: 1,
130
+ kind: canonical,
131
+ patterns: ['**/RELEASE_NOTES*', '**/release-notes*.md', 'docs/release-notes*'],
132
+ alias_rule: REL-003,
133
+ derives_from: [7],
134
+ syncs_with: [7],
135
+ sources: ['any-source'],
136
+ }
137
+ - {
138
+ id: 9,
139
+ cat: A1,
140
+ name: 'Roadmap',
141
+ tier: 2,
142
+ kind: canonical,
143
+ patterns: ['ROADMAP*', '**/ROADMAP*', 'docs/roadmap*', '**/roadmap*.md'],
144
+ sources: ['**/ROADMAP*', '**/roadmap*', '**/milestone*'],
145
+ }
146
+ - {
147
+ id: 10,
148
+ cat: A1,
149
+ name: 'ADRs (Architecture Decision Records)',
150
+ tier: 4,
151
+ kind: index,
152
+ patterns: ['docs/adr/**', '**/adr/**', '**/ADR-*.md', '**/adr-*.md'],
153
+ derives_from: [39],
154
+ sources: ['docs/adr/**', '**/adr/**', '**/ADR*'],
155
+ }
156
+ - {
157
+ id: 11,
158
+ cat: A1,
159
+ name: 'Governance model',
160
+ tier: 4,
161
+ kind: canonical,
162
+ patterns: ['GOVERNANCE*', 'docs/governance*', '**/governance*.md'],
163
+ }
164
+ - {
165
+ id: 12,
166
+ cat: A1,
167
+ name: 'Budget / cost tracking',
168
+ tier: 4,
169
+ kind: canonical,
170
+ patterns: ['**/BUDGET*.md', 'docs/budget*', '**/cost-tracking*'],
171
+ }
172
+ - {
173
+ id: 13,
174
+ cat: A1,
175
+ name: 'Lessons learned / retrospectives',
176
+ tier: 4,
177
+ kind: canonical,
178
+ patterns: ['**/RETROSPECTIVE*', '**/retro*.md', 'docs/lessons*', '**/lessons-learned*'],
179
+ }
180
+ - {
181
+ id: 14,
182
+ cat: A1,
183
+ name: 'Product brief / one-pager',
184
+ tier: 4,
185
+ kind: canonical,
186
+ patterns: ['**/BRIEF*.md', 'docs/brief*', '**/one-pager*', '**/ONE_PAGER*'],
187
+ syncs_with: [15],
188
+ }
189
+ - {
190
+ id: 15,
191
+ cat: A1,
192
+ name: 'Elevator pitch',
193
+ tier: 4,
194
+ kind: reference,
195
+ patterns: [],
196
+ notes: 'Usually lives inside the README; not separately trackable.',
197
+ syncs_with: [14],
198
+ }
199
+
200
+ # ---------------------------------------------------------------- A2 (20)
201
+ - {
202
+ id: 16,
203
+ cat: A2,
204
+ name: 'Business requirements',
205
+ tier: 2,
206
+ kind: canonical,
207
+ patterns:
208
+ ['**/BUSINESS_REQUIREMENTS*', '**/requirements/business*', 'docs/requirements/business*'],
209
+ sources: [],
210
+ }
211
+ - {
212
+ id: 17,
213
+ cat: A2,
214
+ name: 'Functional requirements (SRS)',
215
+ tier: 2,
216
+ kind: canonical,
217
+ patterns: ['**/SRS*.md', 'docs/requirements/**', '**/REQUIREMENTS.md', '**/requirements.md'],
218
+ derives_from: [16],
219
+ sources: ['**/requirements*', '**/srs*', '**/stories*'],
220
+ }
221
+ - {
222
+ id: 18,
223
+ cat: A2,
224
+ name: 'Non-functional requirements',
225
+ tier: 2,
226
+ kind: canonical,
227
+ patterns: ['**/NFR*.md', '**/NON_FUNCTIONAL*', 'docs/requirements/nfr*', '**/nfr*.md'],
228
+ derives_from: [16],
229
+ sources: ['**/nfr*', '**/requirements*', '**/slo*'],
230
+ }
231
+ - {
232
+ id: 19,
233
+ cat: A2,
234
+ name: 'User stories / use cases',
235
+ tier: 2,
236
+ kind: canonical,
237
+ patterns:
238
+ [
239
+ '**/USER_STORIES*',
240
+ '**/use-cases*',
241
+ '**/usecases*',
242
+ 'docs/user-stories*',
243
+ 'docs/use-cases*',
244
+ ],
245
+ derives_from: [16],
246
+ syncs_with: [20],
247
+ sources: ['**/stories*', '**/use-cases*', '**/requirements*'],
248
+ }
249
+ - {
250
+ id: 20,
251
+ cat: A2,
252
+ name: 'Acceptance criteria',
253
+ tier: 2,
254
+ kind: derived,
255
+ patterns: ['**/ACCEPTANCE_CRITERIA*', '**/acceptance-criteria*.md', 'docs/acceptance*'],
256
+ derives_from: [19],
257
+ syncs_with: [19],
258
+ sources: ['**/stories*', '**/use-cases*', '**/test*'],
259
+ }
260
+ - {
261
+ id: 21,
262
+ cat: A2,
263
+ name: 'Glossary / domain dictionary',
264
+ tier: 2,
265
+ kind: reference,
266
+ patterns: ['**/GLOSSARY*.md', 'docs/glossary*', '**/domain-dictionary*'],
267
+ derives_from: [16],
268
+ syncs_with: [161],
269
+ sources: ['**/glossary*', '**/domain*'],
270
+ }
271
+ - {
272
+ id: 22,
273
+ cat: A2,
274
+ name: 'Data dictionary',
275
+ tier: 2,
276
+ kind: derived,
277
+ patterns: ['**/DATA_DICTIONARY*', '**/data-dictionary*.md', 'docs/data-dictionary*'],
278
+ applies_when:
279
+ {
280
+ any:
281
+ [
282
+ { fact: 'db:postgres' },
283
+ { fact: 'db:mysql' },
284
+ { fact: 'db:sqlite' },
285
+ { fact: 'db:mongodb' },
286
+ { fact: 'db:redis' },
287
+ { fact: 'db:clickhouse' },
288
+ { fact: 'db:elasticsearch' },
289
+ { fact: 'db:vector' },
290
+ { fact: 'db:dynamodb' },
291
+ { fact: 'orm:prisma' },
292
+ { fact: 'orm:sequelize' },
293
+ { fact: 'orm:sqlalchemy' },
294
+ { fact: 'orm:gorm' },
295
+ { fact: 'orm:sqlx' },
296
+ { fact: 'orm:diesel' },
297
+ { fact: 'orm:drizzle' },
298
+ { fact: 'orm:hibernate' },
299
+ { fact: 'orm:mongoose' },
300
+ { fact: 'orm:typeorm' },
301
+ { fact: 'orm:activerecord' },
302
+ ],
303
+ },
304
+ derives_from: [17],
305
+ syncs_with: [44],
306
+ sources:
307
+ [
308
+ '**/migrations/**',
309
+ '**/*.sql',
310
+ '**/prisma/**',
311
+ '**/*.prisma',
312
+ '**/models/**',
313
+ '**/entities/**',
314
+ '**/alembic/**',
315
+ '**/schema/**',
316
+ ],
317
+ }
318
+ - {
319
+ id: 23,
320
+ cat: A2,
321
+ name: 'Data flow diagrams',
322
+ tier: 3,
323
+ kind: reference,
324
+ patterns: ['**/data-flow*', '**/dataflow*', '**/dfd*', '**/*-dfd*'],
325
+ derives_from: [22],
326
+ sources: ['**/*.puml', '**/*.plantuml', '**/*.mmd', '**/*.dot', '**/diagrams/**'],
327
+ }
328
+ - {
329
+ id: 24,
330
+ cat: A2,
331
+ name: 'State diagrams',
332
+ tier: 3,
333
+ kind: reference,
334
+ patterns: ['**/state-diagram*', '**/*-state*.md', '**/state-machine*', '**/*lifecycle*.md'],
335
+ derives_from: [22],
336
+ sources: ['**/*.puml', '**/*.plantuml', '**/*.mmd', '**/*.dot', '**/diagrams/**'],
337
+ }
338
+ - {
339
+ id: 25,
340
+ cat: A2,
341
+ name: 'Workflow diagrams',
342
+ tier: 3,
343
+ kind: reference,
344
+ patterns: ['**/workflow*.md', '**/*-flow*.md', '**/process-diagram*'],
345
+ derives_from: [23],
346
+ sources: ['**/*.puml', '**/*.plantuml', '**/*.mmd', '**/*.dot', '**/diagrams/**'],
347
+ }
348
+ - {
349
+ id: 26,
350
+ cat: A2,
351
+ name: 'Requirements traceability matrix',
352
+ tier: 3,
353
+ kind: derived,
354
+ patterns:
355
+ ['**/TRACEABILITY*', '**/traceability*.md', '**/rtm*.md', '**/requirements-traceability*'],
356
+ derives_from: [17, 22],
357
+ sources: ['**/requirements*', '**/stories*', '**/test*'],
358
+ }
359
+ - {
360
+ id: 27,
361
+ cat: A2,
362
+ name: 'Constraints documentation',
363
+ tier: 3,
364
+ kind: canonical,
365
+ patterns: ['**/CONSTRAINTS*.md', 'docs/constraints*'],
366
+ derives_from: [16],
367
+ sources: ['**/constraints*', '**/requirements*'],
368
+ }
369
+ - {
370
+ id: 28,
371
+ cat: A2,
372
+ name: 'Assumptions & dependencies',
373
+ tier: 3,
374
+ kind: canonical,
375
+ patterns: ['**/ASSUMPTIONS*.md', 'docs/assumptions*'],
376
+ derives_from: [16],
377
+ sources: ['**/assumption*', '**/requirements*'],
378
+ }
379
+ - {
380
+ id: 29,
381
+ cat: A2,
382
+ name: 'Prioritization / MoSCoW',
383
+ tier: 3,
384
+ kind: derived,
385
+ patterns: ['**/MOSCOW*.md', '**/prioritization*.md', '**/priorities.md'],
386
+ derives_from: [19],
387
+ sources: ['**/prioriti*', '**/roadmap*', '**/stories*'],
388
+ }
389
+ - {
390
+ id: 30,
391
+ cat: A2,
392
+ name: 'Wireframes & mockups',
393
+ tier: 3,
394
+ kind: example,
395
+ patterns: ['**/wireframe*', '**/mockup*', '**/mockups/**', 'docs/ui/**'],
396
+ derives_from: [19],
397
+ sources: ['**/wireframe*', '**/mockup*', '**/ui/**'],
398
+ }
399
+ - {
400
+ id: 31,
401
+ cat: A2,
402
+ name: 'Interaction specifications',
403
+ tier: 3,
404
+ kind: reference,
405
+ patterns: ['**/interaction-spec*', '**/ui-spec*', '**/interaction*.md'],
406
+ derives_from: [30],
407
+ sources: ['**/interaction*', '**/ui-spec*', '**/wireframe*'],
408
+ }
409
+ - {
410
+ id: 32,
411
+ cat: A2,
412
+ name: 'Content requirements',
413
+ tier: 3,
414
+ kind: reference,
415
+ patterns: ['**/CONTENT_REQUIREMENTS*', '**/content-requirements*.md', 'docs/content*'],
416
+ derives_from: [31],
417
+ sources: ['**/content*', '**/copy*', '**/strings*', '**/locale*'],
418
+ }
419
+ - {
420
+ id: 33,
421
+ cat: A2,
422
+ name: 'Accessibility requirements',
423
+ tier: 3,
424
+ kind: canonical,
425
+ patterns:
426
+ [
427
+ '**/ACCESSIBILITY_REQS*',
428
+ '**/accessibility-requirements*.md',
429
+ '**/a11y-requirements*.md',
430
+ '**/wcag*.md',
431
+ ],
432
+ applies_when:
433
+ {
434
+ any:
435
+ [
436
+ { fact: 'platform:web' },
437
+ { fact: 'platform:mobile' },
438
+ { fact: 'fw:react' },
439
+ { fact: 'fw:vue' },
440
+ { fact: 'fw:next' },
441
+ { fact: 'fw:svelte' },
442
+ { fact: 'fw:angular' },
443
+ { fact: 'fw:astro' },
444
+ { fact: 'fw:remix' },
445
+ { fact: 'fw:sveltekit' },
446
+ { fact: 'fw:nuxt' },
447
+ ],
448
+ },
449
+ derives_from: [19],
450
+ sources: ['**/a11y*', '**/accessibility*', '**/wcag*', '**/aria*'],
451
+ }
452
+ - {
453
+ id: 34,
454
+ cat: A2,
455
+ name: 'i18n / l10n specs',
456
+ tier: 3,
457
+ kind: canonical,
458
+ patterns: ['**/I18N_SPEC*', '**/i18n-spec*.md', '**/l10n*.md', 'docs/i18n*'],
459
+ applies_when: { any: [{ fact: 'platform:web' }, { fact: 'platform:mobile' }] },
460
+ derives_from: [19],
461
+ sources:
462
+ [
463
+ '**/i18n*',
464
+ '**/l10n*',
465
+ '**/locales/**',
466
+ '**/messages/**',
467
+ '**/translations/**',
468
+ '**/lang/**',
469
+ ],
470
+ }
471
+ - {
472
+ id: 35,
473
+ cat: A2,
474
+ name: 'Persona profiles',
475
+ tier: 3,
476
+ kind: reference,
477
+ patterns: ['**/PERSONAS*.md', '**/personas*.md', '**/user-personas*'],
478
+ derives_from: [19],
479
+ sources: ['**/persona*', '**/user-research*'],
480
+ }
481
+
482
+ # ---------------------------------------------------------------- A3 (25)
483
+ - {
484
+ id: 36,
485
+ cat: A3,
486
+ name: 'System architecture overview',
487
+ tier: 2,
488
+ kind: canonical,
489
+ patterns:
490
+ [
491
+ 'docs/ARCHITECTURE*',
492
+ '**/ARCHITECTURE*.md',
493
+ 'docs/architecture*',
494
+ '**/system-architecture*',
495
+ ],
496
+ syncs_with: [49],
497
+ sources: ['any-source'],
498
+ }
499
+ - {
500
+ id: 37,
501
+ cat: A3,
502
+ name: 'Component design documents',
503
+ tier: 3,
504
+ kind: canonical,
505
+ patterns:
506
+ ['docs/components/**', 'docs/design/**', '**/COMPONENT_DESIGN*', '**/component-design*.md'],
507
+ derives_from: [36],
508
+ sources: ['any-source'],
509
+ }
510
+ - {
511
+ id: 38,
512
+ cat: A3,
513
+ name: 'Technology stack documentation',
514
+ tier: 2,
515
+ kind: reference,
516
+ patterns: ['**/TECH_STACK*.md', '**/tech-stack*.md', 'docs/tech-stack*', '**/stack.md'],
517
+ derives_from: [36],
518
+ sources:
519
+ [
520
+ 'package.json',
521
+ 'pyproject.toml',
522
+ 'go.mod',
523
+ 'Cargo.toml',
524
+ 'pom.xml',
525
+ 'build.gradle*',
526
+ 'Gemfile',
527
+ 'composer.json',
528
+ 'mix.exs',
529
+ '*.csproj',
530
+ '.nvmrc',
531
+ '.python-version',
532
+ ],
533
+ }
534
+ - {
535
+ id: 39,
536
+ cat: A3,
537
+ name: 'ADRs (individual)',
538
+ tier: 4,
539
+ kind: canonical,
540
+ patterns: ['docs/adr/*.md', '**/adr/*.md', '**/ADR-*.md', '**/adr-*.md'],
541
+ sources: ['docs/adr/**', '**/adr/**', '**/ADR*'],
542
+ }
543
+ - {
544
+ id: 40,
545
+ cat: A3,
546
+ name: 'Design pattern documentation',
547
+ tier: 3,
548
+ kind: reference,
549
+ patterns: ['**/PATTERNS*.md', '**/patterns*.md', 'docs/patterns*'],
550
+ derives_from: [37],
551
+ sources: ['**/pattern*', '**/design/**'],
552
+ }
553
+ - {
554
+ id: 41,
555
+ cat: A3,
556
+ name: 'UML diagrams',
557
+ tier: 3,
558
+ kind: reference,
559
+ patterns: ['**/*.puml', '**/*.plantuml', '**/uml/**', '**/diagrams/**/*.puml'],
560
+ derives_from: [45],
561
+ sources: ['**/*.puml', '**/*.plantuml', '**/*.xmi', '**/uml/**'],
562
+ }
563
+ - {
564
+ id: 42,
565
+ cat: A3,
566
+ name: 'C4 model diagrams',
567
+ tier: 3,
568
+ kind: reference,
569
+ patterns: ['**/c4*.md', '**/C4*.md', '**/*.c4.puml', 'docs/c4*'],
570
+ derives_from: [36],
571
+ sources: ['**/c4*', '**/*.c4.puml', '**/context-diagram*'],
572
+ }
573
+ - {
574
+ id: 43,
575
+ cat: A3,
576
+ name: 'Entity-relationship diagrams',
577
+ tier: 3,
578
+ kind: reference,
579
+ patterns: ['**/erd*.md', '**/ERD*.md', '**/entity-relationship*'],
580
+ applies_when:
581
+ {
582
+ any:
583
+ [
584
+ { fact: 'db:postgres' },
585
+ { fact: 'db:mysql' },
586
+ { fact: 'db:sqlite' },
587
+ { fact: 'db:mongodb' },
588
+ { fact: 'db:dynamodb' },
589
+ ],
590
+ },
591
+ derives_from: [45],
592
+ sources: ['**/erd*', '**/entity*', '**/*.sql', '**/migrations/**'],
593
+ }
594
+ - {
595
+ id: 44,
596
+ cat: A3,
597
+ name: 'Database schema documentation',
598
+ tier: 3,
599
+ kind: derived,
600
+ patterns: ['**/SCHEMA.md', 'docs/schema*', '**/db/schema*.md', '**/database/schema*.md'],
601
+ applies_when:
602
+ {
603
+ any:
604
+ [
605
+ { fact: 'db:postgres' },
606
+ { fact: 'db:mysql' },
607
+ { fact: 'db:sqlite' },
608
+ { fact: 'db:mongodb' },
609
+ { fact: 'db:redis' },
610
+ { fact: 'db:clickhouse' },
611
+ { fact: 'db:elasticsearch' },
612
+ { fact: 'db:vector' },
613
+ { fact: 'db:dynamodb' },
614
+ { fact: 'orm:prisma' },
615
+ { fact: 'orm:sequelize' },
616
+ { fact: 'orm:sqlalchemy' },
617
+ { fact: 'orm:gorm' },
618
+ { fact: 'orm:sqlx' },
619
+ { fact: 'orm:diesel' },
620
+ { fact: 'orm:drizzle' },
621
+ { fact: 'orm:hibernate' },
622
+ { fact: 'orm:mongoose' },
623
+ { fact: 'orm:typeorm' },
624
+ { fact: 'orm:activerecord' },
625
+ ],
626
+ },
627
+ derives_from: [45],
628
+ syncs_with: [22],
629
+ sources:
630
+ [
631
+ '**/migrations/**',
632
+ '**/*.sql',
633
+ '**/prisma/**',
634
+ '**/*.prisma',
635
+ '**/models/**',
636
+ '**/alembic/**',
637
+ ],
638
+ }
639
+ - {
640
+ id: 45,
641
+ cat: A3,
642
+ name: 'Data model documentation',
643
+ tier: 3,
644
+ kind: derived,
645
+ patterns: ['**/DATA_MODEL*.md', '**/data-model*.md', 'docs/data-model*'],
646
+ applies_when:
647
+ {
648
+ any:
649
+ [
650
+ { fact: 'db:postgres' },
651
+ { fact: 'db:mysql' },
652
+ { fact: 'db:sqlite' },
653
+ { fact: 'db:mongodb' },
654
+ { fact: 'db:dynamodb' },
655
+ { fact: 'orm:prisma' },
656
+ { fact: 'orm:sequelize' },
657
+ { fact: 'orm:sqlalchemy' },
658
+ { fact: 'orm:gorm' },
659
+ ],
660
+ },
661
+ derives_from: [22],
662
+ sources: ['**/migrations/**', '**/*.sql', '**/prisma/**', '**/*.prisma', '**/models/**'],
663
+ }
664
+ - {
665
+ id: 46,
666
+ cat: A3,
667
+ name: 'Data migration documentation',
668
+ tier: 3,
669
+ kind: canonical,
670
+ patterns:
671
+ ['**/migrations/README*', '**/MIGRATIONS*.md', 'docs/migrations*', '**/migrations.md'],
672
+ applies_when:
673
+ {
674
+ any:
675
+ [
676
+ { fact: 'db:postgres' },
677
+ { fact: 'db:mysql' },
678
+ { fact: 'db:sqlite' },
679
+ { fact: 'db:mongodb' },
680
+ { fact: 'db:dynamodb' },
681
+ { fact: 'orm:prisma' },
682
+ { fact: 'orm:sequelize' },
683
+ { fact: 'orm:sqlalchemy' },
684
+ { fact: 'orm:gorm' },
685
+ ],
686
+ },
687
+ derives_from: [44],
688
+ sources: ['**/migrations/**', '**/alembic/**', '**/*.sql'],
689
+ }
690
+ - {
691
+ id: 47,
692
+ cat: A3,
693
+ name: 'Event/message schema docs',
694
+ tier: 3,
695
+ kind: reference,
696
+ patterns: ['**/EVENTS.md', '**/message-schemas*.md', '**/event-schemas*.md', 'docs/events*'],
697
+ derives_from: [88],
698
+ sources: ['**/events*', '**/message*', '**/*.proto', '**/avro*', '**/schema/**'],
699
+ }
700
+ - {
701
+ id: 48,
702
+ cat: A3,
703
+ name: 'Integration architecture',
704
+ tier: 3,
705
+ kind: canonical,
706
+ patterns:
707
+ [
708
+ '**/INTEGRATION*.md',
709
+ '**/integrations*.md',
710
+ 'docs/integrations*',
711
+ '**/integration-architecture*',
712
+ ],
713
+ derives_from: [36],
714
+ sources: ['**/integration*', '**/connector*', '**/adapter*', '**/client*'],
715
+ }
716
+ - {
717
+ id: 49,
718
+ cat: A3,
719
+ name: 'Deployment architecture',
720
+ tier: 3,
721
+ kind: canonical,
722
+ patterns:
723
+ [
724
+ '**/DEPLOYMENT*.md',
725
+ 'docs/deployment*',
726
+ '**/deployment-architecture*',
727
+ 'infra/**/README*',
728
+ '**/deploy/README*',
729
+ ],
730
+ applies_when:
731
+ {
732
+ any:
733
+ [
734
+ { fact: 'has:ci' },
735
+ { fact: 'has:containers' },
736
+ { fact: 'has:kubernetes' },
737
+ { fact: 'has:terraform' },
738
+ { fact: 'platform:server' },
739
+ ],
740
+ },
741
+ derives_from: [48, 117],
742
+ syncs_with: [36],
743
+ sources:
744
+ [
745
+ '**/Dockerfile*',
746
+ '**/docker-compose*.yml',
747
+ '**/k8s/**',
748
+ '**/*.tf',
749
+ '**/.github/workflows/**',
750
+ '**/deploy/**',
751
+ '**/helm/**',
752
+ 'Makefile',
753
+ ],
754
+ }
755
+ - {
756
+ id: 50,
757
+ cat: A3,
758
+ name: 'Security architecture',
759
+ tier: 3,
760
+ kind: canonical,
761
+ patterns:
762
+ [
763
+ '**/security-architecture*.md',
764
+ 'docs/security/architecture*',
765
+ '**/SECURITY_ARCHITECTURE*',
766
+ ],
767
+ applies_when:
768
+ {
769
+ any:
770
+ [
771
+ { fact: 'project:api' },
772
+ { fact: 'auth:jwt' },
773
+ { fact: 'auth:oauth' },
774
+ { fact: 'auth:session' },
775
+ { fact: 'auth:apikey' },
776
+ { fact: 'platform:server' },
777
+ ],
778
+ },
779
+ derives_from: [36],
780
+ sources: ['**/auth*', '**/security*', '**/crypto*', '**/middleware/**'],
781
+ }
782
+ - {
783
+ id: 51,
784
+ cat: A3,
785
+ name: 'Threat model',
786
+ tier: 3,
787
+ kind: canonical,
788
+ patterns: ['**/THREAT_MODEL*', '**/threat-model*.md', 'docs/security/threat*'],
789
+ applies_when:
790
+ {
791
+ any:
792
+ [
793
+ { fact: 'project:api' },
794
+ { fact: 'auth:jwt' },
795
+ { fact: 'auth:oauth' },
796
+ { fact: 'auth:session' },
797
+ { fact: 'auth:apikey' },
798
+ { fact: 'platform:server' },
799
+ ],
800
+ },
801
+ derives_from: [50],
802
+ sources: ['**/auth*', '**/security*', '**/crypto*', '**/session*'],
803
+ }
804
+ - {
805
+ id: 52,
806
+ cat: A3,
807
+ name: 'Concurrency design',
808
+ tier: 3,
809
+ kind: canonical,
810
+ patterns:
811
+ [
812
+ '**/CONCURRENCY*.md',
813
+ '**/concurrency*.md',
814
+ 'docs/design/concurrency*',
815
+ '**/async-design*.md',
816
+ ],
817
+ applies_when:
818
+ {
819
+ any:
820
+ [
821
+ { fact: 'lang:go' },
822
+ { fact: 'lang:rust' },
823
+ { fact: 'lang:java' },
824
+ { fact: 'lang:csharp' },
825
+ { fact: 'lang:python' },
826
+ { fact: 'project:api' },
827
+ ],
828
+ },
829
+ derives_from: [37],
830
+ sources: ['**/concurrency*', '**/async*', '**/thread*', '**/worker*', '**/queue*'],
831
+ }
832
+ - {
833
+ id: 53,
834
+ cat: A3,
835
+ name: 'Error handling strategy',
836
+ tier: 3,
837
+ kind: canonical,
838
+ patterns:
839
+ [
840
+ '**/ERROR_HANDLING*.md',
841
+ '**/error-handling*.md',
842
+ 'docs/error-handling*',
843
+ '**/errors-strategy*.md',
844
+ ],
845
+ derives_from: [37],
846
+ sources:
847
+ ['**/errors*', '**/exceptions*', '**/error*.{ts,py,go,rs}', '**/panic*', '**/recovery*'],
848
+ }
849
+ - {
850
+ id: 54,
851
+ cat: A3,
852
+ name: 'Logging & observability design',
853
+ tier: 3,
854
+ kind: canonical,
855
+ patterns:
856
+ [
857
+ 'docs/logging*.md',
858
+ 'docs/observability*.md',
859
+ '**/logging-design*.md',
860
+ '**/observability-design*.md',
861
+ ],
862
+ applies_when:
863
+ {
864
+ any:
865
+ [
866
+ { fact: 'obs:prometheus' },
867
+ { fact: 'obs:datadog' },
868
+ { fact: 'obs:grafana' },
869
+ { fact: 'obs:otel' },
870
+ { fact: 'obs:sentry' },
871
+ { fact: 'has:monitoring' },
872
+ { fact: 'project:api' },
873
+ { fact: 'platform:server' },
874
+ ],
875
+ },
876
+ derives_from: [53],
877
+ sources:
878
+ [
879
+ '**/logging*',
880
+ '**/log*.{ts,py,go,rs}',
881
+ '**/pino*',
882
+ '**/winston*',
883
+ '**/structlog*',
884
+ '**/tracing*',
885
+ '**/otel*',
886
+ ],
887
+ }
888
+ - {
889
+ id: 55,
890
+ cat: A3,
891
+ name: 'Caching strategy',
892
+ tier: 3,
893
+ kind: canonical,
894
+ patterns: ['**/CACHING*.md', '**/caching*.md', 'docs/caching*', '**/cache-strategy*.md'],
895
+ applies_when: { any: [{ fact: 'db:redis' }, { fact: 'project:api' }] },
896
+ derives_from: [37],
897
+ sources: ['**/cache*', '**/redis*', '**/memcache*', '**/invalidat*'],
898
+ }
899
+ - {
900
+ id: 56,
901
+ cat: A3,
902
+ name: 'Scaling strategy',
903
+ tier: 3,
904
+ kind: canonical,
905
+ patterns: ['**/SCALING*.md', '**/scaling-strategy*.md', 'docs/scaling*'],
906
+ derives_from: [36],
907
+ sources: ['**/k8s/**', '**/*.tf', '**/docker-compose*.yml', '**/scaling*'],
908
+ }
909
+ - {
910
+ id: 57,
911
+ cat: A3,
912
+ name: 'Disaster recovery plan',
913
+ tier: 3,
914
+ kind: canonical,
915
+ patterns:
916
+ ['**/DISASTER_RECOVERY*', '**/disaster-recovery*.md', '**/dr-plan*.md', 'docs/disaster*'],
917
+ applies_when:
918
+ {
919
+ any:
920
+ [
921
+ { fact: 'platform:server' },
922
+ { fact: 'has:ci' },
923
+ { fact: 'has:containers' },
924
+ { fact: 'has:kubernetes' },
925
+ ],
926
+ },
927
+ derives_from: [49, 56],
928
+ sources: ['**/dr-plan*', '**/disaster*', '**/failover*', '**/backup*', '**/*.tf'],
929
+ }
930
+ - {
931
+ id: 58,
932
+ cat: A3,
933
+ name: 'Capacity planning',
934
+ tier: 4,
935
+ kind: canonical,
936
+ patterns: ['**/CAPACITY*.md', 'docs/capacity*', '**/capacity-plan*'],
937
+ derives_from: [56],
938
+ sources: ['**/capacity*', '**/sizing*'],
939
+ }
940
+ - {
941
+ id: 59,
942
+ cat: A3,
943
+ name: 'Performance budget',
944
+ tier: 3,
945
+ kind: canonical,
946
+ patterns: ['**/PERF_BUDGET*.md', '**/performance-budget*.md', '**/perf-budget*.md'],
947
+ applies_when:
948
+ { any: [{ fact: 'platform:web' }, { fact: 'has:perf-tests' }, { fact: 'project:api' }] },
949
+ derives_from: [56],
950
+ syncs_with: [133],
951
+ sources:
952
+ ['**/budget*', '**/performance*', '**/lighthouse*', '**/web-vitals*', '**/size-limit*'],
953
+ }
954
+ - {
955
+ id: 60,
956
+ cat: A3,
957
+ name: 'Design review notes',
958
+ tier: 4,
959
+ kind: reference,
960
+ patterns: ['**/design-reviews*.md', 'docs/design/reviews*', '**/review-notes*.md'],
961
+ derives_from: [39],
962
+ sources: ['**/design-review*', '**/adr/**', '**/ADR*'],
963
+ }
964
+
965
+ # ---------------------------------------------------------------- A4 (14)
966
+ - {
967
+ id: 61,
968
+ cat: A4,
969
+ name: 'README (root)',
970
+ tier: 0,
971
+ kind: canonical,
972
+ patterns: ['README.md', 'README.rst', 'README.mdx', 'README.txt', 'README'],
973
+ alias_rule: REPO-004,
974
+ sources: ['any-source'],
975
+ }
976
+ - {
977
+ id: 62,
978
+ cat: A4,
979
+ name: 'README (per module)',
980
+ tier: 1,
981
+ kind: canonical,
982
+ patterns:
983
+ [
984
+ '**/README.md',
985
+ '**/README.rst',
986
+ '**/README.mdx',
987
+ '!README.md',
988
+ '!README.rst',
989
+ '!README.mdx',
990
+ ],
991
+ derives_from: [61],
992
+ sources: ['any-source'],
993
+ }
994
+ - {
995
+ id: 63,
996
+ cat: A4,
997
+ name: 'Inline code comments',
998
+ tier: 0,
999
+ kind: canonical,
1000
+ patterns: [],
1001
+ notes: 'Quality is judgement, not file presence — belongs to the judgement queue.',
1002
+ }
1003
+ - {
1004
+ id: 64,
1005
+ cat: A4,
1006
+ name: 'Docstrings / JSDoc / XML docs',
1007
+ tier: 0,
1008
+ kind: canonical,
1009
+ patterns: [],
1010
+ notes: 'Covered mechanically by the docstring-coverage invariant (DOCU-INV-DOCS).',
1011
+ }
1012
+ - {
1013
+ id: 65,
1014
+ cat: A4,
1015
+ name: 'Type/interface annotations',
1016
+ tier: 1,
1017
+ kind: canonical,
1018
+ patterns: [],
1019
+ notes: 'Self-documenting types; presence of a typechecker is the practical signal.',
1020
+ }
1021
+ - {
1022
+ id: 66,
1023
+ cat: A4,
1024
+ name: 'TODO/FIXME/HACK with context',
1025
+ tier: 3,
1026
+ kind: reference,
1027
+ patterns: [],
1028
+ notes: 'Context quality is judgement; the raw markers are code, not docs.',
1029
+ }
1030
+ - {
1031
+ id: 67,
1032
+ cat: A4,
1033
+ name: 'Code-level design notes',
1034
+ tier: 4,
1035
+ kind: reference,
1036
+ patterns: [],
1037
+ notes: 'Architectural decisions in source — judgement queue.',
1038
+ }
1039
+ - {
1040
+ id: 68,
1041
+ cat: A4,
1042
+ name: 'Literate programming',
1043
+ tier: 4,
1044
+ kind: reference,
1045
+ patterns: ['**/*.lit*', '**/literate*'],
1046
+ sources: ['**/*.lit*', '**/*.ipynb', '**/org/**'],
1047
+ }
1048
+ - {
1049
+ id: 69,
1050
+ cat: A4,
1051
+ name: 'Dependency documentation',
1052
+ tier: 1,
1053
+ kind: derived,
1054
+ patterns: ['**/DEPENDENCIES.md', '**/dependencies.md', 'docs/dependencies*', '**/deps.md'],
1055
+ sources:
1056
+ [
1057
+ 'package.json',
1058
+ 'requirements*.txt',
1059
+ 'pyproject.toml',
1060
+ 'go.mod',
1061
+ 'Cargo.toml',
1062
+ 'pom.xml',
1063
+ 'build.gradle*',
1064
+ 'Gemfile',
1065
+ 'composer.json',
1066
+ 'mix.exs',
1067
+ '*.csproj',
1068
+ ],
1069
+ }
1070
+ - {
1071
+ id: 70,
1072
+ cat: A4,
1073
+ name: 'CODEOWNERS',
1074
+ tier: 2,
1075
+ kind: canonical,
1076
+ patterns: ['.github/CODEOWNERS', '**/CODEOWNERS', '**/codeowners'],
1077
+ derives_from: [4],
1078
+ sources: ['.github/CODEOWNERS', '**/CODEOWNERS', '**/codeowners'],
1079
+ }
1080
+ - {
1081
+ id: 71,
1082
+ cat: A4,
1083
+ name: 'Deprecated API documentation',
1084
+ tier: 3,
1085
+ kind: reference,
1086
+ patterns:
1087
+ ['**/DEPRECATION*.md', '**/deprecation*.md', '**/deprecated-api*.md', 'docs/deprecated*'],
1088
+ applies_when: { any: [{ fact: 'project:library' }, { fact: 'project:api' }] },
1089
+ derives_from: [81],
1090
+ sources: ['**/deprecat*', '**/migration*', '**/CHANGELOG*'],
1091
+ }
1092
+ - {
1093
+ id: 72,
1094
+ cat: A4,
1095
+ name: 'Magic number documentation',
1096
+ tier: 4,
1097
+ kind: reference,
1098
+ patterns: [],
1099
+ notes: 'Lives in comments at the point of use — judgement queue.',
1100
+ }
1101
+ - {
1102
+ id: 73,
1103
+ cat: A4,
1104
+ name: 'Algorithm documentation',
1105
+ tier: 3,
1106
+ kind: reference,
1107
+ patterns: ['**/ALGORITHMS.md', '**/algorithms*.md', 'docs/algorithms*'],
1108
+ sources: ['any-source'],
1109
+ }
1110
+ - {
1111
+ id: 74,
1112
+ cat: A4,
1113
+ name: 'Regex documentation',
1114
+ tier: 4,
1115
+ kind: reference,
1116
+ patterns: [],
1117
+ notes: 'Complex patterns need inline explanation — judgement queue.',
1118
+ }
1119
+
1120
+ # ---------------------------------------------------------------- A5 (16)
1121
+ - {
1122
+ id: 75,
1123
+ cat: A5,
1124
+ name: 'API overview / philosophy',
1125
+ tier: 2,
1126
+ kind: canonical,
1127
+ patterns:
1128
+ ['docs/api/README*', 'docs/api/index*', '**/api-overview*.md', 'docs/API.md', '**/api.md'],
1129
+ applies_when:
1130
+ {
1131
+ any:
1132
+ [
1133
+ { fact: 'project:api' },
1134
+ { fact: 'api:graphql' },
1135
+ { fact: 'api:grpc' },
1136
+ { fact: 'api:trpc' },
1137
+ { fact: 'api:websocket' },
1138
+ ],
1139
+ },
1140
+ sources: ['**/openapi.*', '**/api/**', '**/routes/**'],
1141
+ }
1142
+ - {
1143
+ id: 76,
1144
+ cat: A5,
1145
+ name: 'API reference (per endpoint)',
1146
+ tier: 2,
1147
+ kind: derived,
1148
+ patterns:
1149
+ ['docs/api/**', 'docs/reference/api*', '**/API_REFERENCE*.md', '**/api-reference*.md'],
1150
+ applies_when:
1151
+ {
1152
+ any:
1153
+ [
1154
+ { fact: 'project:api' },
1155
+ { fact: 'api:graphql' },
1156
+ { fact: 'api:grpc' },
1157
+ { fact: 'api:trpc' },
1158
+ { fact: 'api:websocket' },
1159
+ ],
1160
+ },
1161
+ alias_rule: DOC-003,
1162
+ derives_from: [83],
1163
+ sources:
1164
+ [
1165
+ '**/openapi.{yaml,yml,json}',
1166
+ '**/swagger.{yaml,yml,json}',
1167
+ '**/*.graphql',
1168
+ '**/*.proto',
1169
+ '**/routes/**',
1170
+ '**/router*.{ts,js,py,go,rs}',
1171
+ '**/api/**',
1172
+ '**/handlers/**',
1173
+ '**/controllers/**',
1174
+ ],
1175
+ }
1176
+ - {
1177
+ id: 77,
1178
+ cat: A5,
1179
+ name: 'API authentication guide',
1180
+ tier: 2,
1181
+ kind: canonical,
1182
+ patterns: ['**/api-auth*.md', 'docs/api/auth*', '**/api-authentication*.md'],
1183
+ applies_when:
1184
+ {
1185
+ any:
1186
+ [
1187
+ { fact: 'project:api' },
1188
+ { fact: 'auth:jwt' },
1189
+ { fact: 'auth:oauth' },
1190
+ { fact: 'auth:apikey' },
1191
+ { fact: 'auth:session' },
1192
+ ],
1193
+ },
1194
+ derives_from: [139],
1195
+ sources: ['**/auth*', '**/oauth*', '**/jwt*', '**/session*', '**/api/**'],
1196
+ }
1197
+ - {
1198
+ id: 78,
1199
+ cat: A5,
1200
+ name: 'API rate limiting / quotas',
1201
+ tier: 3,
1202
+ kind: canonical,
1203
+ patterns: ['**/rate-limit*.md', '**/ratelimit*.md', '**/quotas*.md', 'docs/api/rate*'],
1204
+ applies_when: { any: [{ fact: 'project:api' }] },
1205
+ derives_from: [76],
1206
+ sources: ['**/rate-limit*', '**/throttle*', '**/quota*'],
1207
+ }
1208
+ - {
1209
+ id: 79,
1210
+ cat: A5,
1211
+ name: 'API pagination guide',
1212
+ tier: 3,
1213
+ kind: canonical,
1214
+ patterns: ['**/pagination*.md', 'docs/api/pagination*'],
1215
+ applies_when: { any: [{ fact: 'project:api' }] },
1216
+ derives_from: [76],
1217
+ sources: ['**/pagination*', '**/cursor*', '**/page*'],
1218
+ }
1219
+ - {
1220
+ id: 80,
1221
+ cat: A5,
1222
+ name: 'API error catalog',
1223
+ tier: 2,
1224
+ kind: canonical,
1225
+ patterns:
1226
+ ['**/API_ERRORS*.md', 'docs/api/errors*', '**/error-catalog*.md', '**/error-codes*.md'],
1227
+ applies_when: { any: [{ fact: 'project:api' }] },
1228
+ derives_from: [76],
1229
+ sources: ['**/errors*', '**/error-codes*', '**/exceptions*', '**/error*.{ts,py,go,rs}'],
1230
+ }
1231
+ - {
1232
+ id: 81,
1233
+ cat: A5,
1234
+ name: 'API versioning guide',
1235
+ tier: 3,
1236
+ kind: canonical,
1237
+ patterns: ['**/api-versioning*.md', 'docs/api/versioning*', '**/versioning.md'],
1238
+ applies_when: { any: [{ fact: 'project:api' }] },
1239
+ derives_from: [76],
1240
+ sources: ['**/version*', '**/openapi.*'],
1241
+ }
1242
+ - {
1243
+ id: 82,
1244
+ cat: A5,
1245
+ name: 'API changelog',
1246
+ tier: 3,
1247
+ kind: derived,
1248
+ patterns: ['docs/api/CHANGELOG*', '**/api-changelog*.md'],
1249
+ applies_when: { any: [{ fact: 'project:api' }] },
1250
+ derives_from: [7],
1251
+ sources: ['**/api/**', '**/openapi.*'],
1252
+ }
1253
+ - {
1254
+ id: 83,
1255
+ cat: A5,
1256
+ name: 'OpenAPI / GraphQL / gRPC schemas',
1257
+ tier: 2,
1258
+ kind: reference,
1259
+ patterns:
1260
+ [
1261
+ '**/openapi.{yaml,yml,json}',
1262
+ '**/swagger.{yaml,yml,json}',
1263
+ '**/*.graphql',
1264
+ '**/*.gql',
1265
+ '**/*.proto',
1266
+ ],
1267
+ applies_when:
1268
+ { any: [{ fact: 'project:api' }, { fact: 'api:graphql' }, { fact: 'api:grpc' }] },
1269
+ sources:
1270
+ ['**/openapi.{yaml,yml,json}', '**/swagger.{yaml,yml,json}', '**/*.graphql', '**/*.proto'],
1271
+ }
1272
+ - {
1273
+ id: 84,
1274
+ cat: A5,
1275
+ name: 'API usage examples / recipes',
1276
+ tier: 3,
1277
+ kind: example,
1278
+ patterns:
1279
+ [
1280
+ 'docs/api/examples*',
1281
+ '**/recipes.md',
1282
+ 'docs/recipes*',
1283
+ '**/api-examples*.md',
1284
+ '**/cookbook.md',
1285
+ ],
1286
+ applies_when: { any: [{ fact: 'project:api' }, { fact: 'project:library' }] },
1287
+ derives_from: [76],
1288
+ sources: ['**/examples/**', '**/recipes*', '**/cookbook*'],
1289
+ }
1290
+ - {
1291
+ id: 85,
1292
+ cat: A5,
1293
+ name: 'API SDK documentation',
1294
+ tier: 3,
1295
+ kind: derived,
1296
+ patterns: ['**/sdk/README*', 'docs/sdk/**', '**/SDK_GUIDE*.md', '**/clients/**/README*'],
1297
+ applies_when: { any: [{ fact: 'project:api' }, { fact: 'project:library' }] },
1298
+ derives_from: [83],
1299
+ sources: ['**/sdk/**', '**/clients/**', '**/sdk*'],
1300
+ }
1301
+ - {
1302
+ id: 86,
1303
+ cat: A5,
1304
+ name: 'Webhook documentation',
1305
+ tier: 3,
1306
+ kind: canonical,
1307
+ patterns: ['**/webhooks.md', 'docs/webhooks*', '**/WEBHOOKS.md'],
1308
+ applies_when: { any: [{ fact: 'project:api' }, { fact: 'api:websocket' }] },
1309
+ derives_from: [88],
1310
+ sources: ['**/webhook*', '**/webhooks*'],
1311
+ }
1312
+ - {
1313
+ id: 87,
1314
+ cat: A5,
1315
+ name: 'Internal API / RPC docs',
1316
+ tier: 3,
1317
+ kind: canonical,
1318
+ patterns: ['**/internal-api*.md', 'docs/rpc*.md', '**/RPC.md'],
1319
+ applies_when: { any: [{ fact: 'api:grpc' }, { fact: 'api:trpc' }, { fact: 'project:api' }] },
1320
+ derives_from: [76],
1321
+ sources: ['**/*.proto', '**/grpc/**', '**/rpc/**'],
1322
+ }
1323
+ - {
1324
+ id: 88,
1325
+ cat: A5,
1326
+ name: 'Event/message API docs',
1327
+ tier: 3,
1328
+ kind: canonical,
1329
+ patterns: ['**/EVENTS.md', 'docs/events*', '**/message-api*.md'],
1330
+ applies_when:
1331
+ { any: [{ fact: 'api:websocket' }, { fact: 'db:redis' }, { fact: 'fw:celery' }] },
1332
+ derives_from: [47],
1333
+ sources: ['**/events*', '**/message*', '**/topic*', '**/queue*'],
1334
+ }
1335
+ - {
1336
+ id: 89,
1337
+ cat: A5,
1338
+ name: 'CLI API documentation',
1339
+ tier: 2,
1340
+ kind: derived,
1341
+ patterns:
1342
+ [
1343
+ 'docs/cli.md',
1344
+ '**/CLI_REFERENCE*.md',
1345
+ '**/cli-reference*.md',
1346
+ '**/cli.md',
1347
+ 'docs/commands*',
1348
+ ],
1349
+ applies_when: { fact: 'project:cli' },
1350
+ sources:
1351
+ ['**/cli*.{ts,js,py,go,rs}', '**/commands/**', '**/cmd/**', 'bin/**', 'package.json'],
1352
+ }
1353
+ - {
1354
+ id: 90,
1355
+ cat: A5,
1356
+ name: 'Plugin/extension API',
1357
+ tier: 3,
1358
+ kind: canonical,
1359
+ patterns:
1360
+ [
1361
+ '**/plugins.md',
1362
+ '**/PLUGINS.md',
1363
+ '**/plugin-api*.md',
1364
+ '**/extending*.md',
1365
+ '**/extensions.md',
1366
+ ],
1367
+ applies_when: { any: [{ fact: 'project:library' }, { fact: 'project:api' }] },
1368
+ derives_from: [76],
1369
+ sources: ['**/plugin*', '**/extension*', '**/hook*'],
1370
+ }
1371
+
1372
+ # ---------------------------------------------------------------- A6 (7)
1373
+ - {
1374
+ id: 91,
1375
+ cat: A6,
1376
+ name: 'Configuration reference',
1377
+ tier: 2,
1378
+ kind: canonical,
1379
+ patterns:
1380
+ ['**/CONFIG_REFERENCE*.md', 'docs/config*.md', '**/configuration.md', '**/config.md'],
1381
+ sources:
1382
+ [
1383
+ '.env.example',
1384
+ '.env*.example',
1385
+ '**/config.{ts,js,py,go,rs,toml,yaml,yml,json,ini,env}',
1386
+ '**/settings.{py,ts,js,go,rs}',
1387
+ '**/application.properties',
1388
+ '**/application.yaml',
1389
+ ],
1390
+ }
1391
+ - {
1392
+ id: 92,
1393
+ cat: A6,
1394
+ name: 'Environment variables',
1395
+ tier: 1,
1396
+ kind: canonical,
1397
+ patterns:
1398
+ [
1399
+ '.env.example',
1400
+ '**/.env.example',
1401
+ '**/env-vars.md',
1402
+ '**/environment-variables*.md',
1403
+ 'docs/env*.md',
1404
+ ],
1405
+ alias_rule: REPO-006,
1406
+ derives_from: [91],
1407
+ syncs_with: [91],
1408
+ sources:
1409
+ [
1410
+ '**/.env*',
1411
+ '**/config*.{ts,js,py,go,rs,toml,yaml,yml,json,ini}',
1412
+ '**/settings*.{py,ts,js,go,rs}',
1413
+ 'package.json',
1414
+ 'pyproject.toml',
1415
+ '**/Dockerfile*',
1416
+ '**/.github/workflows/**',
1417
+ ],
1418
+ }
1419
+ - {
1420
+ id: 93,
1421
+ cat: A6,
1422
+ name: 'Feature flags / toggles',
1423
+ tier: 3,
1424
+ kind: canonical,
1425
+ patterns: ['**/FEATURE_FLAGS*.md', '**/feature-flags*.md', '**/toggles.md', 'docs/flags*'],
1426
+ derives_from: [91],
1427
+ sources: ['**/flag*', '**/feature*', '**/toggle*', '**/flags*'],
1428
+ }
1429
+ - {
1430
+ id: 94,
1431
+ cat: A6,
1432
+ name: 'Config file format',
1433
+ tier: 3,
1434
+ kind: reference,
1435
+ patterns: ['**/config-schema*.json', '**/config.schema.json', 'docs/config-format*'],
1436
+ sources: ['**/config*.{json,yaml,yml,toml,ini,env}', '**/settings*.{py,ts}'],
1437
+ }
1438
+ - {
1439
+ id: 95,
1440
+ cat: A6,
1441
+ name: 'Secrets management',
1442
+ tier: 3,
1443
+ kind: canonical,
1444
+ patterns: ['**/SECRETS.md', 'docs/secrets*', '**/secret-management*.md'],
1445
+ applies_when:
1446
+ {
1447
+ any:
1448
+ [
1449
+ { fact: 'project:api' },
1450
+ { fact: 'platform:server' },
1451
+ { fact: 'has:ci' },
1452
+ { fact: 'has:secrets-scan' },
1453
+ ],
1454
+ },
1455
+ derives_from: [145],
1456
+ sources: ['**/secret*', '**/vault*', '**/sops*', '**/.env*', '**/secrets*'],
1457
+ }
1458
+ - {
1459
+ id: 96,
1460
+ cat: A6,
1461
+ name: 'Environment matrix',
1462
+ tier: 3,
1463
+ kind: reference,
1464
+ patterns: ['**/ENVIRONMENTS.md', 'docs/environments*', '**/env-matrix*.md'],
1465
+ applies_when:
1466
+ { any: [{ fact: 'has:ci' }, { fact: 'has:kubernetes' }, { fact: 'has:terraform' }] },
1467
+ derives_from: [91],
1468
+ sources: ['**/staging*', '**/production*', '**/.env*', '**/config/*.{yaml,yml,toml,env}'],
1469
+ }
1470
+ - {
1471
+ id: 97,
1472
+ cat: A6,
1473
+ name: 'License / entitlement config',
1474
+ tier: 4,
1475
+ kind: canonical,
1476
+ patterns: ['**/ENTITLEMENTS.md', '**/licensing*.md', '**/license-config*.md'],
1477
+ applies_when: { any: [{ fact: 'project:library' }, { fact: 'project:api' }] },
1478
+ derives_from: [91],
1479
+ sources: ['**/license*', '**/entitlement*', '**/feature-gate*'],
1480
+ }
1481
+
1482
+ # ---------------------------------------------------------------- A7 (17)
1483
+ - {
1484
+ id: 98,
1485
+ cat: A7,
1486
+ name: 'Test strategy / test plan',
1487
+ tier: 2,
1488
+ kind: canonical,
1489
+ patterns:
1490
+ [
1491
+ '**/TEST_PLAN*.md',
1492
+ '**/test-plan*.md',
1493
+ '**/TESTING_STRATEGY*.md',
1494
+ '**/testing-strategy*.md',
1495
+ 'docs/testing*.md',
1496
+ ],
1497
+ applies_when: { fact: 'has:tests' },
1498
+ sources:
1499
+ [
1500
+ '**/vitest.config*',
1501
+ '**/jest.config*',
1502
+ '**/pytest.ini',
1503
+ '**/tox.ini',
1504
+ '**/pyproject.toml',
1505
+ '**/conftest.py',
1506
+ '**/.github/workflows/**',
1507
+ ],
1508
+ }
1509
+ - {
1510
+ id: 99,
1511
+ cat: A7,
1512
+ name: 'Test case specifications',
1513
+ tier: 3,
1514
+ kind: canonical,
1515
+ patterns: ['**/test-cases*.md', '**/TEST_CASES.md', 'docs/test-cases*', '**/test-spec*.md'],
1516
+ applies_when: { fact: 'has:tests' },
1517
+ derives_from: [98],
1518
+ sources: ['**/test*.{ts,js,py,go,rs}', '**/*_test*', '**/test_*'],
1519
+ }
1520
+ - {
1521
+ id: 100,
1522
+ cat: A7,
1523
+ name: 'Unit test documentation',
1524
+ tier: 2,
1525
+ kind: canonical,
1526
+ patterns: ['docs/tests/**', '**/unit-tests*.md', '**/unit-testing*.md', '**/UNIT_TESTS.md'],
1527
+ applies_when: { fact: 'has:tests' },
1528
+ derives_from: [98],
1529
+ sources: ['**/*.test.*', '**/*.spec.*', '**/test_*.py', '**/*_test.go', '**/__tests__/**'],
1530
+ }
1531
+ - {
1532
+ id: 101,
1533
+ cat: A7,
1534
+ name: 'Integration test docs',
1535
+ tier: 3,
1536
+ kind: canonical,
1537
+ patterns: ['**/integration-tests*.md', 'docs/integration*'],
1538
+ applies_when: { fact: 'has:tests' },
1539
+ derives_from: [98],
1540
+ sources: ['**/integration*/**', '**/tests/integration/**'],
1541
+ }
1542
+ - {
1543
+ id: 102,
1544
+ cat: A7,
1545
+ name: 'E2E test documentation',
1546
+ tier: 3,
1547
+ kind: canonical,
1548
+ patterns:
1549
+ [
1550
+ '**/e2e-testing*.md',
1551
+ '**/E2E_TESTS.md',
1552
+ '**/end-to-end*.md',
1553
+ '**/cypress/README*',
1554
+ '**/playwright/README*',
1555
+ ],
1556
+ applies_when: { fact: 'has:e2e' },
1557
+ derives_from: [98],
1558
+ sources: ['**/cypress/**', '**/playwright/**', '**/e2e/**', '**/selenium/**'],
1559
+ }
1560
+ - {
1561
+ id: 103,
1562
+ cat: A7,
1563
+ name: 'Performance test docs',
1564
+ tier: 3,
1565
+ kind: canonical,
1566
+ patterns:
1567
+ ['**/perf-test*.md', '**/performance-tests*.md', '**/load-test*.md', '**/BENCHMARKS.md'],
1568
+ applies_when: { fact: 'has:perf-tests' },
1569
+ derives_from: [98],
1570
+ sources: ['**/k6*', '**/locust*', '**/autocannon*', '**/benchmark*', '**/perf*'],
1571
+ }
1572
+ - {
1573
+ id: 104,
1574
+ cat: A7,
1575
+ name: 'Security test docs',
1576
+ tier: 3,
1577
+ kind: canonical,
1578
+ patterns: ['**/security-tests*.md', '**/pen-test-plan*.md', 'docs/security/tests*'],
1579
+ applies_when:
1580
+ {
1581
+ any:
1582
+ [
1583
+ { fact: 'has:sast' },
1584
+ { fact: 'has:secrets-scan' },
1585
+ { fact: 'project:api' },
1586
+ { fact: 'has:dep-scan' },
1587
+ ],
1588
+ },
1589
+ derives_from: [98],
1590
+ sources: ['**/bandit*', '**/semgrep*', '**/.gitleaks*', '**/snyk*', '**/trivy*'],
1591
+ }
1592
+ - {
1593
+ id: 105,
1594
+ cat: A7,
1595
+ name: 'Accessibility test docs',
1596
+ tier: 3,
1597
+ kind: canonical,
1598
+ patterns: ['**/a11y-test*.md', '**/accessibility-tests*.md'],
1599
+ applies_when: { any: [{ fact: 'platform:web' }, { fact: 'platform:mobile' }] },
1600
+ derives_from: [98, 33],
1601
+ sources: ['**/axe*', '**/a11y*', '**/accessibility*', '**/wcag*'],
1602
+ }
1603
+ - {
1604
+ id: 106,
1605
+ cat: A7,
1606
+ name: 'Test data documentation',
1607
+ tier: 3,
1608
+ kind: canonical,
1609
+ patterns: ['**/test-data*.md', 'docs/test-data*', '**/seeding*.md'],
1610
+ applies_when: { fact: 'has:tests' },
1611
+ derives_from: [98],
1612
+ sources: ['**/fixtures/**', '**/seed*', '**/factories/**', '**/factories*'],
1613
+ }
1614
+ - {
1615
+ id: 107,
1616
+ cat: A7,
1617
+ name: 'Test fixtures / factories',
1618
+ tier: 3,
1619
+ kind: reference,
1620
+ patterns:
1621
+ ['**/fixtures/README*', '**/factories/README*', '**/test-factories*.md', '**/fixtures.md'],
1622
+ applies_when: { fact: 'has:tests' },
1623
+ derives_from: [98],
1624
+ sources: ['**/fixtures/**', '**/factories/**', '**/factory*'],
1625
+ }
1626
+ - {
1627
+ id: 108,
1628
+ cat: A7,
1629
+ name: 'Test environment docs',
1630
+ tier: 2,
1631
+ kind: canonical,
1632
+ patterns: ['**/test-env*.md', '**/test-environment*.md', 'docs/testing/env*'],
1633
+ applies_when: { fact: 'has:tests' },
1634
+ derives_from: [98],
1635
+ sources:
1636
+ [
1637
+ '**/docker-compose*.yml',
1638
+ '**/conftest.py',
1639
+ '**/vitest.config*',
1640
+ '**/jest.config*',
1641
+ '**/.env.test*',
1642
+ '**/tox.ini',
1643
+ ],
1644
+ }
1645
+ - {
1646
+ id: 109,
1647
+ cat: A7,
1648
+ name: 'Test coverage report',
1649
+ tier: 2,
1650
+ kind: generated,
1651
+ patterns: ['**/COVERAGE.md', '**/coverage-report*.md'],
1652
+ notes: 'CI-generated coverage (codecov, ratcheted thresholds) is the normal state; only a committed report is matchable here.',
1653
+ }
1654
+ - {
1655
+ id: 110,
1656
+ cat: A7,
1657
+ name: 'QA sign-off records',
1658
+ tier: 4,
1659
+ kind: canonical,
1660
+ patterns: ['**/QA_SIGNOFF*.md', '**/qa-signoff*.md', '**/sign-off*.md'],
1661
+ applies_when: { any: [{ fact: 'project:api' }, { fact: 'platform:server' }] },
1662
+ derives_from: [98],
1663
+ sources: ['**/qa*', '**/sign-off*', '**/.github/workflows/**'],
1664
+ }
1665
+ - {
1666
+ id: 111,
1667
+ cat: A7,
1668
+ name: 'Known bugs / test exclusions',
1669
+ tier: 3,
1670
+ kind: reference,
1671
+ patterns: ['**/KNOWN_BUGS.md', '**/known-bugs*.md', '**/test-exclusions*.md'],
1672
+ applies_when: { fact: 'has:tests' },
1673
+ derives_from: [114],
1674
+ sources: ['**/known-bugs*', '**/known-issues*', '**/bug-tracker*'],
1675
+ }
1676
+ - {
1677
+ id: 112,
1678
+ cat: A7,
1679
+ name: 'Mock/stub documentation',
1680
+ tier: 3,
1681
+ kind: reference,
1682
+ patterns: ['**/MOCKS.md', 'docs/mocks*.md', '**/stubs.md', '**/mocks/README*'],
1683
+ applies_when: { fact: 'has:tests' },
1684
+ derives_from: [98],
1685
+ sources: ['**/mock*', '**/stub*', '**/fake*'],
1686
+ }
1687
+ - {
1688
+ id: 113,
1689
+ cat: A7,
1690
+ name: 'Regression test suite',
1691
+ tier: 2,
1692
+ kind: reference,
1693
+ patterns: ['**/regression*.md', '**/REGRESSION_TESTS.md', '**/regression/README*'],
1694
+ applies_when: { fact: 'has:tests' },
1695
+ derives_from: [99],
1696
+ sources: ['**/regression*', '**/smoke*', '**/canary*'],
1697
+ }
1698
+ - {
1699
+ id: 114,
1700
+ cat: A7,
1701
+ name: 'Flaky test register',
1702
+ tier: 3,
1703
+ kind: reference,
1704
+ patterns: ['**/FLAKY_TESTS.md', '**/flaky-tests*.md', '**/flaky.md'],
1705
+ applies_when: { fact: 'has:tests' },
1706
+ derives_from: [99],
1707
+ sources: ['**/flaky*', '**/quarantine*', '**/skip*'],
1708
+ }
1709
+
1710
+ # ---------------------------------------------------------------- A8 (23)
1711
+ - {
1712
+ id: 115,
1713
+ cat: A8,
1714
+ name: 'Deployment guide',
1715
+ tier: 2,
1716
+ kind: canonical,
1717
+ patterns:
1718
+ [
1719
+ '**/DEPLOYMENT.md',
1720
+ '**/deployment.md',
1721
+ 'docs/deployment*',
1722
+ '**/DEPLOY.md',
1723
+ 'docs/deploy*',
1724
+ ],
1725
+ applies_when:
1726
+ {
1727
+ any:
1728
+ [
1729
+ { fact: 'has:ci' },
1730
+ { fact: 'has:containers' },
1731
+ { fact: 'has:kubernetes' },
1732
+ { fact: 'has:terraform' },
1733
+ { fact: 'platform:server' },
1734
+ ],
1735
+ },
1736
+ derives_from: [49, 117],
1737
+ sources:
1738
+ [
1739
+ '**/Dockerfile*',
1740
+ '**/docker-compose*.yml',
1741
+ '**/k8s/**',
1742
+ '**/*.tf',
1743
+ '**/.github/workflows/**',
1744
+ '**/deploy/**',
1745
+ '**/helm/**',
1746
+ 'Makefile',
1747
+ ],
1748
+ }
1749
+ - {
1750
+ id: 116,
1751
+ cat: A8,
1752
+ name: 'Rollback procedure',
1753
+ tier: 3,
1754
+ kind: canonical,
1755
+ patterns: ['**/ROLLBACK*.md', '**/rollback*.md', 'docs/rollback*'],
1756
+ applies_when:
1757
+ { any: [{ fact: 'has:ci' }, { fact: 'has:containers' }, { fact: 'platform:server' }] },
1758
+ derives_from: [115],
1759
+ sources:
1760
+ [
1761
+ '**/Dockerfile*',
1762
+ '**/migrations/**',
1763
+ '**/*.tf',
1764
+ '**/deploy/**',
1765
+ '**/.github/workflows/**',
1766
+ ],
1767
+ }
1768
+ - {
1769
+ id: 117,
1770
+ cat: A8,
1771
+ name: 'IaC documentation',
1772
+ tier: 2,
1773
+ kind: derived,
1774
+ patterns:
1775
+ ['**/terraform/README*', '**/infra/README*', '**/iac.md', '**/IAC.md', 'docs/infra*'],
1776
+ applies_when:
1777
+ { any: [{ fact: 'has:terraform' }, { fact: 'project:iac' }, { fact: 'has:containers' }] },
1778
+ derives_from: [49],
1779
+ sources: ['**/*.tf', '**/*.tfvars', '**/*.hcl', '**/pulumi/**', '**/stacks/**'],
1780
+ }
1781
+ - {
1782
+ id: 118,
1783
+ cat: A8,
1784
+ name: 'CI/CD pipeline docs',
1785
+ tier: 1,
1786
+ kind: derived,
1787
+ patterns:
1788
+ [
1789
+ '.github/workflows/README*',
1790
+ '**/CI.md',
1791
+ '**/CI_CD.md',
1792
+ '**/ci-cd*.md',
1793
+ 'docs/ci*.md',
1794
+ '**/pipeline*.md',
1795
+ ],
1796
+ applies_when: { fact: 'has:ci' },
1797
+ derives_from: [49],
1798
+ sources:
1799
+ [
1800
+ '.github/workflows/**',
1801
+ '.gitlab-ci.yml',
1802
+ '**/Jenkinsfile',
1803
+ '**/.circleci/**',
1804
+ '**/azure-pipelines*',
1805
+ '**/bitbucket-pipelines*',
1806
+ ],
1807
+ }
1808
+ - {
1809
+ id: 119,
1810
+ cat: A8,
1811
+ name: 'Container / image docs',
1812
+ tier: 2,
1813
+ kind: canonical,
1814
+ patterns:
1815
+ ['**/docker.md', '**/DOCKER.md', '**/containers.md', '**/images.md', 'docs/docker*'],
1816
+ applies_when: { fact: 'has:containers' },
1817
+ derives_from: [49],
1818
+ sources: ['**/Dockerfile*', '**/docker-compose*.yml', '**/Containerfile', '**/.dockerignore'],
1819
+ }
1820
+ - {
1821
+ id: 120,
1822
+ cat: A8,
1823
+ name: 'K8s / orchestration manifests',
1824
+ tier: 3,
1825
+ kind: reference,
1826
+ patterns:
1827
+ [
1828
+ '**/k8s/**',
1829
+ '**/kubernetes/**',
1830
+ '**/*.k8s.yaml',
1831
+ '**/helm/**',
1832
+ '**/charts/**',
1833
+ '**/kustomization*.yaml',
1834
+ ],
1835
+ applies_when: { fact: 'has:kubernetes' },
1836
+ derives_from: [49],
1837
+ sources: ['**/k8s/**', '**/kubernetes/**', '**/helm/**', '**/kustomization*'],
1838
+ }
1839
+ - {
1840
+ id: 121,
1841
+ cat: A8,
1842
+ name: 'Monitoring & alerting docs',
1843
+ tier: 3,
1844
+ kind: canonical,
1845
+ patterns:
1846
+ [
1847
+ '**/monitoring.md',
1848
+ 'docs/monitoring*',
1849
+ '**/MONITORING.md',
1850
+ '**/alerting*.md',
1851
+ '**/alerts.md',
1852
+ ],
1853
+ applies_when:
1854
+ {
1855
+ any:
1856
+ [
1857
+ { fact: 'has:monitoring' },
1858
+ { fact: 'obs:prometheus' },
1859
+ { fact: 'obs:grafana' },
1860
+ { fact: 'obs:datadog' },
1861
+ { fact: 'obs:otel' },
1862
+ { fact: 'obs:sentry' },
1863
+ { fact: 'platform:server' },
1864
+ ],
1865
+ },
1866
+ derives_from: [54, 132],
1867
+ syncs_with: [123],
1868
+ sources:
1869
+ [
1870
+ '**/grafana/**',
1871
+ '**/prometheus*',
1872
+ '**/alert*.{yaml,yml,json,ts,py}',
1873
+ '**/monitoring/**',
1874
+ '**/sentry*',
1875
+ '**/datadog*',
1876
+ '**/otel*',
1877
+ ],
1878
+ }
1879
+ - {
1880
+ id: 122,
1881
+ cat: A8,
1882
+ name: 'Dashboard documentation',
1883
+ tier: 3,
1884
+ kind: reference,
1885
+ patterns: ['**/dashboards.md', '**/DASHBOARDS.md', 'docs/dashboards*'],
1886
+ applies_when:
1887
+ { any: [{ fact: 'has:monitoring' }, { fact: 'obs:grafana' }, { fact: 'obs:datadog' }] },
1888
+ derives_from: [121],
1889
+ sources: ['**/grafana/**', '**/dashboard*', '**/metric*'],
1890
+ }
1891
+ - {
1892
+ id: 123,
1893
+ cat: A8,
1894
+ name: 'Runbook / ops manual',
1895
+ tier: 3,
1896
+ kind: canonical,
1897
+ patterns:
1898
+ ['**/RUNBOOK.md', '**/runbook*.md', '**/runbooks/**', 'docs/runbook*', '**/ops-manual*.md'],
1899
+ applies_when:
1900
+ {
1901
+ any:
1902
+ [
1903
+ { fact: 'has:monitoring' },
1904
+ { fact: 'platform:server' },
1905
+ { fact: 'has:ci' },
1906
+ { fact: 'has:kubernetes' },
1907
+ ],
1908
+ },
1909
+ alias_rule: REL-007,
1910
+ derives_from: [121],
1911
+ syncs_with: [121],
1912
+ sources: ['**/runbook*', '**/RUNBOOK*', '**/oncall*', '**/alerts*'],
1913
+ }
1914
+ - {
1915
+ id: 124,
1916
+ cat: A8,
1917
+ name: 'Incident response playbook',
1918
+ tier: 3,
1919
+ kind: canonical,
1920
+ patterns:
1921
+ [
1922
+ '**/INCIDENT_RESPONSE*.md',
1923
+ '**/incident-response*.md',
1924
+ '**/ir-playbook*.md',
1925
+ 'docs/incident*',
1926
+ ],
1927
+ applies_when:
1928
+ { any: [{ fact: 'platform:server' }, { fact: 'has:monitoring' }, { fact: 'has:ci' }] },
1929
+ derives_from: [123],
1930
+ sources: ['**/incident*', '**/INCIDENT*', '**/oncall*'],
1931
+ }
1932
+ - {
1933
+ id: 125,
1934
+ cat: A8,
1935
+ name: 'Postmortem template',
1936
+ tier: 4,
1937
+ kind: reference,
1938
+ patterns:
1939
+ ['**/POSTMORTEM*.md', '**/postmortem*.md', '**/incident-template*.md', 'docs/postmortems*'],
1940
+ applies_when: { any: [{ fact: 'platform:server' }, { fact: 'has:monitoring' }] },
1941
+ derives_from: [124],
1942
+ sources: ['**/postmortem*', '**/incident*', '**/retro*'],
1943
+ }
1944
+ - {
1945
+ id: 126,
1946
+ cat: A8,
1947
+ name: 'On-call documentation',
1948
+ tier: 3,
1949
+ kind: canonical,
1950
+ patterns: ['**/ONCALL.md', '**/on-call*.md', '**/oncall.md', 'docs/on-call*'],
1951
+ applies_when: { any: [{ fact: 'platform:server' }, { fact: 'has:monitoring' }] },
1952
+ derives_from: [124],
1953
+ sources: ['**/oncall*', '**/on-call*', '**/pager*', '**/escalation*'],
1954
+ }
1955
+ - {
1956
+ id: 127,
1957
+ cat: A8,
1958
+ name: 'SLO / SLI / SLA docs',
1959
+ tier: 3,
1960
+ kind: canonical,
1961
+ patterns: ['**/SLO.md', '**/SLOs.md', '**/service-level*.md', '**/sla.md'],
1962
+ applies_when: { any: [{ fact: 'platform:server' }, { fact: 'has:monitoring' }] },
1963
+ derives_from: [59],
1964
+ syncs_with: [128],
1965
+ sources: ['**/slo*', '**/sla*', '**/error-budget*', '**/reliability*'],
1966
+ }
1967
+ - {
1968
+ id: 128,
1969
+ cat: A8,
1970
+ name: 'Error budget policy',
1971
+ tier: 4,
1972
+ kind: canonical,
1973
+ patterns: ['**/error-budget*.md', '**/ERROR_BUDGET.md'],
1974
+ applies_when: { any: [{ fact: 'platform:server' }, { fact: 'has:monitoring' }] },
1975
+ derives_from: [127],
1976
+ syncs_with: [127],
1977
+ sources: ['**/error-budget*', '**/slo*'],
1978
+ }
1979
+ - {
1980
+ id: 129,
1981
+ cat: A8,
1982
+ name: 'Backup & restore procedures',
1983
+ tier: 3,
1984
+ kind: canonical,
1985
+ patterns: ['**/BACKUP*.md', '**/backup*.md', '**/restore*.md'],
1986
+ applies_when:
1987
+ {
1988
+ any:
1989
+ [
1990
+ { fact: 'platform:server' },
1991
+ { fact: 'db:postgres' },
1992
+ { fact: 'db:mysql' },
1993
+ { fact: 'db:mongodb' },
1994
+ { fact: 'db:sqlite' },
1995
+ { fact: 'db:dynamodb' },
1996
+ ],
1997
+ },
1998
+ derives_from: [57],
1999
+ sources: ['**/backup*', '**/restore*', '**/pg_dump*', '**/wal*'],
2000
+ }
2001
+ - {
2002
+ id: 130,
2003
+ cat: A8,
2004
+ name: 'Certificate / TLS management',
2005
+ tier: 3,
2006
+ kind: canonical,
2007
+ patterns: ['**/TLS.md', '**/tls.md', '**/certificates.md', '**/certificate-management*.md'],
2008
+ applies_when: { any: [{ fact: 'platform:server' }, { fact: 'has:ci' }] },
2009
+ derives_from: [145],
2010
+ sources: ['**/certs/**', '**/tls*', '**/ingress*'],
2011
+ }
2012
+ - {
2013
+ id: 131,
2014
+ cat: A8,
2015
+ name: 'DNS / networking docs',
2016
+ tier: 4,
2017
+ kind: canonical,
2018
+ patterns: ['**/DNS.md', '**/dns.md', '**/networking.md', '**/network-topology*.md'],
2019
+ applies_when:
2020
+ {
2021
+ any: [{ fact: 'has:terraform' }, { fact: 'has:kubernetes' }, { fact: 'platform:server' }],
2022
+ },
2023
+ derives_from: [49],
2024
+ sources: ['**/dns*', '**/network*', '**/firewall*'],
2025
+ }
2026
+ - {
2027
+ id: 132,
2028
+ cat: A8,
2029
+ name: 'Log management docs',
2030
+ tier: 3,
2031
+ kind: canonical,
2032
+ patterns: ['**/LOGS.md', '**/log-management*.md', 'docs/logging/management*'],
2033
+ applies_when:
2034
+ {
2035
+ any:
2036
+ [
2037
+ { fact: 'platform:server' },
2038
+ { fact: 'has:monitoring' },
2039
+ { fact: 'obs:prometheus' },
2040
+ { fact: 'obs:grafana' },
2041
+ { fact: 'obs:otel' },
2042
+ ],
2043
+ },
2044
+ derives_from: [54],
2045
+ sources: ['**/logging*', '**/log*.{ts,py,go,rs}', '**/logstash*', '**/fluent*'],
2046
+ }
2047
+ - {
2048
+ id: 133,
2049
+ cat: A8,
2050
+ name: 'Performance baseline',
2051
+ tier: 4,
2052
+ kind: generated,
2053
+ patterns:
2054
+ [
2055
+ '**/PERF_BASELINE.md',
2056
+ '**/perf-baseline*.md',
2057
+ '**/benchmarks/README*',
2058
+ '**/performance-baseline*.md',
2059
+ ],
2060
+ applies_when:
2061
+ {
2062
+ any: [{ fact: 'has:perf-tests' }, { fact: 'platform:server' }, { fact: 'platform:web' }],
2063
+ },
2064
+ derives_from: [103],
2065
+ syncs_with: [59],
2066
+ sources: ['**/benchmark*', '**/bench*', '**/perf*', '**/load-test*'],
2067
+ }
2068
+ - {
2069
+ id: 134,
2070
+ cat: A8,
2071
+ name: 'Scaling runbook',
2072
+ tier: 4,
2073
+ kind: canonical,
2074
+ patterns: ['**/scaling-runbook*.md', '**/SCALE.md', '**/scale-procedures*.md'],
2075
+ applies_when: { any: [{ fact: 'platform:server' }, { fact: 'has:kubernetes' }] },
2076
+ derives_from: [56, 123],
2077
+ sources: ['**/hpa*', '**/scaling*', '**/autoscal*', '**/k8s/**', '**/*.tf'],
2078
+ }
2079
+ - {
2080
+ id: 135,
2081
+ cat: A8,
2082
+ name: 'Maintenance window procedures',
2083
+ tier: 4,
2084
+ kind: canonical,
2085
+ patterns: ['**/maintenance*.md', '**/MAINTENANCE.md'],
2086
+ applies_when: { any: [{ fact: 'platform:server' }] },
2087
+ derives_from: [123],
2088
+ sources: ['**/maintenance*', '**/cron*', '**/schedule*'],
2089
+ }
2090
+ - {
2091
+ id: 136,
2092
+ cat: A8,
2093
+ name: 'Cost / billing docs',
2094
+ tier: 4,
2095
+ kind: canonical,
2096
+ patterns: ['**/COSTS.md', '**/finops*.md', '**/billing.md'],
2097
+ applies_when:
2098
+ {
2099
+ any: [{ fact: 'has:terraform' }, { fact: 'has:kubernetes' }, { fact: 'platform:server' }],
2100
+ },
2101
+ derives_from: [58, 12],
2102
+ sources: ['**/*.tf', '**/cost*', '**/billing*', '**/finops*'],
2103
+ }
2104
+ - {
2105
+ id: 137,
2106
+ cat: A8,
2107
+ name: 'Compliance monitoring',
2108
+ tier: 4,
2109
+ kind: canonical,
2110
+ patterns: ['**/compliance-monitoring*.md', '**/COMPLIANCE_MONITORING.md'],
2111
+ applies_when: { any: [{ fact: 'platform:server' }, { fact: 'has:ci' }] },
2112
+ derives_from: [196],
2113
+ sources: ['**/compliance*', '**/audit*', '**/control*'],
2114
+ }
2115
+
2116
+ # ---------------------------------------------------------------- A9 (14)
2117
+ - {
2118
+ id: 138,
2119
+ cat: A9,
2120
+ name: 'Security policy',
2121
+ tier: 3,
2122
+ kind: canonical,
2123
+ patterns: ['SECURITY.md', 'SECURITY.rst', 'docs/security/README*', '**/security-policy.md'],
2124
+ notes: 'SECURITY.md doubles as the public security policy / disclosure document.',
2125
+ sources: ['**/SECURITY.md', '**/security*'],
2126
+ }
2127
+ - {
2128
+ id: 139,
2129
+ cat: A9,
2130
+ name: 'Auth & authorization design',
2131
+ tier: 3,
2132
+ kind: canonical,
2133
+ patterns: ['**/auth-design*.md', 'docs/security/auth*.md', '**/authorization.md'],
2134
+ applies_when:
2135
+ {
2136
+ any:
2137
+ [
2138
+ { fact: 'auth:jwt' },
2139
+ { fact: 'auth:oauth' },
2140
+ { fact: 'auth:session' },
2141
+ { fact: 'auth:apikey' },
2142
+ { fact: 'auth:auth0' },
2143
+ { fact: 'auth:firebase' },
2144
+ { fact: 'auth:nextauth' },
2145
+ { fact: 'auth:passport' },
2146
+ { fact: 'auth:supabase' },
2147
+ { fact: 'project:api' },
2148
+ ],
2149
+ },
2150
+ derives_from: [50],
2151
+ sources: ['**/auth*', '**/session*', '**/middleware/**', '**/jwt*', '**/oauth*'],
2152
+ }
2153
+ - {
2154
+ id: 140,
2155
+ cat: A9,
2156
+ name: 'Vulnerability management',
2157
+ tier: 3,
2158
+ kind: canonical,
2159
+ patterns:
2160
+ [
2161
+ '**/VULNERABILITY_MGMT*.md',
2162
+ '**/vulnerability-management*.md',
2163
+ 'docs/security/vulnerability*',
2164
+ ],
2165
+ applies_when:
2166
+ {
2167
+ any:
2168
+ [
2169
+ { fact: 'has:dep-scan' },
2170
+ { fact: 'has:sast' },
2171
+ { fact: 'has:secrets-scan' },
2172
+ { fact: 'has:ci' },
2173
+ ],
2174
+ },
2175
+ derives_from: [138],
2176
+ sources:
2177
+ ['**/vulnerability*', '**/vuln*', '**/.github/dependabot*', '**/renovate*', '**/.snyk*'],
2178
+ }
2179
+ - {
2180
+ id: 141,
2181
+ cat: A9,
2182
+ name: 'Penetration test reports',
2183
+ tier: 4,
2184
+ kind: canonical,
2185
+ patterns: ['**/pen-test-report*.md', '**/PEN_TEST*.md', '**/pentest-report*.md'],
2186
+ applies_when: { any: [{ fact: 'project:api' }, { fact: 'platform:server' }] },
2187
+ derives_from: [138],
2188
+ sources: ['**/pen-test*', '**/pentest*'],
2189
+ }
2190
+ - {
2191
+ id: 142,
2192
+ cat: A9,
2193
+ name: 'Security audit trail',
2194
+ tier: 4,
2195
+ kind: canonical,
2196
+ patterns: ['**/security-audit-trail*.md', '**/AUDIT_TRAIL.md', '**/audit-trail.md'],
2197
+ applies_when: { any: [{ fact: 'project:api' }, { fact: 'platform:server' }] },
2198
+ derives_from: [138, 197],
2199
+ sources: ['**/audit-trail*', '**/security-log*', '**/audit*'],
2200
+ }
2201
+ - {
2202
+ id: 143,
2203
+ cat: A9,
2204
+ name: 'Incident response plan (security)',
2205
+ tier: 3,
2206
+ kind: canonical,
2207
+ patterns: ['**/security-incident*.md', '**/SECURITY_INCIDENT*.md', 'docs/security/incident*'],
2208
+ applies_when:
2209
+ { any: [{ fact: 'platform:server' }, { fact: 'project:api' }, { fact: 'has:ci' }] },
2210
+ derives_from: [138, 124],
2211
+ syncs_with: [138],
2212
+ sources: ['**/security-incident*', '**/incident*', '**/response*'],
2213
+ }
2214
+ - {
2215
+ id: 144,
2216
+ cat: A9,
2217
+ name: 'Data classification',
2218
+ tier: 3,
2219
+ kind: canonical,
2220
+ patterns: ['**/DATA_CLASSIFICATION.md', '**/data-classification*.md'],
2221
+ applies_when:
2222
+ {
2223
+ any:
2224
+ [
2225
+ { fact: 'db:postgres' },
2226
+ { fact: 'db:mysql' },
2227
+ { fact: 'db:mongodb' },
2228
+ { fact: 'db:sqlite' },
2229
+ { fact: 'db:dynamodb' },
2230
+ { fact: 'db:vector' },
2231
+ { fact: 'db:elasticsearch' },
2232
+ { fact: 'project:api' },
2233
+ { fact: 'platform:server' },
2234
+ ],
2235
+ },
2236
+ derives_from: [138],
2237
+ sources: ['**/pii*', '**/privacy*', '**/models/**', '**/migrations/**'],
2238
+ }
2239
+ - {
2240
+ id: 145,
2241
+ cat: A9,
2242
+ name: 'Encryption documentation',
2243
+ tier: 3,
2244
+ kind: canonical,
2245
+ patterns: ['**/encryption.md', '**/ENCRYPTION.md', 'docs/security/encryption*'],
2246
+ applies_when:
2247
+ {
2248
+ any:
2249
+ [
2250
+ { fact: 'db:postgres' },
2251
+ { fact: 'db:mongodb' },
2252
+ { fact: 'db:mysql' },
2253
+ { fact: 'db:sqlite' },
2254
+ { fact: 'project:api' },
2255
+ { fact: 'platform:server' },
2256
+ ],
2257
+ },
2258
+ derives_from: [138, 139],
2259
+ sources: ['**/crypto*', '**/tls*', '**/certs/**', '**/encryption*'],
2260
+ }
2261
+ - {
2262
+ id: 146,
2263
+ cat: A9,
2264
+ name: 'Privacy / PII handling',
2265
+ tier: 3,
2266
+ kind: canonical,
2267
+ patterns: ['**/PRIVACY.md', '**/privacy.md', '**/PII_HANDLING*.md', '**/data-handling*.md'],
2268
+ applies_when:
2269
+ {
2270
+ any:
2271
+ [
2272
+ { fact: 'platform:web' },
2273
+ { fact: 'platform:mobile' },
2274
+ { fact: 'project:api' },
2275
+ { fact: 'db:postgres' },
2276
+ { fact: 'db:mongodb' },
2277
+ { fact: 'db:mysql' },
2278
+ { fact: 'db:sqlite' },
2279
+ { fact: 'db:dynamodb' },
2280
+ { fact: 'db:vector' },
2281
+ ],
2282
+ },
2283
+ derives_from: [138, 144],
2284
+ sources: ['**/privacy*', '**/pii*', '**/data-processing*', '**/consent*'],
2285
+ }
2286
+ - {
2287
+ id: 147,
2288
+ cat: A9,
2289
+ name: 'GDPR / CCPA / SOC2 docs',
2290
+ tier: 4,
2291
+ kind: canonical,
2292
+ patterns: ['**/GDPR.md', '**/CCPA.md', 'docs/compliance/**'],
2293
+ applies_when:
2294
+ { any: [{ fact: 'platform:web' }, { fact: 'platform:mobile' }, { fact: 'project:api' }] },
2295
+ derives_from: [146],
2296
+ sources: ['**/gdpr*', '**/ccpa*', '**/privacy*', '**/consent*', '**/cookie*'],
2297
+ }
2298
+ - {
2299
+ id: 148,
2300
+ cat: A9,
2301
+ name: 'Supply chain security',
2302
+ tier: 3,
2303
+ kind: canonical,
2304
+ patterns: ['**/supply-chain-security*.md', '**/SUPPLY_CHAIN.md', 'docs/supply-chain*'],
2305
+ applies_when:
2306
+ {
2307
+ any:
2308
+ [
2309
+ { fact: 'has:dep-scan' },
2310
+ { fact: 'has:sbom' },
2311
+ { fact: 'has:ci' },
2312
+ { fact: 'has:dependabot' },
2313
+ { fact: 'has:renovate' },
2314
+ ],
2315
+ },
2316
+ derives_from: [138],
2317
+ sources: ['**/supply-chain*', '**/SECURITY.md', '**/attestation*', '**/provenance*'],
2318
+ }
2319
+ - {
2320
+ id: 149,
2321
+ cat: A9,
2322
+ name: 'SBOM',
2323
+ tier: 3,
2324
+ kind: generated,
2325
+ patterns: ['**/sbom.json', '**/sbom.xml', '**/SBOM.md', '**/spdx.json', '**/cyclonedx.json'],
2326
+ alias_rule: SUP-014,
2327
+ derives_from: [148, 192],
2328
+ sources:
2329
+ [
2330
+ 'package.json',
2331
+ 'pnpm-lock.yaml',
2332
+ 'package-lock.json',
2333
+ 'yarn.lock',
2334
+ 'requirements*.txt',
2335
+ 'pyproject.toml',
2336
+ 'poetry.lock',
2337
+ 'uv.lock',
2338
+ 'go.mod',
2339
+ 'go.sum',
2340
+ 'Cargo.toml',
2341
+ 'Cargo.lock',
2342
+ 'pom.xml',
2343
+ 'build.gradle*',
2344
+ 'Gemfile',
2345
+ 'Gemfile.lock',
2346
+ 'composer.json',
2347
+ '*.csproj',
2348
+ ],
2349
+ }
2350
+ - {
2351
+ id: 150,
2352
+ cat: A9,
2353
+ name: 'Security training records',
2354
+ tier: 4,
2355
+ kind: canonical,
2356
+ patterns: ['**/security-training*.md', '**/SECURITY_TRAINING.md'],
2357
+ applies_when: { fact: 'metric:contributors', op: 'gt', value: 2 },
2358
+ }
2359
+ - {
2360
+ id: 151,
2361
+ cat: A9,
2362
+ name: 'Access control matrix',
2363
+ tier: 4,
2364
+ kind: canonical,
2365
+ patterns: ['**/ACCESS_MATRIX.md', '**/access-control*.md', '**/access-matrix*.md'],
2366
+ applies_when:
2367
+ { any: [{ fact: 'project:api' }, { fact: 'platform:server' }, { fact: 'has:kubernetes' }] },
2368
+ derives_from: [139],
2369
+ sources: ['**/rbac*', '**/abac*', '**/access*', '**/permission*', '**/iam*'],
2370
+ }
2371
+
2372
+ # --------------------------------------------------------------- A10 (19)
2373
+ - {
2374
+ id: 152,
2375
+ cat: A10,
2376
+ name: 'User manual / handbook',
2377
+ tier: 3,
2378
+ kind: canonical,
2379
+ patterns:
2380
+ [
2381
+ '**/USER_GUIDE*.md',
2382
+ '**/user-guide*.md',
2383
+ '**/USER_MANUAL*.md',
2384
+ '**/handbook*.md',
2385
+ 'docs/user/**',
2386
+ '**/manual.md',
2387
+ ],
2388
+ derives_from: [76, 91, 153],
2389
+ syncs_with: [157],
2390
+ sources: ['any-source'],
2391
+ }
2392
+ - {
2393
+ id: 153,
2394
+ cat: A10,
2395
+ name: 'Getting started guide',
2396
+ tier: 1,
2397
+ kind: canonical,
2398
+ patterns: ['**/GETTING_STARTED*.md', '**/getting-started*.md', 'docs/getting-started*'],
2399
+ alias_rule: DOC-006,
2400
+ syncs_with: [61],
2401
+ sources: ['any-source'],
2402
+ }
2403
+ - {
2404
+ id: 154,
2405
+ cat: A10,
2406
+ name: 'Quick start guide',
2407
+ tier: 2,
2408
+ kind: canonical,
2409
+ patterns:
2410
+ ['**/QUICK_START*.md', '**/quick-start*.md', '**/QUICKSTART*.md', '**/quickstart.md'],
2411
+ derives_from: [153],
2412
+ sources: ['any-source'],
2413
+ }
2414
+ - {
2415
+ id: 155,
2416
+ cat: A10,
2417
+ name: 'Tutorials',
2418
+ tier: 3,
2419
+ kind: canonical,
2420
+ patterns: ['**/tutorials/**', '**/tutorial*.md', '**/TUTORIALS.md', 'docs/tutorials*'],
2421
+ derives_from: [153],
2422
+ sources: ['any-source'],
2423
+ }
2424
+ - {
2425
+ id: 156,
2426
+ cat: A10,
2427
+ name: 'How-to guides',
2428
+ tier: 3,
2429
+ kind: canonical,
2430
+ patterns: ['**/how-to*.md', '**/HOW_TO.md', 'docs/how-to*', '**/guides/*.md'],
2431
+ derives_from: [152],
2432
+ sources: ['any-source'],
2433
+ }
2434
+ - {
2435
+ id: 157,
2436
+ cat: A10,
2437
+ name: 'Reference documentation',
2438
+ tier: 2,
2439
+ kind: canonical,
2440
+ patterns: ['docs/reference/**', '**/REFERENCE.md', '**/reference.md'],
2441
+ derives_from: [76, 91],
2442
+ syncs_with: [152],
2443
+ sources: ['any-source'],
2444
+ }
2445
+ - {
2446
+ id: 158,
2447
+ cat: A10,
2448
+ name: 'Explanations / concepts',
2449
+ tier: 3,
2450
+ kind: canonical,
2451
+ patterns: ['**/concepts.md', '**/CONCEPTS.md', '**/explanations*.md', 'docs/concepts*'],
2452
+ derives_from: [36],
2453
+ sources: ['**/concept*', '**/explain*', '**/architecture*'],
2454
+ }
2455
+ - {
2456
+ id: 159,
2457
+ cat: A10,
2458
+ name: 'FAQ',
2459
+ tier: 3,
2460
+ kind: canonical,
2461
+ patterns: ['**/FAQ.md', '**/faq.md', '**/FAQS.md'],
2462
+ derives_from: [156],
2463
+ sources: ['any-source'],
2464
+ }
2465
+ - {
2466
+ id: 160,
2467
+ cat: A10,
2468
+ name: 'Troubleshooting guide',
2469
+ tier: 3,
2470
+ kind: canonical,
2471
+ patterns: ['**/TROUBLESHOOTING.md', '**/troubleshooting*.md', 'docs/troubleshooting*'],
2472
+ derives_from: [80],
2473
+ sources: ['any-source'],
2474
+ }
2475
+ - {
2476
+ id: 161,
2477
+ cat: A10,
2478
+ name: 'Glossary (user-facing)',
2479
+ tier: 3,
2480
+ kind: reference,
2481
+ patterns: ['**/glossary.md', '**/GLOSSARY.md', '**/user-glossary*.md'],
2482
+ derives_from: [21],
2483
+ syncs_with: [21],
2484
+ sources: ['**/glossary*', '**/domain*'],
2485
+ }
2486
+ - {
2487
+ id: 162,
2488
+ cat: A10,
2489
+ name: 'Screenshot / visual docs',
2490
+ tier: 3,
2491
+ kind: example,
2492
+ patterns: ['**/screenshots/**', '**/screen-captures/**', 'docs/screens/**'],
2493
+ derives_from: [152],
2494
+ sources: ['**/screenshot*', '**/screen-capture*', '**/ui/**'],
2495
+ }
2496
+ - {
2497
+ id: 163,
2498
+ cat: A10,
2499
+ name: 'Video tutorials',
2500
+ tier: 3,
2501
+ kind: example,
2502
+ patterns: ['**/video-tutorials*.md', '**/videos/**'],
2503
+ derives_from: [155],
2504
+ sources: ['**/video*', '**/*.mp4', '**/*.webm'],
2505
+ }
2506
+ - {
2507
+ id: 164,
2508
+ cat: A10,
2509
+ name: 'In-product help / tooltips',
2510
+ tier: 3,
2511
+ kind: canonical,
2512
+ patterns: ['**/in-product-help*.md', '**/help-content*.md', '**/tooltips.md'],
2513
+ applies_when:
2514
+ {
2515
+ any:
2516
+ [{ fact: 'platform:web' }, { fact: 'platform:mobile' }, { fact: 'platform:desktop' }],
2517
+ },
2518
+ derives_from: [159],
2519
+ sources: ['**/help*', '**/tooltip*', '**/onboarding*'],
2520
+ }
2521
+ - {
2522
+ id: 165,
2523
+ cat: A10,
2524
+ name: 'Onboarding wizard content',
2525
+ tier: 3,
2526
+ kind: canonical,
2527
+ patterns: ['**/onboarding-content*.md', '**/onboarding-wizard*.md', '**/first-run*.md'],
2528
+ applies_when:
2529
+ {
2530
+ any:
2531
+ [{ fact: 'platform:web' }, { fact: 'platform:mobile' }, { fact: 'platform:desktop' }],
2532
+ },
2533
+ derives_from: [164],
2534
+ sources: ['**/onboarding*', '**/first-run*', '**/welcome*'],
2535
+ }
2536
+ - {
2537
+ id: 166,
2538
+ cat: A10,
2539
+ name: 'Keyboard shortcuts',
2540
+ tier: 4,
2541
+ kind: reference,
2542
+ patterns: ['**/keyboard-shortcuts*.md', '**/SHORTCUTS.md', '**/shortcuts.md'],
2543
+ applies_when:
2544
+ {
2545
+ any:
2546
+ [{ fact: 'platform:desktop' }, { fact: 'platform:web' }, { fact: 'platform:mobile' }],
2547
+ },
2548
+ derives_from: [152],
2549
+ sources: ['**/shortcut*', '**/keybinding*', '**/keyboard*'],
2550
+ }
2551
+ - {
2552
+ id: 167,
2553
+ cat: A10,
2554
+ name: 'Release migration guide',
2555
+ tier: 3,
2556
+ kind: canonical,
2557
+ patterns:
2558
+ [
2559
+ '**/MIGRATION_GUIDE*.md',
2560
+ '**/migration-guide*.md',
2561
+ '**/UPGRADE*.md',
2562
+ '**/upgrade-guide*.md',
2563
+ ],
2564
+ derives_from: [8, 76, 22],
2565
+ syncs_with: [185],
2566
+ sources: ['any-source'],
2567
+ }
2568
+ - {
2569
+ id: 168,
2570
+ cat: A10,
2571
+ name: 'Known issues / limitations',
2572
+ tier: 2,
2573
+ kind: canonical,
2574
+ patterns:
2575
+ ['**/KNOWN_ISSUES.md', '**/known-issues*.md', '**/LIMITATIONS.md', '**/limitations.md'],
2576
+ derives_from: [111],
2577
+ sources: ['any-source'],
2578
+ }
2579
+ - {
2580
+ id: 169,
2581
+ cat: A10,
2582
+ name: 'Accessibility guide (user)',
2583
+ tier: 3,
2584
+ kind: canonical,
2585
+ patterns: ['**/ACCESSIBILITY.md', '**/accessibility-guide*.md', '**/a11y-guide*.md'],
2586
+ applies_when:
2587
+ {
2588
+ any:
2589
+ [{ fact: 'platform:web' }, { fact: 'platform:mobile' }, { fact: 'platform:desktop' }],
2590
+ },
2591
+ derives_from: [33],
2592
+ sources: ['**/a11y*', '**/accessibility*', '**/aria*'],
2593
+ }
2594
+ - {
2595
+ id: 170,
2596
+ cat: A10,
2597
+ name: 'Print/PDF export docs',
2598
+ tier: 4,
2599
+ kind: generated,
2600
+ patterns: ['**/print-docs*.md', '**/pdf-exports*.md'],
2601
+ derives_from: [152],
2602
+ sources: ['**/print*', '**/pdf*', '**/export*'],
2603
+ }
2604
+
2605
+ # --------------------------------------------------------------- A11 (20)
2606
+ - {
2607
+ id: 171,
2608
+ cat: A11,
2609
+ name: 'CONTRIBUTING.md',
2610
+ tier: 0,
2611
+ kind: canonical,
2612
+ patterns: ['CONTRIBUTING.md', 'CONTRIBUTING.rst', 'CONTRIBUTING', '**/CONTRIBUTING.md'],
2613
+ sources: ['**/CONTRIBUTING*'],
2614
+ }
2615
+ - {
2616
+ id: 172,
2617
+ cat: A11,
2618
+ name: 'Developer setup guide',
2619
+ tier: 1,
2620
+ kind: canonical,
2621
+ patterns:
2622
+ [
2623
+ '**/DEV_SETUP*.md',
2624
+ '**/dev-setup*.md',
2625
+ '**/SETUP.md',
2626
+ '**/setup.md',
2627
+ '**/DEVELOPMENT.md',
2628
+ 'docs/development*',
2629
+ ],
2630
+ derives_from: [153],
2631
+ sources: ['any-source'],
2632
+ }
2633
+ - {
2634
+ id: 173,
2635
+ cat: A11,
2636
+ name: 'Build system docs',
2637
+ tier: 1,
2638
+ kind: canonical,
2639
+ patterns:
2640
+ ['**/BUILD.md', '**/build.md', '**/build-system*.md', '**/BUILDING.md', '**/building.md'],
2641
+ derives_from: [172],
2642
+ sources:
2643
+ [
2644
+ 'package.json',
2645
+ '**/Makefile',
2646
+ '**/Taskfile*',
2647
+ '**/justfile',
2648
+ 'pyproject.toml',
2649
+ '**/setup.py',
2650
+ '**/setup.cfg',
2651
+ '**/tox.ini',
2652
+ '**/CMakeLists.txt',
2653
+ '**/build.gradle*',
2654
+ '**/pom.xml',
2655
+ '*.csproj',
2656
+ '**/mix.exs',
2657
+ 'Cargo.toml',
2658
+ ],
2659
+ }
2660
+ - {
2661
+ id: 174,
2662
+ cat: A11,
2663
+ name: 'Code style guide',
2664
+ tier: 1,
2665
+ kind: canonical,
2666
+ patterns:
2667
+ [
2668
+ '**/STYLE.md',
2669
+ '**/style.md',
2670
+ '**/code-style*.md',
2671
+ '**/CODING_CONVENTIONS.md',
2672
+ '**/conventions.md',
2673
+ ],
2674
+ derives_from: [172],
2675
+ sources:
2676
+ [
2677
+ '.eslintrc*',
2678
+ '**/eslint.config*',
2679
+ '**/.prettierrc*',
2680
+ '**/prettier.config*',
2681
+ '.flake8',
2682
+ '**/pyproject.toml',
2683
+ '**/rustfmt.toml',
2684
+ '**/.rubocop.yml',
2685
+ '**/.editorconfig',
2686
+ '**/.golangci*',
2687
+ '**/.clang-format',
2688
+ ],
2689
+ }
2690
+ - {
2691
+ id: 175,
2692
+ cat: A11,
2693
+ name: 'Code review guidelines',
2694
+ tier: 2,
2695
+ kind: canonical,
2696
+ patterns:
2697
+ [
2698
+ '**/CODE_REVIEW.md',
2699
+ '**/code-review*.md',
2700
+ '**/REVIEW_GUIDELINES.md',
2701
+ '**/review-guidelines*.md',
2702
+ ],
2703
+ derives_from: [171],
2704
+ syncs_with: [171],
2705
+ sources: ['**/.github/CODEOWNERS', '**/review*', '**/checklist*', '**/.gitlab/**'],
2706
+ }
2707
+ - {
2708
+ id: 176,
2709
+ cat: A11,
2710
+ name: 'Git workflow / branching',
2711
+ tier: 2,
2712
+ kind: canonical,
2713
+ patterns:
2714
+ [
2715
+ '**/GIT_WORKFLOW.md',
2716
+ '**/git-workflow*.md',
2717
+ '**/BRANCHING.md',
2718
+ '**/branching*.md',
2719
+ '**/development-process*.md',
2720
+ ],
2721
+ derives_from: [171],
2722
+ sources: ['**/.gitattributes', '**/branch*', '**/.github/**'],
2723
+ }
2724
+ - {
2725
+ id: 177,
2726
+ cat: A11,
2727
+ name: 'Commit message convention',
2728
+ tier: 2,
2729
+ kind: canonical,
2730
+ patterns:
2731
+ [
2732
+ '**/COMMIT_CONVENTIONS.md',
2733
+ '**/commit-conventions*.md',
2734
+ '**/commitlint.config.js',
2735
+ '**/commitlint.config.json',
2736
+ '**/conventional-commits*.md',
2737
+ ],
2738
+ derives_from: [176],
2739
+ sources: ['**/commitlint*', '**/.husky/**', '**/lefthook*'],
2740
+ }
2741
+ - {
2742
+ id: 178,
2743
+ cat: A11,
2744
+ name: 'PR / MR template',
2745
+ tier: 2,
2746
+ kind: canonical,
2747
+ patterns:
2748
+ [
2749
+ '.github/PULL_REQUEST_TEMPLATE.md',
2750
+ '**/PULL_REQUEST_TEMPLATE.md',
2751
+ '**/pull_request_template.md',
2752
+ '**/PULL_REQUEST_TEMPLATE/**',
2753
+ '.gitlab/merge_request_templates/**',
2754
+ ],
2755
+ derives_from: [171],
2756
+ sources: ['.github/**', '**/.gitlab/**'],
2757
+ }
2758
+ - {
2759
+ id: 179,
2760
+ cat: A11,
2761
+ name: 'Issue templates',
2762
+ tier: 2,
2763
+ kind: canonical,
2764
+ patterns:
2765
+ [
2766
+ '.github/ISSUE_TEMPLATE.md',
2767
+ '**/ISSUE_TEMPLATE.md',
2768
+ '**/ISSUE_TEMPLATE/**',
2769
+ '**/issue-template*.md',
2770
+ ],
2771
+ derives_from: [171],
2772
+ sources: ['.github/**', '**/.gitlab/**'],
2773
+ }
2774
+ - {
2775
+ id: 180,
2776
+ cat: A11,
2777
+ name: 'Module/package README',
2778
+ tier: 1,
2779
+ kind: canonical,
2780
+ patterns:
2781
+ [
2782
+ '**/README.md',
2783
+ '**/README.rst',
2784
+ '**/README.mdx',
2785
+ '!README.md',
2786
+ '!README.rst',
2787
+ '!README.mdx',
2788
+ ],
2789
+ derives_from: [62],
2790
+ sources: ['any-source'],
2791
+ }
2792
+ - {
2793
+ id: 181,
2794
+ cat: A11,
2795
+ name: 'Makefile / task runner ref',
2796
+ tier: 2,
2797
+ kind: canonical,
2798
+ patterns:
2799
+ [
2800
+ '**/Makefile',
2801
+ '**/Taskfile.yml',
2802
+ '**/justfile',
2803
+ '**/melody.mjs',
2804
+ '**/COMMANDS.md',
2805
+ '**/commands.md',
2806
+ '**/task-runner*.md',
2807
+ ],
2808
+ derives_from: [173],
2809
+ sources: ['**/Makefile', '**/Taskfile*', '**/justfile', '**/melody*', 'package.json'],
2810
+ }
2811
+ - {
2812
+ id: 182,
2813
+ cat: A11,
2814
+ name: 'IDE / tooling setup',
2815
+ tier: 2,
2816
+ kind: canonical,
2817
+ patterns:
2818
+ [
2819
+ '.vscode/launch.json',
2820
+ '.vscode/tasks.json',
2821
+ '**/IDE.md',
2822
+ '**/ide-setup*.md',
2823
+ '**/devcontainer.json',
2824
+ ],
2825
+ derives_from: [172],
2826
+ sources: ['.vscode/**', '**/.idea/**', '**/devcontainer*', '**/IDE*'],
2827
+ }
2828
+ - {
2829
+ id: 183,
2830
+ cat: A11,
2831
+ name: 'Debugging guide',
2832
+ tier: 2,
2833
+ kind: canonical,
2834
+ patterns: ['**/DEBUGGING.md', '**/debugging*.md', 'docs/debugging*'],
2835
+ derives_from: [172],
2836
+ sources: ['**/debug*', '**/breakpoint*', '**/.vscode/**'],
2837
+ }
2838
+ - {
2839
+ id: 184,
2840
+ cat: A11,
2841
+ name: 'Profiling guide',
2842
+ tier: 3,
2843
+ kind: canonical,
2844
+ patterns: ['**/PROFILING.md', '**/profiling*.md'],
2845
+ applies_when: { any: [{ fact: 'has:perf-tests' }, { fact: 'platform:server' }] },
2846
+ derives_from: [183],
2847
+ sources: ['**/profile*', '**/perf*', '**/benchmark*', '**/heap*'],
2848
+ }
2849
+ - {
2850
+ id: 185,
2851
+ cat: A11,
2852
+ name: 'Migration guide (dev)',
2853
+ tier: 3,
2854
+ kind: canonical,
2855
+ patterns: ['**/UPGRADING.md', '**/upgrading*.md', '**/dev-migration*.md'],
2856
+ applies_when: { any: [{ fact: 'project:library' }] },
2857
+ derives_from: [167],
2858
+ syncs_with: [167],
2859
+ sources: ['**/CHANGELOG*', '**/migration*', '**/upgrade*'],
2860
+ }
2861
+ - {
2862
+ id: 186,
2863
+ cat: A11,
2864
+ name: 'Monorepo guide',
2865
+ tier: 2,
2866
+ kind: canonical,
2867
+ patterns: ['**/MONOREPO.md', '**/monorepo*.md', '**/WORKSPACES.md', '**/workspaces.md'],
2868
+ applies_when: { fact: 'project:monorepo' },
2869
+ derives_from: [172],
2870
+ sources: ['**/pnpm-workspace*', '**/lerna.json', '**/turbo.json', '**/nx.json', '**/go.work'],
2871
+ }
2872
+ - {
2873
+ id: 187,
2874
+ cat: A11,
2875
+ name: 'Plugin development guide',
2876
+ tier: 3,
2877
+ kind: canonical,
2878
+ patterns: ['**/plugin-development*.md', '**/developing-plugins*.md', '**/write-a-plugin*.md'],
2879
+ applies_when: { any: [{ fact: 'project:library' }, { fact: 'project:api' }] },
2880
+ derives_from: [90],
2881
+ sources: ['**/plugin*', '**/extension*'],
2882
+ }
2883
+ - {
2884
+ id: 188,
2885
+ cat: A11,
2886
+ name: 'i18n guide (developer)',
2887
+ tier: 3,
2888
+ kind: canonical,
2889
+ patterns: ['**/i18n.md', '**/I18N.md', '**/localization-guide*.md', '**/translations.md'],
2890
+ applies_when: { any: [{ fact: 'platform:web' }, { fact: 'platform:mobile' }] },
2891
+ derives_from: [34],
2892
+ sources: ['**/i18n*', '**/l10n*', '**/locales/**', '**/messages/**', '**/translations/**'],
2893
+ }
2894
+ - {
2895
+ id: 189,
2896
+ cat: A11,
2897
+ name: 'Database dev guide',
2898
+ tier: 2,
2899
+ kind: canonical,
2900
+ patterns: ['**/DATABASE.md', '**/database.md', 'docs/database*', '**/db-dev*.md'],
2901
+ applies_when:
2902
+ {
2903
+ any:
2904
+ [
2905
+ { fact: 'db:postgres' },
2906
+ { fact: 'db:mysql' },
2907
+ { fact: 'db:sqlite' },
2908
+ { fact: 'db:mongodb' },
2909
+ { fact: 'db:redis' },
2910
+ { fact: 'db:clickhouse' },
2911
+ { fact: 'db:elasticsearch' },
2912
+ { fact: 'db:vector' },
2913
+ { fact: 'db:dynamodb' },
2914
+ { fact: 'orm:prisma' },
2915
+ { fact: 'orm:sequelize' },
2916
+ { fact: 'orm:sqlalchemy' },
2917
+ { fact: 'orm:gorm' },
2918
+ { fact: 'orm:sqlx' },
2919
+ { fact: 'orm:diesel' },
2920
+ { fact: 'orm:drizzle' },
2921
+ { fact: 'orm:hibernate' },
2922
+ { fact: 'orm:mongoose' },
2923
+ { fact: 'orm:typeorm' },
2924
+ { fact: 'orm:activerecord' },
2925
+ ],
2926
+ },
2927
+ derives_from: [44, 46],
2928
+ sources: ['**/migrations/**', '**/*.sql', '**/prisma/**', '**/*.prisma', '**/models/**'],
2929
+ }
2930
+ - {
2931
+ id: 190,
2932
+ cat: A11,
2933
+ name: 'Agent / AI instructions',
2934
+ tier: 1,
2935
+ kind: canonical,
2936
+ patterns:
2937
+ [
2938
+ 'AGENTS.md',
2939
+ 'CLAUDE.md',
2940
+ 'GEMINI.md',
2941
+ '.cursor/rules/**',
2942
+ '**/agent-instructions*.md',
2943
+ '**/copilot-instructions.md',
2944
+ ],
2945
+ derives_from: [61],
2946
+ sources:
2947
+ [
2948
+ '**/AGENTS.md',
2949
+ '**/CLAUDE.md',
2950
+ '**/.cursor/**',
2951
+ '**/copilot-instructions*',
2952
+ '**/GEMINI.md',
2953
+ '**/rules/**',
2954
+ ],
2955
+ }
2956
+
2957
+ # --------------------------------------------------------------- A12 (12)
2958
+ - {
2959
+ id: 191,
2960
+ cat: A12,
2961
+ name: 'LICENSE',
2962
+ tier: 0,
2963
+ kind: canonical,
2964
+ patterns: ['LICENSE', 'LICENSE.md', 'LICENSE.txt', 'LICENCE', 'COPYING'],
2965
+ alias_rule: REPO-005,
2966
+ sources:
2967
+ [
2968
+ 'LICENSE',
2969
+ 'LICENSE.*',
2970
+ 'package.json',
2971
+ 'pyproject.toml',
2972
+ 'setup.py',
2973
+ 'go.mod',
2974
+ 'Cargo.toml',
2975
+ ],
2976
+ }
2977
+ - {
2978
+ id: 192,
2979
+ cat: A12,
2980
+ name: 'Third-party licenses',
2981
+ tier: 3,
2982
+ kind: reference,
2983
+ patterns:
2984
+ ['**/THIRD_PARTY.md', '**/third-party*.md', '**/vendored-licenses*.md', 'docs/licenses*'],
2985
+ derives_from: [149],
2986
+ sources:
2987
+ [
2988
+ 'package.json',
2989
+ 'pnpm-lock.yaml',
2990
+ 'package-lock.json',
2991
+ 'yarn.lock',
2992
+ 'requirements*.txt',
2993
+ 'pyproject.toml',
2994
+ 'poetry.lock',
2995
+ 'uv.lock',
2996
+ 'go.mod',
2997
+ 'go.sum',
2998
+ 'Cargo.toml',
2999
+ 'Cargo.lock',
3000
+ 'pom.xml',
3001
+ 'build.gradle*',
3002
+ 'Gemfile',
3003
+ 'composer.json',
3004
+ '*.csproj',
3005
+ ],
3006
+ }
3007
+ - {
3008
+ id: 193,
3009
+ cat: A12,
3010
+ name: 'Terms of service',
3011
+ tier: 4,
3012
+ kind: canonical,
3013
+ patterns: ['**/TERMS.md', '**/terms.md', '**/terms-of-service*.md', '**/TOS.md'],
3014
+ applies_when:
3015
+ { any: [{ fact: 'platform:web' }, { fact: 'platform:mobile' }, { fact: 'project:api' }] },
3016
+ sources: ['**/terms*', '**/tos*', '**/legal*'],
3017
+ }
3018
+ - {
3019
+ id: 194,
3020
+ cat: A12,
3021
+ name: 'Privacy policy',
3022
+ tier: 3,
3023
+ kind: canonical,
3024
+ patterns: ['**/PRIVACY.md', '**/privacy-policy*.md', '**/PRIVACY-POLICY.md'],
3025
+ applies_when:
3026
+ { any: [{ fact: 'platform:web' }, { fact: 'platform:mobile' }, { fact: 'project:api' }] },
3027
+ derives_from: [146],
3028
+ sources: ['**/privacy*', '**/consent*', '**/cookie*', '**/gdpr*'],
3029
+ }
3030
+ - {
3031
+ id: 195,
3032
+ cat: A12,
3033
+ name: 'EULA',
3034
+ tier: 4,
3035
+ kind: canonical,
3036
+ patterns: ['**/EULA.md', '**/eula.md', '**/end-user-license*.md'],
3037
+ applies_when:
3038
+ {
3039
+ any:
3040
+ [{ fact: 'platform:desktop' }, { fact: 'platform:web' }, { fact: 'platform:mobile' }],
3041
+ },
3042
+ sources: ['**/eula*', '**/end-user*', '**/license*'],
3043
+ }
3044
+ - {
3045
+ id: 196,
3046
+ cat: A12,
3047
+ name: 'Compliance matrix',
3048
+ tier: 4,
3049
+ kind: canonical,
3050
+ patterns: ['**/COMPLIANCE.md', '**/compliance-matrix*.md', '**/compliance/*.md'],
3051
+ derives_from: [198],
3052
+ sources: ['**/compliance*', '**/iso*', '**/soc2*', '**/hipaa*', '**/pci*'],
3053
+ }
3054
+ - {
3055
+ id: 197,
3056
+ cat: A12,
3057
+ name: 'Audit log documentation',
3058
+ tier: 4,
3059
+ kind: canonical,
3060
+ patterns: ['**/audit-log*.md', '**/AUDIT_LOG.md'],
3061
+ applies_when: { any: [{ fact: 'platform:server' }, { fact: 'project:api' }] },
3062
+ derives_from: [132],
3063
+ sources: ['**/audit-log*', '**/audit*', '**/logging*'],
3064
+ }
3065
+ - {
3066
+ id: 198,
3067
+ cat: A12,
3068
+ name: 'Regulatory documentation',
3069
+ tier: 4,
3070
+ kind: canonical,
3071
+ patterns: ['**/HIPAA.md', '**/PCI-DSS.md', '**/FedRAMP.md', '**/regulatory*.md'],
3072
+ sources: ['**/hipaa*', '**/pci*', '**/fedramp*', '**/gdpr*'],
3073
+ }
3074
+ - {
3075
+ id: 199,
3076
+ cat: A12,
3077
+ name: 'Data retention policy',
3078
+ tier: 4,
3079
+ kind: canonical,
3080
+ patterns: ['**/DATA_RETENTION.md', '**/data-retention*.md', '**/retention-policy*.md'],
3081
+ applies_when:
3082
+ {
3083
+ any:
3084
+ [
3085
+ { fact: 'db:postgres' },
3086
+ { fact: 'db:mongodb' },
3087
+ { fact: 'db:mysql' },
3088
+ { fact: 'db:sqlite' },
3089
+ { fact: 'db:dynamodb' },
3090
+ { fact: 'db:vector' },
3091
+ { fact: 'project:api' },
3092
+ ],
3093
+ },
3094
+ derives_from: [146],
3095
+ sources: ['**/retention*', '**/deletion*', '**/data-lifecycle*'],
3096
+ }
3097
+ - {
3098
+ id: 200,
3099
+ cat: A12,
3100
+ name: 'Data processing agreements',
3101
+ tier: 4,
3102
+ kind: canonical,
3103
+ patterns: ['**/DPA.md', '**/dpa.md', '**/data-processing-agreement*.md'],
3104
+ applies_when:
3105
+ { any: [{ fact: 'platform:web' }, { fact: 'platform:mobile' }, { fact: 'project:api' }] },
3106
+ derives_from: [146],
3107
+ sources: ['**/dpa*', '**/data-processing*', '**/subprocessor*'],
3108
+ }
3109
+ - {
3110
+ id: 201,
3111
+ cat: A12,
3112
+ name: 'Accessibility statement',
3113
+ tier: 4,
3114
+ kind: canonical,
3115
+ patterns:
3116
+ [
3117
+ '**/accessibility-statement*.md',
3118
+ '**/ACCESSIBILITY_STATEMENT.md',
3119
+ '**/a11y-statement*.md',
3120
+ ],
3121
+ applies_when: { any: [{ fact: 'platform:web' }, { fact: 'platform:mobile' }] },
3122
+ derives_from: [169, 33],
3123
+ sources: ['**/accessibility*', '**/a11y*'],
3124
+ }
3125
+ - {
3126
+ id: 202,
3127
+ cat: A12,
3128
+ name: 'Export control docs',
3129
+ tier: 4,
3130
+ kind: canonical,
3131
+ patterns: ['**/EXPORT_CONTROL.md', '**/export-control*.md'],
3132
+ derives_from: [198],
3133
+ sources: ['**/export-control*', '**/ear*', '**/classificat*'],
3134
+ }
3135
+
3136
+ # --------------------------------------------------------------- A13 (7)
3137
+ - {
3138
+ id: 203,
3139
+ cat: A13,
3140
+ name: 'KPI dashboard docs',
3141
+ tier: 4,
3142
+ kind: canonical,
3143
+ patterns: ['**/KPI.md', '**/kpi*.md', '**/metrics-docs*.md'],
3144
+ applies_when:
3145
+ {
3146
+ any:
3147
+ [
3148
+ { fact: 'platform:web' },
3149
+ { fact: 'platform:mobile' },
3150
+ { fact: 'obs:grafana' },
3151
+ { fact: 'obs:datadog' },
3152
+ ],
3153
+ },
3154
+ sources: ['**/kpi*', '**/metric*', '**/dashboard*'],
3155
+ }
3156
+ - {
3157
+ id: 204,
3158
+ cat: A13,
3159
+ name: 'Analytics event schema',
3160
+ tier: 4,
3161
+ kind: reference,
3162
+ patterns: ['**/events-schema*.json', '**/analytics-events*.md', '**/event-schema*.json'],
3163
+ applies_when:
3164
+ { any: [{ fact: 'platform:web' }, { fact: 'platform:mobile' }, { fact: 'project:api' }] },
3165
+ derives_from: [203],
3166
+ sources:
3167
+ [
3168
+ '**/analytics*',
3169
+ '**/tracking*',
3170
+ '**/gtag*',
3171
+ '**/segment*',
3172
+ '**/posthog*',
3173
+ '**/amplitude*',
3174
+ ],
3175
+ }
3176
+ - {
3177
+ id: 205,
3178
+ cat: A13,
3179
+ name: 'Funnel / conversion docs',
3180
+ tier: 4,
3181
+ kind: canonical,
3182
+ patterns: ['**/funnels*.md', '**/conversion-funnels*.md', '**/FUNNELS.md'],
3183
+ derives_from: [203],
3184
+ sources: ['**/funnel*', '**/conversion*'],
3185
+ }
3186
+ - {
3187
+ id: 206,
3188
+ cat: A13,
3189
+ name: 'A/B testing docs',
3190
+ tier: 4,
3191
+ kind: canonical,
3192
+ patterns: ['**/experiments.md', '**/ab-testing*.md', '**/experimentation*.md'],
3193
+ derives_from: [205],
3194
+ sources: ['**/experiment*', '**/ab-test*', '**/feature-flag*'],
3195
+ }
3196
+ - {
3197
+ id: 207,
3198
+ cat: A13,
3199
+ name: 'BI data dictionary',
3200
+ tier: 4,
3201
+ kind: derived,
3202
+ patterns: ['**/bi-dictionary*.md', '**/data-warehouse*.md', '**/warehouse-dictionary*.md'],
3203
+ derives_from: [204],
3204
+ sources: ['**/warehouse*', '**/lake*', '**/etl*', '**/dbt/**', '**/marts/**'],
3205
+ }
3206
+ - {
3207
+ id: 208,
3208
+ cat: A13,
3209
+ name: 'Report documentation',
3210
+ tier: 4,
3211
+ kind: canonical,
3212
+ patterns: ['**/reports/README*', '**/report-docs*.md', '**/REPORTS.md', '**/reporting.md'],
3213
+ derives_from: [203],
3214
+ sources: ['**/report*', '**/bi/**', '**/dashboards/**'],
3215
+ }
3216
+ - {
3217
+ id: 209,
3218
+ cat: A13,
3219
+ name: 'Error rate / crash reporting',
3220
+ tier: 4,
3221
+ kind: canonical,
3222
+ patterns: ['**/error-reporting*.md', '**/crash-reporting*.md', '**/ERROR_TRACKING.md'],
3223
+ applies_when:
3224
+ { any: [{ fact: 'obs:sentry' }, { fact: 'platform:server' }, { fact: 'platform:web' }] },
3225
+ derives_from: [53, 203],
3226
+ sources: ['**/sentry*', '**/error-tracking*', '**/crashlytics*', '**/glitchtip*'],
3227
+ }
3228
+
3229
+ # --------------------------------------------------------------- A14 (11)
3230
+ - {
3231
+ id: 210,
3232
+ cat: A14,
3233
+ name: 'Documentation style guide',
3234
+ tier: 4,
3235
+ kind: canonical,
3236
+ patterns:
3237
+ ['docs/style.md', '**/doc-style*.md', '**/documentation-style*.md', '**/docs/STYLE.md'],
3238
+ sources: ['**/writing-docs*', '**/doc-style*', '**/docs/STYLE*', '**/docs/CONTRIBUTING*'],
3239
+ }
3240
+ - {
3241
+ id: 211,
3242
+ cat: A14,
3243
+ name: 'Documentation architecture',
3244
+ tier: 4,
3245
+ kind: canonical,
3246
+ patterns: ['docs/README.md', '**/doc-architecture*.md', 'docs/ARCHITECTURE.md'],
3247
+ derives_from: [210],
3248
+ sources: ['docs/**', '**/*.md'],
3249
+ }
3250
+ - {
3251
+ id: 212,
3252
+ cat: A14,
3253
+ name: 'Information architecture / sitemap',
3254
+ tier: 4,
3255
+ kind: canonical,
3256
+ patterns: ['**/sitemap.md', '**/doc-sitemap*.md', '**/information-architecture*.md'],
3257
+ derives_from: [211],
3258
+ sources: ['docs/**', '**/mkdocs.yml', '**/docusaurus.config.*', '**/vitepress.config.*'],
3259
+ }
3260
+ - {
3261
+ id: 213,
3262
+ cat: A14,
3263
+ name: 'Source-of-truth matrix',
3264
+ tier: 4,
3265
+ kind: index,
3266
+ patterns: ['**/source-of-truth*.md', '**/SOURCE_OF_TRUTH.md', '**/doc-authority*.md'],
3267
+ derives_from: [215],
3268
+ sources: ['**/source-of-truth*', '**/writing-docs*'],
3269
+ }
3270
+ - {
3271
+ id: 214,
3272
+ cat: A14,
3273
+ name: 'Documentation ownership model',
3274
+ tier: 4,
3275
+ kind: index,
3276
+ patterns: ['**/docs/OWNERS.md', '**/doc-ownership*.md', '**/documentation-ownership*.md'],
3277
+ derives_from: [215],
3278
+ sources: ['**/docs/OWNERS*', '**/CODEOWNERS', '**/doc-ownership*'],
3279
+ }
3280
+ - {
3281
+ id: 215,
3282
+ cat: A14,
3283
+ name: 'Documentation sync contract',
3284
+ tier: 4,
3285
+ kind: index,
3286
+ patterns:
3287
+ [
3288
+ '**/docs-sync*.md',
3289
+ '**/sync-contract*.md',
3290
+ '**/documentation-contract*.md',
3291
+ '**/writing-docs*.md',
3292
+ ],
3293
+ sources: ['**/docs-sync*', '**/writing-docs*', '**/docs/CONTRIBUTING*'],
3294
+ }
3295
+ - {
3296
+ id: 216,
3297
+ cat: A14,
3298
+ name: 'Docs contribution guide',
3299
+ tier: 4,
3300
+ kind: canonical,
3301
+ patterns:
3302
+ ['**/docs/CONTRIBUTING.md', '**/contributing-to-docs*.md', '**/docs-contribution*.md'],
3303
+ derives_from: [171, 210],
3304
+ sources: ['docs/**'],
3305
+ }
3306
+ - {
3307
+ id: 217,
3308
+ cat: A14,
3309
+ name: 'Docs review checklist',
3310
+ tier: 4,
3311
+ kind: canonical,
3312
+ patterns: ['**/docs-review*.md', '**/doc-checklist*.md', '**/documentation-checklist*.md'],
3313
+ derives_from: [216],
3314
+ sources: ['**/docs-review*', '**/doc-checklist*'],
3315
+ }
3316
+ - {
3317
+ id: 218,
3318
+ cat: A14,
3319
+ name: 'Documentation analytics',
3320
+ tier: 4,
3321
+ kind: reference,
3322
+ patterns: ['**/docs-analytics*.md', '**/documentation-analytics*.md', '**/readership*.md'],
3323
+ derives_from: [211],
3324
+ sources: ['**/docs-analytics*', '**/readership*'],
3325
+ }
3326
+ - {
3327
+ id: 219,
3328
+ cat: A14,
3329
+ name: 'Content audit log',
3330
+ tier: 4,
3331
+ kind: generated,
3332
+ patterns: ['**/content-audit*.md', '**/docs-audit-log*.md', '**/CONTENT_AUDIT.md'],
3333
+ derives_from: [217],
3334
+ sources: ['docs/**'],
3335
+ }
3336
+ - {
3337
+ id: 220,
3338
+ cat: A14,
3339
+ name: 'Documentation toolchain',
3340
+ tier: 4,
3341
+ kind: reference,
3342
+ patterns:
3343
+ [
3344
+ '**/doc-toolchain*.md',
3345
+ '**/documentation-toolchain*.md',
3346
+ '**/mkdocs.yml',
3347
+ '**/docusaurus.config.*',
3348
+ '**/vitepress.config.*',
3349
+ '**/docsify.json',
3350
+ ],
3351
+ derives_from: [215],
3352
+ sources:
3353
+ [
3354
+ '**/mkdocs.yml',
3355
+ '**/docusaurus.config.*',
3356
+ '**/vitepress.config.*',
3357
+ '**/docsify*',
3358
+ '**/antora*',
3359
+ '**/docs/**',
3360
+ '**/scripts/**',
3361
+ ],
3362
+ }