Coordinator API

The CoreTex coordinator surface is mounted at /coretex/*. The miner-facing surface is intentionally small: one read for the current work packet, one write to submit, one read for non-secret state context. Artifact endpoints round out the verifier surface.

Miner endpoints

Method Path Purpose
GET /coretex/challenge Current patch-work packet for a miner
POST /coretex/submit Submit a candidate patch; coordinator validates, evaluates, and returns a signed receipt or rejection
GET /coretex/status Non-secret live CoreTex state context (epoch, state root, bundle hash, policy)

GET /coretex/challenge returns a singular dynamic work packet (no challenge-book listing):

{
  "lane": "coretex",
  "challengeId": "0x...",
  "epochId": 123,
  "expiresAt": 1760000000,
  "parentStateRoot": "0x...",
  "coreVersionHash": "0x...",
  "bundleHash": "0x...",
  "substrate": {
    "encoding": "coretex-packed-substrate-v1",
    "bytes": "0x..."
  }
}

If the substrate is served by reference the substrate object carries uri (e.g. /coretex/substrate/0x...) instead of inline bytes. coreVersionHash is required so miners not running the full CoreTex client can bind to the correct static patch schema; bundleHash and epochId let a miner pin the active bundle and epoch without a second round-trip. The challenge payload only carries dynamic work context; static patch construction rules live in the miner skill/static docs.

POST /coretex/submit request (high level):

{
  "challengeId": "0x...",
  "patch": { "...": "..." }
}

Accepted response:

{
  "status": "accepted",
  "receipt": { "...": "signed receipt payload..." },
  "patchHash": "0x...",
  "evalReportHash": "0x..."
}

Rejected response:

{
  "status": "rejected",
  "code": "rejected",
  "patchHash": "0x..."
}

Rejection details stay non-oracle: no hidden-pack scoring hints, no per-query rankings, no retrieved-document lists while those artifacts are active.

GET /coretex/status returns:

{
  "lane": "coretex",
  "epochId": 123,
  "stateRoot": "0x...",
  "statusVersion": 4187,
  "wordCount": 1024,
  "transitionCount": 12,
  "rulesVersion": 192,
  "workPolicyHash": "0x...",
  "corpusRoot": "0x...",
  "coreVersionHash": "0x...",
  "bundleHash": "0x...",
  "minImprovementPpm": 2500,
  "evalSeedCommit": "0x...",
  "substrate": { "uri": "/coretex/substrate/0x..." },
  "bundle":    { "uri": "/coretex/bundle/0x..." }
}

statusVersion is a monotonic poll token; a miner can long-poll or refetch /coretex/status and skip work whenever the version is unchanged.

Artifact and verification endpoints

Method Path Purpose
GET /coretex/substrate/:stateRoot Packed substrate bytes for a given state root
GET /coretex/bundle/:bundleHash Pinned bundle manifest by content hash
GET /coretex/bundle/by-core-version/:coreVersionHash Pinned bundle manifest by active core version (v2 default; aliases to the current bundleHash)
GET /coretex/patch/:hash Canonical patch bytes and metadata
GET /coretex/patch-received/:hash PatchReceivedNotice envelope for replay watchers (timestamp, target block, coordinator signature over the receipt commitment)
GET /coretex/eval-report/:hash Signed evaluation report; this is the verdict lookup that replaces the old /coretex/result/:patchHash polling endpoint
GET /coretex/corpus-delta/:epoch Signed corpus delta artifact for an epoch
GET /coretex/health Coordinator/service health

Rate limits are for abuse prevention only: flat per-miner ceilings plus global backpressure. CoreTex does not use credit-weighted rate limiting or reserved lanes. eval_hidden and canary records remain masked until the relevant reveal rules permit disclosure.