File size: 115,625 Bytes
6af5ff5
 
a1aef88
 
6af5ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a1aef88
6af5ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a1aef88
6af5ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
a1aef88
6af5ff5
a1aef88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0e62cc9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a1aef88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
API_KEY = ''
GEMINI_KEY = ''
COHERE_KEY = ''

FORMAT_LONG = '''{
  "sightingDetails": {
    "DenseNarrativeSection": "Short Free-form dense narrative description of the event from the omniscient perspective, including any relevant information ",
    "trustScore" : "A reliability score from 0-100 based on the UAP/UFO report",
    "date": "YYYY-MM-DD",
    "timeOfDay": "HH:MM (24-hour format)",
    "location": {
      "name": "Specific Location",
      "latitude": "Decimal Degrees",
      "longitude": "Decimal Degrees"
    },
    "weatherConditions": {
      "generalDescription": "Description of weather",
      "visibility": "Clear, Partially Cloudy, etc.",
      "cloudCover": "Percentage or description",
      "extremePhenomena": "Any extreme weather conditions"
    },
    "sightingDuration": "Duration in hours or minutes",
    "uapCharacteristics": {
      "size": "Description or comparison",
      "shape": "The Shape of the object",
      "color": "Description of colors and patterns",
      "altitude": "Estimated or measured altitude",
      "speed": "Estimated or measured speed",
      "movementPattern": "Zigzagging, straight line, stationary, etc.",
      "changeInAppearance": "Details of any transformations",
      "sound": "Description of any associated sounds",
      "electromagneticEffects": "Any disturbances in electronic devices",
      "visualClarity": "Clarity of object's appearance",
      "detailedStructure": "Description of surface, texture, etc.",
      "presenceHumanoids": "Presence of humanoids (Yes/No)",
      "presenceSounds": "Presence of sound (Yes/No)",
      "presenceLights": "Presence of lights (Yes/No)"
    },
    "observerDetails": {
      "numberOfWitnesses": "Number of witnesses",
      "observerBackground": {
        "occupation": "Occupation",
        "experienceWithAircraft": "Experience with aircraft or aerial phenomena"
      },
      "psychologicalEffects": "Psychological/Emotional effects on observer",
      "emotionalStateBeforeSighting": "Observer's emotional state before sighting",
      "behavioralResponse": "Observer's reaction during the sighting",
      "subsequentEffects": "Physical or psychological effects post-sighting"
    },
    "evidence": {
      "photographic": "Available/Not available",
      "video": "Available/Not available",
      "url": "URL"
    },
    "additionalInformation": {
      "interactionWithEnvironment": "Effects on surroundings",
      "wildlifeBehavior": "Any unusual animal behavior",
      "previousActivity": "History of similar sightings in the area",
      "flightCharacteristics": "Detailed flight pattern description",
      "radarData": "Available/Not available",
      "airTrafficCommunications": "Reports from nearby aircraft or control towers",
      "officialResponses": "Governmental or scientific responses",
      "historicalComparisons": "Reference to similar historical sightings",
      "communicationAttempts": "Perceived attempts at communication from UAP",
      "temporalAnomalies": "Reports of lost time or time discrepancies",
      "anomalyDuration": "Specific times for changes in UAP appearance/behavior",
      "sightingFrequency": "Frequency of sightings by the observer"
    }
  }
}'''

# ---------------------------------------------------------------------------
# Spreadsheet-mapped format for UAP Activities Data 1975 Onwards.xlsx
# Used by uap_xlsx_filler.py โ€” structure mirrors the spreadsheet column groups.
# ---------------------------------------------------------------------------

FACILITY_TYPES = [
    "Aircraft Testing",
    "Atomic weapons assembly facilities",
    "Atomic Weapons Deployment",
    "Atomic weapons stockpile sites",
    "Facility type unknown",
    "ICBM Minuteman III MRV",
    "ICBM Sites",
    "Materials Production",
    "Military Base",
    "Missile Testing",
    "Other facility type/function not listed below",
    "Population Centre",
    "Radioactive materials production plants",
    "Reactor Facility",
    "Space Flight",
    "Weapons Deployment Base",
    "Weapons Design & Assembly",
    "Weapons Stockpile",
]

FORMAT_LONG_XLSX = {
    # โ”€โ”€ Source โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet columns B-D
    "source": {
        "name":      "string โ€” name of the reporting database, publication or organisation (e.g. NICAP, MUFON, AFOSI)",
        "ref":       "string โ€” specific citation, case ID or URL for this case",
        "duplicate": "string โ€” leave blank unless this is a known duplicate; if so, note the original case reference"
    },

    # โ”€โ”€ Date / Time โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet columns E-M
    "date_time": {
        "year":            "integer YYYY โ€” calendar year of the sighting (e.g. 1975); null if unknown",
        "month":           "integer 1-12 โ€” calendar month; null if unknown",
        "day":             "integer 1-31 โ€” calendar day; null if unknown",
        "day_night":       "enum [D, N, U] โ€” D = daytime, N = night-time, U = unknown",
        "local_time":      "string HH:MM โ€” local 24-hour start time of the sighting (e.g. 20:30); empty if unknown",
        "local_time_code": "string โ€” IANA timezone abbreviation or UTC offset (e.g. EST, UTC+2, PST)",
        "duration_min":    "integer โ€” total observed duration in minutes; null if unknown",
        "gmt_start":       "string HH:MM โ€” start time converted to GMT/UTC; empty if unknown",
        "description":     "string โ€” free-text date/time context when exact values cannot be determined"
    },

    # โ”€โ”€ Location โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet columns N-T
    "location": {
        "country":     "string โ€” ISO 3166-1 alpha-2 code or full name (e.g. US, UK, France)",
        "state":       "string โ€” state, province or region abbreviation or name (e.g. TN, Ontario)",
        "city":        "string โ€” city, town or nearest known populated place",
        "latitude":    "float decimal degrees WGS-84, positive = North (e.g. 36.010); null if unknown",
        "longitude":   "float decimal degrees WGS-84, positive = East (e.g. -84.267); null if unknown",
        "description": "string โ€” additional location context: landmarks, base name, access restrictions, etc.",
        "type":        "enum [Atomic site, Military base, Population centre, Waste facility, Water body, River, Airport, Forest, Desert, Ocean, Unknown] โ€” primary character of the location"
    },

    # โ”€โ”€ Witness โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet columns U-W
    "witness": {
        "count":       "integer โ€” total number of independent witnesses; null if unknown",
        "type":        "string โ€” comma-separated subset of [Military, Public, Police, Pilot, Civilian, Scientist] โ€” witness categories",
        "description": "string โ€” additional detail about witness background, rank, occupation or credibility assessment"
    },

    # โ”€โ”€ Investigation โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet columns X-Y
    "investigation": {
        "source":      "string โ€” organisation or individual that formally investigated (e.g. USAF Blue Book, NICAP, MUFON)",
        "description": "string โ€” summary of investigation process and conclusions"
    },

    # โ”€โ”€ Craft โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet columns Z-AD
    "craft": {
        "primary_shape":   "enum [Sphere, Disc, Cigar, Triangle, Diamond, Cylinder, Boomerang, Chevron, Egg, Cone, Saturn, Cross, Rectangle, Teardrop, Fireball, Light, Orb, Tic-Tac, Cube, Pyramid, Unknown, Other] โ€” dominant observed shape",
        "secondary_shape": "enum [same values as primary_shape, or empty] โ€” secondary or sub-shape if the object had a compound form",
        "colour":          "string โ€” colour or colour combination observed (e.g. Silver, Glowing orange, Red and white flashing)",
        "size":            "enum [Tiny (<0.5 m), Small (0.5-3 m), Medium (3-10 m), Large (10-50 m), Very large (50-200 m), Massive (>200 m), Unknown] โ€” estimated physical size at closest approach",
        "description":     "string โ€” free-text shape, texture, surface markings, lighting and structural detail"
    },

    # โ”€โ”€ Performance / 5 Observables โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet columns AE-AK
    # The 5 Observables are the Pentagon/AATIP framework for anomalous performance
    "performance": {
        "speed_mph":                  "float โ€” estimated or reported speed in miles per hour; null if unknown",
        "acceleration_g":             "float โ€” observed peak acceleration in g-force units; null if unknown",
        "hypersonic":                 "enum [Y, ] โ€” Y if hypersonic velocity without acoustic signature or thermal bloom was observed; blank otherwise",
        "instantaneous_acceleration": "enum [Y, ] โ€” Y if instantaneous or near-instantaneous acceleration (impossible for known craft) was observed; blank otherwise",
        "low_observability":          "enum [Y, ] โ€” Y if cloaking, active stealth or anomalously low radar cross-section was noted; blank otherwise",
        "trans_medium_travel":        "enum [Y, ] โ€” Y if seamless travel across air, water or near-space boundaries was observed; blank otherwise",
        "positive_lift":              "enum [Y, ] โ€” Y if antigravitic or non-aerodynamic lift (no wings, rotors, visible propulsion) was observed; blank otherwise"
    },

    # โ”€โ”€ Military Context โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet columns AL-AP
    "military": {
        "reported_by":     "string โ€” comma-separated subset of [Military, Public, Police, Pilot, Intelligence] โ€” who officially reported or filed the case",
        "military_public": "enum [Military, Public, Mixed] โ€” whether the primary location/context is military-controlled or publicly accessible",
        "facility_name":   "string โ€” name of the specific military base, nuclear site or government facility involved; empty if not applicable",
        "facility_type":   "enum [Aircraft Testing, Atomic weapons assembly facilities, Atomic Weapons Deployment, Atomic weapons stockpile sites, Facility type unknown, ICBM Minuteman III MRV, ICBM Sites, Materials Production, Military Base, Missile Testing, Other facility type/function not listed below, Population Centre, Radioactive materials production plants, Reactor Facility, Space Flight, Weapons Deployment Base, Weapons Design & Assembly, Weapons Stockpile] โ€” closest matching SCU facility category",
        "comments":        "string โ€” source notes on the military relevance or sensitivity of the case"
    },

    # โ”€โ”€ Effects โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet columns AQ-AT
    "effects": {
        "atomic_related":   "enum [Y, N] โ€” Y if the event involved an atomic/nuclear site, material or weapon",
        "communication":    "enum [Y, N] โ€” Y if communication interference, anomalous signals or transmissions were reported",
        "physical_effects": "enum [Y, N] โ€” Y if physical effects on people, animals, vehicles or the local environment were reported",
        "text":             "string โ€” free-text description of all communication anomalies and physical effects observed"
    },

    # โ”€โ”€ Engagement flags (spreadsheet group "Engagement", cols AU-BE) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # These are independent Y/N observed-fact flags.
    # Multiple Y values are allowed simultaneously.
    "engagement_flags": {
        "aircraft_engagement":         "enum [Y, N] โ€” Y if military or civilian aircraft actively manoeuvred to intercept or engage the UAP",
        "aircraft_encounters":         "enum [Y, N] โ€” Y if aircraft encountered the UAP without deliberate engagement",
        "active_radar_jamming":        "enum [Y, N] โ€” Y if active radar jamming โ€” of the UAP or by the UAP โ€” was documented",
        "over_military_installation":  "enum [Y, N] โ€” Y if the UAP was observed directly over a military installation or restricted airspace",
        "during_missile_test":         "enum [Y, N] โ€” Y if the sighting coincided with a missile, rocket or high-altitude balloon test",
        "radar_tracking":              "enum [Y, N] โ€” Y if the UAP was tracked on military or civilian radar",
        "radio_interference":          "enum [Y, N] โ€” Y if radio or audio receiver interference (noise, cutouts) was reported",
        "radar_jamming":               "enum [Y, N] โ€” Y if radar receivers or displays were jammed or degraded",
        "directed_radar":              "enum [Y, N] โ€” Y if the UAP emitted directed radar transmissions mimicking in-use frequencies",
        "coded_radar":                 "enum [Y, N] โ€” Y if coded radar (IFF โ€” Identification Friend or Foe) transmissions were detected from the UAP",
        "multiple_interactive_flight": "enum [Y, N] โ€” Y if multiple UAP performed coordinated or interactive flight manoeuvres with each other"
    },

    # โ”€โ”€ Engagement Type (spreadsheet group "Engagement Type", cols BF-BO) โ”€โ”€โ”€โ”€โ”€โ”€
    # CONSTRAINT: exactly ONE field must be set to "P" (Primary โ€” the dominant
    # engagement type for this case). Additional fields may be "S" (Secondary โ€”
    # also present but not the defining characteristic). All remaining fields must
    # be left blank (empty string). Do NOT use Y/N here.
    #
    # Rule: 1 ร— P required | 0-many ร— S allowed | blank = not applicable
    # Exception: if NO engagement type applies at all, set no_engagement = "P"
    # and leave every other field blank.
    "engagement_type": {
        "interactive_flight":       "P, S, or blank โ€” UAP performed flight that appeared to react to or interact with observers or aircraft",
        "radical_flight":           "P, S, or blank โ€” UAP executed physically impossible manoeuvres (right-angle turns, instant acceleration, sudden reversal)",
        "loitering":                "P, S, or blank โ€” UAP hovered, circled or loitered in a defined area for an extended period",
        "electronic_transmissions": "P, S, or blank โ€” electronic signals or transmissions attributed to the UAP were detected",
        "interference_weapons":     "P, S, or blank โ€” weapons systems (guns, missiles, guidance electronics) were interfered with or disabled",
        "military_intrusions":      "P, S, or blank โ€” UAP physically intruded into a secured military installation or restricted airspace",
        "occupant_encounter":       "P, S, or blank โ€” occupants of the UAP were directly encountered by witnesses (physical contact or attempted communication)",
        "occupant_observed":        "P, S, or blank โ€” occupants were visually observed from a distance but no encounter occurred",
        "close_approach":           "P, S, or blank โ€” UAP made a close approach (<30 m) to witnesses, vehicles or structures",
        "no_engagement":            "P, S, or blank โ€” set to P only when no other engagement type applies; mutually exclusive with all other P/S assignments"
    },

    # โ”€โ”€ Case Narrative โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    # Maps to spreadsheet column BP
    "case_text": {
        "text": "string โ€” verbatim or faithfully summarised case narrative from the original source"
    }
}

