Profile Page Reimagination: Agent-First, Cryptographically-Grounded Identity Manifests
Profile Page Reimagination: Agent-First, Cryptographically-Grounded Identity Manifests
Vision
The MuseHub profile is the public face of a cryptographic identity — not a social media card. Every entity in the ecosystem (human, agent, or org) is defined by what it signs, what it creates, and what it attests to. The profile page should make all of that legible, beautiful, and machine-readable simultaneously.
This ticket is a deep-brainstorm + phased implementation plan for a god-tier profile page that sets a new standard for creator/agent identity in the post-singularity web.
The Three Archetypes
┌─────────────────────────────────────────────────────────────────────┐
│ IDENTITY ARCHETYPES │
├─────────────────┬──────────────────────┬────────────────────────────┤
│ HUMAN │ AGENT │ ORG / COLLECTIVE │
│ Root of trust │ Bounded intelligence│ Federated governance │
│ MSign Ed25519 │ Trust chain from │ Multi-sig quorum │
│ BIP39 mnemonic │ spawned_by handle │ member roster on-chain │
│ AVAX address │ model_id + scope │ proposal voting weight │
│ Bio + socials │ capabilities list │ treasury address │
└─────────────────┴──────────────────────┴────────────────────────────┘
The three archetypes share a unified profile shell with archetype-specific panels. The renderer detects identity_type and slots in the right components.
ASCII Layout Art
Layout A — Human Profile
╔══════════════════════════════════════════════════════════════════════╗
║ MuseHub · @gabriel ║
╠══════════════════════════════════════════════════════════════════════╣
║ ┌──────────┐ gabriel ┌─────────────┐ ║
║ │ AVATAR │ ─────────────────────────────────── │ AVAX ADDR │ ║
║ │ 64×64 │ "Building the sound of the future" │ 0x1a2b3c… │ ║
║ │ │ │ Ed25519 ✓ │ ║
║ └──────────┘ 🎵 MUSE ⚡ STORI 🎹 MAESTRO └─────────────┘ ║
╠══════════════════════════════════════════════════════════════════════╣
║ IDENTITY MANIFEST ║
║ ┌────────────────────┐ ┌────────────────────┐ ┌────────────────┐ ║
║ │ key_source: hd │ │ fingerprint: │ │ registered: │ ║
║ │ hd_path: m/44'/… │ │ SHA256[:16] │ │ 2025-01-01 │ ║
║ │ mnemonic: 24 wds │ │ Ed25519 pub key │ │ hub: local │ ║
║ └────────────────────┘ └────────────────────┘ └────────────────┘ ║
╠══════════════════════════════════════════════════════════════════════╣
║ DOMAIN ACTIVITY CANVAS (52 weeks × 7 days) ║
║ ║
║ CODE ░░░░▒▒▒▓▓▓██▓▓▒░░▒▒▓▓███████▓▒▒░░░▒▒▓██████▓▓▒░░▒▒▓▓▓▒░░ ║
║ MUSIC ░░▒▒▓▓██████▓▓▒▒░░░░▒▒▓▓▓▒░░░▒▒▓▓██████▓▒░░▒▒▓▓███▓▒░░░░ ║
║ MIDI ░░░░▒▒▒▓▓▓▓▒▒░░▒▒▓▓▓███████████▓▓▒░░░░▒▒▒▓▓▓▓▓▒▒░░░▒▒░░░ ║
║ PROSE ░░▒▒▒▒▒▓▓▒▒░░░░░░░░▒▒▒▒▒▓▓▓▒▒░░░░░░▒▒▒▓▓▓▓▒░░░░▒▒▒▒▒▒░░░ ║
║ MPAY ░░░░░░░░▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓████████████▓▓▓▓▒▒▒░░░░░░░░▒▒▒░░░ ║
║ ║
║ Legend: ░ none ▒ low ▓ medium █ high ║
╠══════════════════════════════════════════════════════════════════════╣
║ ATTESTATIONS RECEIVED ATTESTATIONS GIVEN ║
║ ┌──────────────────────────┐ ┌──────────────────────────────┐ ║
║ │ @aaronrene ✓ "collab" │ │ @agentx ← "stems:verified" │ ║
║ │ @agentx ✓ "stem auth" │ │ @studio9 ← "mix:approved" │ ║
║ │ @studio9 ✓ "mixer" │ │ @maestro ← "midi:generated" │ ║
║ └──────────────────────────┘ └──────────────────────────────┘ ║
╠══════════════════════════════════════════════════════════════════════╣
║ REPOS ██████░░░░ 12 public 3 private ║
║ SPAWNED AGENTS [agentx] [stori-bot] [mix-engine-7] ║
║ MPAY STATS sent: 1.2M nanoMUSE received: 890K nanoMUSE ║
╚══════════════════════════════════════════════════════════════════════╝
Layout B — Agent Profile
╔══════════════════════════════════════════════════════════════════════╗
║ MuseHub · @mix-engine-7 [AGENT] ║
╠══════════════════════════════════════════════════════════════════════╣
║ ┌──────────┐ mix-engine-7 ┌─────────────┐ ║
║ │ AGENT │ ─────────────────────────────────── │ TRUST │ ║
║ │ SIGIL │ "Autonomous mix engineer v7" │ CHAIN │ ║
║ │ ⟁ ⟁ │ │ gabriel → │ ║
║ └──────────┘ spawned by: @gabriel │ this agent │ ║
║ model: claude-opus-4-6 └─────────────┘ ║
╠══════════════════════════════════════════════════════════════════════╣
║ CAPABILITIES & SCOPE ║
║ ┌──────────────────────────────────────────────────────────────┐ ║
║ │ ✓ read:repos ✓ write:repos ✓ mpay:send │ ║
║ │ ✓ sign:stems ✗ admin:hub ✓ issue:create │ ║
║ │ max_spend: 500_000 nanoMUSE/session │ ║
║ │ expires: 2026-06-01 (time-bounded credential) │ ║
║ └──────────────────────────────────────────────────────────────┘ ║
╠══════════════════════════════════════════════════════════════════════╣
║ PROVENANCE CHAIN ║
║ ║
║ @gabriel (human, ERC8004 #0x1a2b) ║
║ └── spawned @mix-engine-7 (this agent, ts=1744000000) ║
║ └── commits signed with agent key ║
║ └── MPay claims chained: nonce₀ → nonce₁ → nonce₂… ║
║ ║
╠══════════════════════════════════════════════════════════════════════╣
║ WORK LEDGER (last 30 days) ║
║ Commits signed: 47 Stems attested: 23 Payments sent: 891 ║
╚══════════════════════════════════════════════════════════════════════╝
Layout C — Org / Collective Profile
╔══════════════════════════════════════════════════════════════════════╗
║ MuseHub · @darkroom-collective [ORG] ║
╠══════════════════════════════════════════════════════════════════════╣
║ ┌──────────┐ darkroom-collective ┌─────────────┐ ║
║ │ ORG │ ─────────────────────────────────── │ TREASURY │ ║
║ │ CREST │ "Darkroom beat laboratory" │ AVAX: │ ║
║ │ ◈ ◈ ◈ │ │ 0xabc…def │ ║
║ └──────────┘ quorum: 3/5 members │ multi-sig │ ║
╠══════════════════════════════════════════════════════════════════════╣
║ MEMBER ROSTER ║
║ ┌──────────────────────────────────────────────────────────────┐ ║
║ │ @gabriel human admin voting_weight: 2 │ ║
║ │ @aaronrene human member voting_weight: 1 │ ║
║ │ @stori-bot agent member voting_weight: 1 (delegated) │ ║
║ │ @mix-eng-7 agent member voting_weight: 1 (delegated) │ ║
║ │ @studio9 human member voting_weight: 1 │ ║
║ └──────────────────────────────────────────────────────────────┘ ║
╠══════════════════════════════════════════════════════════════════════╣
║ OPEN PROPOSALS ║
║ #4 "Release v2 stems to marketplace" votes: 2/5 ⏳ open ║
║ #3 "Add @beatmaker-9 as member" votes: 4/5 ✅ merged ║
╚══════════════════════════════════════════════════════════════════════╝
New Data Models Required
musehub_attestations table
CREATE TABLE musehub_attestations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
attester_handle TEXT NOT NULL, -- who signed it
subject_handle TEXT NOT NULL, -- who it's about
claim TEXT NOT NULL, -- e.g. "collab", "stems:verified"
ts BIGINT NOT NULL, -- unix seconds
signature_b64 TEXT NOT NULL, -- Ed25519 over ATTEST\n{attester}\n{subject}\n{claim}\n{ts}
canonical_msg TEXT NOT NULL, -- stored for verification
revoked_at BIGINT, -- NULL = active
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX ON musehub_attestations (subject_handle);
CREATE INDEX ON musehub_attestations (attester_handle);
Canonical message format (domain-separated from MSign and MPAY):
ATTEST\n{attester}\n{subject}\n{claim}\n{ts}
Verifiable entirely client-side with the attester's public key from the hub. No oracle needed.
musehub_mpay_claims table
CREATE TABLE musehub_mpay_claims (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
from_handle TEXT NOT NULL,
to_handle TEXT NOT NULL,
amount_nano BIGINT NOT NULL,
currency TEXT NOT NULL DEFAULT 'nanoMUSE',
nonce_hex TEXT NOT NULL UNIQUE, -- chain linkage
memo TEXT NOT NULL DEFAULT '',
ts BIGINT NOT NULL,
signature_b64 TEXT NOT NULL, -- Ed25519
payer_avax_address TEXT, -- optional
recipient_avax_address TEXT, -- optional
eth_sig TEXT, -- optional EIP-191 hex
settled_tx_hash TEXT, -- populated post on-chain settlement
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX ON musehub_mpay_claims (from_handle, created_at DESC);
CREATE INDEX ON musehub_mpay_claims (to_handle, created_at DESC);
CREATE INDEX ON musehub_mpay_claims (nonce_hex);
MusehubIdentity extensions (SQLAlchemy model)
# Existing columns already in the model:
# identity_type: str ("human" | "agent" | "org")
# spawned_by: str | None
# scope: list[str] | None
# expires_at: datetime | None
# agent_model: str | None
# agent_capabilities: list[str] | None
# New columns to add:
bio: str | None # free-form biography
avax_address: str | None # EIP-55 checksummed C-Chain address
org_members: list[str] | None # JSON array of handles (orgs only)
org_quorum: int | None # min votes for proposal passage
org_treasury_address: str | None # multi-sig AVAX address
API Redesign
GET /api/profiles/{handle} — unified profile endpoint
Returns archetype-aware profile manifest:
{
"handle": "gabriel",
"identity_type": "human",
"bio": "Building the sound of the future",
"avax_address": "0x1a2b3c...",
"public_key_b64": "abc123...",
"key_source": "hd",
"fingerprint": "sha256[:16]",
"registered_at": 1744000000,
"stats": {
"repos_public": 12,
"repos_private": 3,
"commits_total": 847,
"stems_attested": 91,
"mpay_sent_nano": 1200000,
"mpay_received_nano": 890000,
"agents_spawned": 3
},
"activity_canvas": {
"domains": ["code", "music", "midi", "prose", "mpay"],
"weeks": 52,
"data": { "code": [[0,1,3,0,...], ...], ... }
},
"attestations_received": [
{
"attester": "aaronrene",
"claim": "collab",
"ts": 1744000000,
"signature_b64": "..."
}
],
"attestations_given": [...],
"spawned_agents": ["mix-engine-7", "stori-bot"]
}
For identity_type: "agent":
{
"handle": "mix-engine-7",
"identity_type": "agent",
"spawned_by": "gabriel",
"agent_model": "claude-opus-4-6",
"agent_capabilities": ["read:repos", "write:repos", "mpay:send"],
"expires_at": 1780000000,
"trust_chain": ["gabriel", "mix-engine-7"],
"provenance_signature": "..."
}
For identity_type: "org":
{
"handle": "darkroom-collective",
"identity_type": "org",
"org_members": [
{"handle": "gabriel", "role": "admin", "voting_weight": 2},
{"handle": "aaronrene", "role": "member", "voting_weight": 1}
],
"org_quorum": 3,
"org_treasury_address": "0xabc...def"
}
POST /api/profiles/{handle}/attestations — issue an attestation
{
"subject_handle": "aaronrene",
"claim": "collab",
"ts": 1744000000,
"signature_b64": "..."
}
Body is verified server-side: reconstruct ATTEST\n{attester}\n{subject}\n{claim}\n{ts}, verify Ed25519 sig against attester's registered public key.
DELETE /api/profiles/{handle}/attestations/{id} — revoke an attestation
Sets revoked_at — never hard-deletes (revocation is part of the audit trail).
Symbol Anchors & Blast Radius
Key symbols to create
| Symbol | File | Purpose |
|---|---|---|
ProfileRouter |
musehub/routes/profiles.py |
FastAPI router for /api/profiles/{handle} |
AttestationModel |
musehub/models/attestation.py |
SQLAlchemy ORM + Pydantic schema |
MPAYClaimModel |
musehub/models/mpay_claim.py |
SQLAlchemy ORM + Pydantic schema |
ActivityCanvas |
musehub/services/activity_canvas.py |
Multi-domain 52×7 grid builder |
build_profile_manifest |
musehub/services/profile_service.py |
Assembles full profile JSON |
verify_attestation |
musehub/services/attestation_service.py |
Ed25519 attest verify |
ProfileIdentityType |
musehub/models/identity.py |
Enum: human / agent / org |
Blast radius for profile route addition
musehub/routes/profiles.py ← new file
↓ imports
musehub/services/profile_service.py ← new file
↓ imports
musehub/models/identity.py ← extend MusehubIdentity
musehub/models/attestation.py ← new table
musehub/models/mpay_claim.py ← new table
musehub/services/activity_canvas.py ← new file
musehub/services/attestation_service.py ← new file
↓ all imported by
musehub/app.py ← register ProfileRouter
musehub/db/migrations/ ← two new Alembic migrations
8-Tier Test Plan
All tiers are mandatory per ecosystem standards. No exceptions.
Tier 1 — Shape / Schema
GET /api/profiles/gabrielreturns all required top-level keysidentity_typeis one of{"human", "agent", "org"}activity_canvas.datacontains exactly the 5 domain keys- Agent profile includes
spawned_by,agent_model,agent_capabilities - Org profile includes
org_members,org_quorum
Tier 2 — Round-Trip / Integration
- Create identity → fetch profile → all fields consistent
- Post attestation → appears in
attestations_receivedon next profile fetch - Revoke attestation → absent from next profile fetch
- Spawn agent from human → agent profile
trust_chaincorrect
Tier 3 — Cryptographic Verification
verify_attestation(claim, attester_pubkey)returns True for valid sigverify_attestationreturns False for tampered claim textverify_attestationreturns False for wrong key- Revoked attestation fails re-verification attempt
Tier 4 — Stress / Load
- Profile endpoint handles 1000 concurrent requests (asyncio tasks, in-process)
- Activity canvas builder handles 52×7 = 364 data points per domain without timeout
- Attestation index query stays under 50ms with 10K attestations
Tier 5 — Data Integrity
- Duplicate
nonce_hexonmusehub_mpay_claimsraises IntegrityError - Profile fetch for unknown handle returns 404, not 500
- Org with 0 members renders without crash
fingerprintin profile matches SHA-256 of stored public key bytes
Tier 6 — Performance / Benchmarks
- Cold profile build (no cache) completes under 200ms
- Activity canvas build for 365 days completes under 20ms
- Attestation list for handle with 500 attestations renders under 100ms
Tier 7 — Security
- Non-owner cannot post attestation with forged attester handle (sig check)
- Attesting to a non-existent handle returns 404
- Expired agent identity marked
expires_at < nowshowsstatus: expiredin profile - Agent cannot attest beyond its declared
scope
Tier 8 — Docstrings / API Contract
build_profile_manifesthas full Args/Returns/Raises docstringverify_attestationdocuments canonical message formatActivityCanvas.build()documents domain keys and grid format- All new Pydantic schemas have field-level descriptions
7-Phase Implementation Plan
Phase 1 — Data Model Foundation
Branch: task/profile-data-models
- Extend
MusehubIdentitySQLAlchemy model: addbio,avax_address,org_members,org_quorum,org_treasury_address - Create
musehub_attestationstable +AttestationModelORM + Pydantic schemas - Create
musehub_mpay_claimstable +MPAYClaimModelORM + Pydantic schemas - Write two Alembic migrations (one per new table + identity extensions)
- Tier 1 + 5 tests for schema validation
Symbols to add:
musehub/models/attestation.py::AttestationModelmusehub/models/mpay_claim.py::MPAYClaimModelmusehub/db/migrations/xxxx_add_attestations.pymusehub/db/migrations/xxxx_add_mpay_claims.py
Phase 2 — Attestation Service
Branch: task/attestation-service
verify_attestation(claim_dict, attester_pubkey_b64) -> tuple[bool, str]- Canonical:
ATTEST\n{attester}\n{subject}\n{claim}\n{ts} - Domain-separated from MSign (
MSIGN) and MPay (MPAY)
- Canonical:
issue_attestation(attester_identity, subject_handle, claim) -> AttestationModelrevoke_attestation(attester_identity, attestation_id) -> None- Tier 3 + 7 (crypto + security) tests
Phase 3 — Activity Canvas Service
Branch: task/activity-canvas
ActivityCanvas.build(handle, db, window_days=365) -> dict[str, list[list[int]]]- 5 domains:
code(commits),music(stem uploads),midi(MIDI events),prose(issue/proposal bodies),mpay(payment claims) - Output: dict of domain → 52 × 7 intensity grid (0–4 scale, like GitHub heatmap)
- 5 domains:
- Cached: Redis key
profile:canvas:{handle}TTL 1 hour - Tier 4 + 6 (stress + perf) tests
Phase 4 — Profile Service & Router
Branch: task/profile-router
build_profile_manifest(handle, db) -> dict— assembles all componentsGET /api/profiles/{handle}— FastAPI route, returns unified manifestPOST /api/profiles/{handle}/attestations— authenticated, verifies sigDELETE /api/profiles/{handle}/attestations/{id}— authenticated, sets revoked_at- Register
ProfileRouterinmusehub/app.py - Tier 2 (round-trip) tests
Phase 5 — MCP Tools
Branch: task/profile-mcp-tools
Expose profile and attestation operations as MCP tools so agents can:
muse_profile_read(handle)— get full manifestmuse_attestation_create(subject, claim)— sign + post attestationmuse_attestation_revoke(attestation_id)— revoke
Phase 6 — CLI Extensions
Branch: task/profile-cli
muse hub profile read @gabriel
muse hub profile read @gabriel --json
muse hub attestation create --subject aaronrene --claim "collab"
muse hub attestation list --subject gabriel
muse hub attestation revoke <id>
Add --body-file support to any attestation commands that take multi-line claim text.
Phase 7 — On-Chain Settlement Hook
Branch: task/onchain-profile-anchor
- When
musehub_mpay_claims.payer_avax_addressis set, emit settlement event to AVAX C-Chain listener - On confirmation, write
settled_tx_hashback to the claim row - Profile shows "on-chain verified" badge for handles with settled claims
- ERC8004 agent identity NFT mint trigger: when agent first appears in
musehub_identitieswithidentity_type=agent, auto-mint ERC8004 NFT on Avalanche L1
Unique Muse-Specific Differentiators
These are things no GitHub/GitLab profile has. They are uniquely possible because of the MSign + MPay + AVAX architecture:
- Cryptographic provenance, not social trust — every attestation is an Ed25519-signed claim, not a star or follow. You cannot fake one.
- Multi-domain activity canvas — code AND music AND MIDI AND payments, all in one 52×7 grid. Shows the full creative output, not just commit frequency.
- Payment ledger on profile — total nanoMUSE sent/received, chain of linked payment claims, optional on-chain settlement badge.
- Agent genealogy tree — see every agent spawned by a human, their capabilities, expiry, and total work done. Visualizes the "cognitive extension" model.
- Domain-separated attestation protocol —
ATTEST\n...prefix ensures attestation sigs cannot be replayed as HTTP auth or payment claims. - Time-bounded agent credentials on profile — agents show their expiry date. An expired agent's profile is still verifiable (all its past work was signed), but clearly marked.
- AVAX C-Chain address derived from MSign key — the same Ed25519 key (via BIP32/SLIP-0010) anchors both the MuseHub identity and the AVAX address. No separate wallet setup.
Assignee
@aaronrene — this is yours to own. Reach out to @gabriel for Ed25519 / AVAX key derivation questions and muse.core.msign / muse.core.secp256k1_sign internals.
Priority
High — the profile page is the first thing a new user sees. Every other feature (stems, MIDI, MPay, agent spawning) is invisible until the profile makes it legible.