Skip to content

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas - #32

Merged
dhh1128 merged 6 commits into
mainfrom
VC-1162
Jun 10, 2026
Merged

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas#32
dhh1128 merged 6 commits into
mainfrom
VC-1162

Conversation

@Arsh-Sandhu

Copy link
Copy Markdown
Member

No description provided.

CopilotAI review requested due to automatic review settings June 1, 2026 17:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the OVC Org Identity, OVC Brand Owner, and TN Allocation credential schemas/docs to v2, aligning them with JSON Schema draft 2020-12 and expanding field descriptions and constraints.

Changes:

  • Bump schemas to version 2.0.0, update $schema to draft 2020-12, and refresh schema SAIDs in registry.json.
  • Revise TN allocation attributes to support array-based number expressions (single numbers + inclusive ranges) and multi-channel scoping.
  • Expand documentation in the index.md files to explain intent, semantics, and edge/rules structure.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 17 comments.

Show a summary per file
FileDescription
tn-alloc/tn-alloc.schema.jsonUpdates TN allocation schema to v2 with richer constraints and revised attributes/edges/rules structure.
tn-alloc/index.mdRewrites TN allocation documentation to explain number expressions, channels, edges, and governance.
tn-alloc/example-tn-alloc.jsonUpdates example payload to match TN allocation v2 structure (numbers array, channel array, updated SAIDs).
registry.jsonUpdates registry entries to new schema SAIDs for tn-alloc, ovc-org-vet, and ovc-brand-owner.
ovc-org-vet/rules.jsonRemoves the standalone rules JSON file.
ovc-org-vet/ovc-org-vet.schema.jsonUpdates OVC Org Identity schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-org-vet/index.mdUpdates OVC Org Identity documentation to reflect new intent and field structure.
ovc-brand-owner/ovc-brand-owner.schema.jsonUpdates OVC Brand Owner schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-brand-owner/index.mdExpands OVC Brand Owner documentation and usage guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadtn-alloc/tn-alloc.schema.json Outdated
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment on lines +193 to +197
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment on lines +229 to +233
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment threadovc-brand-owner/index.md Outdated

### Required and optional attributes

