1"use strict";(globalThis.webpackChunkdocs_new=globalThis.webpackChunkdocs_new||[]).push([[4800],{28453:(e,s,r)=>{r.d(s,{R:()=>d,x:()=>l});var n=r(96540);const t={},i=n.createContext(t);function d(e){const s=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),n.createElement(i.Provider,{value:s},e.children)}},75681:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>d,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"tumitrust/audiences/programmes-consent-awards","title":"Programmes, Consent & Awards","description":"User guide for portable programme credentials, the Consent desk, and the Award floor in the institution hub","source":"@site/docs/tumitrust/audiences/programmes-consent-awards.md","sourceDirName":"tumitrust/audiences","slug":"/tumitrust/audiences/programmes-consent-awards","permalink":"/docs/tumitrust/audiences/programmes-consent-awards","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Programmes, Consent & Awards","description":"User guide for portable programme credentials, the Consent desk, and the Award floor in the institution hub"},"sidebar":"tumitrustSidebar","previous":{"title":"Institutions & verifiers","permalink":"/docs/tumitrust/audiences/for-institutions"},"next":{"title":"For partners","permalink":"/docs/tumitrust/audiences/for-partners"}}');var t=r(74848),i=r(28453);const d={title:"Programmes, Consent & Awards",description:"User guide for portable programme credentials, the Consent desk, and the Award floor in the institution hub"},l="Programmes, Consent & Awards",o={},a=[{value:"Quick walkthrough (under five minutes)",id:"quick-walkthrough-under-five-minutes",level:2},{value:"Programme board",id:"programme-board",level:2},{value:"What you see",id:"what-you-see",level:3},{value:"Education cards",id:"education-cards",level:3},{value:"Empty states that move you forward",id:"empty-states-that-move-you-forward",level:3},{value:"Permissions",id:"permissions",level:3},{value:"Award floor (credentials & milestones)",id:"award-floor-credentials--milestones",level:2},{value:"Issue credential",id:"issue-credential",level:3},{value:"Attest milestone",id:"attest-milestone",level:3},{value:"Credits",id:"credits",level:3},{value:"Consent desk",id:"consent-desk",level:2},{value:"List first, grid optional",id:"list-first-grid-optional",level:3},{value:"What each row shows",id:"what-each-row-shows",level:3},{value:"Expiring soon",id:"expiring-soon",level:3},{value:"Selective share",id:"selective-share",level:3},{value:"Mobile pairing",id:"mobile-pairing",level:2},{value:"Feature tours",id:"feature-tours",level:2},{value:"API quick links",id:"api-quick-links",level:2},{value:"Next steps",id:"next-steps",level:2}];function c(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"programmes-consent--awards",children:"Programmes, Consent & Awards"})}),"\n",(0,t.jsxs)("div",{class:"tt-doc-welcome-hero tt-doc-welcome-hero--lede",children:[(0,t.jsx)("p",{class:"tt-glossary-kicker",children:"Institution hub \xb7 Portable trust"}),(0,t.jsxs)("p",{class:"tt-glossary-lead",children:[(0,t.jsx)("strong",{children:"Turn milestones into credentials people can carry"}),", then respect member consent when you read scores and network. Same PTI spine as mobile."]})]}),"\n",(0,t.jsxs)(s.p,{children:[(0,t.jsx)(s.strong,{children:"Audience:"})," NGOs, trainers, clinics, co-ops, lenders, and hybrid institutions that ",(0,t.jsx)(s.strong,{children:"issue"})," portable proof and/or ",(0,t.jsx)(s.strong,{children:"consume"})," consented trust."]}),"\n",(0,t.jsxs)(s.p,{children:["Self-serve programme templates include ",(0,t.jsx)(s.strong,{children:"livelihoods / trades"})," and ",(0,t.jsx)(s.strong,{children:"youth development"})," alongside Changemaker, workshop, mentorship, and general tracks. Members can ",(0,t.jsx)(s.strong,{children:"Present Trust CV"})," seals for hire, training, club, or funder from mobile Trussport."]}
1),"\n",(0,t.jsx)(s.p,{children:"This guide covers three connected surfaces in the institution hub:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Surface"}),(0,t.jsx)(s.th,{children:"Path"}),(0,t.jsx)(s.th,{children:"What it feels like"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Programme board"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"/institution/<slug>/programmes/"})}),(0,t.jsx)(s.td,{children:"Cohorts, enrollments, PTI + score chips, Award floor"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Consent desk"})}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"/institution/<slug>/consent-desk/"})}),(0,t.jsx)(s.td,{children:"List-first access grants, expiring-soon pulse, selective share"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:(0,t.jsx)(s.strong,{children:"Award floor"})}),(0,t.jsxs)(s.td,{children:[(0,t.jsx)(s.code,{children:"#tt-trust-award-panel"})," on Programmes or Trust queues"]}),(0,t.jsx)(s.td,{children:"Issue to Trust CV / attest milestones with credit meter + celebration"})]})]})]}),"\n",(0,t.jsxs)(s.p,{children:["Related: ",(0,t.jsx)(s.a,{href:"/tumitrust/audiences/for-institutions",children:"Institutions on TumiTrust"}),", ",(0,t.jsx)(s.a,{href:"/tumitrust/audiences/for-partners",children:"For partners"}),", ",(0,t.jsx)(s.a,{href:"/tumitrust/developer-guides/trust-platform-api",children:"Trust platform API"}),"."]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"quick-walkthrough-under-five-minutes",children:"Quick walkthrough (under five minutes)"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Open Programmes:"})," hero, metrics, and education cards explain credits, PTI, and consent at a glance."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Scan participants:"})," each row shows avatar, ",(0,t.jsx)(s.strong,{children:"PTI id:"})," ",(0,t.jsx)(s.strong,{children:"headline Ubuntu score:"})," and milestone progress."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Issue a credential"}),". Award floor credit meter shows balance and cost (default ",(0,t.jsx)(s.strong,{children:"2"})," credits to issue, ",(0,t.jsx)(s.strong,{children:"1"})," to attest)."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Confirm:"})," review participant, credential, cohort, and credit charge."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Confirm success:"})," success toast, credit meter updates with ",(0,t.jsx)(s.strong,{children:"\u2212N credits:"})," and the new activity row appears."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Open Consent desk:"})," list view by default (paginated); switch to grid if you prefer cards. Score chips appear only when the member granted ",(0,t.jsx)(s.strong,{children:"Score"})," access."]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Review expiring soon:"})," highlight on the metric and rows ending within 14 days."]}),"\n"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-text",children:"Programme board \u2500\u2500\u25ba Award floor (credits) \u2500\u2500\u25ba Trust CV + mobile progress\n \u2502 \u25b2\n \u2514\u2500\u2500 Consent desk (member-owned access) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"})}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"programme-board",children:"Programme board"}),"\n",(0,t.jsx)(s.h3,{id:"what-you-see",children:"What you see"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Programmes"})," as outcome tracks (youth, livelihoods, health, apprenticeships, savings groups, any track you define)"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Participants rail"})," with portable identity (PTI) and score, not username-only rows"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Award floor"})," for issue + attest without waiting for a member request"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Cohort CSV"})," for funder / M&E sharing"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"education-cards",children:"Education cards"}),"\n",(0,t.jsx)(s.p,{children:"Hover the three cards under the metrics:"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Card"}),(0,t.jsx)(s.th,{children:"Why it matters"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Credits power awards"}),(0,t.jsx)(s.td,{children:"Same institution trust-credit pool as Trust Checks"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Portable identity"}),(0,t.jsx)(s.td,{children:"PTI + score match what members see on mobile"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Respect consent"}),(0,t.jsx)(s.td,{children:"Awards write to Trust CV; score peeks stay gated"})]})]})]}),"\n",(0,t.jsx)(s.h3,{id:"empty-states-that-move-you-forward",children:"Empty states that move you forward"}),"\n",(0,t.jsxs)(s.p,{children:["If there are no programmes or enrollments yet, the empty state offers ",(0,t.jsx)(s.strong,{children:"Open Award floor"})," and ",(0,t.jsx)(s.strong,{children:"Take the tour:"})," not a dead end."]}),"\n",(0,t.jsx)(s.h3,{id:"permissions",children:"Permissions"}),"\n",(0,t.jsxs)(s.p,{children:["Team roles need ",(0,t.jsx)(s.strong,{children:"Award credentials"}
1)," to issue or attest. Viewers can still see programme progress. Owners/admins grant the permission from Team management."]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"award-floor-credentials--milestones",children:"Award floor (credentials & milestones)"}),"\n",(0,t.jsx)(s.h3,{id:"issue-credential",children:"Issue credential"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsx)(s.li,{children:"Search a participant (typeahead shows avatar, PTI, and score)"}),"\n",(0,t.jsx)(s.li,{children:"Pick credential type, optional cohort + milestone"}),"\n",(0,t.jsxs)(s.li,{children:["Review & issue, confirm dialog shows ",(0,t.jsx)(s.strong,{children:"credit cost"})]}),"\n",(0,t.jsx)(s.li,{children:"On success: toast + sparks + meter debit flash + fresh activity highlight"}),"\n"]}),"\n",(0,t.jsxs)(s.p,{children:["The badge lands on the member ",(0,t.jsx)(s.strong,{children:"Trust CV"})," / Trussport seals and can advance programme progress when a cohort is selected."]}),"\n",(0,t.jsx)(s.h3,{id:"attest-milestone",children:"Attest milestone"}),"\n",(0,t.jsxs)(s.p,{children:["Partner hubs push attestations into ",(0,t.jsx)(s.strong,{children:"Pulse"}),"; all hubs can record programme milestone completion. Cost defaults to ",(0,t.jsx)(s.strong,{children:"1"})," trust credit."]}),"\n",(0,t.jsx)(s.h3,{id:"credits",children:"Credits"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Action"}),(0,t.jsx)(s.th,{children:"Default cost"}),(0,t.jsx)(s.th,{children:"Ledger action"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Issue portable credential"}),(0,t.jsx)(s.td,{children:"2"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"portable_credential_issue"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Attest programme milestone"}),(0,t.jsx)(s.td,{children:"1"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"portable_milestone_attest"})})]})]})]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Balance and costs show on the Award floor meter"}),"\n",(0,t.jsxs)(s.li,{children:["Insufficient balance returns a ",(0,t.jsx)(s.strong,{children:"402"})," paywall with headline, shortfall, and ",(0,t.jsx)(s.strong,{children:"Buy trust credits"})]}),"\n",(0,t.jsx)(s.li,{children:"Topbar credits pill updates after a successful award"}),"\n",(0,t.jsxs)(s.li,{children:["Disable gating with ",(0,t.jsx)(s.code,{children:"PORTABLE_TRUST_CREDIT_GATING_ENABLED=false"})," for sandbox demos"]}),"\n"]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"consent-desk",children:"Consent desk"}),"\n",(0,t.jsx)(s.h3,{id:"list-first-grid-optional",children:"List first, grid optional"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Default layout is a ",(0,t.jsx)(s.strong,{children:"paginated list"})," (10 per page) for scan speed"]}),"\n",(0,t.jsxs)(s.li,{children:["Toggle ",(0,t.jsx)(s.strong,{children:"Grid"})," when you want card browsing (12 per page)"]}),"\n",(0,t.jsxs)(s.li,{children:["Search by name, username, email, or ",(0,t.jsx)(s.strong,{children:"PTI"})," fragment"]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"what-each-row-shows",children:"What each row shows"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Avatar + name + username"}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"PTI"})," chip when resolved (minted/backfilled via PTI infra on first touch)"]}),"\n",(0,t.jsxs)(s.li,{children:[(0,t.jsx)(s.strong,{children:"Headline score + band"})," only when ",(0,t.jsx)(s.code,{children:"can_access_score"})," is granted"]}),"\n",(0,t.jsx)(s.li,{children:"Scope pills: Score / Network / Behavior"}),"\n",(0,t.jsx)(s.li,{children:"Granted / time left / access count"}),"\n",(0,t.jsx)(s.li,{children:"Details modal + jump to Award credential"}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"expiring-soon",children:"Expiring soon"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Metric pulses amber when any active consent ends within ",(0,t.jsx)(s.strong,{children:"14 days"})]}),"\n",(0,t.jsxs)(s.li,{children:["Matching rows get an amber edge and status ",(0,t.jsx)(s.strong,{children:"active \xb7 soon"})]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"selective-share",children:"Selective share"}),"\n",(0,t.jsxs)(s.p,{children:["Score and network access are ",(0,t.jsx)(s.strong,{children:"not"})," the same as badge proof. When you need a specific credential, ask the member to share selectively from mobile, then award from Programmes when your role allows."]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"mobile-pairing",children:"Mobile pairing"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Hub action"}),(0,t.jsx)(s.th,{children:"Member experience"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Issue credential"}),(0,t.jsx)(s.td,{children:"Celebration / badge on Trust CV & Trussport"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Attest + cohort"}),(0,t.jsx)(s.td,{children:"Progress rail / programme milestone update"})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Member grants consent"}),(0,t.jsx)(s.td,{children:"Row appears on Consent desk with scopes + expiry"})]})]})]}),"\n",(0,t.jsxs)(s.p,{children:["Demo seed (Wirepick Demo Bank): ",(0,t.jsx)(s.code,{children:"make seed-programme-award"})," after Wirepick bank seed. Jane + cast with PTI, ContextScore, consents, and programmes."]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"feature-tours",children:"Feature tours"}),"\n",(0,t.jsxs)(s.p,{children:["On Programmes, Consent desk, and Trust queues, use ",(0,t.jsx)(s.strong,{children:"Take a tour"})," (sidebar / topbar replay) for a guided spotlight through:"]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"Programme board + credit-metered awards"}),"\n",(0,t.jsx)(s.li,{children:"Consent list, selective share, award jump"}),"\n",(0,t.jsx)(s.li,{children:"Trust queues + Award floor"}),"\n"]}),"\n",(0,t.jsx)(s.p,{children:"Tours finish with the same spark language as a successful award, deliberately shared chrome."}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"api-quick-links",children:"API quick links"}),"\n",(0,t.jsxs)(s.table,{children:[(0,t.jsx)(s.thead,{children:(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.th,{children:"Action"}),(0,t.jsx)(s.th,{children:"Endpoint"})]})}),(0,t.jsxs)(s.tbody,{children:[(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Issue credential"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"POST /api/v1/ubuntu/badges/issue/"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Attest milestone"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"POST /api/v1/ubuntu/badges/milestone-attest/"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Award activity"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"GET /api/v1/ubuntu/badges/award-activity/"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Cohort outcomes CSV"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"GET /api/v1/ubuntu/badges/cohort-outcomes.csv"})})]}),(0,t.jsxs)(s.tr,{children:[(0,t.jsx)(s.td,{children:"Programme catalog"}),(0,t.jsx)(s.td,{children:(0,t.jsx)(s.code,{children:"GET /api/v1/ubuntu/programmes/catalog/"})})]})]})]}),"\n",(0,t.jsxs)(s.p,{children:["Success responses may include ",(0,t.jsx)(s.code,{children:"credits_charged"})," and ",(0,t.jsx)(s.code,{children:"credits_available_after"}),". Insufficient credits return ",(0,t.jsx)(s.code,{children:"402"})," with ",(0,t.jsx)(s.code,{children:"headline"}),", ",(0,t.jsx)(s.code,{children:"subhead"}),", and billing hints."]}),"\n",(0,t.jsx)(s.hr,{}),"\n",(0,t.jsx)(s.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,t.jsxs)(s.ol,{children:["\n",(0,t.jsxs)(s.li,{children:["Open ",(0,t.jsx)(s.code,{children:"/institution/<slug>/programmes/"})," and walk the Award floor once with credits available"]}),"\n",(0,t.jsxs)(s.li,{children:["Confirm Consent desk list view + an expiring-soon row after ",(0,t.jsx)(s.code,{children:"make seed-programme-award"})]}),"\n",(0,t.jsx)(s.li,{children:"Replay the feature tour for your team onboarding"}),"\n",(0,t.jsxs)(s.li,{children:["For producer ingest + Pulse, continue with ",(0,t.jsx)(s.a,{href:"/tumitrust/audiences
1/for-partners",children:"For partners"})]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.