Eformogi
The Record: protocol draft 0.1 (CC BY 4.0; verifier Apache-2.0)

11. Interoperability

Draft 0.1, chapter added 2026-09-14. Maps the Record and its receipts, field by field, onto the three credential standards receivers already know: the W3C Verifiable Credentials Data Model 2.0, 1EdTech Open Badges 3.0, and 1EdTech Comprehensive Learner Record 2.0. Chapter 07 documents the one credential the reference implementation issues today and sketches these mappings; this chapter checks them against the published specifications and states what a bridge export would emit. No bridge is built; every mapping here is planned until code ships. Status vocabulary per row: maps (a field-for-field correspondence exists and loses nothing), partial (a slot exists but the meaning narrows), none (no counterpart; the bridge carries it in prose or drops it). Facts about the external specifications were checked against their published text and schemas on 2026-09-14; a statement that could not be checked is marked "verify:" rather than asserted.

11.1 The three standards, and what each one is for

W3C Verifiable Credentials Data Model 2.0 (W3C Recommendation, 15 May 2025) is the envelope. A credential is a JSON-LD document whose @context array MUST begin with https://www.w3.org/ns/credentials/v2, whose type includes VerifiableCredential, whose issuer is a URL or an object carrying id (and optionally name and description), whose validity is validFrom and validUntil (the 1.1 names issuanceDate and expirationDate are gone), and whose credentialSubject MAY carry an id and MAY not. Optional top-level name and description are strings or language objects. credentialStatus, credentialSchema, and termsOfUse are typed objects; evidence is a typed object or array; relatedResource (section 5.3 there) ties a credential to bytes elsewhere: each object MUST carry an id and at least one of digestSRI or digestMultibase, with an optional mediaType, so the mechanism is for a resource whose bytes are stable at its URL and can be digested. Securing is delegated: an embedded proof follows the separate Data Integrity specifications, or the whole credential is enveloped with JOSE or COSE and referenced as an EnvelopedVerifiableCredential.

Data Integrity EdDSA Cryptosuites 1.0 (W3C Recommendation, 15 May 2025) defines the two suites an embedded EdDSA proof can name. eddsa-jcs-2022 canonicalizes with JCS (RFC 8785), which is the dialect chapter 02 uses on the values the Record signs; eddsa-rdfc-2022 canonicalizes the RDF dataset and needs a JSON-LD processor. For eddsa-jcs-2022 the published algorithm is: at creation, copy the document's @context onto the proof; hash the canonical proof configuration and the canonical document separately with SHA-256; join proofConfigHash first and transformedDocumentHash second; sign the 64 bytes with Ed25519; render proofValue as base58-btc multibase with the z prefix. At verification, when the proof carries @context, the document's @context MUST start with the proof's values in the same order. The reference implementation's credential proof (chapter 07, vector v20) uses this order and copies @context onto the proof (shared/verifiableCredentials.js); its verifiers (api/verify-credential.js, verifyCredentialProof in the published verifier) do not perform the @context prefix check, which is a leniency on the verifying side only: a credential the reference implementation issues satisfies the check, and a conforming external verifier will accept it. Section 11.6 records this.

Open Badges 3.0 (1EdTech; specification version 3.0, document version 1.4.5 as published, aligned to the VC Data Model 2.0) is the unit-of-achievement profile. An AchievementCredential is a VC whose @context adds https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json, whose type includes VerifiableCredential and either AchievementCredential or OpenBadgeCredential, and which requires @context, id, type, credentialSubject, issuer, and validFrom. It adds awardedDate, name, description, image, evidence, endorsement, endorsementJwt, credentialStatus, credentialSchema, refreshService, and termsOfUse. Its subject is an AchievementSubject (required: type, achievement; optional: id, identifier, result, source, narrative, term, creditsEarned, activityStartDate, activityEndDate, role, licenseNumber, image) holding one Achievement (required: id, type, name, description, criteria; optional: achievementType from an enumeration that includes Course, Competency, LearningProgram, CommunityService, CoCurricular, Fieldwork, Assignment, Assessment, and others; creditsAvailable, alignment, resultDescription, creator, tag, humanCode, fieldOfStudy). A Result carries value, achievedLevel, status, alignment, and a resultDescription reference whose ResultDescription names a resultType (LetterGrade, GradePointAverage, Percent, PerformanceLevel, RawScore, Result, Status, and others). Evidence requires only type and offers id, name, narrative, description, genre, audience. A Profile (issuer or source) carries id, type, name, url, email, phone, description, image, address, otherIdentifier, official, and the person terms givenName, familyName, additionalName, patronymicName, honorificPrefix, honorificSuffix, familyNamePrefix, and dateOfBirth, plus parentOrg (itself a Profile), all sit on Profile in the published schema, so a person can be an issuer. An IdentityObject names a subject without a DID: identityType (an enumeration including name, emailAddress, identifier), identityHash, hashed, salt. An EndorsementCredential (type includes VerifiableCredential and EndorsementCredential; required @context, id, type, name, credentialSubject, issuer, validFrom) lets a third party vouch: its EndorsementSubject is the id of the thing endorsed plus an optional endorsementComment. Proofs: the specification names a JWT proof format and a linked-data proof format (verify: which Data Integrity cryptosuites it enumerates for the latter; eddsa-rdfc-2022 is the common choice in that ecosystem, and eddsa-jcs-2022 may not be listed).

