Uh oh!
There was an error while loading. Please reload this page.
Conversation
There was a problem hiding this comment.
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$schemato draft2020-12, and refresh schema SAIDs inregistry.json. - Revise TN allocation attributes to support array-based number expressions (single numbers + inclusive ranges) and multi-channel scoping.
- Expand documentation in the
index.mdfiles 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
| File | Description |
|---|---|
| tn-alloc/tn-alloc.schema.json | Updates TN allocation schema to v2 with richer constraints and revised attributes/edges/rules structure. |
| tn-alloc/index.md | Rewrites TN allocation documentation to explain number expressions, channels, edges, and governance. |
| tn-alloc/example-tn-alloc.json | Updates example payload to match TN allocation v2 structure (numbers array, channel array, updated SAIDs). |
| registry.json | Updates registry entries to new schema SAIDs for tn-alloc, ovc-org-vet, and ovc-brand-owner. |
| ovc-org-vet/rules.json | Removes the standalone rules JSON file. |
| ovc-org-vet/ovc-org-vet.schema.json | Updates OVC Org Identity schema to v2 with stronger patterns/examples and revised attributes/rules/edges. |
| ovc-org-vet/index.md | Updates OVC Org Identity documentation to reflect new intent and field structure. |
| ovc-brand-owner/ovc-brand-owner.schema.json | Updates OVC Brand Owner schema to v2 with stronger patterns/examples and revised attributes/rules/edges. |
| ovc-brand-owner/index.md | Expands OVC Brand Owner documentation and usage guidance. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
| "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": [ |
| "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": [ |
| ### 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. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
| { | ||
| "description": "Rules section SAID", | ||
| "type": "string" | ||
| }, |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
| 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. |
Uh oh!
There was an error while loading. Please reload this page.
| | 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. | |
| | `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. | |
| | 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. | |
dhh1128
left a comment
There was a problem hiding this comment.
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.0→2.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 ✅ —
governancestatement present in all three (but see the org-identity citation-rules blocker inline). - constraints
⚠️ — strong regexes forv/d/i/ri/s, LEI, E.164,channelenum,LOA; gaps noted inline (E.164 leading zero, unconstrainedu, and the compact-form SAID strings:ovc-org-vet/ovc-brand-ownerpattern-constrain the compactrstring, but tn-alloc's compacta/e/rbranches are baretype: string— pin^E[A-Za-z0-9_-]{43}$for consistency). - examples ✅ (mostly) — most fields have believable examples; see pre-existing
vcardnote below. - docs ✅ — all three have substantial
index.md; defects noted inline + below. - multichannel ✅ (strongest part) — tn-alloc makes
channelan optional["sms","voice"]array (one channel-agnostic credential, no proliferation), and brand-owner usesgoalsto 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.mdLoA 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";FBAC→ FBCA (correct once, then misspelled 3×);ISO/IEC 2915→ ISO/IEC 29115; LoA 1 row duplicates "tools" ("legalities, tools, governance, tools…").ovc-brand-ownervcard/goalsuseformat: "cesr"on items that are vCard content lines / Aries goal codes (not CESR primitives) — questionableformat. Also thevcardexamplesarray 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 underitems).
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})?$" |
There was a problem hiding this comment.
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": { |
There was a problem hiding this comment.
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", |
There was a problem hiding this comment.
version: bumped 1.0.0 → 2.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.)", |
There was a problem hiding this comment.
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, |
There was a problem hiding this comment.
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" |
There was a problem hiding this comment.
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.)
| **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. |
There was a problem hiding this comment.
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.
| 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. | ||
| <br> |
There was a problem hiding this comment.
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>
No description provided.