Only `i` (issuee AID) and `dt` (issuance datetime) are required in the attributes block. `vcard` and `goals` are both optional, though in practice a brand owner credential without a `vcard` is of limited use. Both fields may be selectively disclosed.
Comment threadovc-brand-owner/index.md Outdated
CopilotAI review requested due to automatic review settings June 1, 2026 18:16
@Arsh-SandhuArsh-Sandhu changed the title [VC-1162] update org-identity and brand owner schemas[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemasJun 1, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 18 comments.

Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment on lines 296 to 299
{
"description": "Rules section SAID",
"type": "string"
},
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-brand-owner/ovc-brand-owner.schema.json
Comment threadovc-org-vet/index.md Outdated
Comment on lines +74 to +80
The `r` (rules) block uses citation-style rules inherited from the credential design: the listed legal identifiers are citations — they point to external registry records. The rules make explicit that:

- Pointing to an identifier does **not** imply endorsement of or agreement with the cited content (`onlyCommitToPoint`).
- The credential is not meant to be used in isolation; its semantics are communicated via referencing ACDCs (`useViaEdges`).
- Verifying the authenticity of the cited external data is the verifier's responsibility (`undefinedVerification`).
- Revocation of the credential and revocation of the cited data are independent events (`undefinedRevocation`).
- A `governance` field must identify the governance framework under which the credential was issued.
Comment threadovc-brand-owner/index.md Outdated
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
Comment threadovc-brand-owner/index.md Outdated
Comment on lines +62 to +63
| `issuer` | No | Links to an identity credential (e.g., OVC Org Identity, vLEI) proving the identity of the issuer. Uses `I2I` operator. |
| `brandauth` | No | Links to a credential proving brand authority — e.g., a trademark registration or license agreement. Uses `I2I` operator. |
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
@Arsh-Sandhu
Arsh-Sandhu requested a review from dhh1128June 1, 2026 18:24

@dhh1128dhh1128 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review against the stated success criteria

Thanks @Arsh-Sandhu — solid PR. Mechanically it's in good shape: all three schemas are valid JSON-Schema Draft 2020-12, every $id/nested-block SAID recomputes correctly and matches registry.json, and example-tn-alloc.json validates against the new tn-alloc schema.

Scorecard:

  • version ✅ — all 1.0.02.0.0 (see inline note to confirm the GSMA-trial value).
  • names ✅ (mostly) — titles use OVC / "Org Identity" / no dossier-vs-credential misuse; residual "org vet" wording noted inline.
  • rules ✅ — governance statement present in all three (but see the org-identity citation-rules blocker inline).
  • constraints⚠️ — strong regexes for v/d/i/ri/s, LEI, E.164, channel enum, LOA; gaps noted inline (E.164 leading zero, unconstrained u, and the compact-form SAID strings: ovc-org-vet/ovc-brand-owner pattern-constrain the compact r string, but tn-alloc's compact a/e/r branches are bare type: string — pin ^E[A-Za-z0-9_-]{43}$ for consistency).
  • examples ✅ (mostly) — most fields have believable examples; see pre-existing vcard note below.
  • docs ✅ — all three have substantial index.md; defects noted inline + below.
  • multichannel(strongest part) — tn-alloc makes channel an optional ["sms","voice"] array (one channel-agnostic credential, no proliferation), and brand-owner uses goals to scope channel/purpose. Well reasoned in the docs and exactly the "single type, optional" direction we wanted.

Top things to address: (1) the citation-semantics rules on the org-identity credential, (2) the legalIdentifiers schema↔doc contradiction, (3) the doc defects below.

Pre-existing issues (outside this diff, so not inline — but worth fixing while here)

These live on lines the PR didn't change, so GitHub won't let me anchor a comment:

  • ovc-org-vet/index.md LoA table is broken & has typos: the "gold" (LoA 3) row is column-shifted (its <ol> landed in the intended meaning column, with a stray </li></li> and a missing <li>); threshhold → "threshold"; FBACFBCA (correct once, then misspelled 3×); ISO/IEC 2915ISO/IEC 29115; LoA 1 row duplicates "tools" ("legalities, tools, governance, tools…").
  • ovc-brand-ownervcard/goals use format: "cesr" on items that are vCard content lines / Aries goal codes (not CESR primitives) — questionable format. Also the vcardexamples array lists individual strings at the array level, so each "example" isn't a valid instance of the array property (wrap as one example array, or move under items).

Full off-PR write-up is in my review notes; happy to expand on any of these.

"items": {
"type": "string",
"description": "A single E164 telephone number or an inclusive range. Single number: '+' followed by 7-15 digits. Range: two E164 numbers separated by a hyphen (e.g., '+15551230000-+15551239999').",
"pattern": "^\\+[0-9]{7,15}(-\\+[0-9]{7,15})?$"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E.164 regex is slightly too permissive.^\+[0-9]{7,15}(-\+[0-9]{7,15})?$ allows a leading zero, but E.164 country codes never start with 0. Suggest pinning the first digit non-zero:

^\+[1-9][0-9]{6,14}(-\+[1-9][0-9]{6,14})?$

(Range start≤end and equal-length endpoints can't be enforced in regex — the index.md correctly defers that to verifier evaluation, which is fine.)

"EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC"
]
},
"u": {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u (salt) is unconstrained here and in the other two schemas (type: string, no pattern). Per the "constrain inputs as much as possible" goal, consider a pattern for a 128-bit CESR salt, e.g. ^0A[A-Za-z0-9_-]{22}$.

Also: top-level required is inconsistent across the three schemas — tn-alloc requires u, but ovc-org-vet and ovc-brand-owner make it optional. Pick one convention and apply it uniformly.

"type": "object",
"credentialType": "TNAllocationCredential",
"version": "1.0.0",
"version": "2.0.0",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version: bumped 1.0.02.0.0 on all three — good (≥ 1.0 and differs from the value on main). Just confirming: the GSMA-trial schemas were at 1.0.0, so 2.0.0 satisfies "must differ from the trial version". If the trial actually shipped something other than 1.0.0, double-check there's no collision.

(Minor: version is a non-standard JSON-Schema keyword — ignored by validators — but it's the existing repo convention, so fine.)

"type": "object",
"properties": {
"type": {
"description": "Category or source of the identifier (e.g., lei, gleif, gb, che, duns, edgar, domain, linkedin, etc.)",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schema ↔ doc contradiction. This lists domain and linkedin as example type values, but index.md says "Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity." One of the two is wrong — reconcile.

Separately, the example vocabulary differs between schema (gb, che) and doc (uk-crn, che, us-ein). Consider a single controlled vocabulary for type (even just consistent examples).

"LOA": {
"description": "Level of Assurance \u2014 a positive number where larger values denote higher assurance (1=bronze, 2=silver, 3=gold). Integer values represent defined tiers; decimal sub-values (e.g., 2.1) allow nuance within a tier. Verifiers should accept any credential where LOA is >= their required threshold.",
"type": "number",
"minimum": 0,

@dhh1128dhh1128Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant bounds.minimum: 0 together with exclusiveMinimum: 0 is contradictory. If LOA can be zero, then eclusive is wrong; if not, then minimum is wrong.

"type": "string",
"pattern": "^E[A-Za-z0-9_-]{43}$",
"examples": [
"EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale s example. This uses EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z, which is the brand-owner schema's old (pre-PR) SAID; the new $id is EImfvpfRx4YKhTzAzdZzCCjSNmwtY5yw9QlpZirG6OUa. A self-referential s example should show the current schema SAID. (Same old SAID is reused as the brandauth.s example further down.)

Comment threadovc-org-vet/index.md

**At least one identifier should be globally unambiguous and portable across jurisdictions** — typically an LEI. National registry IDs (like UK Companies House `gb` or Swiss `che` numbers) are also valid and can coexist with the LEI.

Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity across jurisdictions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contradicts the schema: ovc-org-vet.schema.json lists domain and linkedin as example legalIdentifiers types, but here they're "intentionally excluded." Pick one and align both.

Comment threadovc-org-vet/index.md

The OVC Org Identity Credential is analogous in intent to the [LE vLEI](https://docs.origincloud.net/start/concepts/creds/vleis) defined by GLEIF (which maps to LoA 3), but its schema is designed to be simpler and to accommodate a wider range of national registry sources.

![suggested org vet visual](org-vet-256.png)<br>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Residual "org vet" naming. The title was updated to OVC Org Identity Credential (good), but the body still says "org vet" / "Org vet credentials" in places, and the image assets are org-vet-*.png/.svg. For consistency with the naming goal ("use 'org identity' rather than 'org vet'"), update the prose and consider renaming the image files (and eventually the directory).

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@dhh1128
dhh1128 merged commit 7c2f019 into mainJun 10, 2026
@dhh1128
dhh1128 deleted the VC-1162 branch June 29, 2026 19:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Arsh-Sandhu@dhh1128
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas by Arsh-Sandhu · Pull Request #32 · provenant-dev/public-schema · GitHub
Skip to content

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas - #32

Merged
dhh1128 merged 6 commits into
mainfrom
VC-1162
Jun 10, 2026
Merged

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas#32
dhh1128 merged 6 commits into
mainfrom
VC-1162

Conversation

@Arsh-Sandhu

Copy link
Copy Markdown
Member

No description provided.

CopilotAI review requested due to automatic review settings June 1, 2026 17:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the OVC Org Identity, OVC Brand Owner, and TN Allocation credential schemas/docs to v2, aligning them with JSON Schema draft 2020-12 and expanding field descriptions and constraints.

Changes:

  • Bump schemas to version 2.0.0, update $schema to draft 2020-12, and refresh schema SAIDs in registry.json.
  • Revise TN allocation attributes to support array-based number expressions (single numbers + inclusive ranges) and multi-channel scoping.
  • Expand documentation in the index.md files to explain intent, semantics, and edge/rules structure.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 17 comments.

Show a summary per file
FileDescription
tn-alloc/tn-alloc.schema.jsonUpdates TN allocation schema to v2 with richer constraints and revised attributes/edges/rules structure.
tn-alloc/index.mdRewrites TN allocation documentation to explain number expressions, channels, edges, and governance.
tn-alloc/example-tn-alloc.jsonUpdates example payload to match TN allocation v2 structure (numbers array, channel array, updated SAIDs).
registry.jsonUpdates registry entries to new schema SAIDs for tn-alloc, ovc-org-vet, and ovc-brand-owner.
ovc-org-vet/rules.jsonRemoves the standalone rules JSON file.
ovc-org-vet/ovc-org-vet.schema.jsonUpdates OVC Org Identity schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-org-vet/index.mdUpdates OVC Org Identity documentation to reflect new intent and field structure.
ovc-brand-owner/ovc-brand-owner.schema.jsonUpdates OVC Brand Owner schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-brand-owner/index.mdExpands OVC Brand Owner documentation and usage guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadtn-alloc/tn-alloc.schema.json Outdated
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment on lines +193 to +197
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment on lines +229 to +233
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment threadovc-brand-owner/index.md Outdated

### Required and optional attributes

Only `i` (issuee AID) and `dt` (issuance datetime) are required in the attributes block. `vcard` and `goals` are both optional, though in practice a brand owner credential without a `vcard` is of limited use. Both fields may be selectively disclosed.
Comment threadovc-brand-owner/index.md Outdated
CopilotAI review requested due to automatic review settings June 1, 2026 18:16
@Arsh-SandhuArsh-Sandhu changed the title [VC-1162] update org-identity and brand owner schemas[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemasJun 1, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 18 comments.

Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment on lines 296 to 299
{
"description": "Rules section SAID",
"type": "string"
},
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-brand-owner/ovc-brand-owner.schema.json
Comment threadovc-org-vet/index.md Outdated
Comment on lines +74 to +80
The `r` (rules) block uses citation-style rules inherited from the credential design: the listed legal identifiers are citations — they point to external registry records. The rules make explicit that:

- Pointing to an identifier does **not** imply endorsement of or agreement with the cited content (`onlyCommitToPoint`).
- The credential is not meant to be used in isolation; its semantics are communicated via referencing ACDCs (`useViaEdges`).
- Verifying the authenticity of the cited external data is the verifier's responsibility (`undefinedVerification`).
- Revocation of the credential and revocation of the cited data are independent events (`undefinedRevocation`).
- A `governance` field must identify the governance framework under which the credential was issued.
Comment threadovc-brand-owner/index.md Outdated
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
Comment threadovc-brand-owner/index.md Outdated
Comment on lines +62 to +63
| `issuer` | No | Links to an identity credential (e.g., OVC Org Identity, vLEI) proving the identity of the issuer. Uses `I2I` operator. |
| `brandauth` | No | Links to a credential proving brand authority — e.g., a trademark registration or license agreement. Uses `I2I` operator. |
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
@Arsh-Sandhu
Arsh-Sandhu requested a review from dhh1128June 1, 2026 18:24

@dhh1128dhh1128 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review against the stated success criteria

Thanks @Arsh-Sandhu — solid PR. Mechanically it's in good shape: all three schemas are valid JSON-Schema Draft 2020-12, every $id/nested-block SAID recomputes correctly and matches registry.json, and example-tn-alloc.json validates against the new tn-alloc schema.

Scorecard:

  • version ✅ — all 1.0.02.0.0 (see inline note to confirm the GSMA-trial value).
  • names ✅ (mostly) — titles use OVC / "Org Identity" / no dossier-vs-credential misuse; residual "org vet" wording noted inline.
  • rules ✅ — governance statement present in all three (but see the org-identity citation-rules blocker inline).
  • constraints⚠️ — strong regexes for v/d/i/ri/s, LEI, E.164, channel enum, LOA; gaps noted inline (E.164 leading zero, unconstrained u, and the compact-form SAID strings: ovc-org-vet/ovc-brand-owner pattern-constrain the compact r string, but tn-alloc's compact a/e/r branches are bare type: string — pin ^E[A-Za-z0-9_-]{43}$ for consistency).
  • examples ✅ (mostly) — most fields have believable examples; see pre-existing vcard note below.
  • docs ✅ — all three have substantial index.md; defects noted inline + below.
  • multichannel(strongest part) — tn-alloc makes channel an optional ["sms","voice"] array (one channel-agnostic credential, no proliferation), and brand-owner uses goals to scope channel/purpose. Well reasoned in the docs and exactly the "single type, optional" direction we wanted.

Top things to address: (1) the citation-semantics rules on the org-identity credential, (2) the legalIdentifiers schema↔doc contradiction, (3) the doc defects below.

Pre-existing issues (outside this diff, so not inline — but worth fixing while here)

These live on lines the PR didn't change, so GitHub won't let me anchor a comment:

  • ovc-org-vet/index.md LoA table is broken & has typos: the "gold" (LoA 3) row is column-shifted (its <ol> landed in the intended meaning column, with a stray </li></li> and a missing <li>); threshhold → "threshold"; FBACFBCA (correct once, then misspelled 3×); ISO/IEC 2915ISO/IEC 29115; LoA 1 row duplicates "tools" ("legalities, tools, governance, tools…").
  • ovc-brand-ownervcard/goals use format: "cesr" on items that are vCard content lines / Aries goal codes (not CESR primitives) — questionable format. Also the vcardexamples array lists individual strings at the array level, so each "example" isn't a valid instance of the array property (wrap as one example array, or move under items).

Full off-PR write-up is in my review notes; happy to expand on any of these.

"items": {
"type": "string",
"description": "A single E164 telephone number or an inclusive range. Single number: '+' followed by 7-15 digits. Range: two E164 numbers separated by a hyphen (e.g., '+15551230000-+15551239999').",
"pattern": "^\\+[0-9]{7,15}(-\\+[0-9]{7,15})?$"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E.164 regex is slightly too permissive.^\+[0-9]{7,15}(-\+[0-9]{7,15})?$ allows a leading zero, but E.164 country codes never start with 0. Suggest pinning the first digit non-zero:

^\+[1-9][0-9]{6,14}(-\+[1-9][0-9]{6,14})?$

(Range start≤end and equal-length endpoints can't be enforced in regex — the index.md correctly defers that to verifier evaluation, which is fine.)

"EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC"
]
},
"u": {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u (salt) is unconstrained here and in the other two schemas (type: string, no pattern). Per the "constrain inputs as much as possible" goal, consider a pattern for a 128-bit CESR salt, e.g. ^0A[A-Za-z0-9_-]{22}$.

Also: top-level required is inconsistent across the three schemas — tn-alloc requires u, but ovc-org-vet and ovc-brand-owner make it optional. Pick one convention and apply it uniformly.

"type": "object",
"credentialType": "TNAllocationCredential",
"version": "1.0.0",
"version": "2.0.0",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version: bumped 1.0.02.0.0 on all three — good (≥ 1.0 and differs from the value on main). Just confirming: the GSMA-trial schemas were at 1.0.0, so 2.0.0 satisfies "must differ from the trial version". If the trial actually shipped something other than 1.0.0, double-check there's no collision.

(Minor: version is a non-standard JSON-Schema keyword — ignored by validators — but it's the existing repo convention, so fine.)

"type": "object",
"properties": {
"type": {
"description": "Category or source of the identifier (e.g., lei, gleif, gb, che, duns, edgar, domain, linkedin, etc.)",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schema ↔ doc contradiction. This lists domain and linkedin as example type values, but index.md says "Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity." One of the two is wrong — reconcile.

Separately, the example vocabulary differs between schema (gb, che) and doc (uk-crn, che, us-ein). Consider a single controlled vocabulary for type (even just consistent examples).

"LOA": {
"description": "Level of Assurance \u2014 a positive number where larger values denote higher assurance (1=bronze, 2=silver, 3=gold). Integer values represent defined tiers; decimal sub-values (e.g., 2.1) allow nuance within a tier. Verifiers should accept any credential where LOA is >= their required threshold.",
"type": "number",
"minimum": 0,

@dhh1128dhh1128Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant bounds.minimum: 0 together with exclusiveMinimum: 0 is contradictory. If LOA can be zero, then eclusive is wrong; if not, then minimum is wrong.

"type": "string",
"pattern": "^E[A-Za-z0-9_-]{43}$",
"examples": [
"EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale s example. This uses EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z, which is the brand-owner schema's old (pre-PR) SAID; the new $id is EImfvpfRx4YKhTzAzdZzCCjSNmwtY5yw9QlpZirG6OUa. A self-referential s example should show the current schema SAID. (Same old SAID is reused as the brandauth.s example further down.)

Comment threadovc-org-vet/index.md

**At least one identifier should be globally unambiguous and portable across jurisdictions** — typically an LEI. National registry IDs (like UK Companies House `gb` or Swiss `che` numbers) are also valid and can coexist with the LEI.

Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity across jurisdictions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contradicts the schema: ovc-org-vet.schema.json lists domain and linkedin as example legalIdentifiers types, but here they're "intentionally excluded." Pick one and align both.

Comment threadovc-org-vet/index.md

The OVC Org Identity Credential is analogous in intent to the [LE vLEI](https://docs.origincloud.net/start/concepts/creds/vleis) defined by GLEIF (which maps to LoA 3), but its schema is designed to be simpler and to accommodate a wider range of national registry sources.

![suggested org vet visual](org-vet-256.png)<br>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Residual "org vet" naming. The title was updated to OVC Org Identity Credential (good), but the body still says "org vet" / "Org vet credentials" in places, and the image assets are org-vet-*.png/.svg. For consistency with the naming goal ("use 'org identity' rather than 'org vet'"), update the prose and consider renaming the image files (and eventually the directory).

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@dhh1128
dhh1128 merged commit 7c2f019 into mainJun 10, 2026
@dhh1128
dhh1128 deleted the VC-1162 branch June 29, 2026 19:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Arsh-Sandhu@dhh1128
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas by Arsh-Sandhu · Pull Request #32 · provenant-dev/public-schema · GitHub
Skip to content

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas - #32

Merged
dhh1128 merged 6 commits into
mainfrom
VC-1162
Jun 10, 2026
Merged

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas#32
dhh1128 merged 6 commits into
mainfrom
VC-1162

Conversation

@Arsh-Sandhu

Copy link
Copy Markdown
Member

No description provided.

CopilotAI review requested due to automatic review settings June 1, 2026 17:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the OVC Org Identity, OVC Brand Owner, and TN Allocation credential schemas/docs to v2, aligning them with JSON Schema draft 2020-12 and expanding field descriptions and constraints.

Changes:

  • Bump schemas to version 2.0.0, update $schema to draft 2020-12, and refresh schema SAIDs in registry.json.
  • Revise TN allocation attributes to support array-based number expressions (single numbers + inclusive ranges) and multi-channel scoping.
  • Expand documentation in the index.md files to explain intent, semantics, and edge/rules structure.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 17 comments.

Show a summary per file
FileDescription
tn-alloc/tn-alloc.schema.jsonUpdates TN allocation schema to v2 with richer constraints and revised attributes/edges/rules structure.
tn-alloc/index.mdRewrites TN allocation documentation to explain number expressions, channels, edges, and governance.
tn-alloc/example-tn-alloc.jsonUpdates example payload to match TN allocation v2 structure (numbers array, channel array, updated SAIDs).
registry.jsonUpdates registry entries to new schema SAIDs for tn-alloc, ovc-org-vet, and ovc-brand-owner.
ovc-org-vet/rules.jsonRemoves the standalone rules JSON file.
ovc-org-vet/ovc-org-vet.schema.jsonUpdates OVC Org Identity schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-org-vet/index.mdUpdates OVC Org Identity documentation to reflect new intent and field structure.
ovc-brand-owner/ovc-brand-owner.schema.jsonUpdates OVC Brand Owner schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-brand-owner/index.mdExpands OVC Brand Owner documentation and usage guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadtn-alloc/tn-alloc.schema.json Outdated
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment on lines +193 to +197
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment on lines +229 to +233
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment threadovc-brand-owner/index.md Outdated

### Required and optional attributes

Only `i` (issuee AID) and `dt` (issuance datetime) are required in the attributes block. `vcard` and `goals` are both optional, though in practice a brand owner credential without a `vcard` is of limited use. Both fields may be selectively disclosed.
Comment threadovc-brand-owner/index.md Outdated
CopilotAI review requested due to automatic review settings June 1, 2026 18:16
@Arsh-SandhuArsh-Sandhu changed the title [VC-1162] update org-identity and brand owner schemas[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemasJun 1, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 18 comments.

Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment on lines 296 to 299
{
"description": "Rules section SAID",
"type": "string"
},
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-brand-owner/ovc-brand-owner.schema.json
Comment threadovc-org-vet/index.md Outdated
Comment on lines +74 to +80
The `r` (rules) block uses citation-style rules inherited from the credential design: the listed legal identifiers are citations — they point to external registry records. The rules make explicit that:

- Pointing to an identifier does **not** imply endorsement of or agreement with the cited content (`onlyCommitToPoint`).
- The credential is not meant to be used in isolation; its semantics are communicated via referencing ACDCs (`useViaEdges`).
- Verifying the authenticity of the cited external data is the verifier's responsibility (`undefinedVerification`).
- Revocation of the credential and revocation of the cited data are independent events (`undefinedRevocation`).
- A `governance` field must identify the governance framework under which the credential was issued.
Comment threadovc-brand-owner/index.md Outdated
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
Comment threadovc-brand-owner/index.md Outdated
Comment on lines +62 to +63
| `issuer` | No | Links to an identity credential (e.g., OVC Org Identity, vLEI) proving the identity of the issuer. Uses `I2I` operator. |
| `brandauth` | No | Links to a credential proving brand authority — e.g., a trademark registration or license agreement. Uses `I2I` operator. |
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
@Arsh-Sandhu
Arsh-Sandhu requested a review from dhh1128June 1, 2026 18:24

@dhh1128dhh1128 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review against the stated success criteria

Thanks @Arsh-Sandhu — solid PR. Mechanically it's in good shape: all three schemas are valid JSON-Schema Draft 2020-12, every $id/nested-block SAID recomputes correctly and matches registry.json, and example-tn-alloc.json validates against the new tn-alloc schema.

Scorecard:

  • version ✅ — all 1.0.02.0.0 (see inline note to confirm the GSMA-trial value).
  • names ✅ (mostly) — titles use OVC / "Org Identity" / no dossier-vs-credential misuse; residual "org vet" wording noted inline.
  • rules ✅ — governance statement present in all three (but see the org-identity citation-rules blocker inline).
  • constraints⚠️ — strong regexes for v/d/i/ri/s, LEI, E.164, channel enum, LOA; gaps noted inline (E.164 leading zero, unconstrained u, and the compact-form SAID strings: ovc-org-vet/ovc-brand-owner pattern-constrain the compact r string, but tn-alloc's compact a/e/r branches are bare type: string — pin ^E[A-Za-z0-9_-]{43}$ for consistency).
  • examples ✅ (mostly) — most fields have believable examples; see pre-existing vcard note below.
  • docs ✅ — all three have substantial index.md; defects noted inline + below.
  • multichannel(strongest part) — tn-alloc makes channel an optional ["sms","voice"] array (one channel-agnostic credential, no proliferation), and brand-owner uses goals to scope channel/purpose. Well reasoned in the docs and exactly the "single type, optional" direction we wanted.

Top things to address: (1) the citation-semantics rules on the org-identity credential, (2) the legalIdentifiers schema↔doc contradiction, (3) the doc defects below.

Pre-existing issues (outside this diff, so not inline — but worth fixing while here)

These live on lines the PR didn't change, so GitHub won't let me anchor a comment:

  • ovc-org-vet/index.md LoA table is broken & has typos: the "gold" (LoA 3) row is column-shifted (its <ol> landed in the intended meaning column, with a stray </li></li> and a missing <li>); threshhold → "threshold"; FBACFBCA (correct once, then misspelled 3×); ISO/IEC 2915ISO/IEC 29115; LoA 1 row duplicates "tools" ("legalities, tools, governance, tools…").
  • ovc-brand-ownervcard/goals use format: "cesr" on items that are vCard content lines / Aries goal codes (not CESR primitives) — questionable format. Also the vcardexamples array lists individual strings at the array level, so each "example" isn't a valid instance of the array property (wrap as one example array, or move under items).

Full off-PR write-up is in my review notes; happy to expand on any of these.

"items": {
"type": "string",
"description": "A single E164 telephone number or an inclusive range. Single number: '+' followed by 7-15 digits. Range: two E164 numbers separated by a hyphen (e.g., '+15551230000-+15551239999').",
"pattern": "^\\+[0-9]{7,15}(-\\+[0-9]{7,15})?$"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E.164 regex is slightly too permissive.^\+[0-9]{7,15}(-\+[0-9]{7,15})?$ allows a leading zero, but E.164 country codes never start with 0. Suggest pinning the first digit non-zero:

^\+[1-9][0-9]{6,14}(-\+[1-9][0-9]{6,14})?$

(Range start≤end and equal-length endpoints can't be enforced in regex — the index.md correctly defers that to verifier evaluation, which is fine.)

"EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC"
]
},
"u": {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u (salt) is unconstrained here and in the other two schemas (type: string, no pattern). Per the "constrain inputs as much as possible" goal, consider a pattern for a 128-bit CESR salt, e.g. ^0A[A-Za-z0-9_-]{22}$.

Also: top-level required is inconsistent across the three schemas — tn-alloc requires u, but ovc-org-vet and ovc-brand-owner make it optional. Pick one convention and apply it uniformly.

"type": "object",
"credentialType": "TNAllocationCredential",
"version": "1.0.0",
"version": "2.0.0",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version: bumped 1.0.02.0.0 on all three — good (≥ 1.0 and differs from the value on main). Just confirming: the GSMA-trial schemas were at 1.0.0, so 2.0.0 satisfies "must differ from the trial version". If the trial actually shipped something other than 1.0.0, double-check there's no collision.

(Minor: version is a non-standard JSON-Schema keyword — ignored by validators — but it's the existing repo convention, so fine.)

"type": "object",
"properties": {
"type": {
"description": "Category or source of the identifier (e.g., lei, gleif, gb, che, duns, edgar, domain, linkedin, etc.)",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schema ↔ doc contradiction. This lists domain and linkedin as example type values, but index.md says "Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity." One of the two is wrong — reconcile.

Separately, the example vocabulary differs between schema (gb, che) and doc (uk-crn, che, us-ein). Consider a single controlled vocabulary for type (even just consistent examples).

"LOA": {
"description": "Level of Assurance \u2014 a positive number where larger values denote higher assurance (1=bronze, 2=silver, 3=gold). Integer values represent defined tiers; decimal sub-values (e.g., 2.1) allow nuance within a tier. Verifiers should accept any credential where LOA is >= their required threshold.",
"type": "number",
"minimum": 0,

@dhh1128dhh1128Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant bounds.minimum: 0 together with exclusiveMinimum: 0 is contradictory. If LOA can be zero, then eclusive is wrong; if not, then minimum is wrong.

"type": "string",
"pattern": "^E[A-Za-z0-9_-]{43}$",
"examples": [
"EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale s example. This uses EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z, which is the brand-owner schema's old (pre-PR) SAID; the new $id is EImfvpfRx4YKhTzAzdZzCCjSNmwtY5yw9QlpZirG6OUa. A self-referential s example should show the current schema SAID. (Same old SAID is reused as the brandauth.s example further down.)

Comment threadovc-org-vet/index.md

**At least one identifier should be globally unambiguous and portable across jurisdictions** — typically an LEI. National registry IDs (like UK Companies House `gb` or Swiss `che` numbers) are also valid and can coexist with the LEI.

Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity across jurisdictions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contradicts the schema: ovc-org-vet.schema.json lists domain and linkedin as example legalIdentifiers types, but here they're "intentionally excluded." Pick one and align both.

Comment threadovc-org-vet/index.md

The OVC Org Identity Credential is analogous in intent to the [LE vLEI](https://docs.origincloud.net/start/concepts/creds/vleis) defined by GLEIF (which maps to LoA 3), but its schema is designed to be simpler and to accommodate a wider range of national registry sources.

![suggested org vet visual](org-vet-256.png)<br>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Residual "org vet" naming. The title was updated to OVC Org Identity Credential (good), but the body still says "org vet" / "Org vet credentials" in places, and the image assets are org-vet-*.png/.svg. For consistency with the naming goal ("use 'org identity' rather than 'org vet'"), update the prose and consider renaming the image files (and eventually the directory).

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@dhh1128
dhh1128 merged commit 7c2f019 into mainJun 10, 2026
@dhh1128
dhh1128 deleted the VC-1162 branch June 29, 2026 19:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Arsh-Sandhu@dhh1128
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas by Arsh-Sandhu · Pull Request #32 · provenant-dev/public-schema · GitHub
Skip to content

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas - #32

Merged
dhh1128 merged 6 commits into
mainfrom
VC-1162
Jun 10, 2026
Merged

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas#32
dhh1128 merged 6 commits into
mainfrom
VC-1162

Conversation

@Arsh-Sandhu

Copy link
Copy Markdown
Member

No description provided.

CopilotAI review requested due to automatic review settings June 1, 2026 17:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the OVC Org Identity, OVC Brand Owner, and TN Allocation credential schemas/docs to v2, aligning them with JSON Schema draft 2020-12 and expanding field descriptions and constraints.

Changes:

  • Bump schemas to version 2.0.0, update $schema to draft 2020-12, and refresh schema SAIDs in registry.json.
  • Revise TN allocation attributes to support array-based number expressions (single numbers + inclusive ranges) and multi-channel scoping.
  • Expand documentation in the index.md files to explain intent, semantics, and edge/rules structure.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 17 comments.

Show a summary per file
FileDescription
tn-alloc/tn-alloc.schema.jsonUpdates TN allocation schema to v2 with richer constraints and revised attributes/edges/rules structure.
tn-alloc/index.mdRewrites TN allocation documentation to explain number expressions, channels, edges, and governance.
tn-alloc/example-tn-alloc.jsonUpdates example payload to match TN allocation v2 structure (numbers array, channel array, updated SAIDs).
registry.jsonUpdates registry entries to new schema SAIDs for tn-alloc, ovc-org-vet, and ovc-brand-owner.
ovc-org-vet/rules.jsonRemoves the standalone rules JSON file.
ovc-org-vet/ovc-org-vet.schema.jsonUpdates OVC Org Identity schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-org-vet/index.mdUpdates OVC Org Identity documentation to reflect new intent and field structure.
ovc-brand-owner/ovc-brand-owner.schema.jsonUpdates OVC Brand Owner schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-brand-owner/index.mdExpands OVC Brand Owner documentation and usage guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadtn-alloc/tn-alloc.schema.json Outdated
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment on lines +193 to +197
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment on lines +229 to +233
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment threadovc-brand-owner/index.md Outdated

### Required and optional attributes

Only `i` (issuee AID) and `dt` (issuance datetime) are required in the attributes block. `vcard` and `goals` are both optional, though in practice a brand owner credential without a `vcard` is of limited use. Both fields may be selectively disclosed.
Comment threadovc-brand-owner/index.md Outdated
CopilotAI review requested due to automatic review settings June 1, 2026 18:16
@Arsh-SandhuArsh-Sandhu changed the title [VC-1162] update org-identity and brand owner schemas[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemasJun 1, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 18 comments.

Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment on lines 296 to 299
{
"description": "Rules section SAID",
"type": "string"
},
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-brand-owner/ovc-brand-owner.schema.json
Comment threadovc-org-vet/index.md Outdated
Comment on lines +74 to +80
The `r` (rules) block uses citation-style rules inherited from the credential design: the listed legal identifiers are citations — they point to external registry records. The rules make explicit that:

- Pointing to an identifier does **not** imply endorsement of or agreement with the cited content (`onlyCommitToPoint`).
- The credential is not meant to be used in isolation; its semantics are communicated via referencing ACDCs (`useViaEdges`).
- Verifying the authenticity of the cited external data is the verifier's responsibility (`undefinedVerification`).
- Revocation of the credential and revocation of the cited data are independent events (`undefinedRevocation`).
- A `governance` field must identify the governance framework under which the credential was issued.
Comment threadovc-brand-owner/index.md Outdated
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
Comment threadovc-brand-owner/index.md Outdated
Comment on lines +62 to +63
| `issuer` | No | Links to an identity credential (e.g., OVC Org Identity, vLEI) proving the identity of the issuer. Uses `I2I` operator. |
| `brandauth` | No | Links to a credential proving brand authority — e.g., a trademark registration or license agreement. Uses `I2I` operator. |
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
@Arsh-Sandhu
Arsh-Sandhu requested a review from dhh1128June 1, 2026 18:24

@dhh1128dhh1128 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review against the stated success criteria

Thanks @Arsh-Sandhu — solid PR. Mechanically it's in good shape: all three schemas are valid JSON-Schema Draft 2020-12, every $id/nested-block SAID recomputes correctly and matches registry.json, and example-tn-alloc.json validates against the new tn-alloc schema.

Scorecard:

  • version ✅ — all 1.0.02.0.0 (see inline note to confirm the GSMA-trial value).
  • names ✅ (mostly) — titles use OVC / "Org Identity" / no dossier-vs-credential misuse; residual "org vet" wording noted inline.
  • rules ✅ — governance statement present in all three (but see the org-identity citation-rules blocker inline).
  • constraints⚠️ — strong regexes for v/d/i/ri/s, LEI, E.164, channel enum, LOA; gaps noted inline (E.164 leading zero, unconstrained u, and the compact-form SAID strings: ovc-org-vet/ovc-brand-owner pattern-constrain the compact r string, but tn-alloc's compact a/e/r branches are bare type: string — pin ^E[A-Za-z0-9_-]{43}$ for consistency).
  • examples ✅ (mostly) — most fields have believable examples; see pre-existing vcard note below.
  • docs ✅ — all three have substantial index.md; defects noted inline + below.
  • multichannel(strongest part) — tn-alloc makes channel an optional ["sms","voice"] array (one channel-agnostic credential, no proliferation), and brand-owner uses goals to scope channel/purpose. Well reasoned in the docs and exactly the "single type, optional" direction we wanted.

Top things to address: (1) the citation-semantics rules on the org-identity credential, (2) the legalIdentifiers schema↔doc contradiction, (3) the doc defects below.

Pre-existing issues (outside this diff, so not inline — but worth fixing while here)

These live on lines the PR didn't change, so GitHub won't let me anchor a comment:

  • ovc-org-vet/index.md LoA table is broken & has typos: the "gold" (LoA 3) row is column-shifted (its <ol> landed in the intended meaning column, with a stray </li></li> and a missing <li>); threshhold → "threshold"; FBACFBCA (correct once, then misspelled 3×); ISO/IEC 2915ISO/IEC 29115; LoA 1 row duplicates "tools" ("legalities, tools, governance, tools…").
  • ovc-brand-ownervcard/goals use format: "cesr" on items that are vCard content lines / Aries goal codes (not CESR primitives) — questionable format. Also the vcardexamples array lists individual strings at the array level, so each "example" isn't a valid instance of the array property (wrap as one example array, or move under items).

Full off-PR write-up is in my review notes; happy to expand on any of these.

"items": {
"type": "string",
"description": "A single E164 telephone number or an inclusive range. Single number: '+' followed by 7-15 digits. Range: two E164 numbers separated by a hyphen (e.g., '+15551230000-+15551239999').",
"pattern": "^\\+[0-9]{7,15}(-\\+[0-9]{7,15})?$"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E.164 regex is slightly too permissive.^\+[0-9]{7,15}(-\+[0-9]{7,15})?$ allows a leading zero, but E.164 country codes never start with 0. Suggest pinning the first digit non-zero:

^\+[1-9][0-9]{6,14}(-\+[1-9][0-9]{6,14})?$

(Range start≤end and equal-length endpoints can't be enforced in regex — the index.md correctly defers that to verifier evaluation, which is fine.)

"EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC"
]
},
"u": {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u (salt) is unconstrained here and in the other two schemas (type: string, no pattern). Per the "constrain inputs as much as possible" goal, consider a pattern for a 128-bit CESR salt, e.g. ^0A[A-Za-z0-9_-]{22}$.

Also: top-level required is inconsistent across the three schemas — tn-alloc requires u, but ovc-org-vet and ovc-brand-owner make it optional. Pick one convention and apply it uniformly.

"type": "object",
"credentialType": "TNAllocationCredential",
"version": "1.0.0",
"version": "2.0.0",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version: bumped 1.0.02.0.0 on all three — good (≥ 1.0 and differs from the value on main). Just confirming: the GSMA-trial schemas were at 1.0.0, so 2.0.0 satisfies "must differ from the trial version". If the trial actually shipped something other than 1.0.0, double-check there's no collision.

(Minor: version is a non-standard JSON-Schema keyword — ignored by validators — but it's the existing repo convention, so fine.)

"type": "object",
"properties": {
"type": {
"description": "Category or source of the identifier (e.g., lei, gleif, gb, che, duns, edgar, domain, linkedin, etc.)",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schema ↔ doc contradiction. This lists domain and linkedin as example type values, but index.md says "Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity." One of the two is wrong — reconcile.

Separately, the example vocabulary differs between schema (gb, che) and doc (uk-crn, che, us-ein). Consider a single controlled vocabulary for type (even just consistent examples).

"LOA": {
"description": "Level of Assurance \u2014 a positive number where larger values denote higher assurance (1=bronze, 2=silver, 3=gold). Integer values represent defined tiers; decimal sub-values (e.g., 2.1) allow nuance within a tier. Verifiers should accept any credential where LOA is >= their required threshold.",
"type": "number",
"minimum": 0,

@dhh1128dhh1128Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant bounds.minimum: 0 together with exclusiveMinimum: 0 is contradictory. If LOA can be zero, then eclusive is wrong; if not, then minimum is wrong.

"type": "string",
"pattern": "^E[A-Za-z0-9_-]{43}$",
"examples": [
"EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale s example. This uses EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z, which is the brand-owner schema's old (pre-PR) SAID; the new $id is EImfvpfRx4YKhTzAzdZzCCjSNmwtY5yw9QlpZirG6OUa. A self-referential s example should show the current schema SAID. (Same old SAID is reused as the brandauth.s example further down.)

Comment threadovc-org-vet/index.md

**At least one identifier should be globally unambiguous and portable across jurisdictions** — typically an LEI. National registry IDs (like UK Companies House `gb` or Swiss `che` numbers) are also valid and can coexist with the LEI.

Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity across jurisdictions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contradicts the schema: ovc-org-vet.schema.json lists domain and linkedin as example legalIdentifiers types, but here they're "intentionally excluded." Pick one and align both.

Comment threadovc-org-vet/index.md

The OVC Org Identity Credential is analogous in intent to the [LE vLEI](https://docs.origincloud.net/start/concepts/creds/vleis) defined by GLEIF (which maps to LoA 3), but its schema is designed to be simpler and to accommodate a wider range of national registry sources.

![suggested org vet visual](org-vet-256.png)<br>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Residual "org vet" naming. The title was updated to OVC Org Identity Credential (good), but the body still says "org vet" / "Org vet credentials" in places, and the image assets are org-vet-*.png/.svg. For consistency with the naming goal ("use 'org identity' rather than 'org vet'"), update the prose and consider renaming the image files (and eventually the directory).

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@dhh1128
dhh1128 merged commit 7c2f019 into mainJun 10, 2026
@dhh1128
dhh1128 deleted the VC-1162 branch June 29, 2026 19:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Arsh-Sandhu@dhh1128
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas by Arsh-Sandhu · Pull Request #32 · provenant-dev/public-schema · GitHub
Skip to content

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas - #32

Merged
dhh1128 merged 6 commits into
mainfrom
VC-1162
Jun 10, 2026
Merged

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas#32
dhh1128 merged 6 commits into
mainfrom
VC-1162

Conversation

@Arsh-Sandhu

Copy link
Copy Markdown
Member

No description provided.

CopilotAI review requested due to automatic review settings June 1, 2026 17:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the OVC Org Identity, OVC Brand Owner, and TN Allocation credential schemas/docs to v2, aligning them with JSON Schema draft 2020-12 and expanding field descriptions and constraints.

Changes:

  • Bump schemas to version 2.0.0, update $schema to draft 2020-12, and refresh schema SAIDs in registry.json.
  • Revise TN allocation attributes to support array-based number expressions (single numbers + inclusive ranges) and multi-channel scoping.
  • Expand documentation in the index.md files to explain intent, semantics, and edge/rules structure.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 17 comments.

Show a summary per file
FileDescription
tn-alloc/tn-alloc.schema.jsonUpdates TN allocation schema to v2 with richer constraints and revised attributes/edges/rules structure.
tn-alloc/index.mdRewrites TN allocation documentation to explain number expressions, channels, edges, and governance.
tn-alloc/example-tn-alloc.jsonUpdates example payload to match TN allocation v2 structure (numbers array, channel array, updated SAIDs).
registry.jsonUpdates registry entries to new schema SAIDs for tn-alloc, ovc-org-vet, and ovc-brand-owner.
ovc-org-vet/rules.jsonRemoves the standalone rules JSON file.
ovc-org-vet/ovc-org-vet.schema.jsonUpdates OVC Org Identity schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-org-vet/index.mdUpdates OVC Org Identity documentation to reflect new intent and field structure.
ovc-brand-owner/ovc-brand-owner.schema.jsonUpdates OVC Brand Owner schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-brand-owner/index.mdExpands OVC Brand Owner documentation and usage guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadtn-alloc/tn-alloc.schema.json Outdated
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment on lines +193 to +197
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment on lines +229 to +233
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment threadovc-brand-owner/index.md Outdated

### Required and optional attributes

Only `i` (issuee AID) and `dt` (issuance datetime) are required in the attributes block. `vcard` and `goals` are both optional, though in practice a brand owner credential without a `vcard` is of limited use. Both fields may be selectively disclosed.
Comment threadovc-brand-owner/index.md Outdated
CopilotAI review requested due to automatic review settings June 1, 2026 18:16
@Arsh-SandhuArsh-Sandhu changed the title [VC-1162] update org-identity and brand owner schemas[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemasJun 1, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 18 comments.

Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment on lines 296 to 299
{
"description": "Rules section SAID",
"type": "string"
},
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-brand-owner/ovc-brand-owner.schema.json
Comment threadovc-org-vet/index.md Outdated
Comment on lines +74 to +80
The `r` (rules) block uses citation-style rules inherited from the credential design: the listed legal identifiers are citations — they point to external registry records. The rules make explicit that:

- Pointing to an identifier does **not** imply endorsement of or agreement with the cited content (`onlyCommitToPoint`).
- The credential is not meant to be used in isolation; its semantics are communicated via referencing ACDCs (`useViaEdges`).
- Verifying the authenticity of the cited external data is the verifier's responsibility (`undefinedVerification`).
- Revocation of the credential and revocation of the cited data are independent events (`undefinedRevocation`).
- A `governance` field must identify the governance framework under which the credential was issued.
Comment threadovc-brand-owner/index.md Outdated
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
Comment threadovc-brand-owner/index.md Outdated
Comment on lines +62 to +63
| `issuer` | No | Links to an identity credential (e.g., OVC Org Identity, vLEI) proving the identity of the issuer. Uses `I2I` operator. |
| `brandauth` | No | Links to a credential proving brand authority — e.g., a trademark registration or license agreement. Uses `I2I` operator. |
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
@Arsh-Sandhu
Arsh-Sandhu requested a review from dhh1128June 1, 2026 18:24

@dhh1128dhh1128 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review against the stated success criteria

Thanks @Arsh-Sandhu — solid PR. Mechanically it's in good shape: all three schemas are valid JSON-Schema Draft 2020-12, every $id/nested-block SAID recomputes correctly and matches registry.json, and example-tn-alloc.json validates against the new tn-alloc schema.

Scorecard:

  • version ✅ — all 1.0.02.0.0 (see inline note to confirm the GSMA-trial value).
  • names ✅ (mostly) — titles use OVC / "Org Identity" / no dossier-vs-credential misuse; residual "org vet" wording noted inline.
  • rules ✅ — governance statement present in all three (but see the org-identity citation-rules blocker inline).
  • constraints⚠️ — strong regexes for v/d/i/ri/s, LEI, E.164, channel enum, LOA; gaps noted inline (E.164 leading zero, unconstrained u, and the compact-form SAID strings: ovc-org-vet/ovc-brand-owner pattern-constrain the compact r string, but tn-alloc's compact a/e/r branches are bare type: string — pin ^E[A-Za-z0-9_-]{43}$ for consistency).
  • examples ✅ (mostly) — most fields have believable examples; see pre-existing vcard note below.
  • docs ✅ — all three have substantial index.md; defects noted inline + below.
  • multichannel(strongest part) — tn-alloc makes channel an optional ["sms","voice"] array (one channel-agnostic credential, no proliferation), and brand-owner uses goals to scope channel/purpose. Well reasoned in the docs and exactly the "single type, optional" direction we wanted.

Top things to address: (1) the citation-semantics rules on the org-identity credential, (2) the legalIdentifiers schema↔doc contradiction, (3) the doc defects below.

Pre-existing issues (outside this diff, so not inline — but worth fixing while here)

These live on lines the PR didn't change, so GitHub won't let me anchor a comment:

  • ovc-org-vet/index.md LoA table is broken & has typos: the "gold" (LoA 3) row is column-shifted (its <ol> landed in the intended meaning column, with a stray </li></li> and a missing <li>); threshhold → "threshold"; FBACFBCA (correct once, then misspelled 3×); ISO/IEC 2915ISO/IEC 29115; LoA 1 row duplicates "tools" ("legalities, tools, governance, tools…").
  • ovc-brand-ownervcard/goals use format: "cesr" on items that are vCard content lines / Aries goal codes (not CESR primitives) — questionable format. Also the vcardexamples array lists individual strings at the array level, so each "example" isn't a valid instance of the array property (wrap as one example array, or move under items).

Full off-PR write-up is in my review notes; happy to expand on any of these.

"items": {
"type": "string",
"description": "A single E164 telephone number or an inclusive range. Single number: '+' followed by 7-15 digits. Range: two E164 numbers separated by a hyphen (e.g., '+15551230000-+15551239999').",
"pattern": "^\\+[0-9]{7,15}(-\\+[0-9]{7,15})?$"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E.164 regex is slightly too permissive.^\+[0-9]{7,15}(-\+[0-9]{7,15})?$ allows a leading zero, but E.164 country codes never start with 0. Suggest pinning the first digit non-zero:

^\+[1-9][0-9]{6,14}(-\+[1-9][0-9]{6,14})?$

(Range start≤end and equal-length endpoints can't be enforced in regex — the index.md correctly defers that to verifier evaluation, which is fine.)

"EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC"
]
},
"u": {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u (salt) is unconstrained here and in the other two schemas (type: string, no pattern). Per the "constrain inputs as much as possible" goal, consider a pattern for a 128-bit CESR salt, e.g. ^0A[A-Za-z0-9_-]{22}$.

Also: top-level required is inconsistent across the three schemas — tn-alloc requires u, but ovc-org-vet and ovc-brand-owner make it optional. Pick one convention and apply it uniformly.

"type": "object",
"credentialType": "TNAllocationCredential",
"version": "1.0.0",
"version": "2.0.0",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version: bumped 1.0.02.0.0 on all three — good (≥ 1.0 and differs from the value on main). Just confirming: the GSMA-trial schemas were at 1.0.0, so 2.0.0 satisfies "must differ from the trial version". If the trial actually shipped something other than 1.0.0, double-check there's no collision.

(Minor: version is a non-standard JSON-Schema keyword — ignored by validators — but it's the existing repo convention, so fine.)

"type": "object",
"properties": {
"type": {
"description": "Category or source of the identifier (e.g., lei, gleif, gb, che, duns, edgar, domain, linkedin, etc.)",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schema ↔ doc contradiction. This lists domain and linkedin as example type values, but index.md says "Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity." One of the two is wrong — reconcile.

Separately, the example vocabulary differs between schema (gb, che) and doc (uk-crn, che, us-ein). Consider a single controlled vocabulary for type (even just consistent examples).

"LOA": {
"description": "Level of Assurance \u2014 a positive number where larger values denote higher assurance (1=bronze, 2=silver, 3=gold). Integer values represent defined tiers; decimal sub-values (e.g., 2.1) allow nuance within a tier. Verifiers should accept any credential where LOA is >= their required threshold.",
"type": "number",
"minimum": 0,

@dhh1128dhh1128Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant bounds.minimum: 0 together with exclusiveMinimum: 0 is contradictory. If LOA can be zero, then eclusive is wrong; if not, then minimum is wrong.

"type": "string",
"pattern": "^E[A-Za-z0-9_-]{43}$",
"examples": [
"EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale s example. This uses EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z, which is the brand-owner schema's old (pre-PR) SAID; the new $id is EImfvpfRx4YKhTzAzdZzCCjSNmwtY5yw9QlpZirG6OUa. A self-referential s example should show the current schema SAID. (Same old SAID is reused as the brandauth.s example further down.)

Comment threadovc-org-vet/index.md

**At least one identifier should be globally unambiguous and portable across jurisdictions** — typically an LEI. National registry IDs (like UK Companies House `gb` or Swiss `che` numbers) are also valid and can coexist with the LEI.

Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity across jurisdictions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contradicts the schema: ovc-org-vet.schema.json lists domain and linkedin as example legalIdentifiers types, but here they're "intentionally excluded." Pick one and align both.

Comment threadovc-org-vet/index.md

The OVC Org Identity Credential is analogous in intent to the [LE vLEI](https://docs.origincloud.net/start/concepts/creds/vleis) defined by GLEIF (which maps to LoA 3), but its schema is designed to be simpler and to accommodate a wider range of national registry sources.

![suggested org vet visual](org-vet-256.png)<br>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Residual "org vet" naming. The title was updated to OVC Org Identity Credential (good), but the body still says "org vet" / "Org vet credentials" in places, and the image assets are org-vet-*.png/.svg. For consistency with the naming goal ("use 'org identity' rather than 'org vet'"), update the prose and consider renaming the image files (and eventually the directory).

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@dhh1128
dhh1128 merged commit 7c2f019 into mainJun 10, 2026
@dhh1128
dhh1128 deleted the VC-1162 branch June 29, 2026 19:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Arsh-Sandhu@dhh1128
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas by Arsh-Sandhu · Pull Request #32 · provenant-dev/public-schema · GitHub
Skip to content

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas - #32

Merged
dhh1128 merged 6 commits into
mainfrom
VC-1162
Jun 10, 2026
Merged

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas#32
dhh1128 merged 6 commits into
mainfrom
VC-1162

Conversation

@Arsh-Sandhu

Copy link
Copy Markdown
Member

No description provided.

CopilotAI review requested due to automatic review settings June 1, 2026 17:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the OVC Org Identity, OVC Brand Owner, and TN Allocation credential schemas/docs to v2, aligning them with JSON Schema draft 2020-12 and expanding field descriptions and constraints.

Changes:

  • Bump schemas to version 2.0.0, update $schema to draft 2020-12, and refresh schema SAIDs in registry.json.
  • Revise TN allocation attributes to support array-based number expressions (single numbers + inclusive ranges) and multi-channel scoping.
  • Expand documentation in the index.md files to explain intent, semantics, and edge/rules structure.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 17 comments.

Show a summary per file
FileDescription
tn-alloc/tn-alloc.schema.jsonUpdates TN allocation schema to v2 with richer constraints and revised attributes/edges/rules structure.
tn-alloc/index.mdRewrites TN allocation documentation to explain number expressions, channels, edges, and governance.
tn-alloc/example-tn-alloc.jsonUpdates example payload to match TN allocation v2 structure (numbers array, channel array, updated SAIDs).
registry.jsonUpdates registry entries to new schema SAIDs for tn-alloc, ovc-org-vet, and ovc-brand-owner.
ovc-org-vet/rules.jsonRemoves the standalone rules JSON file.
ovc-org-vet/ovc-org-vet.schema.jsonUpdates OVC Org Identity schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-org-vet/index.mdUpdates OVC Org Identity documentation to reflect new intent and field structure.
ovc-brand-owner/ovc-brand-owner.schema.jsonUpdates OVC Brand Owner schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-brand-owner/index.mdExpands OVC Brand Owner documentation and usage guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadtn-alloc/tn-alloc.schema.json Outdated
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment on lines +193 to +197
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment on lines +229 to +233
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment threadovc-brand-owner/index.md Outdated

### Required and optional attributes

Only `i` (issuee AID) and `dt` (issuance datetime) are required in the attributes block. `vcard` and `goals` are both optional, though in practice a brand owner credential without a `vcard` is of limited use. Both fields may be selectively disclosed.
Comment threadovc-brand-owner/index.md Outdated
CopilotAI review requested due to automatic review settings June 1, 2026 18:16
@Arsh-SandhuArsh-Sandhu changed the title [VC-1162] update org-identity and brand owner schemas[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemasJun 1, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 18 comments.

Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment on lines 296 to 299
{
"description": "Rules section SAID",
"type": "string"
},
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-brand-owner/ovc-brand-owner.schema.json
Comment threadovc-org-vet/index.md Outdated
Comment on lines +74 to +80
The `r` (rules) block uses citation-style rules inherited from the credential design: the listed legal identifiers are citations — they point to external registry records. The rules make explicit that:

- Pointing to an identifier does **not** imply endorsement of or agreement with the cited content (`onlyCommitToPoint`).
- The credential is not meant to be used in isolation; its semantics are communicated via referencing ACDCs (`useViaEdges`).
- Verifying the authenticity of the cited external data is the verifier's responsibility (`undefinedVerification`).
- Revocation of the credential and revocation of the cited data are independent events (`undefinedRevocation`).
- A `governance` field must identify the governance framework under which the credential was issued.
Comment threadovc-brand-owner/index.md Outdated
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
Comment threadovc-brand-owner/index.md Outdated
Comment on lines +62 to +63
| `issuer` | No | Links to an identity credential (e.g., OVC Org Identity, vLEI) proving the identity of the issuer. Uses `I2I` operator. |
| `brandauth` | No | Links to a credential proving brand authority — e.g., a trademark registration or license agreement. Uses `I2I` operator. |
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
@Arsh-Sandhu
Arsh-Sandhu requested a review from dhh1128June 1, 2026 18:24

@dhh1128dhh1128 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review against the stated success criteria

Thanks @Arsh-Sandhu — solid PR. Mechanically it's in good shape: all three schemas are valid JSON-Schema Draft 2020-12, every $id/nested-block SAID recomputes correctly and matches registry.json, and example-tn-alloc.json validates against the new tn-alloc schema.

Scorecard:

  • version ✅ — all 1.0.02.0.0 (see inline note to confirm the GSMA-trial value).
  • names ✅ (mostly) — titles use OVC / "Org Identity" / no dossier-vs-credential misuse; residual "org vet" wording noted inline.
  • rules ✅ — governance statement present in all three (but see the org-identity citation-rules blocker inline).
  • constraints⚠️ — strong regexes for v/d/i/ri/s, LEI, E.164, channel enum, LOA; gaps noted inline (E.164 leading zero, unconstrained u, and the compact-form SAID strings: ovc-org-vet/ovc-brand-owner pattern-constrain the compact r string, but tn-alloc's compact a/e/r branches are bare type: string — pin ^E[A-Za-z0-9_-]{43}$ for consistency).
  • examples ✅ (mostly) — most fields have believable examples; see pre-existing vcard note below.
  • docs ✅ — all three have substantial index.md; defects noted inline + below.
  • multichannel(strongest part) — tn-alloc makes channel an optional ["sms","voice"] array (one channel-agnostic credential, no proliferation), and brand-owner uses goals to scope channel/purpose. Well reasoned in the docs and exactly the "single type, optional" direction we wanted.

Top things to address: (1) the citation-semantics rules on the org-identity credential, (2) the legalIdentifiers schema↔doc contradiction, (3) the doc defects below.

Pre-existing issues (outside this diff, so not inline — but worth fixing while here)

These live on lines the PR didn't change, so GitHub won't let me anchor a comment:

  • ovc-org-vet/index.md LoA table is broken & has typos: the "gold" (LoA 3) row is column-shifted (its <ol> landed in the intended meaning column, with a stray </li></li> and a missing <li>); threshhold → "threshold"; FBACFBCA (correct once, then misspelled 3×); ISO/IEC 2915ISO/IEC 29115; LoA 1 row duplicates "tools" ("legalities, tools, governance, tools…").
  • ovc-brand-ownervcard/goals use format: "cesr" on items that are vCard content lines / Aries goal codes (not CESR primitives) — questionable format. Also the vcardexamples array lists individual strings at the array level, so each "example" isn't a valid instance of the array property (wrap as one example array, or move under items).

Full off-PR write-up is in my review notes; happy to expand on any of these.

"items": {
"type": "string",
"description": "A single E164 telephone number or an inclusive range. Single number: '+' followed by 7-15 digits. Range: two E164 numbers separated by a hyphen (e.g., '+15551230000-+15551239999').",
"pattern": "^\\+[0-9]{7,15}(-\\+[0-9]{7,15})?$"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E.164 regex is slightly too permissive.^\+[0-9]{7,15}(-\+[0-9]{7,15})?$ allows a leading zero, but E.164 country codes never start with 0. Suggest pinning the first digit non-zero:

^\+[1-9][0-9]{6,14}(-\+[1-9][0-9]{6,14})?$

(Range start≤end and equal-length endpoints can't be enforced in regex — the index.md correctly defers that to verifier evaluation, which is fine.)

"EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC"
]
},
"u": {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u (salt) is unconstrained here and in the other two schemas (type: string, no pattern). Per the "constrain inputs as much as possible" goal, consider a pattern for a 128-bit CESR salt, e.g. ^0A[A-Za-z0-9_-]{22}$.

Also: top-level required is inconsistent across the three schemas — tn-alloc requires u, but ovc-org-vet and ovc-brand-owner make it optional. Pick one convention and apply it uniformly.

"type": "object",
"credentialType": "TNAllocationCredential",
"version": "1.0.0",
"version": "2.0.0",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version: bumped 1.0.02.0.0 on all three — good (≥ 1.0 and differs from the value on main). Just confirming: the GSMA-trial schemas were at 1.0.0, so 2.0.0 satisfies "must differ from the trial version". If the trial actually shipped something other than 1.0.0, double-check there's no collision.

(Minor: version is a non-standard JSON-Schema keyword — ignored by validators — but it's the existing repo convention, so fine.)

"type": "object",
"properties": {
"type": {
"description": "Category or source of the identifier (e.g., lei, gleif, gb, che, duns, edgar, domain, linkedin, etc.)",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schema ↔ doc contradiction. This lists domain and linkedin as example type values, but index.md says "Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity." One of the two is wrong — reconcile.

Separately, the example vocabulary differs between schema (gb, che) and doc (uk-crn, che, us-ein). Consider a single controlled vocabulary for type (even just consistent examples).

"LOA": {
"description": "Level of Assurance \u2014 a positive number where larger values denote higher assurance (1=bronze, 2=silver, 3=gold). Integer values represent defined tiers; decimal sub-values (e.g., 2.1) allow nuance within a tier. Verifiers should accept any credential where LOA is >= their required threshold.",
"type": "number",
"minimum": 0,

@dhh1128dhh1128Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant bounds.minimum: 0 together with exclusiveMinimum: 0 is contradictory. If LOA can be zero, then eclusive is wrong; if not, then minimum is wrong.

"type": "string",
"pattern": "^E[A-Za-z0-9_-]{43}$",
"examples": [
"EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale s example. This uses EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z, which is the brand-owner schema's old (pre-PR) SAID; the new $id is EImfvpfRx4YKhTzAzdZzCCjSNmwtY5yw9QlpZirG6OUa. A self-referential s example should show the current schema SAID. (Same old SAID is reused as the brandauth.s example further down.)

Comment threadovc-org-vet/index.md

**At least one identifier should be globally unambiguous and portable across jurisdictions** — typically an LEI. National registry IDs (like UK Companies House `gb` or Swiss `che` numbers) are also valid and can coexist with the LEI.

Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity across jurisdictions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contradicts the schema: ovc-org-vet.schema.json lists domain and linkedin as example legalIdentifiers types, but here they're "intentionally excluded." Pick one and align both.

Comment threadovc-org-vet/index.md

The OVC Org Identity Credential is analogous in intent to the [LE vLEI](https://docs.origincloud.net/start/concepts/creds/vleis) defined by GLEIF (which maps to LoA 3), but its schema is designed to be simpler and to accommodate a wider range of national registry sources.

![suggested org vet visual](org-vet-256.png)<br>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Residual "org vet" naming. The title was updated to OVC Org Identity Credential (good), but the body still says "org vet" / "Org vet credentials" in places, and the image assets are org-vet-*.png/.svg. For consistency with the naming goal ("use 'org identity' rather than 'org vet'"), update the prose and consider renaming the image files (and eventually the directory).

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@dhh1128
dhh1128 merged commit 7c2f019 into mainJun 10, 2026
@dhh1128
dhh1128 deleted the VC-1162 branch June 29, 2026 19:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Arsh-Sandhu@dhh1128
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas by Arsh-Sandhu · Pull Request #32 · provenant-dev/public-schema · GitHub
Skip to content

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas - #32

Merged
dhh1128 merged 6 commits into
mainfrom
VC-1162
Jun 10, 2026
Merged

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas#32
dhh1128 merged 6 commits into
mainfrom
VC-1162

Conversation

@Arsh-Sandhu

Copy link
Copy Markdown
Member

No description provided.

CopilotAI review requested due to automatic review settings June 1, 2026 17:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the OVC Org Identity, OVC Brand Owner, and TN Allocation credential schemas/docs to v2, aligning them with JSON Schema draft 2020-12 and expanding field descriptions and constraints.

Changes:

  • Bump schemas to version 2.0.0, update $schema to draft 2020-12, and refresh schema SAIDs in registry.json.
  • Revise TN allocation attributes to support array-based number expressions (single numbers + inclusive ranges) and multi-channel scoping.
  • Expand documentation in the index.md files to explain intent, semantics, and edge/rules structure.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 17 comments.

Show a summary per file
FileDescription
tn-alloc/tn-alloc.schema.jsonUpdates TN allocation schema to v2 with richer constraints and revised attributes/edges/rules structure.
tn-alloc/index.mdRewrites TN allocation documentation to explain number expressions, channels, edges, and governance.
tn-alloc/example-tn-alloc.jsonUpdates example payload to match TN allocation v2 structure (numbers array, channel array, updated SAIDs).
registry.jsonUpdates registry entries to new schema SAIDs for tn-alloc, ovc-org-vet, and ovc-brand-owner.
ovc-org-vet/rules.jsonRemoves the standalone rules JSON file.
ovc-org-vet/ovc-org-vet.schema.jsonUpdates OVC Org Identity schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-org-vet/index.mdUpdates OVC Org Identity documentation to reflect new intent and field structure.
ovc-brand-owner/ovc-brand-owner.schema.jsonUpdates OVC Brand Owner schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-brand-owner/index.mdExpands OVC Brand Owner documentation and usage guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadtn-alloc/tn-alloc.schema.json Outdated
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment on lines +193 to +197
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment on lines +229 to +233
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment threadovc-brand-owner/index.md Outdated

### Required and optional attributes

Only `i` (issuee AID) and `dt` (issuance datetime) are required in the attributes block. `vcard` and `goals` are both optional, though in practice a brand owner credential without a `vcard` is of limited use. Both fields may be selectively disclosed.
Comment threadovc-brand-owner/index.md Outdated
CopilotAI review requested due to automatic review settings June 1, 2026 18:16
@Arsh-SandhuArsh-Sandhu changed the title [VC-1162] update org-identity and brand owner schemas[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemasJun 1, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 18 comments.

Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment on lines 296 to 299
{
"description": "Rules section SAID",
"type": "string"
},
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-brand-owner/ovc-brand-owner.schema.json
Comment threadovc-org-vet/index.md Outdated
Comment on lines +74 to +80
The `r` (rules) block uses citation-style rules inherited from the credential design: the listed legal identifiers are citations — they point to external registry records. The rules make explicit that:

- Pointing to an identifier does **not** imply endorsement of or agreement with the cited content (`onlyCommitToPoint`).
- The credential is not meant to be used in isolation; its semantics are communicated via referencing ACDCs (`useViaEdges`).
- Verifying the authenticity of the cited external data is the verifier's responsibility (`undefinedVerification`).
- Revocation of the credential and revocation of the cited data are independent events (`undefinedRevocation`).
- A `governance` field must identify the governance framework under which the credential was issued.
Comment threadovc-brand-owner/index.md Outdated
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
Comment threadovc-brand-owner/index.md Outdated
Comment on lines +62 to +63
| `issuer` | No | Links to an identity credential (e.g., OVC Org Identity, vLEI) proving the identity of the issuer. Uses `I2I` operator. |
| `brandauth` | No | Links to a credential proving brand authority — e.g., a trademark registration or license agreement. Uses `I2I` operator. |
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
@Arsh-Sandhu
Arsh-Sandhu requested a review from dhh1128June 1, 2026 18:24

@dhh1128dhh1128 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review against the stated success criteria

Thanks @Arsh-Sandhu — solid PR. Mechanically it's in good shape: all three schemas are valid JSON-Schema Draft 2020-12, every $id/nested-block SAID recomputes correctly and matches registry.json, and example-tn-alloc.json validates against the new tn-alloc schema.

Scorecard:

  • version ✅ — all 1.0.02.0.0 (see inline note to confirm the GSMA-trial value).
  • names ✅ (mostly) — titles use OVC / "Org Identity" / no dossier-vs-credential misuse; residual "org vet" wording noted inline.
  • rules ✅ — governance statement present in all three (but see the org-identity citation-rules blocker inline).
  • constraints⚠️ — strong regexes for v/d/i/ri/s, LEI, E.164, channel enum, LOA; gaps noted inline (E.164 leading zero, unconstrained u, and the compact-form SAID strings: ovc-org-vet/ovc-brand-owner pattern-constrain the compact r string, but tn-alloc's compact a/e/r branches are bare type: string — pin ^E[A-Za-z0-9_-]{43}$ for consistency).
  • examples ✅ (mostly) — most fields have believable examples; see pre-existing vcard note below.
  • docs ✅ — all three have substantial index.md; defects noted inline + below.
  • multichannel(strongest part) — tn-alloc makes channel an optional ["sms","voice"] array (one channel-agnostic credential, no proliferation), and brand-owner uses goals to scope channel/purpose. Well reasoned in the docs and exactly the "single type, optional" direction we wanted.

Top things to address: (1) the citation-semantics rules on the org-identity credential, (2) the legalIdentifiers schema↔doc contradiction, (3) the doc defects below.

Pre-existing issues (outside this diff, so not inline — but worth fixing while here)

These live on lines the PR didn't change, so GitHub won't let me anchor a comment:

  • ovc-org-vet/index.md LoA table is broken & has typos: the "gold" (LoA 3) row is column-shifted (its <ol> landed in the intended meaning column, with a stray </li></li> and a missing <li>); threshhold → "threshold"; FBACFBCA (correct once, then misspelled 3×); ISO/IEC 2915ISO/IEC 29115; LoA 1 row duplicates "tools" ("legalities, tools, governance, tools…").
  • ovc-brand-ownervcard/goals use format: "cesr" on items that are vCard content lines / Aries goal codes (not CESR primitives) — questionable format. Also the vcardexamples array lists individual strings at the array level, so each "example" isn't a valid instance of the array property (wrap as one example array, or move under items).

Full off-PR write-up is in my review notes; happy to expand on any of these.

"items": {
"type": "string",
"description": "A single E164 telephone number or an inclusive range. Single number: '+' followed by 7-15 digits. Range: two E164 numbers separated by a hyphen (e.g., '+15551230000-+15551239999').",
"pattern": "^\\+[0-9]{7,15}(-\\+[0-9]{7,15})?$"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E.164 regex is slightly too permissive.^\+[0-9]{7,15}(-\+[0-9]{7,15})?$ allows a leading zero, but E.164 country codes never start with 0. Suggest pinning the first digit non-zero:

^\+[1-9][0-9]{6,14}(-\+[1-9][0-9]{6,14})?$

(Range start≤end and equal-length endpoints can't be enforced in regex — the index.md correctly defers that to verifier evaluation, which is fine.)

"EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC"
]
},
"u": {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u (salt) is unconstrained here and in the other two schemas (type: string, no pattern). Per the "constrain inputs as much as possible" goal, consider a pattern for a 128-bit CESR salt, e.g. ^0A[A-Za-z0-9_-]{22}$.

Also: top-level required is inconsistent across the three schemas — tn-alloc requires u, but ovc-org-vet and ovc-brand-owner make it optional. Pick one convention and apply it uniformly.

"type": "object",
"credentialType": "TNAllocationCredential",
"version": "1.0.0",
"version": "2.0.0",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version: bumped 1.0.02.0.0 on all three — good (≥ 1.0 and differs from the value on main). Just confirming: the GSMA-trial schemas were at 1.0.0, so 2.0.0 satisfies "must differ from the trial version". If the trial actually shipped something other than 1.0.0, double-check there's no collision.

(Minor: version is a non-standard JSON-Schema keyword — ignored by validators — but it's the existing repo convention, so fine.)

"type": "object",
"properties": {
"type": {
"description": "Category or source of the identifier (e.g., lei, gleif, gb, che, duns, edgar, domain, linkedin, etc.)",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schema ↔ doc contradiction. This lists domain and linkedin as example type values, but index.md says "Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity." One of the two is wrong — reconcile.

Separately, the example vocabulary differs between schema (gb, che) and doc (uk-crn, che, us-ein). Consider a single controlled vocabulary for type (even just consistent examples).

"LOA": {
"description": "Level of Assurance \u2014 a positive number where larger values denote higher assurance (1=bronze, 2=silver, 3=gold). Integer values represent defined tiers; decimal sub-values (e.g., 2.1) allow nuance within a tier. Verifiers should accept any credential where LOA is >= their required threshold.",
"type": "number",
"minimum": 0,

@dhh1128dhh1128Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant bounds.minimum: 0 together with exclusiveMinimum: 0 is contradictory. If LOA can be zero, then eclusive is wrong; if not, then minimum is wrong.

"type": "string",
"pattern": "^E[A-Za-z0-9_-]{43}$",
"examples": [
"EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale s example. This uses EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z, which is the brand-owner schema's old (pre-PR) SAID; the new $id is EImfvpfRx4YKhTzAzdZzCCjSNmwtY5yw9QlpZirG6OUa. A self-referential s example should show the current schema SAID. (Same old SAID is reused as the brandauth.s example further down.)

Comment threadovc-org-vet/index.md

**At least one identifier should be globally unambiguous and portable across jurisdictions** — typically an LEI. National registry IDs (like UK Companies House `gb` or Swiss `che` numbers) are also valid and can coexist with the LEI.

Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity across jurisdictions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contradicts the schema: ovc-org-vet.schema.json lists domain and linkedin as example legalIdentifiers types, but here they're "intentionally excluded." Pick one and align both.

Comment threadovc-org-vet/index.md

The OVC Org Identity Credential is analogous in intent to the [LE vLEI](https://docs.origincloud.net/start/concepts/creds/vleis) defined by GLEIF (which maps to LoA 3), but its schema is designed to be simpler and to accommodate a wider range of national registry sources.

![suggested org vet visual](org-vet-256.png)<br>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Residual "org vet" naming. The title was updated to OVC Org Identity Credential (good), but the body still says "org vet" / "Org vet credentials" in places, and the image assets are org-vet-*.png/.svg. For consistency with the naming goal ("use 'org identity' rather than 'org vet'"), update the prose and consider renaming the image files (and eventually the directory).

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@dhh1128
dhh1128 merged commit 7c2f019 into mainJun 10, 2026
@dhh1128
dhh1128 deleted the VC-1162 branch June 29, 2026 19:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Arsh-Sandhu@dhh1128
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas by Arsh-Sandhu · Pull Request #32 · provenant-dev/public-schema · GitHub
Skip to content

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas - #32

Merged
dhh1128 merged 6 commits into
mainfrom
VC-1162
Jun 10, 2026
Merged

[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemas#32
dhh1128 merged 6 commits into
mainfrom
VC-1162

Conversation

@Arsh-Sandhu

Copy link
Copy Markdown
Member

No description provided.

CopilotAI review requested due to automatic review settings June 1, 2026 17:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the OVC Org Identity, OVC Brand Owner, and TN Allocation credential schemas/docs to v2, aligning them with JSON Schema draft 2020-12 and expanding field descriptions and constraints.

Changes:

  • Bump schemas to version 2.0.0, update $schema to draft 2020-12, and refresh schema SAIDs in registry.json.
  • Revise TN allocation attributes to support array-based number expressions (single numbers + inclusive ranges) and multi-channel scoping.
  • Expand documentation in the index.md files to explain intent, semantics, and edge/rules structure.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 17 comments.

Show a summary per file
FileDescription
tn-alloc/tn-alloc.schema.jsonUpdates TN allocation schema to v2 with richer constraints and revised attributes/edges/rules structure.
tn-alloc/index.mdRewrites TN allocation documentation to explain number expressions, channels, edges, and governance.
tn-alloc/example-tn-alloc.jsonUpdates example payload to match TN allocation v2 structure (numbers array, channel array, updated SAIDs).
registry.jsonUpdates registry entries to new schema SAIDs for tn-alloc, ovc-org-vet, and ovc-brand-owner.
ovc-org-vet/rules.jsonRemoves the standalone rules JSON file.
ovc-org-vet/ovc-org-vet.schema.jsonUpdates OVC Org Identity schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-org-vet/index.mdUpdates OVC Org Identity documentation to reflect new intent and field structure.
ovc-brand-owner/ovc-brand-owner.schema.jsonUpdates OVC Brand Owner schema to v2 with stronger patterns/examples and revised attributes/rules/edges.
ovc-brand-owner/index.mdExpands OVC Brand Owner documentation and usage guidance.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment threadtn-alloc/tn-alloc.schema.json Outdated
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment on lines +193 to +197
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment on lines +229 to +233
"o": {
"description": "Operator indicating issuer AID of this ACDC MUST be the Issuee AID of the node this Edge points to.",
"description": "Issuer-To-Issuee operator: the issuer AID of this ACDC MUST be the issuee AID of the node this edge points to.",
"type": "string",
"const": "I2I"
"default": "I2I",
"examples": [
Comment threadovc-brand-owner/index.md Outdated

### Required and optional attributes

Only `i` (issuee AID) and `dt` (issuance datetime) are required in the attributes block. `vcard` and `goals` are both optional, though in practice a brand owner credential without a `vcard` is of limited use. Both fields may be selectively disclosed.
Comment threadovc-brand-owner/index.md Outdated
CopilotAI review requested due to automatic review settings June 1, 2026 18:16
@Arsh-SandhuArsh-Sandhu changed the title [VC-1162] update org-identity and brand owner schemas[VC-1161] [VC-1162] updated tn, org-identity and brand owner schemasJun 1, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 18 comments.

Comment threadtn-alloc/tn-alloc.schema.json
Comment threadtn-alloc/tn-alloc.schema.json
Comment on lines 296 to 299
{
"description": "Rules section SAID",
"type": "string"
},
Comment threadovc-org-vet/ovc-org-vet.schema.json
Comment threadovc-brand-owner/ovc-brand-owner.schema.json
Comment threadovc-org-vet/index.md Outdated
Comment on lines +74 to +80
The `r` (rules) block uses citation-style rules inherited from the credential design: the listed legal identifiers are citations — they point to external registry records. The rules make explicit that:

- Pointing to an identifier does **not** imply endorsement of or agreement with the cited content (`onlyCommitToPoint`).
- The credential is not meant to be used in isolation; its semantics are communicated via referencing ACDCs (`useViaEdges`).
- Verifying the authenticity of the cited external data is the verifier's responsibility (`undefinedVerification`).
- Revocation of the credential and revocation of the cited data are independent events (`undefinedRevocation`).
- A `governance` field must identify the governance framework under which the credential was issued.
Comment threadovc-brand-owner/index.md Outdated
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
Comment threadovc-brand-owner/index.md Outdated
Comment on lines +62 to +63
| `issuer` | No | Links to an identity credential (e.g., OVC Org Identity, vLEI) proving the identity of the issuer. Uses `I2I` operator. |
| `brandauth` | No | Links to a credential proving brand authority — e.g., a trademark registration or license agreement. Uses `I2I` operator. |
Comment threadovc-org-vet/index.md

| Edge | Required in block? | Purpose |
|---|---|---|
| `issuer` | No | Links to an identity credential proving the identity of the issuing vetter (OVC). Uses `I2I` operator — the issuer AID of this credential must be the issuee AID of the referenced credential. |
@Arsh-Sandhu
Arsh-Sandhu requested a review from dhh1128June 1, 2026 18:24

@dhh1128dhh1128 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review against the stated success criteria

Thanks @Arsh-Sandhu — solid PR. Mechanically it's in good shape: all three schemas are valid JSON-Schema Draft 2020-12, every $id/nested-block SAID recomputes correctly and matches registry.json, and example-tn-alloc.json validates against the new tn-alloc schema.

Scorecard:

  • version ✅ — all 1.0.02.0.0 (see inline note to confirm the GSMA-trial value).
  • names ✅ (mostly) — titles use OVC / "Org Identity" / no dossier-vs-credential misuse; residual "org vet" wording noted inline.
  • rules ✅ — governance statement present in all three (but see the org-identity citation-rules blocker inline).
  • constraints⚠️ — strong regexes for v/d/i/ri/s, LEI, E.164, channel enum, LOA; gaps noted inline (E.164 leading zero, unconstrained u, and the compact-form SAID strings: ovc-org-vet/ovc-brand-owner pattern-constrain the compact r string, but tn-alloc's compact a/e/r branches are bare type: string — pin ^E[A-Za-z0-9_-]{43}$ for consistency).
  • examples ✅ (mostly) — most fields have believable examples; see pre-existing vcard note below.
  • docs ✅ — all three have substantial index.md; defects noted inline + below.
  • multichannel(strongest part) — tn-alloc makes channel an optional ["sms","voice"] array (one channel-agnostic credential, no proliferation), and brand-owner uses goals to scope channel/purpose. Well reasoned in the docs and exactly the "single type, optional" direction we wanted.

Top things to address: (1) the citation-semantics rules on the org-identity credential, (2) the legalIdentifiers schema↔doc contradiction, (3) the doc defects below.

Pre-existing issues (outside this diff, so not inline — but worth fixing while here)

These live on lines the PR didn't change, so GitHub won't let me anchor a comment:

  • ovc-org-vet/index.md LoA table is broken & has typos: the "gold" (LoA 3) row is column-shifted (its <ol> landed in the intended meaning column, with a stray </li></li> and a missing <li>); threshhold → "threshold"; FBACFBCA (correct once, then misspelled 3×); ISO/IEC 2915ISO/IEC 29115; LoA 1 row duplicates "tools" ("legalities, tools, governance, tools…").
  • ovc-brand-ownervcard/goals use format: "cesr" on items that are vCard content lines / Aries goal codes (not CESR primitives) — questionable format. Also the vcardexamples array lists individual strings at the array level, so each "example" isn't a valid instance of the array property (wrap as one example array, or move under items).

Full off-PR write-up is in my review notes; happy to expand on any of these.

"items": {
"type": "string",
"description": "A single E164 telephone number or an inclusive range. Single number: '+' followed by 7-15 digits. Range: two E164 numbers separated by a hyphen (e.g., '+15551230000-+15551239999').",
"pattern": "^\\+[0-9]{7,15}(-\\+[0-9]{7,15})?$"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E.164 regex is slightly too permissive.^\+[0-9]{7,15}(-\+[0-9]{7,15})?$ allows a leading zero, but E.164 country codes never start with 0. Suggest pinning the first digit non-zero:

^\+[1-9][0-9]{6,14}(-\+[1-9][0-9]{6,14})?$

(Range start≤end and equal-length endpoints can't be enforced in regex — the index.md correctly defers that to verifier evaluation, which is fine.)

"EBwNam2e0mYdTx0i9xv78AIm16g1XCkQO8f8yJXaxmJC"
]
},
"u": {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u (salt) is unconstrained here and in the other two schemas (type: string, no pattern). Per the "constrain inputs as much as possible" goal, consider a pattern for a 128-bit CESR salt, e.g. ^0A[A-Za-z0-9_-]{22}$.

Also: top-level required is inconsistent across the three schemas — tn-alloc requires u, but ovc-org-vet and ovc-brand-owner make it optional. Pick one convention and apply it uniformly.

"type": "object",
"credentialType": "TNAllocationCredential",
"version": "1.0.0",
"version": "2.0.0",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version: bumped 1.0.02.0.0 on all three — good (≥ 1.0 and differs from the value on main). Just confirming: the GSMA-trial schemas were at 1.0.0, so 2.0.0 satisfies "must differ from the trial version". If the trial actually shipped something other than 1.0.0, double-check there's no collision.

(Minor: version is a non-standard JSON-Schema keyword — ignored by validators — but it's the existing repo convention, so fine.)

"type": "object",
"properties": {
"type": {
"description": "Category or source of the identifier (e.g., lei, gleif, gb, che, duns, edgar, domain, linkedin, etc.)",

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schema ↔ doc contradiction. This lists domain and linkedin as example type values, but index.md says "Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity." One of the two is wrong — reconcile.

Separately, the example vocabulary differs between schema (gb, che) and doc (uk-crn, che, us-ein). Consider a single controlled vocabulary for type (even just consistent examples).

"LOA": {
"description": "Level of Assurance \u2014 a positive number where larger values denote higher assurance (1=bronze, 2=silver, 3=gold). Integer values represent defined tiers; decimal sub-values (e.g., 2.1) allow nuance within a tier. Verifiers should accept any credential where LOA is >= their required threshold.",
"type": "number",
"minimum": 0,

@dhh1128dhh1128Jun 2, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Redundant bounds.minimum: 0 together with exclusiveMinimum: 0 is contradictory. If LOA can be zero, then eclusive is wrong; if not, then minimum is wrong.

"type": "string",
"pattern": "^E[A-Za-z0-9_-]{43}$",
"examples": [
"EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stale s example. This uses EAoRVmgPyacjhUxaV0nPwiuUuHMjKDpNZrj7ClofZ-3Z, which is the brand-owner schema's old (pre-PR) SAID; the new $id is EImfvpfRx4YKhTzAzdZzCCjSNmwtY5yw9QlpZirG6OUa. A self-referential s example should show the current schema SAID. (Same old SAID is reused as the brandauth.s example further down.)

Comment threadovc-org-vet/index.md

**At least one identifier should be globally unambiguous and portable across jurisdictions** — typically an LEI. National registry IDs (like UK Companies House `gb` or Swiss `che` numbers) are also valid and can coexist with the LEI.

Domain names and social media handles are intentionally excluded: they do not unambiguously identify a legal entity across jurisdictions.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Contradicts the schema: ovc-org-vet.schema.json lists domain and linkedin as example legalIdentifiers types, but here they're "intentionally excluded." Pick one and align both.

Comment threadovc-org-vet/index.md

The OVC Org Identity Credential is analogous in intent to the [LE vLEI](https://docs.origincloud.net/start/concepts/creds/vleis) defined by GLEIF (which maps to LoA 3), but its schema is designed to be simpler and to accommodate a wider range of national registry sources.

![suggested org vet visual](org-vet-256.png)<br>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Residual "org vet" naming. The title was updated to OVC Org Identity Credential (good), but the body still says "org vet" / "Org vet credentials" in places, and the image assets are org-vet-*.png/.svg. For consistency with the naming goal ("use 'org identity' rather than 'org vet'"), update the prose and consider renaming the image files (and eventually the directory).

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@dhh1128
dhh1128 merged commit 7c2f019 into mainJun 10, 2026
@dhh1128
dhh1128 deleted the VC-1162 branch June 29, 2026 19:52
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@Arsh-Sandhu@dhh1128