function rolesMapFigure(host) { ensureStyles(); var panels = [ { title: 'stdio', x: 8, rows: [ { t: 'author: discover', f: false }, { t: 'operator: env creds', f: true }, { t: 'user: can deny call', f: false } ] }, { title: 'http, no gateway', x: 196, rows: [ { t: 'author: PRM, origin', f: true }, { t: 'client: RFC 8707', f: false }, { t: 'governance: tokens', f: false } ] }, { title: 'gateway-fronted', x: 384, rows: [ { t: 'operator: origin', f: true }, { t: 'author: keeps PRM', f: false }, { t: 'governance: tokens', f: false } ] } ]; var panelWidth = 168; var headerHeight = 26; var rowHeight = 34; var bodyTop = 30; var parts = []; var i; var j; for (i = 0; i < panels.length; i++) { var panel = panels[i]; var bodyHeight = headerHeight + panel.rows.length * rowHeight + 10; parts.push(''); parts.push(''); parts.push('' + panel.title + ''); for (j = 0; j < panel.rows.length; j++) { var row = panel.rows[j]; var rowY = bodyTop + headerHeight + 14 + j * rowHeight; var markerClass = row.f ? 'l28f' : 'l28k'; parts.push(''); if (row.f) { parts.push('!'); } parts.push('' + row.t + ''); } } var shell = document.createElement('div'); shell.className = 'mf-shell'; shell.innerHTML = [ '
Roles Map the same MUST, three deployments, two different owners
', '
', '', '', parts.join(''), 'circle marks the owner; the flagged row is the requirement that changes owner', '', '
', '
Adoption changes who signs up for a MUST, not whether it still applies. Origin validation is a server MUST in every HTTP-reachable deployment; plain HTTP leaves it with the server author, and a gateway-fronted deployment moves it to the platform or gateway operator who terminates the connection first.
' ].join(''); host.appendChild(shell); } // register as: mcpa-28-roles-map