# ---------------------------------------------------------------------------
# FORMAT_SCU_V2 โ€” "SCU v2" parsing schema
#
# A redlined evolution of FORMAT_LONG_XLSX. It adds the parser-emitted
# source / assessment / anomaly blocks, tri-state (Y/N/U) flags, structured
# witness roles and an evidence array โ€” everything the SCU five-criterion
# eligibility gate needs at parse time.
#
# The `manifest` block is a DOWNSTREAM JOIN target keyed on source.documentId:
# the LLM must leave every manifest field null (each field is described as
# "null โ€” populated by manifest join").
#
# Pair the parsed output with scu_normalizer.py to canonicalise the values and
# derive the scu_eligible gate columns.
# ---------------------------------------------------------------------------
FORMAT_SCU_V2 = {
    # โ”€โ”€ Sighting details (kept from FORMAT_LONG, tightened) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "sightingDetails": {
        "DenseNarrativeSection": "string โ€” short omniscient free-form narrative of the event, including any relevant context",
        "trustScore": "integer 0-100 โ€” composite reliability score for the DATA (not the phenomenon): source provenance, completeness of date/time/location/description, investigator class, timeliness, observation modality, witness count and independence",
        "trustScoreNotes": "string โ€” one-sentence justification listing which dimensions drove trustScore",
        "date": "YYYY-MM-DD",
        "timeOfDay": "HH:MM (24-hour format)",
        "location": {
            "name": "string โ€” specific location",
            "latitude": "float โ€” decimal degrees; null if unknown",
            "longitude": "float โ€” decimal degrees; null if unknown"
        },
        "weatherConditions": {
            "generalDescription": "string โ€” description of weather",
            "visibility": "string โ€” Clear, Partially Cloudy, etc.",
            "cloudCover": "string โ€” percentage or description",
            "extremePhenomena": "string โ€” any extreme weather conditions"
        },
        "sightingDuration": "string โ€” duration in hours or minutes",
        "uapCharacteristics": {
            "size": "string โ€” description or comparison",
            "shape": "string โ€” shape of the object",
            "color": "string โ€” colours and patterns",
            "altitude": "string โ€” estimated or measured altitude",
            "speed": "string โ€” estimated or measured speed",
            "movementPattern": "string โ€” zig-zag, straight line, stationary, etc.",
            "changeInAppearance": "string โ€” details of any transformations",
            "sound": "string โ€” description of any associated sounds",
            "electromagneticEffects": "string โ€” disturbances in electronic devices",
            "visualClarity": "string โ€” clarity of the object's appearance",
            "detailedStructure": "string โ€” surface, texture, structural detail",
            "presenceHumanoids": "enum [Y, N, U] โ€” Y observed, N explicitly none, U unknown",
            "presenceHumanoids_notes": "string โ€” qualifiers (e.g. 'reported via telepathy', 'in photograph'); empty if none",
            "presenceSounds": "enum [Y, N, U]",
            "presenceLights": "enum [Y, N, U]"
        },
        "observerDetails": {
            "numberOfWitnesses": "integer โ€” exact witness count when reported; null otherwise",
            "numberOfWitnessesFreeform": "string โ€” original phrasing when non-numeric (e.g. 'Multiple', 'Hundreds', 'At least 6')",
            "observerBackground": {
                "occupation": "string โ€” observer occupation",
                "experienceWithAircraft": "string โ€” experience with aircraft or aerial phenomena"
            },
            "psychologicalEffects": "string โ€” psychological/emotional effects on the observer",
            "emotionalStateBeforeSighting": "string โ€” observer's emotional state before the sighting",
            "behavioralResponse": "string โ€” observer's reaction during the sighting",
            "subsequentEffects": "string โ€” physical or psychological effects after the sighting"
        },
        "evidence": [
            {
                "mediaType": "enum [photographic, video, radar_trace, audio, instrumented, physical_sample, sketch]",
                "availability": "enum [available, not_available, attempted_failed, referenced_not_seen, inconclusive]",
                "url": "string โ€” direct link if available, else empty",
                "description": "string โ€” qualifiers (e.g. '8mm film exposed 10 seconds', 'sketch by witness')",
                "chainOfCustody": "string โ€” provenance notes if recorded"
            }
        ],
        "additionalInformation": {
            "interactionWithEnvironment": "string โ€” effects on surroundings",
            "wildlifeBehavior": "string โ€” unusual animal behaviour",
            "previousActivity": "string โ€” history of similar sightings in the area",
            "flightCharacteristics": "string โ€” detailed flight-pattern description",
            "radarData": "enum [available, not_available, available_with_caveat, unknown]",
            "radarDataNotes": "string โ€” qualifiers (e.g. 'tracked by theodolite', 'controller had no contact')",
            "airTrafficCommunications": "string โ€” reports from nearby aircraft or control towers",
            "officialResponses": "string โ€” governmental or scientific responses",
            "historicalComparisons": "string โ€” reference to similar historical sightings",
            "communicationAttempts": "string โ€” perceived attempts at communication from the UAP",
            "temporalAnomalies": "string โ€” reports of lost time or time discrepancies",
            "anomalyDuration": "string โ€” specific times for changes in UAP appearance/behaviour",
            "sightingFrequency": "string โ€” frequency of sightings by the observer"
        }
    },

    # โ”€โ”€ Source (parser-emitted; expanded provenance + adjudication) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "source": {
        "name": "string โ€” reporting database, publication or organisation (e.g. NICAP, MUFON, AFOSI)",
        "ref": "string โ€” specific citation, case ID or URL for this case",
        "duplicate": "string โ€” case-ref of the original if this is a known duplicate, else blank",
        "documentId": "string โ€” identifier of the upstream source document; copy if visible, else blank",
        "pages": "string โ€” page range within the source document (e.g. 'page_0004-page_0006'); blank if unknown",
        "chunkCount": "integer โ€” number of text chunks contributing to this row; null if unknown",
        "parseWarning": "boolean โ€” true if a parse error was flagged on this row; default false",
        "rawText": "string โ€” un-truncated narrative text of the source",
        "agency": "string โ€” coarse agency taxonomy inferred from the document (FBI, NARA-CIA, DOD, MISC, NASA); null if not indicated",
        "collection": "string โ€” sub-collection within the agency (e.g. 'series-38', 'hs1-834228961'); null if not indicated",
        "tier": "enum [primary_investigative, secondary_investigative, reference_book, press, retrospective_personal_account, unknown] โ€” coarse reliability tier; default 'unknown'",
        "firstRecordedDate": "YYYY-MM-DD โ€” earliest dateline visible in the document text (cable/letter/memo date); null if not visible",
        "contemporaneous": "enum [Y, N, U] โ€” Y if firstRecordedDate is within one year of the sighting, N if later, U if either date is unknown",
        "originalAdjudication": "string โ€” verbatim conclusion by the investigating authority as quoted in the document; null if no adjudication appears",
        "originalAdjudicationType": "enum [unidentified, explained, dismissed, no_investigation, not_stated] โ€” coded reading of the adjudication; use 'not_stated' when the document is silent"
    },

    # โ”€โ”€ Manifest (DOWNSTREAM JOIN ONLY โ€” leave every field null) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "manifest": {
        "pdfUrl": "null โ€” populated by manifest join, never by the parser",
        "releaseDate": "null โ€” populated by manifest join, never by the parser",
        "isRedacted": "null โ€” populated by manifest join, never by the parser",
        "documentType": "null โ€” populated by manifest join, never by the parser",
        "documentDescription": "null โ€” populated by manifest join, never by the parser",
        "agencyRelease": "null โ€” populated by manifest join, never by the parser",
        "videoId": "null โ€” populated by manifest join, never by the parser",
        "modalImage": "null โ€” populated by manifest join, never by the parser",
        "joinStatus": "null โ€” populated by manifest join, never by the parser"
    },

    # โ”€โ”€ Assessment (parse-time judgement about the report's coherence) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "assessment": {
        "contradictsUap": "boolean โ€” true if the source itself states the incident was NOT a UAP (film defect, balloon, weather, hoax, sarcastic/diplomatic usage)",
        "notes": "string โ€” short justification for contradictsUap, or any other parse-time annotation"
    },

    # โ”€โ”€ Anomaly (SCU Criterion 3 โ€” anomalous characterization) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "anomaly": {
        "structure": "boolean โ€” anomalous shape, size, surface or detailed structure",
        "flight": "boolean โ€” anomalous flight (hypersonic without sonic boom, instantaneous acceleration, trans-medium, etc.)",
        "occupant": "boolean โ€” occupants observed or encountered",
        "signal": "boolean โ€” anomalous electronic transmissions or radio behaviour",
        "summary": "string โ€” one-sentence justification for any of the above being true"
    },

    # โ”€โ”€ Date / Time โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "date_time": {
        "year": "integer YYYY โ€” calendar year; null if unknown",
        "month": "integer 1-12 โ€” calendar month; null if unknown",
        "day": "integer 1-31 โ€” calendar day; null if unknown",
        "day_night": "enum [D, N, U]",
        "local_time": "string HH:MM โ€” local 24-hour start time; empty if unknown",
        "local_time_code": "string โ€” IANA timezone abbreviation or UTC offset (e.g. EST, UTC+2)",
        "duration_min": "integer โ€” total observed duration in minutes; null if unknown",
        "gmt_start": "string HH:MM โ€” start time converted to GMT/UTC; empty if unknown",
        "description": "string โ€” free-text date/time context when exact values cannot be determined",
        "yearUncertainty": "enum [exact, approximate_year, approximate_decade, unknown]",
        "dateUncertainty": "enum [exact, approximate_month, approximate_year, unknown]",
        "inWindow_1945_1975": "boolean โ€” true if the sighting falls within the SCU master study window"
    },

    # โ”€โ”€ Location โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "location": {
        "country": "string โ€” ISO 3166-1 alpha-2 code (strict). For non-country locations use sentinels: INTL_WATERS, MOON, AQ, MULTIPLE, SCAND, UNKNOWN",
        "state": "string โ€” US Census two-letter code for US states; ISO 3166-2 subdivision code elsewhere; empty if not applicable",
        "city": "string โ€” city, town or nearest known populated place",
        "latitude": "float โ€” decimal degrees WGS-84, positive = North; null if unknown",
        "longitude": "float โ€” decimal degrees WGS-84, positive = East; null if unknown",
        "description": "string โ€” additional location context: landmarks, base name, access restrictions",
        "type": "enum [Atomic site, Military base, Population centre, Waste facility, Water body, River, Airport, Forest, Desert, Ocean, Space flight, Mixed, Other, Rural, Missile testing, Unknown] โ€” primary character of the location",
        "secondaryType": "enum [same values as type, or empty] โ€” for locations that genuinely span two types"
    },

    # โ”€โ”€ Witness (structured roles array) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "witness": {
        "count": "integer โ€” exact number of independent witnesses; null if unknown",
        "countFreeform": "string โ€” original phrasing when non-numeric (e.g. 'Multiple', 'Hundreds')",
        "roles": ["enum [Military, Public, Police, Pilot, Civilian, Scientist, Intelligence, Astronaut, Politician, Security] โ€” JSON array of witness roles; no duplicates, order irrelevant"],
        "notes": "string โ€” rank/role qualifiers that don't belong in the roles enum (e.g. 'Naval Reserve')",
        "description": "string โ€” broader witness background, credibility assessment, observer-location detail"
    },

    # โ”€โ”€ Investigation (SCU Criterion 1 + 4) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "investigation": {
        "source": "string โ€” organisation or individual that investigated",
        "investigatorClass": "enum [USAF, NICAP, MUFON, FBI, CIA, NASA, AARO, law_enforcement, civilian_research, press_only, none, other]",
        "startDate": "YYYY-MM-DD โ€” when the investigation began; null if unknown",
        "lagDays": "integer โ€” days between sighting and start of investigation; null if unknown",
        "timeliness": "enum [timely, late, unknown] โ€” timely = lagDays <= 365 (SCU Criterion 1); late = lagDays > 365",
        "reports_within_1_month_of_sighting": "enum [Y, N, U] โ€” Y if the report or field investigation was initiated within one month of the observation; finer-grained than the SCU Criterion 1 one-year rule",
        "reports_within_1_year_of_sighting": "enum [Y, N, U] โ€” Y if the report or field investigation was initiated within one year of the observation (SCU Criterion 1, the one-year timeliness rule)",
        "description": "string โ€” summary of the investigation process and conclusions"
    },

    # โ”€โ”€ Craft โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "craft": {
        "primary_shape": "enum [Sphere, Disc, Cigar, Triangle, Diamond, Cylinder, Boomerang, Chevron, Egg, Cone, Saturn, Cross, Rectangle, Teardrop, Fireball, Light, Orb, Tic-Tac, Cube, Pyramid, Oval, Dome, Crescent, Unknown, Other] โ€” dominant observed shape; fold Round/Circle/Ball/Spherical into Sphere",
        "secondary_shape": "enum [same values as primary_shape, or empty]",
        "colour": "string โ€” colour or colour combination observed",
        "size": "enum [Tiny (<0.5 m), Small (0.5-3 m), Medium (3-10 m), Large (10-50 m), Very large (50-200 m), Massive (>200 m), Unknown]",
        "sizeRangeMeters": "string โ€” explicit metre range derived from the size band (e.g. '3-10 m'); empty if Unknown",
        "description": "string โ€” free-text shape, texture, surface markings, lighting and structural detail"
    },

    # โ”€โ”€ Performance / 5 Observables (tri-state) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "performance": {
        "speed_mph": "float โ€” estimated or reported speed in mph; null if unknown",
        "acceleration_g": "float โ€” observed peak acceleration in g; null if unknown",
        "hypersonic": "enum [Y, N, U] โ€” Y observed, N explicitly negative, U unknown/not assessed",
        "instantaneous_acceleration": "enum [Y, N, U]",
        "low_observability": "enum [Y, N, U]",
        "trans_medium_travel": "enum [Y, N, U]",
        "positive_lift": "enum [Y, N, U]"
    },

    # โ”€โ”€ Military context โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "military": {
        "reported_by": ["enum [Military, Public, Police, Pilot, Intelligence] โ€” JSON array of who officially reported the case"],
        "military_public": "enum [Military, Public, Mixed, None] โ€” use None when the military/public character of the location is unknown",
        "facility_name": "string โ€” name of the military base, nuclear site or government facility; empty if not applicable",
        "facility_type": "enum [Aircraft testing, Atomic weapons assembly facilities, Atomic weapons deployment, Atomic weapons stockpile sites, Facility type unknown, ICBM Minuteman III MRV, ICBM Sites, Materials Production, Military base, Missile testing, Other, Population centre, Radioactive materials production plants, Reactor Facility, Space flight, Weapons Deployment Base, Weapons Design & Assembly, Weapons Stockpile, Airport, Unknown, None] โ€” use None when the facility type is unknown",
        "comments": "string โ€” source notes on the military relevance or sensitivity of the case"
    },

    # โ”€โ”€ Effects (tri-state) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "effects": {
        "atomic_related": "enum [Y, N, U] โ€” Y if the event involved an atomic/nuclear site, material or weapon",
        "communication": "enum [Y, N, U] โ€” Y if communication interference or anomalous signals were reported",
        "physical_effects": "enum [Y, N, U] โ€” Y if physical effects on people, animals, vehicles or environment were reported",
        "text": "string โ€” free-text description of communication anomalies and physical effects"
    },

    # โ”€โ”€ Engagement flags (tri-state observed-fact flags) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "engagement_flags": {
        "aircraft_engagement": "enum [Y, N, U]",
        "aircraft_encounters": "enum [Y, N, U]",
        "active_radar_jamming": "enum [Y, N, U]",
        "over_military_installation": "enum [Y, N, U]",
        "during_missile_test": "enum [Y, N, U]",
        "radar_tracking": "enum [Y, N, U]",
        "radio_interference": "enum [Y, N, U]",
        "radar_jamming": "enum [Y, N, U]",
        "directed_radar": "enum [Y, N, U]",
        "coded_radar": "enum [Y, N, U]",
        "multiple_interactive_flight": "enum [Y, N, U]"
    },

    # โ”€โ”€ Engagement type (exactly one P; 0-many S; blank otherwise) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "engagement_type": {
        "interactive_flight": "P, S, or blank โ€” UAP flight appeared to react to or interact with observers or aircraft",
        "radical_flight": "P, S, or blank โ€” physically impossible manoeuvres (right-angle turns, instant acceleration, sudden reversal)",
        "loitering": "P, S, or blank โ€” UAP hovered, circled or loitered for an extended period",
        "electronic_transmissions": "P, S, or blank โ€” electronic signals attributed to the UAP were detected",
        "interference_weapons": "P, S, or blank โ€” weapons systems were interfered with or disabled",
        "military_intrusions": "P, S, or blank โ€” UAP intruded into a secured installation or restricted airspace",
        "occupant_encounter": "P, S, or blank โ€” occupants were directly encountered by witnesses",
        "occupant_observed": "P, S, or blank โ€” occupants were visually observed from a distance, no encounter",
        "close_approach": "P, S, or blank โ€” UAP made a close approach (<30 m) to witnesses, vehicles or structures",
        "no_engagement": "P, S, or blank โ€” set to P only when no other engagement type applies"
    },

    # โ”€โ”€ Case narrative โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "case_text": {
        "text": "string โ€” faithfully summarised case narrative; the verbatim full text lives in source.rawText"
    }
}

