@synapsor/runner 1.4.12 → 1.4.122

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +63 -60
  3. package/THREAT_MODEL.md +6 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/runner.mjs +29227 -2475
  7. package/docs/README.md +11 -0
  8. package/docs/aggregate-reads.md +49 -0
  9. package/docs/bounded-set-writeback.md +9 -4
  10. package/docs/capability-authoring.md +43 -1
  11. package/docs/cloud-cli.md +248 -0
  12. package/docs/cloud-mode.md +88 -6
  13. package/docs/cloud-push.md +22 -5
  14. package/docs/compliance-reports.md +42 -0
  15. package/docs/conformance.md +15 -0
  16. package/docs/contract-review.md +57 -0
  17. package/docs/contract-testing.md +76 -0
  18. package/docs/dsl-reference.md +50 -6
  19. package/docs/graduated-trust.md +64 -0
  20. package/docs/hosted-cloud-linked-verification.md +97 -0
  21. package/docs/limitations.md +10 -0
  22. package/docs/oss-vs-cloud.md +13 -6
  23. package/docs/release-notes.md +65 -0
  24. package/docs/rfcs/007-trusted-principal-row-scope.md +75 -0
  25. package/docs/runner-bundles.md +24 -0
  26. package/docs/runner-config-reference.md +16 -0
  27. package/docs/running-a-runner-fleet.md +8 -0
  28. package/docs/security-boundary.md +28 -1
  29. package/examples/runner-fleet/seed/mysql.sql +5 -1
  30. package/examples/runner-fleet/seed/postgres.sql +5 -1
  31. package/examples/support-plan-credit/README.md +8 -6
  32. package/examples/support-plan-credit/synapsor.contract-tests.json +53 -0
  33. package/fixtures/dsl/aggregate-read.synapsor.sql +21 -0
  34. package/fixtures/dsl/bounded-set-multi-term.synapsor.sql +30 -0
  35. package/fixtures/dsl/principal-row-scope.synapsor.sql +23 -0
  36. package/fixtures/protocol/MANIFEST.json +10 -10
  37. package/package.json +4 -1
  38. package/schemas/change-set.v1.schema.json +14 -0
  39. package/schemas/change-set.v2.schema.json +14 -0
  40. package/schemas/change-set.v3.schema.json +2 -0
  41. package/schemas/compensation-change-set.v1.schema.json +3 -2
  42. package/schemas/inverse-descriptor.v1.schema.json +2 -0
  43. package/schemas/synapsor.contract-tests.schema.json +54 -0
  44. package/schemas/synapsor.runner.schema.json +92 -4
  45. package/schemas/writeback-job.v1.schema.json +14 -0
  46. package/schemas/writeback-job.v2.schema.json +14 -0
  47. package/schemas/writeback-job.v3.schema.json +2 -0
  48. package/schemas/writeback-job.v4.schema.json +2 -2
@@ -176,6 +176,23 @@
176
176
  "token_env": { "$ref": "#/$defs/env_name" }
177
177
  }
178
178
  },
179
+ "graduated_trust": {
180
+ "description": "Disabled-by-default operator criteria for bounded policy recommendations. Recommendations never activate contracts.",
181
+ "type": "object",
182
+ "additionalProperties": false,
183
+ "properties": {
184
+ "enabled": { "type": "boolean", "default": false },
185
+ "kill_switch": { "type": "boolean", "default": false },
186
+ "workspace_id": { "type": "string", "minLength": 1 },
187
+ "project_id": { "type": "string", "minLength": 1 },
188
+ "criteria": {
189
+ "type": "array",
190
+ "minItems": 1,
191
+ "maxItems": 100,
192
+ "items": { "$ref": "#/$defs/graduated_trust_criterion" }
193
+ }
194
+ }
195
+ },
179
196
  "operator_identity": {
180
197
  "description": "Operator identity used by approve, reject, and apply. signed_key verifies a registered key; jwt_oidc verifies asymmetric JWT claims and Runner-attests the decision; dev_env is local-development compatibility only.",
181
198
  "type": "object",
@@ -304,6 +321,28 @@
304
321
  "window_seconds": { "type": "integer", "minimum": 1, "maximum": 86400 }
305
322
  }
306
323
  },
