gabriel / musehub public
docs_muse_profiles.html html
628 lines 35.8 KB
Raw
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