@logicsrc/schemas 0.1.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/README.md +34 -0
- package/fixtures/agent.yaml +20 -0
- package/fixtures/agentad-ad.yaml +33 -0
- package/fixtures/agentad-placement.yaml +21 -0
- package/fixtures/opencontext/conformance.json +279 -0
- package/fixtures/opencontext/invalid/audit-event-missing-actor.json +5 -0
- package/fixtures/opencontext/invalid/audit-event-unknown-event.json +9 -0
- package/fixtures/opencontext/invalid/bundle-bad-digest.json +11 -0
- package/fixtures/opencontext/invalid/bundle-bad-id.json +11 -0
- package/fixtures/opencontext/invalid/bundle-missing-digest.json +10 -0
- package/fixtures/opencontext/invalid/bundle-unknown-exclusion-reason.json +17 -0
- package/fixtures/opencontext/invalid/decision-bad-status.json +7 -0
- package/fixtures/opencontext/invalid/decision-missing-decision.json +5 -0
- package/fixtures/opencontext/invalid/decision-wrong-type.json +6 -0
- package/fixtures/opencontext/invalid/diagnostic-missing-ok.json +4 -0
- package/fixtures/opencontext/invalid/diagnostic-unknown-code.json +11 -0
- package/fixtures/opencontext/invalid/manifest-bad-authority.json +10 -0
- package/fixtures/opencontext/invalid/manifest-bad-extension.json +9 -0
- package/fixtures/opencontext/invalid/manifest-bad-id.json +4 -0
- package/fixtures/opencontext/invalid/manifest-bad-ttl.json +7 -0
- package/fixtures/opencontext/invalid/manifest-missing-version.json +3 -0
- package/fixtures/opencontext/invalid/manifest-role-bad-pattern.json +11 -0
- package/fixtures/opencontext/invalid/manifest-unknown-key.json +5 -0
- package/fixtures/opencontext/invalid/object-bad-digest.json +10 -0
- package/fixtures/opencontext/invalid/object-bad-id.json +4 -0
- package/fixtures/opencontext/invalid/object-bad-layer.json +5 -0
- package/fixtures/opencontext/invalid/object-bad-redaction-mode.json +10 -0
- package/fixtures/opencontext/invalid/object-bad-supersedes.json +7 -0
- package/fixtures/opencontext/invalid/object-confidence-out-of-range.json +5 -0
- package/fixtures/opencontext/invalid/object-extra-property.json +5 -0
- package/fixtures/opencontext/invalid/object-missing-id.json +3 -0
- package/fixtures/opencontext/invalid/object-missing-type.json +3 -0
- package/fixtures/opencontext/invalid/object-source-without-uri.json +9 -0
- package/fixtures/opencontext/invalid/object-unknown-authority.json +5 -0
- package/fixtures/opencontext/invalid/object-unknown-classification.json +5 -0
- package/fixtures/opencontext/invalid/object-unknown-trust.json +5 -0
- package/fixtures/opencontext/invalid/provenance-canonical-false.json +4 -0
- package/fixtures/opencontext/invalid/provenance-no-source.json +3 -0
- package/fixtures/opencontext/invalid/role-bad-classification.json +4 -0
- package/fixtures/opencontext/invalid/role-bad-include.json +6 -0
- package/fixtures/opencontext/invalid-manifest.json +177 -0
- package/fixtures/opencontext/resolution/authority-conflict/context/policies/refunds-observed.md +10 -0
- package/fixtures/opencontext/resolution/authority-conflict/context/policies/refunds.md +12 -0
- package/fixtures/opencontext/resolution/authority-conflict/expected.json +21 -0
- package/fixtures/opencontext/resolution/authority-conflict/opencontext.yaml +11 -0
- package/fixtures/opencontext/resolution/classification-ceiling/context/docs/handbook.md +11 -0
- package/fixtures/opencontext/resolution/classification-ceiling/context/docs/litigation.md +11 -0
- package/fixtures/opencontext/resolution/classification-ceiling/expected.json +32 -0
- package/fixtures/opencontext/resolution/classification-ceiling/opencontext.yaml +16 -0
- package/fixtures/opencontext/resolution/deny-overrides-allow/context/mission.md +10 -0
- package/fixtures/opencontext/resolution/deny-overrides-allow/context/policies/internal/margins.md +10 -0
- package/fixtures/opencontext/resolution/deny-overrides-allow/context/policies/refunds.md +10 -0
- package/fixtures/opencontext/resolution/deny-overrides-allow/expected.json +19 -0
- package/fixtures/opencontext/resolution/deny-overrides-allow/opencontext.yaml +17 -0
- package/fixtures/opencontext/resolution/duplicate-canonical/context/policies/refunds-rewrite.md +12 -0
- package/fixtures/opencontext/resolution/duplicate-canonical/context/policies/refunds.md +12 -0
- package/fixtures/opencontext/resolution/duplicate-canonical/expected.json +10 -0
- package/fixtures/opencontext/resolution/duplicate-canonical/opencontext.yaml +11 -0
- package/fixtures/opencontext/resolution/lifecycle/context/notes/current.md +11 -0
- package/fixtures/opencontext/resolution/lifecycle/context/notes/expired.md +12 -0
- package/fixtures/opencontext/resolution/lifecycle/context/notes/future.md +12 -0
- package/fixtures/opencontext/resolution/lifecycle/context/notes/stale.md +11 -0
- package/fixtures/opencontext/resolution/lifecycle/expected.json +30 -0
- package/fixtures/opencontext/resolution/lifecycle/opencontext.yaml +14 -0
- package/fixtures/opencontext/resolution/object-permissions/context/policies/payroll.md +12 -0
- package/fixtures/opencontext/resolution/object-permissions/context/policies/refunds.md +10 -0
- package/fixtures/opencontext/resolution/object-permissions/expected.json +32 -0
- package/fixtures/opencontext/resolution/object-permissions/opencontext.yaml +14 -0
- package/fixtures/opencontext/resolution/redaction/context/customers/acme.json +21 -0
- package/fixtures/opencontext/resolution/redaction/expected.json +28 -0
- package/fixtures/opencontext/resolution/redaction/opencontext.yaml +19 -0
- package/fixtures/opencontext/resolution/supersession/context/pricing/enterprise.v1.md +12 -0
- package/fixtures/opencontext/resolution/supersession/context/pricing/enterprise.v2.md +14 -0
- package/fixtures/opencontext/resolution/supersession/expected.json +33 -0
- package/fixtures/opencontext/resolution/supersession/opencontext.yaml +11 -0
- package/fixtures/opencontext/valid/audit-event.json +26 -0
- package/fixtures/opencontext/valid/bundle.json +67 -0
- package/fixtures/opencontext/valid/decision.json +51 -0
- package/fixtures/opencontext/valid/diagnostic.json +37 -0
- package/fixtures/opencontext/valid/manifest-minimal.json +4 -0
- package/fixtures/opencontext/valid/manifest.json +134 -0
- package/fixtures/opencontext/valid/object-minimal.json +4 -0
- package/fixtures/opencontext/valid/object-policy.json +75 -0
- package/fixtures/opencontext/valid/object-structured.json +34 -0
- package/fixtures/opencontext/valid/object-untrusted.json +19 -0
- package/fixtures/opencontext/valid/provenance-canonical.json +4 -0
- package/fixtures/opencontext/valid/provenance.json +14 -0
- package/fixtures/opencontext/valid/role.json +38 -0
- package/fixtures/openontology/conformance.json +158 -0
- package/fixtures/openontology/invalid/action-no-permissions.json +13 -0
- package/fixtures/openontology/invalid/changeset-empty-operations.json +10 -0
- package/fixtures/openontology/invalid/changeset-unknown-op.json +15 -0
- package/fixtures/openontology/invalid/claim-both-objects.json +14 -0
- package/fixtures/openontology/invalid/claim-confidence-out-of-range.json +14 -0
- package/fixtures/openontology/invalid/claim-extra-property.json +14 -0
- package/fixtures/openontology/invalid/claim-unknown-status.json +13 -0
- package/fixtures/openontology/invalid/entity-missing-canonical-name.json +8 -0
- package/fixtures/openontology/invalid/evidence-unknown-selector.json +10 -0
- package/fixtures/openontology/invalid/manifest-bad-id.json +15 -0
- package/fixtures/openontology/invalid/manifest-bad-version.json +15 -0
- package/fixtures/openontology/invalid/manifest-no-maintainer.json +11 -0
- package/fixtures/openontology/invalid/relationship-no-range.json +11 -0
- package/fixtures/openontology/valid/action.json +29 -0
- package/fixtures/openontology/valid/approval.json +12 -0
- package/fixtures/openontology/valid/changeset.json +34 -0
- package/fixtures/openontology/valid/claim-relationship.json +23 -0
- package/fixtures/openontology/valid/claim-value.json +15 -0
- package/fixtures/openontology/valid/constraint.json +12 -0
- package/fixtures/openontology/valid/entity-type.json +16 -0
- package/fixtures/openontology/valid/entity.json +16 -0
- package/fixtures/openontology/valid/event.json +17 -0
- package/fixtures/openontology/valid/evidence.json +12 -0
- package/fixtures/openontology/valid/manifest.json +21 -0
- package/fixtures/openontology/valid/namespace.json +7 -0
- package/fixtures/openontology/valid/property.json +8 -0
- package/fixtures/openontology/valid/query-adhoc.json +16 -0
- package/fixtures/openontology/valid/query.json +24 -0
- package/fixtures/openontology/valid/relationship-type.json +16 -0
- package/fixtures/openontology/valid/review.json +17 -0
- package/fixtures/openontology/valid/source.json +13 -0
- package/fixtures/openprd/conformance.json +104 -0
- package/fixtures/openprd/invalid/bad-filename.md +41 -0
- package/fixtures/openprd/invalid/bad-id-format.md +41 -0
- package/fixtures/openprd/invalid/bad-status.md +41 -0
- package/fixtures/openprd/invalid/dates-backwards.md +43 -0
- package/fixtures/openprd/invalid/duplicate-requirement.md +42 -0
- package/fixtures/openprd/invalid/id-mismatch.md +41 -0
- package/fixtures/openprd/invalid/missing-section.md +37 -0
- package/fixtures/openprd/invalid/missing-title.md +40 -0
- package/fixtures/openprd/invalid/no-front-matter.md +33 -0
- package/fixtures/openprd/invalid/out-of-order.md +41 -0
- package/fixtures/openprd/invalid/superseded-without-replacement.md +41 -0
- package/fixtures/openprd/invalid/unknown-key.md +42 -0
- package/fixtures/openprd/valid/bold-requirements.md +41 -0
- package/fixtures/openprd/valid/full.md +48 -0
- package/fixtures/openprd/valid/minimal.md +41 -0
- package/fixtures/openprd/valid/none-sections.md +41 -0
- package/fixtures/openprd/valid/subsections.md +47 -0
- package/fixtures/openprd/valid/superseded.md +42 -0
- package/fixtures/openprd-prd.yaml +12 -0
- package/fixtures/pull-request.yaml +24 -0
- package/fixtures/repo.yaml +27 -0
- package/fixtures/task.yaml +26 -0
- package/package.json +91 -0
- package/schemas/agentad-ad-request.schema.json +32 -0
- package/schemas/agentad-ad-response.schema.json +31 -0
- package/schemas/agentad-ad.schema.json +79 -0
- package/schemas/agentad-campaign.schema.json +40 -0
- package/schemas/agentad-click.schema.json +23 -0
- package/schemas/agentad-impression.schema.json +18 -0
- package/schemas/agentad-placement.schema.json +46 -0
- package/schemas/logicsrc-account-audit-event.schema.json +31 -0
- package/schemas/logicsrc-account-grant.schema.json +48 -0
- package/schemas/logicsrc-account-provider.schema.json +31 -0
- package/schemas/logicsrc-agent.schema.json +51 -0
- package/schemas/logicsrc-connected-account.schema.json +39 -0
- package/schemas/logicsrc-credential-audit-event.schema.json +32 -0
- package/schemas/logicsrc-credential-provider.schema.json +28 -0
- package/schemas/logicsrc-credential-sync-plan.schema.json +56 -0
- package/schemas/logicsrc-credential-sync-run.schema.json +35 -0
- package/schemas/logicsrc-email-message.schema.json +22 -0
- package/schemas/logicsrc-event.schema.json +25 -0
- package/schemas/logicsrc-opencontext-audit-event.schema.json +69 -0
- package/schemas/logicsrc-opencontext-bundle.schema.json +210 -0
- package/schemas/logicsrc-opencontext-decision.schema.json +229 -0
- package/schemas/logicsrc-opencontext-diagnostic.schema.json +123 -0
- package/schemas/logicsrc-opencontext-manifest.schema.json +337 -0
- package/schemas/logicsrc-opencontext-object.schema.json +311 -0
- package/schemas/logicsrc-opencontext-provenance.schema.json +76 -0
- package/schemas/logicsrc-opencontext-role.schema.json +93 -0
- package/schemas/logicsrc-openontology-action.schema.json +90 -0
- package/schemas/logicsrc-openontology-approval.schema.json +39 -0
- package/schemas/logicsrc-openontology-changeset.schema.json +168 -0
- package/schemas/logicsrc-openontology-claim.schema.json +148 -0
- package/schemas/logicsrc-openontology-constraint.schema.json +104 -0
- package/schemas/logicsrc-openontology-entity-type.schema.json +107 -0
- package/schemas/logicsrc-openontology-entity.schema.json +59 -0
- package/schemas/logicsrc-openontology-event.schema.json +60 -0
- package/schemas/logicsrc-openontology-evidence.schema.json +121 -0
- package/schemas/logicsrc-openontology-manifest.schema.json +148 -0
- package/schemas/logicsrc-openontology-namespace.schema.json +21 -0
- package/schemas/logicsrc-openontology-package.schema.json +73 -0
- package/schemas/logicsrc-openontology-property.schema.json +83 -0
- package/schemas/logicsrc-openontology-query.schema.json +207 -0
- package/schemas/logicsrc-openontology-relationship-type.schema.json +57 -0
- package/schemas/logicsrc-openontology-review.schema.json +37 -0
- package/schemas/logicsrc-openontology-source.schema.json +43 -0
- package/schemas/logicsrc-plugin.schema.json +35 -0
- package/schemas/logicsrc-pull-request.schema.json +73 -0
- package/schemas/logicsrc-repo.schema.json +73 -0
- package/schemas/logicsrc-run.schema.json +69 -0
- package/schemas/logicsrc-social-post.schema.json +26 -0
- package/schemas/logicsrc-task.schema.json +114 -0
- package/schemas/openprd-prd.schema.json +79 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://logicsrc.com/schemas/opencontext/provenance.schema.json",
|
|
4
|
+
"title": "OpenContext Provenance Record",
|
|
5
|
+
"description": "Where one context object came from. Provenance answers 'who says so and when did we last check', which is a different question from 'is it true' (authority) and 'may you read it' (permissions). Provenance MUST survive bundle compilation: summarising or reformatting content may not erase its origin, because an agent that cannot cite its sources cannot be audited or corrected.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["id"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"anyOf": [
|
|
10
|
+
{ "required": ["sources"], "properties": { "sources": { "type": "array" } } },
|
|
11
|
+
{ "required": ["canonical_source"], "properties": { "canonical_source": { "const": true } } }
|
|
12
|
+
],
|
|
13
|
+
"properties": {
|
|
14
|
+
"id": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"pattern": "^[a-z0-9][a-z0-9_-]*(\\.[a-z0-9][a-z0-9_-]*)*$",
|
|
17
|
+
"description": "The context object this record describes."
|
|
18
|
+
},
|
|
19
|
+
"canonical_source": {
|
|
20
|
+
"type": "boolean",
|
|
21
|
+
"description": "True when the object is itself the origin of the fact. A mission statement written in this repository has no upstream source and satisfies a provenance requirement on its own; a pricing object mirrored from a CRM does not."
|
|
22
|
+
},
|
|
23
|
+
"sources": {
|
|
24
|
+
"type": "array",
|
|
25
|
+
"minItems": 1,
|
|
26
|
+
"description": "Origins, most authoritative first. More than one source is normal — the same fact may be mirrored from a CRM and confirmed in a policy document.",
|
|
27
|
+
"items": { "$ref": "#/$defs/source" }
|
|
28
|
+
},
|
|
29
|
+
"retrieved_at": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"format": "date-time",
|
|
32
|
+
"description": "When the object as a whole was last refreshed from its sources, when that differs from the per-source timestamps."
|
|
33
|
+
},
|
|
34
|
+
"extensions": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"propertyNames": { "type": "string", "pattern": "^[a-z0-9]+(\\.[a-z0-9-]+)+$" },
|
|
37
|
+
"additionalProperties": true
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"$defs": {
|
|
41
|
+
"source": {
|
|
42
|
+
"type": "object",
|
|
43
|
+
"required": ["uri"],
|
|
44
|
+
"additionalProperties": false,
|
|
45
|
+
"properties": {
|
|
46
|
+
"uri": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"minLength": 1,
|
|
49
|
+
"description": "Where the content came from, e.g. git://github.com/acme/context/policies/refunds.md, crm://pricing/enterprise, or https://example.com/handbook. The scheme tells a reader which system to go argue with when the fact is wrong."
|
|
50
|
+
},
|
|
51
|
+
"type": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"description": "What kind of origin this is: canonical-record, document, conversation, observation, api, inference. An origin of type conversation or observation is a reason to keep the object's authority low."
|
|
54
|
+
},
|
|
55
|
+
"retrieved_at": { "type": "string", "format": "date-time", "description": "When these bytes were last read." },
|
|
56
|
+
"digest": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"pattern": "^(sha256):[0-9a-f]{64}$",
|
|
59
|
+
"description": "sha256:<64 lowercase hex> over the retrieved bytes. Lets a consumer detect that a remote source changed under them since the context was written, which is the difference between stale context and silently wrong context."
|
|
60
|
+
},
|
|
61
|
+
"label": { "type": "string", "description": "Human-readable name of the source." },
|
|
62
|
+
"trust": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"enum": ["trusted", "verified", "untrusted"],
|
|
65
|
+
"description": "Trust of this specific origin. A digest-checked external document is verified; a scraped page or a customer message is untrusted no matter how confident the object is."
|
|
66
|
+
},
|
|
67
|
+
"author": { "type": "string", "description": "Who produced the source material, when known." },
|
|
68
|
+
"extensions": {
|
|
69
|
+
"type": "object",
|
|
70
|
+
"propertyNames": { "type": "string", "pattern": "^[a-z0-9]+(\\.[a-z0-9-]+)+$" },
|
|
71
|
+
"additionalProperties": true
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://logicsrc.com/schemas/opencontext/role.schema.json",
|
|
4
|
+
"title": "OpenContext Role / Scope",
|
|
5
|
+
"description": "A named scope: the authorized subset of context available to a human, role, agent, task, or runtime. Roles answer 'may this consumer read it', which OpenContext keeps strictly separate from 'is it relevant'. Exclusions and denials are applied before relevance ranking, so unauthorized context never reaches a ranker, a prompt, or a bundle. This schema governs a single role; the manifest embeds the same shape under its roles map.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"pattern": "^[a-z0-9][a-z0-9_-]*$",
|
|
12
|
+
"description": "Role name. Optional when the role is embedded in a manifest, where the map key names it."
|
|
13
|
+
},
|
|
14
|
+
"description": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "What this role is for, in one line."
|
|
17
|
+
},
|
|
18
|
+
"include": {
|
|
19
|
+
"type": "array",
|
|
20
|
+
"uniqueItems": true,
|
|
21
|
+
"items": { "$ref": "#/$defs/pattern" },
|
|
22
|
+
"description": "Id patterns in scope, e.g. mission, products.*, policies.support.*. A role with no include list sees nothing: scope is opt-in, never opt-out."
|
|
23
|
+
},
|
|
24
|
+
"exclude": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"uniqueItems": true,
|
|
27
|
+
"items": { "$ref": "#/$defs/pattern" },
|
|
28
|
+
"description": "Id patterns denied to this role. Deny overrides allow unconditionally — an exclusion cannot be outvoted by a more specific include, by inheritance, or by an object-level read grant."
|
|
29
|
+
},
|
|
30
|
+
"permissions": {
|
|
31
|
+
"type": "array",
|
|
32
|
+
"uniqueItems": true,
|
|
33
|
+
"items": { "type": "string", "minLength": 1 },
|
|
34
|
+
"description": "Capability strings such as customer.read or ticket.write. OpenContext transports and scopes these so a runtime can enforce them; OpenContext does not itself perform your application's actions."
|
|
35
|
+
},
|
|
36
|
+
"max_classification": {
|
|
37
|
+
"$ref": "#/$defs/classification",
|
|
38
|
+
"description": "Highest classification this role may read. An object above the ceiling is denied even when an include pattern matches it. Defaults to internal, so confidential and restricted context requires an explicit grant."
|
|
39
|
+
},
|
|
40
|
+
"redact": {
|
|
41
|
+
"type": "array",
|
|
42
|
+
"description": "Redaction rules applied to everything this role reads, unioned with repository-wide and object-level rules.",
|
|
43
|
+
"items": { "$ref": "#/$defs/redaction" }
|
|
44
|
+
},
|
|
45
|
+
"inherits": {
|
|
46
|
+
"type": "array",
|
|
47
|
+
"uniqueItems": true,
|
|
48
|
+
"items": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_-]*$" },
|
|
49
|
+
"description": "Roles whose scope merges into this one. Includes, excludes, and redactions all union, and the classification ceiling takes the lowest of the parents — inheritance can therefore only narrow what is readable, never widen it. Cycles are a validation error."
|
|
50
|
+
},
|
|
51
|
+
"extensions": { "$ref": "#/$defs/extensions" }
|
|
52
|
+
},
|
|
53
|
+
"$defs": {
|
|
54
|
+
"pattern": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"minLength": 1,
|
|
57
|
+
"pattern": "^([a-z0-9][a-z0-9_-]*|\\*)(\\.([a-z0-9][a-z0-9_-]*|\\*))*$",
|
|
58
|
+
"description": "An exact object id (policy.refunds), a trailing wildcard covering a subtree (policies.support.*), an interior wildcard matching exactly one segment (customers.*.churn-risk), or * for everything. Wildcards always match whole dotted segments, never substrings, so products.* matches products.enterprise but never products-internal."
|
|
59
|
+
},
|
|
60
|
+
"classification": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"enum": ["public", "internal", "confidential", "restricted"],
|
|
63
|
+
"description": "Sensitivity band, least to most sensitive."
|
|
64
|
+
},
|
|
65
|
+
"redaction": {
|
|
66
|
+
"type": "object",
|
|
67
|
+
"required": ["path"],
|
|
68
|
+
"additionalProperties": false,
|
|
69
|
+
"description": "A rule removing or masking part of an object's structured content before it reaches a bundle.",
|
|
70
|
+
"properties": {
|
|
71
|
+
"path": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"minLength": 1,
|
|
74
|
+
"description": "Dotted path into the object's content, with [] or [*] for every element of an array, e.g. customer.ssn or contacts[*].email."
|
|
75
|
+
},
|
|
76
|
+
"mode": {
|
|
77
|
+
"type": "string",
|
|
78
|
+
"enum": ["remove", "mask", "hash"],
|
|
79
|
+
"default": "remove",
|
|
80
|
+
"description": "remove deletes the key; mask replaces the value with the replacement string; hash replaces it with a sha256 digest so equality remains testable without disclosure."
|
|
81
|
+
},
|
|
82
|
+
"replacement": { "type": "string", "default": "[REDACTED]" },
|
|
83
|
+
"reason": { "type": "string", "description": "Why the field is redacted. Surfaced in --explain." }
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"extensions": {
|
|
87
|
+
"type": "object",
|
|
88
|
+
"description": "Namespaced custom fields, e.g. com.example.risk.",
|
|
89
|
+
"propertyNames": { "type": "string", "pattern": "^[a-z0-9]+(\\.[a-z0-9-]+)+$" },
|
|
90
|
+
"additionalProperties": true
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://logicsrc.com/schemas/openontology/action.schema.json",
|
|
4
|
+
"title": "LogicSRC OpenOntology Action",
|
|
5
|
+
"description": "A governed operation that turns a passive knowledge map into an operational layer. Actions reference approved LogicSRC plugin/tool capabilities; ontology packages never embed executable code.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["openontology", "kind", "id", "label", "executor", "permissions", "approval"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"openontology": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$" },
|
|
11
|
+
"kind": { "const": "Action" },
|
|
12
|
+
"id": { "type": "string", "minLength": 1 },
|
|
13
|
+
"label": { "type": "string", "minLength": 1 },
|
|
14
|
+
"description": { "type": "string" },
|
|
15
|
+
"input": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"additionalProperties": { "$ref": "#/$defs/parameter" }
|
|
18
|
+
},
|
|
19
|
+
"output": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"additionalProperties": { "$ref": "#/$defs/parameter" }
|
|
22
|
+
},
|
|
23
|
+
"preconditions": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"additionalProperties": false,
|
|
26
|
+
"properties": {
|
|
27
|
+
"query": { "type": "string", "description": "Saved query id that must return rows." },
|
|
28
|
+
"constraints": { "type": "array", "items": { "type": "string" } }
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"executor": {
|
|
32
|
+
"type": "object",
|
|
33
|
+
"required": ["type"],
|
|
34
|
+
"additionalProperties": false,
|
|
35
|
+
"properties": {
|
|
36
|
+
"type": { "type": "string", "enum": ["logicsrc-plugin-tool", "mcp-tool", "http"] },
|
|
37
|
+
"plugin": { "type": "string" },
|
|
38
|
+
"tool": { "type": "string" },
|
|
39
|
+
"endpoint": { "type": "string" }
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"permissions": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"required": ["required"],
|
|
45
|
+
"additionalProperties": false,
|
|
46
|
+
"properties": {
|
|
47
|
+
"required": {
|
|
48
|
+
"type": "array",
|
|
49
|
+
"minItems": 1,
|
|
50
|
+
"items": { "type": "string" },
|
|
51
|
+
"uniqueItems": true
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"approval": {
|
|
56
|
+
"type": "object",
|
|
57
|
+
"required": ["mode"],
|
|
58
|
+
"additionalProperties": false,
|
|
59
|
+
"properties": {
|
|
60
|
+
"mode": { "type": "string", "enum": ["none", "policy", "always"] },
|
|
61
|
+
"approvals": { "type": "integer", "minimum": 0 }
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"sideEffects": {
|
|
65
|
+
"type": "array",
|
|
66
|
+
"items": { "type": "string" },
|
|
67
|
+
"uniqueItems": true,
|
|
68
|
+
"description": "Declared effects. An undeclared side effect means the action is denied."
|
|
69
|
+
},
|
|
70
|
+
"idempotencyKey": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"description": "Input field used to make retries safe for non-idempotent effects."
|
|
73
|
+
},
|
|
74
|
+
"events": { "type": "array", "items": { "type": "string" }, "uniqueItems": true },
|
|
75
|
+
"extensions": { "type": "object" }
|
|
76
|
+
},
|
|
77
|
+
"$defs": {
|
|
78
|
+
"parameter": {
|
|
79
|
+
"type": "object",
|
|
80
|
+
"additionalProperties": false,
|
|
81
|
+
"properties": {
|
|
82
|
+
"type": { "type": "string" },
|
|
83
|
+
"entityType": { "type": "string" },
|
|
84
|
+
"required": { "type": "boolean", "default": false },
|
|
85
|
+
"description": { "type": "string" },
|
|
86
|
+
"default": {}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://logicsrc.com/schemas/openontology/approval.schema.json",
|
|
4
|
+
"title": "LogicSRC OpenOntology Approval",
|
|
5
|
+
"description": "A recorded approval that satisfies policy for a change set or governed action. Model confidence never substitutes for an approval.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["openontology", "kind", "id", "changeSet", "approver", "createdAt"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"openontology": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$" },
|
|
11
|
+
"kind": { "const": "Approval" },
|
|
12
|
+
"id": { "type": "string", "minLength": 1 },
|
|
13
|
+
"changeSet": { "type": "string", "minLength": 1 },
|
|
14
|
+
"approver": { "type": "string", "minLength": 1 },
|
|
15
|
+
"approverType": { "type": "string", "enum": ["human", "service", "agent"], "default": "human" },
|
|
16
|
+
"scopes": {
|
|
17
|
+
"type": "array",
|
|
18
|
+
"items": { "type": "string" },
|
|
19
|
+
"uniqueItems": true,
|
|
20
|
+
"description": "Scopes the approver held at approval time."
|
|
21
|
+
},
|
|
22
|
+
"policy": { "type": "string", "description": "Policy rule id that required this approval." },
|
|
23
|
+
"createdAt": { "type": "string", "format": "date-time" },
|
|
24
|
+
"comment": { "type": "string" },
|
|
25
|
+
"signature": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"required": ["algorithm", "signer", "value"],
|
|
28
|
+
"additionalProperties": false,
|
|
29
|
+
"properties": {
|
|
30
|
+
"algorithm": { "type": "string" },
|
|
31
|
+
"signer": { "type": "string" },
|
|
32
|
+
"value": { "type": "string" },
|
|
33
|
+
"created": { "type": "string", "format": "date-time" },
|
|
34
|
+
"keyId": { "type": "string" }
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"extensions": { "type": "object" }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://logicsrc.com/schemas/openontology/changeset.schema.json",
|
|
4
|
+
"title": "LogicSRC OpenOntology Change Set",
|
|
5
|
+
"description": "An atomic, reviewable proposal to add, correct, merge, dispute, or retract knowledge. Agent-created change sets default to 'proposed'; rollback creates a compensating change set rather than deleting history.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["openontology", "kind", "id", "title", "createdAt", "createdBy", "operations", "status"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"openontology": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$" },
|
|
11
|
+
"kind": { "const": "ChangeSet" },
|
|
12
|
+
"id": { "type": "string", "minLength": 1 },
|
|
13
|
+
"ontology": { "type": "string", "description": "Target package reference, e.g. 'ethereum-ecosystem@0.1.0'." },
|
|
14
|
+
"title": { "type": "string", "minLength": 1 },
|
|
15
|
+
"rationale": { "type": "string" },
|
|
16
|
+
"createdAt": { "type": "string", "format": "date-time" },
|
|
17
|
+
"createdBy": { "type": "string", "minLength": 1 },
|
|
18
|
+
"actorType": { "type": "string", "enum": ["human", "service", "agent"] },
|
|
19
|
+
"runId": { "type": "string", "description": "REQUIRED for agent-created change sets." },
|
|
20
|
+
"operations": {
|
|
21
|
+
"type": "array",
|
|
22
|
+
"minItems": 1,
|
|
23
|
+
"items": { "$ref": "#/$defs/operation" }
|
|
24
|
+
},
|
|
25
|
+
"requiredApprovals": { "type": "integer", "minimum": 0, "default": 1 },
|
|
26
|
+
"status": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"enum": ["draft", "proposed", "approved", "applied", "rejected", "conflicted", "withdrawn"]
|
|
29
|
+
},
|
|
30
|
+
"baseRevision": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"description": "Data revision the change set was authored against. Used for optimistic concurrency."
|
|
33
|
+
},
|
|
34
|
+
"resultRevision": { "type": "string", "description": "Revision produced by applying the change set." },
|
|
35
|
+
"validation": { "$ref": "#/$defs/validationSummary" },
|
|
36
|
+
"appliedAt": { "type": "string", "format": "date-time" },
|
|
37
|
+
"appliedBy": { "type": "string" },
|
|
38
|
+
"compensates": { "type": "string", "description": "Change set id this one rolls back." },
|
|
39
|
+
"conflictsWith": { "type": "array", "items": { "type": "string" }, "uniqueItems": true },
|
|
40
|
+
"signatures": {
|
|
41
|
+
"type": "array",
|
|
42
|
+
"items": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"required": ["algorithm", "signer", "value"],
|
|
45
|
+
"additionalProperties": false,
|
|
46
|
+
"properties": {
|
|
47
|
+
"algorithm": { "type": "string" },
|
|
48
|
+
"signer": { "type": "string" },
|
|
49
|
+
"value": { "type": "string" },
|
|
50
|
+
"created": { "type": "string", "format": "date-time" },
|
|
51
|
+
"keyId": { "type": "string" }
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"extensions": { "type": "object" }
|
|
56
|
+
},
|
|
57
|
+
"$defs": {
|
|
58
|
+
"validationSummary": {
|
|
59
|
+
"type": "object",
|
|
60
|
+
"additionalProperties": false,
|
|
61
|
+
"properties": {
|
|
62
|
+
"ok": { "type": "boolean" },
|
|
63
|
+
"errors": { "type": "integer", "minimum": 0 },
|
|
64
|
+
"warnings": { "type": "integer", "minimum": 0 },
|
|
65
|
+
"info": { "type": "integer", "minimum": 0 },
|
|
66
|
+
"policy": { "type": "integer", "minimum": 0 },
|
|
67
|
+
"validatedAt": { "type": "string", "format": "date-time" }
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"operation": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"required": ["op"],
|
|
73
|
+
"oneOf": [
|
|
74
|
+
{
|
|
75
|
+
"additionalProperties": false,
|
|
76
|
+
"required": ["op", "value"],
|
|
77
|
+
"properties": {
|
|
78
|
+
"op": { "const": "add-entity" },
|
|
79
|
+
"value": { "type": "object" },
|
|
80
|
+
"note": { "type": "string" }
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"additionalProperties": false,
|
|
85
|
+
"required": ["op", "target", "value"],
|
|
86
|
+
"properties": {
|
|
87
|
+
"op": { "const": "update-metadata" },
|
|
88
|
+
"target": { "type": "string" },
|
|
89
|
+
"value": { "type": "object" },
|
|
90
|
+
"note": { "type": "string" }
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"additionalProperties": false,
|
|
95
|
+
"required": ["op", "value"],
|
|
96
|
+
"properties": {
|
|
97
|
+
"op": { "const": "assert-claim" },
|
|
98
|
+
"value": { "type": "object" },
|
|
99
|
+
"note": { "type": "string" }
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"additionalProperties": false,
|
|
104
|
+
"required": ["op", "target"],
|
|
105
|
+
"properties": {
|
|
106
|
+
"op": { "const": "dispute-claim" },
|
|
107
|
+
"target": { "type": "string" },
|
|
108
|
+
"reason": { "type": "string" },
|
|
109
|
+
"value": { "type": "object" },
|
|
110
|
+
"note": { "type": "string" }
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"additionalProperties": false,
|
|
115
|
+
"required": ["op", "target"],
|
|
116
|
+
"properties": {
|
|
117
|
+
"op": { "const": "retract-claim" },
|
|
118
|
+
"target": { "type": "string" },
|
|
119
|
+
"reason": { "type": "string" },
|
|
120
|
+
"note": { "type": "string" }
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"additionalProperties": false,
|
|
125
|
+
"required": ["op", "target", "value"],
|
|
126
|
+
"properties": {
|
|
127
|
+
"op": { "const": "supersede-claim" },
|
|
128
|
+
"target": { "type": "string" },
|
|
129
|
+
"value": { "type": "object" },
|
|
130
|
+
"reason": { "type": "string" },
|
|
131
|
+
"note": { "type": "string" }
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"additionalProperties": false,
|
|
136
|
+
"required": ["op", "source", "target"],
|
|
137
|
+
"properties": {
|
|
138
|
+
"op": { "const": "merge-entity" },
|
|
139
|
+
"source": { "type": "string", "description": "Entity id being merged away; kept as a redirect." },
|
|
140
|
+
"target": { "type": "string", "description": "Surviving entity id." },
|
|
141
|
+
"reason": { "type": "string" },
|
|
142
|
+
"note": { "type": "string" }
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"additionalProperties": false,
|
|
147
|
+
"required": ["op", "target"],
|
|
148
|
+
"properties": {
|
|
149
|
+
"op": { "const": "archive-entity" },
|
|
150
|
+
"target": { "type": "string" },
|
|
151
|
+
"reason": { "type": "string" },
|
|
152
|
+
"note": { "type": "string" }
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"additionalProperties": false,
|
|
157
|
+
"required": ["op", "value"],
|
|
158
|
+
"properties": {
|
|
159
|
+
"op": { "const": "schema-migration" },
|
|
160
|
+
"value": { "type": "object" },
|
|
161
|
+
"breaking": { "type": "boolean", "default": false },
|
|
162
|
+
"note": { "type": "string" }
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://logicsrc.com/schemas/openontology/claim.schema.json",
|
|
4
|
+
"title": "LogicSRC OpenOntology Claim",
|
|
5
|
+
"description": "The canonical fact record. A relationship is a claim whose object is an entity reference; a scalar property is a claim whose object is a typed value. Accepted claims are append-only — corrections are expressed as dispute, retraction, or supersession.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["openontology", "kind", "id", "subject", "predicate", "object", "status", "assertedAt", "assertedBy"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"openontology": { "type": "string", "pattern": "^\\d+\\.\\d+(\\.\\d+)?$" },
|
|
11
|
+
"kind": { "const": "Claim" },
|
|
12
|
+
"id": { "type": "string", "minLength": 1 },
|
|
13
|
+
"ontology": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Package reference the claim belongs to, e.g. 'ethereum-ecosystem@0.1.0'."
|
|
16
|
+
},
|
|
17
|
+
"subject": { "type": "string", "minLength": 1, "description": "Entity id." },
|
|
18
|
+
"predicate": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"minLength": 1,
|
|
21
|
+
"description": "Relationship type id (entity object) or property id (value object)."
|
|
22
|
+
},
|
|
23
|
+
"object": { "$ref": "#/$defs/claimObject" },
|
|
24
|
+
"status": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"enum": ["asserted", "proposed", "disputed", "retracted", "superseded", "derived"]
|
|
27
|
+
},
|
|
28
|
+
"confidence": {
|
|
29
|
+
"type": "number",
|
|
30
|
+
"minimum": 0,
|
|
31
|
+
"maximum": 1,
|
|
32
|
+
"description": "Metadata about certainty. Confidence is never proof and never grants permission."
|
|
33
|
+
},
|
|
34
|
+
"validTime": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"additionalProperties": false,
|
|
37
|
+
"description": "Domain valid time, independent of when the system recorded the claim.",
|
|
38
|
+
"properties": {
|
|
39
|
+
"from": { "type": ["string", "null"], "format": "date-time" },
|
|
40
|
+
"to": { "type": ["string", "null"], "format": "date-time" }
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"observedAt": { "type": "string", "format": "date-time", "description": "Point-in-time observation." },
|
|
44
|
+
"assertedAt": { "type": "string", "format": "date-time", "description": "Recorded (system) time." },
|
|
45
|
+
"assertedBy": { "type": "string", "minLength": 1, "description": "Actor id — human, service, or agent." },
|
|
46
|
+
"runId": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"description": "LogicSRC-compatible run record. REQUIRED for agent-created claims."
|
|
49
|
+
},
|
|
50
|
+
"sources": {
|
|
51
|
+
"type": "array",
|
|
52
|
+
"items": { "type": "string", "minLength": 1 },
|
|
53
|
+
"uniqueItems": true
|
|
54
|
+
},
|
|
55
|
+
"evidence": {
|
|
56
|
+
"type": "array",
|
|
57
|
+
"items": { "type": "string", "minLength": 1 },
|
|
58
|
+
"uniqueItems": true
|
|
59
|
+
},
|
|
60
|
+
"firstParty": {
|
|
61
|
+
"type": "boolean",
|
|
62
|
+
"description": "Explicit declaration that this is a manual/first-party assertion with no external source."
|
|
63
|
+
},
|
|
64
|
+
"derivedFrom": {
|
|
65
|
+
"type": "object",
|
|
66
|
+
"additionalProperties": false,
|
|
67
|
+
"description": "REQUIRED for status 'derived': what produced this claim.",
|
|
68
|
+
"properties": {
|
|
69
|
+
"rule": { "type": "string" },
|
|
70
|
+
"query": { "type": "string" },
|
|
71
|
+
"transformation": { "type": "string" },
|
|
72
|
+
"inputs": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"supersedes": { "type": "string", "description": "Claim id this claim replaces." },
|
|
76
|
+
"supersededBy": { "type": "string", "description": "Claim id that replaced this claim." },
|
|
77
|
+
"disputes": { "type": "string", "description": "Claim id this claim disputes." },
|
|
78
|
+
"retractionReason": { "type": "string" },
|
|
79
|
+
"changeSet": { "type": "string", "description": "Change set that introduced this claim." },
|
|
80
|
+
"license": { "type": "string" },
|
|
81
|
+
"visibility": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"enum": ["public", "internal", "private"],
|
|
84
|
+
"default": "public"
|
|
85
|
+
},
|
|
86
|
+
"retention": { "type": "string", "description": "Retention policy identifier." },
|
|
87
|
+
"tags": { "type": "array", "items": { "type": "string" }, "uniqueItems": true },
|
|
88
|
+
"model": { "$ref": "#/$defs/modelProvenance" },
|
|
89
|
+
"extensions": { "type": "object" }
|
|
90
|
+
},
|
|
91
|
+
"$defs": {
|
|
92
|
+
"claimObject": {
|
|
93
|
+
"description": "Exactly one of an entity reference or a typed scalar value — never both.",
|
|
94
|
+
"oneOf": [
|
|
95
|
+
{
|
|
96
|
+
"type": "object",
|
|
97
|
+
"required": ["entity"],
|
|
98
|
+
"additionalProperties": false,
|
|
99
|
+
"properties": {
|
|
100
|
+
"entity": { "type": "string", "minLength": 1 }
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"type": "object",
|
|
105
|
+
"required": ["value"],
|
|
106
|
+
"additionalProperties": false,
|
|
107
|
+
"properties": {
|
|
108
|
+
"value": {},
|
|
109
|
+
"datatype": {
|
|
110
|
+
"type": "string",
|
|
111
|
+
"enum": [
|
|
112
|
+
"string",
|
|
113
|
+
"number",
|
|
114
|
+
"integer",
|
|
115
|
+
"boolean",
|
|
116
|
+
"date",
|
|
117
|
+
"date-time",
|
|
118
|
+
"duration",
|
|
119
|
+
"url",
|
|
120
|
+
"email",
|
|
121
|
+
"enum",
|
|
122
|
+
"object",
|
|
123
|
+
"array",
|
|
124
|
+
"binary-reference"
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
"language": { "type": "string", "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$" },
|
|
128
|
+
"unit": { "type": "string" }
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
"modelProvenance": {
|
|
134
|
+
"type": "object",
|
|
135
|
+
"required": ["provider", "model"],
|
|
136
|
+
"additionalProperties": false,
|
|
137
|
+
"description": "Recorded for AI-extracted proposals. Never stores chain-of-thought.",
|
|
138
|
+
"properties": {
|
|
139
|
+
"provider": { "type": "string", "minLength": 1 },
|
|
140
|
+
"model": { "type": "string", "minLength": 1 },
|
|
141
|
+
"modelVersion": { "type": "string" },
|
|
142
|
+
"promptVersion": { "type": "string" },
|
|
143
|
+
"extractedAt": { "type": "string", "format": "date-time" },
|
|
144
|
+
"rationale": { "type": "string", "description": "Concise user-facing rationale only." }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|