Hylon Admin Runbook

Operator runbook for Hylon billing and the node program, covering every tunable hylon_* config knob, per-model pricing, and the fleet ops endpoints.

Overview

Everything tunable about Hylon lives in two places, both adjustable at runtime with no redeploy:

  • credit_config rows (key/value): the free-tier allowance, warning threshold, and node point rates.
  • hylon_model_pricing rows: per-model credit rates.

All endpoints on this page require an admin JWT (Authorization: Bearer with an admin role) and are mounted under /api/v1/admin. Responses use the standard { "success": true, "data": { } } envelope.

Points before token

The node program pays points only. Nothing in the admin surface converts points to ORB or writes to the token economy, and no such conversion is enabled anywhere. Any future points conversion ships as a separate admin-gated feature that is disabled by default; until you read an explicit announcement, treat every "points to token" expectation as unsupported.


Config knobs (credit_config)

These are the hylon_* keys the code reads today, stored as plain strings in credit_config (config_key / config_value columns). A missing key falls back to the registry default, so deleting a row is safe. GET /api/v1/admin/hylon/config is authoritative: its entries array enumerates the whole registry merged over whatever rows exist, with each key's type, default, description, and bounds.

Billing

KeyDefaultSeededEffect
hylon_free_daily_tokens0100000 (migration 113)Free-tier allowance in raw tokens per user per UTC day. 0 makes Hylon paid-only. Preferred over the coarse key below.
hylon_free_daily_mtok0Coarse fallback: free allowance in millions of tokens per day. Only consulted when hylon_free_daily_tokens is absent.
hylon_low_balance_warning_credits0500 (migration 111)Credit balance below which client UIs show a low-balance warning. Display-only; never blocks requests.

Node program point awards

KeyDefaultSeededEffect
hylon_node_points_per_verify11 (migration 114)Points awarded per server-verified verify.recompute task.
hylon_node_points_per_bench55 (migration 114)Points awarded per server-verified bench.cpu task.

Economy: points→ORB bridge (default CLOSED)

KeyDefaultEffect
hylon_points_bridge_enabledfalseMaster gate for the points→ORB bridge. Points-before-token: while this is false, nothing can convert points into ORB.
hylon_points_orb_rate0ORB credited per point. Both this (> 0) and the gate above must be opened; either alone still refuses with 409 gate_closed.

Economy: earning lanes

Daily point caps by lane; a negative value means uncapped. These bound the earning rate only and never gate AI access.

KeyDefaultEffect
hylon_lane_unattested_daily_cap20Daily point cap for unattested nodes.
hylon_lane_attested_daily_cap200Daily point cap for attested nodes.
hylon_lane_full_daily_cap-1Daily point cap for attested paid-subscriber nodes (uncapped by default).
hylon_lane_paid_tenure_days30Paid-subscriber tenure in days required to reach the full lane.

Economy: Season Clearing

KeyDefaultEffect
hylon_orb_per_usd20000ORB per USD, used to turn a season's banked-revenue budget into an ORB budget (1 ORB = $0.00005).
hylon_season_max_points_orb_rate0Global ceiling on a season's settled per-point ORB rate. 0 = no cap beyond the season's own rate and its budget.

Notes:

  • Seeds only INSERT when the key is absent, so values you change are never reverted by a redeploy or container restart.
  • Rate changes take effect immediately for new requests and new task verifications; they never rewrite history.
  • A negative point rate is treated as 0 at award time.
  • Every write is validated against the registry (type + bounds), applied in one transaction (all-or-nothing), and recorded in the audit log.

Billing config endpoints

GET/api/v1/admin/hylon/config

Read every hylon_* knob (registry merged over live rows), the legacy billing shorthand, and all per-model pricing rows.

Authentication:Bearer Token
curl https://api.orbai.world/api/v1/admin/hylon/config \
  -H "Authorization: Bearer <ADMIN_JWT>"
{
  "success": true,
  "data": {
    "config": {
      "free_daily_tokens": 100000,
      "low_balance_warning_credits": 500
    },
    "entries": [
      {
        "key": "hylon_points_bridge_enabled",
        "value": "false",
        "default": "false",
        "type": "bool",
        "known": true,
        "description": "Hylon economy: master gate for the points->ORB bridge (default closed; points-before-token)"
      }
    ],
    "pricing": [
      {
        "model": "Qwen/Qwen2.5-3B-Instruct",
        "input_credits_per_mtok": 20,
        "output_credits_per_mtok": 60,
        "cached_input_credits_per_mtok": 0,
        "is_active": true
      }
    ]
  }
}

