@openwop/spec-artifacts 2.0.0-rc.37 → 2.0.0-rc.6
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/CORPUS-STAMP.json +32 -34
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +10 -9
- package/package.json +5 -18
- package/schemas/capabilities.schema.json +1 -40
- package/schemas/certification-bundle-v2.schema.json +27 -119
- package/schemas/run-snapshot.schema.json +33 -103
- package/schemas/v2/agent-deployment-transition.schema.json +6 -5
- package/schemas/v2/agent-deployment.schema.json +9 -8
- package/schemas/v2/agent-eval-suite.schema.json +12 -11
- package/schemas/v2/artifact-type-pack-manifest.schema.json +18 -22
- package/schemas/v2/capabilities.schema.json +0 -39
- package/schemas/v2/certification-bundle.schema.json +1 -1
- package/schemas/v2/chat-card-pack-manifest.schema.json +15 -19
- package/schemas/v2/debug-bundle.schema.json +6 -6
- package/schemas/v2/eval-summary.schema.json +10 -17
- package/schemas/v2/goal.schema.json +5 -5
- package/schemas/v2/ids.schema.json +22 -120
- package/schemas/v2/node-pack-manifest.schema.json +31 -27
- package/schemas/v2/proposal.schema.json +8 -7
- package/schemas/v2/run-event-payloads.schema.json +242 -246
- package/schemas/v2/run-event.schema.json +126 -2
- package/schemas/v2/run-snapshot.schema.json +13 -34
- package/schemas/v2/workflow-chain-pack-manifest.schema.json +45 -41
- package/schemas/v2/workflow-definition.schema.json +36 -31
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/deprecations.json +67 -79
- package/spec/v1/deprecations.schema.json +7 -23
- package/spec/v1/extensions.json +2 -3
- package/spec/v2/declaration.json +0 -7
- package/spec/v2/release.json +2 -2
- package/schemas/v2/webhook-delivery.schema.json +0 -26
- package/spec/v2/id-field-bindings.json +0 -104
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/node-pack-manifest.schema.json",
|
|
4
4
|
"title": "NodePackManifest",
|
|
5
|
-
"description": "Manifest for a published OpenWOP node pack
|
|
5
|
+
"description": "Manifest for a published OpenWOP node pack — `pack.json` at the pack root. Language-neutral. See node-packs.md for the canonical contract.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"engines",
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
"kind": {
|
|
40
40
|
"type": "string",
|
|
41
41
|
"const": "node",
|
|
42
|
-
"description": "Pack kind discriminator. For node packs (the default and original kind) `kind` is either omitted entirely OR set to the literal string `\"node\"`. Manifests carrying `kind: \"workflow-chain\"` validate against `workflow-chain-pack-manifest.schema.json` instead
|
|
42
|
+
"description": "Pack kind discriminator. For node packs (the default and original kind) `kind` is either omitted entirely OR set to the literal string `\"node\"`. Manifests carrying `kind: \"workflow-chain\"` validate against `workflow-chain-pack-manifest.schema.json` instead — see workflow-chain-packs.md and RFC 0013."
|
|
43
43
|
},
|
|
44
44
|
"name": {
|
|
45
45
|
"type": "string",
|
|
46
|
-
"description": "Reverse-DNS pack name. Reserved scopes: `core.*` (spec-canonical), `vendor.<org>.*` (vendor-published), `community.<author>.*` (individual), `private.<host>.*` (host-internal
|
|
46
|
+
"description": "Reverse-DNS pack name. Reserved scopes: `core.*` (spec-canonical), `vendor.<org>.*` (vendor-published), `community.<author>.*` (individual), `private.<host>.*` (host-internal — MUST NOT appear in `packs.openwop.dev`). `local.*` is for in-repo unpublished packs and MUST NOT appear in any registry. See node-packs.md §Naming for the full reservation table.",
|
|
47
47
|
"pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$",
|
|
48
48
|
"minLength": 1,
|
|
49
49
|
"maxLength": 256
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"openwop": {
|
|
91
91
|
"type": "string",
|
|
92
92
|
"pattern": "^>=\\d+(\\.\\d+){0,2} <\\d+\\.0\\.0$",
|
|
93
|
-
"description": "RFC 0177
|
|
93
|
+
"description": "RFC 0177 §A.1 — explicit upper bound required."
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
},
|
|
@@ -99,18 +99,18 @@
|
|
|
99
99
|
"additionalProperties": {
|
|
100
100
|
"type": "string"
|
|
101
101
|
},
|
|
102
|
-
"description": "Other node packs this pack depends on. Map of pack name
|
|
102
|
+
"description": "Other node packs this pack depends on. Map of pack name → semver range. Engine resolves transitively at workflow-register time."
|
|
103
103
|
},
|
|
104
104
|
"peerDependencies": {
|
|
105
105
|
"type": "object",
|
|
106
106
|
"additionalProperties": {
|
|
107
107
|
"type": "string"
|
|
108
108
|
},
|
|
109
|
-
"description": "Engine-supplied capabilities the pack consumes (e.g., a particular AI provider extension). Resolved against `Capabilities` at register time. Each entry is REQUIRED by default
|
|
109
|
+
"description": "Engine-supplied capabilities the pack consumes (e.g., a particular AI provider extension). Resolved against `Capabilities` at register time. Each entry is REQUIRED by default — an unmet entry fails install with `pack_peer_dependency_missing` — unless marked optional in `peerDependenciesMeta` (RFC 0072 §C)."
|
|
110
110
|
},
|
|
111
111
|
"peerDependenciesMeta": {
|
|
112
112
|
"type": "object",
|
|
113
|
-
"description": "Per-peer-dependency metadata (RFC 0072
|
|
113
|
+
"description": "Per-peer-dependency metadata (RFC 0072 §C). Keys mirror `peerDependencies` keys. Marking an entry `optional: true` makes it degrade-if-unmet instead of refuse-if-unmet: a host that does not satisfy it MUST install the pack with that capability inert AND surface it in the affected agents' inventory `degraded[]` (RFC 0072 §A); it MUST NOT silently ignore the declared dependency. Default (absent entry) is required. Packs published before RFC 0072 validate unchanged.",
|
|
114
114
|
"additionalProperties": {
|
|
115
115
|
"type": "object",
|
|
116
116
|
"additionalProperties": false,
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
"type": "string",
|
|
129
129
|
"pattern": "^[a-z][A-Za-z0-9]*$"
|
|
130
130
|
},
|
|
131
|
-
"description": "Facets of the peer family the pack needs (packs.md
|
|
131
|
+
"description": "Facets of the peer family the pack needs (packs.md §Peer dependencies; RFC 0177 §B.1). Each MUST be a facet the declaration file lists for that family; the family key alone means the family's presence."
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
134
|
}
|
|
@@ -138,14 +138,14 @@
|
|
|
138
138
|
"items": {
|
|
139
139
|
"$ref": "#/$defs/PackNode"
|
|
140
140
|
},
|
|
141
|
-
"description": "Node typeIds the pack contributes. Each MUST have a unique `typeId` within the pack. A pack MAY omit `nodes` entirely if it ships only `agents[]`
|
|
141
|
+
"description": "Node typeIds the pack contributes. Each MUST have a unique `typeId` within the pack. A pack MAY omit `nodes` entirely if it ships only `agents[]` — the top-level `anyOf` constraint requires at least one of `nodes` or `agents` to be non-empty."
|
|
142
142
|
},
|
|
143
143
|
"agents": {
|
|
144
144
|
"type": "array",
|
|
145
145
|
"items": {
|
|
146
146
|
"$ref": "agent-manifest.schema.json"
|
|
147
147
|
},
|
|
148
|
-
"description": "Optional agent manifests shipped alongside this pack. Each entry is an AgentManifest (see agent-manifest.schema.json + RFC 0003
|
|
148
|
+
"description": "Optional agent manifests shipped alongside this pack. Each entry is an AgentManifest (see agent-manifest.schema.json + RFC 0003 §`agents[]` extension). Pure-agent packs MUST set `runtime.language: 'remote'` — agents are interpreted by the host, not bundled as executable artifacts. Mixed packs (nodes + agents) declare the runtime that loads the node implementations; agents remain host-interpreted."
|
|
149
149
|
},
|
|
150
150
|
"runtime": {
|
|
151
151
|
"$ref": "#/$defs/Runtime"
|
|
@@ -169,12 +169,15 @@
|
|
|
169
169
|
],
|
|
170
170
|
"properties": {
|
|
171
171
|
"typeId": {
|
|
172
|
-
"
|
|
173
|
-
"description": "Canonical node type ID. MUST match the same pattern as `WorkflowNode.typeId` in workflow-definition.schema.json. The pack's `name` prefix is recommended (e.g., a pack `vendor.acme.salesforce-tools` exposing `vendor.acme.salesforce.upsert`)."
|
|
172
|
+
"type": "string",
|
|
173
|
+
"description": "Canonical node type ID. MUST match the same pattern as `WorkflowNode.typeId` in workflow-definition.schema.json. The pack's `name` prefix is recommended (e.g., a pack `vendor.acme.salesforce-tools` exposing `vendor.acme.salesforce.upsert`).",
|
|
174
|
+
"pattern": "^[a-z][a-zA-Z0-9._-]*$",
|
|
175
|
+
"minLength": 1,
|
|
176
|
+
"maxLength": 256
|
|
174
177
|
},
|
|
175
178
|
"version": {
|
|
176
179
|
"type": "string",
|
|
177
|
-
"description": "Per-node semver. MAY differ from the pack's overall version
|
|
180
|
+
"description": "Per-node semver. MAY differ from the pack's overall version — useful when a single pack ships multiple nodes that evolve independently."
|
|
178
181
|
},
|
|
179
182
|
"label": {
|
|
180
183
|
"type": "string",
|
|
@@ -233,7 +236,7 @@
|
|
|
233
236
|
"sensitive": {
|
|
234
237
|
"type": "boolean",
|
|
235
238
|
"default": false,
|
|
236
|
-
"description": "When true, the engine masks this output port's value in `node.completed` event payloads. Use when a NodeModule ALWAYS handles sensitive data (e.g., a Salesforce upsert always touches PII). Workflows MAY override per-instance via `WorkflowNode.outputSensitivity`. See observability.md
|
|
239
|
+
"description": "When true, the engine masks this output port's value in `node.completed` event payloads. Use when a NodeModule ALWAYS handles sensitive data (e.g., a Salesforce upsert always touches PII). Workflows MAY override per-instance via `WorkflowNode.outputSensitivity`. See observability.md §Privacy classification (closes O5)."
|
|
237
240
|
}
|
|
238
241
|
},
|
|
239
242
|
"additionalProperties": false
|
|
@@ -248,7 +251,7 @@
|
|
|
248
251
|
"type": "object",
|
|
249
252
|
"properties": {
|
|
250
253
|
"typeId": {
|
|
251
|
-
"
|
|
254
|
+
"type": "string"
|
|
252
255
|
},
|
|
253
256
|
"syncOn": {
|
|
254
257
|
"type": "string",
|
|
@@ -302,7 +305,7 @@
|
|
|
302
305
|
},
|
|
303
306
|
"uniqueItems": true,
|
|
304
307
|
"maxItems": 32,
|
|
305
|
-
"description": "RFC 0031
|
|
308
|
+
"description": "RFC 0031 §B. Model capabilities this NodeModule requires the active model to advertise in `capabilities.modelCapabilities.advertised[]`. Distinct from `requires`, which gates on HOST capabilities (`capabilities.runtimeCapabilities[]`) — this field gates on MODEL capabilities. Spec-reserved identifiers: `structured-output`, `discriminator-enum`, `long-context`, `reasoning` (model-native thinking-tokens), `function-calling`. Host-private extensions MUST prefix with `x-host-<host>-` per `host-extensions.md` §\"Canonical-prefix table\". Empty array (or absent field) means no model-capability requirements. When the active model does not satisfy the declared set, the host MUST follow the dispatch flow in RFC 0031 §B: substitute to `fallbackModel` (emit `model.capability.substituted`) or refuse (emit `model.capability.insufficient` + terminate with `capability_not_provided`)."
|
|
306
309
|
},
|
|
307
310
|
"fallbackModel": {
|
|
308
311
|
"type": "object",
|
|
@@ -311,7 +314,7 @@
|
|
|
311
314
|
"provider",
|
|
312
315
|
"model"
|
|
313
316
|
],
|
|
314
|
-
"description": "RFC 0031
|
|
317
|
+
"description": "RFC 0031 §B. Substitute model coordinates the host MAY use if the active model lacks the declared `requiredModelCapabilities`. When the host substitutes, it MUST emit `model.capability.substituted` per RFC 0031 §D. Absent means no substitution permitted; the host MUST refuse to dispatch with `capability_not_provided` when capabilities are unmet. The fallback is single-shot — if the fallback itself fails capability checks or authentication, the host emits `model.capability.insufficient` with `fallbackAttempted: true` and refuses (no recursive fallback chains per RFC 0031 §\"Unresolved questions\" #3).",
|
|
315
318
|
"properties": {
|
|
316
319
|
"provider": {
|
|
317
320
|
"type": "string",
|
|
@@ -329,7 +332,7 @@
|
|
|
329
332
|
"additionalProperties": false,
|
|
330
333
|
"patternProperties": {
|
|
331
334
|
"^(openwop-|x-|vendor\\.)": {
|
|
332
|
-
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md`
|
|
335
|
+
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md` §\"Vendor-prefixed namespaces\", which requires a client receiving an unknown vendor-prefixed field to treat it as opaque — a field that `additionalProperties: false` previously made impossible to carry. SECURITY: an extension value is PACK-AUTHORED, therefore untrusted; \"ignore\" means ignore. See `node-packs.md` §\"Vendor extensions on pack manifests\" and the `pack-manifest-extension-opaque` invariant."
|
|
333
336
|
}
|
|
334
337
|
}
|
|
335
338
|
},
|
|
@@ -475,7 +478,7 @@
|
|
|
475
478
|
"id",
|
|
476
479
|
"displayName"
|
|
477
480
|
],
|
|
478
|
-
"description": "RFC 0045. Declares this pack a named connector
|
|
481
|
+
"description": "RFC 0045. Declares this pack a named connector — a typed integration exposing actions (and reusing the existing trigger model). Optional; packs without it remain plain node packs. Actions are normal side-effectful nodes from this pack's `nodes[]` annotated with scheduler hints; the connector block adds metadata, not a new execution kind.",
|
|
479
482
|
"properties": {
|
|
480
483
|
"id": {
|
|
481
484
|
"type": "string",
|
|
@@ -501,7 +504,8 @@
|
|
|
501
504
|
],
|
|
502
505
|
"properties": {
|
|
503
506
|
"typeId": {
|
|
504
|
-
"
|
|
507
|
+
"type": "string",
|
|
508
|
+
"minLength": 1,
|
|
505
509
|
"description": "MUST match a `nodes[].typeId` in this manifest."
|
|
506
510
|
},
|
|
507
511
|
"displayName": {
|
|
@@ -510,7 +514,7 @@
|
|
|
510
514
|
},
|
|
511
515
|
"idempotent": {
|
|
512
516
|
"type": "boolean",
|
|
513
|
-
"description": "Action is safe to auto-retry without an idempotency key. Absent/false
|
|
517
|
+
"description": "Action is safe to auto-retry without an idempotency key. Absent/false ⇒ the host MUST NOT auto-retry without one (composes with idempotency.md)."
|
|
514
518
|
},
|
|
515
519
|
"rateLimit": {
|
|
516
520
|
"type": "object",
|
|
@@ -563,7 +567,7 @@
|
|
|
563
567
|
"wasm-component",
|
|
564
568
|
"remote"
|
|
565
569
|
],
|
|
566
|
-
"description": "How the engine loads the pack. See node-packs.md
|
|
570
|
+
"description": "How the engine loads the pack. See node-packs.md §runtime formats. `wasm` is the core-module WASM ABI (RFC 0008). `wasm-component` is the WASM Component Model variant (WIT-defined interfaces); hosts that advertise `capabilities.nodePackRuntimes.wasmComponent.supported: true` load it via wasmtime / wasmer Component Model runtimes. Both share the openwop ABI envelope; the wasm-component variant uses WIT interfaces instead of hand-rolled imports/exports."
|
|
567
571
|
},
|
|
568
572
|
"entry": {
|
|
569
573
|
"type": "string",
|
|
@@ -589,7 +593,7 @@
|
|
|
589
593
|
"requires": {
|
|
590
594
|
"type": "array",
|
|
591
595
|
"uniqueItems": true,
|
|
592
|
-
"description": "RFC 0076. Abstract platform primitives the pack's runtime code exercises, for install-time sandbox gating. Runtime-agnostic (not language builtin names). Absent or []
|
|
596
|
+
"description": "RFC 0076. Abstract platform primitives the pack's runtime code exercises, for install-time sandbox gating. Runtime-agnostic (not language builtin names). Absent or [] ⇒ no elevated platform needs. A sandbox host MUST evaluate this at install time and refuse (`pack_runtime_requirement_unmet`) any primitive it will not grant; see node-packs.md §\"Runtime platform requirements\".",
|
|
593
597
|
"items": {
|
|
594
598
|
"oneOf": [
|
|
595
599
|
{
|
|
@@ -622,7 +626,7 @@
|
|
|
622
626
|
},
|
|
623
627
|
{
|
|
624
628
|
"const": "clock",
|
|
625
|
-
"description": "Reads wall-clock time as a behavioral input
|
|
629
|
+
"description": "Reads wall-clock time as a behavioral input — gated for REPLAY determinism, not access control. A pack that branches on the clock is non-deterministic on replay (replay.md)."
|
|
626
630
|
}
|
|
627
631
|
]
|
|
628
632
|
}
|
|
@@ -632,7 +636,7 @@
|
|
|
632
636
|
},
|
|
633
637
|
"Signing": {
|
|
634
638
|
"type": "object",
|
|
635
|
-
"description": "Optional signing metadata. See node-packs.md
|
|
639
|
+
"description": "Optional signing metadata. See node-packs.md §signing.",
|
|
636
640
|
"properties": {
|
|
637
641
|
"publicKeyRef": {
|
|
638
642
|
"type": "string",
|
|
@@ -656,8 +660,8 @@
|
|
|
656
660
|
},
|
|
657
661
|
"patternProperties": {
|
|
658
662
|
"^(openwop-|x-|vendor\\.)": {
|
|
659
|
-
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md`
|
|
663
|
+
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md` §\"Vendor-prefixed namespaces\", which requires a client receiving an unknown vendor-prefixed field to treat it as opaque — a field that `additionalProperties: false` previously made impossible to carry. SECURITY: an extension value is PACK-AUTHORED, therefore untrusted; \"ignore\" means ignore. See `node-packs.md` §\"Vendor extensions on pack manifests\" and the `pack-manifest-extension-opaque` invariant."
|
|
660
664
|
}
|
|
661
665
|
},
|
|
662
|
-
"x-openwop-anyOf-note": "constraint fragments (kind-conditional requirements)
|
|
666
|
+
"x-openwop-anyOf-note": "constraint fragments (kind-conditional requirements) — closure is the root's"
|
|
663
667
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/proposal.schema.json",
|
|
4
4
|
"title": "Proposal",
|
|
5
|
-
"description": "RFC 0096
|
|
5
|
+
"description": "RFC 0096 §B. A reviewable-learning proposal — an INERT, draft-state reusable artifact (skill/pack/template/automation) the host synthesized from run/tool traces, that MUST NOT influence the resolution, planning, or execution of any run while in any state other than `applied`. Activation is delegated to RFC 0051 approval-gate or RFC 0049 RBAC (no new authorization path). On `apply` the installed artifact MUST byte-match the last-persisted `artifact` (no silent re-synthesis). `rationale` and `provenance.sourceRunIds` are SR-1 redaction-safe (no secrets/PII). Gated on the `agents.proposals` capability.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -47,12 +47,12 @@
|
|
|
47
47
|
},
|
|
48
48
|
"rationale": {
|
|
49
49
|
"type": "string",
|
|
50
|
-
"description": "Plain-language justification. SR-1 redaction-safe
|
|
50
|
+
"description": "Plain-language justification. SR-1 redaction-safe — no secrets/PII."
|
|
51
51
|
},
|
|
52
52
|
"artifact": {
|
|
53
53
|
"type": "object",
|
|
54
|
-
"description": "The proposed artifact, shaped by `kind` (an RFC 0003 pack manifest, an RFC 0013 chain pack, an RFC 0027 template, an RFC 0052 job spec). Inert until applied. Deliberately open (`additionalProperties` not constrained here) because the payload conforms to the kind's own existing schema, validated by the host at `apply` (malformed-for-kind
|
|
55
|
-
"$comment": "Intentionally open object
|
|
54
|
+
"description": "The proposed artifact, shaped by `kind` (an RFC 0003 pack manifest, an RFC 0013 chain pack, an RFC 0027 template, an RFC 0052 job spec). Inert until applied. Deliberately open (`additionalProperties` not constrained here) because the payload conforms to the kind's own existing schema, validated by the host at `apply` (malformed-for-kind ⇒ 422).",
|
|
55
|
+
"$comment": "Intentionally open object — the artifact body is validated against the kind's own schema, not this envelope.",
|
|
56
56
|
"additionalProperties": true
|
|
57
57
|
},
|
|
58
58
|
"provenance": {
|
|
@@ -66,7 +66,8 @@
|
|
|
66
66
|
"sourceRunIds": {
|
|
67
67
|
"type": "array",
|
|
68
68
|
"items": {
|
|
69
|
-
"
|
|
69
|
+
"type": "string",
|
|
70
|
+
"minLength": 1
|
|
70
71
|
},
|
|
71
72
|
"description": "Runs whose traces produced this proposal (RFC 0040 causation-compatible). SR-1 redaction-safe."
|
|
72
73
|
},
|
|
@@ -90,7 +91,7 @@
|
|
|
90
91
|
"required": [
|
|
91
92
|
"tenant"
|
|
92
93
|
],
|
|
93
|
-
"description": "RFC 0048 identity triple that owns this proposal. Redaction-safe
|
|
94
|
+
"description": "RFC 0048 identity triple that owns this proposal. Redaction-safe — `principal` is an opaque id, never PII or credential material. Single-tenant hosts populate at least `tenant`.",
|
|
94
95
|
"properties": {
|
|
95
96
|
"tenant": {
|
|
96
97
|
"type": "string",
|
|
@@ -105,7 +106,7 @@
|
|
|
105
106
|
"principal": {
|
|
106
107
|
"type": "string",
|
|
107
108
|
"minLength": 1,
|
|
108
|
-
"description": "Acting identity (user or agent)
|
|
109
|
+
"description": "Acting identity (user or agent) — opaque id, never PII."
|
|
109
110
|
}
|
|
110
111
|
}
|
|
111
112
|
},
|