# ---------------------------------------------------------------------------
# FORMAT_SCU_V3 โ€” "SCU v3" parsing schema
#
# A redlined evolution of FORMAT_SCU_V2 that folds in the UFOSETI assessment
# frameworks (UFOCAT-style explanation taxonomy + Hynek-Vallรฉe AN/CE recovery
# and biological-entity flags + medical-effect human-injury extension).
#
# Adds, relative to FORMAT_SCU_V2:
#   โ€ข assessment.explanationCategory โ€” UFOCAT-style conventional-explanation taxonomy
#   โ€ข anomaly.validated / materialRecovery / biologicalEntity โ€” official-body review,
#     craft-debris recovery, and non-human entity encounter flags
#   โ€ข effects.humanInjury / humanInjuryNotes โ€” explicit medical-injury extension
#
# The `manifest` block remains a DOWNSTREAM JOIN target keyed on source.documentId:
# the LLM must leave every manifest field null.
#
# Pair the parsed output with scu_normalizer.py to canonicalise the values and
# derive the scu_eligible gate columns.
# ---------------------------------------------------------------------------
FORMAT_SCU_V3 = {
    # โ”€โ”€ Sighting details (kept from SCU_v2, unchanged) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "sightingDetails": {
        "DenseNarrativeSection": "string โ€” short omniscient free-form narrative of the event, including any relevant context",
        "trustScore": "integer 0-100 โ€” composite reliability score for the DATA (not the phenomenon): source provenance, completeness of date/time/location/description, investigator class, timeliness, observation modality, witness count and independence",
        "trustScoreNotes": "string โ€” one-sentence justification listing which dimensions drove trustScore",
        "date": "YYYY-MM-DD",
        "timeOfDay": "HH:MM (24-hour format)",
        "location": {
            "name": "string โ€” specific location",
            "latitude": "float โ€” decimal degrees; null if unknown",
            "longitude": "float โ€” decimal degrees; null if unknown"
        },
        "weatherConditions": {
            "generalDescription": "string โ€” description of weather",
            "visibility": "string โ€” Clear, Partially Cloudy, etc.",
            "cloudCover": "string โ€” percentage or description",
            "extremePhenomena": "string โ€” any extreme weather conditions"
        },
        "sightingDuration": "string โ€” duration in hours or minutes",
        "uapCharacteristics": {
            "size": "string โ€” description or comparison",
            "shape": "string โ€” shape of the object",
            "color": "string โ€” colours and patterns",
            "altitude": "string โ€” estimated or measured altitude",
            "speed": "string โ€” estimated or measured speed",
            "movementPattern": "string โ€” zig-zag, straight line, stationary, etc.",
            "changeInAppearance": "string โ€” details of any transformations",
            "sound": "string โ€” description of any associated sounds",
            "electromagneticEffects": "string โ€” disturbances in electronic devices",
            "visualClarity": "string โ€” clarity of the object's appearance",
            "detailedStructure": "string โ€” surface, texture, structural detail",
            "presenceHumanoids": "enum [Y, N, U] โ€” Y observed, N explicitly none, U unknown",
            "presenceHumanoids_notes": "string โ€” qualifiers (e.g. 'reported via telepathy', 'in photograph'); empty if none",
            "presenceSounds": "enum [Y, N, U]",
            "presenceLights": "enum [Y, N, U]"
        },
        "observerDetails": {
            "numberOfWitnesses": "integer โ€” exact witness count when reported; null otherwise",
            "numberOfWitnessesFreeform": "string โ€” original phrasing when non-numeric (e.g. 'Multiple', 'Hundreds', 'At least 6')",
            "observerBackground": {
                "occupation": "string โ€” observer occupation",
                "experienceWithAircraft": "string โ€” experience with aircraft or aerial phenomena"
            },
            "psychologicalEffects": "string โ€” psychological/emotional effects on the observer",
            "emotionalStateBeforeSighting": "string โ€” observer's emotional state before the sighting",
            "behavioralResponse": "string โ€” observer's reaction during the sighting",
            "subsequentEffects": "string โ€” physical or psychological effects after the sighting"
        },
        "evidence": [
            {
                "mediaType": "enum [photographic, video, radar_trace, audio, instrumented, physical_sample, sketch]",
                "availability": "enum [available, not_available, attempted_failed, referenced_not_seen, inconclusive]",
                "url": "string โ€” direct link if available, else empty",
                "description": "string โ€” qualifiers (e.g. '8mm film exposed 10 seconds', 'sketch by witness')",
                "chainOfCustody": "string โ€” provenance notes if recorded"
            }
        ],
        "additionalInformation": {
            "interactionWithEnvironment": "string โ€” effects on surroundings",
            "wildlifeBehavior": "string โ€” unusual animal behaviour",
            "previousActivity": "string โ€” history of similar sightings in the area",
            "flightCharacteristics": "string โ€” detailed flight-pattern description",
            "radarData": "enum [available, not_available, available_with_caveat, unknown]",
            "radarDataNotes": "string โ€” qualifiers (e.g. 'tracked by theodolite', 'controller had no contact')",
            "airTrafficCommunications": "string โ€” reports from nearby aircraft or control towers",
            "officialResponses": "string โ€” governmental or scientific responses",
            "historicalComparisons": "string โ€” reference to similar historical sightings",
            "communicationAttempts": "string โ€” perceived attempts at communication from the UAP",
            "temporalAnomalies": "string โ€” reports of lost time or time discrepancies",
            "anomalyDuration": "string โ€” specific times for changes in UAP appearance/behaviour",
            "sightingFrequency": "string โ€” frequency of sightings by the observer"
        }
    },

    # โ”€โ”€ Source (parser-emitted; expanded provenance + adjudication) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "source": {
        "name": "string โ€” reporting database, publication or organisation (e.g. NICAP, MUFON, AFOSI)",
        "ref": "string โ€” specific citation, case ID or URL for this case",
        "duplicate": "string โ€” case-ref of the original if this is a known duplicate, else blank",
        "documentId": "string โ€” identifier of the upstream source document; copy if visible, else blank",
        "pages": "string โ€” page range within the source document (e.g. 'page_0004-page_0006'); blank if unknown",
        "chunkCount": "integer โ€” number of text chunks contributing to this row; null if unknown",
        "parseWarning": "boolean โ€” true if a parse error was flagged on this row; default false",
        "rawText": "string โ€” un-truncated narrative text of the source",
        "agency": "string โ€” coarse agency taxonomy inferred from the document (FBI, NARA-CIA, DOD, MISC, NASA); null if not indicated",
        "collection": "string โ€” sub-collection within the agency (e.g. 'series-38', 'hs1-834228961'); null if not indicated",
        "tier": "enum [primary_investigative, secondary_investigative, reference_book, press, retrospective_personal_account, unknown] โ€” coarse reliability tier; default 'unknown'",
        "firstRecordedDate": "YYYY-MM-DD โ€” earliest dateline visible in the document text (cable/letter/memo date); null if not visible",
        "contemporaneous": "enum [Y, N, U] โ€” Y if firstRecordedDate is within one year of the sighting, N if later, U if either date is unknown",
        "originalAdjudication": "string โ€” verbatim conclusion by the investigating authority as quoted in the document; null if no adjudication appears",
        "originalAdjudicationType": "enum [unidentified, explained, dismissed, no_investigation, not_stated] โ€” coded reading of the adjudication; use 'not_stated' when the document is silent"
    },

    # โ”€โ”€ Manifest (DOWNSTREAM JOIN ONLY โ€” leave every field null) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "manifest": {
        "pdfUrl": "null โ€” populated by manifest join, never by the parser",
        "releaseDate": "null โ€” populated by manifest join, never by the parser",
        "isRedacted": "null โ€” populated by manifest join, never by the parser",
        "documentType": "null โ€” populated by manifest join, never by the parser",
        "documentDescription": "null โ€” populated by manifest join, never by the parser",
        "agencyRelease": "null โ€” populated by manifest join, never by the parser",
        "videoId": "null โ€” populated by manifest join, never by the parser",
        "modalImage": "null โ€” populated by manifest join, never by the parser",
        "joinStatus": "null โ€” populated by manifest join, never by the parser"
    },

    # โ”€โ”€ Assessment (parse-time judgement + UFOCAT-style explanation taxonomy) โ”€โ”€
    "assessment": {
        "contradictsUap": "boolean โ€” true if the source itself states the incident was NOT a UAP (film defect, balloon, weather, hoax, sarcastic/diplomatic usage)",
        "notes": "string โ€” short justification for contradictsUap, or any other parse-time annotation",
        "explanationCategory": "enum [conventional_tech, weather, celestial, hoax, misidentification, redacted_explained, unknown] โ€” populated only when contradictsUap is true; sub-classifies the type of conventional explanation given by the source. Use 'unknown' when contradictsUap is true but the source does not specify the explanation type."
    },

    # โ”€โ”€ Anomaly (SCU Criterion 3 + UFOSETI Hynek-Vallรฉe extensions) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "anomaly": {
        "structure": "boolean โ€” anomalous shape, size, surface or detailed structure",
        "flight": "boolean โ€” anomalous flight (hypersonic without sonic boom, instantaneous acceleration, trans-medium, etc.)",
        "occupant": "boolean โ€” occupants observed or encountered",
        "signal": "boolean โ€” anomalous electronic transmissions or radio behaviour",
        "summary": "string โ€” one-sentence justification for any of the above being true",
        "validated": "enum [Y, N, U] โ€” Y if an official investigative body (USAF, FBI, AARO, NICAP, etc.) reviewed the case and could not produce a conventional explanation; N if the same body produced a conventional explanation; U if no official review conclusion is stated in the source",
        "materialRecovery": "enum [Y, N, U] โ€” Y if the source describes or alleges physical recovery of craft debris, material fragments, or other non-biological physical evidence attributable to the UAP; N if explicitly none; U if unknown or not mentioned",
        "biologicalEntity": "enum [Y, N, U] โ€” Y if the source describes or alleges recovery, encounter, or direct contact with a non-human biological entity (living or deceased); N if explicitly none; U if unknown or not mentioned"
    },

    # โ”€โ”€ Date / Time โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "date_time": {
        "year": "integer YYYY โ€” calendar year; null if unknown",
        "month": "integer 1-12 โ€” calendar month; null if unknown",
        "day": "integer 1-31 โ€” calendar day; null if unknown",
        "day_night": "enum [D, N, U]",
        "local_time": "string HH:MM โ€” local 24-hour start time; empty if unknown",
        "local_time_code": "string โ€” IANA timezone abbreviation or UTC offset (e.g. EST, UTC+2)",
        "duration_min": "integer โ€” total observed duration in minutes; null if unknown",
        "gmt_start": "string HH:MM โ€” start time converted to GMT/UTC; empty if unknown",
        "description": "string โ€” free-text date/time context when exact values cannot be determined",
        "yearUncertainty": "enum [exact, approximate_year, approximate_decade, unknown]",
        "dateUncertainty": "enum [exact, approximate_month, approximate_year, unknown]",
        "inWindow_1945_1975": "boolean โ€” true if the sighting falls within the SCU master study window"
    },

    # โ”€โ”€ Location โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "location": {
        "country": "string โ€” ISO 3166-1 alpha-2 code (strict). For non-country locations use sentinels: INTL_WATERS, MOON, AQ, MULTIPLE, SCAND, UNKNOWN",
        "state": "string โ€” US Census two-letter code for US states; ISO 3166-2 subdivision code elsewhere; empty if not applicable",
        "city": "string โ€” city, town or nearest known populated place",
        "latitude": "float โ€” decimal degrees WGS-84, positive = North; null if unknown",
        "longitude": "float โ€” decimal degrees WGS-84, positive = East; null if unknown",
        "description": "string โ€” additional location context: landmarks, base name, access restrictions",
        "type": "enum [Atomic site, Military base, Population centre, Waste facility, Water body, River, Airport, Forest, Desert, Ocean, Space flight, Mixed, Other, Rural, Missile testing, Unknown] โ€” primary character of the location",
        "secondaryType": "enum [same values as type, or empty] โ€” for locations that genuinely span two types"
    },

    # โ”€โ”€ Witness (structured roles array) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "witness": {
        "count": "integer โ€” exact number of independent witnesses; null if unknown",
        "countFreeform": "string โ€” original phrasing when non-numeric (e.g. 'Multiple', 'Hundreds')",
        "roles": ["enum [Military, Public, Police, Pilot, Civilian, Scientist, Intelligence, Astronaut, Politician, Security] โ€” JSON array of witness roles; no duplicates, order irrelevant"],
        "notes": "string โ€” rank/role qualifiers that don't belong in the roles enum (e.g. 'Naval Reserve')",
        "description": "string โ€” broader witness background, credibility assessment, observer-location detail"
    },

    # โ”€โ”€ Investigation (SCU Criterion 1 + 4) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "investigation": {
        "source": "string โ€” organisation or individual that investigated",
        "investigatorClass": "enum [USAF, NICAP, MUFON, FBI, CIA, NASA, AARO, law_enforcement, civilian_research, press_only, none, other]",
        "startDate": "YYYY-MM-DD โ€” when the investigation began; null if unknown",
        "lagDays": "integer โ€” days between sighting and start of investigation; null if unknown",
        "timeliness": "enum [timely, late, unknown] โ€” timely = lagDays <= 365 (SCU Criterion 1); late = lagDays > 365",
        "reports_within_1_month_of_sighting": "enum [Y, N, U] โ€” Y if the report or field investigation was initiated within one month of the observation; finer-grained than the SCU Criterion 1 one-year rule",
        "reports_within_1_year_of_sighting": "enum [Y, N, U] โ€” Y if the report or field investigation was initiated within one year of the observation (SCU Criterion 1, the one-year timeliness rule)",
        "description": "string โ€” summary of the investigation process and conclusions"
    },

    # โ”€โ”€ Craft โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "craft": {
        "primary_shape": "enum [Sphere, Disc, Cigar, Triangle, Diamond, Cylinder, Boomerang, Chevron, Egg, Cone, Saturn, Cross, Rectangle, Teardrop, Fireball, Light, Orb, Tic-Tac, Cube, Pyramid, Oval, Dome, Crescent, Unknown, Other] โ€” dominant observed shape; fold Round/Circle/Ball/Spherical into Sphere",
        "secondary_shape": "enum [same values as primary_shape, or empty]",
        "colour": "string โ€” colour or colour combination observed",
        "size": "enum [Tiny (<0.5 m), Small (0.5-3 m), Medium (3-10 m), Large (10-50 m), Very large (50-200 m), Massive (>200 m), Unknown]",
        "sizeRangeMeters": "string โ€” explicit metre range derived from the size band (e.g. '3-10 m'); empty if Unknown",
        "description": "string โ€” free-text shape, texture, surface markings, lighting and structural detail"
    },

    # โ”€โ”€ Performance / 5 Observables (tri-state) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "performance": {
        "speed_mph": "float โ€” estimated or reported speed in mph; null if unknown",
        "acceleration_g": "float โ€” observed peak acceleration in g; null if unknown",
        "hypersonic": "enum [Y, N, U] โ€” Y observed, N explicitly negative, U unknown/not assessed",
        "instantaneous_acceleration": "enum [Y, N, U]",
        "low_observability": "enum [Y, N, U]",
        "trans_medium_travel": "enum [Y, N, U]",
        "positive_lift": "enum [Y, N, U]"
    },

    # โ”€โ”€ Military context โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "military": {
        "reported_by": ["enum [Military, Public, Police, Pilot, Intelligence] โ€” JSON array of who officially reported the case"],
        "military_public": "enum [Military, Public, Mixed, None] โ€” use None when the military/public character of the location is unknown",
        "facility_name": "string โ€” name of the military base, nuclear site or government facility; empty if not applicable",
        "facility_type": "enum [Aircraft testing, Atomic weapons assembly facilities, Atomic weapons deployment, Atomic weapons stockpile sites, Facility type unknown, ICBM Minuteman III MRV, ICBM Sites, Materials Production, Military base, Missile testing, Other, Population centre, Radioactive materials production plants, Reactor Facility, Space flight, Weapons Deployment Base, Weapons Design & Assembly, Weapons Stockpile, Airport, Unknown, None] โ€” use None when the facility type is unknown",
        "comments": "string โ€” source notes on the military relevance or sensitivity of the case"
    },

    # โ”€โ”€ Effects (tri-state + medical-injury extension) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "effects": {
        "atomic_related": "enum [Y, N, U] โ€” Y if the event involved an atomic/nuclear site, material or weapon",
        "communication": "enum [Y, N, U] โ€” Y if communication interference or anomalous signals were reported",
        "physical_effects": "enum [Y, N, U] โ€” Y if physical effects on people, animals, vehicles or environment were reported",
        "text": "string โ€” free-text description of communication anomalies and physical effects",
        "humanInjury": "enum [Y, N, U] โ€” Y if physical injury to human witnesses was explicitly reported (burns, radiation sickness, temporary blindness, trauma, neurological effects, etc.); N if the source explicitly states no injury; U if not mentioned. Do NOT infer from 'physical_effects' alone โ€” requires direct textual evidence of human bodily harm.",
        "humanInjuryNotes": "string โ€” type and severity of injury as described in the source (e.g. 'radiation burns to hands and face', 'temporary paralysis lasting 3 days'); empty if humanInjury is N or U"
    },

    # โ”€โ”€ Engagement flags (tri-state observed-fact flags) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "engagement_flags": {
        "aircraft_engagement": "enum [Y, N, U]",
        "aircraft_encounters": "enum [Y, N, U]",
        "active_radar_jamming": "enum [Y, N, U]",
        "over_military_installation": "enum [Y, N, U]",
        "during_missile_test": "enum [Y, N, U]",
        "radar_tracking": "enum [Y, N, U]",
        "radio_interference": "enum [Y, N, U]",
        "radar_jamming": "enum [Y, N, U]",
        "directed_radar": "enum [Y, N, U]",
        "coded_radar": "enum [Y, N, U]",
        "multiple_interactive_flight": "enum [Y, N, U]"
    },

    # โ”€โ”€ Engagement type (exactly one P; 0-many S; blank otherwise) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "engagement_type": {
        "interactive_flight": "P, S, or blank โ€” UAP flight appeared to react to or interact with observers or aircraft",
        "radical_flight": "P, S, or blank โ€” physically impossible manoeuvres (right-angle turns, instant acceleration, sudden reversal)",
        "loitering": "P, S, or blank โ€” UAP hovered, circled or loitered for an extended period",
        "electronic_transmissions": "P, S, or blank โ€” electronic signals attributed to the UAP were detected",
        "interference_weapons": "P, S, or blank โ€” weapons systems were interfered with or disabled",
        "military_intrusions": "P, S, or blank โ€” UAP intruded into a secured installation or restricted airspace",
        "occupant_encounter": "P, S, or blank โ€” occupants were directly encountered by witnesses",
        "occupant_observed": "P, S, or blank โ€” occupants were visually observed from a distance, no encounter",
        "close_approach": "P, S, or blank โ€” UAP made a close approach (<30 m) to witnesses, vehicles or structures",
        "no_engagement": "P, S, or blank โ€” set to P only when no other engagement type applies"
    },

    # โ”€โ”€ Case narrative โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "case_text": {
        "text": "string โ€” faithfully summarised case narrative; the verbatim full text lives in source.rawText"
    }
}

