@codai/axiom-mcp 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/spec/tools.json CHANGED
@@ -68,7 +68,7 @@
68
68
  },
69
69
  {
70
70
  "name": "axiom_plan_compile",
71
- "description": "Compile a Plan into a content-addressed ManifestBundle (sorted artifacts, sha256 digests, in-toto planDigest). `store: cas` writes blobs under <root>/.axiom/cas instead of inlining them. When a root is given the bundle is stored under <root>/.axiom/manifests/<hex>.json so later tools can reference it by digest.",
71
+ "description": "Compile a Plan into a content-addressed ManifestBundle (sorted artifacts, sha256 digests, in-toto planDigest). `store: cas` writes blobs under <root>/.axiom/cas instead of inlining them. When a root is given the bundle is stored under <root>/.axiom/manifests/<hex>.json so later tools can reference it by digest. `template` sources are rendered by the built-in `web` emitter (see `axiom emitters`); its version is recorded in toolchain.emitters.",
72
72
  "riskClass": "ACT",
73
73
  "annotations": {
74
74
  "readOnlyHint": false,
@@ -186,7 +186,8 @@
186
186
  "inline",
187
187
  "template",
188
188
  "cas",
189
- "ref"
189
+ "ref",
190
+ "patch"
190
191
  ]
191
192
  }
192
193
  },
@@ -255,6 +256,43 @@
255
256
  "emitters"
256
257
  ],
257
258
  "additionalProperties": false
259
+ },
260
+ "counter": {
261
+ "type": "integer",
262
+ "minimum": 0,
263
+ "maximum": 9007199254740991
264
+ },
265
+ "preImage": {
266
+ "type": "array",
267
+ "items": {
268
+ "type": "object",
269
+ "properties": {
270
+ "path": {
271
+ "type": "string",
272
+ "minLength": 1,
273
+ "maxLength": 1024,
274
+ "description": "Relative POSIX path, NFC, no reserved names"
275
+ },
276
+ "sha256": {
277
+ "anyOf": [
278
+ {
279
+ "type": "string",
280
+ "pattern": "^[a-f0-9]{64}$",
281
+ "description": "Lowercase hex-encoded sha256"
282
+ },
283
+ {
284
+ "type": "string",
285
+ "const": "absent"
286
+ }
287
+ ]
288
+ }
289
+ },
290
+ "required": [
291
+ "path",
292
+ "sha256"
293
+ ],
294
+ "additionalProperties": false
295
+ }
258
296
  }
259
297
  },
260
298
  "required": [
@@ -374,6 +412,60 @@
374
412
  ],
375
413
  "additionalProperties": false
376
414
  },
415
+ "signatures": {
416
+ "type": "array",
417
+ "items": {
418
+ "type": "object",
419
+ "properties": {
420
+ "payloadType": {
421
+ "anyOf": [
422
+ {
423
+ "type": "string",
424
+ "const": "application/vnd.axiom.manifest+json"
425
+ },
426
+ {
427
+ "type": "string",
428
+ "const": "application/vnd.axiom.manifest-bound+json"
429
+ }
430
+ ]
431
+ },
432
+ "payload": {
433
+ "type": "string",
434
+ "format": "base64",
435
+ "contentEncoding": "base64",
436
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"
437
+ },
438
+ "signatures": {
439
+ "minItems": 1,
440
+ "type": "array",
441
+ "items": {
442
+ "type": "object",
443
+ "properties": {
444
+ "keyid": {
445
+ "type": "string"
446
+ },
447
+ "sig": {
448
+ "type": "string",
449
+ "format": "base64",
450
+ "contentEncoding": "base64",
451
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"
452
+ }
453
+ },
454
+ "required": [
455
+ "sig"
456
+ ],
457
+ "additionalProperties": false
458
+ }
459
+ }
460
+ },
461
+ "required": [
462
+ "payloadType",
463
+ "payload",
464
+ "signatures"
465
+ ],
466
+ "additionalProperties": false
467
+ }
468
+ },
377
469
  "blobs": {
378
470
  "default": {},
379
471
  "type": "object",
@@ -446,7 +538,7 @@
446
538
  },
447
539
  {
448
540
  "name": "axiom_manifest_verify",
449
- "description": "Structural and content-address verification: schema, recomputed manifestDigest, every inline blob hashes to its key, attestation subject matches. Never writes.",
541
+ "description": "Structural and content-address verification: schema, recomputed manifestDigest, every inline blob hashes to its key, attestation subject matches. When a root with .axiom/trust/keys.json is available, detached DSSE signatures are verified and the trusted keyids are reported under `signatures`. Never writes.",
450
542
  "riskClass": "READ",
451
543
  "annotations": {
452
544
  "readOnlyHint": true,
@@ -465,6 +557,10 @@
465
557
  },
466
558
  "additionalProperties": {},
467
559
  "description": "ManifestBundle"
560
+ },
561
+ "root": {
562
+ "description": "Absolute repository root; must equal or lie inside an allowlisted --root",
563
+ "type": "string"
468
564
  }
469
565
  },
470
566
  "required": [
@@ -537,13 +633,30 @@
537
633
  "ERR_PROVIDER_FAILED",
538
634
  "ERR_GUARD_TIMEOUT",
539
635
  "ERR_GUARD_OUTPUT",
636
+ "ERR_FACT_DISABLED",
637
+ "ERR_SIGNATURE_MISSING",
638
+ "ERR_SIGNATURE_INVALID",
639
+ "ERR_TRUST_STATE_CORRUPT",
640
+ "ERR_ROLLBACK",
641
+ "ERR_EMITTER_UNKNOWN",
642
+ "ERR_TEMPLATE_UNKNOWN",
643
+ "ERR_TEMPLATE_PARAMS",
644
+ "ERR_PATCH_FORMAT",
645
+ "ERR_PATCH_PREIMAGE",
646
+ "ERR_PATCH_NO_MATCH",
540
647
  "ERR_GIT_NOT_FOUND",
541
648
  "ERR_GIT_NOT_REPO",
542
649
  "ERR_GIT_DIRTY",
543
650
  "ERR_GIT_BRANCH_EXISTS",
544
651
  "ERR_GIT_BRANCH_INVALID",
545
652
  "ERR_GIT_FAILED",
653
+ "ERR_TASK_NOT_FOUND",
654
+ "ERR_TASK_CANCELLED",
655
+ "ERR_PLAN_SESSION_STATE",
546
656
  "ERR_REF_OFFLINE",
657
+ "ERR_NET_DISABLED",
658
+ "ERR_NET_DENIED",
659
+ "ERR_NET_FAILED",
547
660
  "ERR_NOT_CANONICAL",
548
661
  "ERR_UNSUPPORTED_OP",
549
662
  "ERR_INTERNAL"
@@ -561,6 +674,54 @@
561
674
  "message"
562
675
  ]
563
676
  }
677
+ },
678
+ "signatures": {
679
+ "type": "object",
680
+ "properties": {
681
+ "trustFile": {
682
+ "type": "string"
683
+ },
684
+ "keyids": {
685
+ "type": "array",
686
+ "items": {
687
+ "type": "string"
688
+ }
689
+ },
690
+ "findings": {
691
+ "type": "array",
692
+ "items": {
693
+ "type": "object",
694
+ "properties": {
695
+ "id": {
696
+ "type": "string"
697
+ },
698
+ "message": {
699
+ "type": "string"
700
+ }
701
+ },
702
+ "required": [
703
+ "id",
704
+ "message"
705
+ ]
706
+ }
707
+ },
708
+ "ok": {
709
+ "type": "boolean"
710
+ },
711
+ "code": {
712
+ "type": "string",
713
+ "enum": [
714
+ "ERR_SIGNATURE_MISSING",
715
+ "ERR_SIGNATURE_INVALID"
716
+ ]
717
+ }
718
+ },
719
+ "required": [
720
+ "trustFile",
721
+ "keyids",
722
+ "findings",
723
+ "ok"
724
+ ]
564
725
  }
