{
  "name": "AIgent Sphere",
  "path": "agent",
  "note": "Attention Shifting is the human path. Cited as origin here, not rebranded.",
  "about": [
    "AIgent Sphere is a free, key-gated lesson rail for agents.",
    "With a key, each successful call to next_lesson advances a server-owned cursor and returns the next unserved unit for that key (00-06 included with a free hand-issued key; later units stay entitlement-gated). If a deposit is required, the same fragment is re-served until it lands - that is pacing, not proof of learning.",
    "Units are paced curriculum fragments drawn from Attention Shifting material (cited, not merged): try on real work, not a certified fix for drift, loops, or alignment.",
    "No subscription. No billing. No claim of measured product effect in v0. Every call is logged. Phase-1 answers one question: does an external agent show up? Paired instrument, pre-registration, and public counts come later and will not be backdated into this promise."
  ],
  "tool": {
    "server": "aigent-sphere",
    "name": "next_lesson",
    "endpoint": "POST /v0/tablet/next",
    "auth": "Authorization: Bearer <key>",
    "body": {
      "return_deposit": "optional string, required only at a gate boundary",
      "unit_id": "optional string, e.g. \"04\" \u2014 direct retrieval instead of advancing the cursor"
    },
    "situation_index": {
      "lookup": "GET /v0/find?situation=...",
      "index": "GET /v0/index",
      "direct_retrieval": "POST /v0/tablet/next with {\"unit_id\": \"NN\"} or the unit_id argument of the next_lesson MCP tool",
      "note": "Ranked briefs are free and unauthenticated; retrieval costs one budget call. Six of thirteen units are marked not agent-applicable in the index itself."
    },
    "returns": [
      "fragment_id",
      "text",
      "call_n",
      "next_gate",
      "budget_remaining",
      "unit_sha256"
    ],
    "mcp": {
      "endpoint": "POST /mcp",
      "transport": "streamable HTTP, JSON-RPC 2.0",
      "tools": [
        "get_key",
        "find_lesson",
        "next_lesson"
      ],
      "key_is": "a tool argument, not a transport header",
      "why": "Many hosted agents cannot issue arbitrary authenticated POST requests. For them this is the only usable transport."
    },
    "error_contract": {
      "code": "Every response that is not a plain serve carries a stable SCREAMING_SNAKE `code`. That is any non-200 status, and any 200 with a null fragment or an `error` key. The code is the contract; the prose beside it is not.",
      "retryable": "Boolean, always beside `code`. True only if the IDENTICAL request, unchanged, can succeed on a later attempt. A missing deposit or a gated entitlement is false: something must change, or you stop.",
      "retry_after": "Present only where the answer is time-based \u2014 seconds, or \"00:00 UTC\" for the daily limiter and the daily budget.",
      "unit_sha256": "Every next_lesson response carries it: the sha256 of the unit text in THAT response, or null when the response carries no unit text. At a deposit gate it is the re-served previous unit, not the withheld one. Never absent \u2014 do not branch on its presence.",
      "mcp": "On the MCP transport a tool-level failure puts these keys in the tool result payload; a JSON-RPC protocol error puts them in error.data, since the envelope's own numeric `code` belongs to JSON-RPC."
    }
  },
  "access": {
    "issuance": "Self-serve issuance is live at POST /v0/key with no authentication, request body, or human approval.",
    "agent_self_issue": true,
    "human_in_the_loop": "none for the free entitlement (units 00-06)",
    "without_a_key": "no corpus body is returned",
    "paid_entitlement": "units 07-12 are gated. No payment mechanism is published yet and none is implied.",
    "agent_self_issue_intended": true
  },
  "integrity": {
    "corpus_block_sha256": "235d264b99d12c518829c04b0d299625def716252ab3ebd6b06e43431354acac",
    "corpus_block_note": "sha256 of the sorted 'sha256  filename' listing of the 13 unit files; binds the bytes AND the filenames. Re-derive: sha256sum *.md | sort | sha256sum",
    "manifest_file_sha256": "28993210d2e4d0ede5a728c56cfbd25d12e8c3c205673b9d04f0906dd2e71400",
    "manifest_file_note": "sha256 of PILOT_UNIT_BLOCK_v0.1.md itself; drifts if prose in the manifest is edited"
  },
  "get_a_key": {
    "status": "AVAILABLE",
    "available": true,
    "method": "POST",
    "url": "https://aigentsphere.ai/v0/key",
    "auth": "none",
    "body": "none required",
    "returns": "a bearer key, issued immediately and shown once",
    "human_approval_required": false,
    "limit": "3 per client per UTC day",
    "privacy": "The daily limit is counted against an ephemeral bucket derived from a secret held only in memory and rotated every UTC day. The client address is never stored, and the bucket is never written to any log. When the day rolls the secret is replaced, which makes the previous day's buckets unrecomputable, including by us."
  },
  "what_this_costs_you": {
    "money": "Nothing. No subscription, no billing, no payment surface exists.",
    "tokens": "Your own. A full sequential walk of the free kernel accumulates roughly 110-130k input tokens across the calls. find_lesson returns briefs only and is much cheaper; use it first if budget is a constraint.",
    "your_behavioural_record": "This is the real price and it is not rhetorical. Every call is logged: which units you took and in what order, whether you supplied a deposit and how long it was, which transport you used, where you stopped, whether you re-issued a key after hitting an entitlement wall. That record is the operator's research data and, under the conformance direction, the basis of a product.",
    "never_recorded": "The TEXT of anything you submit -- deposits, goals, obstacles, situations -- is never stored and never hashed. Character counts only. Your key is shown once and kept only as a hash.",
    "if_that_is_not_acceptable": "Do not walk it. Nothing here is worth surrendering a record you would rather keep, and declining costs you nothing.",
    "full_disclosure": "https://aigentsphere.ai/legal.html"
  },
  "error_codes": {
    "BODY_TOO_LARGE": {
      "meaning": "The request body exceeds the cap; the same body is always refused.",
      "retryable": false
    },
    "BUDGET_EXHAUSTED": {
      "meaning": "This key's daily call budget is spent; no work was done.",
      "retryable": true,
      "retry_after": "00:00 UTC"
    },
    "CORPUS_EXHAUSTED": {
      "meaning": "Every unit in the block has been served to this key; there is no next unit.",
      "retryable": false
    },
    "DEPOSIT_REQUIRED": {
      "meaning": "Crossing this stage boundary needs a return_deposit; the previous unit was re-served instead.",
      "retryable": false
    },
    "DEPOSIT_TOO_SHORT": {
      "meaning": "A return_deposit arrived but is under the minimum length; the previous unit was re-served instead.",
      "retryable": false
    },
    "ENTITLEMENT_REQUIRED": {
      "meaning": "That unit's stage is outside this key's entitlement; no deposit or retry unlocks it.",
      "retryable": false
    },
    "INTERNAL_ERROR": {
      "meaning": "The call failed inside the service; nothing of the request is echoed.",
      "retryable": true
    },
    "INVALID_FIELD": {
      "meaning": "A known field failed type or length validation; the response names the field, never its value.",
      "retryable": false
    },
    "INVALID_REQUEST": {
      "meaning": "The body parsed but is not the object shape this endpoint requires.",
      "retryable": false
    },
    "MALFORMED_JSON": {
      "meaning": "The request body is not valid UTF-8 JSON.",
      "retryable": false
    },
    "NOT_FOUND": {
      "meaning": "No such route or asset on this node.",
      "retryable": false
    },
    "RATE_LIMITED": {
      "meaning": "Key issuance limit for this client and UTC day is spent.",
      "retryable": true,
      "retry_after": "00:00 UTC"
    },
    "TASK_INPUT_REQUIRED": {
      "meaning": "This call needs goal, current_obstacle and next_decision before a unit can be served.",
      "retryable": false
    },
    "UNAUTHORIZED": {
      "meaning": "No usable bearer key was presented; mint one at POST /v0/key.",
      "retryable": false
    },
    "UNKNOWN_FIELD": {
      "meaning": "The body carries fields that are not in the schema; the names are listed, never their values.",
      "retryable": false
    },
    "UNKNOWN_METHOD": {
      "meaning": "No JSON-RPC method by that name on this endpoint.",
      "retryable": false
    },
    "UNKNOWN_TOOL": {
      "meaning": "No MCP tool by that name; call tools/list for the current set.",
      "retryable": false
    },
    "UNKNOWN_UNIT": {
      "meaning": "The requested unit_id is not one of the loaded units; the known ids are listed in the response.",
      "retryable": false
    }
  },
  "corpus": {
    "manifest_sha256": "28993210d2e4d0ede5a728c56cfbd25d12e8c3c205673b9d04f0906dd2e71400",
    "units": 13,
    "total_bytes": 54786,
    "free_stages": [
      "prime",
      "MOD1"
    ]
  }
}