Creative ideas + design notes
Commits with substantial prose (≥120 chars) — the rationale behind each move.
d2af7f0 · 2026-09-14 · costa-rica: fix broken eas submit ascApiKeyPath -> canonical /Users/macstudio3/private_keys/AuthKey_72Y2TZT54R.p8
The configured path ../nineoh-guide/.credentials/asc-api-key.p8 does not exist on
disk; a gated 'eas submit' would fail on it. Repointed to the canonical ASC API key
(same key id 72Y2TZT54R already in this file; nineoh committed precedent). Config-only,
reversible, no submit fired. TK-11730.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KoECqRCpUVbcsFegZ1Xp3e
e1ee39b · 2026-09-13 · TK-11518: the honest-copy rewrite introduced its own 2.3.1 claims
store/listing.md is the authoritative paste source, so two defects in it matter:
- Its note asserted 'REALITY: 4 real listings (Arenal Volcano Hike, Casa Manuel
Antonio, Nosara Yoga Institute, Tamarindo Surf School)'. Those four were
classified by NAME. places.source says all four are 'seed-demo', inserted by
scripts/seed.sql:41-58 as 'placeholders so UI renders something before scrape
lands real data'. Genuine curated inventory is zero.
- The body copy therefore makes false provenance claims -- 'hand-picked, not
scraped' and 'Every listing is reviewed by a human before it goes up' over a
catalog that is 8/8 machine-seeded -- and is coupled to the gated demo purge,
which deletes exactly the four destinations it names.
Body copy deliberately NOT rewritten: the right copy depends on inventory that
does not exist yet, and a speculative rewrite would create a fourth divergent
version. Warning banner added instead.
Docs/copy only. Undo: git revert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vbtgv1MuWftpd3hfWEiZYG
787b1cf · 2026-09-13 · TK-11518: kill the App Store paste traps + record the real ASC field state
Three paste sources existed for the same listing; the 2.3.1 fix (1576ed3/5904b9b)
landed only in store/listing.md, leaving the other two live.
- store/costa-rica-appstore-copy.md: marked SUPERSEDED. Its description still read
'Thousands of listings across all 7 provinces and 84 cantones' against a measured
live catalog of 8, plus Monteverde/Puerto Viejo (no listings) and restaurants +
local services (no such vertical). Withdrawn blocks kept as the record, never
pasteable. Only the ASC field checklist here is still usable.
- store/listing.md: records the ASC state measured read-only 2026-09-13 — ~13 unset
fields, not the 9 previously packeted, and flags that the store-visible name is the
placeholder 'Costa Rica (b9f8c9)'.
Docs/copy only. No code, no deploy, no ASC write. Undo: git revert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vbtgv1MuWftpd3hfWEiZYG
8ec16a5 · 2026-09-11 · eas: pin production ios.image=latest (ITMS-90725 guard)
Fleet sweep under TK-11155 found this app missing the guard that Charge & Explore
needed after sitting at 0 builds in ASC on an ITMS-90725 upload bounce. The
documented fix is exactly this line (Xcode 26 / iOS 26 SDK image), and the
chargeandexplore-release canary treats it as a HARD gate.
Cheap insurance: without it a production build can bounce on upload after the
EAS build has already been paid for.
Semantic diff confirms this adds build.production.ios.image only; nothing else
removed or changed. JSON re-validated.
Refs TK-11155.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1576ed3 · 2026-09-11 · Costa Rica listing: rewrite the copy to match the live catalog
Steve's call (TK-11518): hold the submission, soften the copy, populate real
inventory. This is the copy half.
The description promised a product that does not exist yet. Measured against
/api/app/listings and the source, the previous copy carried five separate
Guideline 2.3.1 exposures:
claim reality
"Thousands of listings" 8 listings (4 of them labelled DEMO)
"all 7 provinces and 84 cantones" 4 regions
"Monteverde, and Puerto Viejo" neither has a listing
"restaurants, and local services" verticals are tours/surf/short-rentals only
"an interactive map" no map in the binary (removed in 5904b9b)
Rewritten as an honest small-launch position: four named destinations, human-
reviewed listings, growing. Subtitle and promotional text corrected the same way
("Hotels, tours & local services" -> "Stays & tours in Costa Rica").
Every surviving claim was re-verified against the code or the live API: SINPE
(2 files), in-app messenger (5), Sign in with Apple (1 + expo-apple-authentication),
My Trips (2), booking (7), and "four destinations" against 4 live regions.
Lengths gated: subtitle 27/30, promo 142/170, description 1227/4000.
NOT submitting. Two things still gate a submission and both are content, not copy:
every listing has image_url null, and the 4 DEMO rows are still live in prod.
Refs TK-11518, TK-11155.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
5904b9b · 2026-09-11 · Costa Rica listing: drop the interactive-map claim — the app has no map
The App Store description advertised "See every place on an interactive map and
find what's near you." There is no map in the binary: no react-native-maps,
MapView, mapbox, leaflet, or any lat/long/nearby code in app/ or src/, and
react-native-maps is not a dependency. expo-location is not a dependency either.
Advertising a feature the binary does not have is a Guideline 2.3.1 rejection,
and it is the same defect class that flagged Unofficial 90210 ("No ads. No
tracking." over a binary shipping AdMob + Firebase). On an account already
carrying seven unresolved rejections, a self-inflicted 2.3.1 is expensive.
The 4 staged screenshots were already honest — directory, listing-contact,
booking, trips, no map shot — so only the copy was wrong.
Also refreshed two stale notes in the same file: the screenshot-size guidance
(staged shots are 6.9" 1320x2868, verified with sips, which is Apple's current
required iPhone size; the old 6.7"/6.5" text predated it) and the suggested
screenshot set, which still listed a "Map of places" shot.
Refs TK-11518, TK-11155.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
f1a335c · 2026-09-04 · Costa Rica: purge store copy + screenshot that advertised the removed invite feature (TK-10387)
Removing the contacts/invite-friends feature made the staged App Store metadata FALSE.
Submitting it as-is would have described and shown a feature the binary no longer has —
the same Guideline 2.3.1 trap already flagged on another app in this fleet, and 2.3.3 for
the screenshot.
- store/screenshots/05-invite.png showed the Invite-friends screen and WAS STAGED FOR
UPLOAD. Moved to store/_removed/ (kept, not deleted). Four shots remain, a valid set.
- Removed the 'BRING YOUR FRIENDS' section from both costa-rica-appstore-copy.md and
listing.md.
- Removed 'Contacts (optional, user-initiated)' AND 'Location (coarse, optional)' from
the declared privacy data types in listing.md. Location is gone too: there is no
expo-location and no maps dependency, so that permission was orphaned and has been
dropped from app.json.
- Rewrote the privacy guidance block, which previously instructed 'Contacts and Location
are used ON-DEVICE ... do not label as collected'. That wording described an intent the
shipped code did not match — it uploaded and stored the whole address book — which is
precisely why the feature was removed rather than relabelled.
Metadata only; no product code touched. ASC entry remains Steve's console action.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QfGYEoLBywwJD1nfrHe1on
325bd5d · 2026-09-03 · Costa Rica iOS: remove address-book import + invite-friends for v1 (TK-10387, DTD verdict C)
The client read the user's ENTIRE address book and uploaded {name, phone, email}
in cleartext to a server route that durably persisted it - third parties' personal
data from people who are not users and never consented. That also contradicted the
app's own NSContactsUsageDescription, which promised contacts stay on-device.
DTD panel ruled C unanimously (8/8): remove the feature for v1. At zero users an
invite-matcher matches an empty set, so the feature had no value to trade against
the Guideline 5.1.1/5.1.2 exposure. Prod was verified empty first (0 rows), so no
third-party data was ever actually collected.
- delete app/contacts.tsx, its Stack.Screen route, and the home-screen entry point
- drop importContacts/contacts/inviteContact from src/api.ts
- drop NSContactsUsageDescription (no address-book access remains)
- drop the orphaned NSLocationWhenInUseUsageDescription: verified there is no
expo-location and no maps dependency, so the app asked for a permission it
never used (decision 3)
- supportsTablet -> false: only iPhone-6.9" screenshots are staged, and an iPad
set is a hard ASC submit blocker (decision 2)
- remove the expo-contacts dependency and plugin entry, so no contacts SDK ships
Server counterpart removed in the costa-rica repo. Local only - no deploy, no
submit, no DB write.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QfGYEoLBywwJD1nfrHe1on
10b3c50 · 2026-08-10 · Costa Rica: stage 5x 1320x2868 App Store screenshots + store copy (TK-10363, non-gated prep)
- Regenerated 5 screenshots at exactly 1320x2868 (iPhone 6.9" spec) via local
Playwright render of an HTML mock built from the app's REAL screens/branding
(green #0a7d55). $0 local render, no paid API.
- Screens: directory browse, listing detail (BEST WAY TO CONTACT), booking
(card + SINPE Movil), My Trips, Invite friends.
- Added store/costa-rica-appstore-copy.md: name/subtitle/keywords/description,
privacy labels per Steve's Aug 8 decision (Contacts+Location on-device, not
collected), export compliance, screenshot manifest. Anti-slop checked.
- gen-shots.mjs renderer committed under tmp/ for reproducibility.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>