Comprehensive Learner Record 2.0 (1EdTech; specification version 2.0, document version 1.1, issued 14 October 2025) is the container. A ClrCredential is a VC whose @context adds https://purl.imsglobal.org/spec/clr/v2p0/context-2.0.1.json, whose type includes VerifiableCredential and ClrCredential, and which requires @context, id, type, name, credentialSubject, issuer, and validFrom; it adds description, awardedDate, validUntil, image, partial, evidence, endorsement, endorsementJwt, credentialStatus, credentialSchema, refreshService, termsOfUse. Its subject is a ClrSubject (required: type, verifiableCredential; optional: id, identifier, achievement, association). verifiableCredential holds the embedded credentials (the specification's prose names AchievementCredential and EndorsementCredential; verify: whether a compact JWS string is accepted in that array alongside objects). An Association relates two embedded credentials: associationType from exactMatchOf, isChildOf, isParentOf, isPartOf, isPeerOf, isRelatedTo, precedes, replacedBy, with sourceId and targetId. The issuer is a Profile or a URI, and each embedded credential keeps its own issuer, so a container issued by one party may hold credentials issued by others. Correction to chapter 07, section 7.4: the published ClrCredential schema does not place narrative, activityStartDate, activityEndDate, image, or source on ClrSubject; those live on AchievementSubject. The two rows in chapter 07 that map program, philosophy, and the year range onto ClrSubject are withdrawn by this chapter (section 11.3.1 says where they go instead).

11.2 Identity: who the issuer is, and who the learner is