324
+ "graduated_trust_criterion": {
325
+ "type": "object",
326
+ "additionalProperties": false,
327
+ "required": [
328
+ "capability", "policy", "field", "minimum_human_reviews", "window_days",
329
+ "maximum_rejection_rate", "maximum_conflict_rate", "maximum_failure_rate",
330
+ "maximum_revert_rate", "maximum_threshold_increase", "absolute_ceiling"
331
+ ],
332
+ "properties": {
333
+ "capability": { "$ref": "#/$defs/qualified_name" },
334
+ "policy": { "type": "string", "minLength": 1 },
335
+ "field": { "$ref": "#/$defs/identifier" },
336
+ "minimum_human_reviews": { "type": "integer", "minimum": 10, "maximum": 10000 },
337
+ "window_days": { "type": "integer", "minimum": 1, "maximum": 365 },
338
+ "maximum_rejection_rate": { "type": "number", "minimum": 0, "maximum": 1 },
339
+ "maximum_conflict_rate": { "type": "number", "minimum": 0, "maximum": 1 },
340
+ "maximum_failure_rate": { "type": "number", "minimum": 0, "maximum": 1 },
341
+ "maximum_revert_rate": { "type": "number", "minimum": 0, "maximum": 1 },
342
+ "maximum_threshold_increase": { "type": "number", "exclusiveMinimum": 0 },
343
+ "absolute_ceiling": { "type": "number", "exclusiveMinimum": 0 }
344
+ }
345
+ },
307
346
  "env_name": {
308
347
  "type": "string",
309
348
  "pattern": "^[A-Z_][A-Z0-9_]*$"
@@ -444,14 +483,27 @@
444
483
  "capability": {
445
484
  "type": "object",
446
485
  "additionalProperties": false,
447
- "required": ["name", "kind", "source", "target", "args", "lookup", "visible_columns"],
486
+ "required": ["name", "kind", "source", "target", "args"],
487
+ "allOf": [
488
+ {
489
+ "if": { "properties": { "kind": { "const": "aggregate_read" } }, "required": ["kind"] },
490
+ "then": { "required": ["aggregate", "evidence"] },
491
+ "else": {
492
+ "required": ["lookup", "visible_columns"],
493
+ "properties": {
494
+ "args": { "minProperties": 1 },
495
+ "visible_columns": { "minItems": 1 }
496
+ }
497
+ }
498
+ }
499
+ ],
448
500
  "properties": {
449
501
  "name": {
450
502
  "$ref": "#/$defs/qualified_name"
451
503
  },
452
504
  "kind": {
453
505
  "type": "string",
454
- "enum": ["read", "proposal"]
506
+ "enum": ["read", "aggregate_read", "proposal"]
455
507
  },
456
508
  "description": {
457
509
  "description": "Model-facing text shown in MCP tools/list. Describe when to use the tool.",
@@ -480,7 +532,7 @@
480
532
  },
481
533
  "args": {
482
534
  "type": "object",
483
- "minProperties": 1,
535
+ "minProperties": 0,
484
536
  "additionalProperties": {
485
537
  "$ref": "#/$defs/arg"
486
538
  }
@@ -498,7 +550,7 @@
498
550
  },
499
551
  "visible_columns": {
500
552
  "type": "array",
501
- "minItems": 1,
553
+ "minItems": 0,
502
554
  "items": {
503
555
  "$ref": "#/$defs/identifier"
504
556
  }
@@ -510,6 +562,9 @@
510
562
  "type": "integer",
511
563
  "minimum": 1
512
564
  },
565
+ "aggregate": {
566
+ "$ref": "#/$defs/aggregate_read"
567
+ },
513
568
  "patch": {
514
569
  "type": "object",
515
570
  "additionalProperties": {
@@ -771,6 +826,39 @@
771
826
  }
772
827
  }
773
828
  },
829
+ "aggregate_read": {
830
+ "type": "object",
831
+ "additionalProperties": false,
832
+ "required": ["function", "minimum_group_size"],
833
+ "properties": {
834
+ "function": { "enum": ["count", "sum", "avg"] },
835
+ "count_mode": { "enum": ["rows", "non_null"] },
836
+ "column": { "$ref": "#/$defs/identifier" },
837
+ "selection": {
838
+ "type": "object",
839
+ "additionalProperties": false,
840
+ "required": ["all"],
841
+ "properties": {
842
+ "all": {
843
+ "type": "array",
844
+ "minItems": 1,
845
+ "maxItems": 8,
846
+ "items": {
847
+ "type": "object",
848
+ "additionalProperties": false,
849
+ "required": ["column", "operator", "value"],
850
+ "properties": {
851
+ "column": { "$ref": "#/$defs/identifier" },
852
+ "operator": { "const": "eq" },
853
+ "value": { "$ref": "#/$defs/scalar" }
854
+ }
855
+ }
856
+ }
857
+ }
858
+ },
859
+ "minimum_group_size": { "type": "integer", "minimum": 2, "maximum": 1000000 }
860
+ }
861
+ },
774
862
  "numeric_bound": {
775
863
  "type": "object",
776
864
  "additionalProperties": false,
@@ -49,6 +49,7 @@
49
49
  }
50
50
  },
51
51
  "tenant_guard": { "$ref": "#/$defs/columnValue" },
52
+ "principal_scope": { "$ref": "#/$defs/principalScope" },
52
53
  "allowed_columns": {
53
54
  "type": "array",
54
55
  "items": { "$ref": "#/$defs/safeIdentifier" },
@@ -116,6 +117,19 @@
116
117
  "column": { "$ref": "#/$defs/safeIdentifier" },
117
118
  "value": { "$ref": "#/$defs/scalar" }
118
119
  }
120
+ },
121
+ "principalScope": {
122
+ "type": "object",
123
+ "additionalProperties": false,
124
+ "required": ["schema_version", "column", "binding", "provider", "value_fingerprint"],
125
+ "properties": {
126
+ "schema_version": { "const": "synapsor.principal-scope.v1" },
127
+ "column": { "$ref": "#/$defs/safeIdentifier" },
128
+ "binding": { "$ref": "#/$defs/safeIdentifier" },
129
+ "provider": { "enum": ["environment", "http_claims", "cloud_session", "static_dev"] },
130
+ "value_fingerprint": { "type": "string", "pattern": "^sha256:.+" },
131
+ "value": { "$ref": "#/$defs/scalar" }
132
+ }
119
133
  }
