-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathframework.schema.json
More file actions
1148 lines (1148 loc) · 52.2 KB
/
Copy pathframework.schema.json
File metadata and controls
1148 lines (1148 loc) · 52.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://jgulyash.github.io/THREAT-Matrix/docs/data/framework.schema.json",
"title": "THREAT Matrix Framework Schema",
"description": "JSON Schema for the THREAT Matrix framework.json canonical artifact. THREAT Matrix is an AI-native operational ontology for physical adversary behavior. The schema is the public contract for consumers (RAG systems, AI agents, downstream security tooling). Field values must describe a property of the indicator/tactic type, not of any specific case or assessment. See CONTRIBUTING.md \"Schema design principles\" for the full rule.",
"type": "object",
"required": [
"name",
"full_name",
"version",
"schema_version",
"license",
"matrices",
"actor_profiles",
"bibliography"
],
"properties": {
"name": {
"type": "string",
"description": "Short name of the framework."
},
"full_name": {
"type": "string",
"description": "Full descriptive name."
},
"version": {
"type": "string",
"description": "Semantic version of the framework content release."
},
"schema_version": {
"type": "string",
"description": "Semantic version of this schema. Increments on schema-breaking or schema-additive changes."
},
"license": {
"type": "string",
"description": "Framework license. Currently MIT."
},
"matrices": {
"type": "object",
"description": "Four target matrices: person, facility, organization, infrastructure. Each matrix contains tactics, an optional scope sentence describing the primary adversary objective that places a tactic in that matrix. The matrices container also carries an optional boundary_rule describing the framework-vs-operational partition principle. boundary_rule and scope are type-level statements; they do not affect schema validity for matrices that omit them.",
"properties": {
"boundary_rule": {
"type": "string",
"description": "Framework-vs-operational boundary principle governing matrix placement. Authoring-time: one matrix per tactic, set by the adversary's primary objective. Operational-time: real incidents may invoke tactics from multiple matrices via Detection Mesh cross-references (correlates_with at the indicator level). Type-level statement of the framework's organizing principle."
}
},
"patternProperties": {
"^(person|facility|organization|infrastructure)$": {
"type": "object",
"properties": {
"tactics": {
"type": "array",
"items": {
"$ref": "#/$defs/tactic"
}
},
"scope": {
"type": "string",
"description": "Canonical scope sentence for this matrix, expressed in WHAT/WHY/WHERE terms. Defines the primary adversary objective that places a tactic in this matrix at authoring time. Type-level field; not case-specific. See matrices.boundary_rule for the framework-vs-operational distinction."
}
}
}
}
},
"actor_profiles": {
"type": "array",
"items": {
"$ref": "#/$defs/actor_profile"
}
},
"escalation_rubric": {
"type": "object",
"description": "Framework-published recommendation for deriving escalation_weight from escalation_axes and mapping to severity_band. Type-level reference; consumers may follow or override with documented rationale. See CONTRIBUTING.md \"Schema design principles\".",
"properties": {
"composite_math": {
"type": "string",
"description": "Recommended formula for deriving escalation_weight from escalation_axes. Multiplicative across axes is the default; weighted-additive variants are acceptable when documented."
},
"severity_thresholds": {
"type": "object",
"description": "Numeric thresholds mapping escalation_weight to severity_band buckets.",
"properties": {
"low": {
"type": "number"
},
"medium": {
"type": "number"
},
"high": {
"type": "number"
},
"critical": {
"type": "number"
}
}
},
"rubric_version": {
"type": "string",
"description": "Bumps when the rubric changes."
},
"calibration_guidance": {
"type": "string",
"description": "Type-level framework guidance on calibrating severity_thresholds to a consumer's threat-posture environment. The framework's default thresholds reflect the rubric v1.2.0 recalibration (medium/high keep the equal-quartile cuts; critical lowered from 7.5 to 6.5 against the realized scored population); consumers operating in higher-threat-posture environments (critical infrastructure, executive protection, dignitary protection) should shift `high` and `critical` thresholds downward to surface medium-weight indicators earlier in triage. Lower-posture environments may shift them upward. Document any deviation per CONTRIBUTING.md \"Schema design principles\"."
}
}
},
"operations": {
"type": [
"object",
"array"
],
"description": "Operations / scenarios composer (V5+). Currently empty array; will become object in V5."
},
"warden_integration": {
"type": "object",
"description": "WARDEN framework integration metadata."
},
"ai_architecture": {
"type": "object",
"description": "AI capability vectors and amplification risk metadata."
},
"bibliography": {
"type": "object",
"description": "Central citation library. Each key is a unique reference ID; each value is a bibliographic entry.",
"additionalProperties": {
"$ref": "#/$defs/bibliography_entry"
}
},
"phase_mappings": {
"type": "object",
"description": "Cross-walk from THREAT Matrix phases to NTAC, Calhoun-Weston, CERT, Cyber Kill Chain, MITRE ATT&CK, and MITRE ATLAS stages. Enables AI/RAG cross-framework interoperability across physical, cyber, and AI-systems adversary models.",
"patternProperties": {
"^phase_[1-4]_(target_development|mobilization|execution|aftermath)$": {
"type": "object",
"properties": {
"ntac_pathway": {
"type": "array",
"items": {
"type": "string"
}
},
"calhoun_weston": {
"type": "array",
"items": {
"type": "string"
}
},
"cert_insider": {
"type": "array",
"items": {
"type": "string"
}
},
"cyber_kill_chain": {
"type": "array",
"items": {
"type": "string"
}
},
"mitre_attack": {
"type": "array",
"items": {
"type": "string"
}
},
"mitre_atlas": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
},
"detection_mesh": {
"type": "object",
"description": "Architectural prose object describing the cross-cutting Detection Mesh property along five axes.",
"required": [
"principle",
"axes",
"doctrinal_antecedent",
"schema_links"
],
"properties": {
"principle": {
"type": "string"
},
"axes": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"description"
],
"properties": {
"name": {
"type": "string",
"enum": [
"cross_phase",
"cross_matrix",
"cross_domain",
"cross_countermeasure",
"cross_stakeholder"
]
},
"description": {
"type": "string"
}
}
}
},
"doctrinal_antecedent": {
"type": "string"
},
"schema_links": {
"type": "object",
"properties": {
"indicators": {
"type": "string",
"const": "correlates_with"
},
"countermeasures": {
"type": "string",
"const": "compensates_for"
},
"response_protocols": {
"type": "string",
"const": "coordinates_with"
}
}
}
}
}
},
"$defs": {
"tactic": {
"type": "object",
"required": [
"id",
"name",
"matrix",
"phase",
"phase_name",
"notes",
"field_notes",
"observed_contexts",
"evidence_basis",
"source_refs"
],
"properties": {
"id": {
"type": "string",
"pattern": "^T[MFOI][0-9]{4}$"
},
"name": {
"type": "string"
},
"tactic_families": {
"type": "array",
"items": {
"type": "string"
}
},
"matrix": {
"type": "string",
"enum": [
"person",
"facility",
"organization",
"infrastructure"
]
},
"phase": {
"type": "integer",
"minimum": 1,
"maximum": 4
},
"phase_name": {
"type": "string",
"description": "Human-readable phase name. Current data uses Title Case with phase number prefix (e.g., '1 Target Development'); V1.2 may normalize."
},
"phase_4_track": {
"type": "string",
"enum": ["evasion", "attribution"],
"description": "Aftermath sub-track for phase-4 tactics: 'evasion' (Evade \u2014 withdrawal, evidence management, cover, counter-forensics, re-attack positioning) or 'attribution' (Claim \u2014 declaring, amplifying, messaging, coercive leverage). Framework-level structure carried by every matrix's phase-4 tactics; absent on phases 1\u20133. Formalized V1.3 (previously an undocumented data field on the People matrix)."
},
"notes": {
"type": "string",
"description": "Formal taxonomic description of the tactic."
},
"field_notes": {
"type": "string",
"minLength": 1,
"description": "Practitioner-voice paragraph (V1.1 mandatory)."
},
"observed_contexts": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
},
"description": "Generic context archetypes (V1.1 mandatory). Pattern archetypes only; never case names."
},
"evidence_basis": {
"type": "string",
"enum": [
"operational_primary",
"hybrid",
"literature_primary",
"literature_only"
],
"description": "Declares the tactic's grounding (V1.1 mandatory). Machine-readable provenance."
},
"cpn": {
"type": "boolean",
"description": "Cyber-Physical Nexus relevance."
},
"cpn_id": {
"type": [
"string",
"null"
]
},
"cpn_notes": {
"type": [
"string",
"null"
],
"description": "Cyber-Physical Nexus annotation. Null when cpn=false."
},
"techniques": {
"type": "array",
"items": {
"$ref": "#/$defs/technique"
}
},
"indicators": {
"type": "array",
"items": {
"$ref": "#/$defs/indicator"
}
},
"countermeasures": {
"type": "array",
"items": {
"$ref": "#/$defs/countermeasure"
}
},
"response_protocols": {
"type": "array",
"items": {
"$ref": "#/$defs/response_protocol"
}
},
"related_tactics": {
"type": "array",
"items": {
"type": "string"
}
},
"actor_associations": {
"type": "array",
"items": {
"$ref": "#/$defs/actor_association"
}
},
"source_refs": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
},
"description": "Bibliography keys. Min 1, with at least one Tier 1 source."
},
"assessment_guidance": {
"type": "object",
"description": "Optional structured per-tactic scoring guidance. Type-level inherent property of the tactic class; consumers cite the criteria preambles, high/low signal anchors, false-positive contexts, and threshold guidance to inform their own assessments. The criteria field on each of credibility/capability/intent/opportunity articulates the underlying judgment rule (e.g., 'Credibility rises with X, Y, Z; falls with A, B, C'); the high_signal_anchors and low_signal_anchors arrays illustrate the criteria with specific patterns and are indicative rather than exhaustive. Not a case-specific score. See CONTRIBUTING.md \"Schema design principles\".",
"properties": {
"credibility": {
"type": "object",
"properties": {
"criteria": {
"type": "string",
"description": "Type-level prose preamble articulating the underlying credibility-judgment rule. Carries the contract; anchors illustrate it."
},
"high_signal_anchors": {
"type": "array",
"items": {
"type": "string"
}
},
"low_signal_anchors": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"capability": {
"description": "Per-tactic aid for READING a specific actor's capability from evidence — the third of three deliberately distinct capability constructs: impact_potential presumes the class's capability ceiling; informs_axes.actor_capability scores what observing the class reveals about capability; this block guides the evidence reading. The per-case instance judgment is the future instance-conditioning record (B-03).",
"type": "object",
"properties": {
"criteria": {
"type": "string",
"description": "Type-level prose preamble articulating the underlying capability-judgment rule. Carries the contract; anchors illustrate it."
},
"high_signal_anchors": {
"type": "array",
"items": {
"type": "string"
}
},
"low_signal_anchors": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"intent": {
"type": "object",
"properties": {
"criteria": {
"type": "string",
"description": "Type-level prose preamble articulating the underlying intent-judgment rule. Carries the contract; anchors illustrate it."
},
"high_signal_anchors": {
"type": "array",
"items": {
"type": "string"
}
},
"low_signal_anchors": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"opportunity": {
"type": "object",
"properties": {
"criteria": {
"type": "string",
"description": "Type-level prose preamble articulating the underlying opportunity-judgment rule. Carries the contract; anchors illustrate it."
},
"high_signal_anchors": {
"type": "array",
"items": {
"type": "string"
}
},
"low_signal_anchors": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"false_positive_context": {
"type": "object",
"description": "Patterns where surface behavior matches the tactic's indicators but the underlying activity is legitimate. Criteria + contexts shape mirrors the credibility/capability/intent/opportunity sub-fields.",
"properties": {
"criteria": {
"type": "string",
"description": "Type-level prose articulating what distinguishes a false-positive from a real concern. Carries the contract; contexts illustrate it."
},
"contexts": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"threshold_guidance": {
"type": "string",
"description": "Prose describing the escalation threshold."
},
"escalation_priority": {
"type": "string",
"enum": [
"Urgent",
"Immediate",
"Priority",
"Routine"
],
"description": "Type-level priority class for the tactic — characterizes typical action-urgency at the tactic-class level, not case-level urgency at any specific assessment. See CONTRIBUTING.md \"Schema design principles\"."
}
}
},
"target_identity_scope": {
"type": "array",
"items": {
"type": "string",
"enum": [
"named_individual",
"role_or_identity_category",
"affinity_group",
"indiscriminate"
]
},
"uniqueItems": true,
"description": "Optional. Type-level declaration of which target_identity sub-classes this tactic's prose covers. Primarily meaningful for People matrix tactics. Authored per tactic based on actual prose coverage; tactics whose operational logic generalizes carry multiple values, tactics intrinsically narrow declare a single value. See target_identity on indicator for the per-indicator sub-dimension."
}
}
},
"technique": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"description": {
"type": "string"
}
}
},
"indicator": {
"type": "object",
"required": [
"id",
"behavior",
"category",
"detection_sources",
"phase_relevance",
"source_refs"
],
"properties": {
"id": {
"type": "string",
"pattern": "^IND-[FOI]?[0-9]{4}-[0-9]{2}$"
},
"behavior": {
"type": "string"
},
"category": {
"type": "string",
"enum": [
"surveillance",
"acquisition",
"communication",
"behavioral_change",
"planning",
"access",
"financial",
"digital"
]
},
"detection_sources": {
"type": "array",
"items": {
"type": "string",
"enum": [
"physical_observation",
"cctv",
"access_logs",
"social_media",
"peer_report",
"financial_records",
"it_logs",
"public_records",
"communications_intercept",
"open_source",
"rf_detection",
"anti_drone_systems"
]
}
},
"phase_relevance": {
"type": "array",
"minItems": 1,
"items": {
"type": "string",
"enum": [
"target_development",
"mobilization",
"execution",
"aftermath"
]
}
},
"correlates_with": {
"type": "array",
"items": {
"type": "string"
},
"description": "Other indicator IDs (Detection Mesh cross-correlation)."
},
"source_refs": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
},
"temporal_signature": {
"type": "string",
"enum": [
"horizon",
"horizon_early",
"horizon_late",
"advancing",
"advancing_early",
"advancing_late",
"imminent",
"imminent_early",
"imminent_late",
"staging",
"in_progress",
"aftermath",
"aftermath_early",
"aftermath_late"
],
"description": "Type-level property of the indicator class describing how close to action it typically appears. Distinct from phase_relevance, which describes which lifecycle phase the indicator belongs to. Base values (horizon, advancing, imminent, staging, in_progress, aftermath) define primary pathway positions; optional _early / _late refinements are available for horizon, advancing, imminent, and aftermath where within-band variation carries meaningful operational signal. Staging and in_progress are not split (staging is already a tight terminal-prep window; in_progress is binary). Authors should use the base value when within-band position is ambiguous; use a granular variant only when the indicator class clearly clusters at the early or late edge of its band. Type-level inherent property; not case-specific. See CONTRIBUTING.md \"Schema design principles\"."
},
"escalation_weight": {
"type": "number",
"minimum": 0.0,
"maximum": 10.0,
"description": "Type-level composite over escalation_axes (0.0–10.0, one-decimal precision). Recommended derivation is published in escalation_rubric.composite_math; consumers may follow the recommendation or override with documented rationale. Type-level inherent property of the indicator class, not a case-specific score. See CONTRIBUTING.md \"Schema design principles\"."
},
"escalation_axes": {
"type": "object",
"description": "Type-level inherent properties of the indicator class along four axes. Sub-fields use _potential and _inverse suffixes deliberately, signalling that these describe the behavior class's typical implications, not case-level realizations at any specific facility or assessment. See CONTRIBUTING.md \"Schema design principles\".",
"properties": {
"impact_potential": {
"type": "number",
"minimum": 0.0,
"maximum": 10.0,
"description": "Type-level magnitude of harm the behavior class directly produces or imminently enables — a severity gradient along the pathway (reconnaissance/tradecraft low, planning/access mid, force application and capability acquisition high). Presumes the capability CEILING of the class (what it could effect at most); contrast informs_axes.actor_capability (what observing the class reveals about skill) and assessment_guidance.capability (how to read a specific actor's capability from evidence). The per-case does-THIS-actor-have-the-skill judgment belongs to the instance-conditioning layer (B-03) and is never discounted into this value."
},
"blast_radius_potential": {
"type": "number",
"minimum": 0.0,
"maximum": 10.0,
"description": "Type-level geographic / population scope if the threat lands."
},
"recoverability_inverse": {
"type": "number",
"minimum": 0.0,
"maximum": 10.0,
"description": "Type-level inverse-recoverability \u2014 how hard the harm is to undo. Permanence weighted higher; lives lost = highest. Reading election (rubric v1.2.0): this axis scores the harm the behavior class DIRECTLY produces \u2014 it does not inherit the permanence of the harm a behavior presages or enables (contrast impact_potential, which counts harm a behavior directly produces or imminently enables). Victim-facing pre-attack behaviors (surveillance, approach) score their durable psychological harm; operational support behaviors (rehearsal, diversion, coordination comms) score their own transient harm. Known seam: some phase-1/2 preparatory indicators were authored before this election under a presaged-harm reading and sit above it \u2014 reconciliation is a backlogged scoring pass (B-10), not silent per-indicator drift."
},
"detectability": {
"type": "number",
"minimum": 0.0,
"maximum": 10.0,
"description": "Type-level observability of the indicator in flight by trained personnel."
}
}
},
"severity_band": {
"type": "string",
"enum": [
"low",
"medium",
"high",
"critical"
],
"description": "Optional derived bucket from escalation_weight per escalation_rubric.severity_thresholds. Consumers may compute on read or store. Type-level descriptor of the indicator class. Note: when severity_floor is present, severity_band is the greater of the computed band and the floor (see escalation_rubric.severity_floor_rule). See CONTRIBUTING.md \"Schema design principles\"."
},
"severity_floor": {
"type": "string",
"enum": [
"high",
"critical"
],
"description": "V1.3 triage floor. Present on indicators whose behavior applies direct physical force to a person; forces severity_band to at least this value regardless of the computed escalation_weight (which is left unchanged). Currently 'critical' for all such behaviors — a casualty is critical at any scale. See escalation_rubric.severity_floor_rule."
},
"informs_axes": {
"type": "object",
"description": "Type-level metadata describing which axes of the larger threat picture this indicator class typically informs, and how finely. Universal resolution scale (resolution, not severity — severity lives in escalation_axes): none = no signal on the axis; weak = resolves only the axis's coarsest grain (the axis-relevant fact exists); moderate = one grain finer (the coarse fact plus one narrowing); strong = resolves to a specific value. Rate the indicator class as written, type-level — never a vivid case instance. Six axes covering actor (capability / intent / opportunity) and the postulated event (timing / target / method). Categorical scale {strong, moderate, weak, none} — not numeric. The framework's collective judgment about how strongly an indicator class informs an axis is itself categorical at root; numeric values would be false precision. For AI/ML consumers needing continuous features, the documented mapping is strong=0.9, moderate=0.6, weak=0.3, none=0.0; this mapping is a downstream-consumer convention only, not framework-level scoring. Coverage: authored across all 190 People-matrix indicator classes (V1.3) via a sealed-blind two-rater inter-rater process gated at weighted κ ≥ 0.60 per chunk; per-axis level semantics are formalized in each axis description (V1.3 refinements #1–#4). Extension to the other matrices is an explicit deferred decision (B-09). Field remains optional on any indicator. See CONTRIBUTING.md \"Schema design principles\".",
"properties": {
"actor_capability": {
"description": "What observing the class REVEALS about the actor's skill, tradecraft, and operational sophistication — distinct from impact_potential (which presumes the class's capability ceiling) and from assessment_guidance.capability (a per-tactic aid for reading a specific actor's capability from evidence). Grains: none = purely passive/ambient behavior achievable with zero skill and zero deliberate effort (rare); weak = a deliberate action with no tradecraft visible; moderate = a real competence demonstrated (pretext durability, multi-modal coordination, concealed-imaging tradecraft, counter-surveillance); strong = advanced or specialized tradecraft (productive analysis of restricted artifacts, credential fabrication, manufacturing, regulatory-control defeat).",
"type": "string",
"enum": [
"strong",
"moderate",
"weak",
"none"
]
},
"actor_intent": {
"description": "The actor's GENERAL intent-to-act, read at type level only — specific motive class is case-level and excluded. Grains: weak = diffuse or ambient adverse interest, not yet directed; moderate = purposive, directed attention toward the subject without clear commitment; strong = clear general intent-to-act (broad-to-narrow behavioral progression, operational specificity, retention of acquired materials, grievance paired with reconnaissance). Never raise to strong because a specific motive can be imagined. Formalizes V1.3 refinement #1.",
"type": "string",
"enum": [
"strong",
"moderate",
"weak",
"none"
]
},
"actor_opportunity": {
"description": "The actor's opportunity, tiered rather than averaged across its two sub-meanings: weak = generic or ambient reach only; moderate = a resolved exploitable condition at the INFORMATIONAL tier (pattern-of-life knowledge, security-gap awareness); strong = REALIZED action-opportunity (an exploited insider relationship, direct unsupervised access, demonstrated reach within an exploitable window). During-execution support behaviors inherit the operation's realized opportunity (strong). Formalizes V1.3 refinement #2.",
"type": "string",
"enum": [
"strong",
"moderate",
"weak",
"none"
]
},
"threat_timing": {
"description": "Proximity-to-action. Locked boundary: weak = phase-only (places the threat in a pathway phase with no finer resolution); moderate = phase plus something narrower (schedule-aligned behavior, operational-tempo cues); strong = pins a specific action window (imminent, dated, or event-aligned). Mobilization-phase rehearsal, probing, and attempted or actual breach/penetration behaviors read strong; concealment and OPSEC behaviors are excepted (weak).",
"type": "string",
"enum": [
"strong",
"moderate",
"weak",
"none"
]
},
"threat_target": {
"description": "Which specific target or asset is in view. Grains: weak = targeting at a target-class level only; moderate = narrowed to a candidate set or subject-associated locations; strong = the specific named subject or subject-specific assets, including behaviors tied to a specific target-associated environment.",
"type": "string",
"enum": [
"strong",
"moderate",
"weak",
"none"
]
},
"threat_method": {
"description": "How the attack would be conducted — the ATTACK method only: access and approach tradecraft does not inform method (reads none or weak). All execution in framework scope is physical; never treat physical-vs-digital as a narrowing (digital reconnaissance still describes a physical attack downstream). Grains: none = method-agnostic, all physical methods remain in play; weak = barely narrows the physical-methods space; moderate = narrows to 2–3 candidate physical methods; strong = pins a specific physical method (e.g., VBIED, hostage scenario, targeted assassination). Formalizes V1.3 refinement #3.",
"type": "string",
"enum": [
"strong",
"moderate",
"weak",
"none"
]
}
}
},
"target_identity": {
"type": "array",
"items": {
"type": "string",
"enum": [
"named_individual",
"role_or_identity_category",
"affinity_group",
"indiscriminate"
]
},
"uniqueItems": true,
"description": "Optional multi-select sub-dimension within the People matrix: the victim identity-class(es) this indicator class REVEALS (revealed reading — tag only what the behavior actually indicates; empty/absent = reveals nothing about victim identity). named_individual = one OR MORE specific pre-identified persons are the object — surveillance/profiling/approach/force/seizure/captivity/leverage directed at the person(s), OR a specific target-associated site/environment/route coupled to them (a site reveals that specific known person(s), singular or plural, are the target). role_or_identity_category = selection is by role/what-they-are (a judge, cops by uniform, clinic staff, journalists). affinity_group = a cohesive group property selects the victims (demographic, religious, ethnic — e.g. worshippers, a gathering). indiscriminate = anyone / random crowd, no selection filter (mass-casualty by proximity/availability). Empty/absent = the behavior class reveals nothing about victim identity (capability acquisition, breach/access mechanics, OPSEC/tradecraft, logistics, financing, evidence management, most aftermath evasion). Coupling rule: tag only when observing the class resolves WHO the victim is — the person(s) or their coupled site/environment; behaviors that merely presuppose a victim without revealing the class stay empty. Reproducibility validated by a sealed-blind spot-IRR (per-value Cohen κ 0.80). Replaces the prior compatibility reading, which tagged every class a behavior COULD serve and left the field near-constant at 179/190 all-four."
},
"facility_target_scope": {
"type": "array",
"items": {
"type": "string",
"enum": [
"specific_site",
"site_class",
"symbolic_category",
"indiscriminate"
]
},
"uniqueItems": true,
"description": "Optional Facility-matrix sub-dimension: the breadth of site selection this indicator class REVEALS about the actor (revealed reading — tag only what the behavior actually indicates, not what it could apply to; empty/absent = reveals nothing about breadth). specific_site = one identified building (grievance tied to a named facility, surveillance of a specific building, as-built drawings of this site). site_class = any facility of a FUNCTIONAL/OPERATIONAL type — grouped by what the site does (any branch of an org, any hospital, any transit hub, clinics/schools of a type). symbolic_category = any site of an IDEOLOGICALLY/SYMBOLICALLY-defined category — grouped by what the site represents (any government building, any place of worship of a faith, landmarks). The discriminator between site_class and symbolic_category is the BASIS OF GROUPING (function vs meaning), not specificity; both are breadth values (any member of the group). A single named site chosen for symbolic motive is specific_site, not symbolic_category. indiscriminate = any accessible site, opportunistic with no site preference. The Facility parallel to the People matrix `target_identity`; captures breadth (which/how many sites) distinct from blast_radius (how many victims) and informs_axes.threat_target (how well the indicator resolves the target). TARGET-COUPLING RULE: populate only when the behavior reveals the breadth of an ACTUAL target selection; general knowledge, capability, or method acquisition not coupled to a target or target-class carries no scope (empty). SYMBOLIC RULE: symbolic_category applies only when symbolism defines the target BREADTH (a category chosen for its meaning); symbolic MOTIVE for a named or class target does not make it symbolic_category — a specific building chosen for what it represents is specific_site. MULTI-TAG RULE: assign multiple values only when the behavior text explicitly spans breadths, or the observable behavior independently supports each — never because several possibilities can be inferred."
},
"within_site_focus": {
"type": "array",
"items": {
"type": "string",
"enum": [
"structure",
"occupants",
"systems",
"whole_site"
]
},
"uniqueItems": true,
"description": "Optional Facility-matrix sub-dimension: what inside the facility the indicator class REVEALS as the harm focus (revealed reading; empty/absent = unresolved). structure = the building/physical asset (arson, structural sabotage, defacement, demolition). occupants = the people inside (mass-casualty intent, hostage-taking, active-shooter positioning). systems = utilities/controls/functional systems whose defeat or contamination is the aim (power, water, HVAC/contamination, fire/security-system defeat that is the attack itself — NOT security-system defeat merely to gain access). whole_site = the site as an undifferentiated unit (seizure/occupation, generic threat against the facility). Decision rule for occupied-structure attacks: `occupants` when casualty intent is shown, `structure` when the aim is property/denial with incidental casualties, both only when the behavior genuinely reveals both aims. Facility-native (no People analog); load-bearing for triage. AIM-COUPLING RULE: populate only when the behavior reveals the within-site OBJECT OF HARM. Recon of site dimensions (floor plans, layout, security posture), method/capability acquisition (breaching tools, accelerants, ramming vehicles), and general technical literacy carry no focus (empty) unless explicitly coupled to a within-site aim. Floor-plan/layout study is recon, NOT a structure focus — reserve `structure` for load-bearing/collapse/destruction aims; reserve `systems` for utility/HVAC/fire-system defeat that is the attack itself."
},
"primary_objective_evidence_tier": {
"type": "string",
"enum": [
"stated",
"strongly_inferred",
"weakly_inferred",
"unknown"
],
"description": "Optional. Incident-level annotation of the confidence with which the adversary's primary objective (which sets matrix placement per matrices.boundary_rule) is established. stated = claimed responsibility or manifested intent. strongly_inferred = operational evidence overwhelming. weakly_inferred = operational evidence ambiguous. unknown = no basis for inference; matrix placement defaults to the matrix containing the tactic that produced the most observable consequence (see matrices.boundary_rule). Full IRR protocol for this field deferred to V1.3."
},
"instance_conditioning_hints": {
"type": "object",
"additionalProperties": false,
"description": "Optional TYPE-level guidance (not a per-case record): for this indicator class, which informs_axes tend to lift under instance conditioning and to what level \u2014 the directionality an analyst should probe at assessment time. Seeded from the V1.3 sealed-blind IRR leans (see instance_conditioning). Pilot coverage; full population is a follow-on. Does not affect the type score.",
"properties": {
"actor_capability": { "type": "string", "enum": ["weak", "moderate", "strong"] },
"actor_intent": { "type": "string", "enum": ["weak", "moderate", "strong"] },
"actor_opportunity": { "type": "string", "enum": ["weak", "moderate", "strong"] },
"threat_timing": { "type": "string", "enum": ["weak", "moderate", "strong"] },
"threat_target": { "type": "string", "enum": ["weak", "moderate", "strong"] },
"threat_method": { "type": "string", "enum": ["weak", "moderate", "strong"] }
}
}
}
},
"countermeasure": {
"type": "object",
"required": [
"id",
"measure",
"category",
"domain",
"cost",
"complexity",
"time_to_implement",
"phase_relevance",
"limitations",
"source_refs"
],
"properties": {
"id": {
"type": "string",
"pattern": "^CM-[FOI]?[0-9]{4}-[0-9]{2}$"
},
"measure": {
"type": "string"
},
"category": {
"type": "string",
"enum": [
"preventive",
"detective",
"corrective",
"deterrent"
]
},
"domain": {
"type": "string",
"enum": [
"physical_barriers",
"surveillance_systems",
"access_control",
"personnel_security",
"policy_procedure",
"training_awareness",
"technical_monitoring",
"environmental_design",
"behavioral_intervention"
]
},
"cost": {
"type": "string",
"enum": [
"low",
"medium",
"high"
]
},
"complexity": {
"type": "string",
"enum": [
"low",
"medium",
"high"
]
},
"time_to_implement": {
"type": "string",
"enum": [
"immediate",
"days",
"weeks",
"months",
"weeks_to_months"
]
},
"phase_relevance": {
"type": "array",
"minItems": 1,
"items": {
"type": "string",
"enum": [
"target_development",
"mobilization",
"execution",
"aftermath"
]
}
},
"limitations": {
"type": "string"
},
"compensates_for": {
"type": "array",
"items": {
"type": "string"
},
"description": "Other countermeasure IDs (Detection Mesh compensation)."
},
"source_refs": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
}
}
},
"response_protocol": {
"type": "object",
"required": [
"id",
"trigger",
"action",
"stakeholders",
"priority",
"escalation_trigger",
"legal_notes",
"source_refs"
],
"properties": {
"id": {
"type": "string",
"pattern": "^RP-[FOI]?[0-9]{4}-[0-9]{2}$"
},
"trigger": {
"type": "string"
},
"action": {
"type": "string"
},
"stakeholders": {
"type": "array",
"items": {
"type": "string",
"enum": [
"threat_management_team",
"security_operations",
"protective_operations",
"human_resources",
"legal",
"law_enforcement",
"executive_leadership",
"it_security",
"communications",
"employee_assistance"
]
}
},
"priority": {
"type": "string",
"enum": [
"urgent",
"immediate",
"priority",
"routine",
"ongoing"
]
},
"escalation_trigger": {
"type": "string"
},
"coordinates_with": {
"type": "array",
"items": {
"type": "string"
},
"description": "Other protocol IDs (Detection Mesh parallel-execution)."
},
"legal_notes": {
"type": "string"
},
"source_refs": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
}
}
},
"actor_association": {
"type": "object",
"required": [
"actor_id",
"relevance"
],
"properties": {
"actor_id": {