@stellar-agent-services/dev-mcp 0.1.0 → 0.1.1
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.
- package/package.json +4 -4
- package/repository/IMPLEMENTATION_PLAN.md +32 -20
- package/repository/README.md +8 -6
- package/repository/docs/client-integration/README-AI.md +8 -0
- package/repository/docs/client-integration/README.md +1 -0
- package/repository/docs/dx-improvements.md +7 -3
- package/repository/docs/payment-client.md +35 -3
- package/repository/docs/provider-standard.md +4 -0
- package/repository/docs/sow-closeout.md +67 -0
- package/repository/docs/standard/README-AI.md +6 -3
- package/repository/docs/verification.md +2 -0
- package/repository/examples/paid-service/README.md +9 -0
- package/repository/llms.txt +2 -1
- package/repository/packages/payment-client/README.md +24 -1
- package/repository/packages/provider-kit/README.md +3 -1
- package/repository/packages/verifier/README.md +4 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stellar-agent-services/dev-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "MCP server for coding agents building on Provider Standard v1: spec rules, docs, manifest validation and unpaid provider checks. It never pays.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@modelcontextprotocol/sdk": "1.32.1",
|
|
35
|
-
"@stellar-agent-services/protocol": "0.1.
|
|
36
|
-
"@stellar-agent-services/verifier": "0.1.
|
|
35
|
+
"@stellar-agent-services/protocol": "0.1.1",
|
|
36
|
+
"@stellar-agent-services/verifier": "0.1.1",
|
|
37
37
|
"zod": "3.25.76"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@stellar-agent-services/provider-kit": "0.1.
|
|
40
|
+
"@stellar-agent-services/provider-kit": "0.1.1"
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -7,12 +7,15 @@ Job Recovery, delivered and piloted within one 30-day Instaward sprint.
|
|
|
7
7
|
- **Source of truth:** Instawards SOW "Stellar Agent MCP" (submitted 29.09.2026, $4,000, 30 days).
|
|
8
8
|
- **Background:** `stellar-agent-search/docs/provider-network-phase-2.md` and `issues/P3-23-provider-network-phase-2.md`.
|
|
9
9
|
- **Network:** Stellar **testnet** for the whole build. Mainnet is a later, separate decision (see [Open decisions](#10-open-decisions)).
|
|
10
|
-
- **Status:**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Registry
|
|
10
|
+
- **Status (2026-11-06):** the core packages are released at 0.1.0. The kit, client, recovery and C1–C7 verifier
|
|
11
|
+
are implemented. This checkout adds fail-closed enforcement of configured verification restrictions [V1].
|
|
12
|
+
Sample approval/payment and recovery demos are recorded with screenshots and on-chain proofs in `evidence/`.
|
|
13
|
+
[The recordings and proofs are public](https://algorialabs.github.io/stellar-agent-services/); live verification
|
|
14
|
+
runs and badges are documented in [receipt evidence](evidence/receipts/README.md). Permanent sample
|
|
15
|
+
registration, an anchored Validation Registry response and the independent pilot remain.
|
|
16
|
+
Newer implementation notes report testnet discovery implemented in `stellar-agent-search`;
|
|
17
|
+
the pilot must confirm the full discovery-to-result path. See [SOW closeout](docs/sow-closeout.md) for the
|
|
18
|
+
handoff and [readiness evidence](evidence/readiness.md) for checks and public release/CI references.
|
|
16
19
|
|
|
17
20
|
---
|
|
18
21
|
|
|
@@ -35,12 +38,13 @@ Job Recovery, delivered and piloted within one 30-day Instaward sprint.
|
|
|
35
38
|
|
|
36
39
|
### 1.1 Inconsistencies in the SOW, and the reading we plan against
|
|
37
40
|
|
|
38
|
-
The SOW gives
|
|
41
|
+
The SOW gives conflicting numbers. The working interpretation below still needs Chapter Lead agreement; it
|
|
42
|
+
does not literally satisfy D3's phrase "three independent providers".
|
|
39
43
|
|
|
40
44
|
| Topic | What the SOW says | We plan for |
|
|
41
45
|
| --- | --- | --- |
|
|
42
46
|
| Providers | "two independent providers" (objective, W4, evidence). "three independent providers" (D3). "not more than two" (out of scope). "three working provider integrations" (W4 output). | **3 integrations = our sample provider + 2 independent providers** |
|
|
43
|
-
| Users | "five users" (D3, W4 output). "two users" (objective, W4 work, evidence). "not more than five" (out of scope). | **5
|
|
47
|
+
| Users | "five users" (D3, W4 output). "two users" (objective, W4 work, evidence). "not more than five" (out of scope). | **5 distinct users**, each completing the flow |
|
|
44
48
|
| Where it lives | "add … to Stellar Agent Search" | Phase 2 of Stellar Agent Search, built in this repo. Discovery stays in `stellar-agent-search`. |
|
|
45
49
|
|
|
46
50
|
> Action: confirm this reading with the Ambassador Chapter Lead before the sprint starts.
|
|
@@ -383,9 +387,9 @@ The sprint start date is still TBD; day 1 is the date the SOW is signed.
|
|
|
383
387
|
- [x] Payment client, first working version: approval screen, caps, signing, journal.
|
|
384
388
|
- [x] Core, local-key signer and `stellar-pay` CLI (approval prompt, caps, journal, on-chain check).
|
|
385
389
|
- [x] Minimal web approval page (`apps/wallet`), for the D1 video.
|
|
386
|
-
- [
|
|
390
|
+
- [x] One successful testnet payment flow, recorded ([video, screenshots and RPC proof](evidence/d1/README.md)).
|
|
387
391
|
- [x] Testnet tx links.
|
|
388
|
-
- [
|
|
392
|
+
- [x] Screenshots and the short video, captured 2026-11-06; public publication remains outstanding.
|
|
389
393
|
- [ ] Start pilot outreach: shortlist 4–5 candidate providers and 6–7 users.
|
|
390
394
|
|
|
391
395
|
**Exit:** spec published, approval-before-payment video, testnet tx link.
|
|
@@ -429,7 +433,8 @@ existing Python API becomes a paid service through gateway mode.
|
|
|
429
433
|
- `payment_uncertain`
|
|
430
434
|
- reconciliation: automatic after every sweep, and `provider-kit reconcile` (`--dry-run`, `--rpc`)
|
|
431
435
|
- the response-loss drill
|
|
432
|
-
- [
|
|
436
|
+
- [x] Record the recovery demo on testnet: one interrupted job, recovered, with exactly one on-chain transfer
|
|
437
|
+
([video, screenshots and bounded event scan](evidence/d2/README.md), 2026-11-06).
|
|
433
438
|
- [x] Payment client recovery: resume from the journal, never re-sign.
|
|
434
439
|
- [x] Payment client: treat `409 request_in_progress` on create-job and while polling as "ask again later".
|
|
435
440
|
- [x] A ledger clock, shared by reconciliation and the kit: an on-success job's deadline from its payment's
|
|
@@ -439,14 +444,19 @@ existing Python API becomes a paid service through gateway mode.
|
|
|
439
444
|
- [x] `verifier`: checks C1–C7, conformance levels, receipt, badges, and the no-payment `check` command
|
|
440
445
|
(docs/verification.md). Paid checks prove payments on chain by the signed nonce, and that refused payments never
|
|
441
446
|
landed; receipts are stored under their own SHA-256, the on-chain `response_hash`.
|
|
442
|
-
- [
|
|
447
|
+
- [x] Capture live testnet verification receipts and earned badges; retain failed and skipped checks honestly
|
|
448
|
+
([results](evidence/receipts/README.md)). Bounded polling now lets the same uncertain job reconcile [J13].
|
|
449
|
+
- [x] Validation Registry publishing: `request-validation` (provider) and `validation_response` (verifier) on testnet.
|
|
443
450
|
- [x] `verifier publish`: `validation_response` through the Stellar CLI keychain, after checking the request, the
|
|
444
451
|
receipt and the `response_uri`; the request document is defined in docs/verification.md.
|
|
445
452
|
- [x] `provider-kit request-validation`: the request document as a protocol type, JSON Schema and test vectors;
|
|
446
453
|
the command checks the registration, the signer and the validator, then the owner's wallet signs it (or the
|
|
447
454
|
Stellar CLI keychain, with `--source`).
|
|
448
|
-
- [
|
|
449
|
-
|
|
455
|
+
- [x] Run both on testnet for registered Oracle sample agent 163; C1–C7 passed, score 100, receipt anchored
|
|
456
|
+
([confirmed registration, request and response](evidence/validation/README.md), 2026-11-06).
|
|
457
|
+
- [x] Testnet direct-registry discovery and manifest service matching reported implemented in `stellar-agent-search`
|
|
458
|
+
([DX phase 4](docs/dx-improvements.md#phase-4-from-nothing-to-live-dev-launch-status)).
|
|
459
|
+
- [ ] Confirm the released discovery path, price/network information and validation-derived badges during the pilot.
|
|
450
460
|
- [ ] Pilot providers start integrating: send them the guide and template.
|
|
451
461
|
|
|
452
462
|
**Exit:**
|
|
@@ -456,9 +466,11 @@ existing Python API becomes a paid service through gateway mode.
|
|
|
456
466
|
### Week 4: Pilot and evidence (D3)
|
|
457
467
|
|
|
458
468
|
- [ ] Two independent providers live: each verified, each with at least one paid call.
|
|
459
|
-
- [ ] Five users complete find → approve → pay → receive, and at least one runs a recovery.
|
|
469
|
+
- [ ] Five distinct users complete find → approve → pay → receive, and at least one runs a recovery.
|
|
460
470
|
- [ ] Fix pilot-blocking issues and record them in the pilot report.
|
|
461
|
-
- [
|
|
471
|
+
- [x] Sample approval/payment and recovery videos, screenshots and payment references captured.
|
|
472
|
+
- [x] Publish the evidence page, videos, payment references, anchored receipt and registry records.
|
|
473
|
+
- [ ] Add the completed independent pilot report after real participant sessions.
|
|
462
474
|
|
|
463
475
|
**Exit:** every row of the SOW §6.1 evidence table is linked from `evidence/README.md`.
|
|
464
476
|
|
|
@@ -485,8 +497,8 @@ existing Python API becomes a paid service through gateway mode.
|
|
|
485
497
|
- [x] A client without `Idempotency-Key` and `Job-Token` → provider-generated id and token, one charge.
|
|
486
498
|
- [x] A challenge whose amount, payTo, asset or network differs from the manifest → the client refuses to sign.
|
|
487
499
|
- [x] A failed spending-limit check → the payment is blocked (fail closed).
|
|
488
|
-
- [
|
|
489
|
-
|
|
500
|
+
- [x] A lost response → recovery returns the stored result, with one on-chain transfer. Provider/client behavior
|
|
501
|
+
is tested offline, and [the recorded testnet demo](evidence/d2/README.md) includes a complete bounded transfer scan.
|
|
490
502
|
- [x] An uncertain settlement is decided from the transaction carrying the job's nonce: another job's equal
|
|
491
503
|
transfer never counts, and "not settled" comes only after the expiration ledger closed and the whole window
|
|
492
504
|
was searched. An RPC outage, a window older than the RPC's history, or a ledger still to come leave the job
|
|
@@ -541,8 +553,8 @@ everywhere.
|
|
|
541
553
|
| --- | --- | --- | --- |
|
|
542
554
|
| 1 | ~~Payment client design (§5.6)~~ **Decided 2026-10-21:** docs/payment-client.md | Berkin | W1 day 2 |
|
|
543
555
|
| 2 | SOW provider/user counts reading (§1.1) | Berkin + Ambassador Chapter Lead | Before sprint start |
|
|
544
|
-
| 3 |
|
|
556
|
+
| 3 | **Implemented per DX phase 4:** direct Identity Registry scan on testnet; confirm the released flow in the pilot | Berkin | Pilot |
|
|
545
557
|
| 4 | Testnet-only evidence accepted, or a final mainnet run | Berkin + Ambassador Chapter Lead | W2 |
|
|
546
|
-
| 5 |
|
|
558
|
+
| 5 | **Released 2026-11-02:** `@stellar-agent-services/*` and `create-stellar-service`, version 0.1.0 | Berkin | Done |
|
|
547
559
|
| 6 | ~~Provider Standard v1 freeze~~ **Decided 2026-10-21, frozen as drafted, except the URL:** `Job-Token` header, manifest path, `maxTimeoutSeconds` range, the URL for the schema `$id` and problem `type` values (`algorialabs.github.io/stellar-agent-services`), plus CORS as SHOULD [J17] | Berkin | W1 |
|
|
548
560
|
| 7 | Shared ERC-8126/8196 conventions: score direction, tags, hashing, policy extensions (docs/erc-compatibility.md) | Berkin + ERC-8126/8196 Stellar team | W1 for hashing, W3 for validation records |
|
package/repository/README.md
CHANGED
|
@@ -18,12 +18,14 @@ payment side:
|
|
|
18
18
|
| [`examples/paid-service`](examples/paid-service) | Sample provider and template for pilot providers |
|
|
19
19
|
| [`examples/python-upstream`](examples/python-upstream) | An existing Python API made a paid service with gateway mode |
|
|
20
20
|
|
|
21
|
-
**Status:**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
[
|
|
21
|
+
**Status (2026-11-06):** the core packages are released at 0.1.0. The kit, payment client, recovery and verifier
|
|
22
|
+
are implemented. [Sample payment/recovery evidence is public](https://algorialabs.github.io/stellar-agent-services/),
|
|
23
|
+
and live verification receipts and badges are captured in [evidence/](evidence/README.md). Permanent sample
|
|
24
|
+
registration, an anchored validation response and the independent pilot remain. This checkout
|
|
25
|
+
also enforces configured verification policies through an application-trusted source [V1]. The
|
|
26
|
+
[SOW closeout guide](docs/sow-closeout.md) lists the remaining acceptance work, and
|
|
27
|
+
[readiness evidence](evidence/readiness.md) records checks and release references. The full build history is in
|
|
28
|
+
[IMPLEMENTATION_PLAN.md](IMPLEMENTATION_PLAN.md). Development and pilot evidence use Stellar **testnet**.
|
|
27
29
|
|
|
28
30
|
To offer a service, start with [`npm create stellar-service`](packages/create-stellar-service), then:
|
|
29
31
|
|
|
@@ -54,6 +54,7 @@ itself can supply it. (The design doc's smart-account row, and erc-compatibility
|
|
|
54
54
|
| --- | --- |
|
|
55
55
|
| `packages/payment-client/src/strategies.ts` | `Signer`, `PaymentMethod`, `SignedPayload`, `ExpectedPayment`, `Confirmation` |
|
|
56
56
|
| `packages/payment-client/src/client.ts` | `PaymentClient`: the flow that calls the strategies (`quote`, `pay`, `payOnce`, `confirm`, `methodFor`, `checkLimits`) |
|
|
57
|
+
| `packages/payment-client/src/verification.ts` | Application-trusted evidence source and subject/freshness checks [V1] |
|
|
57
58
|
| `packages/payment-client/src/local-key-signer.ts` | Built-in signer: `createEd25519Signer` from `@x402/stellar` |
|
|
58
59
|
| `packages/payment-client/src/x402-exact-stellar.ts` | Built-in method, id `x402-exact-stellar` |
|
|
59
60
|
| `packages/payment-client/src/onchain.ts` | `rpcConfirmPayment`, `checkTransfer`, `TransactionReader`. Reuse them in your `confirm()`. |
|
|
@@ -131,6 +132,13 @@ These hold for every adapter. Don't re-implement them in an adapter.
|
|
|
131
132
|
| CG9 | The method named in `sending` confirms, against the journaled terms, never the receipt. A transaction that already confirmed another job, a missing method or a method that throws gives "not confirmed" with a reason `[J16]`. | `confirm()` | "confirms against the approved payment, not the provider's receipt", "does not confirm a job whose receipt reuses another job's transaction", "does not confirm a recovered payment whose method is no longer installed", "does not confirm a payment whose method throws while checking it" |
|
|
132
133
|
| CG10 | `recover()` never calls `createPayload()`. | `recover()` | "recovers a lost response without paying again" |
|
|
133
134
|
|
|
135
|
+
CG4 includes configured verification restrictions [V1]. The application installs `verificationSource`, not the
|
|
136
|
+
signer or payment method. Evidence must match the approved manifest hash, URL, payee, network and agent id and
|
|
137
|
+
remain within its validity window. No source, an outage or a missing required metric blocks signing. See
|
|
138
|
+
`test/verification.test.ts` and [the design](../payment-client.md#verification-source). `minVerificationScore`
|
|
139
|
+
retains ERC-8196's maximum-risk semantics; it is not the higher-is-better receipt score. Recovery does not read
|
|
140
|
+
verification evidence.
|
|
141
|
+
|
|
134
142
|
Journal on the happy path: `intent, approved, sending, settled, result`. When the wallet doesn't sign:
|
|
135
143
|
`intent, approved, refused`.
|
|
136
144
|
|
|
@@ -39,6 +39,7 @@ don't build those rules again.
|
|
|
39
39
|
| --- | --- |
|
|
40
40
|
| The price is checked | The payment request must match the price, payee and network the service published. |
|
|
41
41
|
| Limits are checked | Per-payment and daily limits, plus your wallet's own budget, before anything is signed. |
|
|
42
|
+
| Verification gates apply | Configured risk/level limits require fresh evidence from an application-trusted source; missing evidence blocks signing. |
|
|
42
43
|
| The user approves | Every payment, or only those above an amount the user chose. |
|
|
43
44
|
| One signature per job | Even when a wallet popup is slow or the user clicks twice. |
|
|
44
45
|
| Saved before sending | A journal entry is written before the payment leaves, so a crash never leads to paying twice. |
|
|
@@ -7,9 +7,13 @@ repository, why, and how it was checked. A phase is added here when it lands.
|
|
|
7
7
|
| --- | --- | --- |
|
|
8
8
|
| 1 | [`provider-kit try`](#phase-1-provider-kit-try): the first paid call in one command | Done |
|
|
9
9
|
| 2 | [`provider-kit init --openapi`](#phase-2-provider-kit-init---openapi): the gateway config from an OpenAPI document | Done |
|
|
10
|
-
| 3 | [`npm create stellar-service`, and how agents see you](#phase-3-npm-create-stellar-service-and-how-agents-see-you): a ready project in one command, and what search sees |
|
|
11
|
-
| 4 | [From nothing to live: `dev`, `launch`, `status`](#phase-4-from-nothing-to-live-dev-launch-status): no wallet until launch, one approval page, verification without a hand-off |
|
|
12
|
-
| 5 | [Mainnet, and the checks before a release](#phase-5-mainnet-and-the-checks-before-a-release): a mainnet project, CI that rehearses the npm publish, daily live checks, releases from a tag |
|
|
10
|
+
| 3 | [`npm create stellar-service`, and how agents see you](#phase-3-npm-create-stellar-service-and-how-agents-see-you): a ready project in one command, and what search sees | Released in 0.1.0 |
|
|
11
|
+
| 4 | [From nothing to live: `dev`, `launch`, `status`](#phase-4-from-nothing-to-live-dev-launch-status): no wallet until launch, one approval page, verification without a hand-off | Released in 0.1.0 |
|
|
12
|
+
| 5 | [Mainnet, and the checks before a release](#phase-5-mainnet-and-the-checks-before-a-release): a mainnet project, CI that rehearses the npm publish, daily live checks, releases from a tag | Released in 0.1.0 |
|
|
13
|
+
|
|
14
|
+
Release status was checked on 2026-11-06. The sections below retain their implementation-time validation and
|
|
15
|
+
limits; [readiness evidence](../evidence/readiness.md) records newer checks. Live SOW evidence and the independent
|
|
16
|
+
pilot remain outstanding; see [SOW closeout](sow-closeout.md).
|
|
13
17
|
|
|
14
18
|
Before these phases, the owner's transactions (the USDC trustline, 8004 registration, validation requests) moved
|
|
15
19
|
from a key in the CLI to the developer's own wallet, approved on a page the CLI opens
|
|
@@ -175,7 +175,7 @@ How to build, test and submit an adapter, and what we and the integrator each ne
|
|
|
175
175
|
| `allowedContracts` / `blockedContracts` | The asset contract (USDC SAC) | USDC only |
|
|
176
176
|
| `maxValuePerTx`, `maxValuePerDay` | In the asset's base units, not a native value | 0.10 / 1.00 USDC |
|
|
177
177
|
| `validAfter`, `validUntil` | ERC-8196 | now / +30 days |
|
|
178
|
-
| `minVerificationScore` | ERC-8196
|
|
178
|
+
| `minVerificationScore` | ERC-8196 name: maximum allowed provider risk score (0–100, lower is safer), from a trusted source | unset |
|
|
179
179
|
| `stellar.asset` | The one asset the limits apply to | USDC |
|
|
180
180
|
| `stellar.payees` | `{ allow?, block? }` lists of `payTo` addresses, since the real payee is an argument of `transfer` | unset |
|
|
181
181
|
| `stellar.minProviderLevel` | The lowest `provider-standard-v1` conformance level a payee must have | unset (pilot) |
|
|
@@ -185,6 +185,36 @@ How to build, test and submit an adapter, and what we and the integrator each ne
|
|
|
185
185
|
Out of the box, every payment asks for approval, which is what the SOW requires. Paying without a prompt is
|
|
186
186
|
something the owner turns on.
|
|
187
187
|
|
|
188
|
+
### Verification source
|
|
189
|
+
|
|
190
|
+
The core enforces configured `minVerificationScore` and `stellar.minProviderLevel` at quote time and again before
|
|
191
|
+
signing [V1]. Missing or invalid evidence blocks the payment, including when the configured limit is zero. When
|
|
192
|
+
both limits are unset, no verification read is needed.
|
|
193
|
+
|
|
194
|
+
`PaymentClientOptions.verificationSource` is application-trusted code implementing:
|
|
195
|
+
|
|
196
|
+
```ts
|
|
197
|
+
interface VerificationSource {
|
|
198
|
+
read(subject: VerificationSubject): Promise<ProviderVerification | undefined>;
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
The subject contains `network`, `payTo`, `manifestUrl`, `manifestSha256` (RFC 8785 canonical JSON) and optional
|
|
203
|
+
`agentId`. The result repeats those fields and adds RFC 3339 `checkedAt` and `expiresAt`, plus optional
|
|
204
|
+
`riskScore` (0–100, lower is safer) and `level` (0–3). The core rejects a different subject, a future check, expired
|
|
205
|
+
evidence or an invalid metric. Each configured restriction requires its own metric.
|
|
206
|
+
|
|
207
|
+
The source authenticates the evidence: trusted validator selection, registry reads, receipt hashes and the
|
|
208
|
+
validity period it accepts. Its network calls must have deadlines. A raw receipt, a provider's badge or a score
|
|
209
|
+
copied from a manifest is not an authenticated source. No built-in registry/risk-source adapter exists yet.
|
|
210
|
+
|
|
211
|
+
`minVerificationScore` preserves ERC-8196's maximum-risk meaning despite its name (erc-compatibility.md T4).
|
|
212
|
+
Do not compare it directly with the Provider Standard receipt's higher-is-better `score`.
|
|
213
|
+
|
|
214
|
+
The web page and CLI do not install a source. Their default policies leave both restrictions unset; importing a
|
|
215
|
+
policy that sets them blocks new payments until a source is installed. Recovery remains available without a
|
|
216
|
+
verification read, because collecting a paid result never requires another payment [J11], [J13].
|
|
217
|
+
|
|
188
218
|
### Journal (ERC-8196 hash-chained audit trail)
|
|
189
219
|
|
|
190
220
|
- One entry per step: `intent`, `approved` or `refused` (with the policy rule that refused), `sending`,
|
|
@@ -216,8 +246,10 @@ something the owner turns on.
|
|
|
216
246
|
7. On `202`, or if the connection drops: check-status, then get-result, never paying again, at the pace the
|
|
217
247
|
provider's `Retry-After` sets. A `409 request_in_progress` means the provider holds the payment and is still
|
|
218
248
|
settling it: the client keeps polling, and hands the job back for `recover()` if settlement outlasts
|
|
219
|
-
`followSeconds`.
|
|
220
|
-
|
|
249
|
+
`followSeconds`. By default a job marked `payment_uncertain` comes back at once. With
|
|
250
|
+
`followPaymentUncertain: true`, the client keeps reading that same job within `followSeconds`, at the
|
|
251
|
+
provider's `Retry-After` pace, while provider reconciliation decides its payment from the chain [J13].
|
|
252
|
+
It never signs or submits another payment while waiting [J11]. `provider-kit try` enables this bounded wait.
|
|
221
253
|
|
|
222
254
|
## Sprint plan
|
|
223
255
|
|
|
@@ -607,6 +607,10 @@ Verification results are published to the Stellar 8004 Validation Registry. See
|
|
|
607
607
|
|
|
608
608
|
The checks are listed in [verification.md](verification.md).
|
|
609
609
|
|
|
610
|
+
- **[V1]** Clients SHOULD enforce any verification requirements configured by their owner before signing. Evidence
|
|
611
|
+
should come from a trusted source, match the approved manifest, payee and network, and be within that source's
|
|
612
|
+
validity window. Missing, unreadable or unverifiable evidence should block a payment that requires it.
|
|
613
|
+
|
|
610
614
|
## 9. Versioning and extensions
|
|
611
615
|
|
|
612
616
|
- Changes inside v1 only add optional fields. `standard` stays `stellar-agent-services/provider@1`.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# SOW closeout and pilot handoff
|
|
2
|
+
|
|
3
|
+
Reviewed on 2026-11-06 against the [source SOW](https://docs.google.com/document/d/1kIJ5nkwIVaXqHqcNHwuI5JN0Ap6g86wzncMQya6Kv88/edit)
|
|
4
|
+
and this checkout. The [implementation plan](../IMPLEMENTATION_PLAN.md) records the build; this page records the
|
|
5
|
+
remaining acceptance work. Prepared templates are not evidence of completed pilot work.
|
|
6
|
+
|
|
7
|
+
## Readiness
|
|
8
|
+
|
|
9
|
+
| Area | Available | Still needed for SOW acceptance |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| D1 | Standard, client, spending controls, publicly hosted approval/limit-block video, screenshots and payment proof | Chapter Lead review |
|
|
12
|
+
| D2 | Kit, guide, stable Oracle sample, all C1–C7 passed, anchored receipt/five badges, recovery and payment proofs | Chapter Lead review |
|
|
13
|
+
| D3 | Scaffolder and onboarding guide | Independent integrations, user flows, findings/fixes and completed pilot report |
|
|
14
|
+
| Distribution | Six npm packages at 0.1.0 and a successful public release | A later release for the changes in this checkout |
|
|
15
|
+
| Discovery | Newer implementation notes report testnet registry scanning and manifest service matching | Confirm the released discovery path in the pilot and show the complete find-to-result flow |
|
|
16
|
+
|
|
17
|
+
Public release and CI references, and local check results, belong in [readiness evidence](../evidence/readiness.md).
|
|
18
|
+
The latest observed daily live workflow failed its paid testnet call; do not treat ordinary CI as a live payment
|
|
19
|
+
proof. A trusted registry/risk-source adapter remains application integration work; configured verification limits
|
|
20
|
+
now block new payments unless a trusted source can satisfy them [V1].
|
|
21
|
+
|
|
22
|
+
## Acceptance decisions for the owner
|
|
23
|
+
|
|
24
|
+
The source SOW conflicts: D3 says three independent providers and five users, while the objective and evidence
|
|
25
|
+
section say two providers and two users; its exclusions cap providers at two. The working target is the sample
|
|
26
|
+
plus two independent providers, and five distinct pilot users. This interpretation still needs Chapter Lead
|
|
27
|
+
agreement. Five flows by one person do not establish five users.
|
|
28
|
+
|
|
29
|
+
Also confirm that testnet evidence is accepted. Record the agreement and sprint start date in the pilot report;
|
|
30
|
+
the SOW's submission date does not establish the sprint deadline.
|
|
31
|
+
|
|
32
|
+
## Completed reference deployment and evidence
|
|
33
|
+
|
|
34
|
+
The [sample runs on the existing Oracle A1 VM](../deploy/d2/oracle/README.md), with separate process, user,
|
|
35
|
+
loopback port, SQLite data and HTTPS origin. No new cloud resources were allocated. Its public testnet owner
|
|
36
|
+
is separate from the existing mainnet Logo Maker wallet. The mainnet manifest hash remained unchanged.
|
|
37
|
+
|
|
38
|
+
The sample is registered as testnet agent 163. [Registry evidence](../evidence/validation/README.md) includes
|
|
39
|
+
confirmed registration, request and response transactions, the request document, receipt hash and on-chain
|
|
40
|
+
score/tag. All C1–C7 checks passed. The project-operated validator is separate from the provider and disposable
|
|
41
|
+
payer; it is not an independent auditor. Signing keys stay in local Stellar CLI secure storage.
|
|
42
|
+
|
|
43
|
+
Review these completed reference artifacts:
|
|
44
|
+
|
|
45
|
+
1. [D1 approval, spending block, payment and result recording](../evidence/d1/README.md).
|
|
46
|
+
2. [Registered sample receipt and five badges](../evidence/receipts/README.md), with failures/skips from historical runs preserved.
|
|
47
|
+
3. [D2 same-job recovery recording and bounded single-transfer proof](../evidence/d2/README.md) [J11], [J13], [J16].
|
|
48
|
+
4. [Linux client before/after evidence](../evidence/d2/oracle-clean-client.json): npm 0.1.0 returned uncertainty;
|
|
49
|
+
its original job later reconciled. The unreleased polling fix completed a distinct testnet call and
|
|
50
|
+
confirmed its transfer. This does not claim a scheduled CI rerun or an independent clean-host integration.
|
|
51
|
+
5. [Public evidence page](https://algorialabs.github.io/stellar-agent-services/) and [publication checks](../evidence/publication.json).
|
|
52
|
+
|
|
53
|
+
The [Oracle runbook](../deploy/d2/oracle/README.md) records maintenance and rollback. For another provider,
|
|
54
|
+
follow the [setup guide](provider-setup-guide.md), use its own public payout, and have its owner sign registry
|
|
55
|
+
steps in their wallet. Never deploy an owner signing key. Mainnet proof remains deferred until funded;
|
|
56
|
+
all completed reference payments and registry records are explicitly testnet.
|
|
57
|
+
|
|
58
|
+
## Run the independent pilot
|
|
59
|
+
|
|
60
|
+
Use [the pilot checklist](../evidence/pilot/README.md) and [report template](../evidence/pilot/report.md). Recruit
|
|
61
|
+
providers who control their own code, payout wallet and deployment. Have them follow the guide from a clean
|
|
62
|
+
environment; record assistance and blockers. Each provider needs a real paid testnet service call and its own
|
|
63
|
+
linked evidence. Capture discovery, approval, payment and result for each user; at least one demonstrates recovery.
|
|
64
|
+
|
|
65
|
+
Resolve blocking issues, retain before/after observations and rerun only affected flows. Submit the evidence index
|
|
66
|
+
with completed videos, receipts, transaction references, registry records and report, then request Chapter Lead
|
|
67
|
+
acceptance against SOW §6.2.
|
|
@@ -30,9 +30,9 @@ pays one) that follows Provider Standard v1.
|
|
|
30
30
|
| Any other language or stack | **Native**: implement §3–§12 | §3–§12, §13 |
|
|
31
31
|
| Agent, wallet or app that pays providers | **Client** | §14, [packages/payment-client](../../packages/payment-client) |
|
|
32
32
|
|
|
33
|
-
The packages are
|
|
34
|
-
run `npm install && npm run build`. Then build inside it,
|
|
35
|
-
|
|
33
|
+
The packages are published on npm from 0.1.0. Use `npm create stellar-service`, or install the package you need.
|
|
34
|
+
For unreleased changes, clone this repository and run `npm install && npm run build`. Then build inside it,
|
|
35
|
+
copy `examples/paid-service`, or link a package with `npm install <repo>/packages/provider-kit`.
|
|
36
36
|
|
|
37
37
|
## 2. Kit path (TypeScript)
|
|
38
38
|
|
|
@@ -486,6 +486,8 @@ npx stellar-pay pay http://localhost:8787/.well-known/stellar-agent-services.jso
|
|
|
486
486
|
- Unpaid create-job → `402`. Compare the challenge with the approved manifest, and refuse to sign on any mismatch
|
|
487
487
|
`[P7]`.
|
|
488
488
|
- Show the price, recipient, network and `charge` before approval `[S3]`.
|
|
489
|
+
- Enforce configured verification limits from trusted evidence matching the approved manifest, payee and network
|
|
490
|
+
`[V1]`. Missing, unreadable or expired evidence blocks a payment requiring verification. Recheck before signing.
|
|
489
491
|
- Sign once. Send the paid request with the same id, token and input.
|
|
490
492
|
- `429` / `503` from create-job: wait `Retry-After` plus jitter, then send the identical request again `[Q8]`.
|
|
491
493
|
- On a paid request, send the same `PAYMENT-SIGNATURE`.
|
|
@@ -608,4 +610,5 @@ Errors, identity and extensions:
|
|
|
608
610
|
- **I1** The 8004 registration lists the manifest under `stellar-agent-services`.
|
|
609
611
|
- **I2** `provider.agentId` is that registration's id.
|
|
610
612
|
- **I3** `payTo` equals `get_agent_wallet(agentId)`.
|
|
613
|
+
- **V1** Clients SHOULD enforce configured verification requirements from trusted, matching, current evidence before signing.
|
|
611
614
|
- **X1** Extra fields go in `extensions` with reverse-DNS keys, and clients ignore unknown ones.
|
|
@@ -178,6 +178,8 @@ The test payer pays for one job of the target service (`--service`, or the cheap
|
|
|
178
178
|
3. Every job view is checked: the job id is the `Idempotency-Key` (§5.2), `charge` is the manifest's (§3.2),
|
|
179
179
|
`charged` fits the state (§5.6), `200` once finished and otherwise `202` with `Retry-After`, plus `Location` on
|
|
180
180
|
create-job [J8], output only when it may be shown [J14], and a receipt whose terms are the payment's (§5.7).
|
|
181
|
+
A `payment_uncertain` job is polled within the same bounded follow period while the provider reconciles it
|
|
182
|
+
from the chain [J13]. Polling only reads the original job [J11]; unresolved uncertainty earns no paid check.
|
|
181
183
|
4. The job must succeed (§5.6), charged, with output that matches `outputSchema` [S1].
|
|
182
184
|
5. The receipt's transaction must have succeeded, carry the payment the verifier signed, and move exactly the
|
|
183
185
|
price from the payer to `payTo` [J16]. The response that settled SHOULD carry `PAYMENT-RESPONSE` [P10].
|
|
@@ -11,6 +11,15 @@ their template.
|
|
|
11
11
|
Jobs are kept in SQLite (`JOB_DB_PATH`, default `./jobs.sqlite`), so a paid job survives a restart: stop the
|
|
12
12
|
server while a report is queued, start it again, and the report runs.
|
|
13
13
|
|
|
14
|
+
Set `HOST=127.0.0.1` when a reverse proxy on the same server supplies HTTPS. The default is `0.0.0.0`, which also
|
|
15
|
+
works inside a container. [The Oracle testnet deployment](../../deploy/d2/oracle/README.md) uses loopback and
|
|
16
|
+
a separate persistent job store beside an existing mainnet service.
|
|
17
|
+
|
|
18
|
+
`text-stats` admits one on-success job at a time and refuses excess work before payment [Q2], [Q3]. This is
|
|
19
|
+
deliberately conservative for the shared testnet facilitator. A live verification run at the former default of
|
|
20
|
+
four concurrent jobs encountered settlement errors; its receipt is retained in
|
|
21
|
+
[the verification evidence](../../evidence/receipts/README.md).
|
|
22
|
+
|
|
14
23
|
Run it with `npx provider-kit dev -- npm start` in this directory, after `npm install && npm run build` at the
|
|
15
24
|
repository root: with `PAY_TO` empty, `dev` makes a throwaway testnet account to be paid to, so you need no wallet yet
|
|
16
25
|
(or run `PAY_TO=G... npm start` with an account of yours). `.env.example` lists the settings; they are public values
|
package/repository/llms.txt
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
## Standard
|
|
18
18
|
|
|
19
|
-
- [Provider Standard v1](https://raw.githubusercontent.com/AlgoriaLabs/stellar-agent-services/main/docs/provider-standard.md): The normative spec: manifest, services, payment, jobs, capacity, errors, identity, conformance levels. Rule ids M, S, P, J, Q, E, I, X
|
|
19
|
+
- [Provider Standard v1](https://raw.githubusercontent.com/AlgoriaLabs/stellar-agent-services/main/docs/provider-standard.md): The normative spec: manifest, services, payment, jobs, capacity, errors, identity, conformance levels. Rule ids M, S, P, J, Q, E, I, V, X
|
|
20
20
|
- [Standard reference for AI coding agents](https://raw.githubusercontent.com/AlgoriaLabs/stellar-agent-services/main/docs/standard/README-AI.md): The spec as an implementation reference: paths, constants, the create-job algorithm, headers, states, a rule index, common mistakes
|
|
21
21
|
- [Standard summary for people](https://raw.githubusercontent.com/AlgoriaLabs/stellar-agent-services/main/docs/standard/README.md): What the standard does and why, without the detail
|
|
22
22
|
- [Test vectors](https://raw.githubusercontent.com/AlgoriaLabs/stellar-agent-services/main/packages/protocol/test-vectors/README.md): Known-answer tests for an implementation in any language: canonical JSON, binding hashes, headers, manifests, challenges, job states, errors
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
|
|
57
57
|
## Optional
|
|
58
58
|
|
|
59
|
+
- [SOW closeout](https://raw.githubusercontent.com/AlgoriaLabs/stellar-agent-services/main/docs/sow-closeout.md): Readiness, remaining acceptance work, testnet deployment and evidence handoff
|
|
59
60
|
- [Contributing](https://raw.githubusercontent.com/AlgoriaLabs/stellar-agent-services/main/CONTRIBUTING.md): How changes are made: the spec first, then the kit, client and verifier
|
|
60
61
|
- [ERC compatibility](https://raw.githubusercontent.com/AlgoriaLabs/stellar-agent-services/main/docs/erc-compatibility.md): How the standard lines up with ERC-8126 (agent verification) and ERC-8196 (agent authenticated wallet)
|
|
61
62
|
- [Developer experience improvements](https://raw.githubusercontent.com/AlgoriaLabs/stellar-agent-services/main/docs/dx-improvements.md): What each phase of the developer-experience work changed for providers, and how it was checked
|
|
@@ -36,6 +36,7 @@ The main entry point runs in Node and the browser. Journal storage depends on wh
|
|
|
36
36
|
| `src/x402-exact-stellar.ts` | The built-in payment method: x402 `exact` on Stellar, the only one Provider Standard v1 allows |
|
|
37
37
|
| `src/conformance.ts` | Checks that every signer and payment-method adapter must pass (`./conformance` entry point) |
|
|
38
38
|
| `src/policy.ts` | Spending policy with ERC-8196 field names; `checkPolicy()` fails closed |
|
|
39
|
+
| `src/verification.ts` | Application-trusted verification source; binds evidence to the approved manifest, payee, network and validity window [V1] |
|
|
39
40
|
| `src/journal.ts` | Append-only, hash-chained journal; job tokens kept apart in a `SecretStore` |
|
|
40
41
|
| `src/file-storage.ts` | Journal and job-token storage in files (`./node` entry point) |
|
|
41
42
|
| `src/browser-storage.ts` | Journal and job-token storage in IndexedDB (`./browser` entry point) |
|
|
@@ -67,9 +68,31 @@ Job Recovery: start the provider with `DRILL_LOSE_RESPONSE=1 REPORT_DELAY_SECOND
|
|
|
67
68
|
then run the `stellar-pay recover <job-id> --dev` command it prints. `stellar-pay jobs` and
|
|
68
69
|
`stellar-pay journal verify` show the journal.
|
|
69
70
|
|
|
71
|
+
`followPaymentUncertain: true` optionally follows an uncertain job within `followSeconds` while the provider
|
|
72
|
+
reconciles it [J13]. It only reads the original job and never pays again [J11]. The default returns uncertainty
|
|
73
|
+
immediately, so a UI can offer manual recovery. `provider-kit try` enables the bounded wait.
|
|
74
|
+
|
|
75
|
+
## Verification policy
|
|
76
|
+
|
|
77
|
+
Configured verification limits are checked at `quote()` and again at `pay()`, before signing [V1]. Install a
|
|
78
|
+
`verificationSource` in `PaymentClientOptions` to supply authenticated evidence. Without a source, or when it
|
|
79
|
+
returns missing, stale, mismatched or unreadable evidence, a payment requiring verification is blocked.
|
|
80
|
+
|
|
81
|
+
- `minVerificationScore` keeps ERC-8196's name and meaning: the **maximum allowed risk score**, 0–100, lower is
|
|
82
|
+
safer. It compares with the source's `riskScore`, not a receipt's higher-is-better conformance score.
|
|
83
|
+
- `stellar.minProviderLevel` is the minimum Provider Standard §8 level, 0–3.
|
|
84
|
+
- Even a configured value of zero requires evidence. Leaving both fields unset requires no source.
|
|
85
|
+
- Sources are trusted application code. They must authenticate validators and receipt/registry data, bind the
|
|
86
|
+
answer to the requested subject, set `checkedAt` and `expiresAt`, and bound their network calls. Never use a
|
|
87
|
+
provider's own claims as proof. No built-in registry/risk-source adapter is supplied yet.
|
|
88
|
+
- Recovery collects an already paid job without consulting the source or signing again [J11], [J13].
|
|
89
|
+
|
|
90
|
+
See [the design](../../docs/payment-client.md#verification-source) for the interface and trust boundary.
|
|
91
|
+
|
|
70
92
|
## Not done in the PoC
|
|
71
93
|
|
|
72
|
-
-
|
|
94
|
+
- No built-in Validation Registry or ERC-8126 risk-source adapter. Configured verification limits fail closed
|
|
95
|
+
until the application supplies its own trusted source.
|
|
73
96
|
- The wallet secret is a plain file (mode 600). Testnet only.
|
|
74
97
|
- No MCP server yet.
|
|
75
98
|
- Only the built-in signer and method. Adapters for other wallets come later, each in its own package.
|
|
@@ -306,7 +306,9 @@ GDJB…XA3O (payTo) received 0.01 USDC.
|
|
|
306
306
|
- **Testnet only.** A provider on Mainnet is refused before anything is signed.
|
|
307
307
|
|
|
308
308
|
`--json` prints the outcome as JSON on standard output (the job, its status, the payment and the output) and the
|
|
309
|
-
steps on standard error. It exits 0 only when the job succeeded and its payment is confirmed.
|
|
309
|
+
steps on standard error. It exits 0 only when the job succeeded and its payment is confirmed.
|
|
310
|
+
When the provider returns `payment_uncertain`, it polls that same job within the follow deadline, without
|
|
311
|
+
signing or sending another payment [J11], [J13]. If the answer to the paid request is lost, it
|
|
310
312
|
says the payment may have gone through and never calls it unpaid: your provider decides it from the chain
|
|
311
313
|
[J13]. If the testnet DEX has no USDC for sale, nothing is paid: try again later, or pay with `stellar-pay` from a
|
|
312
314
|
test wallet of your own, funded at [faucet.circle.com](https://faucet.circle.com) (setup guide §6).
|
|
@@ -50,6 +50,10 @@ Every check that ran passed.
|
|
|
50
50
|
Exit codes: `0` every check that ran passed, `1` a check or the command failed, `2` a usage error. `--json` prints
|
|
51
51
|
the report, or the receipt, on standard output. `watch` runs until SIGINT or SIGTERM, then exits `0`.
|
|
52
52
|
|
|
53
|
+
The paid checks poll an uncertain job within their existing follow deadline, allowing the provider to reconcile
|
|
54
|
+
it from the chain [J13]. They read the original job and never sign or send another payment while waiting [J11].
|
|
55
|
+
Unresolved uncertainty is skipped and earns no paid check.
|
|
56
|
+
|
|
53
57
|
As a library:
|
|
54
58
|
|
|
55
59
|
```ts
|