docs_muse_profiles.html
html
sha256:f99af7b1a7f36c4d537d1c630d4b71fc39222b1255f82e930929e2fc89015e11
fix: relax browse_repo perf budget to 500ms — 200ms was too…
Sonnet 4.6
101 days ago
| 1 | {% extends "musehub/base.html" %} |
| 2 | |
| 3 | {% block container_extra_class %} page-container{% endblock %} |
| 4 | {% block title %}Identity Profiles — Muse Developer Docs{% endblock %} |
| 5 | {% block page_json %}{"page":"docs-profiles"}{% endblock %} |
| 6 | |
| 7 | {% block content %} |
| 8 | <div class="devdocs"> |
| 9 | <div class="devdocs-layout"> |
| 10 | |
| 11 | {# ── Sidebar ─────────────────────────────────────────────────────────────── #} |
| 12 | <aside class="devdocs-sidebar"> |
| 13 | <nav class="devdocs-nav" aria-label="Docs navigation"> |
| 14 | <div class="devdocs-nav-group"> |
| 15 | <div class="devdocs-nav-group-label">Sections</div> |
| 16 | {% for slug, num, title, desc in phases %} |
| 17 | <a class="devdocs-nav-link devdocs-nav-link--phase{% if slug == current %} devdocs-nav-link--active{% endif %}" |
| 18 | href="/muse/{{ slug }}">{{ num }} {{ title }}</a> |
| 19 | {% endfor %} |
| 20 | </div> |
| 21 | <div class="devdocs-nav-group"> |
| 22 | <div class="devdocs-nav-group-label">On this page</div> |
| 23 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#archetypes">Three archetypes</a> |
| 24 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#sigil">Spectral Sigil</a> |
| 25 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#manifest">Profile manifest</a> |
| 26 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#attestations">Attestations</a> |
| 27 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#mpay">MPay ledger</a> |
| 28 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#canvas">Activity canvas</a> |
| 29 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#agent-profiles">Agent profiles</a> |
| 30 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#org-profiles">Org profiles</a> |
| 31 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#api">API reference</a> |
| 32 | <a class="devdocs-nav-link devdocs-nav-link--sub" href="#mcp-tools">MCP tools</a> |
| 33 | </div> |
| 34 | </nav> |
| 35 | </aside> |
| 36 | |
| 37 | {# ── Content ─────────────────────────────────────────────────────────────── #} |
| 38 | <article class="devdocs-content"> |
| 39 | |
| 40 | <div class="devdocs-breadcrumb"> |
| 41 | <a href="/muse">Developer Docs</a> |
| 42 | <span>›</span> |
| 43 | <span>Identity Profiles</span> |
| 44 | </div> |
| 45 | |
| 46 | <div class="devdocs-phase-header"> |
| 47 | <span class="devdocs-phase-num">PHASE 11</span> |
| 48 | <h1 class="devdocs-phase-title">Identity Profiles</h1> |
| 49 | <p class="devdocs-phase-desc"> |
| 50 | The MuseHub profile is the public face of a <strong>cryptographic identity</strong> — not a |
| 51 | social media card. Every entity in the ecosystem (human, agent, or org) is defined by what |
| 52 | it signs, what it creates, and what it attests to. The profile page makes all of that |
| 53 | legible, beautiful, and machine-readable simultaneously. Profiles are archetype-aware: |
| 54 | humans, agents, and organisations share a unified shell but render archetype-specific panels. |
| 55 | </p> |
| 56 | </div> |
| 57 | |
| 58 | {# ── Three archetypes ─────────────────────────────────────────────────── #} |
| 59 | <section class="devdocs-section" id="archetypes"> |
| 60 | <h2 class="devdocs-section-title"><a href="#archetypes">Three archetypes</a></h2> |
| 61 | |
| 62 | <p> |
| 63 | Every identity in MuseHub has an <code>identity_type</code> of <code>human</code>, |
| 64 | <code>agent</code>, or <code>org</code>. This single field drives every adaptive |
| 65 | rendering decision on the profile page — colour palette, core glyph shape in the |
| 66 | Spectral Sigil, which panels are shown, and which API fields are populated. |
| 67 | </p> |
| 68 | |
| 69 | <div class="devdocs-code-block"> |
| 70 | <div class="devdocs-code-header"> |
| 71 | <span class="devdocs-code-lang">text</span> |
| 72 | <span class="devdocs-code-label">identity archetypes</span> |
| 73 | </div> |
| 74 | <pre><code>┌─────────────────────────────────────────────────────────────────────┐ |
| 75 | │ IDENTITY ARCHETYPES │ |
| 76 | ├─────────────────┬──────────────────────┬────────────────────────────┤ |
| 77 | │ HUMAN │ AGENT │ ORG / COLLECTIVE │ |
| 78 | │ Root of trust │ Bounded intelligence│ Federated governance │ |
| 79 | │ MSign Ed25519 │ Trust chain from │ Multi-sig quorum │ |
| 80 | │ BIP39 mnemonic │ spawned_by handle │ member roster on-chain │ |
| 81 | │ AVAX address │ model_id + scope │ proposal voting weight │ |
| 82 | │ Bio + socials │ capabilities list │ treasury address │ |
| 83 | └─────────────────┴──────────────────────┴────────────────────────────┘</code></pre> |
| 84 | </div> |
| 85 | |
| 86 | <p> |
| 87 | The profile URL is always <code>/{handle}</code>. The server resolves the handle against |
| 88 | <code>musehub_identities</code>, detects <code>identity_type</code>, and renders the |
| 89 | appropriate template variant. There is no separate <code>/agents/{handle}</code> path — |
| 90 | humans, agents, and orgs are all first-class citizens at the same URL scheme. |
| 91 | </p> |
| 92 | |
| 93 | <h3 class="devdocs-subsection-title"><a href="#human-layout">Human profile layout</a></h3> |
| 94 | <div class="devdocs-code-block"> |
| 95 | <div class="devdocs-code-header"> |
| 96 | <span class="devdocs-code-lang">text</span> |
| 97 | <span class="devdocs-code-label">human profile</span> |
| 98 | </div> |
| 99 | <pre><code>╔══════════════════════════════════════════════════════════════════════╗ |
| 100 | ║ [Spectral Sigil] gabriel 29 REPOS ║ |
| 101 | ║ @gabriel · human · verified 3,324 COMMITS ║ |
| 102 | ║ "Building the sound of the 24 DAY STREAK ║ |
| 103 | ║ future" 3,324 THIS YEAR ║ |
| 104 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 105 | ║ AVAX · Ed25519 fingerprint · Registered date · Pinned repos ║ |
| 106 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 107 | ║ ACTIVITY CANVAS — 52 weeks × 5 domains ║ |
| 108 | ║ CODE ░░░░▒▒▓▓██▓▓▒░░ … ║ |
| 109 | ║ MUSIC ░░▒▒▓▓████▓▒▒░░ … ║ |
| 110 | ║ MIDI ░░░▒▒▓▓███▓▒░░░ … ║ |
| 111 | ║ PROSE ░▒▒▒▓▓▒░░░░▒▒▒▓ … ║ |
| 112 | ║ MPAY ░░░░▒▒▒▓▓▓████▓ … ║ |
| 113 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 114 | ║ ATTESTATIONS RECEIVED ATTESTATIONS GIVEN ║ |
| 115 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 116 | ║ CRYPTOGRAPHIC PROVENANCE CHAIN ║ |
| 117 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 118 | ║ AGENT FLEET [mix-engine-7] [stori-bot] [maestro-9] ║ |
| 119 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 120 | ║ REPOS [musehub] [muse] [agentception] [Stori] … ║ |
| 121 | ╚══════════════════════════════════════════════════════════════════════╝</code></pre> |
| 122 | </div> |
| 123 | |
| 124 | <h3 class="devdocs-subsection-title"><a href="#agent-layout">Agent profile layout</a></h3> |
| 125 | <div class="devdocs-code-block"> |
| 126 | <div class="devdocs-code-header"> |
| 127 | <span class="devdocs-code-lang">text</span> |
| 128 | <span class="devdocs-code-label">agent profile</span> |
| 129 | </div> |
| 130 | <pre><code>╔══════════════════════════════════════════════════════════════════════╗ |
| 131 | ║ [Spectral Sigil] mix-engine-7 TRUST CHAIN ║ |
| 132 | ║ @mix-engine-7 · agent gabriel → ║ |
| 133 | ║ model: claude-opus-4-6 this agent ║ |
| 134 | ║ spawned by: @gabriel ║ |
| 135 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 136 | ║ CAPABILITIES & SCOPE ║ |
| 137 | ║ ✓ read:repos ✓ write:repos ✓ mpay:send ✗ admin:hub ║ |
| 138 | ║ expires: 2026-06-01 · max_spend: 500,000 nanoMUSE/session ║ |
| 139 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 140 | ║ WORK LEDGER (last 30 days) ║ |
| 141 | ║ Commits signed: 47 · Stems attested: 23 · Payments sent: 891 ║ |
| 142 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 143 | ║ CRYPTOGRAPHIC PROVENANCE CHAIN ║ |
| 144 | ╚══════════════════════════════════════════════════════════════════════╝</code></pre> |
| 145 | </div> |
| 146 | |
| 147 | <h3 class="devdocs-subsection-title"><a href="#org-layout">Org profile layout</a></h3> |
| 148 | <div class="devdocs-code-block"> |
| 149 | <div class="devdocs-code-header"> |
| 150 | <span class="devdocs-code-lang">text</span> |
| 151 | <span class="devdocs-code-label">org profile</span> |
| 152 | </div> |
| 153 | <pre><code>╔══════════════════════════════════════════════════════════════════════╗ |
| 154 | ║ [Spectral Sigil] darkroom-collective TREASURY ║ |
| 155 | ║ @darkroom-collective · org AVAX: 0xabc…def ║ |
| 156 | ║ quorum: 3/5 members multi-sig ║ |
| 157 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 158 | ║ MEMBER ROSTER ║ |
| 159 | ║ @gabriel (admin, weight: 2) · @aaronrene (member, weight: 1) … ║ |
| 160 | ╠══════════════════════════════════════════════════════════════════════╣ |
| 161 | ║ OPEN PROPOSALS ║ |
| 162 | ║ #4 "Release v2 stems" votes: 2/5 ⏳ #3 "Add member" ✅ ║ |
| 163 | ╚══════════════════════════════════════════════════════════════════════╝</code></pre> |
| 164 | </div> |
| 165 | </section> |
| 166 | |
| 167 | {# ── Spectral Sigil ───────────────────────────────────────────────────── #} |
| 168 | <section class="devdocs-section" id="sigil"> |
| 169 | <h2 class="devdocs-section-title"><a href="#sigil">Spectral Sigil</a></h2> |
| 170 | |
| 171 | <p> |
| 172 | The Spectral Sigil is a <strong>content-addressed SVG avatar</strong> generated |
| 173 | deterministically from an identity's <code>sha256</code> genesis ID and archetype. |
| 174 | It is not an image you upload — it is derived from who you are in the graph. |
| 175 | Same identity → same sigil, forever. |
| 176 | </p> |
| 177 | |
| 178 | <h3 class="devdocs-subsection-title"><a href="#sigil-route">Route</a></h3> |
| 179 | |
| 180 | <div class="devdocs-code-block"> |
| 181 | <div class="devdocs-code-header"> |
| 182 | <span class="devdocs-code-lang">http</span> |
| 183 | <span class="devdocs-code-label">avatar route</span> |
| 184 | </div> |
| 185 | <pre><code>GET /avatars/{algo}/{hex}.svg</code></pre> |
| 186 | </div> |
| 187 | |
| 188 | <p> |
| 189 | The algo-in-path convention matches the object store — no colons in URLs, |
| 190 | no ambiguity. The canonical <code>identity_id</code> is reconstructed server-side |
| 191 | as <code>{algo}:{hex}</code> for the DB lookup. Currently only <code>sha256</code> |
| 192 | is supported. The response carries <code>Cache-Control: public, max-age=31536000, immutable</code> |
| 193 | — content-addressed means it never changes, so it can be cached forever. |
| 194 | </p> |
| 195 | |
| 196 | <div class="devdocs-code-block"> |
| 197 | <div class="devdocs-code-header"> |
| 198 | <span class="devdocs-code-lang">bash</span> |
| 199 | <span class="devdocs-code-label">fetch a sigil</span> |
| 200 | </div> |
| 201 | <pre><code>curl {{ site_base_url() }}/avatars/sha256/41dfaf048e4979cb767fd43e9c82c42cccbb402ab02a8b2cc329c8b778f7c841.svg</code></pre> |
| 202 | </div> |
| 203 | |
| 204 | <h3 class="devdocs-subsection-title"><a href="#sigil-layers">Five layers</a></h3> |
| 205 | |
| 206 | <p>Every Spectral Sigil is composed of five deterministic layers:</p> |
| 207 | |
| 208 | <div class="devdocs-code-block"> |
| 209 | <div class="devdocs-code-header"> |
| 210 | <span class="devdocs-code-lang">text</span> |
| 211 | <span class="devdocs-code-label">layer derivation</span> |
| 212 | </div> |
| 213 | <pre><code>Layer 1 — Chromatic Field bytes 0–3 hue 0–359°; archetype sets palette register |
| 214 | Layer 2 — Archetype Core bytes 4–7 human=bezier blob, agent=hex circuit, org=N-gon |
| 215 | Layer 3 — Orbital Rings bytes 8–15 2 ellipses at unique rotations + eccentricities |
| 216 | Layer 4 — Domain Dots bytes 16–23 dots on orbits, colored by live domain activity |
| 217 | Layer 5 — Handle Initial — first char of handle, centered monospace</code></pre> |
| 218 | </div> |
| 219 | |
| 220 | <h3 class="devdocs-subsection-title"><a href="#sigil-palette">Palette registers by archetype</a></h3> |
| 221 | |
| 222 | <div class="devdocs-table-wrap"> |
| 223 | <table class="devdocs-table"> |
| 224 | <thead><tr><th>Archetype</th><th>Saturation</th><th>Lightness</th><th>Character</th></tr></thead> |
| 225 | <tbody> |
| 226 | <tr><td><code>human</code></td><td>70%</td><td>48%</td><td>warm, earthen, organic</td></tr> |
| 227 | <tr><td><code>agent</code></td><td>90%</td><td>50%</td><td>cold, electric, high-contrast</td></tr> |
| 228 | <tr><td><code>org</code></td><td>60%</td><td>55%</td><td>amber-gold, federated</td></tr> |
| 229 | </tbody> |
| 230 | </table> |
| 231 | </div> |
| 232 | |
| 233 | <h3 class="devdocs-subsection-title"><a href="#sigil-domains">Domain dot colors</a></h3> |
| 234 | |
| 235 | <p> |
| 236 | Domain dots appear on the orbital rings colored by actual activity. If no activity |
| 237 | exists yet (genesis state), dots are rendered in grayscale at 40% opacity — the |
| 238 | sigil is dormant, waiting to awaken. |
| 239 | </p> |
| 240 | |
| 241 | <div class="devdocs-table-wrap"> |
| 242 | <table class="devdocs-table"> |
| 243 | <thead><tr><th>Domain</th><th>Color</th><th>Represents</th></tr></thead> |
| 244 | <tbody> |
| 245 | <tr><td><code>code</code></td><td><code>#388bfd</code></td><td>commits, symbol changes</td></tr> |
| 246 | <tr><td><code>music</code></td><td><code>#bc8cff</code></td><td>stem uploads, audio events</td></tr> |
| 247 | <tr><td><code>midi</code></td><td><code>#3fb950</code></td><td>MIDI sequences, note events</td></tr> |
| 248 | <tr><td><code>prose</code></td><td><code>#f0883e</code></td><td>issues, proposals, docs</td></tr> |
| 249 | <tr><td><code>mpay</code></td><td><code>#d29922</code></td><td>payment claims sent/received</td></tr> |
| 250 | </tbody> |
| 251 | </table> |
| 252 | </div> |
| 253 | |
| 254 | <h3 class="devdocs-subsection-title"><a href="#sigil-hue">Hue derivation</a></h3> |
| 255 | |
| 256 | <div class="devdocs-code-block"> |
| 257 | <div class="devdocs-code-header"> |
| 258 | <span class="devdocs-code-lang">python</span> |
| 259 | <span class="devdocs-code-label">musehub/services/spectral_sigil.py</span> |
| 260 | </div> |
| 261 | <pre><code>def derive_hue(identity_id: str) -> int: |
| 262 | <span class="tok-comment"># First 4 bytes of the sha256 hex → integer → hue 0-359</span> |
| 263 | raw = int(identity_id[:8], 16) |
| 264 | return raw % 360</code></pre> |
| 265 | </div> |
| 266 | </section> |
| 267 | |
| 268 | {# ── Profile manifest ─────────────────────────────────────────────────── #} |
| 269 | <section class="devdocs-section" id="manifest"> |
| 270 | <h2 class="devdocs-section-title"><a href="#manifest">Profile manifest</a></h2> |
| 271 | |
| 272 | <p> |
| 273 | The unified profile endpoint returns an archetype-aware JSON manifest. All |
| 274 | three archetypes share a common envelope; archetype-specific fields are present |
| 275 | only when relevant. |
| 276 | </p> |
| 277 | |
| 278 | <div class="devdocs-code-block"> |
| 279 | <div class="devdocs-code-header"> |
| 280 | <span class="devdocs-code-lang">json</span> |
| 281 | <span class="devdocs-code-label">human profile manifest</span> |
| 282 | </div> |
| 283 | <pre><code>{ |
| 284 | <span class="tok-key">"handle"</span>: <span class="tok-str">"gabriel"</span>, |
| 285 | <span class="tok-key">"identity_type"</span>: <span class="tok-str">"human"</span>, |
| 286 | <span class="tok-key">"identity_id"</span>: <span class="tok-str">"sha256:41dfaf048e4979cb…"</span>, |
| 287 | <span class="tok-key">"bio"</span>: <span class="tok-str">"Building the sound of the future"</span>, |
| 288 | <span class="tok-key">"avax_address"</span>: <span class="tok-str">"0x1a2b3c4d5e6f…"</span>, |
| 289 | <span class="tok-key">"public_key"</span>: <span class="tok-str">"ed25519:3aB7kLmNpQ2rS4tU…"</span>, |
| 290 | <span class="tok-key">"fingerprint"</span>: <span class="tok-str">"sha256:41dfaf04…"</span>, |
| 291 | <span class="tok-key">"registered_at"</span>: <span class="tok-str">"2026-04-27T00:00:00Z"</span>, |
| 292 | <span class="tok-key">"archetype"</span>: { |
| 293 | <span class="tok-key">"activity_canvas"</span>: <span class="tok-str">"…"</span>, |
| 294 | <span class="tok-key">"attestation_badges"</span>: [], |
| 295 | <span class="tok-key">"mpay_totals"</span>: { <span class="tok-key">"sent_nano"</span>: 0, <span class="tok-key">"received_nano"</span>: 0 }, |
| 296 | <span class="tok-key">"org_manifest"</span>: null, |
| 297 | <span class="tok-key">"agent_trust_chain"</span>: null |
| 298 | }, |
| 299 | <span class="tok-key">"stats"</span>: { |
| 300 | <span class="tok-key">"repo_count"</span>: 29, |
| 301 | <span class="tok-key">"commit_count"</span>: 3324 |
| 302 | } |
| 303 | }</code></pre> |
| 304 | </div> |
| 305 | |
| 306 | <p> |
| 307 | For <code>identity_type: "agent"</code>, the manifest includes |
| 308 | <code>agent_trust_chain</code> (the spawned-by chain back to a human root), |
| 309 | <code>agent_capabilities</code>, and <code>expires_at</code>. |
| 310 | For <code>identity_type: "org"</code>, it includes <code>org_manifest</code> |
| 311 | with the member roster, quorum threshold, and treasury address. |
| 312 | </p> |
| 313 | |
| 314 | <h3 class="devdocs-subsection-title"><a href="#manifest-endpoint">REST endpoint</a></h3> |
| 315 | |
| 316 | <div class="devdocs-code-block"> |
| 317 | <div class="devdocs-code-header"> |
| 318 | <span class="devdocs-code-lang">http</span> |
| 319 | <span class="devdocs-code-label">fetch profile manifest</span> |
| 320 | </div> |
| 321 | <pre><code>GET /api/profiles/{handle}</code></pre> |
| 322 | </div> |
| 323 | |
| 324 | <p>No authentication required for public profiles.</p> |
| 325 | </section> |
| 326 | |
| 327 | {# ── Attestations (callout — full docs live on the identity page) ────── #} |
| 328 | <section class="devdocs-section" id="attestations"> |
| 329 | <h2 class="devdocs-section-title"><a href="#attestations">Attestations</a></h2> |
| 330 | |
| 331 | <div class="devdocs-callout"> |
| 332 | {{ icon("info", 16, "devdocs-callout-icon") }} |
| 333 | <div> |
| 334 | Attestations are how a profile acquires verified claims — that gabriel is human, |
| 335 | that claude-code is a trustworthy agent, that a specific commit was code-reviewed. |
| 336 | They render here as the <code>attestation_badges</code> on the manifest, but they |
| 337 | are fundamentally a signing operation and live with the rest of the identity stack. |
| 338 | See <a href="/muse/identity#attestations">Attestations on the Cryptographic |
| 339 | Identity page</a> for the canonical message format, the 17 claim types, the three |
| 340 | scopes (<code>identity</code> / <code>repo</code> / <code>commit</code>), the REST |
| 341 | API, and the <code>muse hub attestation</code> CLI. |
| 342 | </div> |
| 343 | </div> |
| 344 | </section> |
| 345 | |
| 346 | {# ── MPay ledger ──────────────────────────────────────────────────────── #} |
| 347 | <section class="devdocs-section" id="mpay"> |
| 348 | <h2 class="devdocs-section-title"><a href="#mpay">MPay ledger</a></h2> |
| 349 | |
| 350 | <p> |
| 351 | Every profile shows a live payment ledger — total <code>nanoMUSE</code> sent and |
| 352 | received, with a chain of linked claims. MPay claims are Ed25519-signed off-chain |
| 353 | receipts. On-chain settlement to AVAX C-Chain is optional and produces a |
| 354 | <code>settled_tx_hash</code> badge on the profile. |
| 355 | </p> |
| 356 | |
| 357 | <h3 class="devdocs-subsection-title"><a href="#mpay-canonical">Canonical message format</a></h3> |
| 358 | |
| 359 | <div class="devdocs-code-block"> |
| 360 | <div class="devdocs-code-header"> |
| 361 | <span class="devdocs-code-lang">text</span> |
| 362 | <span class="devdocs-code-label">canonical MPay message</span> |
| 363 | </div> |
| 364 | <pre><code>MPAY\n{sender}\n{recipient}\n{amount_nano}\n{nonce_hex}</code></pre> |
| 365 | </div> |
| 366 | |
| 367 | <p> |
| 368 | The <code>nonce_hex</code> links claims into a chain — each payment references |
| 369 | the previous claim's nonce, making the ledger tamper-evident without a blockchain. |
| 370 | On-chain settlement is a separate optional step that writes a |
| 371 | <code>settled_tx_hash</code> to the claim row. |
| 372 | </p> |
| 373 | |
| 374 | <h3 class="devdocs-subsection-title"><a href="#mpay-api">MPay API</a></h3> |
| 375 | |
| 376 | <div class="devdocs-table-wrap"> |
| 377 | <table class="devdocs-table"> |
| 378 | <thead><tr><th>Method</th><th>Path</th><th>Description</th></tr></thead> |
| 379 | <tbody> |
| 380 | <tr> |
| 381 | <td><code>POST</code></td> |
| 382 | <td><code>/api/profiles/{handle}/mpay-claims</code></td> |
| 383 | <td>Record a signed payment claim</td> |
| 384 | </tr> |
| 385 | <tr> |
| 386 | <td><code>GET</code></td> |
| 387 | <td><code>/api/profiles/{handle}/mpay-ledger</code></td> |
| 388 | <td>Fetch sent + received totals and recent claims</td> |
| 389 | </tr> |
| 390 | </tbody> |
| 391 | </table> |
| 392 | </div> |
| 393 | |
| 394 | <div class="devdocs-code-block"> |
| 395 | <div class="devdocs-code-header"> |
| 396 | <span class="devdocs-code-lang">json</span> |
| 397 | <span class="devdocs-code-label">mpay-ledger response</span> |
| 398 | </div> |
| 399 | <pre><code>{ |
| 400 | <span class="tok-key">"handle"</span>: <span class="tok-str">"gabriel"</span>, |
| 401 | <span class="tok-key">"sent_nano"</span>: <span class="tok-num">1200000</span>, |
| 402 | <span class="tok-key">"received_nano"</span>: <span class="tok-num">890000</span>, |
| 403 | <span class="tok-key">"claim_count"</span>: <span class="tok-num">47</span>, |
| 404 | <span class="tok-key">"recent_claims"</span>: [ |
| 405 | { |
| 406 | <span class="tok-key">"from_handle"</span>: <span class="tok-str">"gabriel"</span>, |
| 407 | <span class="tok-key">"to_handle"</span>: <span class="tok-str">"aaronrene"</span>, |
| 408 | <span class="tok-key">"amount_nano"</span>: <span class="tok-num">500000</span>, |
| 409 | <span class="tok-key">"nonce_hex"</span>: <span class="tok-str">"a3f2c9d8…"</span>, |
| 410 | <span class="tok-key">"memo"</span>: <span class="tok-str">"stem collab session"</span>, |
| 411 | <span class="tok-key">"settled"</span>: false |
| 412 | } |
| 413 | ] |
| 414 | }</code></pre> |
| 415 | </div> |
| 416 | </section> |
| 417 | |
| 418 | {# ── Activity canvas ──────────────────────────────────────────────────── #} |
| 419 | <section class="devdocs-section" id="canvas"> |
| 420 | <h2 class="devdocs-section-title"><a href="#canvas">Activity canvas</a></h2> |
| 421 | |
| 422 | <p> |
| 423 | The activity canvas is a 52-week × 5-domain heatmap that shows the full creative |
| 424 | output of an identity — not just commit frequency. It is unique to Muse: no other |
| 425 | version control platform tracks code, music, MIDI, prose, and payments in a single |
| 426 | unified grid. |
| 427 | </p> |
| 428 | |
| 429 | <div class="devdocs-code-block"> |
| 430 | <div class="devdocs-code-header"> |
| 431 | <span class="devdocs-code-lang">text</span> |
| 432 | <span class="devdocs-code-label">activity canvas grid</span> |
| 433 | </div> |
| 434 | <pre><code>Domain Week 1 Week 2 … Week 52 |
| 435 | CODE ░░░▒▒▓▓██▓▓▒ ░░▒▒▓▓█████▓ … ▒▒▓▓▓▒░░ |
| 436 | MUSIC ░░▒▒▓▓████▓▒ ▒▒░░░▒▒▓▓▓▒░ … ░░▒▒▓▓██ |
| 437 | MIDI ░░░▒▒▓▓███▓▒ ░▒▒▓▓███████ … ▓▓▒░░░▒▒ |
| 438 | PROSE ░▒▒▒▓▓▒░░░░▒ ░░░░▒▒▒▒▒▓▓▒ … ░▒▒▒▒▓▓▓ |
| 439 | MPAY ░░░░▒▒▒▓▓▓██ ████▓▓▒▒░░░░ … ▒░░░░░▒▒ |
| 440 | |
| 441 | Legend: ░ none ▒ low ▓ medium █ high</code></pre> |
| 442 | </div> |
| 443 | |
| 444 | <p> |
| 445 | Each cell is an intensity value 0–4, derived from commit counts (code), upload |
| 446 | counts (music/midi), word counts (prose), and claim counts (mpay) for that day. |
| 447 | The intensity scale is normalised per-domain so low-activity domains don't appear |
| 448 | permanently dark. |
| 449 | </p> |
| 450 | </section> |
| 451 | |
| 452 | {# ── Agent profiles ───────────────────────────────────────────────────── #} |
| 453 | <section class="devdocs-section" id="agent-profiles"> |
| 454 | <h2 class="devdocs-section-title"><a href="#agent-profiles">Agent profiles</a></h2> |
| 455 | |
| 456 | <p> |
| 457 | Every agent spawned in the ecosystem gets a profile at <code>/{handle}</code>. |
| 458 | The profile shows the full trust chain back to a human root, the agent's |
| 459 | declared capabilities and scope, its expiry date, and its work ledger for the |
| 460 | last 30 days. |
| 461 | </p> |
| 462 | |
| 463 | <p> |
| 464 | An expired agent's profile is still verifiable — all its past signed commits |
| 465 | remain tamper-evident in the DAG — but the profile clearly marks the credential |
| 466 | as expired. Future pushes from that agent will be rejected by the hub. |
| 467 | </p> |
| 468 | |
| 469 | <div class="devdocs-code-block"> |
| 470 | <div class="devdocs-code-header"> |
| 471 | <span class="devdocs-code-lang">json</span> |
| 472 | <span class="devdocs-code-label">agent trust chain in manifest</span> |
| 473 | </div> |
| 474 | <pre><code>{ |
| 475 | <span class="tok-key">"handle"</span>: <span class="tok-str">"mix-engine-7"</span>, |
| 476 | <span class="tok-key">"identity_type"</span>: <span class="tok-str">"agent"</span>, |
| 477 | <span class="tok-key">"spawned_by"</span>: <span class="tok-str">"gabriel"</span>, |
| 478 | <span class="tok-key">"agent_model"</span>: <span class="tok-str">"claude-opus-4-6"</span>, |
| 479 | <span class="tok-key">"agent_capabilities"</span>: [<span class="tok-str">"read:repos"</span>, <span class="tok-str">"write:repos"</span>, <span class="tok-str">"mpay:send"</span>], |
| 480 | <span class="tok-key">"expires_at"</span>: <span class="tok-str">"2026-06-01T00:00:00Z"</span>, |
| 481 | <span class="tok-key">"archetype"</span>: { |
| 482 | <span class="tok-key">"agent_trust_chain"</span>: [ |
| 483 | { <span class="tok-key">"handle"</span>: <span class="tok-str">"gabriel"</span>, <span class="tok-key">"type"</span>: <span class="tok-str">"human"</span> }, |
| 484 | { <span class="tok-key">"handle"</span>: <span class="tok-str">"mix-engine-7"</span>, <span class="tok-key">"type"</span>: <span class="tok-str">"agent"</span> } |
| 485 | ] |
| 486 | } |
| 487 | }</code></pre> |
| 488 | </div> |
| 489 | </section> |
| 490 | |
| 491 | {# ── Org profiles ─────────────────────────────────────────────────────── #} |
| 492 | <section class="devdocs-section" id="org-profiles"> |
| 493 | <h2 class="devdocs-section-title"><a href="#org-profiles">Org profiles</a></h2> |
| 494 | |
| 495 | <p> |
| 496 | An org is a collective of humans and agents operating under a shared identity with |
| 497 | multi-sig quorum governance. The org profile shows the member roster with voting |
| 498 | weights, open proposals, and the shared AVAX treasury address. |
| 499 | </p> |
| 500 | |
| 501 | <p> |
| 502 | The Spectral Sigil for an org uses the quorum polygon archetype — an N-gon where |
| 503 | N (5–8 sides) is derived from the identity_id, with diagonal weights that vary |
| 504 | edge thickness to reflect the hierarchy of voting weights within the collective. |
| 505 | </p> |
| 506 | |
| 507 | <div class="devdocs-code-block"> |
| 508 | <div class="devdocs-code-header"> |
| 509 | <span class="devdocs-code-lang">json</span> |
| 510 | <span class="devdocs-code-label">org manifest</span> |
| 511 | </div> |
| 512 | <pre><code>{ |
| 513 | <span class="tok-key">"handle"</span>: <span class="tok-str">"darkroom-collective"</span>, |
| 514 | <span class="tok-key">"identity_type"</span>: <span class="tok-str">"org"</span>, |
| 515 | <span class="tok-key">"archetype"</span>: { |
| 516 | <span class="tok-key">"org_manifest"</span>: { |
| 517 | <span class="tok-key">"members"</span>: [ |
| 518 | { <span class="tok-key">"handle"</span>: <span class="tok-str">"gabriel"</span>, <span class="tok-key">"role"</span>: <span class="tok-str">"admin"</span>, <span class="tok-key">"voting_weight"</span>: <span class="tok-num">2</span> }, |
| 519 | { <span class="tok-key">"handle"</span>: <span class="tok-str">"aaronrene"</span>, <span class="tok-key">"role"</span>: <span class="tok-str">"member"</span>, <span class="tok-key">"voting_weight"</span>: <span class="tok-num">1</span> }, |
| 520 | { <span class="tok-key">"handle"</span>: <span class="tok-str">"stori-bot"</span>, <span class="tok-key">"role"</span>: <span class="tok-str">"member"</span>, <span class="tok-key">"voting_weight"</span>: <span class="tok-num">1</span> } |
| 521 | ], |
| 522 | <span class="tok-key">"quorum"</span>: <span class="tok-num">3</span>, |
| 523 | <span class="tok-key">"treasury_address"</span>: <span class="tok-str">"0xabc…def"</span> |
| 524 | } |
| 525 | } |
| 526 | }</code></pre> |
| 527 | </div> |
| 528 | </section> |
| 529 | |
| 530 | {# ── API reference ────────────────────────────────────────────────────── #} |
| 531 | <section class="devdocs-section" id="api"> |
| 532 | <h2 class="devdocs-section-title"><a href="#api">API reference</a></h2> |
| 533 | |
| 534 | <div class="devdocs-table-wrap"> |
| 535 | <table class="devdocs-table"> |
| 536 | <thead><tr><th>Method</th><th>Path</th><th>Auth</th><th>Description</th></tr></thead> |
| 537 | <tbody> |
| 538 | <tr> |
| 539 | <td><code>GET</code></td> |
| 540 | <td><code>/avatars/{algo}/{hex}.svg</code></td> |
| 541 | <td>none</td> |
| 542 | <td>Spectral Sigil SVG — immutably cached</td> |
| 543 | </tr> |
| 544 | <tr> |
| 545 | <td><code>GET</code></td> |
| 546 | <td><code>/api/profiles/{handle}</code></td> |
| 547 | <td>none</td> |
| 548 | <td>Full archetype-aware profile manifest</td> |
| 549 | </tr> |
| 550 | <tr> |
| 551 | <td><code>GET</code></td> |
| 552 | <td><code>/api/profiles/{handle}/attestations</code></td> |
| 553 | <td>none</td> |
| 554 | <td>Attestations received by this handle</td> |
| 555 | </tr> |
| 556 | <tr> |
| 557 | <td><code>POST</code></td> |
| 558 | <td><code>/api/profiles/{handle}/attestations</code></td> |
| 559 | <td>MSign</td> |
| 560 | <td>Issue a signed attestation</td> |
| 561 | </tr> |
| 562 | <tr> |
| 563 | <td><code>DELETE</code></td> |
| 564 | <td><code>/api/profiles/{handle}/attestations/{id}</code></td> |
| 565 | <td>MSign</td> |
| 566 | <td>Revoke (sets <code>revoked_at</code>, audit trail preserved)</td> |
| 567 | </tr> |
| 568 | <tr> |
| 569 | <td><code>POST</code></td> |
| 570 | <td><code>/api/profiles/{handle}/mpay-claims</code></td> |
| 571 | <td>MSign</td> |
| 572 | <td>Record a signed MPay claim</td> |
| 573 | </tr> |
| 574 | <tr> |
| 575 | <td><code>GET</code></td> |
| 576 | <td><code>/api/profiles/{handle}/mpay-ledger</code></td> |
| 577 | <td>none</td> |
| 578 | <td>Sent + received totals and recent claims</td> |
| 579 | </tr> |
| 580 | </tbody> |
| 581 | </table> |
| 582 | </div> |
| 583 | </section> |
| 584 | |
| 585 | {# ── MCP tools ────────────────────────────────────────────────────────── #} |
| 586 | <section class="devdocs-section" id="mcp-tools"> |
| 587 | <h2 class="devdocs-section-title"><a href="#mcp-tools">MCP tools</a></h2> |
| 588 | |
| 589 | <p> |
| 590 | All profile operations are available as MCP tools so agents can read profiles, |
| 591 | issue attestations, and record payments without direct HTTP calls. |
| 592 | </p> |
| 593 | |
| 594 | <div class="devdocs-table-wrap"> |
| 595 | <table class="devdocs-table"> |
| 596 | <thead><tr><th>Tool name</th><th>Description</th></tr></thead> |
| 597 | <tbody> |
| 598 | <tr><td><code>musehub_read_profile_manifest</code></td><td>Full archetype-aware manifest for any handle</td></tr> |
| 599 | <tr><td><code>musehub_issue_attestation</code></td><td>Sign + post an attestation claim</td></tr> |
| 600 | <tr><td><code>musehub_revoke_attestation</code></td><td>Revoke an existing attestation by ID</td></tr> |
| 601 | <tr><td><code>musehub_list_attestations</code></td><td>Query attestations received by a handle</td></tr> |
| 602 | <tr><td><code>musehub_record_mpay_claim</code></td><td>Record a signed MPay payment claim</td></tr> |
| 603 | <tr><td><code>musehub_get_mpay_ledger</code></td><td>Sent + received totals for a handle</td></tr> |
| 604 | </tbody> |
| 605 | </table> |
| 606 | </div> |
| 607 | |
| 608 | <div class="devdocs-callout devdocs-callout--info"> |
| 609 | <strong>What makes this different</strong><br> |
| 610 | These are not social features bolted onto a code host. Every attestation is an |
| 611 | Ed25519-signed cryptographic claim verifiable without trusting MuseHub. Every |
| 612 | payment claim chains nonces into a tamper-evident ledger. Every profile sigil is |
| 613 | derived from the identity's genesis hash — it cannot be faked or transferred. |
| 614 | The same key that signs your commits signs your attestations and authorises your payments. |
| 615 | </div> |
| 616 | </section> |
| 617 | |
| 618 | {# ── Phase nav ─────────────────────────────────────────────────────────── #} |
| 619 | <nav class="devdocs-phase-nav" aria-label="Phase navigation"> |
| 620 | <a class="devdocs-phase-nav-btn devdocs-phase-nav-btn--prev" href="/muse/api">{{ icon("arrow-left", 14) }} 10 API Reference</a> |
| 621 | <a class="devdocs-phase-nav-btn" href="/muse">All phases</a> |
| 622 | <a class="devdocs-phase-nav-btn devdocs-phase-nav-btn--next" href="/muse/mists">12 Mists {{ icon("arrow-right", 14) }}</a> |
| 623 | </nav> |
| 624 | |
| 625 | </article> |
| 626 | </div> |
| 627 | </div> |
| 628 | {% endblock %} |
File History
2 commits
sha256:f99af7b1a7f36c4d537d1c630d4b71fc39222b1255f82e930929e2fc89015e11
fix: relax browse_repo perf budget to 500ms — 200ms was too…
Sonnet 4.6
101 days ago
sha256:763eb2cb8675073b84c19345b27586d2ed939a9aee97c5479b69f502f1a70eff
fix(tests): update test suite to match current implementation
Sonnet 4.6
patch
123 days ago