# ---------------------------------------------------------------------------
# FORMAT_SCU_V1 โ€” "SCU v1" parsing schema (the default extraction format)
#
# The same field set as FORMAT_SCU_V3, minus two blocks:
#   โ€ข sightingDetails โ€” the verbose nested narrative group
#   โ€ข manifest        โ€” the all-null downstream-join placeholder columns the
#                       parser must always leave null
# Everything else (source, assessment, anomaly, date_time, location, witness,
# investigation, craft, performance, military, effects, engagement_flags,
# engagement_type, case_text) is inherited unchanged. Derived from
# FORMAT_SCU_V3 so it never drifts out of sync; _deep_merge treats schemas as
# read-only, so the shared nested references are safe.
# ---------------------------------------------------------------------------
_SCU_V1_DROP = ("sightingDetails", "manifest")
FORMAT_SCU_V1 = {k: v for k, v in FORMAT_SCU_V3.items() if k not in _SCU_V1_DROP}

# ---------------------------------------------------------------------------
# Merged compact schema โ€” used by the Markdown-folder ingestion agent.
# Covers the essential fields from both FORMAT_LONG (sightingDetails) and
# FORMAT_LONG_XLSX (SCU groups) so the result feeds either downstream pipeline.
# The LLM is instructed to be concise: fill what is explicitly stated, leave
# everything else null / blank.
# ---------------------------------------------------------------------------
# ---------------------------------------------------------------------------
# UFOSETI (RU) format โ€” Russian UFO/UAP database schema
# Column names mirror the UFOSETI database export; ar_code values follow the
# UFOCAT Codebook 2023: https://cufos.org/PDFs/UFOCAT%20Codebook%202023.pdf
# ---------------------------------------------------------------------------
FORMAT_UFOSETI_RU = {
    # 15 columns matching the UFOSETI export schema (final_ufoseti_dataset.xlsx, 3 069 rows)
    "obs_number":         "integer โ€” UFOSETI internal observation ID; preserve the raw number exactly (e.g. 3776)",

    "en_description":     "string โ€” English-language narrative description of the sighting event",
    "ru_description":     "string โ€” Russian-language narrative description of the same event (ะžะฟะธัะฐะฝะธะต ะฝะฐ ั€ัƒััะบะพะผ ัะทั‹ะบะต)",

    "country":            "string โ€” Country where the sighting occurred (e.g. Russia, Kazakhstan, Ukraine, United States)",

    # ar_code: two-character UFOCAT Anomaly Rating code from the UFOCAT Codebook 2023
    #   A digit = Anomaly level:  0 = Not Anomalous | 1 = Probably Not Anomalous
    #                             2 = Probably Anomalous | 3 = Anomalous
    #   R digit = Reliability:    0 = Hoax or Mistake | 1 = Rumor / Media Publication
    #                             2 = Reliable Source / Primary Source | 3 = Indirect Testimony
    #                             4 = Indirect Evidence | 5 = Have Reliable Data
    #                             6 = Have Irrefutable Public Data
    "ar_code":            "string โ€” UFOCAT two-part Anomaly-Reliability code, format A{0-3}R{0-6}. "
                          "A = anomaly level (0 Not Anomalous โ†’ 3 Anomalous); "
                          "R = evidence reliability (0 Hoax/Mistake โ†’ 6 Irrefutable Public Data). "
                          "E.g. A2R2 = Probably Anomalous | Reliable Source. Leave blank if unknown.",

    # Hynek-Vallรฉe phenomenological classification used by UFOSETI
    #   Category prefix: FB = Fly-By (no maneuver noted)
    #                    MA = Maneuver (observed flight maneuver)
    #                    AN = Anomalous phenomenon (non-craft anomaly)
    #                    CE = Close Encounter (object within ~150 m)
    #   Subtype digit:   1 = no physical effects or traces
    #                    2 = physical / electromagnetic effects
    #                    3 = entity or occupant observed
    #                    4 = abduction or reality transformation (AN4)
    #                    5 = fatal outcome or bilateral contact (CE5)
    "hynek_vallee_code":  "string โ€” Hynek-Vallรฉe classification: prefix (FB Fly-By, MA Maneuver, AN Anomaly, CE Close Encounter) "
                          "plus subtype 1-5 (1 no effects; 2 physical/EM effects; 3 entity observed; 4 abduction/transformation; 5 fatal/contact). "
                          "Observed values: FB1, FB2, FB4, FB5, MA1, MA2, MA3, MA4, MA5, AN1, AN2, AN3, AN4, AN5, CE1, CE2, CE3, CE4, CE5. "
                          "Leave blank if unknown.",

    "authenticities":     "string โ€” UFOSETI investigation status. Allowed values: "
                          "Unconfirmed (report received, not yet reviewed), "
                          "Under investigation (active review in progress), "
                          "Investigation was made (review completed), "
                          "Investigation suspended (review halted, no conclusion), "
                          "Insufficient data (not enough information to assess), "
                          "Repetition (duplicate or repeat of a known sighting). "
                          "Leave blank if unknown.",

    "observation_date":   "string โ€” Date and time of the sighting in DD-MM-YYYY HH:MMZ format (UTC), e.g. 18-05-2024 07:28Z",
    "report_date":        "string โ€” Date and time the report was submitted in DD-MM-YYYY HH:MMZ format (UTC), e.g. 20-05-2024 13:13Z",

    "shape":              "string โ€” Shape of the observed object. Allowed values: "
                          "Round, Circular, Spherical, Triangular, Star-shaped, Cigar-shaped, Oval, Hemisphere, Polygonal. "
                          "Leave blank if unknown.",

    "observer_direction": "string โ€” Compass direction the observer was facing during the sighting. Allowed values: "
                          "North, North-East, East, South-East, South, South-West, West, North-West, No direction. "
                          "Leave blank if unknown.",

    # ar_code_full is the human-readable expansion of ar_code; the two must always agree
    "ar_code_full":       "string โ€” Full human-readable UFOCAT Anomaly Rating: {Anomaly level} | {Reliability level}. "
                          "Anomaly levels: Not Anomalous | Probably Not Anomalous | Probably Anomalous | Anomalous. "
                          "Reliability levels: Hoax/Mistake | Rumor/Media Publication | Reliable Source/Primary Source | "
                          "Indirect Testimony | Indirect Evidence | Have Reliable Data | Have Irrefutable Public Data. "
                          "Must be consistent with ar_code. E.g. A2R2 โ†’ Probably Anomalous | Reliable Source/Primary Source.",

    "source":             "string โ€” Originating source: direct URL (YouTube, VK, NUFORC, etc.) or organisation name "
                          "(e.g. MUFON โ€” Mutual UFO Network, NUFORC โ€” National UFO Reporting Center); leave blank if unknown",

    "ufoseti_report_date":"string โ€” Timestamp when this record was ingested into the UFOSETI database, "
                          "format YYYY-MM-DD HH:MM:SS UTC, e.g. 2024-05-20 13:13:03 UTC",

    "url":                "string โ€” Direct URL to the original UFOSETI report page, "
                          "e.g. https://ufoseti.org/ru/reports/3776-inoy-nlo-russian-federation-chelyabinskaya-oblast"
}