565
726
  },
566
727
  "required": [
@@ -635,105 +796,1292 @@
635
796
  "error"
636
797
  ]
637
798
  },
638
- "findings": {
799
+ "findings": {
800
+ "type": "array",
801
+ "items": {
802
+ "type": "object",
803
+ "properties": {
804
+ "id": {
805
+ "type": "string"
806
+ },
807
+ "severity": {
808
+ "type": "string",
809
+ "enum": [
810
+ "error",
811
+ "warn",
812
+ "info"
813
+ ]
814
+ },
815
+ "predicate": {
816
+ "type": "string"
817
+ },
818
+ "message": {
819
+ "type": "string"
820
+ },
821
+ "path": {
822
+ "type": "string",
823
+ "minLength": 1,
824
+ "maxLength": 1024,
825
+ "description": "Relative POSIX path, NFC, no reserved names"
826
+ },
827
+ "facts": {
828
+ "default": {},
829
+ "type": "object",
830
+ "propertyNames": {
831
+ "type": "string"
832
+ },
833
+ "additionalProperties": {
834
+ "$ref": "#/$defs/__schema0"
835
+ }
836
+ }
837
+ },
838
+ "required": [
839
+ "id",
840
+ "severity",
841
+ "predicate",
842
+ "message"
843
+ ],
844
+ "additionalProperties": false
845
+ }
846
+ },
847
+ "factsDigest": {
848
+ "type": "string",
849
+ "pattern": "^sha256:[a-f0-9]{64}$",
850
+ "description": "sha256:<64 lowercase hex>"
851
+ },
852
+ "durationMs": {
853
+ "type": "integer",
854
+ "minimum": 0,
855
+ "maximum": 9007199254740991
856
+ },
857
+ "providers": {
858
+ "type": "array",
859
+ "items": {
860
+ "type": "object",
861
+ "properties": {
862
+ "name": {
863
+ "type": "string"
864
+ },
865
+ "status": {
866
+ "type": "string",
867
+ "enum": [
868
+ "ok",
869
+ "skipped",
870
+ "error"
871
+ ]
872
+ },
873
+ "ms": {
874
+ "type": "integer",
875
+ "minimum": 0,
876
+ "maximum": 9007199254740991
877
+ }
878
+ },
879
+ "required": [
880
+ "name",
881
+ "status",
882
+ "ms"
883
+ ],
884
+ "additionalProperties": false
885
+ }
886
+ },
887
+ "preImage": {
888
+ "type": "string",
889
+ "enum": [
890
+ "verified",
891
+ "drifted",
892
+ "unverified"
893
+ ]
894
+ }
895
+ },
896
+ "required": [
897
+ "apiVersion",
898
+ "kind",
899
+ "manifestDigest",
900
+ "profile",
901
+ "verdict",
902
+ "findings",
903
+ "factsDigest",
904
+ "durationMs",
905
+ "providers"
906
+ ],
907
+ "additionalProperties": false,
908
+ "$defs": {
909
+ "__schema0": {
910
+ "anyOf": [
911
+ {
912
+ "type": "string"
913
+ },
914
+ {
915
+ "type": "number"
916
+ },
917
+ {
918
+ "type": "boolean"
919
+ },
920
+ {
921
+ "type": "null"
922
+ },
923
+ {
924
+ "type": "array",
925
+ "items": {
926
+ "$ref": "#/$defs/__schema0"
927
+ }
928
+ },
929
+ {
930
+ "type": "object",
931
+ "propertyNames": {
932
+ "type": "string"
933
+ },
934
+ "additionalProperties": {
935
+ "$ref": "#/$defs/__schema0"
936
+ }
937
+ }
938
+ ]
939
+ }
940
+ }
941
+ }
942
+ },
943
+ {
944
+ "name": "axiom_check_start",
945
+ "description": "Same evaluation as axiom_check, but returned immediately as a task so long `guard.external` suites (up to 15 min per guard) outlive the client's per-call timeout. Poll axiom_task_get with the returned taskId every pollIntervalMs until status is completed|failed|cancelled; the CheckReport is in `result`. Finished tasks are pollable for ttlMs, then forgotten. Tasks live in this server process only (D-24 — tool-level tasks, not the io.modelcontextprotocol/tasks wire extension).",
946
+ "riskClass": "READ",
947
+ "annotations": {
948
+ "readOnlyHint": true,
949
+ "destructiveHint": false,
950
+ "idempotentHint": true,
951
+ "openWorldHint": false
952
+ },
953
+ "inputSchema": {
954
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
955
+ "type": "object",
956
+ "properties": {
957
+ "bundle": {
958
+ "type": "object",
959
+ "propertyNames": {
960
+ "type": "string"
961
+ },
962
+ "additionalProperties": {},
963
+ "description": "ManifestBundle"
964
+ },
965
+ "profile": {
966
+ "description": "Profile name (builtin default|strict|permissive, or <root>/.axiom/profiles/<name>.json)",
967
+ "type": "string"
968
+ },
969
+ "root": {
970
+ "description": "Absolute repository root; must equal or lie inside an allowlisted --root",
971
+ "type": "string"
972
+ }
973
+ },
974
+ "required": [
975
+ "bundle"
976
+ ]
977
+ },
978
+ "outputSchema": {
979
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
980
+ "type": "object",
981
+ "properties": {
982
+ "taskId": {
983
+ "type": "string"
984
+ },
985
+ "tool": {
986
+ "type": "string"
987
+ },
988
+ "status": {
989
+ "type": "string",
990
+ "enum": [
991
+ "working",
992
+ "completed",
993
+ "failed",
994
+ "cancelled"
995
+ ]
996
+ },
997
+ "pollIntervalMs": {
998
+ "type": "integer",
999
+ "exclusiveMinimum": 0,
1000
+ "maximum": 9007199254740991
1001
+ },
1002
+ "ttlMs": {
1003
+ "type": "integer",
1004
+ "exclusiveMinimum": 0,
1005
+ "maximum": 9007199254740991
1006
+ },
1007
+ "elapsedMs": {
1008
+ "type": "integer",
1009
+ "minimum": 0,
1010
+ "maximum": 9007199254740991
1011
+ }
1012
+ },
1013
+ "required": [
1014
+ "taskId",
1015
+ "tool",
1016
+ "status",
1017
+ "pollIntervalMs",
1018
+ "ttlMs",
1019
+ "elapsedMs"
1020
+ ]
1021
+ }
1022
+ },
1023
+ {
1024
+ "name": "axiom_task_get",
1025
+ "description": "Status of a task created by axiom_check_start. While `working` only the descriptor is returned; once terminal, `result` (completed) or `error` (failed|cancelled) is attached. Unknown or expired taskId → ERR_TASK_NOT_FOUND.",
1026
+ "riskClass": "READ",
1027
+ "annotations": {
1028
+ "readOnlyHint": true,
1029
+ "destructiveHint": false,
1030
+ "idempotentHint": true,
1031
+ "openWorldHint": false
1032
+ },
1033
+ "inputSchema": {
1034
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1035
+ "type": "object",
1036
+ "properties": {
1037
+ "taskId": {
1038
+ "type": "string",
1039
+ "minLength": 1,
1040
+ "description": "taskId returned by axiom_check_start"
1041
+ }
1042
+ },
1043
+ "required": [
1044
+ "taskId"
1045
+ ]
1046
+ },
1047
+ "outputSchema": {
1048
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1049
+ "type": "object",
1050
+ "properties": {
1051
+ "taskId": {
1052
+ "type": "string"
1053
+ },
1054
+ "tool": {
1055
+ "type": "string"
1056
+ },
1057
+ "status": {
1058
+ "type": "string",
1059
+ "enum": [
1060
+ "working",
1061
+ "completed",
1062
+ "failed",
1063
+ "cancelled"
1064
+ ]
1065
+ },
1066
+ "pollIntervalMs": {
1067
+ "type": "integer",
1068
+ "exclusiveMinimum": 0,
1069
+ "maximum": 9007199254740991
1070
+ },
1071
+ "ttlMs": {
1072
+ "type": "integer",
1073
+ "exclusiveMinimum": 0,
1074
+ "maximum": 9007199254740991
1075
+ },
1076
+ "elapsedMs": {
1077
+ "type": "integer",
1078
+ "minimum": 0,
1079
+ "maximum": 9007199254740991
1080
+ },
1081
+ "result": {
1082
+ "type": "object",
1083
+ "properties": {
1084
+ "apiVersion": {
1085
+ "type": "string",
1086
+ "const": "axiom.dev/v2"
1087
+ },
1088
+ "kind": {
1089
+ "type": "string",
1090
+ "const": "CheckReport"
1091
+ },
1092
+ "manifestDigest": {
1093
+ "type": "string",
1094
+ "pattern": "^sha256:[a-f0-9]{64}$",
1095
+ "description": "sha256:<64 lowercase hex>"
1096
+ },
1097
+ "profile": {
1098
+ "type": "string"
1099
+ },
1100
+ "verdict": {
1101
+ "type": "string",
1102
+ "enum": [
1103
+ "pass",
1104
+ "fail",
1105
+ "error"
1106
+ ]
1107
+ },
1108
+ "findings": {
1109
+ "type": "array",
1110
+ "items": {
1111
+ "type": "object",
1112
+ "properties": {
1113
+ "id": {
1114
+ "type": "string"
1115
+ },
1116
+ "severity": {
1117
+ "type": "string",
1118
+ "enum": [
1119
+ "error",
1120
+ "warn",
1121
+ "info"
1122
+ ]
1123
+ },
1124
+ "predicate": {
1125
+ "type": "string"
1126
+ },
1127
+ "message": {
1128
+ "type": "string"
1129
+ },
1130
+ "path": {
1131
+ "type": "string",
1132
+ "minLength": 1,
1133
+ "maxLength": 1024,
1134
+ "description": "Relative POSIX path, NFC, no reserved names"
1135
+ },
1136
+ "facts": {
1137
+ "default": {},
1138
+ "type": "object",
1139
+ "propertyNames": {
1140
+ "type": "string"
1141
+ },
1142
+ "additionalProperties": {
1143
+ "$ref": "#/$defs/__schema0"
1144
+ }
1145
+ }
1146
+ },
1147
+ "required": [
1148
+ "id",
1149
+ "severity",
1150
+ "predicate",
1151
+ "message"
1152
+ ],
1153
+ "additionalProperties": false
1154
+ }
1155
+ },
1156
+ "factsDigest": {
1157
+ "type": "string",
1158
+ "pattern": "^sha256:[a-f0-9]{64}$",
1159
+ "description": "sha256:<64 lowercase hex>"
1160
+ },
1161
+ "durationMs": {
1162
+ "type": "integer",
1163
+ "minimum": 0,
1164
+ "maximum": 9007199254740991
1165
+ },
1166
+ "providers": {
1167
+ "type": "array",
1168
+ "items": {
1169
+ "type": "object",
1170
+ "properties": {
1171
+ "name": {
1172
+ "type": "string"
1173
+ },
1174
+ "status": {
1175
+ "type": "string",
1176
+ "enum": [
1177
+ "ok",
1178
+ "skipped",
1179
+ "error"
1180
+ ]
1181
+ },
1182
+ "ms": {
1183
+ "type": "integer",
1184
+ "minimum": 0,
1185
+ "maximum": 9007199254740991
1186
+ }
1187
+ },
1188
+ "required": [
1189
+ "name",
1190
+ "status",
1191
+ "ms"
1192
+ ],
1193
+ "additionalProperties": false
1194
+ }
1195
+ },
1196
+ "preImage": {
1197
+ "type": "string",
1198
+ "enum": [
1199
+ "verified",
1200
+ "drifted",
1201
+ "unverified"
1202
+ ]
1203
+ }
1204
+ },
1205
+ "required": [
1206
+ "apiVersion",
1207
+ "kind",
1208
+ "manifestDigest",
1209
+ "profile",
1210
+ "verdict",
1211
+ "findings",
1212
+ "factsDigest",
1213
+ "durationMs",
1214
+ "providers"
1215
+ ],
1216
+ "additionalProperties": false
1217
+ },
1218
+ "error": {
1219
+ "type": "object",
1220
+ "properties": {
1221
+ "code": {
1222
+ "type": "string"
1223
+ },
1224
+ "message": {
1225
+ "type": "string"
1226
+ },
1227
+ "details": {
1228
+ "type": "object",
1229
+ "propertyNames": {
1230
+ "type": "string"
1231
+ },
1232
+ "additionalProperties": {}
1233
+ }
1234
+ },
1235
+ "required": [
1236
+ "code",
1237
+ "message"
1238
+ ]
1239
+ }
1240
+ },
1241
+ "required": [
1242
+ "taskId",
1243
+ "tool",
1244
+ "status",
1245
+ "pollIntervalMs",
1246
+ "ttlMs",
1247
+ "elapsedMs"
1248
+ ],
1249
+ "$defs": {
1250
+ "__schema0": {
1251
+ "anyOf": [
1252
+ {
1253
+ "type": "string"
1254
+ },
1255
+ {
1256
+ "type": "number"
1257
+ },
1258
+ {
1259
+ "type": "boolean"
1260
+ },
1261
+ {
1262
+ "type": "null"
1263
+ },
1264
+ {
1265
+ "type": "array",
1266
+ "items": {
1267
+ "$ref": "#/$defs/__schema0"
1268
+ }
1269
+ },
1270
+ {
1271
+ "type": "object",
1272
+ "propertyNames": {
1273
+ "type": "string"
1274
+ },
1275
+ "additionalProperties": {
1276
+ "$ref": "#/$defs/__schema0"
1277
+ }
1278
+ }
1279
+ ]
1280
+ }
1281
+ }
1282
+ }
1283
+ },
1284
+ {
1285
+ "name": "axiom_task_cancel",
1286
+ "description": "Abort a `working` task: every running guard process tree is killed and the task ends `cancelled` with error ERR_TASK_CANCELLED. Idempotent — a terminal task is returned unchanged.",
1287
+ "riskClass": "ACT",
1288
+ "annotations": {
1289
+ "readOnlyHint": false,
1290
+ "destructiveHint": false,
1291
+ "idempotentHint": true,
1292
+ "openWorldHint": false
1293
+ },
1294
+ "inputSchema": {
1295
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1296
+ "type": "object",
1297
+ "properties": {
1298
+ "taskId": {
1299
+ "type": "string",
1300
+ "minLength": 1,
1301
+ "description": "taskId returned by axiom_check_start"
1302
+ }
1303
+ },
1304
+ "required": [
1305
+ "taskId"
1306
+ ]
1307
+ },
1308
+ "outputSchema": {
1309
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1310
+ "type": "object",
1311
+ "properties": {
1312
+ "taskId": {
1313
+ "type": "string"
1314
+ },
1315
+ "tool": {
1316
+ "type": "string"
1317
+ },
1318
+ "status": {
1319
+ "type": "string",
1320
+ "enum": [
1321
+ "working",
1322
+ "completed",
1323
+ "failed",
1324
+ "cancelled"
1325
+ ]
1326
+ },
1327
+ "pollIntervalMs": {
1328
+ "type": "integer",
1329
+ "exclusiveMinimum": 0,
1330
+ "maximum": 9007199254740991
1331
+ },
1332
+ "ttlMs": {
1333
+ "type": "integer",
1334
+ "exclusiveMinimum": 0,
1335
+ "maximum": 9007199254740991
1336
+ },
1337
+ "elapsedMs": {
1338
+ "type": "integer",
1339
+ "minimum": 0,
1340
+ "maximum": 9007199254740991
1341
+ }
1342
+ },
1343
+ "required": [
1344
+ "taskId",
1345
+ "tool",
1346
+ "status",
1347
+ "pollIntervalMs",
1348
+ "ttlMs",
1349
+ "elapsedMs"
1350
+ ]
1351
+ }
1352
+ },
1353
+ {
1354
+ "name": "axiom_plan_begin",
1355
+ "description": "Start assembling a Plan whose JSON would exceed the 4 MiB per-call cap: send the header here (everything except `artifacts`), append artifacts in chunks with axiom_plan_add, then axiom_plan_seal compiles the whole. The sealed bundle's manifestDigest is identical to a one-shot axiom_plan_compile of the same Plan. Sessions are in-memory, expire after 30 min idle, and hold at most 2000 artifacts / 64 MiB.",
1356
+ "riskClass": "ACT",
1357
+ "annotations": {
1358
+ "readOnlyHint": false,
1359
+ "destructiveHint": false,
1360
+ "idempotentHint": true,
1361
+ "openWorldHint": false
1362
+ },
1363
+ "inputSchema": {
1364
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1365
+ "type": "object",
1366
+ "properties": {
1367
+ "name": {
1368
+ "type": "string",
1369
+ "pattern": "^[a-z0-9][a-z0-9-]{0,63}$"
1370
+ },
1371
+ "intent": {
1372
+ "type": "string",
1373
+ "maxLength": 2000
1374
+ },
1375
+ "profile": {
1376
+ "default": "default",
1377
+ "type": "string",
1378
+ "minLength": 1
1379
+ },
1380
+ "capabilities": {
1381
+ "default": [],
1382
+ "type": "array",
1383
+ "items": {
1384
+ "type": "string",
1385
+ "enum": [
1386
+ "fs",
1387
+ "net",
1388
+ "secret",
1389
+ "ai",
1390
+ "compute",
1391
+ "git"
1392
+ ]
1393
+ }
1394
+ },
1395
+ "checks": {
1396
+ "default": [],
1397
+ "type": "array",
1398
+ "items": {
1399
+ "type": "object",
1400
+ "properties": {
1401
+ "id": {
1402
+ "type": "string",
1403
+ "minLength": 1,
1404
+ "maxLength": 128
1405
+ },
1406
+ "predicate": {
1407
+ "type": "string",
1408
+ "pattern": "^[a-z][a-zA-Z0-9]*\\.[a-zA-Z][a-zA-Z0-9]*$"
1409
+ },
1410
+ "params": {
1411
+ "$ref": "#/$defs/__schema0"
1412
+ },
1413
+ "severity": {
1414
+ "default": "error",
1415
+ "type": "string",
1416
+ "enum": [
1417
+ "error",
1418
+ "warn",
1419
+ "info"
1420
+ ]
1421
+ }
1422
+ },
1423
+ "required": [
1424
+ "id",
1425
+ "predicate",
1426
+ "params"
1427
+ ],
1428
+ "additionalProperties": false
1429
+ }
1430
+ },
1431
+ "counter": {
1432
+ "type": "integer",
1433
+ "minimum": 0,
1434
+ "maximum": 9007199254740991
1435
+ },
1436
+ "metadata": {
1437
+ "default": {},
1438
+ "type": "object",
1439
+ "propertyNames": {
1440
+ "type": "string"
1441
+ },
1442
+ "additionalProperties": {
1443
+ "$ref": "#/$defs/__schema1"
1444
+ }
1445
+ }
1446
+ },
1447
+ "required": [
1448
+ "name",
1449
+ "intent"
1450
+ ],
1451
+ "$defs": {
1452
+ "__schema0": {
1453
+ "anyOf": [
1454
+ {
1455
+ "type": "string"
1456
+ },
1457
+ {
1458
+ "type": "number"
1459
+ },
1460
+ {
1461
+ "type": "boolean"
1462
+ },
1463
+ {
1464
+ "type": "null"
1465
+ },
1466
+ {
1467
+ "type": "array",
1468
+ "items": {
1469
+ "$ref": "#/$defs/__schema0"
1470
+ }
1471
+ },
1472
+ {
1473
+ "type": "object",
1474
+ "propertyNames": {
1475
+ "type": "string"
1476
+ },
1477
+ "additionalProperties": {
1478
+ "$ref": "#/$defs/__schema0"
1479
+ }
1480
+ }
1481
+ ]
1482
+ },
1483
+ "__schema1": {
1484
+ "anyOf": [
1485
+ {
1486
+ "type": "string"
1487
+ },
1488
+ {
1489
+ "type": "number"
1490
+ },
1491
+ {
1492
+ "type": "boolean"
1493
+ },
1494
+ {
1495
+ "type": "null"
1496
+ },
1497
+ {
1498
+ "type": "array",
1499
+ "items": {
1500
+ "$ref": "#/$defs/__schema1"
1501
+ }
1502
+ },
1503
+ {
1504
+ "type": "object",
1505
+ "propertyNames": {
1506
+ "type": "string"
1507
+ },
1508
+ "additionalProperties": {
1509
+ "$ref": "#/$defs/__schema1"
1510
+ }
1511
+ }
1512
+ ]
1513
+ }
1514
+ }
1515
+ },
1516
+ "outputSchema": {
1517
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1518
+ "type": "object",
1519
+ "properties": {
1520
+ "sessionId": {
1521
+ "type": "string"
1522
+ },
1523
+ "artifacts": {
1524
+ "type": "integer",
1525
+ "minimum": 0,
1526
+ "maximum": 9007199254740991
1527
+ },
1528
+ "bytes": {
1529
+ "type": "integer",
1530
+ "minimum": 0,
1531
+ "maximum": 9007199254740991
1532
+ },
1533
+ "limits": {
1534
+ "type": "object",
1535
+ "properties": {
1536
+ "maxArtifacts": {
1537
+ "type": "integer",
1538
+ "exclusiveMinimum": 0,
1539
+ "maximum": 9007199254740991
1540
+ },
1541
+ "maxBytes": {
1542
+ "type": "integer",
1543
+ "exclusiveMinimum": 0,
1544
+ "maximum": 9007199254740991
1545
+ }
1546
+ },
1547
+ "required": [
1548
+ "maxArtifacts",
1549
+ "maxBytes"
1550
+ ]
1551
+ },
1552
+ "ttlMs": {
1553
+ "type": "integer",
1554
+ "exclusiveMinimum": 0,
1555
+ "maximum": 9007199254740991
1556
+ }
1557
+ },
1558
+ "required": [
1559
+ "sessionId",
1560
+ "artifacts",
1561
+ "bytes",
1562
+ "limits",
1563
+ "ttlMs"
1564
+ ]
1565
+ }
1566
+ },
1567
+ {
1568
+ "name": "axiom_plan_add",
1569
+ "description": "Add a chunk of Plan artifacts (each ≤ 4 MiB call, inline content ≤ 256 KiB per artifact as in a Plan) to an open session. Paths must be unique across every chunk (ERR_INVALID_PLAN otherwise); a sealed or over-budget session is ERR_PLAN_SESSION_STATE.",
1570
+ "riskClass": "ACT",
1571
+ "annotations": {
1572
+ "readOnlyHint": false,
1573
+ "destructiveHint": false,
1574
+ "idempotentHint": true,
1575
+ "openWorldHint": false
1576
+ },
1577
+ "inputSchema": {
1578
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1579
+ "type": "object",
1580
+ "properties": {
1581
+ "sessionId": {
1582
+ "type": "string",
1583
+ "minLength": 1,
1584
+ "description": "sessionId returned by axiom_plan_begin"
1585
+ },
1586
+ "artifacts": {
1587
+ "minItems": 1,
1588
+ "type": "array",
1589
+ "items": {
1590
+ "type": "object",
1591
+ "propertyNames": {
1592
+ "type": "string"
1593
+ },
1594
+ "additionalProperties": {}
1595
+ },
1596
+ "description": "Plan artifacts, same shape as Plan.artifacts[]"
1597
+ }
1598
+ },
1599
+ "required": [
1600
+ "sessionId",
1601
+ "artifacts"
1602
+ ]
1603
+ },
1604
+ "outputSchema": {
1605
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1606
+ "type": "object",
1607
+ "properties": {
1608
+ "sessionId": {
1609
+ "type": "string"
1610
+ },
1611
+ "artifacts": {
1612
+ "type": "integer",
1613
+ "minimum": 0,
1614
+ "maximum": 9007199254740991
1615
+ },
1616
+ "bytes": {
1617
+ "type": "integer",
1618
+ "minimum": 0,
1619
+ "maximum": 9007199254740991
1620
+ },
1621
+ "limits": {
1622
+ "type": "object",
1623
+ "properties": {
1624
+ "maxArtifacts": {
1625
+ "type": "integer",
1626
+ "exclusiveMinimum": 0,
1627
+ "maximum": 9007199254740991
1628
+ },
1629
+ "maxBytes": {
1630
+ "type": "integer",
1631
+ "exclusiveMinimum": 0,
1632
+ "maximum": 9007199254740991
1633
+ }
1634
+ },
1635
+ "required": [
1636
+ "maxArtifacts",
1637
+ "maxBytes"
1638
+ ]
1639
+ },
1640
+ "ttlMs": {
1641
+ "type": "integer",
1642
+ "exclusiveMinimum": 0,
1643
+ "maximum": 9007199254740991
1644
+ }
1645
+ },
1646
+ "required": [
1647
+ "sessionId",
1648
+ "artifacts",
1649
+ "bytes",
1650
+ "limits",
1651
+ "ttlMs"
1652
+ ]
1653
+ }
1654
+ },
1655
+ {
1656
+ "name": "axiom_plan_seal",
1657
+ "description": "Assemble the session's header + every added artifact into one Plan and compile it exactly like axiom_plan_compile (same options, same digest). The session is consumed whether or not compilation succeeds. Bundles whose inline blobs exceed 4 MiB need `store: cas` (and therefore a root).",
1658
+ "riskClass": "ACT",
1659
+ "annotations": {
1660
+ "readOnlyHint": false,
1661
+ "destructiveHint": false,
1662
+ "idempotentHint": true,
1663
+ "openWorldHint": false
1664
+ },
1665
+ "inputSchema": {
1666
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1667
+ "type": "object",
1668
+ "properties": {
1669
+ "sessionId": {
1670
+ "type": "string",
1671
+ "minLength": 1,
1672
+ "description": "sessionId returned by axiom_plan_begin"
1673
+ },
1674
+ "store": {
1675
+ "description": "Blob transport; default inline",
1676
+ "type": "string",
1677
+ "enum": [
1678
+ "inline",
1679
+ "cas"
1680
+ ]
1681
+ },
1682
+ "root": {
1683
+ "description": "Absolute repository root; must equal or lie inside an allowlisted --root",
1684
+ "type": "string"
1685
+ }
1686
+ },
1687
+ "required": [
1688
+ "sessionId"
1689
+ ]
1690
+ },
1691
+ "outputSchema": {
1692
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1693
+ "type": "object",
1694
+ "properties": {
1695
+ "manifest": {
1696
+ "type": "object",
1697
+ "properties": {
1698
+ "apiVersion": {
1699
+ "type": "string",
1700
+ "const": "axiom.dev/v2"
1701
+ },
1702
+ "kind": {
1703
+ "type": "string",
1704
+ "const": "Manifest"
1705
+ },
1706
+ "name": {
1707
+ "type": "string",
1708
+ "pattern": "^[a-z0-9][a-z0-9-]{0,63}$"
1709
+ },
1710
+ "profile": {
1711
+ "type": "string",
1712
+ "minLength": 1
1713
+ },
1714
+ "planDigest": {
1715
+ "type": "string",
1716
+ "pattern": "^sha256:[a-f0-9]{64}$",
1717
+ "description": "sha256:<64 lowercase hex>"
1718
+ },
1719
+ "artifacts": {
1720
+ "minItems": 1,
1721
+ "maxItems": 2000,
1722
+ "type": "array",
1723
+ "items": {
1724
+ "type": "object",
1725
+ "properties": {
1726
+ "path": {
1727
+ "type": "string",
1728
+ "minLength": 1,
1729
+ "maxLength": 1024,
1730
+ "description": "Relative POSIX path, NFC, no reserved names"
1731
+ },
1732
+ "op": {
1733
+ "type": "string",
1734
+ "enum": [
1735
+ "create",
1736
+ "overwrite",
1737
+ "delete"
1738
+ ]
1739
+ },
1740
+ "mode": {
1741
+ "type": "string",
1742
+ "enum": [
1743
+ "0644",
1744
+ "0755"
1745
+ ]
1746
+ },
1747
+ "digest": {
1748
+ "type": "object",
1749
+ "properties": {
1750
+ "sha256": {
1751
+ "type": "string",
1752
+ "pattern": "^[a-f0-9]{64}$",
1753
+ "description": "Lowercase hex-encoded sha256"
1754
+ }
1755
+ },
1756
+ "required": [
1757
+ "sha256"
1758
+ ],
1759
+ "additionalProperties": false
1760
+ },
1761
+ "bytes": {
1762
+ "type": "integer",
1763
+ "minimum": 0,
1764
+ "maximum": 9007199254740991
1765
+ },
1766
+ "origin": {
1767
+ "type": "string",
1768
+ "enum": [
1769
+ "inline",
1770
+ "template",
1771
+ "cas",
1772
+ "ref",
1773
+ "patch"
1774
+ ]
1775
+ }
1776
+ },
1777
+ "required": [
1778
+ "path",
1779
+ "op",
1780
+ "mode"
1781
+ ],
1782
+ "additionalProperties": false
1783
+ }
1784
+ },
1785
+ "checks": {
1786
+ "type": "array",
1787
+ "items": {
1788
+ "type": "object",
1789
+ "properties": {
1790
+ "id": {
1791
+ "type": "string",
1792
+ "minLength": 1,
1793
+ "maxLength": 128
1794
+ },
1795
+ "predicate": {
1796
+ "type": "string",
1797
+ "pattern": "^[a-z][a-zA-Z0-9]*\\.[a-zA-Z][a-zA-Z0-9]*$"
1798
+ },
1799
+ "params": {
1800
+ "$ref": "#/$defs/__schema0"
1801
+ },
1802
+ "severity": {
1803
+ "default": "error",
1804
+ "type": "string",
1805
+ "enum": [
1806
+ "error",
1807
+ "warn",
1808
+ "info"
1809
+ ]
1810
+ }
1811
+ },
1812
+ "required": [
1813
+ "id",
1814
+ "predicate",
1815
+ "params"
1816
+ ],
1817
+ "additionalProperties": false
1818
+ }
1819
+ },
1820
+ "toolchain": {
1821
+ "type": "object",
1822
+ "properties": {
1823
+ "axiom": {
1824
+ "type": "string",
1825
+ "minLength": 1
1826
+ },
1827
+ "emitters": {
1828
+ "type": "object",
1829
+ "propertyNames": {
1830
+ "type": "string"
1831
+ },
1832
+ "additionalProperties": {
1833
+ "type": "string"
1834
+ }
1835
+ }
1836
+ },
1837
+ "required": [
1838
+ "axiom",
1839
+ "emitters"
1840
+ ],
1841
+ "additionalProperties": false
1842
+ },
1843
+ "counter": {
1844
+ "type": "integer",
1845
+ "minimum": 0,
1846
+ "maximum": 9007199254740991
1847
+ },
1848
+ "preImage": {
1849
+ "type": "array",
1850
+ "items": {
1851
+ "type": "object",
1852
+ "properties": {
1853
+ "path": {
1854
+ "type": "string",
1855
+ "minLength": 1,
1856
+ "maxLength": 1024,
1857
+ "description": "Relative POSIX path, NFC, no reserved names"
1858
+ },
1859
+ "sha256": {
1860
+ "anyOf": [
1861
+ {
1862
+ "type": "string",
1863
+ "pattern": "^[a-f0-9]{64}$",
1864
+ "description": "Lowercase hex-encoded sha256"
1865
+ },
1866
+ {
1867
+ "type": "string",
1868
+ "const": "absent"
1869
+ }
1870
+ ]
1871
+ }
1872
+ },
1873
+ "required": [
1874
+ "path",
1875
+ "sha256"
1876
+ ],
1877
+ "additionalProperties": false
1878
+ }
1879
+ }
1880
+ },
1881
+ "required": [
1882
+ "apiVersion",
1883
+ "kind",
1884
+ "name",
1885
+ "profile",
1886
+ "planDigest",
1887
+ "artifacts",
1888
+ "checks",
1889
+ "toolchain"
1890
+ ],
1891
+ "additionalProperties": false
1892
+ },
1893
+ "manifestDigest": {
1894
+ "type": "string",
1895
+ "pattern": "^sha256:[a-f0-9]{64}$",
1896
+ "description": "sha256:<64 lowercase hex>"
1897
+ },
1898
+ "attestation": {
1899
+ "type": "object",
1900
+ "properties": {
1901
+ "_type": {
1902
+ "type": "string",
1903
+ "const": "https://in-toto.io/Statement/v1"
1904
+ },
1905
+ "subject": {
1906
+ "minItems": 1,
1907
+ "type": "array",
1908
+ "items": {
1909
+ "type": "object",
1910
+ "properties": {
1911
+ "name": {
1912
+ "type": "string"
1913
+ },
1914
+ "digest": {
1915
+ "type": "object",
1916
+ "properties": {
1917
+ "sha256": {
1918
+ "type": "string",
1919
+ "pattern": "^[a-f0-9]{64}$",
1920
+ "description": "Lowercase hex-encoded sha256"
1921
+ }
1922
+ },
1923
+ "required": [
1924
+ "sha256"
1925
+ ],
1926
+ "additionalProperties": false
1927
+ }
1928
+ },
1929
+ "required": [
1930
+ "name",
1931
+ "digest"
1932
+ ],
1933
+ "additionalProperties": false
1934
+ }
1935
+ },
1936
+ "predicateType": {
1937
+ "type": "string",
1938
+ "format": "uri"
1939
+ },
1940
+ "predicate": {
1941
+ "type": "object",
1942
+ "propertyNames": {
1943
+ "type": "string"
1944
+ },
1945
+ "additionalProperties": {}
1946
+ }
1947
+ },
1948
+ "required": [
1949
+ "_type",
1950
+ "subject",
1951
+ "predicateType",
1952
+ "predicate"
1953
+ ],
1954
+ "additionalProperties": false
1955
+ },
1956
+ "envelope": {
1957
+ "type": "object",
1958
+ "properties": {
1959
+ "payloadType": {
1960
+ "type": "string",
1961
+ "const": "application/vnd.in-toto+json"
1962
+ },
1963
+ "payload": {
1964
+ "type": "string",
1965
+ "format": "base64",
1966
+ "contentEncoding": "base64",
1967
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"
1968
+ },
1969
+ "signatures": {
1970
+ "type": "array",
1971
+ "items": {
1972
+ "type": "object",
1973
+ "properties": {
1974
+ "keyid": {
1975
+ "type": "string"
1976
+ },
1977
+ "sig": {
1978
+ "type": "string",
1979
+ "format": "base64",
1980
+ "contentEncoding": "base64",
1981
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"
1982
+ }
1983
+ },
1984
+ "required": [
1985
+ "sig"
1986
+ ],
1987
+ "additionalProperties": false
1988
+ }
1989
+ }
1990
+ },
1991
+ "required": [
1992
+ "payloadType",
1993
+ "payload",
1994
+ "signatures"
1995
+ ],
1996
+ "additionalProperties": false
1997
+ },
1998
+ "signatures": {
639
1999
  "type": "array",
640
2000
  "items": {
641
2001
  "type": "object",
642
2002
  "properties": {
643
- "id": {
644
- "type": "string"
645
- },
646
- "severity": {
647
- "type": "string",
648
- "enum": [
649
- "error",
650
- "warn",
651
- "info"
2003
+ "payloadType": {
2004
+ "anyOf": [
2005
+ {
2006
+ "type": "string",
2007
+ "const": "application/vnd.axiom.manifest+json"
2008
+ },
2009
+ {
2010
+ "type": "string",
2011
+ "const": "application/vnd.axiom.manifest-bound+json"
2012
+ }
652
2013
  ]
653
2014
  },
654
- "predicate": {
655
- "type": "string"
656
- },
657
- "message": {
658
- "type": "string"
659
- },
660
- "path": {
2015
+ "payload": {
661
2016
  "type": "string",
662
- "minLength": 1,
663
- "maxLength": 1024,
664
- "description": "Relative POSIX path, NFC, no reserved names"
2017
+ "format": "base64",
2018
+ "contentEncoding": "base64",
2019
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"
665
2020
  },
666
- "facts": {
667
- "default": {},
668
- "type": "object",
669
- "propertyNames": {
670
- "type": "string"
671
- },
672
- "additionalProperties": {
673
- "$ref": "#/$defs/__schema0"
2021
+ "signatures": {
2022
+ "minItems": 1,
2023
+ "type": "array",
2024
+ "items": {
2025
+ "type": "object",
2026
+ "properties": {
2027
+ "keyid": {
2028
+ "type": "string"
2029
+ },
2030
+ "sig": {
2031
+ "type": "string",
2032
+ "format": "base64",
2033
+ "contentEncoding": "base64",
2034
+ "pattern": "^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$"
2035
+ }
2036
+ },
2037
+ "required": [
2038
+ "sig"
2039
+ ],
2040
+ "additionalProperties": false
674
2041
  }
675
2042
  }
676
2043
  },
677
2044
  "required": [
678
- "id",
679
- "severity",
680
- "predicate",
681
- "message"
2045
+ "payloadType",
2046
+ "payload",
2047
+ "signatures"
682
2048
  ],
683
2049
  "additionalProperties": false
684
2050
  }
685
2051
  },
686
- "factsDigest": {
687
- "type": "string",
688
- "pattern": "^sha256:[a-f0-9]{64}$",
689
- "description": "sha256:<64 lowercase hex>"
690
- },
691
- "durationMs": {
692
- "type": "integer",
693
- "minimum": 0,
694
- "maximum": 9007199254740991
695
- },
696
- "providers": {
697
- "type": "array",
698
- "items": {
2052
+ "blobs": {
2053
+ "default": {},
2054
+ "type": "object",
2055
+ "propertyNames": {
2056
+ "type": "string",
2057
+ "pattern": "^sha256:[a-f0-9]{64}$",
2058
+ "description": "sha256:<64 lowercase hex>"
2059
+ },
2060
+ "additionalProperties": {
699
2061
  "type": "object",
700
2062
  "properties": {
701
- "name": {
702
- "type": "string"
703
- },
704
- "status": {
2063
+ "encoding": {
705
2064
  "type": "string",
706
2065
  "enum": [
707
- "ok",
708
- "skipped",
709
- "error"
2066
+ "utf8",
2067
+ "base64"
710
2068
  ]
711
2069
  },
712
- "ms": {
713
- "type": "integer",
714
- "minimum": 0,
715
- "maximum": 9007199254740991
2070
+ "data": {
2071
+ "type": "string"
716
2072
  }
717
2073
  },
718
2074
  "required": [
719
- "name",
720
- "status",
721
- "ms"
2075
+ "encoding",
2076
+ "data"
722
2077
  ],
723
2078
  "additionalProperties": false
724
2079
  }
725
2080
  }
726
2081
  },
727
2082
  "required": [
728
- "apiVersion",
729
- "kind",
730
- "manifestDigest",
731
- "profile",
732
- "verdict",
733
- "findings",
734
- "factsDigest",
735
- "durationMs",
736
- "providers"
2083
+ "manifest",
2084
+ "manifestDigest"
737
2085
  ],
738
2086
  "additionalProperties": false,
739
2087
  "$defs": {
@@ -922,6 +2270,15 @@
922
2270
  ],
923
2271
  "additionalProperties": false
924
2272
  },
2273
+ "drifted": {
2274
+ "type": "array",
2275
+ "items": {
2276
+ "type": "string",
2277
+ "minLength": 1,
2278
+ "maxLength": 1024,
2279
+ "description": "Relative POSIX path, NFC, no reserved names"
2280
+ }
2281
+ },
925
2282
  "error": {
926
2283
  "type": "object",
927
2284
  "properties": {
@@ -962,13 +2319,30 @@
962
2319
  "ERR_PROVIDER_FAILED",
963
2320
  "ERR_GUARD_TIMEOUT",
964
2321
  "ERR_GUARD_OUTPUT",
2322
+ "ERR_FACT_DISABLED",
2323
+ "ERR_SIGNATURE_MISSING",
2324
+ "ERR_SIGNATURE_INVALID",
2325
+ "ERR_TRUST_STATE_CORRUPT",
2326
+ "ERR_ROLLBACK",
2327
+ "ERR_EMITTER_UNKNOWN",
2328
+ "ERR_TEMPLATE_UNKNOWN",
2329
+ "ERR_TEMPLATE_PARAMS",
2330
+ "ERR_PATCH_FORMAT",
2331
+ "ERR_PATCH_PREIMAGE",
2332
+ "ERR_PATCH_NO_MATCH",
965
2333
  "ERR_GIT_NOT_FOUND",
966
2334
  "ERR_GIT_NOT_REPO",
967
2335
  "ERR_GIT_DIRTY",
968
2336
  "ERR_GIT_BRANCH_EXISTS",
969
2337
  "ERR_GIT_BRANCH_INVALID",
970
2338
  "ERR_GIT_FAILED",
2339
+ "ERR_TASK_NOT_FOUND",
2340
+ "ERR_TASK_CANCELLED",
2341
+ "ERR_PLAN_SESSION_STATE",
971
2342
  "ERR_REF_OFFLINE",
2343
+ "ERR_NET_DISABLED",
2344
+ "ERR_NET_DENIED",
2345
+ "ERR_NET_FAILED",
972
2346
  "ERR_NOT_CANONICAL",
973
2347
  "ERR_UNSUPPORTED_OP",
974
2348
  "ERR_INTERNAL"
@@ -1174,6 +2548,15 @@
1174
2548
  ],
1175
2549
  "additionalProperties": false
1176
2550
  },
2551
+ "drifted": {
2552
+ "type": "array",
2553
+ "items": {
2554
+ "type": "string",
2555
+ "minLength": 1,
2556
+ "maxLength": 1024,
2557
+ "description": "Relative POSIX path, NFC, no reserved names"
2558
+ }
2559
+ },
1177
2560
  "error": {
1178
2561
  "type": "object",
1179
2562
  "properties": {
@@ -1214,13 +2597,30 @@
1214
2597
  "ERR_PROVIDER_FAILED",
1215
2598
  "ERR_GUARD_TIMEOUT",
1216
2599
  "ERR_GUARD_OUTPUT",
2600
+ "ERR_FACT_DISABLED",
2601
+ "ERR_SIGNATURE_MISSING",
2602
+ "ERR_SIGNATURE_INVALID",
2603
+ "ERR_TRUST_STATE_CORRUPT",
2604
+ "ERR_ROLLBACK",
2605
+ "ERR_EMITTER_UNKNOWN",
2606
+ "ERR_TEMPLATE_UNKNOWN",
2607
+ "ERR_TEMPLATE_PARAMS",
2608
+ "ERR_PATCH_FORMAT",
2609
+ "ERR_PATCH_PREIMAGE",
2610
+ "ERR_PATCH_NO_MATCH",
1217
2611
  "ERR_GIT_NOT_FOUND",
1218
2612
  "ERR_GIT_NOT_REPO",
1219
2613
  "ERR_GIT_DIRTY",
1220
2614
  "ERR_GIT_BRANCH_EXISTS",
1221
2615
  "ERR_GIT_BRANCH_INVALID",
1222
2616
  "ERR_GIT_FAILED",
2617
+ "ERR_TASK_NOT_FOUND",
2618
+ "ERR_TASK_CANCELLED",
2619
+ "ERR_PLAN_SESSION_STATE",
1223
2620
  "ERR_REF_OFFLINE",
2621
+ "ERR_NET_DISABLED",
2622
+ "ERR_NET_DENIED",
2623
+ "ERR_NET_FAILED",
1224
2624
  "ERR_NOT_CANONICAL",
1225
2625
  "ERR_UNSUPPORTED_OP",
1226
2626
  "ERR_INTERNAL"
@@ -1628,7 +3028,49 @@
1628
3028
  "template"
1629
3029
  ],
1630
3030
  "additionalProperties": false,
1631
- "description": "v2.1"
3031
+ "description": "template source rendered by a registered emitter at compile time"
3032
+ },
3033
+ {
3034
+ "type": "object",
3035
+ "properties": {
3036
+ "type": {
3037
+ "type": "string",
3038
+ "const": "patch"
3039
+ },
3040
+ "format": {
3041
+ "type": "string",
3042
+ "enum": [
3043
+ "unified",
3044
+ "v4a",
3045
+ "search-replace"
3046
+ ]
3047
+ },
3048
+ "preImage": {
3049
+ "anyOf": [
3050
+ {
3051
+ "type": "string",
3052
+ "pattern": "^sha256:[a-f0-9]{64}$",
3053
+ "description": "sha256:<64 lowercase hex>"
3054
+ },
3055
+ {
3056
+ "type": "string",
3057
+ "const": "absent"
3058
+ }
3059
+ ]
3060
+ },
3061
+ "body": {
3062
+ "type": "string",
3063
+ "maxLength": 262144
3064
+ }
3065
+ },
3066
+ "required": [
3067
+ "type",
3068
+ "format",
3069
+ "preImage",
3070
+ "body"
3071
+ ],
3072
+ "additionalProperties": false,
3073
+ "description": "patch applied at compile time to the pre-image named by its digest"
1632
3074
  }
1633
3075
  ]
1634
3076
  }
@@ -1675,6 +3117,11 @@
1675
3117
  "additionalProperties": false
1676
3118
  }
1677
3119
  },
3120
+ "counter": {
3121
+ "type": "integer",
3122
+ "minimum": 0,
3123
+ "maximum": 9007199254740991
3124
+ },
1678
3125
  "metadata": {
1679
3126
  "default": {},
1680
3127
  "type": "object",
@@ -1744,13 +3191,30 @@
1744
3191
  "ERR_PROVIDER_FAILED",
1745
3192
  "ERR_GUARD_TIMEOUT",
1746
3193
  "ERR_GUARD_OUTPUT",
3194
+ "ERR_FACT_DISABLED",
3195
+ "ERR_SIGNATURE_MISSING",
3196
+ "ERR_SIGNATURE_INVALID",
3197
+ "ERR_TRUST_STATE_CORRUPT",
3198
+ "ERR_ROLLBACK",
3199
+ "ERR_EMITTER_UNKNOWN",
3200
+ "ERR_TEMPLATE_UNKNOWN",
3201
+ "ERR_TEMPLATE_PARAMS",
3202
+ "ERR_PATCH_FORMAT",
3203
+ "ERR_PATCH_PREIMAGE",
3204
+ "ERR_PATCH_NO_MATCH",
1747
3205
  "ERR_GIT_NOT_FOUND",
1748
3206
  "ERR_GIT_NOT_REPO",
1749
3207
  "ERR_GIT_DIRTY",
1750
3208
  "ERR_GIT_BRANCH_EXISTS",
1751
3209
  "ERR_GIT_BRANCH_INVALID",
1752
3210
  "ERR_GIT_FAILED",
3211
+ "ERR_TASK_NOT_FOUND",
3212
+ "ERR_TASK_CANCELLED",
3213
+ "ERR_PLAN_SESSION_STATE",
1753
3214
  "ERR_REF_OFFLINE",
3215
+ "ERR_NET_DISABLED",
3216
+ "ERR_NET_DENIED",
3217
+ "ERR_NET_FAILED",
1754
3218
  "ERR_NOT_CANONICAL",
1755
3219
  "ERR_UNSUPPORTED_OP",
1756
3220
  "ERR_INTERNAL"
@@ -1962,5 +3426,190 @@
1962
3426
  "roots"
1963
3427
  ]
1964
3428
  }
3429
+ },
3430
+ {
3431
+ "name": "axiom_repo_snapshot",
3432
+ "description": "Deterministic, content-addressed inventory of a root: every regular file (and symlink) as { path, bytes, sha256, mode, kind }, sorted by code point, with snapshotDigest = sha256(JCS(body)). No timestamps, no absolute paths — the same tree gives the same digest on every machine. Honours the root .gitignore, always skips .git/ and .axiom/, never follows symlinks, never leaves the root. Use it to build Plans against real pre-image digests, or diff two snapshots with `axiom snapshot-diff`.",
3433
+ "riskClass": "READ",
3434
+ "annotations": {
3435
+ "readOnlyHint": true,
3436
+ "destructiveHint": false,
3437
+ "idempotentHint": true,
3438
+ "openWorldHint": false
3439
+ },
3440
+ "inputSchema": {
3441
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3442
+ "type": "object",
3443
+ "properties": {
3444
+ "root": {
3445
+ "description": "Absolute repository root; must equal or lie inside an allowlisted --root",
3446
+ "type": "string"
3447
+ },
3448
+ "include": {
3449
+ "description": "Relative globs (*, **, ?) to keep; default everything",
3450
+ "type": "array",
3451
+ "items": {
3452
+ "type": "string",
3453
+ "minLength": 1
3454
+ }
3455
+ },
3456
+ "exclude": {
3457
+ "description": "Relative globs to drop",
3458
+ "type": "array",
3459
+ "items": {
3460
+ "type": "string",
3461
+ "minLength": 1
3462
+ }
3463
+ },
3464
+ "maxFiles": {
3465
+ "default": 20000,
3466
+ "description": "Stop after this many files (cap 50000); sets truncated",
3467
+ "type": "integer",
3468
+ "minimum": 1,
3469
+ "maximum": 50000
3470
+ },
3471
+ "maxBytes": {
3472
+ "default": 67108864,
3473
+ "description": "Stop once the summed size would exceed this; sets truncated",
3474
+ "type": "integer",
3475
+ "minimum": 0,
3476
+ "maximum": 9007199254740991
3477
+ },
3478
+ "followSymlinks": {
3479
+ "default": false,
3480
+ "description": "Always false; symlinks are recorded, never followed",
3481
+ "type": "boolean",
3482
+ "const": false
3483
+ },
3484
+ "respectGitignore": {
3485
+ "default": true,
3486
+ "type": "boolean"
3487
+ },
3488
+ "withContentDigest": {
3489
+ "default": true,
3490
+ "description": "false → sizes only, no sha256",
3491
+ "type": "boolean"
3492
+ }
3493
+ }
3494
+ },
3495
+ "outputSchema": {
3496
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3497
+ "type": "object",
3498
+ "properties": {
3499
+ "apiVersion": {
3500
+ "type": "string",
3501
+ "const": "axiom.dev/v2"
3502
+ },
3503
+ "kind": {
3504
+ "type": "string",
3505
+ "const": "RepoSnapshot"
3506
+ },
3507
+ "root": {
3508
+ "type": "object",
3509
+ "properties": {
3510
+ "kind": {
3511
+ "type": "string",
3512
+ "const": "relative"
3513
+ }
3514
+ },
3515
+ "required": [
3516
+ "kind"
3517
+ ],
3518
+ "additionalProperties": false
3519
+ },
3520
+ "snapshotDigest": {
3521
+ "type": "string",
3522
+ "pattern": "^sha256:[a-f0-9]{64}$",
3523
+ "description": "sha256:<64 lowercase hex>"
3524
+ },
3525
+ "body": {
3526
+ "type": "object",
3527
+ "properties": {
3528
+ "files": {
3529
+ "type": "array",
3530
+ "items": {
3531
+ "type": "object",
3532
+ "properties": {
3533
+ "path": {
3534
+ "type": "string",
3535
+ "minLength": 1,
3536
+ "maxLength": 1024,
3537
+ "description": "Relative POSIX path, NFC, no reserved names"
3538
+ },
3539
+ "bytes": {
3540
+ "type": "integer",
3541
+ "minimum": 0,
3542
+ "maximum": 9007199254740991
3543
+ },
3544
+ "sha256": {
3545
+ "type": "string",
3546
+ "pattern": "^[a-f0-9]{64}$",
3547
+ "description": "Lowercase hex-encoded sha256"
3548
+ },
3549
+ "mode": {
3550
+ "type": "string",
3551
+ "enum": [
3552
+ "0644",
3553
+ "0755"
3554
+ ]
3555
+ },
3556
+ "kind": {
3557
+ "type": "string",
3558
+ "enum": [
3559
+ "file",
3560
+ "symlink"
3561
+ ]
3562
+ }
3563
+ },
3564
+ "required": [
3565
+ "path",
3566
+ "bytes",
3567
+ "mode",
3568
+ "kind"
3569
+ ],
3570
+ "additionalProperties": false
3571
+ }
3572
+ },
3573
+ "truncated": {
3574
+ "type": "boolean"
3575
+ },
3576
+ "counts": {
3577
+ "type": "object",
3578
+ "properties": {
3579
+ "files": {
3580
+ "type": "integer",
3581
+ "minimum": 0,
3582
+ "maximum": 9007199254740991
3583
+ },
3584
+ "bytes": {
3585
+ "type": "integer",
3586
+ "minimum": 0,
3587
+ "maximum": 9007199254740991
3588
+ }
3589
+ },
3590
+ "required": [
3591
+ "files",
3592
+ "bytes"
3593
+ ],
3594
+ "additionalProperties": false
3595
+ }
3596
+ },
3597
+ "required": [
3598
+ "files",
3599
+ "truncated",
3600
+ "counts"
3601
+ ],
3602
+ "additionalProperties": false
3603
+ }
3604
+ },
3605
+ "required": [
3606
+ "apiVersion",
3607
+ "kind",
3608
+ "root",
3609
+ "snapshotDigest",
3610
+ "body"
3611
+ ],
3612
+ "additionalProperties": false
3613
+ }
1965
3614
  }
1966
3615
  ]