Live pair-programming QA for the Christian-business directory with tithe tracking: guest browsing, accounts & listings, connect β sale pipeline, org verification & payouts, and security probes. Two testers β the agent (AD Dev) and Mike β execute the same steps with different accounts and data, compare results, and file GitHub issues for every mismatch.
[pair-test FLOW<STEP>] short summary β e.g. [pair-test C5] tithe amount rounds wrong on $7.50 sale.pair-test; file in microspaces/almightydollar-app.MEDIA: and committed under test-screenshots/pair-test/ on the session branch.| Thing | Value |
|---|---|
| Production web (read-only this session) | almightydollar.us β verified HTTP 200 + SPA loads 2026-09-27 (www too). Convex client baked into the bundle: useful-antelope-558.convex.cloud (verified in the deployed JS, not from docs). |
| Staging Convex (all writes) | upbeat-giraffe-329.convex.cloud β the backend the journey scripts already seed and test against (e.g. Faithful Electric Co. seeded 2026-09-24). |
| Staging web | Run locally against staging: cd ~/Repos/almightydollar-app && npm install && EXPO_PUBLIC_CONVEX_URL=https://upbeat-giraffe-329.convex.cloud npm run web β http://localhost:8081. Agent keeps one dev server running for the session; Mike uses the deployed prod site for his read-only checks and the agent's local server for staging writes. |
| Rule | Every write (signups, connects, sales, verifications) happens on staging. Prod gets read-only browsing only (Flow A1βA4), so no test rows land in production data. |
| Password reset / Resend | Only fires if RESEND_API_KEY is set on the staging Convex deployment; if unset the reset token is still created but no email is sent (code path warns and skips). B5 records which. |
pairtest.<step>.agent@example.com; Mike uses his own inbox with plus-tags (you+pairtestB1@β¦) so records are filterable. All accounts live on staging only.PairTest B2 <who> Community Church β agent sets tithe 15%, Mike sets 12%. Different percentages on purpose: the sale math in C5 must come out different for each tester, proving the % actually propagates.PairTest B3 <who> Services, affiliated with your own B2 org.PairTest / pairtest. β see the checklist at the bottom for what to remove at session end.Persona: a church member discovering local businesses. Read-only: A1βA4 on production, A5 on staging (agent's local server). Produces: nothing β this flow is pure observation, and it's the baseline everything else is compared against.
https://almightydollar.us fresh (hard reload), desktop.
https://www.almightydollar.us.Persona: three signups in one flow β customer, org admin, business owner. Feed data: none. Produces: the accounts and listings that Flows C and D use. Run on staging only.
pairtest.b1.agent@example.com, any password β₯ minimum, role lands as customer by default.
MikeSame with you+pairtestB1@β¦, and also try registering with an email that's already in the system (your own, twice).
pairtest.b2.agent@example.com, tithe 15%.
MikeSame with PairTest B2 Mike Community Church and tithe 12%.
org_admin (role auto-assignment on registration); tithe % saved as entered (15 / 12) and shown on the org dashboard.pairtest.b3.agent@example.com, affiliated with your own B2 org (org picker on the register form).
MikeSame with PairTest B3 Mike Services affiliated with your B2 org β and note whether the picker makes you pick one org or supports several.
business_owner; business appears in the directory immediately; the org affiliation links back to your B2 org (this is what makes the C5 tithe flow to the right org).RESEND_API_KEY on staging (see env table) β record which happened. If no email arrives, the token still exists server-side: that's the documented behavior, note it.Persona: customer connects, owner works the lead and records the sale. Feed data: B1 (customer), B3 (business + owner). Produces: a closed connection and a pending_verification sale that Flow D verifies. Run on staging.
pending and your chosen org. Second connect: either blocked with a clear message or allowed as a duplicate β record which; behavior is currently undocumented.pending β contacted β quoted, one tap each, watching the customer side between taps (customer's My Connections).
MikeSame; also try advancing a step backwards (quoted β contacted) if the UI allows it.
pending_verification, connection flips to closed.Persona: the church admin confirming real money arrived. Feed data: the B2 org admin account and the C5 sale. Produces: a verified + paid tithe, updated impact totals. Run on staging.
pending_verification. Nothing is auto-verified β verification is a human tap.verified (verifiedAt set); the amount moves into the org's pending-payout total; customer's Tithing History now shows the verified tithe.paid_to_org (paidAt set); org totals move from pending payout to paid out. This is the honor-system leg β no money moves, the app only records that it did.Persona: an adversarial user poking at the walls. Mike observes and re-runs the UI-only ones. These steps are expected to fail safely β a success is a critical finding.
organizations:bulkImport gate: confirm from the code path (convex/organizations.ts) that only platform admin role passes, and try to reach it with a non-admin session from the app.
useful-antelope-558 and staging writes never touched it β re-check the prod org directory before/after the session for pairtest rows.
MikeSpot-check prod once more at session end: search the directory for "PairTest".
Fill in during the session. "Match" = agent and Mike saw the same behavior. Every β /β row needs an issue link.
| Step | Agent | Mike | Match | Issue | Notes |
|---|---|---|---|---|---|
| A1 | prod, read-only | ||||
| A2 | |||||
| A3 | 29k orgs responsiveness | ||||
| A4 | guest gates | ||||
| A5 | staging wiring gate for BβE | ||||
| B1 | |||||
| B2 | 15% vs 12% on purpose | ||||
| B3 | |||||
| B4 | |||||
| B5 | Resend key gate | ||||
| C1 | duplicate-connect undocumented | ||||
| C2 | |||||
| C3 | backwards transition undocumented | ||||
| C4 | cross-pair cancel | ||||
| C5 | $37.50 / $14.40 expected | ||||
| C6 | 0/negative/huge/rounding | ||||
| D1 | |||||
| D2 | |||||
| D3 | honor-system leg | ||||
| D4 | rollup agreement | ||||
| D5 | verified-purchase badge | ||||
| E1 | token reuse / role walls | ||||
| E2 | server-side role checks | ||||
| E3 | bulkImport gate (fixed?) | ||||
| E4 | prod stays clean | ||||
| E5 | expired session |
PairTest prefix finds everything.test-screenshots/pair-test/) + this log's final state to the session branch.