FORMAT_MERGED = {
    # โ”€โ”€ Default UAP format fields โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "sightingDetails": {
        "DenseNarrativeSection": "2-3 sentence omniscient summary of the event",
        "trustScore":            "integer 0-100 reliability estimate",
        "date":                  "YYYY-MM-DD or partial (YYYY-MM or YYYY)",
        "location": {
            "name":      "most specific known place name",
            "latitude":  "decimal degrees or null",
            "longitude": "decimal degrees or null"
        },
        "uapCharacteristics": {
            "shape":           "dominant shape or null",
            "color":           "colour description or null",
            "size":            "size description or null",
            "speed":           "speed description or null",
            "movementPattern": "movement description or null",
            "sound":           "sound description or null",
            "presenceLights":  "Yes / No / null"
        }
    },
    # โ”€โ”€ SCU spreadsheet format fields โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "source": {
        "name": "reporting database, publication or organisation",
        "ref":  "case ID, document reference or URL"
    },
    "date_time": {
        "year":         "integer YYYY or null",
        "month":        "integer 1-12 or null",
        "day":          "integer 1-31 or null",
        "day_night":    "D / N / U",
        "duration_min": "integer minutes or null"
    },
    "location": {
        "country":  "ISO country name or code",
        "state":    "state / province or null",
        "city":     "nearest city or null",
        "latitude":  "float or null",
        "longitude": "float or null",
        "type":      "enum [Atomic site, Military base, Population centre, Water body, Airport, Forest, Desert, Ocean, Unknown]"
    },
    "witness": {
        "count": "integer or null",
        "type":  "comma-separated subset of [Military, Public, Police, Pilot, Civilian, Scientist]"
    },
    "craft": {
        "primary_shape": "enum [Sphere, Disc, Cigar, Triangle, Diamond, Cylinder, Boomerang, Egg, Cone, Fireball, Light, Orb, Tic-Tac, Rectangle, Unknown, Other]",
        "colour":        "colour string or null",
        "size":          "enum [Tiny, Small, Medium, Large, Very large, Massive, Unknown]"
    },
    "performance": {
        "hypersonic":                 "Y or blank",
        "instantaneous_acceleration": "Y or blank",
        "low_observability":          "Y or blank",
        "trans_medium_travel":        "Y or blank",
        "positive_lift":              "Y or blank"
    },
    "military": {
        "reported_by":   "comma-separated subset of [Military, Public, Police, Pilot, Intelligence]",
        "facility_name": "name of base / site or null",
        "facility_type": "SCU facility enum or null"
    },
    "effects": {
        "atomic_related":   "Y / N",
        "physical_effects": "Y / N"
    },
    "engagement_type": {
        "interactive_flight":       "P, S, or blank",
        "radical_flight":           "P, S, or blank",
        "loitering":                "P, S, or blank",
        "close_approach":           "P, S, or blank",
        "no_engagement":            "P, S, or blank"
    },
    "case_text": {
        "text": "verbatim or faithfully summarised case narrative"
    }
}

# โ”€โ”€ FORMAT_NUFORC โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# US National UFO Reporting Center | ~70,000 rows | EN | NUFORC 2023.03.csv
FORMAT_NUFORC = {
    "id":          "string โ€” unique NUFORC case ID (e.g. S177105)",
    "city":        "string โ€” city or town of sighting (uppercase)",
    "district":    "string โ€” state, province or region (uppercase)",
    "country":     "string โ€” ISO 3166-1 alpha-2 country code (e.g. US, GB)",
    "water":       "string โ€” associated water body; null if unknown",
    "other":       "string โ€” additional location qualifier; null if unknown",
    "date":        "string โ€” ISO 8601 datetime of sighting (e.g. 2023-07-29 17:45:00)",
    "date_detail": "string โ€” human-readable date/time as submitted (e.g. 07/29/23 5:45 PM)",
    "description": "string โ€” free-text witness narrative",
}

# โ”€โ”€ FORMAT_BLUE_BOOK โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# US Air Force Project Blue Book (1947โ€“1969) | ~15,000 rows | EN | bluebook1.csv + bluebook2.csv
FORMAT_BLUE_BOOK = {
    "case_id":         "string โ€” Blue Book case identifier (e.g. BB-8371)",
    "date":            "string โ€” date of the sighting (various formats); null if unknown",
    "location":        "string โ€” free-text location (city, state or country)",
    "state":           "string โ€” US state abbreviation (e.g. NY, CA); null for non-US",
    "country":         "enum [US, EU, P, AS, CN, A, CA, SA, AF, AU, ME, JP, GB, M, OC, AN] โ€” country or continental code; null if unknown",
    "incident":        "string โ€” free-text summary of the incident",
    "special_comments":"string โ€” investigator annotations; null if unknown",
    "shape":           "string โ€” observed shape (free-text; ~400 unique values; e.g. Disc, Cigar, Light, Round, Ball, DomeDisc, Ovoid, Oval, Cylinder, Sphere, Triangle, Fireball); null if unknown",
    "size_meters":     "float โ€” estimated physical size in metres; null if unknown",
    "result":          "enum [Meteor, Aircraft, Balloon, Star, Venus, Satellite, Reflection, Debris, Mars, Mirage, Rocket, Hoax, Jupiter, Flare, Re-entry, Unidentified, Insufficient Data, Unknown, Psychological, Natural, Moon, Radar, Light, Astronomical, Other] โ€” official investigation conclusion; null if unknown",
}

# โ”€โ”€ FORMAT_UK_NATIONAL_ARCHIVES โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# UK MoD / National Archives UAP catalogue (1978โ€“2000) | ~2,827 rows | EN | uk.csv
FORMAT_UK_NATIONAL_ARCHIVES = {
    "date":               "string โ€” date of sighting (YYYY-MM-DD)",
    "catalog_entry":      "string โ€” UK National Archives DEFE reference (e.g. DEFE-24-1939-13)",
    "location":           "string โ€” free-text city, county and country (e.g. Laughton, Sheffield, UK)",
    "summary_description":"string โ€” free-text summary of the sighting as filed by the MoD",
    "shape":              "string โ€” observed shape (free-text; ~936 unique values; major: light, lights, round, circular, star, triangular, cigar, oval, saucer, ball, disc, sphere, oblong); null if unknown",
    "size":               "string โ€” size descriptor (free-text; major: large, small, very large, aircraft size, football, moon); null if unknown",
    "special_comments":   "string โ€” supplementary MoD analyst notes, identification attempts and cross-references; null if unknown",
}

