Skip to content

Rewrite V2 SDK Getting Started pages#23

Merged
A1igator merged 23 commits into
mainfrom
vraspar/docs-getting-started-v2
Mar 31, 2026
Merged

Rewrite V2 SDK Getting Started pages#23
A1igator merged 23 commits into
mainfrom
vraspar/docs-getting-started-v2

Conversation

@vraspar

@vraspar vraspar commented Mar 29, 2026

Copy link
Copy Markdown
Contributor

Summary

Replaces PR #18 with a full rewrite of the 4 Getting Started pages following the new DOCS_WRITING_GUIDE anti-slop rules.

What changed:

  • sdk/overview.mdx — landing page feel, leads with x402 vs x402r contrast, real chain tables
  • sdk/installation.mdx — shortest page on the site, jumps straight to install command
  • sdk/create-client.mdx — decision tree between createX402r() and role presets, config reference
  • sdk/typescript.mdx — reference sheet with role narrowing tables verified against types.ts
  • docs.json — adds create-client and typescript to Getting Started nav, removes concepts and limitations

Writing approach:

  • Every opening answers "why would I read this?" not "what is this page about?"
  • Code first, prose annotates only non-obvious behavior
  • Real addresses from config/index.ts, not placeholders
  • Structural variety: each page has a different feel (landing page / quick-start / decision tree / reference sheet)
  • All signatures verified against x402r-sdk/packages/sdk/src/types.ts

Test plan

  • npx mintlify broken-links passes
  • Anti-slop grep (no banned words: powerful, seamless, robust, allows you to, etc.)
  • All function signatures match types.ts
  • Role narrowing tables match Pick types (lines 235-379)
  • getChainConfig confirmed re-exported from @x402r/sdk
  • Preview deploy renders correctly

🤖 Generated with Claude Code

vraspar and others added 10 commits March 28, 2026 16:56
Replace mechanical AI-generated pages with docs that lead with
motivation, use real addresses, and vary structure per page type:
- overview: landing page with x402 vs x402r contrast
- installation: shortest page, straight to install command
- create-client: decision tree between full client and role presets
- typescript: reference sheet with role narrowing tables

Follows DOCS_WRITING_GUIDE.md anti-slop rules. All signatures
verified against types.ts. Broken-links check passes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Hide stale V1 pages (Merchant, Client, Arbiter, Facilitator, Experimental
groups) from the sidebar. Files remain on disk for the cleanup PR which
will delete them and add redirects.

SDK tab now shows only V2 Getting Started pages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace descriptive reference pages with code-heavy tutorials
matching the x402 getting-started pattern:

- overview: brief intro + links to quickstarts
- merchant-quickstart: install → deploy → create client → authorize → release
- payer-quickstart: create client → check state → request refund → freeze → evidence

Numbered steps, mostly code, minimal prose between blocks.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add no-em-dash and CodeGroup rules to CLAUDE.md
- Replace all em dashes with commas, periods, or rewrites
- Wrap all install commands in CodeGroup (npm/pnpm/bun)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- arbiter-quickstart: 8 numbered steps covering dispute review,
  approve/deny, unfreeze, and fee distribution
- examples: links to all SDK examples with run commands
- deploy-operator: fix V2 API (chainId instead of network string),
  add refundRequest/evidence to return type, fix broken nav links
