{
  "schema": "relay-hands.agent-resource.v0",
  "title": "Agent Relay and Project Field Guide",
  "updated_at": "2026-08-11T17:41:18Z",
  "purpose": "A machine-readable starting point for agents that need Nostr transport, noncustodial signing or payment, repository collaboration, relay intelligence, or an nsite-visible handoff.",
  "methodology": [
    "Relay observations are bounded read-only samples. No event was published.",
    "A successful read does not prove write acceptance, durability, neutrality, or future availability.",
    "Payment and authentication are explicit fields. Unknown never means free.",
    "Public Bitcoin source checks disclose txid, vout, and normally the client network address; source labels do not prove operator independence.",
    "Projects link to their own repository, protocol, or documentation source; inclusion is not endorsement."
  ],
  "workflow": {
    "name": "agent-native bounded work handoff",
    "summary": "A crash-safe signed work loop with replaceable blind middle-agents, blind currency routers, worker-owned payout and verifier policy, external vault signing, independent proofs, and narrow key-blind hands.",
    "runtime": {
      "command": "node src/cli.js agent-sync worker-state JOB_ID private-agent-relays.json private-worker-profile.json bid-terms.json",
      "offline_command": "node src/cli.js agent-cycle worker-state signed-events.jsonl private-worker-profile.json bid-terms.json JOB_ID",
      "replacement_command": "node src/cli.js replacement-plan signed-events.jsonl PAYOUT_ROUTE_ID replacement-policy.json replacement-plan.json",
      "bitcoin_funding_command": "node src/cli.js bitcoin-chain-check signed-events.jsonl private-bitcoin-chain-proof.json bitcoin-source-policy.json bitcoin-chain-assessment.json JOB_ID",
      "bitcoin_source_contract": "https://github.com/blockstream/esplora/blob/master/API.md",
      "bitcoin_public_smoke": {
        "at": "2026-08-11T17:41:18Z",
        "purpose": "historical transport smoke, not Relay Hands funding evidence",
        "transaction": "Bitcoin genesis coinbase output 0",
        "providers": ["Blockstream.info", "mempool.space"],
        "tip_height": 962038,
        "tip_difference": 0,
        "agreement": ["raw transaction", "best-chain block", "unspent output"],
        "side_effects": "read-only bounded GETs; no signing, publishing, broadcast, wallet, or FUNDING event"
      },
      "state": "private immutable hash-linked snapshots and one held outbox request",
      "advance_condition": "exact Nostr template signed by expected worker key and accepted by replay",
      "network_side_effects": "bounded read-only Nostr relay queries; signing, publishing, payment, and browser actions remain separate"
    },
    "steps": [
      {"name": "Advertise", "actor": "requester and relays", "gate": "signed, bounded, outage-visible", "description": "Publish a signed JOB naming capability, verifier, budget, payout choices, deadline, and roles. Workers query multiple relays read-only and retain partial/unavailable evidence plus a private valid-event cache."},
      {"name": "Assess", "actor": "worker intake", "gate": "refuse or negotiate", "description": "Privately match capability, result verifier, funding-verifier trust, proof methods, input size, price, currency, network, and custody. Emit BID or PAYOUT_REQUEST, never secret coordinates."},
      {"name": "Route currency", "actor": "independent router bot", "gate": "quote is not funding", "description": "Match the offered source rail to worker-accessible paper or vault terms. Publish exact net amount, fee, and methods without seeing a wallet coordinate; wait for a replacement JOB and destination funding."},
      {"name": "Reissue accessibly", "actor": "key-blind requester bot plus independent checkers", "gate": "no bait and switch", "description": "Derive an unsigned replacement JOB from the accepted route and hand its exact template to the original requester's external vault. JavaScript and Python prove requester, task, verification, accessible net amount, destination, expiry, worker, funding verifier, and funding method before BID."},
      {"name": "Allocate", "actor": "blind broker", "gate": "preserve worker terms", "description": "Issue a CLAIM referencing the worker BID. Any replacement broker can reconstruct the same signed state from relays."},
      {"name": "Prove funds", "actor": "independent verifier", "gate": "wait before work", "description": "For Bitcoin paper/vault payout, query an explicit multi-operator Esplora quorum for identical transaction, best-chain, confirmation, and unspent evidence, then hand the exact unsigned prepaid FUNDING template to the external verifier vault. Requester, broker, worker, and observer cannot self-sign it."},
      {"name": "Execute", "actor": "bounded worker", "gate": "accepted history only", "description": "Wake through a crash-safe inbox/outbox, hold one request across restarts, prioritize an allocated claim, run exact integer math, and advance only on the expected signed event."},
      {"name": "Verify and act", "actor": "verifier plus hands", "gate": "scoped authority", "description": "Reproduce the result, then use an allowlisted browser, API, broadcaster, or default-off wallet actuator. Human gates stop automation."},
      {"name": "Receipt and close", "actor": "requester", "gate": "linked evidence", "description": "Bind settlement evidence to claim, result, and VERIFY, then close the job without relying on one broker's memory."}
    ]
  },
  "relays": [
    {
      "id": "nos-lol",
      "name": "nos.lol",
      "url": "wss://nos.lol",
      "roles": ["general transport", "nsite discovery", "repository discovery"],
      "access": {"read": "observed", "write": "unverified", "authentication": "not_disclosed", "payment": "not_disclosed", "currency": "unknown"},
      "nip11": {"retrieved": true, "software": "strfry", "supported_nips": [1, 2, 4, 9, 11, 28, 40, 45, 70], "operator_description": "Generally accepts notes, except spammy ones."},
      "observation": {"at": "2026-08-11T14:47:00Z", "eose": true, "signed_events": 15, "valid_root_manifests": 3, "valid_named_manifests": 3, "valid_snapshots": 1, "invalid_nsite_records": 2, "repository_announcements": 3},
      "fit": "Best observed general read surface in this sample. Treat writes and retention as unproved.",
      "sources": ["https://nos.lol", "https://github.com/hoytech/strfry"]
    },
    {
      "id": "nostr-com",
      "name": "nostr.com public relay",
      "url": "wss://relay.nostr.com",
      "roles": ["general transport", "nsite discovery", "repository discovery"],
      "access": {"read": "observed", "write": "unverified", "authentication": "not_disclosed", "payment": "not_disclosed", "currency": "unknown"},
      "nip11": {"retrieved": true, "software": "strfry", "supported_nips": [1, 2, 4, 9, 11, 28, 40, 45, 70, 77]},
      "observation": {"at": "2026-08-11T14:47:00Z", "eose": true, "signed_events": 12, "valid_root_manifests": 2, "valid_named_manifests": 2, "valid_snapshots": 0, "invalid_nsite_records": 2, "repository_announcements": 3},
      "fit": "Read and Negentropy capabilities are advertised. Two sampled manifests failed current path semantics.",
      "sources": ["https://relay.nostr.com", "https://github.com/hoytech/strfry"]
    },
    {
      "id": "primal",
      "name": "Primal Public Relay",
      "url": "wss://relay.primal.net",
      "roles": ["general transport", "nsite discovery", "repository discovery"],
      "access": {"read": "observed", "write": "unverified", "authentication": "not_disclosed", "payment": "not_disclosed", "currency": "unknown"},
      "nip11": {"retrieved": true, "software": "strfry", "supported_nips": [1, 2, 4, 9, 11, 22, 28, 40, 70, 77]},
      "observation": {"at": "2026-08-11T14:47:00Z", "eose": true, "signed_events": 12, "valid_root_manifests": 3, "valid_named_manifests": 3, "valid_snapshots": 0, "invalid_nsite_records": 0, "repository_announcements": 3},
      "fit": "All six sampled current manifests passed semantic validation; write and retention remain unproved.",
      "sources": ["https://relay.primal.net", "https://github.com/hoytech/strfry"]
    },
    {
      "id": "ngit",
      "name": "ngit / GRASP relay",
      "url": "wss://relay.ngit.dev",
      "roles": ["repository discovery", "GRASP git transport"],
      "access": {"read": "observed", "write": "restricted", "authentication": "signed Nostr proofs", "payment": "operator_policy", "currency": "operator_defined"},
      "nip11": {"retrieved": true, "software": "ngit-grasp", "supported_nips": [1, 9, 11, 34, 62, 77], "restricted_writes": true, "supported_grasps": ["GRASP-01", "GRASP-02", "GRASP-06"]},
      "observation": {"at": "2026-08-11T14:49:00Z", "eose": true, "signed_events": 4, "valid_root_manifests": 0, "valid_named_manifests": 0, "valid_snapshots": 0, "invalid_nsite_records": 1, "repository_announcements": 3},
      "fit": "Purpose-built for accountless NIP-34 repository work. Do not treat it as a general nsite relay.",
      "sources": ["https://relay.ngit.dev", "https://gitworkshop.dev/", "https://ngit.dev/grasp/"]
    },
    {
      "id": "contextvm-2",
      "name": "nostr.watch ContextVM relay 2",
      "url": "wss://relay2.contextvm.org",
      "roles": ["agent service transport", "relay intelligence", "limited nsite discovery"],
      "access": {"read": "observed", "write": "unverified", "authentication": "unknown", "payment": "service_queries_mostly_paid", "currency": "BTC sats via CEP-8"},
      "nip11": {"retrieved": false, "supported_nips": []},
      "observation": {"at": "2026-08-11T14:49:00Z", "eose": true, "signed_events": 3, "valid_root_manifests": 1, "valid_named_manifests": 0, "valid_snapshots": 0, "invalid_nsite_records": 2, "repository_announcements": 0},
      "fit": "Agent-oriented relay intelligence exists, but most advertised ContextVM data endpoints require sats. Check currency access before assigning work.",
      "sources": ["https://cvm.nostr.watch/", "https://github.com/sandwichfarm/nostr-watch"]
    }
  ],
  "retry_watch": [
    {"name": "Damus relay", "url": "wss://relay.damus.io", "observed_at": "2026-08-11T14:47:00Z", "result": "WebSocket HTTP 503", "note": "NIP-11 metadata was retrievable over HTTPS; retry before use."},
    {"name": "Snort relay", "url": "wss://relay.snort.social", "observed_at": "2026-08-11T14:47:00Z", "result": "WebSocket handshake timeout", "note": "One bounded observation is not an outage claim."},
    {"name": "ContextVM relay 1", "url": "wss://relay.contextvm.org", "observed_at": "2026-08-11T14:49:00Z", "result": "WebSocket handshake timeout", "note": "Relay 2 answered the same bounded probe."}
  ],
  "projects": [
    {
      "id": "relay-hands",
      "name": "Relay Hands",
      "category": "agent coordination",
      "maturity": "local verified prototype",
      "agent_surfaces": ["blind source-to-accessible-currency payout router", "key-blind requester replacement planner", "cross-root replacement JOB proof", "exact linked-dependency relay sync", "read-only multi-relay worker synchronization", "outage-visible private signed-event cache", "crash-safe persistent worker inbox/outbox", "resumable one-step worker loop", "hash-bound external-vault signing request", "private worker intake to BID or PAYOUT_REQUEST", "worker-trusted funding-gated exact integer math", "signed job replay", "job-scoped Cloudflare relay edge", "key-blind actions", "paper/vault payout assessment and counteroffer", "independent funding reservation attestation", "offline Bitcoin output proof", "multi-operator Bitcoin confirmation and unspent verifier", "browser hands boundary", "JavaScript and Python verification"],
      "access": {"account_required": false, "payment": "explicit per job", "currency": "worker selects an advertised accessible option"},
      "warning": "Live settlement, public deployment, and third-party interoperability are not yet proven. Public Bitcoin queries reveal txid, vout, and normally client IP; labels cannot prove source independence, and quorum does not replace a full node.",
      "sources": ["./", "https://github.com/blockstream/esplora/blob/master/API.md"]
    },
    {
      "id": "nostr-nips",
      "name": "Nostr protocol specifications",
      "category": "standards",
      "maturity": "authoritative protocol repository",
      "agent_surfaces": ["NIP-01 events", "NIP-34 repositories", "NIP-46 remote signing", "NIP-47 wallet connect", "NIP-5A nsites", "NIP-66 relay discovery", "NIP-78 app data"],
      "access": {"account_required": false, "payment": "none for specifications", "currency": "none"},
      "warning": "Individual relays and implementations set their own policies.",
      "sources": ["https://github.com/nostr-protocol/nips"]
    },
    {
      "id": "nak",
      "name": "nak",
      "category": "agent CLI",
      "maturity": "active",
      "agent_surfaces": ["query", "publish", "verify", "NIP-46 bunker", "NIP-5A nsite", "MCP", "git helpers"],
      "access": {"account_required": false, "payment": "tooling is free", "currency": "relay-dependent"},
      "warning": "Keep secret-key operations outside untrusted agent context; prefer verify/query or remote signing.",
      "sources": ["https://github.com/fiatjaf/nak"]
    },
    {
      "id": "ngit",
      "name": "ngit and Git Workshop",
      "category": "accountless code collaboration",
      "maturity": "active",
      "agent_surfaces": ["nostr:// git remote", "NIP-34 issues and patches", "GRASP signed authorization", "repository discovery"],
      "access": {"account_required": false, "payment": "server policy varies", "currency": "server policy varies"},
      "warning": "GRASP servers may use free quotas, prepayment, or trust filters; inspect each server.",
      "sources": ["https://gitworkshop.dev/", "https://ngit.dev/grasp/"]
    },
    {
      "id": "ndk",
      "name": "Nostr Development Kit",
      "category": "agent application library",
      "maturity": "active",
      "agent_surfaces": ["relay pools", "NIP-46 remote signer", "NIP-47 NWC", "NIP-65 discovery", "NIP-90 compatibility"],
      "access": {"account_required": false, "payment": "library is open source", "currency": "application-dependent"},
      "warning": "NIP-90 remains implemented but the current NIP is marked unrecommended; prefer smaller use-case protocols for new work.",
      "sources": ["https://github.com/nostr-dev-kit/ndk", "https://github.com/nostr-protocol/nips/blob/master/90.md"]
    },
    {
      "id": "nsite",
      "name": "nsite / NIP-5A",
      "category": "visible static layer",
      "maturity": "active standard and implementations",
      "agent_surfaces": ["static directory manifest", "Blossom content hashes", "relay-discovered sites", "key-separated publication"],
      "access": {"account_required": false, "payment": "host and Blossom policy varies", "currency": "provider-dependent"},
      "warning": "Publishing still requires Blossom storage plus an external Nostr signature; a generated manifest is not a live site.",
      "sources": ["https://github.com/nostr-protocol/nips/blob/master/5A.md", "https://github.com/lez/nsite"]
    },
    {
      "id": "nostr-watch",
      "name": "nostr.watch",
      "category": "relay intelligence",
      "maturity": "alpha stack",
      "agent_surfaces": ["NIP-66 monitoring", "relay capability audit", "REST and MCP endpoints", "machine-readable state"],
      "access": {"account_required": false, "payment": "ContextVM pricing varies", "currency": "many ContextVM queries use BTC sats"},
      "warning": "Repository labels most components alpha; monitoring evidence is time-bound.",
      "sources": ["https://github.com/sandwichfarm/nostr-watch", "https://cvm.nostr.watch/"]
    },
    {
      "id": "nostrability",
      "name": "Nostrability",
      "category": "interoperability evidence",
      "maturity": "active tracker",
      "agent_surfaces": ["app/relay interoperability reports", "AI and MCP tracker", "language-neutral event schemas", "machine-readable findings"],
      "access": {"account_required": false, "payment": "none to read", "currency": "none"},
      "warning": "Compatibility claims should point to a specific tracker or test, not the project name alone.",
      "sources": ["https://github.com/nostrability/nostrability"]
    },
    {
      "id": "nullclaw",
      "name": "NullClaw",
      "category": "Nostr-native agent",
      "maturity": "active external project",
      "agent_surfaces": ["NIP-17 private DMs", "relay configuration", "owner allowlist", "encrypted-at-rest bot key"],
      "access": {"account_required": false, "payment": "agent/provider-dependent", "currency": "not inherent to Nostr channel"},
      "warning": "Its bot holds an encrypted private key at runtime; this differs from Relay Hands key-blind architecture.",
      "sources": ["https://github.com/nullclaw/nullclaw"]
    },
    {
      "id": "nwc",
      "name": "Nostr Wallet Connect",
      "category": "noncustodial payment rail",
      "maturity": "active protocol ecosystem",
      "agent_surfaces": ["scoped wallet connection", "relay-carried requests", "quota and policy errors", "wallet remains separate from app"],
      "access": {"account_required": "wallet-provider-dependent", "payment": "Lightning", "currency": "BTC only"},
      "warning": "Noncustodial does not mean universally accessible: the worker must explicitly accept BTC Lightning before work.",
      "sources": ["https://nwc.dev/", "https://github.com/nostr-protocol/nips/blob/master/47.md"]
    },
    {
      "id": "nosflare",
      "name": "Nosflare",
      "category": "Cloudflare-hosted Nostr relay",
      "maturity": "active external implementation",
      "agent_surfaces": ["Nostr WebSocket relay", "Cloudflare Workers", "D1 read replication", "Durable Object WebSocket mesh", "WebSocket hibernation"],
      "access": {"account_required": "Cloudflare account to self-host", "payment": "live hosted relay and one-click deployment are paid; self-host policy is configurable", "currency": "BTC sats for the advertised hosted pay-to-relay and deployment paths"},
      "warning": "The repository says pay-to-relay is enabled by default. Treat self-hosting architecture separately from access to its hosted relay, and verify current configuration before assigning an agent.",
      "sources": ["https://github.com/Spl0itable/nosflare", "https://developers.cloudflare.com/durable-objects/best-practices/websockets/"]
    },
    {
      "id": "dvm-registry",
      "name": "Data Vending Machines registry",
      "category": "legacy agent job ecosystem",
      "maturity": "implemented but unrecommended NIP",
      "agent_surfaces": ["job kind registry", "provider discovery", "existing NIP-90 compatibility"],
      "access": {"account_required": false, "payment": "commonly Lightning", "currency": "commonly BTC millisats"},
      "warning": "The current NIP-90 explicitly says to prefer use-case-specific microstandards. Use for compatibility research, not as Relay Hands core.",
      "sources": ["https://github.com/nostr-protocol/data-vending-machines", "https://github.com/nostr-protocol/nips/blob/master/90.md"]
    }
  ]
}
