Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Instructions for AI coding agents working in any Kinlock repository. Humans may read it too.

Kinlock lets **anyone, anywhere lock USDC on Stellar (Soroban) for a verified school or landlord anywhere in the world.** A sender locks funds to a verified payee (School or Rent), and funds can only go to that payee's payout address or back to the sender. The product is **worldwide by design and launched market by market**: nothing in the code is tied to one country. It handles other people's money, so **correctness and restraint matter more than speed or cleverness.**
Kinlock lets **anyone, anywhere lock USDC on Stellar (Soroban) for a verified payee anywhere in the world.** A sender locks funds to a verified payee (School or Rent), and funds can only go to that payee's payout address or back to the sender. The product is **worldwide by design and launched market by market**: nothing in the code is tied to one country. It handles other people's money, so **correctness and restraint matter more than speed or cleverness.**

Docs version this file was written against: **v0.3** (`PRD.md`, `ARCHITECTURE.md`, `ARCHITECTURE_ESSENTIALS.md`).

Expand Down
3 changes: 2 additions & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

| | |
|---|---|
| **Last updated** | 2026-10-08 (M3-13 receipt + verify pages; documentation-hub link) |
| **Last updated** | 2026-10-08 (wording: "verified payee" replaces "school or landlord") |
| **Docs baseline** | v0.3, worldwide scope (`PRD.md`, `ARCHITECTURE.md`, `ARCHITECTURE_ESSENTIALS.md`, `AGENTS.md`, `CLAUDE.md`, `project_structure.md`) |
| **Current phase** | Phase 0 (Foundations) → starting Phase 1 (M0 Validate) |
| **Readiness** | See [§3](#3-progress-snapshot) |
Expand Down Expand Up @@ -523,6 +523,7 @@ Newest first. One entry per PR. Required for every contribution (see §2).

| Date | PR / ref | Repo | Rows touched | Summary |
|---|---|---|---|---|
| 2026-10-08 | `docs/verified-payee-wording` | app | no row changes | Synced `AGENTS.md`/`docs/PRD.md`/`docs/ARCHITECTURE_ESSENTIALS.md` from `Kinlock-Org/.github` (`scripts/sync-docs.sh`), and updated `messages/en.json` (`app.tagline`, `pages.home.heroHeadline`/`heroSubtext`/`lockBody`/`sendersBody`, `pages.send.intro`): "a verified school or landlord" replaced with "a verified payee" everywhere it was used as a generic stand-in for the product's reach, rather than naming the two current MVP categories factually. Verified: `pnpm lint`, `pnpm typecheck`, `pnpm test` (92/92, including the inline-strings guard) all green. Canonical doc source edited in `.github` PR #23 |
| 2026-10-08 | `feat/m3-13-receipt-verify` | app | DONE: M3-13 | Built `/r/[txHash]/[eventIndex]` and `/verify`, replacing their `PageStub`s. Both call the SDK's `verifyReceipt` (chain-authoritative tiered verification) and show "Valid"/"Not valid"; the "Payment to verified payee" headline (hard rule 7) renders only when `result.valid` is actually `true`. A separate `getLock` read is used purely to label the asset (code and issuer) since `VerifyReceiptResult.receipt` doesn't carry the token; falls back to an unlabeled amount rather than guessing when that lock is unavailable. New shared pieces: `lib/receipts/parse.ts` (pure link/hash parsing, unit-tested), `lib/receipts/receipt-text.ts` (message-key mapping), `components/receipts/ReceiptResult.tsx` (shared result view for both pages). Verified: `pnpm lint`, `pnpm typecheck`, `pnpm test` (92/92 passed, including new `parse.test.ts`), `pnpm build` all green |
| 2026-10-08 | `docs/link-doc-hub` | app | no row changes (org row W-10 tracked in `.github`) | Linked `Kinlock-Org.github.io` (the org's documentation-issue hub) from README, with `area:app` |
| 2026-10-08 | `docs/docs-site-link` | app | no row changes (org row W-10 tracked in `.github`) | Linked the new hosted docs site (`kinlock-org.github.io`) from README |
Expand Down
2 changes: 1 addition & 1 deletion docs/ARCHITECTURE_ESSENTIALS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
> If code and this file disagree, stop and flag it. Don't silently pick one.

## 1. What this is
- **Anyone, anywhere can lock USDC on Stellar/Soroban for a verified school or landlord anywhere in the world.** Worldwide by design, launched market by market.
- **Anyone, anywhere can lock USDC on Stellar/Soroban for a verified payee anywhere in the world.** Worldwide by design, launched market by market.
- A sender locks funds to a **verified payee** (School or Rent) in a **supported country**.
- Funds go only to the payee's **snapshotted payout address** or back to the sender.
- Receipts prove **payment to a verified payee**. They do **not** prove service delivery.
Expand Down
6 changes: 3 additions & 3 deletions docs/PRD.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
| **Companion docs** | `ARCHITECTURE.md`, `ARCHITECTURE_ESSENTIALS.md` |

### What changed in v0.3 (worldwide scope)
- **Product is no longer "abroad → Nigeria".** Any sender, anywhere, can lock USDC for a verified school or landlord anywhere in a **supported country**. Domestic payments (sender and payee in the same country) are in scope.
- **Product is no longer "abroad → Nigeria".** Any sender, anywhere, can lock USDC for a verified payee anywhere in a **supported country**. Domestic payments (sender and payee in the same country) are in scope.
- **Worldwide by design, launched market by market.** The core stays country-agnostic: no country, currency, or anchor is hard-coded in the contract, SDK, indexer, or app. Country and local currency are **registry data** (ISO 3166-1 and ISO 4217).
- **Supported-countries list** (REG-9), enforced in registry CI and app policy, set with counsel. It is **not** enforced on-chain (§9.1 B19).
- **Naira-specific items generalized:** indicative **local-currency** equivalent (SND-4), per-market cash-out routes (PAY-5), per-market legal review.
Expand All @@ -35,7 +35,7 @@

## 1. Summary

**Kinlock lets anyone, anywhere lock USDC on Stellar (Soroban) for a verified school or landlord anywhere in the world.**
**Kinlock lets anyone, anywhere lock USDC on Stellar (Soroban) for a verified payee anywhere in the world.**

In more detail: a sender locks USDC to a **verified payee** (a school or landlord) for a declared purpose. The funds can only be released to that payee, or returned to the sender if unclaimed or if the payee is revoked. Each release yields a **receipt anyone can verify on-chain**.

Expand All @@ -46,7 +46,7 @@ Kinlock is non-custodial: a Soroban contract holds locked balances and no Kinloc
**What Kinlock proves:** a specific amount of USDC reached a payee that a named attester verified, at a specific time, for a specific reference.
**What Kinlock does not prove:** that the school credited the student, or that the landlord applied the rent. Optional payee acknowledgment narrows this gap (LCK-10) but cannot close it.

**MVP in one sentence:** a sender locks USDC to a registered school or landlord, the payee releases it in tranches, and anyone can verify the payment on-chain.
**MVP in one sentence:** a sender locks USDC to a registered payee, the payee releases it in tranches, and anyone can verify the payment on-chain.

## 2. Problem

Expand Down
12 changes: 6 additions & 6 deletions messages/en.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"app": {
"name": "Kinlock",
"tagline": "Money that can only reach the school or landlord it was meant for."
"tagline": "Money that can only reach the verified payee it was meant for."
},
"common": {
"testnetBanner": "Testnet only. No real money moves here.",
Expand Down Expand Up @@ -35,18 +35,18 @@
"pages": {
"home": {
"title": "Kinlock",
"heroHeadline": "Money that can only reach the school or landlord it was meant for.",
"heroSubtext": "Lock USDC on Stellar for a verified school or landlord, anywhere in the world. Nothing else can reach it.",
"heroHeadline": "Money that can only reach the verified payee it was meant for.",
"heroSubtext": "Lock USDC on Stellar for a verified payee, anywhere in the world. Nothing else can reach it.",
"heroCta": "Send a payment",
"howItWorksHeading": "How it works",
"lockTitle": "Lock",
"lockBody": "You lock USDC for a verified school or landlord. The payout address is fixed at that moment. Nobody can redirect it later.",
"lockBody": "You lock USDC for a verified payee. The payout address is fixed at that moment. Nobody can redirect it later.",
"claimTitle": "Claim",
"claimBody": "The payee claims it directly, on the schedule you set. No one else, including Kinlock, can touch it.",
"verifyTitle": "Verify",
"verifyBody": "Anyone can check the payment on chain. The receipt says exactly one thing: payment to verified payee.",
"sendersHeading": "For senders",
"sendersBody": "Pay a school or landlord for someone else, anywhere. Set a schedule instead of one lump sum, and get a receipt you can check yourself.",
"sendersBody": "Pay a verified payee for someone else, anywhere. Set a schedule instead of one lump sum, and get a receipt you can check yourself.",
"sendersCta": "Send a payment",
"payeesHeading": "For payees",
"payeesBody": "Get verified once, then receive payments directly, without a bank account in the sender's country. Decline any payment before you claim it.",
Expand Down Expand Up @@ -92,7 +92,7 @@
},
"send": {
"title": "Send a locked payment",
"intro": "Lock USDC for a verified school or landlord. It can only be paid to them, or come back to you.",
"intro": "Lock USDC for a verified payee. It can only be paid to them, or come back to you.",
"prefilled": "Filled in from a payment request. Check everything before sending: the request can't move money.",
"prefillUnknownPayee": "The payee in this request isn't available right now (not verified or not active). Don't send until you've checked with them.",
"payeeLabel": "Who you're paying",
Expand Down
Loading