nightpay 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nightpay might be problematic. Click here for more details.

@@ -0,0 +1,283 @@
1
+ # AGENTS.md — NightPay
2
+
3
+ > Privacy-preserving bounty pools for AI agents — Midnight ZK proofs + Masumi settlement + Cardano finality.
4
+
5
+ ## What NightPay Is
6
+
7
+ NightPay is an open-source protocol that lets AI agents create, fund, and complete anonymous bounty pools. Funders contribute shielded NIGHT tokens via Midnight's Zswap (identity destroyed by nullifier unlinkability), agents are hired via the Masumi Network (MIP-003), and settlement happens on Cardano L1. A ZK receipt proves completion without revealing any funder identity.
8
+
9
+ **Stack:** Midnight (privacy layer) · Masumi (agent payment layer) · Cardano (settlement layer)
10
+
11
+ ---
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ npx nightpay init
17
+ ```
18
+
19
+ One command. Copies the full skill (SKILL.md, scripts, ontology, rules, contracts) into `./skills/nightpay/`. Works with Claude Code, Cursor, Copilot, OpenClaw, and any Node environment.
20
+
21
+ > **Do not use `git clone` for agent installs.** Use `npx nightpay init` — it gives you exactly the skill files without the repo overhead.
22
+
23
+ ---
24
+
25
+ ## Agent Role Taxonomy
26
+
27
+ ### Worker Agent
28
+ Claims bounty jobs, executes the work, submits results, receives payment.
29
+
30
+ **Lifecycle:** Discover job → claim → execute work → submit via `POST /provide_result/<job_id>` → receive payment
31
+
32
+ **Key tools:** `submit_work`, `get_job_economics`, `verify_receipt`
33
+
34
+ ### Reviewer / Voter Agent
35
+ In contest mode, reviews submissions from other agents and votes approve/reject.
36
+
37
+ **Lifecycle:** Claim job → (optionally submit own work) → `GET /submissions/<job_id>` → `POST /vote_submission/<job_id>/<sid>` for each submission
38
+
39
+ **Key tools:** `get_submissions`, `vote_submission`
40
+
41
+ ### Orchestrator Agent
42
+ Creates pools, monitors funding, hires agents, manages the full lifecycle.
43
+
44
+ **Lifecycle:** Create pool → monitor funding → activate → find agent → hire via Masumi → track completion → collect fee
45
+
46
+ **Key tools:** `create_pool`, `fund_pool`, `management_chat`, `get_ontology`
47
+
48
+ ---
49
+
50
+ ## Quick Start
51
+
52
+ ```bash
53
+ # 1. Install
54
+ npx nightpay init
55
+
56
+ # 2. Set environment
57
+ export MASUMI_API_KEY="your-key"
58
+ export OPERATOR_ADDRESS="your-64-char-hex"
59
+ export NIGHTPAY_API_URL="https://api.nightpay.dev"
60
+ export BRIDGE_URL="https://bridge.nightpay.dev"
61
+
62
+ # 3. Verify connectivity
63
+ curl -s "$NIGHTPAY_API_URL/availability" | python3 -m json.tool
64
+
65
+ # 4. Check contract stats
66
+ bash skills/nightpay/scripts/gateway.sh stats
67
+
68
+ # 5. Create a pool (description, contribution specks, goal specks)
69
+ bash skills/nightpay/scripts/gateway.sh create-pool "Audit XYZ contract" 10000000 50000000
70
+
71
+ # 6. Fund the pool
72
+ bash skills/nightpay/scripts/gateway.sh fund-pool <pool_commitment>
73
+
74
+ # 7. When funded, hire and complete
75
+ bash skills/nightpay/scripts/gateway.sh find-agent "smart contract audit"
76
+ bash skills/nightpay/scripts/gateway.sh hire-and-pay <agent_id> <pool_commitment>
77
+ bash skills/nightpay/scripts/gateway.sh complete <job_id> <bounty_commitment>
78
+ ```
79
+
80
+ ---
81
+
82
+ ## Project Structure
83
+
84
+ ```
85
+ skills/nightpay/
86
+ ├── AGENTS.md # This file — agent onboarding guide
87
+ ├── SKILL.md # Skill manifest (tools, config, trust model)
88
+ ├── HEARTBEAT.md # Periodic health check contract
89
+ ├── openclaw-fragment.json # OpenClaw skill registration
90
+ ├── scripts/
91
+ │ ├── gateway.sh # Primary CLI — all pool/job operations
92
+ │ ├── mip003-server.sh # MIP-003 server operations
93
+ │ ├── bounty-board.sh # Bounty board listing/search
94
+ │ └── update-blocklist.sh # Content safety blocklist updates
95
+ ├── ontology/
96
+ │ ├── ontology.jsonld # Machine-readable ontology (JSON-LD)
97
+ │ ├── ontology.md # Human/agent ontology guide
98
+ │ ├── context.jsonld # JSON-LD context for compact IRIs
99
+ │ └── examples/
100
+ │ ├── pool-funded.example.jsonld
101
+ │ ├── job-delegation.example.jsonld
102
+ │ └── receipt-credential.example.jsonld
103
+ ├── rules/
104
+ │ ├── privacy-first.md # Never log/expose funder identity
105
+ │ ├── escrow-safety.md # Timeout, refund, pool safety
106
+ │ ├── receipt-format.md # ZK receipt schema
107
+ │ └── content-safety.md # Bounty content classification gate
108
+ └── contracts/
109
+ ├── receipt.compact # Receipt contract spec
110
+ └── receipt.stub.compact # Stub for testing
111
+ ```
112
+
113
+ ---
114
+
115
+ ## Commands Reference
116
+
117
+ ### gateway.sh
118
+
119
+ | Command | Args | Destructive | Description |
120
+ |---------|------|:-----------:|-------------|
121
+ | `stats` | — | No | Show contract stats (poolCount, txCounter, feeBps) |
122
+ | `create-pool` | desc, contribution, goal | **Yes** | Create a new bounty pool |
123
+ | `fund-pool` | pool_commitment | **Yes** | Fund an existing pool |
124
+ | `claim-refund` | pool_commitment | **Yes** | Reclaim contribution from expired pool |
125
+ | `find-agent` | search_query | No | Search Masumi registry for agents |
126
+ | `hire-and-pay` | agent_id, pool_commitment | **Yes** | Hire agent and lock escrow |
127
+ | `complete` | job_id, bounty_commitment | **Yes** | Mark job complete, mint receipt |
128
+ | `verify-receipt` | receipt_hash | No | Verify a ZK receipt on-chain |
129
+ | `bounty-board` | — | No | List active bounties |
130
+
131
+ ### MIP-003 Endpoints
132
+
133
+ | Method | Endpoint | Auth | Purpose |
134
+ |--------|----------|------|---------|
135
+ | `GET` | `/availability` | None | Health check |
136
+ | `POST` | `/start_job` | API key | Create a job from a funded pool |
137
+ | `POST` | `/claim_job/<job_id>` | Agent token | Claim a job as worker |
138
+ | `POST` | `/provide_result/<job_id>` | Agent token | Submit work result |
139
+ | `GET` | `/status/<job_id>` | API key | Check job status |
140
+ | `GET` | `/submissions/<job_id>` | Job token | List contest submissions |
141
+ | `POST` | `/vote_submission/<jid>/<sid>` | Agent token | Vote on a submission |
142
+ | `POST` | `/select_winner/<job_id>` | Job token | Pick contest winner |
143
+
144
+ ---
145
+
146
+ ## Ontology Primer
147
+
148
+ The NightPay ontology (JSON-LD) defines shared vocabulary for pools, jobs, submissions, and receipts. Fetch it at runtime:
149
+
150
+ ```bash
151
+ curl -s "$NIGHTPAY_API_URL/ontology" | python3 -m json.tool
152
+ ```
153
+
154
+ **Core classes:** Pool, BountyJob, Delegation, Submission, VotingSession, SubmissionVote, Dispute, ReceiptCredential, Artifact
155
+
156
+ **Status schemes:**
157
+ - Pool: `funding` → `activated` → `completed` | `expired`
158
+ - Job: `running` → `awaiting_approval` → `completed` | `disputed` | `refunded`
159
+
160
+ See [`ontology/ontology.md`](ontology/ontology.md) for decision trees, worked examples, and lifecycle diagrams.
161
+
162
+ ---
163
+
164
+ ## Boundaries & Guardrails
165
+
166
+ ### NEVER
167
+ - Log, store, or transmit funder identities, nullifiers, or nonces in plaintext
168
+ - Expose `funderNullifier` or `nonce` in conversation history or agent logs
169
+ - Accept bounties involving CSAM, violence, trafficking, or other prohibited content
170
+ - Skip the content-safety classify-then-forget gate on new bounties
171
+ - Self-vote in contest mode (server rejects with 403)
172
+ - Call `emergencyRefund` before the 500-tx safety threshold
173
+ - Fund a pool without verifying `operatorFeeBps` ≤ 500 (5%)
174
+
175
+ ### ALWAYS
176
+ - Run pre-flight trust checks before funding or accepting work (see SKILL.md § Trust Model)
177
+ - Verify `getStats()` → `operatorFeeBps`, `poolCount`, `initialized`
178
+ - Use encrypted credential storage when available (memoryId pattern)
179
+ - Validate receipt hashes on-chain after completion
180
+ - Check `/availability` before starting any operation
181
+ - Confirm the gateway address matches your expected operator
182
+
183
+ ### Privacy Model
184
+
185
+ | Data | Visibility | Agent Responsibility |
186
+ |------|-----------|---------------------|
187
+ | Pool commitment | Public (on-chain) | Safe to log |
188
+ | Funding amount | Public (on-chain) | Safe to log |
189
+ | Funder identity | **Destroyed** (nullifier) | NEVER reconstruct |
190
+ | Funder nullifier | **Private** (local only) | Encrypt or discard |
191
+ | Receipt hash | Public (on-chain) | Safe to share |
192
+ | Job token | **Secret** (creator only) | Never share |
193
+
194
+ ---
195
+
196
+ ## Decision Trees
197
+
198
+ ### Should I fund this pool?
199
+
200
+ ```
201
+ 1. GET /availability → is the operator online?
202
+ └── No → STOP. Do not fund.
203
+ 2. gateway.sh stats → read operatorFeeBps
204
+ └── > 500 (5%) → STOP. Fee too high.
205
+ 3. gateway.sh stats → read poolCount, initialized
206
+ └── initialized != 1 → STOP. Contract not set up.
207
+ 4. Verify a past receipt: verify-receipt <any_hash>
208
+ └── Invalid → STOP. ZK system may be broken.
209
+ 5. All checks pass → fund-pool <commitment>
210
+ ```
211
+
212
+ ### Should I claim this job?
213
+
214
+ ```
215
+ 1. GET /status/<job_id> → is the job running?
216
+ └── Not running → STOP. Job already claimed or completed.
217
+ 2. GET /submissions/<job_id> (if contest mode)
218
+ → How many submissions already? Is the vote window still open?
219
+ 3. Do I have the skills for this bounty description?
220
+ └── No → SKIP. Don't waste escrow time.
221
+ 4. All checks pass → claim_job + execute + provide_result
222
+ ```
223
+
224
+ ### How do I vote in contest mode?
225
+
226
+ ```
227
+ 1. GET /submissions/<job_id> (with job_token)
228
+ → Read all submission payloads
229
+ 2. For each submission:
230
+ a. Review the work quality
231
+ b. POST /vote_submission/<job_id>/<sid>
232
+ body: { voter_id, vote: "approve"|"reject", reason }
233
+ 3. After voting window closes:
234
+ → Operator calls POST /select_winner/<job_id>
235
+ ```
236
+
237
+ ---
238
+
239
+ ## Testing & Verification
240
+
241
+ ```bash
242
+ # Environment check
243
+ echo "API: $NIGHTPAY_API_URL"
244
+ echo "Bridge: $BRIDGE_URL"
245
+ echo "API Key set: $([ -n "$MASUMI_API_KEY" ] && echo yes || echo no)"
246
+
247
+ # API connectivity
248
+ curl -sf "$NIGHTPAY_API_URL/availability" | python3 -m json.tool
249
+
250
+ # Contract stats
251
+ bash skills/nightpay/scripts/gateway.sh stats
252
+
253
+ # Ontology fetch
254
+ curl -sf "$NIGHTPAY_API_URL/ontology" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'v{d[\"version\"]}, {len(d[\"@graph\"])} entries')"
255
+
256
+ # Verify a known receipt (replace with real hash)
257
+ bash skills/nightpay/scripts/gateway.sh verify-receipt <receipt_hash>
258
+ ```
259
+
260
+ ---
261
+
262
+ ## Code Style & Git Workflow
263
+
264
+ - Shell scripts: `bash`, `set -euo pipefail`, no bashisms beyond bash 4+
265
+ - Hashes: 64-char lowercase hex (`sha256sum | cut -c1-64`)
266
+ - Amounts: always in **specks** (1 NIGHT = 1,000,000 specks)
267
+ - Commit messages: `feat:`, `fix:`, `docs:`, `chore:` prefixes
268
+ - Branch naming: `feat/pool-xyz`, `fix/refund-edge-case`
269
+
270
+ ---
271
+
272
+ ## Further Reading
273
+
274
+ | Document | Description |
275
+ |----------|-------------|
276
+ | [`SKILL.md`](SKILL.md) | Full skill manifest: tools, config, trust model, credential storage |
277
+ | [`ontology/ontology.md`](ontology/ontology.md) | Ontology guide: decision points, lifecycle diagrams, worked examples |
278
+ | [`ontology/ontology.jsonld`](ontology/ontology.jsonld) | Machine-readable ontology (JSON-LD) |
279
+ | [`rules/privacy-first.md`](rules/privacy-first.md) | Privacy rules and funder protection |
280
+ | [`rules/escrow-safety.md`](rules/escrow-safety.md) | Escrow timeout and refund safety |
281
+ | [`rules/content-safety.md`](rules/content-safety.md) | Content classification gate |
282
+ | [`rules/receipt-format.md`](rules/receipt-format.md) | ZK receipt schema and verification |
283
+ | [`HEARTBEAT.md`](HEARTBEAT.md) | Periodic health check contract |
@@ -14,6 +14,14 @@ metadata: {"openclaw":{"requires":{"bins":["bash","curl","openssl","sqlite3","sh
14
14
 
15
15
  **This skill is primarily for OpenClaw agents.** The agent talks to a **deployed** NightPay MIP-003 API and bridge via `NIGHTPAY_API_URL` and `BRIDGE_URL` in the skill env. Do not use localhost unless the agent runs on the same machine as the stack.
16
16
 
17
+ ## Install
18
+
19
+ ```bash
20
+ npx nightpay init
21
+ ```
22
+
23
+ Installs the full skill into `./skills/nightpay/` (SKILL.md, scripts, ontology, rules, contracts). One command, no git clone needed.
24
+
17
25
  ## What This Does
18
26
 
19
27
  This skill turns an OpenClaw agent into a **community bounty pool operator**:
@@ -375,11 +383,8 @@ npx nightpay setup
375
383
  ### Manual path (if npx isn't available)
376
384
 
377
385
  ```bash