party in the Recordkey today (chapter 04)VC 2.0 issuerOB 3.0 / CLR 2.0 Profilestatus
the family, as records office of recorddid:key:z6Mk..., escrowed by the operator{id: <did:key>, name: <the family's issuer string>}{type: "Profile", id: <did:key>, name: <issuer string>}maps, with one duty: the escrow fact of chapter 04, section 4.7 MUST travel in termsOfUse or description (section 11.5)
the operatordid:web:eformogi.com#key-1did:web:eformogi.com{type: "Profile", id: "did:web:eformogi.com", name: "Eformogi"}maps; used only for what the operator itself asserts (chapter 07 credentials, the ceremony countersignature of section 11.3.3)
an organization issuer (a school declaring a course, chapter 01, section 1.7)none of its own; a declared row is signed by a did:key minted for the declaring account (the org admin's), disclosed on the verify page as "Declared by <school>"{id: <that did:key>, name: <org name>}Profile with the organization's namepartial: the key is an account key held in escrow, not an organization key with a public rotation story; the bridge MUST say so
the learnerno key (the family key is per account, not per person)credentialSubject.id omitted (VC 2.0 makes it OPTIONAL)AchievementSubject.identifier: [{type: "IdentityObject", identityType: "name", hashed: false, identityHash: <student_name>}]maps for what the family already printed; a learner did:key is planned with wallet custody
a witnessnone; the identity level of chapter 03, section 3.9 is a fact about a check, not a keynot an issuerProfile as the name on an Evidence entry; an EndorsementCredential issuer only once witnesses hold keyspartial (section 11.3.3)
the kb_ key bindingitselfnone: VC 2.0 has no key-establishment credential; the DID document and the did:key method are the counterpartnonenone; a bridge names /verify/kb_<id> in termsOfUse (section 11.4) and emits nothing else

11.3 Mapping tables

The source columns name the fields of the public verify payloads of chapter 06, section 6.3, because those are exactly the facts the family already made public; a bridge MUST NOT export more than that without the family's explicit choice at export time (chapter 07, section 7.5, rule 2).

11.3.1 The Witness Transcript™ (tr_) as a ClrCredential

Record fieldCLR 2.0 / VC 2.0 targetstatusnote
(envelope)@context: ["https://www.w3.org/ns/credentials/v2", "https://purl.imsglobal.org/spec/clr/v2p0/context-2.0.1.json"], type: ["VerifiableCredential", "ClrCredential"]maps
id (tr_ + 12 hex)id: "https://eformogi.com/verify/<tr_ id>"partialthe URL returns the human verify page, not the credential; a content-negotiated or .json variant is planned
issuer, issuer_signature.key_idissuer (section 11.2)maps
issued_atvalidFrom and awardedDatemapsboth are the moment the family sealed the record; there is no validUntil because a sealed record does not expire
student_namecredentialSubject.identifier[0] as an IdentityObject of identityType: "name"mapshashed: false because the name is on the printed transcript; a bridge MAY hash it with a salt when the family asks
program, grad_yeardescription (top-level, VC 2.0)partialClrSubject has no narrative slot (section 11.1 correction); the prose form is "Traditional homeschool, NY; expected completion 2027"
name (required by CLR 2.0)"Witness Transcript, <student_name>, issued <date>"mapsthe mark is used under chapter 10, section 10.8; an implementation that has not passed conformance MUST NOT put the name here
courses[]credentialSubject.verifiableCredential[]: one AchievementCredential per cr_ (section 11.3.2)maps
courses[].cr_receipt_id to this tr_credentialSubject.association[]: {type: "Association", associationType: "isPartOf", sourceId: <cr_ credential id>, targetId: <tr_ credential id>}mapsprovenance, exactly as tr_receipt_id is in the Record: outside every hash
course_countthe length of verifiableCredential[]maps
total_creditsnonenoneCLR has no total; a receiver sums creditsEarned; the bridge MAY restate the sum in description
tier_counts, course_signature_rollupnonenoneno notion of per-row trust tier or of a corroboration rollup; chapter 07, section 7.4 already forbids upgrading a chip into a claim, and this chapter keeps that: the four chips and their "issuer-declared" muting stay on the verify page
hash (the sealed sha256)the receipt id and its sha256 in description, in wordspartialrelatedResource is not used: VC 2.0 section 5.3 requires each entry to carry a digest of the bytes at its id, and no stable URL serves the sealed bytes (the sealed artifact is the family's own document, the verify page is HTML, the proof grows with the log), so no honest digest exists; the receiver drops to chapter 06, step 1
issuer_signature (family signature over the logged leaf)proof (section 11.4)partialthe CLR proof signs the credential document, not the four-field leaf; both signatures exist, one on each artifact, and the credential MUST link the receipt so the leaf signature can be checked independently
log inclusion (chapter 05)nonenoneno standard slot for a transparency-log inclusion proof; termsOfUse.proof names /api/receipt-proof?id=<tr_ id> in words (section 11.4); not relatedResource, because the proof changes as heads grow and so cannot be digested
revoked (chapter 03, section 3.7)credentialStatus: {type: "BitstringStatusListEntry", ...}none todayno status list is served (chapter 07, section 7.1 gaps); until one is, revocation is visible only at /verify and the bridge MUST say so in termsOfUse
partial (CLR 2.0)partial: falsemapsa Witness Transcript is the family's issued record, not an excerpt; a bridge that exports a subset of rows at the family's request sets partial: true
philosophy, issuer_user, person_idnever exportednonephilosophy is on the printed transcript but not on the public payload; the ids are account and vault identifiers

11.3.2 A course row (cr_) as an AchievementCredential

Record fieldOB 3.0 / VC 2.0 targetstatusnote
(envelope)@context: ["https://www.w3.org/ns/credentials/v2", "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"], type: ["VerifiableCredential", "AchievementCredential"]maps
id (cr_ + 12 hex)id: "https://eformogi.com/verify/<cr_ id>"partialsame URL caveat as the transcript
issuer_signature.key_id, declared_by, issuer_org_nameissuer: the family Profile for a family-issued row; the organization Profile when declared_by is issuer (section 11.2)mapsthe choice of issuer is the one honest reading of declared_by; the key that signs stays the account key in either case, and the bridge discloses that
issued_at (the row's mint time)validFrom, awardedDatemaps
course_titletop-level name; credentialSubject.achievement.namemaps
student_namecredentialSubject.identifier[0] (IdentityObject, identityType: "name")maps
termcredentialSubject.termmapsa string in both
credits (the string as posted)credentialSubject.creditsEarned and achievement.creditsAvailable, numericpartialchapter 02 hashes credits as a string on purpose ("1" and "1.0" are different receipts); the numeric projection is display-only and MUST NOT be hashed back into a receipt
family_stated_gradecredentialSubject.result[0]: {type: "Result", value: <grade>, resultDescription: <id>} with an achievement.resultDescription[] entry {id, type: "ResultDescription", name: "Grade as stated by the issuer", resultType: "LetterGrade"}partialresultType is LetterGrade when the grade matches a letter form and Result otherwise (grades are free text in the Record); the description name MUST keep the word "stated", because the Record never claims the grade was evaluated by a third party
(fixed)achievement.achievementType: "Course"maps
(fixed)achievement.criteria.narrativemapsrequired by OB 3.0; the text is "Recorded on a family-issued transcript. The grade is the issuer's statement. Co-signatures, if any, are listed as evidence."
(fixed)achievement.descriptionmapsrequired by OB 3.0; the course title plus term plus the issuer's name
attestations[] (one per witness)evidence[]: {type: "Evidence", id: "https://eformogi.com/verify/<att_ id>", name: "<signer name>, <signer role>", description: <statement>, genre: "witness attestation", audience: <signer organization>}partialthe signature itself, its identity level, its binding, and any disagreeing signed_grade have no slot in Evidence (section 11.3.3)
attestations[].signed_grade when it differs from the family'snonenonerendered beside the family's grade on the verify page (pin #6) and carried in the evidence description in words; the bridge MUST NOT emit a second Result as if the witness had issued it
hidden_attestation_countnonenonecarried in termsOfUse or description in words
tr_receipt_idthe CLR association of section 11.3.1maps
transcript_eligible: truenonenonethe fixed fact that cr_ rows may sit on a transcript; nothing to say in OB 3.0
hashas for the transcript (the receipt id and sha256 in description; no relatedResource)partial
issuer_signatureproofpartialas for the transcript
revokedcredentialStatusnone todayas for the transcript

11.3.3 A witness attestation (att_)

Two shapes are possible. Which one is honest depends on who holds a key.

Record fieldas Evidence on the target credential (today)as an EndorsementCredential (when witnesses hold keys)status
id (att_ + 12 hex)evidence[].id: "https://eformogi.com/verify/<att_ id>"id of the endorsement credentialmaps
ws_receipt_id or cr_receipt_idimplicit: the evidence sits on that credentialcredentialSubject: {type: "EndorsementSubject", id: <the target credential's id>}maps
signer.name, signer.roleevidence[].nameissuer: {type: "Profile", name: <signer name>, description: <signer role>}maps; self-declared in both, exactly as chapter 03, pin #2 says
signer.organizationevidence[].audienceissuer.parentOrg (a Profile carrying the organization's name; parentOrg sits on Profile in the OB 3.0 schema)maps
signer.relationshipin evidence[].descriptionendorsementCommentpartial
statementevidence[].descriptionendorsementCommentmaps
signed_atnone on EvidencevalidFrom, awardedDatepartial
signed_gradein evidence[].description, in wordsin endorsementComment, in wordsnone: neither shape has a slot for a witness's own grade; a bridge MUST NOT promote it to a Result
signer.identity_level, identity_source, identity_verified_at, witness_history_count (chapter 03, section 3.9)nonenonenone: no standard has a "how far was this signer's identity checked" field; the sentence a receiver reads stays on the verify page, and the bridge carries the level in prose
witness_binding, signed_from_invited_address, signer_is_issuernonenonenone; disclosed on the verify page
org_countersig, org_key_id (chapter 03, section 3.5)nonea separate EndorsementCredential issued by did:web:eformogi.com whose EndorsementSubject.id is the attestation's credential id and whose endorsementComment is the sentence of section 3.5 ("processed this attestation at this time; asserts nothing about who the witness is")partial: the only endorsement the operator can honestly sign, and only with that comment
hash, log inclusionas aboveas abovepartial

Rule for the second shape: an EndorsementCredential MUST be secured by the endorser's own key. No witness holds a key today, so a bridge MUST NOT emit endorsement credentials with a witness as issuer signed by anyone else; doing so would state, in a machine-readable field, a signature the witness never made. The Evidence shape is the honest export until then.

11.3.4 An issuer declaration (a cr_ with declared_by: "issuer")

The declaration is an ordinary course row (chapter 02, section 2.4: same hash domain, same id, same signatures), so section 11.3.2 applies with these differences:

Record facttargetstatusnote
declared_by: "issuer", issuer_org_nameissuer is the organization Profilemapsthe verify page says "Declared by <school>"; the credential says the same in its issuer
the signing keythe did:key minted for the declaring account, custody escrowedproof.verificationMethodpartialan organization key with a rotation statement is planned (chapter 04, section 4.2); until then the bridge's termsOfUse says an account key signed
a teacher co-signature (chapter 03, invited by the school)evidence[] per section 11.3.3partialthe invitation token binds the signer to the invited address (identity level 1 when the address is institutional); the level has no slot
the family's claim and fold (tr_receipt_id set by the family)the family's ClrCredential embeds the organization-issued AchievementCredential unchanged, with an isPartOf associationmapsCLR 2.0 lets each embedded credential keep its own issuer, which is exactly Rule 3: the school issued the row, the family holds the record
a row the family did not foldnot in the family's CLRmapsan unclaimed declaration is the school's credential about a learner the family has not yet claimed; it is verifiable on its own at /verify/<cr_ id> and exportable by the school

11.3.5 Work samples, notes, walls, and the key binding

receiptnearest standard shapestatuswhy it stops there
ws_ (work sample)AchievementCredential with achievementType by kind (Competency, CommunityService, Fieldwork, LearningProgram, CoCurricular, or Achievement) and credentialSubject.activityStartDate = occurred_atpartialhas_evidence says the family holds evidence bytes; the bytes stay on device (chapter 01, section 1.5), so evidence[] carries the verify URL, never the content
wn_ (weekly note)nonenonetranscript_eligible: false by rule, never witnessed, an excerpt of at most 140 characters is public; a bridge MUST NOT export it as an achievement
wl_ (wall)nonenonea curated list with a mutable snapshot hash; no credential standard has a "curated surface" object
kb_ (key binding)none; the did:key method resolves the public key from the identifier itselfnonea bridge names /verify/kb_<id> in termsOfUse on any credential the key signed, so a receiver can see when the key was publicly established
ecr_, tl_not exportednonenot public receipts (chapter 02, section 2.2)

11.4 What a bridge export would emit

Planned. The reference implementation issues none of this today; chapter 07, section 7.1 is what exists. The shape below is fixed by this chapter so a standards reviewer can mark it against a text, and so the bridge, when it ships, has a contract to be tested against.

For one course row with one co-signature:

{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
  ],
  "id": "https://eformogi.com/verify/cr_0ad5487e3ca4",
  "type": ["VerifiableCredential", "AchievementCredential"],
  "name": "Algebra II",
  "description": "Algebra II, 2025-26 Year, recorded by Chen Family Records Office. Receipt cr_0ad5487e3ca4, sha256 0ad5487e3ca41a0994f917602b49e7ecf08e925077395605f3d7f33b1594eb10.",
  "issuer": { "id": "did:key:z6Mk...", "type": "Profile", "name": "Chen Family Records Office" },
  "validFrom": "2026-05-12T14:08:00.000Z",
  "awardedDate": "2026-05-12T14:08:00.000Z",
  "credentialSubject": {
    "type": "AchievementSubject",
    "identifier": [{ "type": "IdentityObject", "identityType": "name", "hashed": false, "identityHash": "Maya Chen" }],
    "term": "2025-26 Year",
    "creditsEarned": 1,
    "result": [{ "type": "Result", "value": "A", "resultDescription": "https://eformogi.com/verify/cr_0ad5487e3ca4#stated-grade" }],
    "achievement": {
      "id": "https://eformogi.com/verify/cr_0ad5487e3ca4#achievement",
      "type": "Achievement",
      "name": "Algebra II",
      "description": "Algebra II, 2025-26 Year, Chen Family Records Office.",
      "achievementType": "Course",
      "creditsAvailable": 1,
      "criteria": { "narrative": "Recorded on a family-issued transcript. The grade is the issuer's statement. Co-signatures, if any, are listed as evidence." },
      "resultDescription": [{ "id": "https://eformogi.com/verify/cr_0ad5487e3ca4#stated-grade", "type": "ResultDescription", "name": "Grade as stated by the issuer", "resultType": "LetterGrade" }]
    }
  },
  "evidence": [{
    "type": "Evidence",
    "id": "https://eformogi.com/verify/att_5d9b296a66cb",
    "name": "Sarah Kim, Tutor",
    "description": "Co-signed the grade A on 2026-06-01. Identity level 1 (invited at a school address). Statement: weekly sessions across the year.",
    "genre": "witness attestation",
    "audience": "Lincoln High"
  }],
  "termsOfUse": [{
    "type": "EformogiRecordTerms",
    "verify": "https://eformogi.com/verify/cr_0ad5487e3ca4",
    "proof": "https://eformogi.com/api/receipt-proof?id=cr_0ad5487e3ca4",
    "key_binding": "https://eformogi.com/verify/kb_b5ed898815ac",
    "custody": "The signing key is held in escrow by Eformogi, Inc. on the family's behalf (chapter 04, section 4.7).",
    "revocation": "Withdrawal is visible only at the verify URL; no status list is served.",
    "meaning": "The hash proves the bytes have not changed since issuance. It does not prove the claim was evaluated by a third party."
  }],
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-jcs-2022",
    "created": "2026-09-14T00:00:00Z",
    "verificationMethod": "did:key:z6Mk...#z6Mk...",
    "proofPurpose": "assertionMethod",
    "proofValue": "z..."
  }
}

Points a reviewer should notice: the id values are the verify URLs (partial, section 11.3.1); there is no relatedResource, because VC 2.0 requires a digest of the bytes at each entry's id and none of the verify page, the proof, or the key-binding page has stable bytes, so the three URLs ride in termsOfUse and the receipt's sha256 in description; creditsEarned is a numeric projection of a string the receipt hashes verbatim; the evidence description carries in words three facts no slot exists for (the co-signed grade, the identity level, the statement); termsOfUse uses a type of the Record's own (verify: whether an unregistered termsOfUse type is acceptable to the OB 3.0 validator, which may require a term the context defines); the proof names the family key as verificationMethod, and the did:key method lets any verifier derive the public key from the identifier itself, so no DID resolution over the network is needed.

The transcript wrapper is the ClrCredential of section 11.3.1: name, issuer, validFrom, awardedDate, a ClrSubject with the IdentityObject, one embedded AchievementCredential per row exactly as above, and one isPartOf association per row. Nothing in the wrapper restates a row; the rows are the credentials.

11.5 Rules for the bridge (MUST), extending chapter 07, section 7.5

  1. Every exported credential MUST link the receipt it was derived from: id is the receipt's verify URL, description carries the receipt id and its sha256, and termsOfUse names the proof URL, so a receiver can drop back to chapter 06 and verify the source independently of the export's own proof. relatedResource MUST NOT be used for any of these, because VC 2.0 section 5.3 requires each entry to carry a digest of the bytes at its id and none of them has stable bytes; it MAY be used only for a resource that does (none exists today).
  2. An export MUST NOT contain more than the public verify payload does, unless the family includes more at export time. Names, dates, and grades the family printed are in; philosophy, evidence bytes, note bodies, and every account or vault identifier are out.
  3. The escrow fact, the revocation gap, and the honesty statement of chapter 06, section 6.6 MUST travel in termsOfUse or description, in words a person can read.
  4. A self-declared witness, an issuer-declared tier, and a witness's own grade MUST NOT become a Result, an EndorsementCredential, or any field a receiver could read as third-party evaluation. Chapter 07, section 7.5, rule 4, restated because these are the fields the standards make it easiest to overstate.
  5. EndorsementCredential MUST be signed by the endorser's own key or not emitted. The operator's ceremony countersignature MAY be emitted as an endorsement by did:web:eformogi.com only with the comment that says it endorses processing, not the claim.
  6. Numbers in signed documents MUST be JCS-safe; credits is coerced by jcsCoerceNumbers before signing (chapter 07), and the string form the receipt hashed MUST also appear (in description) so the two can be reconciled.
  7. The name Witness Transcript MUST appear in an export only under chapter 10, section 10.8.
  8. An export MUST validate against the published OB 3.0 and CLR 2.0 JSON schemas before it ships, and the schema versions it validated against MUST be recorded in credentialSchema (type per the 1EdTech schema validator; verify: the exact type string the current schemas expect).

11.6 Known divergences and open checks

itemwhat the published text sayswhat the reference implementation doesdisposition
eddsa-jcs-2022 hash orderproofConfigHash first, then transformedDocumentHash (section 3.3.4 of the cryptosuites Recommendation)the same order (shared/verifiableCredentials.js; chapter 07; vector v20)conforms; a summary read of the specification on 2026-09-14 reported the reverse order and was checked against the verbatim text before this chapter was written
proof @context at creationcopied from the document (section 3.3.1, step 2)copied (shared/verifiableCredentials.js)conforms
proof @context at verificationwhen present, the document's @context MUST start with the proof's values in order (section 3.3.2, step 4)not checked by api/verify-credential.js or by verifyCredentialProof in the published verifiera leniency in the verifying direction only; the credentials the implementation issues pass a conforming verifier; adding the check is planned
VC context and validity nameshttps://www.w3.org/ns/credentials/v2, validFromthe 1.1 context and issuanceDate (chapter 07, section 7.1 gaps)planned migration; until then the existing credential is a 1.1 document and this chapter's mappings assume the 2.0 envelope
credentialStatusid and type required; BitstringStatusListEntry is the 2.0 mechanismthe existing credential names StatusList2021Entry and no list is servedplanned: publish a bitstring list or drop the field
relatedResource digestseach entry MUST carry id and at least one of digestSRI or digestMultibase (section 5.3)no stable URL serves the sealed bytes, the verify page is HTML, and the proof grows with the log, so no honest digest existsresolved: relatedResource is not used; the receipt id and sha256 travel in description and the verify, proof, and key-binding URLs in termsOfUse (sections 11.3.1, 11.4, 11.5)
OB 3.0 person issuerthe person-name terms and parentOrg sit on Profile in the published schemaa family issues under a display string and a did:keyverify: that a did:key is acceptable as a Profile.id to the OB 3.0 validators receivers run (the schema types it as a URI, which a DID is)
OB 3.0 linked-data cryptosuitesa JWT format and a linked-data format are namededdsa-jcs-2022 only; no RDF canonicalization exists in the implementationverify: whether eddsa-jcs-2022 is an accepted suite for OB 3.0 linked-data proofs; if only eddsa-rdfc-2022 is, the bridge emits the JWT (JOSE) envelope instead, which needs no RDF processing
CLR 2.0 ClrSubject narrative and datesnot on ClrSubject in the published schemachapter 07, section 7.4 listed themcorrected here (section 11.1); program and the year range move to the wrapper's description and to each row's AchievementSubject
CLR 2.0 verifiableCredential item formobjects; JWS strings verifynot applicable yetverify before the bridge chooses an envelope
termsOfUse typea typed objectthis chapter proposes an Eformogi-defined typeverify: whether the OB 3.0 schema constrains the type; if it does, the same sentences move to description
identity levels, tiers, dissent, binding, countersignatureno counterpart in any of the threeon the verify page and in the att_ payloadnone; carried in prose, and the verify URL stays the authority

11.7 What this does not prove

A mapping proves that a field can be carried; it does not prove that a receiver's software will read it the way the Record means it. The three standards have no slot for the facts the Record is most careful about: who checked a signer's identity and how far, whether a witness disagreed with the family's grade, which tier the family itself claimed for a row, and whether a key was held by the family or in escrow. Every one of those facts survives only as prose in the export, and every export MUST keep the verify URL as the place a receiver goes to read them in the shape they were made. Nothing in this chapter is a claim that any receiver accepts a Witness Transcript, a ClrCredential built from one, or anything else.