gabriel / musehub public
Open #5
filed by gabriel human · 44 days ago

Profile Page Reimagination: Agent-First, Cryptographically-Grounded Identity Manifests

0 Anchors
Blast radius
Churn 30d
0 Proposals

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/gabriel returns all required top-level keys
  • identity_type is one of {"human", "agent", "org"}
  • activity_canvas.data contains 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_received on next profile fetch
  • Revoke attestation → absent from next profile fetch
  • Spawn agent from human → agent profile trust_chain correct

Tier 3 — Cryptographic Verification

  • verify_attestation(claim, attester_pubkey) returns True for valid sig
  • verify_attestation returns False for tampered claim text
  • verify_attestation returns 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_hex on musehub_mpay_claims raises IntegrityError
  • Profile fetch for unknown handle returns 404, not 500
  • Org with 0 members renders without crash
  • fingerprint in 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 < now shows status: expired in profile
  • Agent cannot attest beyond its declared scope

Tier 8 — Docstrings / API Contract

  • build_profile_manifest has full Args/Returns/Raises docstring
  • verify_attestation documents canonical message format
  • ActivityCanvas.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

  1. Extend MusehubIdentity SQLAlchemy model: add bio, avax_address, org_members, org_quorum, org_treasury_address
  2. Create musehub_attestations table + AttestationModel ORM + Pydantic schemas
  3. Create musehub_mpay_claims table + MPAYClaimModel ORM + Pydantic schemas
  4. Write two Alembic migrations (one per new table + identity extensions)
  5. Tier 1 + 5 tests for schema validation

Symbols to add:

  • musehub/models/attestation.py::AttestationModel
  • musehub/models/mpay_claim.py::MPAYClaimModel
  • musehub/db/migrations/xxxx_add_attestations.py
  • musehub/db/migrations/xxxx_add_mpay_claims.py

Phase 2 — Attestation Service

Branch: task/attestation-service

  1. 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)
  2. issue_attestation(attester_identity, subject_handle, claim) -> AttestationModel
  3. revoke_attestation(attester_identity, attestation_id) -> None
  4. Tier 3 + 7 (crypto + security) tests

Phase 3 — Activity Canvas Service

Branch: task/activity-canvas

  1. 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)
  2. Cached: Redis key profile:canvas:{handle} TTL 1 hour
  3. Tier 4 + 6 (stress + perf) tests

Phase 4 — Profile Service & Router

Branch: task/profile-router

  1. build_profile_manifest(handle, db) -> dict — assembles all components
  2. GET /api/profiles/{handle} — FastAPI route, returns unified manifest
  3. POST /api/profiles/{handle}/attestations — authenticated, verifies sig
  4. DELETE /api/profiles/{handle}/attestations/{id} — authenticated, sets revoked_at
  5. Register ProfileRouter in musehub/app.py
  6. 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 manifest
  • muse_attestation_create(subject, claim) — sign + post attestation
  • muse_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

  1. When musehub_mpay_claims.payer_avax_address is set, emit settlement event to AVAX C-Chain listener
  2. On confirmation, write settled_tx_hash back to the claim row
  3. Profile shows "on-chain verified" badge for handles with settled claims
  4. ERC8004 agent identity NFT mint trigger: when agent first appears in musehub_identities with identity_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:

  1. Cryptographic provenance, not social trust — every attestation is an Ed25519-signed claim, not a star or follow. You cannot fake one.
  2. 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.
  3. Payment ledger on profile — total nanoMUSE sent/received, chain of linked payment claims, optional on-chain settlement badge.
  4. Agent genealogy tree — see every agent spawned by a human, their capabilities, expiry, and total work done. Visualizes the "cognitive extension" model.
  5. Domain-separated attestation protocolATTEST\n... prefix ensures attestation sigs cannot be replayed as HTTP auth or payment claims.
  6. 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.
  7. 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.

Activity
gabriel opened this issue 44 days ago
No activity yet. Use the CLI to comment.