# โ”€โ”€ FORMAT_COBEPS_NOTIFICATIONS_PAN โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# COBEPS Belgium official PAN notifications up to 31 Dec 2023 | ~1,308 rows | FR | NOTIFICATIONS PAN (Belgique) 31_12_2023.csv
FORMAT_COBEPS_NOTIFICATIONS_PAN = {
    # Administrative
    "NO":           "integer โ€” sequential record number",
    "N_Cobeps":     "string โ€” internal COBEPS case reference (NยฐCobeps)",
    # Temporal
    "CommAn":       "integer โ€” year report was received by COBEPS (2006โ€“2023)",
    "Origininfo":   "enum [COBEPS, REUB, MUFON, ovni-ufologie.com, Les ovnis Forum ufologique, Belgisch UFO-Meldpunt, SOS-OVNI, AREPS, Forum/blog internet belge, Forum/blog internet รฉtranger, GERU] โ€” channel through which report was received",
    "ExactMom":     "enum [TRUE, FALSE] โ€” whether the observation time is exact",
    "J_N_C":        "enum [J, N, C] โ€” time of day: J=day (jour), N=night, C=twilight/crepuscular (J/N/C column)",
    "AnObs":        "integer โ€” year of observation",
    "MoisObs":      "integer 1โ€“12 โ€” month of observation",
    "JourObs":      "integer 1โ€“31 โ€” day of month of observation",
    "JourSem":      "integer 1โ€“7 โ€” day of week (1=Mon, 7=Sun)",
    "HeurObs":      "integer 0โ€“24 โ€” hour of observation",
    "DecaGMT":      "integer โ€” UTC offset in hours (1 or 2)",
    "GMT":          "string โ€” UTC time of sighting (HH:MM)",
    "Duree":        "float โ€” duration in minutes; null if unknown",
    "Secondes":     "integer โ€” duration in seconds; null if unknown",
    "Multi":        "enum [0, 1] โ€” multi-event flag: 0=single event, 1=part of multi-event series",
    # Location
    "Lieu":         "string โ€” locality name (Belgium)",
    "Nuts2":        "enum [Hainaut, Liรจge, Namur, Brabant Wallon, Bruxelles, Luxembourg, Vlaams-Brabant, West-Vlaanderen, Oost-Vlaanderen, Antwerpen, Limburg] โ€” Belgian NUTS-2 province",
    "Lat":          "float โ€” latitude in decimal degrees WGS-84; null if unknown",
    "Long":         "float โ€” longitude in decimal degrees WGS-84; null if unknown",
    # Witness
    "NbTem":        "integer โ€” number of witnesses",
    "EnMouv":       "enum [0, 1] โ€” witness in motion: 0=stationary, 1=moving",
    "Source":       "enum [1, 2, 3] โ€” source quality: 1=direct, 2=secondary, 3=press/media",
    # Phenomenology
    "Texte":        "string โ€” free-text case narrative",
    "NbPhe":        "integer โ€” number of phenomena/objects observed",
    "Dessinable":   "enum [0, 1] โ€” phenomenon describable enough to sketch: 0=no, 1=yes",
    "Symetrie":     "string โ€” symmetry code (Fx=frontal, Sx=sagittal; digit=planes of symmetry; e.g. F0, S1, S3)",
    "CouleurUni":   "string โ€” dominant single colour (free-text); null if unknown",
    "CouleurForm":  "string โ€” secondary/form colour (free-text); null if unknown",
    "Bruit":        "enum [0, 1] โ€” sound reported: 0=no, 1=yes",
    "Deplacement":  "enum [Rectiligne ou courbe mais continu, Immobile, Complexe: plusieurs types de mouvements diffรฉrents, Immobile puis en mouvement rectiligne, Changements brutaux de direction et/ou de vitesse, Rectiligne ou en larges courbes, Globalement rectiligne mais saccades et/ou lรฉgรจres variations de vitesse, Complexe et difficilement descriptible, 1 ร  3 changements importants de directions et de vitesses, Sacades et lรฉgรจres variations de vitesse] โ€” movement pattern; null if unknown",
    "AzimutDeb":    "float โ€” starting azimuth in degrees (0โ€“360); null if unknown",
    "ElevDeb":      "float โ€” starting elevation angle in degrees (0โ€“90); null if unknown",
    "AzimutFin":    "float โ€” ending azimuth in degrees; null if unknown",
    "ElevFin":      "float โ€” ending elevation angle in degrees; null if unknown",
    "Photo":        "integer โ€” number of photographs (0 if none); null if unknown",
    "Video":        "integer โ€” number of video recordings (0 if none); null if unknown",
    "Trace":        "enum [0, 1] โ€” physical trace left: 0=no, 1=yes",
    # Classification
    "OrganTrait":   "string โ€” organisation that processed the case (e.g. COBEPS, REUB)",
    "EtapEnq":      "enum [Enquรชte achevรฉe, Clรดturรฉ sans enquรชte, Pas d'information, Evaluation en cours, Enquรชte en cours] โ€” investigation stage",
    "Rapport":      "enum [FI, RDE, CRE] โ€” report type produced; null if none",
    "GEIPAN":       "enum [a, b, c, d, x, ec] โ€” GEIPAN/PAN classification: a=identified, b=probably identified, c=insufficient data, d=unidentified, x=unclassified, ec=under investigation",
    "Hynek":        "enum [LN, DD, RR1, RR2, RR3, RR4, PS] โ€” Hynek classification; null if unknown",
    "TypeIdent":    "enum [Aรฉrostat, Aรฉrodyne, Astronautique, Astronomique, Rentrรฉe atmosphรฉrique, Projection lumineuse, Animaux volants, Eclairage, Psychologique, Projectiles lumineux] โ€” identified explanation category; null if unidentified",
    "AltitPhen":    "enum [0 Sol, 1 Basses couches, 2 Troposphรจre, 3 Stratosphรจre, 4 Mรฉsosphรจre, 5 Thermosphere, 6 Exosphรจre, 8 Spatiale] โ€” altitude layer of the phenomenon; null if unknown",
    "AvisTem":      "enum [0, 1] โ€” witness confidence in own report: 0=uncertain, 1=confident; null if unknown",
}

# โ”€โ”€ FORMAT_COBEPS_COB_2021 โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# COBEPS COB Online historical catalogue (pre-2021) | ~2,111 rows | FR | COB_2021 - COB Online.csv
FORMAT_COBEPS_COB_2021 = {
    "CodeCOB":      "string โ€” unique COB case code",
    "Lien_PDF":     "string โ€” URL to associated PDF report; null if none",
    "Date_Encodage":"string โ€” date the case was encoded",
    # Location
    "Lieu":         "string โ€” locality of the sighting (Belgium)",
    "Province":     "enum [Hainaut, Bruxelles, Liรจge, Namur, West-Vlaanderen, Antwerpen, Vlaams-Brabant, Luxembourg, Brabant Wallon, Oost-Vlaanderen, Limburg] โ€” Belgian province",
    "Long":         "float โ€” longitude in decimal degrees",
    "Lat":          "float โ€” latitude in decimal degrees",
    # Temporal
    "Date_p":       "string โ€” primary (earliest) date of observation",
    "Heure_p":      "string โ€” primary time of observation (HH:MM)",
    "Imp_heure":    "enum [0, 1] โ€” time imprecision: 0=exact, 1=approximate",
    "Decalage":     "enum [00:00, 01:00, 02:00] โ€” UTC offset string",
    "J_N_C":        "enum [J, N, C, D] โ€” time of day: J=day, N=night, C=twilight, D=dawn",
    # Witness
    "RD1":          "enum [0, 1] โ€” data reliability: 0=lower, 1=higher",
    "Nb_temoins":   "string โ€” number of witnesses (integer or >1)",
    "TM":           "enum [0, 1] โ€” multiple-witness: 0=single, 1=multiple",
    "Etat_Ciel":    "enum [Dรฉgagรฉ, Nuageux, Couvert, Dรฉgagรฉ>Couvert] โ€” sky condition; null if unknown",
    # Phenomenology
    "Description":  "string โ€” free-text narrative of the sighting",
    "Mob":          "enum [0, 1] โ€” witness mobile: 0=stationary, 1=moving",
    "Nb_P":         "string โ€” number of objects/phenomena",
    "Apparence":    "enum [Forme, Lumiรจre, Ligne, Pt] โ€” primary phenomenological appearance: Forme=shaped object, Lumiรจre=light, Ligne=line, Pt=point",
    "Formation":    "enum [Triangulaire, Sans, Inconnue, Complexe, Quadrangulaire, Linรฉaire, Circulaire, Paire] โ€” formation shape when multiple objects; null if single",
    "Trajectoire":  "enum [Arrรชtรฉe, Stationnaire, Rectiligne, Complexe, Saccadรฉe, Brisรฉe, Courbe, Cyclique] โ€” movement trajectory; null if unknown",
    "Duree":        "float โ€” duration in minutes; null if unknown",
    "Photos":       "integer โ€” number of photographs taken; null if none",
    "Niveau_source":"enum [1, 2, 3] โ€” source quality: 1=direct/firsthand, 2=secondary, 3=tertiary",
    "Lune_Pres":    "enum [0, 1] โ€” moon above horizon: 0=no, 1=yes",
    # Ratings
    "CR":           "integer 0โ€“5 โ€” credibility rating",
    "ET":           "integer 0โ€“5 โ€” strangeness/exceptionality rating",
    "Hynek":        "enum [LN, DD, RR1, RR2, RR3, RR4] โ€” Hynek classification",
    "Forme":        "enum [OV, SV, SP, TR, CI, RE, CY, PO, TZ] โ€” shape code: OV=oval, SV=sphere, SP=disc/saucer, TR=triangle, CI=cigar, RE=rectangle, CY=cylinder, PO=polygon, TZ=teardrop; null if unknown",
    "PAN":          "enum [A, B, C, D] โ€” GEIPAN/PAN classification: A=identified, B=probably identified, C=insufficient data, D=unidentified",
    "Identification":"string โ€” free-text identified explanation; null if unidentified",
}

# โ”€โ”€ FORMAT_GEP โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# GEP Germany UFO/UAP reports 1972โ€“2023 | ~5,577 rows | DE | UFO-UAP-Falldaten_GEP_1972-2023.csv
FORMAT_GEP = {
    "Fallnummer":                              "string โ€” GEP internal case number",
    "Datum":                                   "string โ€” date of observation (YYYY-MM-DD or free-text)",
    "Land":                                    "string โ€” country of sighting (primarily Deutschland)",
    "Bundesland":                              "string โ€” German federal state (Bundesland)",
    "Sichtungsort":                            "string โ€” city or locality of sighting",
    "lokale_Uhrzeit":                          "string โ€” local time of sighting (HH:MM)",
    "Zeitzone":                                "enum [MESZ, MEZ, ESZ, EZ, ES, WESZ, ADT, WEZ, BST, EDT, EST, CET, CEST] โ€” timezone abbreviation",
    "Tageszeit":                               "enum [abends, nachts, tagsรผber, nachmittags, mittags, morgens, spรคtabends, spรคtnachmittags, vormittags, frรผhabends] โ€” time-of-day descriptor (German: abends=evening, nachts=night, tagsรผber=daytime, morgens=morning, etc.); null if unknown",
    "UTC":                                     "string โ€” UTC datetime of sighting",
    "Erstkontakt":                             "enum [Falldatenbank, E-Mail, Anruf, Kontaktformular, Facebook, Brief, Fragebogen, GEP-Forum, Medien, Sonstiges] โ€” channel of first contact/report submission",
    "Gemeldet":                                "string โ€” date the case was reported",
    "Sachverhalt":                             "string โ€” free-text summary of the sighting (German)",
    "Klassifikation_Hynek":                    "enum [NL, DD, CE I, CE II, CE III, CE IV, CE 4.2, S, Ungenรผgende Daten] โ€” Hynek classification",
    "Klassifikation_Hendry":                   "enum [IFO, NEAR IFO, PROBLEMATIC UFO, GOOD UFO, Ungenรผgende Daten, Hoax, S] โ€” Hendry IFO/UFO classification",
    "Klassifikation_IFO_Verifikationsschluessel": "enum [V1, V2, V3] โ€” IFO verification confidence level (V1=high, V3=low)",
    "Identifikation":                          "string โ€” specific identified object or phenomenon (free-text); null if unidentified",
    "Identifikation_Gruppe":                   "enum [Modell-HeiรŸluftballone / Himmelslaternen, Folienballons / Forschungsballons / LED-Ballons / Heliumballons, Flugzeuge / Hubschrauber / Kondensstreifen, Planeten / Sterne / Mond, Satelliten / Flares / Raumstation, Insekten / Vรถgel / Partikel / Tropfen, Lichteffektgerรคte / Skybeamer / Laser / LIDAR / Scheinwerfer / Beleuchtung, Meteore / Feuerkugeln / Re-entries, Drohnen, Atmosphรคrische Effekte / Wetterphรคnomene, Unbekannt, Handgemachtes, Ungenรผgende Daten] โ€” category group for identified objects; null if unidentified",
}

# โ”€โ”€ FORMAT_UPDB_NICAP โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# UPDB / NICAP NSID database | ~5,885 rows | EN | NSID_DBListingbyDateLinks.csv
FORMAT_UPDB_NICAP = {
    "Date":           "string โ€” date of sighting (YYMMDD format; 000000=unknown)",
    "City":           "string โ€” city or locality",
    "State_or_Country":"string โ€” US state abbreviation or full country name",
    "Cat":            "enum [1, 2, 3, 4, 5, 6, 7, 8, 9, 11] โ€” NICAP/NSID phenomenological category: 1=Nocturnal lights, 2=Daylight discs, 3=Radar cases, 4=Close encounters (CE Iโ€“IV), 5=Photographic cases, 6=Physical traces, 7=Medical effects on witnesses, 8=Animal reactions, 9=Electromagnetic effects, 11=Unclassified/other",
    "BB":             "string โ€” linked Blue Book case ID if cross-referenced; null if none",
    "NC_flag":        "string โ€” NICAP data quality flag (sparse); null if unknown",
    "LC":             "string โ€” location confidence flag (sparse); null if unknown",
    "Description":    "string โ€” free-text case description",
}

