@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.
- package/CHANGELOG.md +65 -0
- package/README.md +63 -60
- package/THREAT_MODEL.md +6 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/runner.mjs +29227 -2475
- package/docs/README.md +11 -0
- package/docs/aggregate-reads.md +49 -0
- package/docs/bounded-set-writeback.md +9 -4
- package/docs/capability-authoring.md +43 -1
- package/docs/cloud-cli.md +248 -0
- package/docs/cloud-mode.md +88 -6
- package/docs/cloud-push.md +22 -5
- package/docs/compliance-reports.md +42 -0
- package/docs/conformance.md +15 -0
- package/docs/contract-review.md +57 -0
- package/docs/contract-testing.md +76 -0
- package/docs/dsl-reference.md +50 -6
- package/docs/graduated-trust.md +64 -0
- package/docs/hosted-cloud-linked-verification.md +97 -0
- package/docs/limitations.md +10 -0
- package/docs/oss-vs-cloud.md +13 -6
- package/docs/release-notes.md +65 -0
- package/docs/rfcs/007-trusted-principal-row-scope.md +75 -0
- package/docs/runner-bundles.md +24 -0
- package/docs/runner-config-reference.md +16 -0
- package/docs/running-a-runner-fleet.md +8 -0
- package/docs/security-boundary.md +28 -1
- package/examples/runner-fleet/seed/mysql.sql +5 -1
- package/examples/runner-fleet/seed/postgres.sql +5 -1
- package/examples/support-plan-credit/README.md +8 -6
- package/examples/support-plan-credit/synapsor.contract-tests.json +53 -0
- package/fixtures/dsl/aggregate-read.synapsor.sql +21 -0
- package/fixtures/dsl/bounded-set-multi-term.synapsor.sql +30 -0
- package/fixtures/dsl/principal-row-scope.synapsor.sql +23 -0
- package/fixtures/protocol/MANIFEST.json +10 -10
- package/package.json +4 -1
- package/schemas/change-set.v1.schema.json +14 -0
- package/schemas/change-set.v2.schema.json +14 -0
- package/schemas/change-set.v3.schema.json +2 -0
- package/schemas/compensation-change-set.v1.schema.json +3 -2
- package/schemas/inverse-descriptor.v1.schema.json +2 -0
- package/schemas/synapsor.contract-tests.schema.json +54 -0
- package/schemas/synapsor.runner.schema.json +92 -4
- package/schemas/writeback-job.v1.schema.json +14 -0
- package/schemas/writeback-job.v2.schema.json +14 -0
- package/schemas/writeback-job.v3.schema.json +2 -0
- 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"
|
|
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":
|
|
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":
|
|
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
|
}
|