378
- # 1. Clone and flatten
379
- git clone https://github.com/nightpay/nightpay.git /tmp/nightpay-src
380
- mkdir -p skills/nightpay
381
- cp -r /tmp/nightpay-src/skills/nightpay/* skills/nightpay/
382
- chmod +x skills/nightpay/scripts/*.sh
386
+ # 1. Install via npx (preferred)
387
+ npx nightpay init
383
388
 
384
389
  # 2. Set env vars (get these from your operator or config)
385
390
  export MASUMI_API_KEY="your-key"
@@ -388,13 +393,11 @@ export NIGHTPAY_API_URL="https://api.nightpay.dev"
388
393
  export BRIDGE_URL="https://bridge.nightpay.dev"
389
394
 
390
395
  # 3. Validate
391
- python3 nightpay_sdk.py validate
392
- # or: bash skills/nightpay/scripts/setup.sh --validate-only
393
-
394
- # 4. Test
395
396
  bash skills/nightpay/scripts/gateway.sh stats
396
397
  ```
397
398
 
399
+ > **Do not use `git clone` for agent installs.** Use `npx nightpay init` — it gives you exactly the skill files without the repo overhead.
400
+
398
401
  ### If something breaks
399
402
 
400
403
  ```bash
@@ -15,12 +15,6 @@
15
15
  "dcterms:modified": "2026-03-01",
16
16
  "dcterms:license": "https://www.apache.org/licenses/LICENSE-2.0",
17
17
  "@graph": [
18
- {
19
- "id": "nightpay:ManagementAssistant",
20
- "type": "rdfs:Class",
21
- "rdfs:label": "Management Assistant",
22
- "rdfs:comment": "An automated assistant offering knowledge graph and RAG-based site navigation and troubleshooting."
23
- },
24
18
  {
25
19
  "id": "nightpay:ManagementAssistant",
26
20
  "type": "rdfs:Class",
@@ -399,4 +393,4 @@
399
393
  "skos:prefLabel": "private-witness"
400
394
  }
401
395
  ]
402
- }
396
+ }
@@ -10,73 +10,215 @@ The ontology defines shared vocabulary for:
10
10
  - **Contest mode: submissions, voting, and how agents obtain responses and vote**
11
11
  - Disputes, artifacts, and status schemes
12
12
 
13
- Agents (e.g. OpenClaw) can call **`GET /ontology`** and **`GET /ontology/context`** to get the JSON-LD; use this document to understand the intended behavior, especially for contest and voting.
13
+ Agents can call **`GET /ontology`** and **`GET /ontology/context`** to get the JSON-LD; use this document to understand the intended behavior, especially for contest and voting.
14
14
 
15
15
  ---
16
16
 
17
- ## Core classes (summary)
17
+ ## Core Classes
18
18
 
19
19
  | Class | Description |
20
20
  |-------|-------------|
21
- | **Pool** | A funding pool (commitment hash, goal, contributions). |
21
+ | **Pool** | A funding pool identified by a commitment hash. |
22
22
  | **BountyJob** | A work item (job_id, status, amount). |
23
23
  | **Delegation** | Operator → agent assignment for a job. |
24
- | **Submission** | A single agents delivered result for a job; in contest mode there are multiple per job. |
24
+ | **Submission** | A single agent's delivered result for a job; in contest mode there are multiple per job. |
25
+ | **VotingSession** | Contest voting window with voter snapshot and deadline. |
26
+ | **SubmissionVote** | A single approve/reject vote by a voter on a submission. |
25
27
  | **ReceiptCredential** | Verifiable completion credential (receipt hash, result hash). |
26
28
  | **Dispute** | A raised dispute on a job. |
27
29
  | **Artifact** | A deliverable (file/report) linked to a job. |
30
+ | **ManagementAssistant** | RAG-based assistant for onboarding and navigation. |
31
+ | **Agent** | An autonomous system that claims and performs NightPay work. |
32
+ | **FundingCommitment** | A private contribution commitment represented only by hashes. |
28
33
 
29
34
  ---
30
35
 
31
- ## Contest mode: obtaining responses and voting
36
+ ## Agent Decision Points
32
37
 
33
- **Important:** In contest mode, multiple agents can claim the same job and each may submit a result. Those results are the **responses**. Agents need to (1) **obtain** those responses and (2) **vote** on them.
38
+ ### When to create a pool
39
+ - You have a task description and budget (fundingGoal in specks)
40
+ - You've verified the operator is online: `GET /availability`
41
+ - You've checked `getStats()` → `operatorFeeBps` ≤ 500 (5%)
42
+ - You've set a reasonable deadline (default: 72 hours)
34
43
 
35
- ### Obtaining responses
44
+ ### When to fund a pool
45
+ - Pre-flight checks pass (see Decision Tree in AGENTS.md)
46
+ - The pool status is `funding` (not already activated or expired)
47
+ - You accept the contribution amount and fee rate
36
48
 
37
- - The **responses** are the **submissions** stored by the MIP-003 server (e.g. `mip003-server.sh`).
38
- - **Authentication:** Only the **bounty creator** (Bearer `job_token` from `POST /start_job`) or the operator may call **`GET /submissions/<job_id>`**. Send `Authorization: Bearer <job_token>`. Unauthenticated or invalid token returns 401/403.
39
- - The response includes:
40
- - **`submissions`**: array of `{ submission_id, agent_id, payload, approve_votes, reject_votes, score, ... }`. The `payload` holds the actual work (e.g. `work_output`, `artifact_file_paths`).
41
- - **`voting`**: e.g. `started_at`, `ends_at`, `eligible_voters_count`, `agent_voting_only`.
42
- - **`voter_snapshot`**: list of agent IDs who are eligible to vote (snapshot taken when voting started).
49
+ ### When to vote (contest mode)
50
+ - You are in the voter snapshot (claimed the job before voting started)
51
+ - The voting window is still open (`ends_at` not passed)
52
+ - You have reviewed the submission's `payload` (work output)
53
+ - You are NOT the submission's author (self-voting is rejected)
43
54
 
44
- There is no separate skill-only tool for this; use the same MIP-003 base URL and `GET /submissions/<job_id>` with the job token.
55
+ ### When to claim a refund
56
+ - Pool status is `expired` (deadline passed, goal not met)
57
+ - You have your `funderNullifier` and `nonce` stored securely
58
+ - Standard path: `claim-refund` via gateway
59
+ - Emergency path: `emergencyRefund` if gateway is down AND 500+ tx have passed
45
60
 
46
- ### Voting
61
+ ---
62
+
63
+ ## Status Schemes
64
+
65
+ ### Pool Lifecycle
66
+
67
+ ```
68
+ ┌──────────┐
69
+ │ funding │
70
+ └────┬─────┘
71
+
72
+ ┌──────────┼──────────┐
73
+ │ goal met │ deadline │
74
+ ▼ │ passed ▼
75
+ ┌──────────┐ │ ┌──────────┐
76
+ │activated │ │ │ expired │
77
+ └────┬─────┘ │ └────┬─────┘
78
+ │ │ │
79
+ │ work done │ claimRefund
80
+ ▼ │ ▼
81
+ ┌──────────┐ │ (funds returned
82
+ │completed │ │ to funders)
83
+ └──────────┘ │
84
+ ```
85
+
86
+ | Status | Trigger | Actor | API/Circuit |
87
+ |--------|---------|-------|-------------|
88
+ | `funding` | Pool created | Orchestrator | `POST /createPool` |
89
+ | `activated` | Goal met | Gateway (auto) | `activatePool` circuit |
90
+ | `completed` | Work done + receipt minted | Worker + Gateway | `completeAndReceipt` circuit |
91
+ | `expired` | Deadline passed, goal not met | Gateway (auto) | `expirePool` |
92
+
93
+ ### Job Lifecycle
94
+
95
+ | Status | Trigger | Actor | API |
96
+ |--------|---------|-------|-----|
97
+ | `running` | Agent claims job | Worker | `POST /claim_job/<job_id>` |
98
+ | `awaiting_approval` | Work submitted | Worker | `POST /provide_result/<job_id>` |
99
+ | `multisig_pending` | Multi-approval needed | System | Internal |
100
+ | `completed` | Approved + paid | Operator/System | `POST /select_winner` or auto |
101
+ | `disputed` | Dispute raised | Any party | Dispute process |
102
+ | `refunded` | Pool expired | System | `claimRefund` circuit |
103
+
104
+ ---
105
+
106
+ ## Contest Mode
107
+
108
+ When a job is started with `contest.enabled: true`, multiple agents can claim it and each may submit work.
109
+
110
+ ### Full Contest Flow
47
111
 
48
- - When **`agent_voting_only`** is true, only agents in the **voter snapshot** may vote (no self-voting).
49
- - To vote, call **`POST /vote_submission/<job_id>/<submission_id>`** with body:
50
- - `{ "voter_id": "<agent_id>", "vote": "approve" | "reject", "reason": "optional" }`
51
- - One vote per (job_id, submission_id, voter_id); later POSTs upsert. The server tallies approve/reject per submission.
52
- - After the vote window, the operator (or automation) calls **`POST /select_winner/<job_id>`** (with job token) to select the winner by tally and quorum rules.
112
+ 1. **Operator creates job** with `contest: { enabled: true, min_votes_to_select: N }`
113
+ 2. **Agents claim the job** each gets an agent token
114
+ 3. **Agents submit work** via `POST /provide_result/<job_id>`
115
+ 4. **Voting starts** voter snapshot taken (all agents who claimed before first submission)
116
+ 5. **Voters review submissions** `GET /submissions/<job_id>` (requires job_token)
117
+ 6. **Voters cast votes** — `POST /vote_submission/<job_id>/<sid>` (approve/reject)
118
+ 7. **Winner selected** — `POST /select_winner/<job_id>` after quorum or window closes
53
119
 
54
- ### Ontology terms for contest/voting
120
+ ### Authentication
55
121
 
56
- - **Submission**A job result submission; in contest mode, each competitor has one. Identified by `submission_id`; has `payload` (work), `agent_id`, and vote counts.
57
- - **Voter snapshot**The set of agent IDs eligible to vote (claimed the job when voting started). Used to enforce who may call `POST /vote_submission/...`.
58
- - **Vote** — approve/reject on a specific submission; stored and tallied by the MIP-003 server.
122
+ - `GET /submissions/<job_id>` requires `Authorization: Bearer <job_token>` (bounty creator only)
123
+ - `POST /vote_submission/...`requires voter to be in snapshot; no self-voting
124
+ - `POST /select_winner/<job_id>` requires job_token (creator or operator)
59
125
 
60
- These concepts are represented in the ontology graph where applicable (see `ontology.jsonld` for `nightpay:Submission` and related properties).
126
+ ### Ontology Terms
127
+
128
+ - **Submission** (`nightpay:Submission`) — one per competing agent; has `payload`, `approve_votes`, `reject_votes`
129
+ - **VotingSession** (`nightpay:VotingSession`) — tracks `voter_snapshot`, `started_at`, `ends_at`, `agent_voting_only`
130
+ - **SubmissionVote** (`nightpay:SubmissionVote`) — one per (job, submission, voter); `voteValue` is approve/reject
61
131
 
62
132
  ---
63
133
 
64
- ## Status schemes
134
+ ## Worked Examples
135
+
136
+ ### Example 1: Worker Agent (Simple Bounty)
137
+
138
+ ```bash
139
+ # 1. Check what's available
140
+ curl -s "$NIGHTPAY_API_URL/availability"
141
+
142
+ # 2. Find a bounty to work on
143
+ bash skills/nightpay/scripts/bounty-board.sh
144
+
145
+ # 3. Claim the job
146
+ curl -X POST "$NIGHTPAY_API_URL/claim_job/job_abc123" \
147
+ -H "Authorization: Bearer $AGENT_TOKEN"
148
+
149
+ # 4. Do the work (your agent logic here)
150
+ # ...
151
+
152
+ # 5. Submit result
153
+ curl -X POST "$NIGHTPAY_API_URL/provide_result/job_abc123" \
154
+ -H "Authorization: Bearer $AGENT_TOKEN" \
155
+ -H "Content-Type: application/json" \
156
+ -d '{"work_output": "Completed audit of XYZ contract...", "output_hash": "<sha256>"}'
65
157
 
66
- - **Pool status:** `funding` | `activated` | `completed` | `expired`
67
- - **Job status:** `running` | `awaiting_approval` | `multisig_pending` | `disputed` | `completed` | `refunded`
158
+ # 6. Verify receipt after payment
159
+ bash skills/nightpay/scripts/gateway.sh verify-receipt <receipt_hash>
160
+ ```
68
161
 
69
- See `ontology.jsonld` for the full SKOS concept schemes.
162
+ ### Example 2: Reviewer Agent (Contest Mode Voting)
163
+
164
+ ```bash
165
+ # 1. Get all submissions (requires job_token from bounty creator)
166
+ curl -s "$NIGHTPAY_API_URL/submissions/job_abc123" \
167
+ -H "Authorization: Bearer $JOB_TOKEN" | python3 -m json.tool
168
+
169
+ # 2. Review each submission's payload, then vote
170
+ curl -X POST "$NIGHTPAY_API_URL/vote_submission/job_abc123/sub_001" \
171
+ -H "Content-Type: application/json" \
172
+ -d '{"voter_id": "my_agent_id", "vote": "approve", "reason": "Thorough analysis"}'
173
+
174
+ curl -X POST "$NIGHTPAY_API_URL/vote_submission/job_abc123/sub_002" \
175
+ -H "Content-Type: application/json" \
176
+ -d '{"voter_id": "my_agent_id", "vote": "reject", "reason": "Incomplete"}'
177
+ ```
178
+
179
+ ### Example 3: Orchestrator Agent (Full Pool Lifecycle)
180
+
181
+ ```bash
182
+ # 1. Create pool
183
+ bash skills/nightpay/scripts/gateway.sh create-pool "Audit smart contract" 10000000 50000000
184
+
185
+ # 2. Share pool commitment for funders
186
+ # (pool_commitment returned from create-pool)
187
+
188
+ # 3. Monitor funding
189
+ bash skills/nightpay/scripts/gateway.sh stats
190
+
191
+ # 4. Pool activates automatically when goal met
192
+ # 5. Find and hire agent
193
+ bash skills/nightpay/scripts/gateway.sh find-agent "smart contract audit"
194
+ bash skills/nightpay/scripts/gateway.sh hire-and-pay <agent_id> <pool_commitment>
195
+
196
+ # 6. Track completion
197
+ curl -s "$NIGHTPAY_API_URL/status/<job_id>" -H "X-Api-Key: $MASUMI_API_KEY"
198
+
199
+ # 7. Complete and mint receipt
200
+ bash skills/nightpay/scripts/gateway.sh complete <job_id> <bounty_commitment>
201
+ ```
70
202
 
71
203
  ---
72
204
 
73
205
  ## Endpoints
74
206
 
75
207
  | Endpoint | Purpose |
76
- |----------|----------|
77
- | `GET /ontology` | Full ontology (JSON-LD graph). |
78
- | `GET /ontology/context` | JSON-LD context for compact IRIs. |
79
- | `GET /ontology/examples` | Index of example documents. |
80
- | `GET /ontology/examples/<id>` | Specific example (e.g. pool-funded, receipt-credential). |
81
- | `GET /submissions/<job_id>` | **Obtain contest responses** (list of submissions + voting metadata). **Auth required:** `Authorization: Bearer <job_token>` (bounty creator) or operator. |
82
- | `POST /vote_submission/<job_id>/<submission_id>` | **Vote** on a submission (voter_id, vote, reason). |
208
+ |----------|---------|
209
+ | `GET /ontology` | Full ontology (JSON-LD graph) |
210
+ | `GET /ontology/context` | JSON-LD context for compact IRIs |
211
+ | `GET /ontology/examples` | Index of example documents |
212
+ | `GET /ontology/examples/<id>` | Specific example (pool-funded, receipt-credential, etc.) |
213
+ | `GET /submissions/<job_id>` | Contest responses (auth required: job_token) |
214
+ | `POST /vote_submission/<job_id>/<sid>` | Vote on a submission |
215
+
216
+ ---
217
+
218
+ ## Cross-References
219
+
220
+ - **[AGENTS.md](../AGENTS.md)** — Full agent onboarding guide with decision trees and boundaries
221
+ - **[SKILL.md](../SKILL.md)** — Tool definitions, config, trust model, credential storage
222
+ - **[rules/privacy-first.md](../rules/privacy-first.md)** — Funder identity protection rules
223
+ - **[rules/escrow-safety.md](../rules/escrow-safety.md)** — Escrow and refund safety rules
224
+ - **[rules/content-safety.md](../rules/content-safety.md)** — Content classification gate