entries is the complete, self-describing knob list (sorted by key) and is what the admin UI renders. config remains for the two legacy billing fields.

PUT/api/v1/admin/hylon/config

Update config. Accepts the legacy billing fields and/or a generic set map of any hylon_* key.

ParameterTypeRequiredDescription
free_daily_tokensintegerOptionalLegacy shorthand: raw tokens per user per UTC day. 0 disables the free tier. Negative is rejected.
low_balance_warning_creditsintegerOptionalLegacy shorthand: warning threshold in credits. Negative is rejected.
setobjectOptionalGeneric map of hylon_* key to value (string, number, or bool). Each key is validated against the registry's type and bounds; one invalid entry rejects the whole request.
# Legacy shorthand: halve the free allowance
curl -X PUT https://api.orbai.world/api/v1/admin/hylon/config \
  -H "Authorization: Bearer <ADMIN_JWT>" \
  -H "Content-Type: application/json" \
  -d '{"free_daily_tokens": 50000}'

# Generic form: tune any hylon_* knob (all-or-nothing, audited)
curl -X PUT https://api.orbai.world/api/v1/admin/hylon/config \
  -H "Authorization: Bearer <ADMIN_JWT>" \
  -H "Content-Type: application/json" \
  -d '{"set": {"hylon_lane_attested_daily_cap": 300, "hylon_lane_paid_tenure_days": 45}}'

Opening the points bridge is a deliberate, two-key act

hylon_points_bridge_enabled: true alone does nothing, and hylon_points_orb_rate > 0 alone does nothing. Conversion only becomes possible when both are set. Until then every convert call returns 409 gate_closed and no ORB moves anywhere.

PUT/api/v1/admin/hylon/pricing

Create or update one model's per-token credit pricing (upsert by model name).

ParameterTypeRequiredDescription
modelstring RequiredModel identifier exactly as the gateway bills it, e.g. Qwen/Qwen2.5-3B-Instruct.
input_credits_per_mtokinteger RequiredCredits per million input tokens. Must be >= 0.
output_credits_per_mtokinteger RequiredCredits per million output tokens. Must be >= 0.
cached_input_credits_per_mtokinteger RequiredCredits per million cached input tokens. Must be >= 0.
is_activeboolean RequiredInactive models are rejected at settlement (fail-closed), not served for free.

Unpriced means rejected

Settlement fails closed on any model without an active pricing row (422 model_not_priced). Before pointing the gateway at a new model, add its pricing here first.


Node program fleet ops

GET/api/v1/admin/hylon/nodes

Fleet overview: every enrolled node with owner, tier, status, points, and reported vs verified task counts, plus queue statistics.

Authentication:Bearer Token
curl https://api.orbai.world/api/v1/admin/hylon/nodes \
  -H "Authorization: Bearer <ADMIN_JWT>"
{
  "success": true,
  "data": {
    "nodes": [
      {
        "id": 8,
        "name": "my-mac",
        "owner_user_id": 22468,
        "device_type": "desktop",
        "deployment_type": "HOME",
        "tier": "server",
        "status": "online",
        "last_seen": "2026-07-28T10:00:00Z",
        "points": 6,
        "tasks_reported": 6,
        "tasks_verified": 6,
        "contributions": {
          "tasks_completed": 6,
          "compute_units": 0,
          "inference_requests": 0
        }
      }
    ],
    "task_counts": { "queued": 4, "leased": 2, "completed": 6 },
    "queue_depth": 4,
    "total_points_awarded": 6,
    "program_status": "beta"
  }
}

Reading the fleet view:

  • status is online only when the node checked in within the last 5 minutes; disabled reflects a deactivated node record.
  • A wide gap between tasks_reported and tasks_verified on one node means its completions are failing server-side re-verification. That is the cheat signal; verified counts are the only ones that ever award points.
  • task_counts is keyed by task status: queued, leased, completed, failed, unsupported, or expired.
  • queue_depth is the number of queued tasks. The lease path self-replenishes with up to 10 verify.recompute tasks when a node finds the queue empty, so an empty queue is not an outage.
POST/api/v1/admin/hylon/nodes/enqueue

Mint a batch of queued tasks. Count is clamped to 1..500 per call.