120
134
  }
121
135
  }
@@ -54,6 +54,7 @@
54
54
  }
55
55
  },
56
56
  "tenant_guard": { "$ref": "#/$defs/columnValue" },
57
+ "principal_scope": { "$ref": "#/$defs/principalScope" },
57
58
  "allowed_columns": {
58
59
  "type": "array",
59
60
  "items": { "$ref": "#/$defs/safeIdentifier" },
@@ -173,6 +174,19 @@
173
174
  "value": { "$ref": "#/$defs/scalar" }
174
175
  }
175
176
  },
177
+ "principalScope": {
178
+ "type": "object",
179
+ "additionalProperties": false,
180
+ "required": ["schema_version", "column", "binding", "provider", "value_fingerprint"],
181
+ "properties": {
182
+ "schema_version": { "const": "synapsor.principal-scope.v1" },
183
+ "column": { "$ref": "#/$defs/safeIdentifier" },
184
+ "binding": { "$ref": "#/$defs/safeIdentifier" },
185
+ "provider": { "enum": ["environment", "http_claims", "cloud_session", "static_dev"] },
186
+ "value_fingerprint": { "$ref": "#/$defs/sha256" },
187
+ "value": { "$ref": "#/$defs/scalar" }
188
+ }
189
+ },
176
190
  "conflictGuard": {
177
191
  "oneOf": [
178
192
  {
@@ -16,6 +16,7 @@
16
16
  "operation": { "enum": ["set_update", "set_delete", "batch_insert"] },
17
17
  "target": { "type": "object", "additionalProperties": false, "required": ["schema", "table", "primary_key"], "properties": { "schema": { "$ref": "#/$defs/safeIdentifier" }, "table": { "$ref": "#/$defs/safeIdentifier" }, "primary_key": { "type": "object", "additionalProperties": false, "required": ["column"], "properties": { "column": { "$ref": "#/$defs/safeIdentifier" } } } } },
18
18
  "tenant_guard": { "$ref": "#/$defs/columnValue" },
19
+ "principal_scope": { "$ref": "#/$defs/principalScope" },
19
20
  "allowed_columns": { "type": "array", "items": { "$ref": "#/$defs/safeIdentifier" }, "maxItems": 256, "uniqueItems": true },
20
21
  "patch": { "$ref": "#/$defs/scalarRecord" },
21
22
  "version_advance": { "$ref": "#/$defs/versionAdvance" },
@@ -43,6 +44,7 @@
43
44
  "scalar": { "type": ["string", "number", "boolean", "null"] },
44
45
  "scalarRecord": { "type": "object", "propertyNames": { "$ref": "#/$defs/safeIdentifier" }, "additionalProperties": { "$ref": "#/$defs/scalar" }, "maxProperties": 256 },
45
46
  "columnValue": { "type": "object", "additionalProperties": false, "required": ["column", "value"], "properties": { "column": { "$ref": "#/$defs/safeIdentifier" }, "value": { "$ref": "#/$defs/scalar" } } },
47
+ "principalScope": { "type": "object", "additionalProperties": false, "required": ["schema_version", "column", "binding", "provider", "value_fingerprint"], "properties": { "schema_version": { "const": "synapsor.principal-scope.v1" }, "column": { "$ref": "#/$defs/safeIdentifier" }, "binding": { "$ref": "#/$defs/safeIdentifier" }, "provider": { "enum": ["environment", "http_claims", "cloud_session", "static_dev"] }, "value_fingerprint": { "$ref": "#/$defs/sha256" }, "value": { "$ref": "#/$defs/scalar" } } },
46
48
  "versionAdvance": { "type": "object", "additionalProperties": false, "required": ["column", "strategy"], "properties": { "column": { "$ref": "#/$defs/safeIdentifier" }, "strategy": { "enum": ["integer_increment", "database_generated"] } } },
47
49
  "deduplicationComponent": { "type": "object", "additionalProperties": false, "required": ["column", "value", "source"], "properties": { "column": { "$ref": "#/$defs/safeIdentifier" }, "value": { "$ref": "#/$defs/scalar" }, "source": { "enum": ["proposal_id", "trusted_tenant", "fixed"] } } },
48
50
  "deduplication": { "type": "object", "additionalProperties": false, "required": ["components"], "properties": { "components": { "type": "array", "items": { "$ref": "#/$defs/deduplicationComponent" }, "minItems": 1, "maxItems": 8 } } },
@@ -9,9 +9,9 @@
9
9
  "runner_scope": { "type": "object", "additionalProperties": false, "required": ["project_id", "source_id"], "properties": { "project_id": { "type": "string", "minLength": 1 }, "source_id": { "type": "string", "minLength": 1 } } },
10
10
  "engine": { "enum": ["postgres", "mysql"] }, "operation": { "enum": ["restore_update", "remove_insert", "restore_insert"] },
11
11
  "target": { "type": "object", "additionalProperties": false, "required": ["schema", "table", "primary_key"], "properties": { "schema": { "$ref": "#/$defs/identifier" }, "table": { "$ref": "#/$defs/identifier" }, "primary_key": { "type": "object", "additionalProperties": false, "required": ["column"], "properties": { "column": { "$ref": "#/$defs/identifier" }, "value": { "$ref": "#/$defs/scalar" } } } } },
12
- "tenant_guard": { "$ref": "#/$defs/columnValue" }, "allowed_columns": { "type": "array", "items": { "$ref": "#/$defs/identifier" }, "maxItems": 256, "uniqueItems": true }, "patch": { "type": "object", "maxProperties": 0 },
12
+ "tenant_guard": { "$ref": "#/$defs/columnValue" }, "principal_scope": { "$ref": "#/$defs/principalScope" }, "allowed_columns": { "type": "array", "items": { "$ref": "#/$defs/identifier" }, "maxItems": 256, "uniqueItems": true }, "patch": { "type": "object", "maxProperties": 0 },
13
13
  "compensation": { "$ref": "inverse-descriptor.v1.schema.json" }, "forward_receipt_hash": { "$ref": "#/$defs/sha256" }, "idempotency_key": { "type": "string", "minLength": 1 },
14
14
  "lease": { "type": "object", "additionalProperties": false, "required": ["lease_id", "attempt", "expires_at"], "properties": { "lease_id": { "type": "string", "minLength": 1 }, "attempt": { "type": "integer", "minimum": 1 }, "expires_at": { "type": "string", "format": "date-time" } } }
15
15
  },
16
- "$defs": { "identifier": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" }, "sha256": { "type": "string", "pattern": "^sha256:.+" }, "scalar": { "type": ["string", "number", "boolean", "null"] }, "columnValue": { "type": "object", "additionalProperties": false, "required": ["column", "value"], "properties": { "column": { "$ref": "#/$defs/identifier" }, "value": { "$ref": "#/$defs/scalar" } } } }
16
+ "$defs": { "identifier": { "type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_]*$" }, "sha256": { "type": "string", "pattern": "^sha256:.+" }, "scalar": { "type": ["string", "number", "boolean", "null"] }, "columnValue": { "type": "object", "additionalProperties": false, "required": ["column", "value"], "properties": { "column": { "$ref": "#/$defs/identifier" }, "value": { "$ref": "#/$defs/scalar" } } }, "principalScope": { "type": "object", "additionalProperties": false, "required": ["schema_version", "column", "binding", "provider", "value_fingerprint"], "properties": { "schema_version": { "const": "synapsor.principal-scope.v1" }, "column": { "$ref": "#/$defs/identifier" }, "binding": { "$ref": "#/$defs/identifier" }, "provider": { "enum": ["environment", "http_claims", "cloud_session", "static_dev"] }, "value_fingerprint": { "$ref": "#/$defs/sha256" }, "value": { "$ref": "#/$defs/scalar" } } } }
17
17
  }