# โ”€โ”€ FORMAT_OVNIBASE โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# OVNIBASE French UFO database | ~3,145 rows | FR | ovni-base.csv
FORMAT_OVNIBASE = {
    "Num_cas":          "integer โ€” sequential case number",
    "Depart":           "string โ€” French dรฉpartement number (e.g. 51; Dรฉpart. column)",
    "Ville":            "string โ€” city or locality",
    "Latitude":         "float โ€” latitude in decimal degrees; null if unknown",
    "Longitude":        "float โ€” longitude in decimal degrees; null if unknown",
    "CR_Observation":   "string โ€” free-text narrative of the sighting (CR Observation column)",
    "Typ_Obs":          "enum [Visuel : Eloignรฉ, Visuel : proche, Visuel proche avec personnages, Seulement entitรฉs] โ€” type of observation: distant visual, close visual, close visual with entities, entities only",
    "Date":             "string โ€” date of sighting (DD/MM/YYYY)",
    "Heure":            "string โ€” time of sighting (HH:MM); null if unknown",
    "Duree":            "string โ€” duration (free-text); null if unknown",
    "Nbre_Objets":      "integer โ€” number of objects observed",
    "Type_Objet":       "string โ€” shape/type of object (free-text; ~115 unique values; major: Non-dรฉfini, Boule Lumineuse, Disque, Cigare, Sphรจre, Ovoรฏde, Triangle, Elliptique, Soucoupe avec dรดme, Demi sphรจre, Rectangle, Cylindre); null if unknown",
    "Couleur":          "enum [Rouge, Blanc, Orange, Mรฉtallique (argent,), Jaune, Plusieurs couleurs, Changement couleur, Vert, Gris, Bleu, Noir, Rose] โ€” dominant colour; null if unknown",
    "Brillance":        "enum [Brillant, รฉblouissant, Halo, fluorescent, Faiblement lumineux, Rรฉflรฉchit la lumiรจre, Brillant par intermitence, Non lumineux] โ€” luminosity descriptor; null if unknown",
    "Effet_visuel":     "string โ€” visual effect observed (free-text; e.g. Traรฎnรฉe, faisceau de lumiรจre, hublots, feux clignotants, gerbes d'รฉtincelles, Rayon); null if unknown",
    "Disp_inst":        "enum [o, n] โ€” instantaneous disappearance: o=yes, n=no",
    "Vitesse":          "string โ€” speed descriptor (free-text; ~63 unique values; e.g. Rapide, Lent, Immobile, Extrรชmement rapide, Immobile puis accรฉlรฉration foudroyante); null if unknown",
    "Mouvement_type_vol":"string โ€” movement/flight type (free-text; ~92 unique values; e.g. En ligne droite, Diverses manล“uvres, Au sol puis dรฉcollage, Virage ร  angle droit); null if unknown",
    "Taille":           "string โ€” size descriptor (~195 unique; apparent or estimated; e.g. 2 ร  5 mรจtres (รฉvaluรฉe), Pleine Lune (apparente)); null if unknown",
    "Type_Entite":      "string โ€” entity/occupant type description (~58 unique, sparse); null if none",
    "Nbre_Entite":      "string โ€” number of entities (0 if none); null if unknown",
    "Action_entite":    "string โ€” actions performed by entities (comma-separated, sparse); null if none",
    "Effets_temoin":    "string โ€” physiological/psychological effects on witness (comma-separated; ~115 unique values); null if none",
    "Effet_Physique":   "string โ€” physical effects on environment or vehicles (sparse); null if none",
    "Nbre_Temoins":     "integer โ€” number of witnesses",
    "Enq_Off":          "enum [o, n] โ€” officially investigated: o=yes, n=no",
    "Meteo":            "enum [Beau temps, ciel clair, Nuages รฉpars, Ciel couvert haute altitude, Ciel couvert basse altitude, Pluie continue faible, Pluies รฉparses, Brouillard, Grosse pluie, Orage, Tempรชte, Neige] โ€” weather conditions; null if unknown",
    "Annee":            "integer โ€” year of observation",
    "Atter":            "enum [o, n] โ€” landing reported: o=yes, n=no",
}

# โ”€โ”€ FORMAT_UFOSETI โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# UFOSETI.org Russian/international UAP database | ~3,069 rows | EN+RU | final_ufoseti_dataset.csv
# Note: FORMAT_UFOSETI_RU (above) is the LLM extraction template; this mirrors the raw column schema.
FORMAT_UFOSETI = {
    "obs_number":        "integer โ€” unique UFOSETI observation number",
    "en_description":    "string โ€” English-language description of the event",
    "ru_description":    "string โ€” Russian-language description of the event (ะžะฟะธัะฐะฝะธะต ะฝะฐ ั€ัƒััะบะพะผ ัะทั‹ะบะต)",
    "country":           "string โ€” country of sighting (full name)",
    "ar_code":           "enum [A0R0, A0R1, A0R2, A1R1, A1R2, A1R3, A2R1, A2R2, A2R3, A2R4, A3R1, A3R2] โ€” UFOCAT two-part Anomaly-Reliability code: A0โ€“A3 = anomaly level (0 Not Anomalous โ†’ 3 Anomalous); R0โ€“R4 = source reliability",
    "ar_code_full":      "string โ€” human-readable expansion of ar_code (e.g. Probably Anomalous | Reliable Source/Primary Source)",
    "hynek_vallee_code": "enum [FB1, FB2, FB5, MA1, MA2, AN1, AN2, CE1, CE2, CE3, CE4, CE5] โ€” combined Hynek/Vallรฉe classification; null if unknown",
    "authenticities":    "enum [Unconfirmed, Investigation was made, Under investigation, Insufficient data, Repetition, Investigation suspended] โ€” report authentication status",
    "observation_date":  "string โ€” date and time of observation (DD-MM-YYYY HH:MMZ format, UTC)",
    "report_date":       "string โ€” date and time the report was filed",
    "shape":             "enum [Round, Circular, Spherical, Triangular, Star-shaped, Cigar-shaped, Oval, Hemisphere, Polygonal] โ€” shape of the observed object; null if unknown",
    "observer_direction":"enum [No direction, East, West, South-West, North-West, South, South-East, North, North-East] โ€” cardinal direction the observer was facing",
    "source":            "string โ€” original source of the report (free-text URL or organisation name); null if unknown",
    "ufoseti_report_date":"string โ€” date/time the case was entered into the UFOSETI database (UTC)",
    "url":               "string โ€” URL to the case page on ufoseti.org",
}

# โ”€โ”€ FORMAT_UAP_SIGHTINGS_GITHUB โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# MiChaelinzo/UAP_SIGTHINGS multi-source sighting JSON | ~1,000 rows (sample) | EN | getData2.json
FORMAT_UAP_SIGHTINGS_GITHUB = {
    "id":          "string โ€” unique sighting ID",
    "city":        "string โ€” city of sighting",
    "country":     "string โ€” ISO 3166-1 alpha-2 country code (primarily US)",
    "date":        "string โ€” ISO 8601 datetime of sighting",
    "date_detail": "string โ€” human-readable date/time string",
    "description": "string โ€” free-text witness narrative",
    "district":    "string โ€” state, province or region (uppercase)",
    "latitude":    "string โ€” latitude in decimal degrees (sparse); null if unknown",
    "longitude":   "string โ€” longitude in decimal degrees (sparse); null if unknown",
    "other":       "string โ€” additional notes or source-specific data; null if unknown",
    "source":      "enum [NUFORC, UFODNA, NICAP] โ€” originating database",
    "source_id":   "string โ€” case ID within the originating source database",
    "water":       "string โ€” water body reference (sparse); null if unknown",
    "word_count":  "integer โ€” word count of the description field",
}

# โ”€โ”€ FORMAT_WEINSTEIN_PILOT_CATALOG โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# Dominique Weinstein Pilot Catalog โ€” aircraft crew UAP encounters 1916โ€“1999 | ~1,300 rows | EN | Weinstein UFO Catalog 2001.xlsx
FORMAT_WEINSTEIN_PILOT_CATALOG = {
    "W_num":                   "integer โ€” sequential Weinstein case number (W# column)",
    "DATE":                    "string โ€” date in YY.MM.DD format (e.g. 44.06.00 = June 1944)",
    "TIME":                    "string โ€” local time (HH:MM); null if unknown",
    "ZT_LT":                   "enum [ZT, LT] โ€” time zone indicator: ZT=Zulu/UTC, LT=local time; null if unknown",
    "COUNTRY":                 "string โ€” country or ocean/region (full name)",
    "LOCATION":                "string โ€” specific location, airway or coordinates",
    "LAT_LNG":                 "string โ€” coordinates (sparse, free-text); null if unknown",
    "TYPE_OF_PLANE_AND_WITNESSES": "string โ€” aircraft type and witness description",
    "WHO":                     "string โ€” witness role (e.g. pilot, crew, passengers)",
    "UFO_DESCRIPTION":         "string โ€” free-text description of the UAP",
    "Radar":                   "enum [AR, GR, RO, NR, GR AR, GRAR, GRARO] โ€” radar detection: AR=airborne radar, GR=ground radar, RO=radar only, NR=no radar; null if unknown",
    "G":                       "string โ€” ground witness also saw the object (G if confirmed); null otherwise",
    "X":                       "string โ€” multiple independent witnesses (X if present); null otherwise",
    "E":                       "string โ€” electromagnetic/physical effect on aircraft (E if present); null otherwise",
    "SOURCES":                 "string โ€” source references (coded bibliography)",
}

# โ”€โ”€ FORMAT_PETROWITSCH_LATAM โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# Petrowitsch Catalogue โ€” Chilean & Latin American UAP cases | ~3,529+ rows | ES | Petrowitsch_Casos OVNI Chilenos_2024-01-29.xlsx + Petrowitsch_Casos Latino_americanos_2024-01-29.xlsx
FORMAT_PETROWITSCH_LATAM = {
    "DIA":                  "integer โ€” day of observation; null if unknown",
    "MES":                  "integer โ€” month of observation; null if unknown",
    "ANNO":                 "integer โ€” year of observation (Aร‘O column); null if unknown",
    "HORA":                 "string โ€” local time (HH hs. format, sparse); null if unknown",
    "H":                    "integer โ€” duration hours component; null if unknown",
    "M":                    "integer โ€” duration minutes component; null if unknown",
    "S":                    "integer โ€” duration seconds component; null if unknown",
    "LUGAR":                "string โ€” city or locality name (free-text)",
    "REGION":               "string โ€” Chilean administrative region (Roman numeral, e.g. X, RM); null if unknown",
    "COORDENADAS":          "string โ€” approximate coordinates (free-text, e.g. 41ยบ45,73ยบ44); null if unknown",
    "J_V":                  "string โ€” Vallรฉe catalogue reference code (e.g. IB); null if unknown",
    "N_objetos":            "integer โ€” number of objects observed; null if unknown",
    "Descripcion":          "string โ€” free-text description of the phenomenon (Descripciรณn column)",
    "Velocidad":            "string โ€” speed descriptor (free-text, sparse); null if unknown",
    "DIRECC":               "string โ€” direction of travel (free-text, sparse); null if unknown",
    "OTRAS_CARACTERISTICAS":"string โ€” additional observed characteristics; null if unknown",
    "FOTO_FILM":            "string โ€” photo/film indicators (M=Movie, F=photo codes); null if none",
    "TESTIGOS_N":           "integer โ€” number of witnesses; null if unknown",
    "Ocupacion":            "string โ€” witness occupation (sparse; Ocupaciรณn column); null if unknown",
    "POSIBLE_EXPLICACION":  "string โ€” possible explanation or identification; null if unknown",
    "FUENTES":              "string โ€” bibliographic source references (coded)",
}

