From ce42646931009fbe12996f32a70e2a069c9db357 Mon Sep 17 00:00:00 2001 From: Edut LLC Date: Fri, 20 Feb 2026 15:50:53 -0800 Subject: [PATCH] launcher: align EDUT ID naming across UI and docs --- README.md | 2 +- app/app.js | 46 ++++++++++++++++++---------------- app/index.html | 14 +++++------ app/manifest.json | 2 +- docs/conformance-vectors.md | 4 +-- docs/wallet-bootstrap-flow.md | 4 +-- docs/wallet-v1-product-spec.md | 4 +-- 7 files changed, 39 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index 8d4c419..2ef732f 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ Policy behavior in launcher shell: Run locally: ```bash -cd /Documents/VSG\ Codex/launcher/app +cd /launcher/app python3 -m http.server 4310 ``` diff --git a/app/app.js b/app/app.js index 84c6551..bb95310 100644 --- a/app/app.js +++ b/app/app.js @@ -297,13 +297,13 @@ function setButtonDisabled(id, disabled) { function refreshActionLocks(statusPayload) { const effective = statusPayload && typeof statusPayload === "object" ? statusPayload : state.lastStatus; - const membershipActive = String(effective?.status || "").toLowerCase() === "active"; + const edutIdActive = String(effective?.status || "").toLowerCase() === "active"; const attested = isOnrampAttested(effective?.identity_assurance_level); - const ownerActionReady = membershipActive && attested; + const ownerActionReady = edutIdActive && attested; setButtonDisabled("btnSupportTicket", !ownerActionReady); setButtonDisabled("btnInstallToken", !ownerActionReady); - setButtonDisabled("btnQuickInstallStatus", !membershipActive); + setButtonDisabled("btnQuickInstallStatus", !edutIdActive); } function refreshOverview(statusPayload) { @@ -313,7 +313,7 @@ function refreshOverview(statusPayload) { setSummary("summarySession", sessionSummary()); refreshModeUI(); if (statusPayload && typeof statusPayload === "object") { - setSummary("summaryMembership", statusPayload.status || "unknown"); + setSummary("summaryEdutId", statusPayload.status || "unknown"); setSummary("summaryDesignation", statusPayload.designation_code || "-"); const assurance = assuranceDisplay(statusPayload.identity_assurance_level); setSummary("summaryAssurance", assurance); @@ -679,7 +679,7 @@ async function onSignPayerProof() { }); } -async function onSendMembershipTx() { +async function onSendEdutIdTx() { if (!state.lastQuote || !state.lastQuote.tx) { throw new Error("request quote before sending transaction"); } @@ -815,7 +815,7 @@ async function onQuote() { return out; } -async function onConfirmMembership() { +async function onConfirmEdutId() { const payload = { designation_code: $("designationCode").value.trim(), quote_id: $("quoteId").value.trim(), @@ -823,9 +823,9 @@ async function onConfirmMembership() { address: requireWallet(), chain_id: chainID(), }; - const assurance = $("membershipIdentityAssurance").value.trim(); - const attestedBy = $("membershipIdentityAttestedBy").value.trim(); - const attestationID = $("membershipIdentityAttestationId").value.trim(); + const assurance = $("edutIdIdentityAssurance").value.trim(); + const attestedBy = $("edutIdIdentityAttestedBy").value.trim(); + const attestationID = $("edutIdIdentityAttestationId").value.trim(); if (assurance) { payload.identity_assurance_level = assurance; } @@ -849,7 +849,7 @@ async function onConfirmMembership() { return out; } -async function requireMembershipState(actionLabel, opts = {}) { +async function requireEdutIdState(actionLabel, opts = {}) { const status = await onStatus(); if (String(status.status || "").toLowerCase() !== "active") { throw new Error(`${actionLabel} requires active EDUT ID`); @@ -880,11 +880,11 @@ async function waitForTxMined(txHash, timeoutMs = 120000, intervalMs = 3000) { throw new Error(`transaction not mined within ${timeoutMs}ms`); } -async function confirmMembershipWithRetry(maxAttempts = 8, intervalMs = 2500) { +async function confirmEdutIdWithRetry(maxAttempts = 8, intervalMs = 2500) { let lastErr = null; for (let attempt = 1; attempt <= maxAttempts; attempt += 1) { try { - const out = await onConfirmMembership(); + const out = await onConfirmEdutId(); return out; } catch (err) { lastErr = err; @@ -899,7 +899,7 @@ async function confirmMembershipWithRetry(maxAttempts = 8, intervalMs = 2500) { throw lastErr || new Error("EDUT ID confirmation failed"); } -async function onRunMembershipFlow() { +async function onRunEdutIdFlow() { setFlowStatus("connecting wallet"); await onConnectWallet(); @@ -919,7 +919,7 @@ async function onRunMembershipFlow() { setFlowStatus("quoting EDUT ID"); await onQuote(); setFlowStatus("sending EDUT ID transaction"); - await onSendMembershipTx(); + await onSendEdutIdTx(); const txHash = $("confirmTxHash").value.trim(); if (!txHash) { @@ -928,7 +928,7 @@ async function onRunMembershipFlow() { setFlowStatus("waiting for chain confirmation"); await waitForTxMined(txHash); setFlowStatus("confirming EDUT ID with API"); - await confirmMembershipWithRetry(); + await confirmEdutIdWithRetry(); setFlowStatus("refreshing status"); const refreshed = await onStatus(); if (isOnrampAttested(refreshed.identity_assurance_level)) { @@ -986,7 +986,7 @@ async function onPollEvents() { } async function onSupportTicket() { - await requireMembershipState("owner support", { requireOnramp: true }); + await requireEdutIdState("owner support", { requireOnramp: true }); const out = await request("POST", "/member/channel/support/ticket", { wallet: requireWallet(), org_root_id: orgRootID(), @@ -1002,7 +1002,7 @@ async function onSupportTicket() { } async function onInstallToken() { - await requireMembershipState("governance install token", { requireOnramp: true }); + await requireEdutIdState("governance install token", { requireOnramp: true }); const out = await request("POST", "/governance/install/token", { wallet: requireWallet(), org_root_id: orgRootID(), @@ -1136,7 +1136,9 @@ async function confirmCheckoutWithRetry(maxAttempts = 8, intervalMs = 2500) { } catch (err) { lastErr = err; const message = String(err || ""); - if (!message.includes("tx verification pending/failed") && !message.includes("membership verification pending/failed")) { + if (!message.includes("tx verification pending/failed") + && !message.includes("edut id verification pending/failed") + && !message.includes("membership verification pending/failed")) { throw err; } setFlowStatus(`checkout confirm pending (${attempt}/${maxAttempts})`); @@ -1188,7 +1190,7 @@ async function onQuickConnect() { } async function onQuickActivate() { - await onRunMembershipFlow(); + await onRunEdutIdFlow(); try { await ensureChannelBinding(); await onPollEvents(); @@ -1283,7 +1285,7 @@ bind("btnCopyWallet", onCopyWallet); bind("btnModeHuman", onModeHuman); bind("btnModeAuto", onModeAuto); bind("btnConnectWallet", onConnectWallet); -bind("btnRunMembershipFlow", onRunMembershipFlow); +bind("btnRunEdutIdFlow", onRunEdutIdFlow); bind("btnIntent", onIntent); bind("btnSignIntent", onSignIntent); bind("btnVerify", onVerify); @@ -1292,8 +1294,8 @@ bind("btnRevokeSession", onRevokeSession); bind("btnStatus", onStatus); bind("btnQuote", onQuote); bind("btnSignPayerProof", onSignPayerProof); -bind("btnSendMembershipTx", onSendMembershipTx); -bind("btnConfirmMembership", onConfirmMembership); +bind("btnSendEdutIdTx", onSendEdutIdTx); +bind("btnConfirmEdutId", onConfirmEdutId); bind("btnRegisterChannel", onRegisterChannel); bind("btnUnregisterChannel", onUnregisterChannel); bind("btnPollEvents", onPollEvents); diff --git a/app/index.html b/app/index.html index 8672b8d..9d2f625 100644 --- a/app/index.html +++ b/app/index.html @@ -41,7 +41,7 @@

EDUT ID
?

EDUT ID is your one-time identity credential used for checkout, activation, and ownership proof.

-

unknown

+

unknown

Mode

@@ -112,7 +112,7 @@

EDUT ID Flow Controls

- + @@ -160,8 +160,8 @@
- - + +
diff --git a/app/manifest.json b/app/manifest.json index 1095ccc..b525641 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -5,7 +5,7 @@ "channel": "stable", "features": { "wallet_bootstrap": true, - "membership_status": true, + "edut_id_status": true, "governance_install": true, "store_preview": false } diff --git a/docs/conformance-vectors.md b/docs/conformance-vectors.md index 979f16c..fffb908 100644 --- a/docs/conformance-vectors.md +++ b/docs/conformance-vectors.md @@ -1,7 +1,7 @@ # Launcher Conformance Vectors 1. `L-001` Wallet create keeps private key local and non-exported by default. -2. `L-002` Membership status unknown defaults to blocked checkout/install actions. +2. `L-002` EDUT ID status unknown defaults to blocked checkout/install actions. 3. `L-003` Governance package hash mismatch blocks install. 4. `L-004` Governance package signature mismatch blocks install. 5. `L-005` Expired install token blocks install. @@ -10,6 +10,6 @@ 8. `L-008` Wallet onboarding creates local wallet without forcing seed phrase display. 9. `L-009` Outgoing sends require biometric/PIN confirmation. 10. `L-010` Primary wallet screens render USD-first balances and plain-language history. -11. `L-011` Launcher must surface `identity_assurance_level` separately from membership state. +11. `L-011` Launcher must surface `identity_assurance_level` separately from EDUT ID state. 12. `L-012` Owner support and governance install actions are blocked when assurance is not `onramp_attested`. 13. `L-013` Launcher emits signing authority class in governance activation evidence and defaults owner-driven activation to `identity_human`. diff --git a/docs/wallet-bootstrap-flow.md b/docs/wallet-bootstrap-flow.md index 667334b..c901884 100644 --- a/docs/wallet-bootstrap-flow.md +++ b/docs/wallet-bootstrap-flow.md @@ -14,10 +14,10 @@ Create or import an ownership wallet locally before paid actions. 2. Choose create wallet or import wallet. 3. Keys are generated/stored locally (device trust store/secure hardware where available). 4. Recovery options are shown and confirmed by user. -5. Wallet address becomes ownership identity for memberships and licenses. +5. Wallet address becomes ownership identity for EDUT ID and licenses. ## Rules 1. Launcher never exports private key to EDUT backend. -2. Membership/license ownership binds to ownership wallet. +2. EDUT ID/license ownership binds to ownership wallet. 3. Payment wallet may differ at quote/checkout. diff --git a/docs/wallet-v1-product-spec.md b/docs/wallet-v1-product-spec.md index 80d531b..4caac35 100644 --- a/docs/wallet-v1-product-spec.md +++ b/docs/wallet-v1-product-spec.md @@ -90,7 +90,7 @@ Never show crypto jargon by default. 1. No hidden split charges. 2. User always sees final USD amount before confirmation. -3. Membership and entitlement purchases write deterministic receipts. +3. EDUT ID and entitlement purchases write deterministic receipts. ## 5) Pay Someone @@ -110,7 +110,7 @@ History is plain-language first. Examples: 1. `Added $100` -2. `Bought Human Membership` +2. `Activated EDUT ID` 3. `Sent $50 to 0x12ab...90ef` 4. `Received $200 from 0x98cd...11aa`