docs(guides): add the demo runbook and its three silent defaults - #383
LKSNDRTMLKV wants to merge 2 commits into
Conversation
|
Self-correction: an earlier revision of this branch leaked a private path, and it was pushed. The "Where this runs" table described a staging rung by naming an internal Removed in c522c9f. The table now describes deployment in terms a reader of this
The sovereignty paragraph under it was reworded the same way — it now states the The leak was live on a pushed branch of a public repository. Force-rewriting Re-scanned everything else I have pushed to a public repository in this session One near-miss worth recording: |
The end-to-end path from the shipped demo corpus to a resolving passport, traced in source rather than assembled from memory.
Docs only. No code changed.
Why this exists
The project has never demonstrated itself end to end, and its most distinctive
capabilities — audience-scoped disclosure, and identity without GS1 — are
shipped and invisible. Tracing the path turned up three defaults that break the
demonstration, two of them silently.
🚨 The two silent ones
RESOLVER_BASE_URLdefaults tohttps://id.odal-node.io, which is NXDOMAIN.Checked by lookup: the apex and
docs.resolve;id.does not.build_carrier_urlwrites that base into every passportsqr_code_urlatpublish, and the passport is then signed — so the dead URL is inside the
signature and cannot be corrected without reissuing. Every demo QR scans to
nothing. Filed separately as #382, since changing a signature-affecting default
is a decision rather than a doc fix.
CREDENTIAL_ISSUERS_SELFunset makes the credentialed route serve the publicbody with a 200. Without it
credential_trustisGhost,credentials_liveis false, and the credential directory is never wired. From
main.rs: "withnone, the audience-scoped route serves the public view". Nothing errors, both
views render, and the demo shows no contrast at all — which for this
particular demonstration is the worst possible outcome, because the contrast is
the entire argument.
✅ A correction worth recording: it works on a laptop
Credential verification resolves the issuers
did:web, and every such fetchpasses
url_guard::assert_public_target— https required, loopback andprivate ranges refused. Read alone, that says a local demo is impossible, and
I nearly documented it that way.
It is not.
HttpCredentialDirectory::with_local_issuerresolves a credentialthe node issued to itself in-process, never touching the guard, and
main.rswires it whenever credentials are live. So the full public /credentialed contrast runs on
localhostwith no domain, no TLS and no tunnel.A credential from another issuer still needs that issuers DID publicly
resolvable — the guard doing its job.
Self-trust grants legitimate interest only, deliberately: an authoritys
standing is conferred by a member state, not asserted by an operator. Public vs
repairer works out of the box; the authority tier needs a second identity named
in
CREDENTIAL_ISSUERS_AUTHORITY.The commands are the real ones
First draft invented
odal passport createand guessed the credential flags.Both were wrong and are corrected against
cli_args.rs:odal import(which takes JSON as well as CSV/TSV) and signed withodal publishodal credential issuetakes--holder-did,--name,--role,--country,--product-groups,--valid-for-daysEvery command in the guide —
init,up,down,status,bootstrap,import,validate,publish,list,credential issue— was checked againstthe parser, and
--node-urlagainstInits own flags.The part worth putting on screen
build_carrier_urlbranches on whether the data carries a GTIN:{base}/01/{gtin}/21/{serial}{base}/dpp/{id}{base}/dpp/{id}Requiring a GTIN means requiring GS1 membership. Schemes 2 and 3 exist so a
manufacturer without a Company Identification Number can still issue a
conformant passport — and two passports side by side, with two different carrier
forms, make that concrete in a way no sentence does.
Related
gtin)RESOLVER_BASE_URLdefault