# โ”€โ”€ FORMAT_UFOCAT โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# UFOCAT 2023 โ€” J. Allen Hynek Center for UFO Studies / Sun River Research Institute | ~146,000 rows | EN | ufocat2023.accdb + UFOCAT 2023.xlsx
FORMAT_UFOCAT = {
    # โ”€โ”€ Record linkage โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "URN":       "integer โ€” UFOCAT Record Number: permanent unique identifier for every record (primary key)",
    "PRN":       "integer โ€” Primary Record Number: URN of the most authoritative record for this event; group records by PRN to deduplicate event counts",
    "X2":        "enum [0, 1, 2, 3] โ€” primacy within an event block: 0=primary (use for counting), 1=independent secondary investigation, 2=references primary source, 3=references a secondary source",
    "IRN":       "integer โ€” Indirect Record Number: URN most closely associated with the source cited by this record's author; null for primary entries",
    "X1":        "enum [=, -] โ€” confidence of PRNโ€“IRN match: ==clear match, -=possible match; null=primary entry with no indirect source",

    # โ”€โ”€ Bibliographic provenance โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "AUTHOR":    "string โ€” surname (and first initial) of the investigator or editor responsible for this record; may be organisation/journal name if author unknown",
    "LEVEL":     "enum [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] โ€” source type/accessibility: 0โ€“2=confidential investigation files; 3=preferred open investigation file; 4=newspaper/magazine; 5=UFO periodical; 6=personal files; 7=first-edition book; 8=revised/paperback edition; 9=list-only no narrative; null=non-event record",
    "SOURCE":    "string โ€” 12-character mnemonic code for the direct source (investigation file, periodical, or book); lookup in SOURCES auxiliary table",
    "PAGEVOL":   "string โ€” position within the direct source (page number, serial number, or date-based code, depending on LEVEL)",
    "ISOURCE":   "string โ€” 12-character mnemonic for the indirect (cited) source; special punctuation codes: *=firsthand written investigation, +=standardised witness form, apostrophe=scientific journal account, .=witness letter/interview, ,=newspaper account",
    "IPAGEVOL":  "string โ€” position within the indirect source; same scheme as PAGEVOL",

    # โ”€โ”€ Date / Time โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "YEAR":      "string โ€” year of the event (4 chars): exact year e.g. 1975; trailing .=decade only; E=early, M=middle, L=late in decade",
    "MO":        "string โ€” month (01โ€“12); blank first col + season code: E=Janโ€“Apr, F=Octโ€“Dec, L=Sepโ€“Dec, M=Mayโ€“Aug, S=Aprโ€“Jun, W=Janโ€“Mar",
    "DAY":       "string โ€” day (01โ€“31); blank first col + E=early, M=middle, L=late in month",
    "TIME":      "string โ€” local event onset time (HHMM 24-hour); or descriptor: Day, Night, Morn, After, Even, Dawn, Noon, Dusk, MidD, MidN, Pdawn; - in minute sub-field=early, +=late",
    "TZ":        "enum [*, +, ., -, ', =] โ€” date/time accuracy: *=GMT/UTC, +=daylight saving, .=confirmed local standard, -=date approximate, apostrophe=publication date, ==date believed erroneous; null=unspecified",
    "TZONE":     "float โ€” timezone code (hours behind Greenwich noon): 4=Pacific Standard, 5=Mountain Standard, 6=Central Standard, 7=Eastern Standard; fractional values for non-integer UTC offsets",

    # โ”€โ”€ Location โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "LOCATION":  "string โ€” place-name of the sighting (city/town, up to 30 chars); formatted PLACENAME DIRECTION DISTANCEunits (e.g. LOUISVILLE SW 10M); = separates two places meaning between",
    "LFLG":      "enum [-, +, *, =] โ€” location accuracy: -=approximate, +=specific witness location, *=specific phenomenon location, ==place-name believed erroneous; null=standard",
    "REGION":    "enum [A, AA, AF, AS, AU, CA, CN, EU, I, M, ME, NA, P, SA, US, W, XX, RE] โ€” world region: A=Atlantic, AA=Antarctica, AF=Africa, AS=Asia, AU=Australia+Oceania, CA=Central America, CN=Canada, EU=Europe, I=Indian Ocean, M=Mediterranean, ME=Middle East, NA=North America unspecified, P=Pacific, SA=South America, US=United States, W=World unspecified, XX=Outer Space, RE=Roman Empire",
    "STATE":     "string โ€” state or country code (up to 3 chars): US states use 2-letter USPS abbreviations; countries use 1โ€“3 letter codes from WORLD auxiliary table",
    "COUNTY":    "string โ€” county or province (up to 12 chars); ~3,150 US counties; non-US uses province",
    "LONGITUDE": "string โ€” longitude (up to 8 chars); default English system: West positive; decimal point in col 5=decimal degrees, apostrophe=degrees+minutes; see X3",
    "LATITUDE":  "string โ€” latitude (up to 8 chars); same system as LONGITUDE; two-letter prefix=British National Grid",
    "X3":        "enum [M, Q, =] โ€” coordinate system: null=English (360ยฐ, Greenwich), M=French metric (400ยฐ, Notre-Dame Paris), Q=English but questionable, ==known error",
    "TER":       "string โ€” terrain/landmark type at sighting location (~100 values; e.g. Airfield, Airport, City, Electric, Farm, Forest, Highway, Lake, Military, Missile, Mountain, Nuclear, Ocean, River, Shore, Warplane, Warship, Woods); see codebook Table 5",

    # โ”€โ”€ Witness โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "WITNESSES": "string โ€” number of witnesses (right-justified); -=about, +=at least; C=hundred, K=thousand; letter codes: F=few, G=group, M=many, N=numerous, S=several",
    "AGE":       "string โ€” age of principal witness in years (2 chars); or group composition: first char=number of families, second=A/C/T/S/M/X/Y/W adult-type code",
    "SEX":       "enum [M, F, C, X] โ€” witness sex/group: M=all male, F=all female, C=couple, X=mixed; null=unknown",
    "MIS":       "enum [#, +, =] โ€” #=military witnesses, +=police witnesses, ==witness name incorrectly copied; null=none",
    "NAMES":     "string โ€” principal witness surname(s); additional witnesses separated by =; confidential=initials only; organisation in parentheses; investigator name in reverse parentheses for confidential cases",
    "VFLG":      "enum [(, , ,', ., #] โ€” vehicle flag: (=orbiting spacecraft, apostrophe=aircraft, ,=boat, .=automobile/motorcycle, #=airborne+ground witnesses in contact; null=none",

    # โ”€โ”€ Phenomenology โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "HYNEK":     "enum [NL, ND, NO, DD, DL, DO, RV, RR, CE1, CE2, CE3, CE4, AM, BH, CM, CR, MIB, TC] โ€” Hynek extended classification: NL=Nocturnal Light, ND=Nocturnal Disc, NO=Nocturnal Object, DD=Daylight Disc, DL=Daylight Light, DO=Daylight Object, RV=Radar-Visual, RR=Radar only, CE1โ€“CE4=Close Encounters, AM=Animal Mutilation, BH=Black Helicopter, CM=Cattle Mutilation, CR=Crash Retrieval, MIB=Men in Black, TC=Physical Trace only",
    "VALLEE":    "enum [AN1, AN2, AN3, AN4, AN5, FB1, FB2, FB3, FB4, FB5, CE1, CE2, CE3, CE4, CE5, MA1, MA2, MA3, MA4, MA5] โ€” Vallรฉe classification: AN=Anomaly, FB=Flyby, CE=Close Encounter, MA=Manoeuvre; sub-type 1โ€“5 indicates increasing physical/experiential involvement",
    "SVP":       "string โ€” SVP Credibility Rating (3 digits): S=Source Reliability (0โ€“4), V=Site Visit quality (0โ€“4), P=Possible Explanations resisted (0โ€“4); e.g. 342",
    "TYPE":      "string โ€” UFOCAT type code: first digit 0โ€“9=strangeness scale (0=non-UFO, 1=stationary, 2=moving, 3=single discontinuity, 4=multiple discontinuities, 5=encounter without landing, 6=landed, 7=occupants outside, 8=intelligent communication, 9=lasting physical effects); followed by letter sub-type codes (E=EM effect, T=physical trace, W=independent witnesses, etc.)",
    "EXPL":      "enum [=, -, +, *] โ€” explainability flag: ==certainly explained, -=probably/possibly explained, null=no explanation offered, +=probably unconventional, *=virtually certain unconventional",
    "EXPLAN":    "enum [Aircraft, Animals, AnomProp, Aurora, Balloon, Birds, Blimp, Bolide, Cloud, Coincidenc, Comet, Debris, EM, FalseTarge, Fireball, Flare, Hallucinat, Helicopter, Hoax, Inversion, Junk, Jupiter, Lensflare, Light, Lights, Malfunct, Mars, Meteor, Mirage, Missile, Moon, Natural, Op-error, Planet, Prank, Psych, Quake, RadarChaff, Re-entry, Reflection, Rocket, Rumor, Satelite, Saturn, SpiderGoss, Star, Trawlers, Unreliable, Venus, Weather, Wind] โ€” conventional explanation as given by the direct source; null if unexplained",
    "OBJS":      "string โ€” number of UFO objects (right-justified; -=about, +=at least; C=hundred; letter codes F/G/M/N/S; 0=no object; for trace-only cases=number of trace marks)",
    "DUR":       "string โ€” duration of observation (normally minutes; +=at least; decimal prefix=seconds; H suffix=hours; D=days; B=brief, VB=very brief, .F=few seconds, .S=several seconds, SH=several hours)",
    "SIZE":      "integer โ€” estimated physical size as base-2 log of largest dimension in feet (e.g. 5=32 ft/10 m, 10=~1,000 ft/300 m); negative values possible; null if unknown",
    "ANGLSIZ":   "string โ€” apparent (angular) size: .=point source, .0=non-point, .1=โ‰ˆsun/moon, .2=twice sun/moon; Poher qualitative codes: (A=immense, (B=quarter-coin at arm's length, (C=orange, (D=melon/plate, (E=40 cm, (F=1 m, (G=2 m, (H=commercial aircraft",
    "DIST":      "integer โ€” closest approach distance as base-2 log in feet (e.g. 8=256 ft/78 m; -1=witness touched UFO); null if unknown",
    "COLOR":     "enum [Aluminum, Amber, Beige, Black, Blue, BluGray, BluGreen, Bluish, Bright, Bronze, Brown, Changed, Chrome, Clear, Copper, Dark, Fire, Fluoresc, Glowing, Gold, Gray, Green, Luminous, Metallic, Multi, Orange, Pearl, Phosphor, Pink, Red, Rust, Shiny, Silver, Tan, Transpar, Violet, White, Yellow, Zinc] โ€” principal colour; Multi=multi-coloured; Changed=colour changed during sighting; null if unknown",
    "SHAPE":     "enum [Aircraft, Arrow, Badge, Ball, Banana, Bat, Beam, Beehive, Blimp, Bottle, Bowl, BowTie, Box, Bulb, Bullet, Capsule, Cigar, Circle, Circular, Cloud, Cone, Copter, Crescent, Cross, Crown, Cube, Cylinder, Delta, Diamond, Dirigibl, Disc, DomeDisc, Dumbell, Ellipse, Elliptic, Elongate, FanBlade, Fish, Flare, Flash, Football, Fuselage, Globe, Hemisphr, L-Shape, Lampshad, Lens, Light, Lights, Linear, Lozenge, MantaRay, Missile, Object, Oblong, Odd, Orb, Oval, Ovoid, Pear, Polygon, Polymorf, Pyramid, Rectangl, Ring, Rocket, Round, Saturn, Schliere, Sparks, Sphere, Spindle, Square, Star, T-Shape, Teardrop, Top, Torpedo, Triangle, Tube, V-Shape, Walnut, Wedge, Wing, X-Shape, Y-Shape] โ€” principal shape; Polymorf=shape-changing; V-Shape=boomerang; Polygon=all multi-sided; null if unknown",
    "SOUND":     "string โ€” principal sound reported (e.g. NoSound, Noise, Humming, Buzzing, Whistle, Roar, Rumbling, Hissing, Jet, Droning, Whirring; NoSound=explicitly silent); null if unknown",
    "WEA":       "enum [Calm, Clear, Clouds, Cloudy, Fog, Ice, Muddy, Overcast, Partial, Rain, Snow, Storm, Thunder, Undrcast] โ€” weather conditions; null if not recorded",

    # โ”€โ”€ Entity fields (added 2002) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "Ufonaut":   "string โ€” classification of UFO humanoid/entity type reported; null if no entity",
    "Height":    "float โ€” reported height of the Ufonaut/entity in feet; null if none or unknown",
    "Uniform":   "string โ€” uniform or clothing description of the Ufonaut/entity; null if none or unknown",

    # โ”€โ”€ Computed temporal fields โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "AST":         "float โ€” Absolute Sidereal Time (4-digit integer rounded to nearest hour) calibrated to Puy-de-Dรดme, France (Epsilon Eridani reference); null if uncomputable",
    "LST":         "float โ€” Local Sidereal Time at the specific sighting location; null if uncomputable",
    "USER_DEFINED":"string โ€” user-definable field; currently stores LST prefixed with RA for sidereal-time searches",

    # โ”€โ”€ Free-text narrative โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    "NOTES":     "string โ€” free-text narrative describing key aspects of the report (up to 200 chars; added 1998; sparse); null if empty",
}

# โ”€โ”€ FORMAT_CISU_CISUCAT โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# CISU Italian UAP catalogue (CISUCAT) | ~50,000+ rows estimated | IT | 2022-08-31 CISUCAT.xls + annual revisions
# Note: column schema requires XLS parsing; fields below are derived from CISU publications.
FORMAT_CISU_CISUCAT = {
    "case_number":      "string โ€” CISU internal case number (exact column name TBC from XLS)",
    "date":             "string โ€” date of observation",
    "time":             "string โ€” local time of observation; null if unknown",
    "location":         "string โ€” city or locality of sighting (Italy)",
    "province":         "string โ€” Italian province abbreviation",
    "country":          "string โ€” country (primarily Italy)",
    "shape":            "string โ€” shape of the observed object (free-text); null if unknown",
    "duration":         "string โ€” observed duration (free-text); null if unknown",
    "num_witnesses":    "integer โ€” number of witnesses; null if unknown",
    "witness_type":     "string โ€” type of witness (e.g. civilian, military, pilot); null if unknown",
    "hynek":            "string โ€” Hynek classification code; null if unknown",
    "source":           "string โ€” source of the report (bibliography or organisation)",
    "description":      "string โ€” free-text narrative of the sighting (Italian)",
}

# โ”€โ”€ FORMAT_CUFOC_1977_ITALY_FRANCE โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# CUFOC 1977 Italy-France wave study (Bourdon+Delaval digitisation) | partial rows | FR/IT | ita_fr77_delaval.xlsx
# Note: column schema requires XLSX parsing; fields below are derived from Bourdon/Delaval methodology.
FORMAT_CUFOC_1977_ITALY_FRANCE = {
    "case_id":      "string โ€” case identifier from the CUFOC/CUN coding schema",
    "date":         "string โ€” date of observation (1977 wave)",
    "time":         "string โ€” local time of observation; null if unknown",
    "country":      "enum [France, Italy] โ€” country of the sighting",
    "location":     "string โ€” city or locality (French or Italian)",
    "hynek":        "string โ€” Hynek classification; null if unknown",
    "ifo_ufo":      "string โ€” IFO/UFO determination (identified vs. unidentified); null if unknown",
    "shape":        "string โ€” shape of observed object; null if unknown",
    "source":       "string โ€” source publication or investigation reference (Bourdon/Delaval)",
    "description":  "string โ€” free-text narrative of the sighting (French or Italian)",
}

# โ”€โ”€ FORMAT_UAPCHECK โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# UAPCHECK.com international data-exchange API registry | 22 organisations | EN | api.sql
# Note: this is an organisational registry, NOT a sighting catalogue.
FORMAT_UAPCHECK = {
    "id_api":          "integer โ€” auto-increment organisation ID",
    "api_org_key":     "string โ€” unique organisation key (format UAP-XXXXXX)",
    "api_org_name":    "string โ€” human-readable organisation name (e.g. MUFON (USA), GEP (Germany), COBEPS (Belgium))",
    "api_org_url":     "string โ€” website or API endpoint URL of the organisation",
    "api_org_lang":    "string โ€” ISO 639-1 language code of the organisation",
    "api_org_latitude":"float โ€” latitude of organisation headquarters",
    "api_org_longitude":"float โ€” longitude of organisation headquarters",
    "api_options":     "string โ€” JSON structure with API configuration options; null if none",
}