Repository navigation
feat!: DTG Credentials v1 — role VACs, vetted/1 and witnessed/1 statements, issuerScope - #397
Merged
Merged
Conversation
This was referenced Sep 30, 2026
Contributor
Author
|
Re-verified against VTI's final branch tip (c477700c, which includes the stricter |
This was referenced Sep 30, 2026
stormer78
force-pushed
the
feat/dtg-vsc-conformance
branch
from
September 30, 2026 16:49
b2e9ef3 to
3991bca
Compare
Contributor
Author
|
The local-path patch is gone. The branch now requires released crates: |
stormer78
marked this pull request as ready for review
October 1, 2026 00:40
Every DTG credential the client issues, receives, verifies or stores now carries the v1 context (https://registry.trustoverip.org/dtg/context/v1, the pre-v1 context refused with no alias), a top-level issuerScope and exactly one concrete type, on dtg-credentials 0.12, vta-sdk 0.57, vta-service 0.46 and trust-tasks 0.24.8. - openvtc_core::dtg: the scope each issued credential declares (MEMBER_IDENTIFIER_SCOPE = directed for the persona DID a membership names; relationship_issuer_scope: pairwise for a relationship DID, directed for the persona DID; PERSONA_ANNOTATION_SCOPE = directed), parse_conformant, community_roles, and predicate-based statement display with a fail-closed core accept list. - Member acknowledgement: new_member_vmc_for with the signing persona, declaring directed; build_member_vmc takes the member DID. - VIC validation parses through dtg-credentials: v1 context second, issuerScope public, one concrete type. join::DTG_CONTEXT re-exports DTG_CONTEXT_V1. - CredentialKind::Role is a community role VAC (AuthorityCredential, authority.scope the community, role:<name> actions); from_credential classifies conformant credentials only. - VRCs declare the scope of the identifier the relationship uses. - personhood AssertReply::role_vec -> role_vac (wire roleVac). - Stored credentials in a pre-v1 shape are set aside on load with a logged reason: CommunityRecord::retired_credentials (persisted, cleared by a conformant replacement), Vrcs::retired, dropped VRCIssued tasks, and RejectionReason::Nonconformant on a vault rebuild. The patch block this builds against is its own commit. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
…es are VACs Follows vta-sdk 0.57 (vetting statements are vetted/1 VSCs; role credentials are VACs). - The vetter's Vetting Statement is a StatementCredential under https://registry.trustoverip.org/dtg/vsc/vetted/1, the body at object.value, issued directed, citing the vetting/session document by taskContext and taskDigestMultibase. The desk keeps the signed session document (VettingBook::record_session_document, DeskSession::document) and a session without one cannot be attested; the applicant keeps the one it received (OpenSession::document) and refuses a statement that does not cite it (check_against_session). - Statements are claimed by predicate, never by type; manifests name the predicate IRI as statementType. - A vetter grant is a community role VAC (community_roles, role:vetter). - Stored vetter grants and held statements in a pre-v1 shape are set aside on load (VettingBook::retire_nonconformant, run by ProtectedConfig::parse) with a notice in VettingBook::retired, cleared when a replacement arrives. - openvtc-vetting-pcs: only the statementType changes; the wire fixture is regenerated, which moves its requirementsDigest. - zkp_reference_flow and its output are regenerated in the v1 shapes. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
- VRCs are issued declaring the scope of the identifier the relationship
uses (pairwise relationship DID, directed persona DID).
- The vetter signs the vetting/session document before sending it, and
the desk keeps that copy for the statement to cite.
- Communities: the role credential shows the roles it confers, and a
credential set aside on load as pre-v1 is shown as a warning asking for
it to be re-issued.
- Credentials: held credentials are described from their content ("Role:
vetter", a statement by predicate), and set-aside VRCs are counted.
- Vetting: set-aside grants and statements are listed on the page.
- Test fixtures are v1 credentials; an object-form VIC issuer is refused.
Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
- vetting-process, vetting-hidden-vetters-pcs, hidden-vetting-live-run: the Vetting Statement is a vetted/1 VSC citing its session by id and digest, the vetter role a community VAC, the manifest statementType the predicate IRI, and pre-v1 grants and statements are set aside on load. - relationships-vrcs: the scope a VRC declares, derived from the identifier the relationship uses, and the v1 sample VRC. - openvtc-config-data-structure: Vrcs::retired and per-VRC loading. - Retired R-DID / P-DID / M-DID / C-DID terms replaced where touched. - CHANGELOG: the v1 migration by flow, and the stored-state behaviour. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
…ffinidi-messaging 0.31 Replaces the local-path patch with the released crates: - dtg-credentials 0.12 - vta-sdk / vta-service 0.57 / 0.46 (OpenVTC/verifiable-trust-infrastructure#1859) - the trust-tasks-* family at 0.25 - affinidi-tdk 0.21, affinidi-messaging-sdk 0.31 and -test-mediator 0.15 (affinidi/affinidi-tdk-rs#908) Cargo.lock follows once VTI publishes. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
vta-sdk 0.57.0 shipped before the DTG v1 migration, so the release that carries it (OpenVTC/verifiable-trust-infrastructure#1859) is 0.58.0. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
dtg-credentials 0.12, vta-sdk 0.58, vta-service 0.47, trust-tasks 0.25, affinidi-tdk 0.21 and affinidi-messaging-sdk 0.31, all from crates.io. The only second copies come through did-git-sign 0.5.2 (vta-sdk 0.56), which clears with the did-git-sign release on vta-sdk 0.58. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
… 0.8.4 - The outer doc comment on `pub mod dtg` made rustdoc resolve the module's inner docs from the crate root, where its own items are not in scope. dtg.rs carries its own //! docs, so the outer comment goes. - book.rs linked Self::clear_retired; the method is clear_retired_for. - yoke-derive 0.8.3 is yanked (cargo-deny). Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
stormer78
force-pushed
the
feat/dtg-vsc-conformance
branch
from
October 1, 2026 01:08
9421d40 to
2aa1ed6
Compare
VGI 0.6.0 is on vta-sdk 0.58, affinidi-tdk 0.21 and trust-tasks 0.25, so the second registry copies of vta-sdk, trust-tasks-rs, affinidi-tdk and affinidi-messaging-sdk under did-git-sign 0.5.2 are gone. Signed-off-by: Glenn Gore <glenn.g@affinidi.com>
This was referenced Oct 1, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This moves every DTG credential OpenVTC issues, receives, verifies, stores, displays or documents onto the DTG Credentials Core Specification (WD 0.6.0) and the DTG VSC predicate registry. The DTGWG reviewed and agreed the migration plan.
This is a draft because it builds against unreleased crates. The last commit,
chore: DO NOT MERGE — patch …, pointsdtg-credentials,vta-sdkandtrust-tasks-*at local worktrees, so CI cannot build it yet. Once these release, the commit is replaced with version bumps:trust-tasks-rsvta-sdkWhat changes on the wire
firstperson.network/credentials/dtg/v1context, noissuerScoperegistry.trustoverip.org/dtg/context/v1, with a requiredissuerScopeEndorsementCredential+CommunityRoleAuthorityCredential:actions: ["role:<name>"], vetter =role:vetterEndorsementCredential,identity-vetting/0.1StatementCredentialwith predicate…/dtg/vsc/vetted/1, the body inobject.value, andtaskContext+taskDigestMultibaseWitnessCredentialwitnessed/1statement, classified by predicatenew_member_vmcnew_member_vmc_for,issuerScope: directedpairwisefor a relationship DID,directedfor the persona DIDThe scope rules live in one module,
openvtc-core/src/dtg.rs.Stored state
Credentials already stored in pre-v1 shapes are non-conformant. They are dropped on load with a
warn!; they are never kept and never allowed to fail the load. The member sees a notice:A conformant replacement clears the notice.
Other changes
vetting/sessiondocument it sends. The applicant refuses a statement that doesn't match its copy.statementTypechanged, which movedrequirementsDigest. VTI carries the matching fixture.issuer: VICs and VMCs with an object-formissuerare now refused, because the spec's Base Structure makesissuera string.vetting-process.md,vetting-hidden-vetters-pcs.mdandrelationships-vrcs.mddescribe the v1 shapes. §9.4 ofvetting-process.mdcould use a careful read.Follow-ups (not in this PR)
did-git-sign0.5.2 still pullsvta-sdk0.56 into the graph. That goes away with a VGI release on 0.57.dtg-credentialsis raised from"0.11"to"0.12". It says 0.11 now only so the local patch matches.Checks
cargo fmtis clean.cargo clippy --workspace --all-targets -- -D warningsis clean.cargo test --workspace: 1722 passed, 0 failed, built against the VTI branch at 32b2187b.vta-sdkis unchanged since 0c3c8c75.