@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stellar-agent-services/dev-mcp",
3
- "version": "0.1.0",
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.0",
36
- "@stellar-agent-services/verifier": "0.1.0",
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.0"
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:** Week 3. The protocol package, the Provider Kit (library, gateway mode, durable SQLite queue, CLI)
11
- and the payment client (core, `stellar-pay` CLI and a minimal web approval page) work end to end on testnet.
12
- Job Recovery is complete in code, reconciliation and the ledger clock included; the recorded testnet demo is
13
- still to do. The verifier is complete in code: checks C1–C7 with on-chain payment proofs, receipts, badges and
14
- `validation_response`, and `provider-kit request-validation` asks for it. A first testnet receipt and Validation
15
- Registry record are next.
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 different numbers in different sections. We plan against the reading that satisfies all of them.
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 completed user flows** (this also covers "two") |
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
- - [ ] One successful testnet payment flow, recorded (tx link, screenshots, short video).
390
+ - [x] One successful testnet payment flow, recorded ([video, screenshots and RPC proof](evidence/d1/README.md)).
387
391
  - [x] Testnet tx links.
388
- - [ ] Screenshots and the short video.
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
- - [ ] Record the recovery demo on testnet: one interrupted job, recovered, with exactly one on-chain transfer.
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
- - [ ] Validation Registry publishing: `request-validation` (provider) and `validation_response` (verifier) on testnet.
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
- - [ ] Run both on testnet for the sample provider: the first receipt and Validation Registry record.
449
- - [ ] Discovery integration, option (a) from §5.7, in `stellar-agent-search`.
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
- - [ ] Evidence page, demo videos, payment references, validation records, pilot report.
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
- - [ ] A lost response → recovery returns the stored result, with one on-chain transfer. (Provider side and the
489
- client's `recover()` are tested offline; the on-chain demo is Week 3.)
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 | Testnet discovery approach (§5.7) | Berkin | W2 |
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 | npm scope for publishing (placeholder `@stellar-agent-services/*`) | Berkin | W2 (first publish) |
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 |
@@ -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:** Week 3 of the plan. A paid call works end to end, from a provider (library or gateway mode, with a
22
- durable job queue) to the payment client's CLI and web page. Job Recovery is complete in code: providers decide
23
- uncertain payments from on-chain data ([docs/job-recovery.md](docs/job-recovery.md)). The verifier runs every check
24
- (C1–C7), proves payments on chain, and issues receipts, badges and Validation Registry responses
25
- ([docs/verification.md](docs/verification.md)). The plan is in
26
- [IMPLEMENTATION_PLAN.md](IMPLEMENTATION_PLAN.md). Development runs on Stellar **testnet**.
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 | Done, in review |
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 | Done, in review |
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 | Done, in review |
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, read through a risk-source interface once a Stellar ERC-8126 exists | unset |
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`. A job the provider marks `payment_uncertain` comes back at once: only the provider's
220
- reconciliation resolves it ([job-recovery.md](job-recovery.md#reconciliation)), so polling doesn't.
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 npm workspaces in this repository and are not yet published to npm. Clone the repository and
34
- run `npm install && npm run build`. Then build inside it, copy `examples/paid-service`, or link a package into
35
- another project with `npm install <repo>/packages/provider-kit`.
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
@@ -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
- - `minVerificationScore` and `stellar.minProviderLevel` are stored but not enforced.
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. If the answer to the paid request is lost, it
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