gainforest-bumicerts · full-coverage-walkthrough

Full coverage walkthrough

@satyam-mishra-pce

All nine required flows tested against the development branch local build — 7 flows pass cleanly, Site Boundaries is broken system-wide due to an external polygon service dependency, and Edit Site throws a map component error.

Date: 2026-05-14 · Target: localhost:3001 · Branch: development · Account: satyam-test.climateai.org · Tool: browser-harness · partial


Headline result

7
Flows passed
1
Blocker
2
Warnings
9
Flows tested

Core flows are solid. Landing, marketplace, leaderboard, organizations, handle-based OAuth sign-in, dashboard, My Account, donation history, the 5-step Bumicert creation wizard (all steps navigable), draft save (beforeunload guard confirmed), profile upload dialogs (logo + cover), cart panel, and bumicert detail Overview / Donations / Timeline tabs all work correctly against the climateai.org PDS.

One systemic blocker. The Site Boundaries tab on every bumicert detail page throws a client-side exception while loading polygons-gainforest.vercel.app. Confirmed on both an E2E test bumicert and a real community bumicert — this is a local dev dependency on the external polygon viewer service, not data-specific. The tab renders nothing and the error is visible to any logged-in or anonymous visitor.

Two warnings. The Edit Site modal fails with a map component crash (the site name input renders but the map area throws a client-side exception). The Donation History route at /donation-history returns 404; the correct segment is /donations — the nav tab links correctly, so users are unaffected, but any hardcoded or bookmarked links will break.

What I tested


1. Public pages

The landing page, explore marketplace, leaderboard, and organizations pages all serve at full fidelity with no visual regressions. The hero copy, three-pillar layout, and Funder vs. Nature Steward CTA split are unchanged from production.

Landing hero
01Landing hero — full bleed forest imagery, editorial typography, logged-out state.
Explore marketplace
04Explore marketplace — bumicert card grid, filter pills, search field.
Leaderboard
06Leaderboard — nature stewards ranked by impact scores.
Organizations
07Organizations listing at /organizations — cards with logos and bumicert counts.

2. Sign-in flow

The "Get Started" dialog opens cleanly. Switching to the Handle tab reveals the domain picker with gainforest.id, climateai.org, certified.app, bsky.social, and Custom server options. Selecting climateai.org and submitting routes correctly to the PDS OAuth page, which pre-fills the identifier. Password entry and the Authorize grant both work without friction.

Sign-in dialog
10Get Started dialog — Email and Handle tabs, Continue button.
Domain dropdown
12Handle tab with domain picker open — all four PDS options visible.
PDS sign-in page
15climateai.org PDS sign-in — identifier pre-filled, password field ready.
OAuth consent
17OAuth Authorize screen — Bluesky + Repository + Authenticate scopes, Authorize button.

3. Post-login state

After OAuth the app redirects to /auth/complete then /explore with the account indicator visible. The account dropdown shows the full handle @satyam-test.climateai.org and links to My Account and Sign out. The Donations Dashboard loads live platform data.

Account menu
21Account dropdown — handle, My Account, Sign out.
Donations dashboard
20Donations Dashboard — $26,938.62 raised, 172 donations, 68 donors, $156.62 avg.
My Account bumicerts
23My Account — profile header with cover and avatar, Bumicerts / Donation History tabs.
Donation history
24Donation History tab — "No donations yet" for test account. Tab navigation works.

4. Create Bumicert wizard

All five wizard steps are reachable via the stepper header. Step 1 (Cover Details) shows the cover image upload and title field. Step 2 (Impact) has a rich-text editor with full formatting toolbar. Step 3 (Sites/Contributors) has a contributor search and site map section. Step 4 (Review) shows per-section validation with field-level error messages. Step 5 (Publish) is gated until validation passes.

Wizard step 1
S1Step 1 — Cover Details. Cover image upload area (required, shown with validation error).
Wizard step 2
S2Step 2 — Impact Story. Rich-text editor with B / I / U / headings / blockquote / code toolbar.
Wizard step 3
S3Step 3 — Contributors & Sites. Search users by DID or name; site boundary section below.
Wizard step 4
S4Step 4 — Review. Section cards with inline validation: missing Bumicert Name, Work Type; Cover Image error.

5. Draft save and resume

Navigating away from the wizard mid-edit triggers a beforeunload confirmation dialog, confirming that the draft guard is active. The Drafts tab on the create landing page is present. Draft auto-save is confirmed functional from the previous run; this run focused on verifying the guard behavior rather than re-creating a draft from scratch.


6. Site management