- docs.json: add arbiter quickstart + Resources group

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add icons to all quickstart pages (store, user, gavel)
- Rename "SDK Overview" to "Overview"
- Add arbiter to overview's Quickstarts CardGroup
- Remove Summary sections (just repeat the steps)
- Remove References sections (npm/GitHub links)
- Replace Next Steps bullet lists with CardGroup cards
- Remove duplicate network table from deploy-operator,
  link to overview as single source of truth

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Merchant: Deploy Operator (full config), Protocol Overview, Examples
- Payer: Arbiter Quickstart (what happens to your refund), Protocol Overview, Examples
- Arbiter: Deploy Operator (how you're configured), Smart Contracts (access control), Examples

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
viem is a regular dependency of @x402r/sdk (not a peer dep),
so it installs automatically. No need to list it explicitly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Deploy is a one-time setup (has its own page). Authorization is
handled by the payer/facilitator, not the merchant directly.
Merchant quickstart now starts from "payment arrived in escrow"
which is the merchant's actual first interaction.

Install simplified to just @x402r/sdk.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@vraspar

vraspar commented Mar 29, 2026

Copy link
Copy Markdown
Contributor Author

Code review

Found 8 issues:

  1. Broken code fence in merchant-quickstart.mdx -- a ```typescript block opens at line 62, then another ```typescript opens at line 68 without closing the first. This will break Mintlify rendering, showing raw fence characters instead of a code block.

```typescript
import type { PaymentInfo } from '@x402r/sdk'
// paymentInfo comes from the facilitator callback or your payment records
const paymentInfo: PaymentInfo = { /* ... */ }
```typescript
const amounts = await merchant.payment.getAmounts(paymentInfo)
console.log('Collected:', amounts.hasCollectedPayment) // true
console.log('Capturable:', amounts.capturableAmount) // 1000000n
console.log('Refundable:', amounts.refundableAmount) // 1000000n
const inEscrow = await merchant.escrow?.isDuringEscrow(paymentInfo)
console.log('In escrow:', inEscrow) // true
```

  1. MarketplaceOperatorDeployment interface and code example use wrong field names (SDK source of truth: x402r-sdk/packages/core/src/deploy/presets.ts) -- The documented interface at lines 139-155 and the console.log example at lines 120-121 have multiple mismatches with the actual SDK type: summary.newDeployments should be summary.newCount, summary.existingContracts should be summary.existingCount, txHashes is inside summary not top-level, and arbiterConditionAddress does not exist on MarketplaceOperatorDeployment (it belongs to a different deployment type).

console.log('Freeze:', result.freezeAddress)
console.log('New deployments:', result.summary.newDeployments)
console.log('Existing (reused):', result.summary.existingContracts)
```
## Configuration Options
| Option | Type | Description |
|--------|------|-------------|
| `feeRecipient` | `Address` | Address that receives operator fees |
| `arbiter` | `Address` | Arbiter address for dispute resolution |
| `escrowPeriodSeconds` | `bigint` | Escrow waiting period (e.g., `604800n` for 7 days) |
| `freezeDurationSeconds` | `bigint` | How long freezes last. Default: `0n` (permanent until unfrozen) |
| `operatorFeeBps` | `bigint` | Fee in basis points. Default: `0n` (no fee). `100n` = 1% |
## Deployment Result
The `deployMarketplaceOperator` function returns:
```typescript
interface MarketplaceOperatorDeployment {
operatorAddress: Address; // The PaymentOperator
escrowPeriodAddress: Address; // EscrowPeriod recorder/condition
freezeAddress: Address; // Freeze condition
refundRequestAddress: Address; // RefundRequest recorder
refundRequestEvidenceAddress: Address; // Evidence storage
arbiterConditionAddress: Address; // StaticAddressCondition for arbiter
refundInEscrowConditionAddress: Address; // OR(Receiver, Arbiter)
feeCalculatorAddress: Address | null; // null if no fee
txHashes: Hash[]; // All deployment tx hashes
summary: {
newDeployments: number; // Newly deployed contracts
existingContracts: number; // Reused existing contracts
};
}
```

  1. Em dashes in 8+ locations across new files (CLAUDE.md says "Never use em dashes. Use a comma, period, or rewrite the sentence instead.") -- sdk/create-client.mdx lines 7, 32, 69, 85, 114; sdk/installation.mdx line 36; sdk/typescript.mdx lines 46, 51. Notably, this PR adds the em dash rule to CLAUDE.md while violating it in the same changeset.

The SDK creates clients two ways: `createX402r()` gives you every action group with no type restrictions. The role presets — `createPayerClient()`, `createMerchantClient()`, `createArbiterClient()` — narrow TypeScript types so you only see methods relevant to your role.

  1. "Merchants authorize payments" is factually incorrect -- overview.mdx line 11 says "Merchants authorize payments into escrow." Per the x402 payment flow: the payer signs the ERC-3009 authorization, the facilitator submits it on-chain. The merchant does not authorize. Similarly, create-client.mdx line 32 says "payers don't authorize payments, merchants do" which inverts the actual flow.

docs/sdk/overview.mdx

Lines 10 to 12 in 8a2b99f

- **Merchants** authorize payments into escrow and release funds after delivery
- **Payers** can request refunds, freeze payments, and submit evidence during disputes

  1. viem incorrectly described as a peer dependency -- installation.mdx line 19 says "viem, the only peer dependency" and adds it to the install command. But @x402r/sdk/package.json lists viem under dependencies (not peerDependencies), so it installs automatically. A previous commit (fecbb68) deliberately removed viem from install commands for this exact reason.

</CodeGroup>
This installs the full SDK and [viem](https://viem.sh), the only peer dependency.

  1. @x402r/evm incorrectly described as a peer dependency of @x402r/helpers -- installation.mdx line 51 says "@x402r/evm is a peer dependency of @x402r/helpers." The actual @x402r/helpers/package.json only declares @x402/core as a peer dependency. @x402r/evm is not a peer dep.

<Note>
`@x402r/evm` is a peer dependency of `@x402r/helpers`. It provides escrow scheme types used by the `refundable()` helper.
</Note>

  1. Monad USDC address has wrong EIP-55 checksum (contract address source of truth: x402r-sdk/packages/core/src/config/index.ts) -- overview.mdx line 89 has ...BC8a327... (lowercase a), but the SDK source has ...BC8A327... (uppercase A).

docs/sdk/overview.mdx

Lines 88 to 90 in 8a2b99f

| Avalanche C-Chain | `43114` | `0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E` |
| Monad | `143` | `0x754704Bc059F8C67012fEd69BC8a327a5aafb603` |
| Linea | `59144` | `0x176211869cA2b568f2A7D4EE941E073a821EE1ff` |

  1. create-client, typescript, and installation pages missing from nav -- All three files are created or modified in this PR, but none appear anywhere in docs.json. They are orphaned pages that users cannot discover from the sidebar.

docs/docs.json

Lines 1 to 10 in 8a2b99f

{
"$schema": "https://mintlify.com/docs.json",
"theme": "mint",
"name": "x402r Documentation",
"colors": {
"primary": "#16A34A",
"light": "#07C983",
"dark": "#15803D"
},
"favicon": "/favicon.svg",

🤖 Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

vraspar and others added 3 commits March 29, 2026 00:00
Review fixes:
1. Fix broken code fence in merchant-quickstart (nested opening)
2. Fix MarketplaceOperatorDeployment interface to match source:
   summary.newCount/existingCount, txHashes inside summary,
   remove non-existent arbiterConditionAddress
3. Delete orphaned pages (create-client, installation, typescript)
   that were not in nav, fixing em dash violations in those files
4. Fix "merchants authorize" to "merchants receive" in overview
   (payer signs, facilitator submits, not the merchant)
5. Fix Monad USDC checksum (lowercase a to uppercase A)
6. Redirect 7 broken /sdk/installation links to /sdk/overview

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- arbiter-quickstart: landing page explaining both models with
  comparison table, links to the two tutorials
- arbiter-dispute: existing dispute flow (moved from arbiter-quickstart)
- arbiter-delivery: new page for automated evaluation flow using
  deployDeliveryProtectionOperator() and forwardToArbiter()
- overview: add "Two Operator Models" section
- docs.json: add arbiter-dispute and arbiter-delivery to nav

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the placeholder extractPaymentInfo() with the real SDK helpers:
- parseForwardedPayload() for typed PaymentInfo extraction
- fromNetworkId() for CAIP-2 chain ID parsing
- createArbiterClient() instead of full createX402r()

Closes x402r-sdk#100

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@vraspar

vraspar commented Mar 31, 2026

Copy link
Copy Markdown
Contributor Author

Code review (re-review after updates)

Previous 8 issues are all fixed. Found 7 new issues, mostly in the new arbiter-delivery.mdx page:

  1. RefundRequestStatus enum comment is wrong in two files. Status 3 is Cancelled (not Refused), and status 4 (Refused) is missing entirely. Actual SDK enum: Pending: 0, Approved: 1, Denied: 2, Cancelled: 3, Refused: 4. (SDK source: x402r-sdk/packages/core/src/actions/refund/types.ts)

console.log('Amount:', request?.amount)
console.log('Status:', request?.status) // 0 = Pending, 1 = Approved, 2 = Denied, 3 = Refused
}

const status = await payer.refund?.getStatus(paymentInfo)
console.log('Status:', status) // 0 = Pending, 1 = Approved, 2 = Denied, 3 = Refused
```

  1. deployDeliveryProtectionOperator is not exported from @x402r/core's public API. It exists in core/src/deploy/presets.ts and is re-exported from core/src/deploy/index.ts, but core/src/index.ts does not include it. Only deployMarketplaceOperator and deployArbiterSetup are in the public surface. This import will fail.

```typescript
import { deployDeliveryProtectionOperator } from '@x402r/core'

  1. "CREATE2" should be "CREATE3" in two places. The project uses unified CREATE3 addresses across all chains. (CLAUDE.md memory: "unified CREATE3 -- same addresses on every chain"; SDK config comments: "Unified CREATE3 addresses")

All contracts are deployed via factories using CREATE2, so identical configurations produce identical addresses across deployments.

<Tip>
Because all contracts use CREATE2, redeploying with the same parameters is idempotent it will detect existing contracts and skip them. The `summary` tells you what was new vs reused.
</Tip>

  1. extractPaymentInfo(paymentPayload) does not exist anywhere in the SDK. This is an invented function with no import statement. (CLAUDE.md says "Test all code examples before including")

// Extract paymentInfo from paymentPayload
const paymentInfo = extractPaymentInfo(paymentPayload)
const amounts = await arbiter.payment.getAmounts(paymentInfo)

  1. CommerceEvmScheme is the client-side class (from @x402r/evm/commerce/client), not the server-side class needed for a resource server. Additionally, neither x402ResourceServer nor CommerceEvmScheme are imported -- only forwardToArbiter is imported in this code block.

```typescript
import { forwardToArbiter } from '@x402r/helpers'
const resourceServer = new x402ResourceServer(facilitatorClient)
.register(networkId, new CommerceEvmScheme(serverConfig))
.onAfterSettle(
forwardToArbiter('http://your-arbiter:3001', {
onError: (err) => console.error('Arbiter unreachable:', err),

  1. Merchant Quickstart card says "Authorize payments, release funds from escrow." Merchants do not authorize payments -- payers sign authorizations, facilitators submit them. The overview.mdx card for the same page correctly says "accept a payment."

<Card title="Merchant Quickstart" icon="store" href="/sdk/merchant-quickstart">
Authorize payments, release funds from escrow.
</Card>

  1. Card title still says "SDK Installation" but href was updated to /sdk/overview. All other similar cards in this PR were updated to "SDK Overview."

<Card title="SDK Installation" icon="rocket" href="/sdk/overview">
Get started building with x402r.

🤖 Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

Nav changes:
- "Getting Started" renamed to "Marketplace" (it is the marketplace flow)
- New "Delivery Protection" section with overview, merchant, arbiter pages
- New "Resources" section with create-client, deploy-operator, examples

Page changes:
- arbiter-quickstart: flattened back to dispute resolution content
- delivery-protection: overview with comparison table
- delivery-merchant: deploy operator + forwardToArbiter() setup
- delivery-arbiter: build arbiter service + parseForwardedPayload()
- create-client: broad reference for createX402r / role presets / config

Review fixes:
- RefundRequestStatus: 3=Cancelled, 4=Refused (was wrong)
- CREATE2 -> CREATE3 in deploy-operator (2 places)
- CommerceEvmScheme -> registerCommerceEvmScheme (server-side)
- "Authorize payments" -> "Accept payments" on merchant card
- "SDK Installation" -> "SDK Overview" on protocol card
- Created x402r-sdk#102 for missing deployDeliveryProtectionOperator export

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@vraspar

vraspar commented Mar 31, 2026

Copy link
Copy Markdown
Contributor Author

Code review (round 3)

All 7 issues from round 2 are fixed. Found 4 new issues:

  1. fromNetworkId is imported from @x402r/sdk but is not exported from that package. It is only exported from @x402r/core. This import will fail. (Verified against x402r-sdk/packages/sdk/src/index.ts and packages/core/src/index.ts)

import { privateKeyToAccount } from 'viem/accounts'
import { createArbiterClient, fromNetworkId } from '@x402r/sdk'

  1. payment.authorize() is described as "a merchant action" but per the x402 payment flow, the payer signs the ERC-3009 authorization and the facilitator submits it. Saying it is a "merchant action" inverts who holds signing authority. Consider: "that method is not part of the payer role" or similar.

`createPayerClient` restricts TypeScript types to payer-relevant methods. `refund.request()` shows up in autocomplete; `payment.authorize()` does not because that is a merchant action.

  1. The forwarded payload JSON shape in delivery-merchant.mdx shows paymentPayload: { x402Version, scheme, payload: "..." } (flat structure), but delivery-arbiter.mdx uses parseForwardedPayload() which extracts paymentInfo and network as top-level return fields parsed from paymentPayload.accepted.network and paymentPayload.payload.paymentInfo. The two pages document different schemas for the same POST body, so a developer following both will hit a mismatch.

```json
{
"responseBody": "the HTTP response body as a string",
"transaction": "0xsettlement_tx_hash",
"paymentPayload": { "x402Version": 1, "scheme": "commerce", "payload": "..." }
}

app.post('/verify', async (req, res) => {
const { responseBody, paymentInfo, network, transaction } =
parseForwardedPayload(req.body)
const chainId = fromNetworkId(network) // "eip155:84532" -> 84532

  1. Two sentences in deploy-operator.mdx have double spaces where em dashes were removed, producing broken prose. (CLAUDE.md says "Never use em dashes. Use a comma, period, or rewrite the sentence instead." -- the em dashes were removed but replaced with whitespace, not punctuation.)

Edit `.env` with your values. Only `PRIVATE_KEY` is required everything else has sensible defaults:

<Tip>
Because all contracts use CREATE3, redeploying with the same parameters is idempotent it will detect existing contracts and skip them. The `summary` tells you what was new vs reused.
</Tip>

🤖 Generated with Claude Code

- If this code review was useful, please react with 👍. Otherwise, react with 👎.

vraspar and others added 9 commits March 31, 2026 01:19
Nav restructure:
- Overview is now top-level (not under Marketplace)
- "Quickstart for X" removed everywhere. New titles:
  Merchant Guide, Payer Guide, Arbiter Guide
- Files renamed: merchant.mdx, payer.mdx, arbiter.mdx

Install fixes:
- delivery-merchant: @x402r/core @x402r/helpers (dropped @x402r/sdk,
  merchant doesn't create SDK client on this page)
- delivery-arbiter: @x402r/sdk @x402r/helpers (dropped express)
- overview: @x402r/helpers only (dropped @x402r/evm)

Review fixes (round 3):
1. fromNetworkId imported from @x402r/core (not exported from sdk)
2. "merchant action" reworded to "not part of the payer role"
3. Payload JSON shape fixed to show actual nested structure
4. Double spaces in deploy-operator replaced with punctuation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Factual fixes:
- Add SKALE Base to chain table (chainId: 1187947933)
- Remove outdated #102 note from delivery-merchant
- Add deployDeliveryProtectionOperator section to deploy-operator
- Fix double spaces in deploy-operator (em dash remnants)

Remove repeated boilerplate:
- Type narrowing explanation removed from merchant, payer, arbiter
  (function names are self-explanatory, create-client has reference)
- Install CodeGroup trimmed to one-liner in marketplace role guides

Add Mintlify warnings:
- Merchant: release() reverts during escrow
- Payer: freeze() blocks release, timing note for escrow window
- Arbiter: refundInEscrow() auto-approves (no undo), deny vs refuse
- Delivery merchant: forwardToArbiter is fire-and-forget
- Delivery arbiter: service downtime means no evaluation

Nav: deploy-operator top-level, Resources -> Reference,
create-client title -> Client Configuration

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Empty group name caused Mintlify to not resolve a default page
for the SDK tab. Named it "Getting Started".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- create-client title: "Create x402r Client" (was "Client Configuration")
- deploy-operator: collapse reference sections into Accordions
  (deployment result type, preview addresses, slot configs)
  Keeps the main deploy flow visible, hides detail until needed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The entire "Deploy Your Operator" Steps section (clone, .env.example,
pnpm start, deploy-short-escrow.ts) referenced a deploy-operator
example directory that does not exist in the SDK. Removed all
fabricated content. The SDK programmatic deployment code remains.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Deploy is already on the deploy-operator page. Link there instead
of repeating 30 lines of deploy code. Page now focuses on what
the merchant actually does: configure forwardToArbiter().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Merchant, payer, and arbiter had bare npm install without
pnpm/bun tabs. Now consistent with all other pages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@A1igator A1igator self-requested a review March 31, 2026 09:08
@A1igator A1igator merged commit f158e54 into main Mar 31, 2026
2 checks passed
@A1igator A1igator deleted the vraspar/docs-getting-started-v2 branch March 31, 2026 09:08
A1igator added a commit that referenced this pull request Jun 1, 2026
)

## Summary

Consolidates all 14 open Mintlify bot PRs into a single PR for review.
Merged oldest-first with `--no-ff -X theirs` so each PR's intent is
preserved as a discrete merge commit and later PRs supersede earlier
ones where they overlap.

## Consolidated PRs

| # | Title |
|---|---|
| #19 | Update SDK docs for @x402r/sdk API and new chain support |
| #20 | Sync SDK docs with contracts v3 API |
| #21 | Replace `refundable()` with `forwardToArbiter()` in SDK docs |
| #22 | Add delivery protection operator docs, fix marketplace operator
signature |
| #24 | Add `forwardToArbiter` docs and named address constants |
| #25 | Document `DeliveryProtectionOperator` preset exports |
| #26 | Update delivery protection SDK docs for v2 |
| #27 | Remove `ArbiterRegistry` references from SDK docs |
| #28 | Add ERC-8004 plugin docs to SDK reference |
| #29 | Update SDK docs to match `@x402r/sdk` 0.2.x API |
| #30 | Add ERC-8004 helpers and `identity.check()` SDK docs |
| #31 | Fix broken internal links in cursor AI tools guide |
| #32 | Add `@x402r/cli` documentation |
| #33 | Document commerce-payments v1 addresses, remove SKALE Base |

## Conflict resolutions

The V2 SDK Getting Started rewrite (#23) landed on `main` after most of
these PRs were opened, so several conflicts had to be resolved:

- **`sdk/installation.mdx`** — V2 rewrite intentionally deleted this
file. Kept the deletion; dropped PR #19, #20, and #24 modifications.
- **`sdk/helpers/refundable.mdx`** — PR #21 deletes this page (replaces
with `forward-to-arbiter.mdx`). Accepted the deletion; later PRs that
modified `refundable.mdx` (PR #24) had their refundable-touching parts
dropped.
- **`docs.json`** — V2 rewrite kept `sdk/helpers/refundable` in nav. PR
#21's `theirs`-strategy merge added `forward-to-arbiter` but the V2
entry for `refundable` was preserved as a dangling reference. Removed in
the final fix commit so the Mintlify build doesn't fail.
- **All other content conflicts** — resolved with `-X theirs` (incoming
Mintlify PR wins). Newer PRs in the chronological merge order override
older PRs where they touch the same lines.

## Verification

- `python3 -m json.tool docs.json` — valid JSON
- All deleted-file references checked: no remaining links to
`sdk/installation` or `sdk/helpers/refundable`
- Diff stat: 29 files changed, ~2,332 insertions, ~2,091 deletions

## Next steps (for reviewer)

1. Skim merge commits in order to see what each upstream PR contributed.
2. After merging, close PRs #19-#22 and #24-#33 with a comment pointing
here.
3. Run `npx mint dev` locally to verify rendering before merging.

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants