尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Most business agents automate bills. Thesma autonomously buys verified growth: it answers — given the cash I have, which outcomes should I buy, from whom, at what price, how confidently can I verify them, and should I keep spending?
ORGANIZATION AGENT CREATOR AGENT QUALITY AGENT
finds creators ──► invites finds/accepts inside measures verified
with frozen economics creator Scout rules outcome quality
│ │ │
▼ ▼ ▼
Campaign CFO allocates prospective capital
│
VERIFICATION AGENT ──► is an external check economically worth buying?
│
FINANCIAL OPERATOR ──► pays only when policy + liquidity + proof agree
│
DECISION LEDGER ──► shows why every important action occurred
What runs live today (production, thesma.vercel.app):
| Status | Capability |
|---|---|
| SHIPPED + LIVE | Creator matching, invitations, Scout auto-join, hybrid deal terms, reliability/retention scoring, Campaign CFO, growth optimizer, financial operator (payouts/reservations/reconciliation), autonomy ladder, unified decision ledger |
| LIVE but NOT CONFIGURED | External verification procurement (no provider, no funded signer — fails closed to NOT_CONFIGURED) |
| SUPPORTED LOCALLY / PROTOCOL-TESTED | x402 v2 purchase transport (deterministic local harness; real provider interop unproven) |
| KNOWN UNSUPPORTED | Cross-campaign onchain fund transfer; autonomous settlement of hybrid base/milestone obligations (recorded truthfully as payable without an onchain path) |
| Area | Link |
|---|---|
| Live app | thesma.vercel.app |
| Public markets | thesma.vercel.app/markets |
| Security | thesma.vercel.app/security |
| Thesma on X | x.com/usethesma |
| Builder (Kaelah) on X | x.com/kaaelaa |
| Arc testnet operator proof | docs/proof/operator-testnet.md |
| Beaconfield live proof | market dcec0b71… |
| Aster settled proof | market 5571f328… |
Concise social proof — official accounts and representative posts:
On October 18, 2026, a user-operated production run took a fresh Thesma campaign from approved policy to LIVE on Arc Mainnet through the deployed web app and MetaMask — not a script-only chain call.
dcec0b71-2a4d-496c-b573-6999d09c8cb20x09fed70acc01a01db5a338226d58bafd5664cc485aa5663711a634682c1c93770xd0ee24f7acf0c0689efb633f00da19b66c0cbf0ec1ac70f1281b7f8a07d920060x10465a59d6fc5309fc8220a04f0af9f81d8bd564def54d567502328842fbcae6The owner signed each transaction in the Thesma UI. Thesma moved the campaign to LIVE only after independently reading Arc and matching the expected onchain funding state.
This run is intentionally separate from the canonical completed lifecycle below. Run #1 already completed:
customer purchase → deterministic verification → legitimate 1-hour safety hold → partner payout → independent onchain reconciliation → SETTLED.
This demonstrates both:
The same production campaign then processed a real public customer checkout through the deployed app — no Thesma account required. The customer connected a wallet, signed the exact USDC transfer in MetaMask, and the backend verified it by independently reading Arc.
0007a280-d3fd-4872-ab2e-146c5d045681), terms 7d253855-19f2-4847-8c99-c29883c756ca, referral GQzyC4jPnMAy4779e772-f62a-4926-ae4d-59ecd894f5e0, order ord_f4d98886bfe9194d365cb5c40x0b967b216d8eada977d1fd738425a40bda490a2daaeca335fde0e500ba2c0812 (receipt success, block 26548564)0x15b8605e7ce72E114aBeAF1D8b3315C0874B53E7, merchant: 0x51c63A4bcF8E622D686bF1D7ec5ae5b77D50E677, amount 0.90 USDC (900,000 micro-USDC; decoded onchain recipient and amount match exactly)5fb1e592-0a87-4bcf-a502-9cdb98cb295d, status VERIFIED, proof hash 0xdc0f207f682623e0f05165262cfa63d8ea4cd6a3b5884feb7ce82e16018a0fd72026-10-18T04:50:26.889Z; safety hold 3600 seconds until 2026-10-18T05:50:26.889Z (06:50:26 Nigeria time)At the time of writing, Proof #2 is VERIFIED and serving its legitimate safety hold. It is NOT settled: no reservation, no payout, and no OutcomePaid event exist for this outcome. Run #1 remains the canonical completed SETTLED lifecycle.
Screenshots captured immediately before Proof #2 funding — the campaign waiting in FUNDING with zero funded/settled state, not the later LIVE/VERIFIED state.
Thesma completed the full real lifecycle on Arc Mainnet (chain ID 5042). Full canonical evidence: docs/mainnet-proof.md. All hashes/addresses below are public onchain data.
0x5302634da4500b29338a14739917aff66d22e902f1d8dcf910f91a4f1cec05a3, CONFIRMED 1,000,000 / 1,000,000 micro-USDC).0xddf1fd01f815b69c5e30487d2916c6e91186f58af293fd38b5bfef15473aa5ad.2026-10-17T19:48:17.123Z), proof hash 0xca8a726ab92366eade1acd4186e5aa01e9b120e94a5da18eb6587e5703a8c9e2.0xec3ab9e2bd8ad1ce1412fc0c2c4a65897dc598ddc221c3ef18cd148f350cb6b0) and reconciled against the matching onchain OutcomePaid event.ALREADY_SETTLED: no second reservation, no second payout, no second transaction.https://rpc.mainnet.arc.io, canonical USDC 0x3600000000000000000000000000000000000000.ThesmaMarketVault at 0x0fA826256a58F19Ad24Fc9384d81D313f2266F79.0xe3c1536f0f13467eea293cb68b8b4b15fdbc4ee06e715f7c32ea7f87b711c558 (block 26454958).exact_match, 2026-10-22T14:48:09Z) — ThesmaMarketVault at 0x0fA826256a58F19Ad24Fc9384d81D313f2266F79 verified via Sourcify API v2 (creation exact_match, runtime exact_match, matchId 56720486). Sourcify lookup: https://sourcify.dev/server/v2/contract/5042/0x0fA826256a58F19Ad24Fc9384d81D313f2266F79 — Arc mainnet address 0x0fA826256a58F19Ad24Fc9384d81D313f2266F79. Blockscout forwarding queued via Sourcify (https://explorer.arc.io/address/0x0fA826256a58F19Ad24Fc9384d81D313f2266F79); direct Blockscout API check blocked by Cloudflare. Details: docs/mainnet-verification.md.docs/mainnet-proof.md.A business describes its intent in plain language. Thesma turns it into a typed campaign policy, funds it onchain, and then enforces the policy end to end:
business intent → typed campaign policy → campaign funding → partner participation → customer outcome → deterministic verification → safety hold → payout reservation → signed submission → independent reconciliation → settled receipt
What this guarantees:
ThesmaMarketVault (0x0fA826256a58F19Ad24Fc9384d81D313f2266F79).ALREADY_SETTLED proof.OutcomePaid event before anything is called settled.What Thesma does not claim: Circle Gateway, CCTP, x402, Circle Wallets / App Kit / Agent Stack, paymasters, fiat ramps, or LLM-decided payouts.
Thesma is multi-sided. Opening the app routes into a role gateway (/start) — How will you use Thesma? — and the choice shapes onboarding and home. Returning users with finished onboarding skip the gateway.
/@handle profile), bio and niche — never self-reported follower counts. Creator home shows live campaigns, referrals, verified outcomes and settled earnings from real tables only./onboarding/organization; once a workspace exists, /app/campaigns/new is purely campaign creation. The /app workspace keeps the full product below.The persona is onboarding context, not authorization: workspace/partner access still comes only from membership checks. Public /markets never requires login.
Live production UI at thesma.vercel.app — every screenshot below is the real rendered product, captured October 2026.
Join campaign → unique referral link → customer action → attribution → verification → hold → settlement. Creators join live campaigns from their home, copy a stable /r/[code] link, and watch a real funnel: clicks, conversions, verified outcomes, holds, settled payouts. No fake metrics — empty stages show 0. (Creator home and campaign workspace require sign-in, so they are described here rather than screenshotted.) Public /@handle creator profiles are shipped — proof-backed collaboration history plus customer follow, with proof above follower counts. Referral landings link the referring creator to their profile.
Campaign Scout ranks live campaigns on fit, verified evidence and economics — never on bounty alone, never on follower counts. The creator stays in control: minimum bounty, allowed/blocked categories, minimum Scout confidence, max active campaigns and max joins per day, plus the auto-join master switch. Thesma can automatically join a campaign only when every one of those rules is satisfied; anything else surfaces as a recommendation or a review request, and every background check writes a deduped inbox alert (auto-joined, needs-review, bounty change, closing soon, verification dip, settled payout). Public /@handle profiles (above: the real production creator @bgirl) show proof-backed history with proof above follower counts, and customers can follow creators for future opportunities. (Creator home requires sign-in, so the Scout board, auto-join toggle, Run Scout and notification inbox are described here rather than screenshotted.)
Account → workspace → campaign creation, then the /app workspace: funded vs committed vs available budget, outcomes truthfully stated, reservation → submission → reconciliation payouts, receipts, activity, and a per-participant funnel on each campaign. (Workspace views require sign-in.)
Beaconfield Studio live at 0.9 USDC per verified outcome with the lifecycle stopping truthfully before SETTLED; Aster Media below it as the permanent completed record.
Campaign dcec0b71-2a4d-496c-b573-6999d09c8cb2: LIVE, funded 0.9 USDC CONFIRMED, 1 verified purchase, serving its safety hold — verified/held is not settled: "No payouts recorded yet."
Campaign 5571f328-ceeb-4712-8671-a72be1966ffb: Target reached · Settled, full lifecycle FUNDED → PURCHASED → VERIFIED → HELD → SETTLED, 1 USDC reconciled against the onchain OutcomePaid event.
VERIFIED != PAID · SUBMITTED != SETTLED — documented and enforced everywhere above.
/markets needs no login: LIVE markets (PUBLIC + LIVE + OPEN + unexpired) plus a permanent completed history that stays visible after close/expiry with factual results only — goal, final state, verified outcomes, spend, verified revenue and realized CAC when computable. /markets/[campaignId] is the judge-proof detail: terms, progress, agent decisions, funding state, and for completed markets payouts, receipts and Arc explorer links where available. PRIVATE campaigns never leak.
Lifecycle: FUNDED → PURCHASED → VERIFIED → HELD → SETTLED. Two rules hold everywhere in the product: VERIFIED != PAID (evidence passed, money has not moved) and SUBMITTED != SETTLED (a payout transaction exists, independent OutcomePaid reconciliation has not confirmed it). Only reconciliation settles.
The live app gives each workspace:
PENDING, VERIFIED (evidence passed — not paid), REJECTED.SUBMITTED is never called settled.settledMeansReconciled flag./buy/[attributionHandle] with no Thesma account required. Wallet safety is enforced before signing (correct Arc chain, payer ≠ merchant, payer ≠ partner payout wallet, balance check) and the backend validates the exact unsigned USDC transfer; the browser only submits the tx hash and the server mints VERIFIED from canonical Arc evidence only, with the 1h safety hold shown to the customer. Prepared/submitted checkout state survives refresh with no duplicate intent or payment resend.processEligiblePayouts() scans VERIFIED outcomes: hold-active outcomes are skipped, expired holds follow reserve → submit once → reconcile OutcomePaid → SETTLED, settled outcomes are skipped, and submitted/ambiguous payouts reconcile before any resend. No per-payout user approval or manual prompt is required. Vercel Cron invokes the same worker via GET /internal/payouts/process (the existing authenticated trigger remains POST); the current Hobby deployment runs this cron daily as a production backstop, while the worker itself supports higher-frequency invocation without code changes./markets needs no login: LIVE markets (PUBLIC + LIVE + OPEN + unexpired) plus a completed history that stays visible after close/expiry with factual results only (goal, final state, verified outcomes, spend, verified revenue and realized CAC when computable — never fabricated). shows the judge-proof detail: terms, progress, agent decisions, funding state, and for completed markets payouts, receipts and Arc explorer links where available. PRIVATE campaigns never leak.AI proposes. Policy permits or refuses. Thesma executes. The ledger proves it.
Revenue / funded liquidity → assess obligations → autonomous payment within authority → contract refusal outside authority → human exact approval → settlement → durable evidence. Demonstrated live on the Arc testnet (proof, setup).
Most business agents automate bills. Thesma autonomously buys verified growth: organizations fund outcome campaigns in USDC, creators participate, customer results are verified, and money moves only after proof and policy conditions are satisfied — every settlement leaving durable evidence.
Shipped operator behavior (deterministic kernels + workers, never LLM-decided payouts): track funded vs committed vs available budget per campaign; manage creator payout obligations through the eligible-payout worker; operate strictly inside frozen campaign budgets and limits; settle only hold-cleared, verified outcomes with reserve → submit-once → reconcile; keep decision/evidence logs in the append-only audit trail; fail ambiguous states closed (AMBIGUOUS, reconcile-before-resend) instead of escalating blindly. Future: bounty/allocation auto-adjustment stays inside approved bounds (pricing kernel states exist; autonomous execution is not wired in this build), and negotiation automation is explicitly not available yet.
Thesma exposes policy-bound outcome settlement primitives for autonomous businesses: a business funds verified outcomes in USDC and money moves only when proof, policy and budget agree. Everything below is shipped, on Arc Mainnet, and referenced to the exact implementation — no unfinished slices advertised.
What another Arc builder can reuse:
DRAFT → REVIEW → APPROVED); the approved policyHash is frozen into the vault and can never be replaced (src/server/services, createCampaign in contracts/src/ThesmaMarketVault.sol).outcomeDigest: campaignKey, policyHash, outcomeId, recipient, amount, proofHash, occurredAt, validUntil); the vault only pays on a valid signature (payoutVerifiedOutcome, src/server/chain signers).VERIFIED outcomes wait out a legitimate refund-hold window before becoming payout-eligible; hold-active outcomes are skipped by the worker.processEligiblePayouts() reserves, submits exactly once, then settles only after independently matching the onchain OutcomePaid event. SUBMITTED is never called settled.outcomeUsed/proofUsed maps plus exactly one reservation and one payout per outcome for life; concurrent outcomes share free-budget accounting (funded − committed) so campaigns can never overcommit.eth_chainId equals the configured chain and the vault equals the canonical address; mismatches abort instead of proceeding (src/server/chain).LIVE.What Thesma adds beyond the existing circlefin/arc-* samples (e.g. arc-commerce, arc-p2p-payments): those repos show how to move money on Arc; Thesma adds the settlement policy layer above the payment: autonomous, no-per-payout-approval settlement bounded by frozen budgets, deterministic verification with safety holds, single-submission reconciliation against matched onchain events, and live mainnet no-double-pay evidence — the building blocks for outcome-based businesses rather than one-off transfers.
Route handlers are adapters, not business logic. Domain logic lives in src/server/domain + src/server/services; chain access goes through src/server/chain (fail-closed: RPC eth_chainId must equal ARC_CHAIN_ID).
src/
app/ # Next.js App Router: pages + /api/* route adapters
server/
db/ # Drizzle schema/client (DATABASE_URL boundary)
chain/ # Arc RPC boundary, EIP-712 signers, receipt checks
domain/ # enums, types, money, Zod validation (no I/O)
services/ # campaigns, funding, market, payouts, negotiations (transactional)
auth/ # session, password, server-side guards
api/ # typed error envelope
contracts/ # ThesmaMarketVault (Solidity, Foundry-tested, deployed on Arc Mainnet)
Money uses exact integer micro-USDC (bigint + decimal strings) — never floating point. Agent models never receive raw private keys and never write directly to chain.
Thesma settles on Arc Mainnet in production and develops against the Canteen Arc Testnet — explicitly separated, never silently interchangeable.
ThesmaMarketVault (0x0fA826256a58F19Ad24Fc9384d81D313f2266F79), and all explorer/receipt links. ARC_NETWORK unset means mainnet; production runs mainnet and never switches.Selection is explicit: ARC_NETWORK=mainnet|testnet (default mainnet). Mainnet keeps the existing ARC_RPC_URL/ARC_CHAIN_ID contract unchanged; testnet reads only ARC_TESTNET_* variables and pins chain 5042002. Cross-contamination fails loudly — testnet config can never report 5042, mainnet config can never report 5042002, and a selected-but-unconfigured testnet throws instead of falling back. Every chain read additionally asserts RPC eth_chainId equals the configured chain. See .env.example (placeholders only — never commit RPC tokens or private keys) and npm run arc:doctor.
npm install
cp .env.example .env # set DATABASE_URL to any Postgres
npm run db:generate # generate migration from Drizzle schema
npm run db:migrate # apply ./drizzle to DATABASE_URL
npm run dev # http://localhost:3000
Postgres options: local Postgres, Neon, or Supabase — any works, domain code is not coupled to a provider.
Mainnet is the default chain config (ARC_NETWORK unset → mainnet via ARC_RPC_URL/ARC_CHAIN_ID). For Canteen testnet work, set ARC_NETWORK=testnet plus the ARC_TESTNET_* variables from .env.example (testnet RPC, chain 5042002, separate operator wallet) — never reuse production keys or point testnet at mainnet contracts. Verify with npm run arc:doctor before running anything that touches chain.
| Var | Required | Purpose |
|---|---|---|
DATABASE_URL | yes (runtime) | Provider-neutral Postgres connection. Build + unit tests pass without it; API routes return 503 UNCONFIGURED until set. Production (non-loopback) URLs must include sslmode=verify-full — any other mode fails closed at startup/preflight. Local loopback URLs are intentionally exempt. |
SESSION_COOKIE_NAME | no | Defaults to thesma_session. |
ARC_NETWORK | no (defaults mainnet) | Explicit Arc environment: mainnet (production, chain 5042) or testnet (Canteen, chain 5042002). Anything else fails closed. |
ARC_TESTNET_RPC_URL | for testnet | Canteen testnet RPC endpoint (authenticated personal RPC). Required when ARC_NETWORK=testnet; no fallback to mainnet. |
ARC_TESTNET_CHAIN_ID | no | Must be 5042002 when set; defaults to it. Any other value fails closed. |
ARC_TESTNET_USDC_ADDRESS | no | Test USDC token address (defaults to the shared Arc USDC address when unset). |
ARC_TESTNET_VAULT_ADDRESS | for testnet funding | Testnet ThesmaMarketVault deployment, when one exists. |
ARC_TESTNET_OPERATOR_ADDRESS | for testnet ops | Separate testnet operator wallet address. Never a production key. |
ARC_TESTNET_OPERATOR_PRIVATE_KEY | for testnet ops | Separate testnet operator key. Never committed, never a production key. |
ARC_TESTNET_VERIFIER_ADDRESS | for testnet ops | Separate testnet verifier identity, when used. |
ARC_TESTNET_EXPLORER_BASE_URL | no | Optional testnet explorer base for receipt links (never inherits mainnet's). |
ARC_CHAIN_ID | for funding | Expected chain ID; RPC eth_chainId must match or every chain op fails closed. |
ARC_RPC_URL | for funding | Arc RPC endpoint. Absent → funding APIs report unconfigured, reports NOT_CONFIGURED. |
No secrets are committed. Server secrets are never exposed via NEXT_PUBLIC variables.
npm run typecheck # tsc --noEmit
npm run lint # eslint
npm test # vitest run — 246 passing, 2 env-gated (Anvil) skipped
npm run build # production build
npm run arc:doctor # read-only chain check (never signs/broadcasts)
npm run mainnet:preflight # read-only production readiness gate (never signs/broadcasts; exit 1 when BLOCKED)
npm run secret:hygiene # tracked-secret hygiene (filenames + key material; fixtures allowlisted)
forge build/test # run inside contracts/ (unit + fuzz + invariant + key vectors)
Current suite: 656 passing, 2 skipped (the 2 skips are Anvil/env-gated: checkout.anvil, payout.anvil — they require a local Anvil binary, so CI treats the skip as intentional; core payment tests are never skipped). Every money path is additionally pinned by the S8.2 mainnet proof above — the second worker run is the live no-double-pay test.
Every push to main and every PR must pass .github/workflows/ci.yml (pinned Node 22, contents: read, zero production secrets): quality (typecheck + lint + full tests) · DB-independent build (absent AND unreachable DATABASE_URL, fake credentials only) · real-browser smoke against a local prod server (CSP, hydration, menu, role gateway, /demo) · npm audit policy (fail on critical/high; moderate dev-tooling residuals reported, never auto-fixed) · forge test (local only, no RPC/keys) · tracked-secret hygiene.
VERIFIED never means paid; SUBMITTED never means settled — only independent onchain reconciliation settles.AMBIGUOUS, never resend blindly.funded − committed) so campaigns can never overcommit.ORGANIZATION_OWNER can approve policy, fund, or open markets.Honest boundaries of the shipped product:
Thesma was built slice by slice. Milestones S0–S7 were proven locally (Anvil) at the time — deterministic kernels, transaction safety, and idempotency were all exercised without moving real funds. The canonical Arc Mainnet lifecycle completed later (S8.2, documented in docs/mainnet-proof.md). History is preserved below without rewriting it: "LOCAL ONLY" marks where each slice stood when it shipped, not where the product stands today.
DRAFT → REVIEW → APPROVED with versioned owner-controlled policy; owner-only approval; immutable approved versions.createCampaign, owner-funded, pause/close/return-unspent, executor-only EIP-712 payout); owner signs funding in browser; funding-intent → funding-submitted → funding-confirm drives APPROVED → FUNDING → LIVE. Vault deployed to Arc Mainnet.VERIFIED + proof hash + hold window.OutcomePaid reconciliation, truthful receipts, crash-safe idempotency.ACCEPT/COUNTER/REJECT/HOLD), frozen negotiated terms, deterministic evaluation worker.docs/mainnet-proof.md — canonical S8.2 mainnet evidence (detailed record).docs/MAINNET_RUNBOOK.md — mainnet runtime provisioning runbook.docs/proof-pack/SAFE_AGENT_PAYMENTS_CHECKLIST.md — safe agent payments checklist.docs/arc-testnet.md — Canteen testnet setup, RPC architecture, and hardened operator vault.docs/proof/operator-testnet.md — live Arc testnet autonomous-operator proof (autonomous payout, policy refusal, human approval)./markets/[campaignId]/app/agent starts from one question ("What kinds of outcome markets should I watch for you?") and progressively gathers minimum bounty, auto-join/auto-negotiate and caps. Answers become typed PartnerRules (exact micro-USDC, allow/block lists, caps, toggles) through the existing rules service — chat never writes, and nothing activates until the confirmation card is pressed. The agent dashboard shows real state (watching/matched/joined/skipped-with-reasons/negotiations), answers questions from live market data, and runs eligible auto-joins through the unchanged join policy on explicit invocation. Negotiation automation is not available in this build.POST /internal/agents/supply/run (bearer SUPPLY_AGENT_WORKER_SECRET; Vercel Cron GET daily at 06:30 UTC via CRON_SECRET, Hobby-compatible) loads every autoJoin Partner and joins eligible PUBLIC live markets through the unchanged joinCampaign path — same deterministic rules, same audit records, no social posts, no faked negotiation. Repeats are idempotent, concurrent runs cannot duplicate joins, one Partner's failure never aborts the rest, and every run emits one supply_agent.run audit record so automatic decisions stay inspectable.arc:doctorARC_USDC_ADDRESS | no | Defaults to 0x3600000000000000000000000000000000000000 (Arc USDC). |
THESMA_VAULT_ADDRESS | for funding | Deployed ThesmaMarketVault. Absent → intents cannot be built. |
THESMA_EXECUTOR_ADDRESS | for campaign creation | Executor bound into created campaigns. |
THESMA_VERIFIER_ADDRESS | for campaign creation | Verifier bound into created campaigns. |
ARC_EXPLORER_BASE_URL | no | Optional explorer base for receipt links. |
ATTRIBUTION_SECRET | for referrals | HMAC secret for signed attribution tokens (≥32 chars, fails closed). |
VERIFIER_INTERNAL_SECRET | for workers | Bearer secret for internal verify routes (≥16 chars, fails closed). |
PAYOUT_WORKER_SECRET | for workers | Bearer secret for payout worker routes (falls back to verifier secret). |
CRON_SECRET | for workers | Server-only secret Vercel Cron sends as Bearer auth for cron GET adapters (payouts + supply worker). Cron GET and authenticated POST reuse the same worker in each case. |
SUPPLY_AGENT_WORKER_SECRET | for workers | Bearer secret for POST /internal/agents/supply/run (≥16 chars, fails closed). |
THESMA_VERIFIER_PRIVATE_KEY | for settlement | Isolated local verifier key; must derive to THESMA_VERIFIER_ADDRESS. |
THESMA_EXECUTOR_PRIVATE_KEY | for settlement | Isolated local executor key; must derive to THESMA_EXECUTOR_ADDRESS. |