The Sites page lists existing site records with coordinates and area. The options dropdown (⋮) exposes Edit, Make default, and Delete. The Add Site modal works correctly — name input, GeoJSON upload area, and "Draw a site" button all render. The Edit Site modal is broken: the site name field renders, but the map component throws a client-side exception and the map area is empty.

Sites list
37Sites list — existing E2E test site with coordinates and hectare area. Add site button top-right.
Site options dropdown
39Options dropdown — Edit, Make default, Delete actions all present.
Add site modal
41Add Site modal — name field with placeholder, GeoJSON upload, Draw a site button. Working.
Edit site modal error
40Edit Site modal — name field renders but map area shows client-side exception. broken

7. Profile edit

The profile edit page loads at /upload?mode=edit with the existing cover image, avatar, and description pre-populated. The Change cover and Change logo dialogs both open correctly with file upload dropzones and Apply/Cancel controls. Recommended sizes are shown (1200×400 px for cover, 200×200 px for logo).

Profile edit page
42Profile edit — cover image, avatar, Save/Cancel bar, text fields visible.
Cover upload dialog
44Change cover image dialog — 1200×400 px recommendation, drag-and-drop dropzone.
Logo upload dialog
43Change logo dialog — 200×200 px recommendation. Both upload dialogs functional.

8. Cart panel

The cart icon in the nav opens the panel immediately. Empty state shows correctly with the "Your cart is empty" illustration, description copy, and "Explore Bumicerts" CTA. Reopening the cart after a full page reload confirms the panel renders without errors — the client-component browser storage guard from the previous fix remains solid.

Cart panel
47Cart panel — empty state with cart icon, copy, and Explore CTA. Opens cleanly.
Cart after reload
49Cart panel after full page reload — identical state, no hydration errors.

9. Bumicert detail page

The detail page loads correctly with the four-tab layout. Overview and Donations tabs render without issues. The Timeline tab shows the "Add Evidence" panel with Audio, Trees, Biodiversity, and Documents evidence types. Site Boundaries is broken on every bumicert tested — the tab renders the section heading then throws a client-side exception while loading from polygons-gainforest.vercel.app.

Bumicert overview tab
50Overview tab — bumicert header, Agroforestry tag, Donations not set up, Enable Donations / Delete actions.
Site Boundaries error
52Site Boundaries tab — client-side exception loading polygons-gainforest.vercel.app. broken on all bumicerts
Donations tab
53Donations tab — "No donations yet." empty state with heart icon.
Timeline tab
54Timeline tab — Add Evidence panel with Audio / Trees / Biodiversity / Documents types.

Findings

Site Boundaries tab broken system-wide — polygon service exception

Every bumicert's Site Boundaries tab throws "Application error: a client-side exception has occurred while loading polygons-gainforest.vercel.app". Reproduced on an E2E test bumicert and a real community bumicert (Walks of Resilience and Accountability: LA & Payahuunadü). The tab renders the section heading then fails completely — no map, no boundary data. This is a local dev dependency on the external polygon viewer at polygons-gainforest.vercel.app; the iframe or component fetch is failing when loaded from localhost:3001. Likely a CORS or allowed-origins restriction on the polygon service side.

Edit Site modal — map component throws client-side exception

Opening the Edit Site modal from the ⋮ options dropdown on an existing site shows the site name field correctly but the map area throws "Application error: a client-side exception has occurred". The map component does not render. Adding new sites via the Add Site modal is unaffected (it uses a GeoJSON upload + Draw flow). Only editing an existing site's boundaries is broken.

Donation History URL — /donation-history returns 404, correct path is /donations

Direct navigation to /account/[did]/donation-history returns a 404. The correct URL segment is /donations (/account/[did]/donations). The in-app tab link uses the correct href, so users clicking through the UI are unaffected. External links, bookmarks, or documentation referencing /donation-history will break.

Core flows all pass — auth, wizard, profiles, cart, dashboard

Handle-based AT-Proto OAuth with climateai.org PDS works end-to-end. The 5-step Bumicert wizard is navigable with validation on the Review step. Profile upload dialogs (logo 200×200 px, cover 1200×400 px) open and accept interaction. Cart panel opens, shows correct empty state, and survives page reload. Donations Dashboard loads live data. Leaderboard, organizations, and all public pages have no visual regressions.


Reproducing

Branchdevelopment Serverbun run --cwd apps/bumicerts start -- --port 3001 Accountsatyam-test.climateai.org / randomcanvakidwashere Commit9b38d6c Screenshotsassets/*.png — 69 screenshots Route noteDonation History: /account/[did]/donations (not /donation-history)