ParameterTypeRequiredDescription
kindstringOptionalverify.recompute (default) or bench.cpu. Anything else gets 400.
countintegerOptionalHow many tasks to mint, clamped to 1..500.
# Seed 50 benchmark tasks
curl -X POST https://api.orbai.world/api/v1/admin/hylon/nodes/enqueue \
  -H "Authorization: Bearer <ADMIN_JWT>" \
  -H "Content-Type: application/json" \
  -d '{"kind": "bench.cpu", "count": 50}'

bench.cpu tasks are only created by this endpoint (the auto-top-up mints verify.recompute only), so benchmark availability is entirely an operator decision.


Season ops (Season Clearing)

A season is the accounting window contributor rewards clear against. Its budget is banked from real service revenue, so rewards behave like a dividend rather than an emission: at settle time every earner is paid pro-rata out of a budget that already exists.

The lifecycle is open → closed → settled. Points are stamped with the open season at award time; only one season may be open at a time. Settlement records what each contributor cleared but credits no ORB — crediting happens only through the separately gated points→ORB bridge, so the points-before-token rule holds end to end.

POST/api/v1/admin/hylon/seasons

Open a new season with a banked-revenue budget and a per-point rate cap. Rejected with 409 while another season is open.

Authentication:Bearer Token
ParameterTypeRequiredDescription
namestring RequiredHuman label for the season, e.g. Season 1.
banked_revenue_usdnumber RequiredBudget in USD, banked from real service revenue. Converted to ORB via hylon_orb_per_usd at settle.
points_orb_ratenumberOptionalPer-point ORB rate cap for this season. The settled rate is the minimum of this, the budget-implied rate, and hylon_season_max_points_orb_rate.
curl -X POST https://api.orbai.world/api/v1/admin/hylon/seasons \
  -H "Authorization: Bearer <ADMIN_JWT>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Season 1", "banked_revenue_usd": 5000, "points_orb_rate": 10}'
GET/api/v1/admin/hylon/seasons

List all seasons with their status, budget, and point totals.

GET/api/v1/admin/hylon/seasons/{id}

One season with its statistics (points accrued, distinct earners, settled totals).

PUT/api/v1/admin/hylon/seasons/{id}/budget

Adjust a season's banked-revenue budget and/or rate cap before settlement. 409 once the season is settled.

ParameterTypeRequiredDescription
banked_revenue_usdnumberOptionalNew USD budget.
points_orb_ratenumberOptionalNew per-point ORB rate cap.
POST/api/v1/admin/hylon/seasons/{id}/close

Close the season to new points. Awards after this stamp the next season. 409 unless the season is open.

POST/api/v1/admin/hylon/seasons/{id}/settle

Settle a closed season: compute the effective per-point rate and write one clearing row per earner. Idempotent.

# Typical end-of-season sequence
curl -X POST .../seasons/3/close  -H "Authorization: Bearer <ADMIN_JWT>"
curl -X POST .../seasons/3/settle -H "Authorization: Bearer <ADMIN_JWT>"

The settled rate is min(budget_orb / total_points, season rate cap, hylon_season_max_points_orb_rate) where budget_orb = banked_revenue_usd × hylon_orb_per_usd, so a season can never clear more value than it banked. Re-running settle is a no-op; a settled season is immutable.

Clearing is not crediting

Settlement writes clearing rows with credited: false. No ORB balance moves until an operator opens the points→ORB bridge and a user converts. This separation is deliberate: it lets the economy run honestly and be audited long before any token is paid out.


Operational notes

  • Free-tier accounting rolls up per user per UTC day; the cap check runs inside the settlement transaction, so raising or lowering the allowance mid-day applies to the next request.
  • Settlement shortfalls: usage ingest settles what the account can cover and floors at zero rather than dropping a served request. A shortfall is recorded in the usage event metadata (shortfall_credits) for reconciliation. Watch for repeated shortfalls from one account.
  • Idempotency everywhere: usage settlement is idempotent per request_id; task points are awarded at most once per task; setup codes are single use. Re-sending a request never double-charges or double-awards.
  • Credit isolation: hylon_credit_balance is a dedicated pool. No admin action on VPN wallets, ORB balances, or scan credits touches it, and vice versa.
  • Payments: a completed Stripe payment for a product='hylon' plan grants the Hylon subscription through the payment pipeline's Hylon branch. OrbVPN payment behavior is untouched by any of it.