StampReady — session log¶
Cold archive. Session-by-session work history. Load on demand only —
active/stampready.mdis the hot orientation file.When a session log entry conflicts with
active/stampready.md, the active brief wins (it's the maintained current truth; this is frozen history).
Last handoff¶
Session 2026-05-24 — pre-launch buttoning + launch deploys:
- Smoke suite ran clean against prod: 57/57 (chromium + mobile-safari + mobile-chrome). Covers RLS boundary (8 tests × 3 surfaces), auth card, reference viewer, landing/pricing visual baseline, CSP headers.
- Founder headshot added: assets/marketing/founder-headshot.jpg wired into index.html "Built by an engineer" 4:5 portrait box. Commit 616bca6.
- FE Reference Handbook 404 fixed (account.ncees.org/exam-prep/fe-reference-handbook → /exam-prep) in data/config/data.js:290. Same commit.
- Follow-up sweep: 5 more sibling NCEES exam-prep/<subpath> 404s in data.js (PE Civil + FE marketplace listings + 3 state-checklist tasks) all collapsed to /exam-prep. Commit 78eb017.
- Cache busts: data.js?v=56→58, sw.js v165→v167 across the 2 commits.
- Edge function create-checkout-session success_url + cancel_url repointed from stampready.app/ → stampready.app/app (otherwise paid customers landed on marketing copy; pricing.js only loads on /app, so the toast + refreshTier() never fired). Source commit 686c1ab; live deployed via Supabase MCP as version 7.
- Test profile for paid-tier verification: claude-test@stampready.app user created with subscriptions row source='manual_grant', tier='pro', expires_at=2027-12-31. Creds in StampReady/.env as SR_TEST_EMAIL/SR_TEST_PASSWORD (gitignored). Designed for ongoing chrome-devtools MCP smoke runs.
- Paid surface walkthrough verified via test profile: current_user_tier()='pro', pricing screen renders "Pro — active · Manage subscription" (no Upgrade CTA), 0 console errors, all network 200.
- Stripe FIRST100 promo verified working in real checkout (no decrement-restoration needed per Devin).
- Launch posts drafted for Reddit / X / LinkedIn. LinkedIn business page setup notes provided (existing footer link linkedin.com/company/stamp-ready needs claim-or-create check).
- Reddit post landed; 0 new signups in first 24h window (most recent organic signup pre-post at 2026-05-22 17:48 UTC). Raw traffic not yet measurable — CF token is deploy-only, no PostHog API key on file. CORRECTED 2026-05-26: This was wrong on a longer window. r/PE_Exam post drove 1,200 views over 48h (89% US, 5.4% Spain, 2.4% Canada) and 2 organic signups landed mobile-direct: sssjram@gmail.com (2026-05-24 23:23 UTC) + huss.anasmd@gmail.com (2026-05-25 06:52 UTC). Both heavy sessions in PostHog (96 + 47 events) were mistakenly dismissed as internal testing. Neither converted to paid (no subscriptions row, no canceled checkout); not a failure path, just free-tier sitting.
Open from this session:
- Generate CF token with Analytics: Read OR get PostHog Personal API Key, so traffic can be queried in-session.
- Future test-user signups: check "Auto Confirm User" in Supabase Dashboard to skip email_confirmed_at SQL fix.
Session 2026-05-24 evening — brand v2/v3 + LinkedIn page:
- Brand v2 seal promoted then refined to v3 two-seal split. Canonical state: FLAT (navy disk + gold ring + 3-star + laurel + SR) drives icon-{16,32,180,192,256,512}.png (favicon/PWA chrome); POLISHED (transparent embossed gold seal with CERTIFIED/STAMPREADY ribbons) drives icon-1024.png + seal-1024.png + seal-512.png + seal-linkedin-{300,400}.png. Gemini sparkles stripped from both source files. Originals preserved at assets/src/. Prior versions in assets/archive/v2-colored-2026-05-24/ + assets/archive/all-gold-only-2026-05-24/ for fast revert. Commits 36069fe, 407def6, 883f33e.
- Founder headshot wired into landing "Built by an engineer" portrait box (assets/marketing/founder-headshot.jpg, commit 616bca6).
- LinkedIn business page CREATED at linkedin.com/company/118303907/ (slug stamp-ready was 404 — numeric slug is canonical until LinkedIn propagates). Logo (seal-linkedin-400.png), tagline ("PE & FE exam prep, built by a licensed engineer"), description (443 chars), website, industry (E-Learning), size (2-10), type (Self-Employed), year (2026), 5 specialties (PE Exam Prep, FE Exam Prep, Engineering Licensure, CBT Simulator, Engineering Education) all live. Banner staged at assets/linkedin-banner-2512x416.png (Gemini-sourced, 6:1) — NOT uploaded, LinkedIn gates cover uploads behind Premium Page tier. Commit b8b4a02.
- LinkedIn domain verification: located at /company/118303907/admin/settings/manage-domains — optional, email-based ownership check (no DNS TXT needed); skipped this session.
- OG image revamp PENDING: new Gemini source (Downloads/Gemini_Generated_Image_vksq1tvksq1tvksq.png, 1424×748, 1.904 aspect) is staged but unsaved to assets. Says "Free on iOS" which is FALSE while iOS app is on hold — needs regeneration or text-strip before replacing assets/og-preview.png.
Open from this session:
- OG image: regenerate without "Free on iOS" line, OR strip it in PIL, then replace assets/og-preview.png + update <meta property="og:image"> refs + cache-bust.
- Resend transactional email templates may still carry old branding — audit.
- Marketing screenshot deck in assets/marketing/ (01-04 PNGs) still v1 chrome.
- LinkedIn URL slug stamp-ready still pending propagation — re-check in a few hours.
Session 2026-05-24 late — NCEES AIT v4 polish + question loader (NO COMMITS):
- Polished all 16 NCEES AIT v4 graphics (assets/ncees_ait_graphics_v4/): targeted label-overlap fixes on graphics 01/02/03/05/06/07/08/10/11/12/13. Schema gate passes 16/16. Source: assets/ncees_ait_graphics_v4.py (uncommitted).
- Wrote loader scripts/content-bank/build_ncees_ait_v4_questions.py — generates 82 questions (42 fill_blank + 25 point_click + 15 drag_drop) from the 16 sidecars. Coord transform px→pct + radius_pct=4. Output: data/questions/_seeded/ncees-ait-v4-2026-05-24-*.json (16 files). Assets copied to data/questions/_images/ait_v4/ (32 files, SVG+PNG).
- Verified AIT engine is LIVE in prod (simulator.js renderAITBody; bank already serves 6,208 AIT items: 3,225 fill_blank + 2,588 drag_drop + 228 multi_correct + 167 point_click).
- To insert: python scripts/content-bank/load_ait_to_supabase.py --glob "data/questions/_seeded/ncees-ait-v4-2026-05-24-*.json" --commit. Not yet run.
Bank quality audit (Supabase queries, not executed):
- Total approved: 12,798. PE Civil disciplines = LARGEST + LOWEST quality (PE Transportation 13% verified, PE Construction 21%, PE Water 42%, PE Geotech 40%, PE Structural 34%). FE + PE non-Civil = HIGH quality (FE Ethics 97%, PE Chemical 93%, PE Mech HVAC 90%, FE Mechanical 75%).
- Zero-QA cohort: 5,938 (~46%) have empty board_verdict AND no verification confidence.
- Two cut options modeled: bottom 10% per discipline (1,291 rows) OR all zero-QA (5,938). Neither executed — would use status='retired' (reversible, precedent: 2,373 already retired). DEFERRED — pending decision.
Board session (2026-05-24, declined): Took the proposal (retire 5,938 + narrow landing to PE Civil + FE Mech) to the board. Devin declined the board's recommendations and called the session. No deliverable written. Three board-suggested tasks for future reference: (a) install PostHog/CF Analytics, (b) DM 5 Reddit-post viewers, © spot-check 30 zero-QA questions. Not adopted.
Session 2026-05-25 — X relaunch prep:
- Tutor killed and recorded in canonical: decisions/2026-05-24-sr-tutor-killed.md; struck from active build-order and from yaml current_focus + paywall_policy. Do not reference "AI tutor" in any future marketing copy.
- Pricing landed in canonical (yaml): $29/mo · $100 for 4-month pass. Active promo: FIRST100 (live in Stripe per Devin, %-off scope not documented).
- Analytics access broken — both deploy-paths: CF token in .env returns 401; PostHog project key is wired on app.html:1009 but NOT on landing index.html → Reddit→landing traffic invisible. Humblytics keys still in .env but 0 code refs (legacy). Best proxy: auth.users query (4 signups total in 7d, no Reddit-correlated bump).
- X handle: @getstampready (per app.html:973).
- Brand assets staged in StampReady repo (UNCOMMITTED):
- assets/marketing/x-header-1500x500.png — letterboxed v3 banner; seal cropped off source Gemini_Generated_Image_kht6yl...png (2512×416, x>600), navy bg #0D1E33, 280px left-clear zone for X profile pic
- assets/seal-x-400.png + assets/seal-x-512.png — polished gold seal on navy fabric (downsampled from icon-1024.png) for X profile (transparent variant wasn't rendering well per Devin)
- assets/marketing/founder-headshot.jpg — Gemini watermark scrubbed from bottom-right (40×42 patch at 749,953 → cloned from adjacent suit fabric)
- Locked X post (single tweet — "third time's the charm" relaunch nod): uses $29/mo · $100/4mo · FIRST100, lead deltas = rebuilt bank + NCEES-native AITs + redesigned UI + every problem solved step by step, hashtags #PEExam #buildinpublic (2 max for X algo reach; swap candidates documented).
- Visible drift in canonical at session start: yaml last_main_commit: b8b4a02 was 5 commits behind reality. Synced to actual HEAD a672128. Brief was missing tutor-killed + pricing — both backfilled this session.
Open from this session:
- Decide whether to commit the staged StampReady assets above (clean, isolated diff: 3 new + 1 modified) — separate from the unrelated NCEES AIT v4 work still uncommitted in working tree.
- Post the X tweet (waiting on Devin).
- Observability provisioning (Devin action — instructions in projects/stampready.yaml observability_setup block): Stripe restricted read-only key, PostHog Personal API key + project ID, CF token rotation to add Analytics:Read. Delete legacy Humblytics env vars after.
- Wire PostHog snippet into index.html so landing-page visitors are tracked (currently only /app is instrumented).
Session 2026-05-25 — X relaunch LIVE + observability provisioned + overnight monitoring armed:
POST 1 WENT LIVE: 2026-05-25 ~05:45 UTC (~00:45 CT) per Devin "X and twitter are live". Exact post copy below.
OG image — fully fixed this session:
- Diagnosis: og-preview.png was 1.11 MB (over X's ~1 MB soft cap) → X composer showed broken-image placeholder, not stale cache.
- Fix: re-exported as og-preview.jpg (147 KB, q=88 progressive JPEG, 1200×630, fresh filename). Commits 06e5068 (PNG cache-bust attempt, didn't solve the size issue) + 6b83628 (JPEG swap, solved it).
- Verified via opengraph.xyz: X card preview renders the gold-seal/Built-by-a-Licensed-P.E. composition cleanly.
- Minor open: Gemini ✧ watermark in bottom-right of OG white panel — scrub flagged but not yet executed.
Observability provisioning (NEW this session — Devin completed Stripe + PostHog, CF rotation deferred):
- STRIPE_RESTRICTED_KEY in StampReady/.env line 23 (live mode rk_live_*). Scopes expanded 2026-05-30 for KP Phase 3 build: still has all original SR diagnostic reads (Customers, Subscriptions, Coupons, Promotion codes, Charges, Checkout Sessions) PLUS writes (Products, Prices, Checkout Sessions, Webhook Endpoints, Coupons) verified via probe. Cross-venture key — used by both SR diagnostics and KP scan-request creation; tag everything with metadata.brand=SR or brand=KP. Test-mode counterpart at line 24 as STRIPE_TEST_RESTRICTED_KEY (same scopes + a few extras). FIRST100 promo last verified active, times_redeemed=1 (Devin's own 5/23 self-purchase), max 100, no expiry — changing account info doesn't void coupons.
- POSTHOG_PERSONAL_API_KEY + POSTHOG_PROJECT_ID=436509 in .env. Verified live — HogQL queries return data. Past 7d shows 3 unique on 5/23, 2 on 5/24, 1 on 5/25 — all internal testing on /app.html.
- PostHog wired onto landing (index.html) in commit 594bb80 — Reddit/X click-throughs now captured. Was a critical gap (landing was invisible before this).
- CF token still 401 — DEFERRED. Will rotate later.
- Humblytics env vars marked for deletion (0 code refs, displaced).
Truth check (run this session, ugly but important):
- Total pro subs = 5, all internal: 2 manual_grant test accounts + 1 web_stripe active (Devin self) + 2 web_stripe refunded (Devin's own Stripe test charges per 2026-05-26 clarification — NOT real customer churn). The 1 FIRST100 redemption is Devin's 5/23 self-purchase. Real external paid customers: still 0. Real external free signups: ~10 to date (5/7 burst + 5/24-25 from Reddit).
- Tonight's post 1 is the first real-traffic test.
Brand assets staged in SR repo (still UNCOMMITTED — Devin chose to upload to X directly without committing):
- assets/marketing/x-header-1500x500.png — letterboxed banner, 280px navy clear-zone on left for profile pic
- assets/seal-x-400.png + seal-x-512.png — polished gold seal on navy fabric
- assets/marketing/founder-headshot.jpg — modified, Gemini watermark scrubbed
Overnight monitoring (cron + baseline):
- Baseline snapshot at active/overnight-baseline-2026-05-25.md (auth.users=25, pro_subs=5, FIRST100 redemptions=1, captured 2026-05-25 05:09:30 UTC).
- Cron 635aa2bb scheduled 07:13 CT 2026-05-25 (replaced earlier f9b61cb8 to add Stripe + PostHog queries). Will produce deliverables/OPS-overnight_post_report_2026-05-25.md with full funnel: impressions → signups → checkout starts → paid → FIRST100 redemptions, plus hourly timing cluster + referrer breakdown. Session-only — may die if Claude Code closes overnight, but baseline file is durable so any future session can compute the delta manually.
- The cron prompt has all credentials referenced by env-var name from .env, NOT inline.
Post 1 copy (LIVE):
Third time's the charm — rebuilt StampReady ground-up.
Sharper question bank. NCEES-native AITs (drag/drop, point-click, fill-blank). Redesigned UI. Every problem solved.
$29/mo · $100/4mo · code FIRST100
stampready.app
#PEExam #FEExam #NCEES #EIT
Post 2 (DRAFTED, ready for morning):
PE Civil warmup:
Cantilever, L=10 ft.
P=5 kip at the free end.
Max moment at fixed support?
Reply with your answer. Step-by-step at stampready.app
$29/mo · $100/4mo · FIRST100
#PEExam #FEExam #NCEES #EIT
Session 2026-05-26 — LinkedIn banner prep + launch post:
- Devin signed up for the LinkedIn Premium Page 1-month free trial to (he assumed) unlock cover upload. Research this session confirmed: Premium is NOT required for static cover image — only for dynamic/rotating slideshow covers. So the trial is unrelated to the upload failure he hit.
- Banner source: Devin generated a new Gemini banner from a prompt I drafted —
Downloads/Gemini_Generated_Image_qvehcdqvehcdqveh.png(2544×416, 6.115:1, contained "PASS THE PE & FE." + "Built by a licensed engineer." + bridge schematic + gold SR seal + StampReady wordmark + "STAMPREADY.APP" small caps + Gemini ✦ sparkle in bottom-right). - Processed via
scripts/linkedin_banner_compose.py(NEW, UNCOMMITTED): pixel-scanned sparkle to source (2470-2500, 340-380), tight bbox (2450, 325, 2520, 395), median-color ring fill + 2px feather. Cropped to clean 6:1 (2496×416), composition scaled to 3351×558 (LinkedIn's 80% mobile safe-zone, 900/1128), centered on 4200×700 navy #0D1E33 canvas. - Output (UNCOMMITTED):
assets/marketing/linkedin-banner-4200x700.png(1.32 MB) +.jpg(205 KB) — both under LinkedIn's 3 MB cap. - Upload FAILED: LinkedIn returned "Cover image upload failed. Please refresh the page and try again." Per LinkedIn's official troubleshooting (help/answer/a565194): try PNG instead of JPG (documented workaround), clear cookies + sign back in, try different browser, disable popup blocker. Devin to try PNG next.
- I spun 4 iterations on composition fit (52% → 80% → 52% → 80%) chasing what I misread as a crop-fit problem in the upload modal preview. Actual issue is upload-step failure, not composition. The upload modal preview shows a tighter crop than the saved banner and is misleading — should be ignored.
- LinkedIn launch post drafted (current canonical wording, never posted yet — waiting on banner): rebuilt ground-up, $29/mo · $100/4mo · FIRST100, NCEES-native AITs, 3 hashtags (#PEExam #FEExam #EngineeringLicensure).
- Existing displayed banner on the page (visible in Devin's screenshot — "STAMPREADY™" wordmark + drafting tools + blueprint pattern) — provenance unknown. Either uploaded in a prior session, or LinkedIn default. New upload will replace it.
Open from this session:
- Devin to try PNG upload (assets/marketing/linkedin-banner-4200x700.png, 1.32 MB) after page refresh
- If PNG also fails: cookies / browser swap / popup blocker per LinkedIn troubleshooting
- Once banner uploads successfully, post the LinkedIn launch text
- All session assets STILL UNCOMMITTED (compose script + 2 banner files) — separate from the unrelated NCEES AIT v4 work also uncommitted in working tree
Session 2026-05-26 — PostHog audit + signup discovery + UTM scheme:
- 2 real organic signups had landed unnoticed. Queried PostHog (project 436509, HogQL via POSTHOG_PERSONAL_API_KEY) and auth.users + public.subscriptions jointly. Found: sssjram@gmail.com (5/24 23:23 UTC, mobile-direct, 96-event session) and huss.anasmd@gmail.com (5/25 06:52 UTC, mobile-direct, 47-event session). Both correspond to heavy PostHog sessions I had earlier mis-flagged as internal testing.
- Both are free-tier, no subscriptions row, no canceled checkout, no Stripe failure event. Not a silent-fail at the paywall — they signed up and didn't pursue Pro.
- Source = Reddit r/PE_Exam post (per Devin's screenshot of Reddit Post Insights, 2026-05-26 ~13:39 CT): 1,200 views over 48h, +24/hr still ticking, 89.2% US / 5.4% Spain / 2.4% Canada. Mobile-direct PostHog referrer is consistent with Reddit mobile app stripping the referrer header. X click-throughs (2 desktop @ t.co/5fhKQX7rXC on 5/25 11:49+11:50) produced 0 conversions.
- Attribution gap diagnosed: none of the live social posts use UTM tags, so PostHog can't distinguish Reddit-mobile from X-mobile from organic-mobile.
- UTM scheme adopted (campaign tag shared across all 3 channels for HogQL aggregation):
- Reddit: https://stampready.app/?utm_source=reddit&utm_medium=social&utm_campaign=launch&utm_content=pe_exam_post
- X: https://stampready.app/?utm_source=x&utm_medium=social&utm_campaign=launch
- LinkedIn: https://stampready.app/?utm_source=linkedin&utm_medium=social&utm_campaign=launch
- LinkedIn launch deliverable created: deliverables/MARKET-linkedin_launch_v1.0_2026-05-26.md — canonical re-draft (prior draft lost to compaction), UTM baked in, posting checklist + reshare-from-personal note included.
- Today's mobile bouncer (5/26 00:09 UTC) reached /app#signup and left without submitting. No auth log entries — confirmed not a silent fail, just a real bounce. Sample size 1, watch but don't act.
Open from this session:
- Devin: edit the live r/PE_Exam post body, swap bare stampready.app link for the UTM'd Reddit URL above. Future clicks become attributable; the 1,200 views already accrued are unrecoverable for attribution.
- Devin: when LinkedIn banner upload succeeds, use the LinkedIn URL above in the post (already baked into MARKET-linkedin_launch_v1.0_2026-05-26.md).
- Future X posts: use the X URL above. The live tweet is uneditable (no X Premium).
- After UTM rollout, set a 7d cadence to re-query PostHog properties.utm_source cohort vs signups vs paid — first real attribution baseline lands one week from UTM-Reddit edit.
Session 2026-05-26 — canonical reconciliation sweep:
Devin called out "why are you missing so much?" after I shipped a LinkedIn post built on stale canonical data. Root cause: I treated yaml + active.md as durable truth instead of as a cache that needs live verification. Six items were stale; all now patched:
| Item | Stale value | Live truth | Action |
|---|---|---|---|
question_bank.approved_count (yaml:132) |
~2,212 | 12,798 | Patched (commit d91a8e9 earlier this session) |
last_main_commit (yaml:113) |
a672128 | 923a56c | Patched this turn |
version (yaml:49) |
v2.7.6 / build 34 | v3.0 / build 2026.05 (per index.html:1248) |
Patched this turn |
payments (yaml:38) |
"Apple IAP / Google Play (NO Stripe)" | Stripe LIVE on web (5 subs, FIRST100 working) — IAP planned for mobile when un-paused | Patched this turn |
paid_enabled (yaml:47) |
false | true (Stripe + FIRST100 live since 5/23) | Patched this turn |
| CF token status (yaml:62, 102) | "401 / rotate / DEFERRED" | FIXED per Devin 2026-05-26 | Patched this turn |
| Humblytics env (yaml:103-105) | "legacy_to_delete" | Kept alongside PostHog (parallel run) per Devin | Patched this turn |
observability_setup.status (yaml:65) |
PENDING | COMPLETE (Stripe + PostHog + CF all provisioned) | Patched this turn |
current_focus[0] (yaml:108) |
"need CF token / PostHog Personal API Key" | Both provisioned; new focus = attribution rollout | Patched this turn |
| "Zero external paying customers ever" (active.md:175) | wording implied churn | Refunds = Devin's own Stripe tests, not customers; 0 external paid is still accurate but the 2 refunds were misleading without the test-clarification | Patched this turn |
| QUESTION_BANK_STATE.md | 2,176 (April snapshot) | 12,798 / detailed PE+FE table | Patched this session (commit 923a56c) |
Analytics snapshot (live, 2026-05-26): - PostHog 14d: 5/26=15ev/5u · 5/25=57ev/8u · 5/24=97ev/2u · 5/23=74ev/3u. Pre-5/23 invisible because PostHog wasn't on landing yet. - auth.users: 22 rows total. External non-test: ~10 (huss.anasmd, sssjram, tzm11, sujansubedy, auben.mitchell, nicholas.benadof, susanmrajesh, lindseylew10, banalaly, lindseydavidson1087). 5/7 had a 7-row spike (unclear source — pre-PostHog so traffic invisible). - public.subscriptions: 5 rows, all internal (2 manual_grant test, 1 web_stripe active = Devin self, 2 web_stripe refunded = Devin self-tests).
Pattern to fix going forward: any numeric or status claim used in user-facing output gets a live verification call first. Canonical = starting point, not the answer. Memory entry added: feedback_verify_before_citing_canonical.md.
Session 2026-05-26 — channels live + first qualified-lead feedback:
- LinkedIn launch POSTED (company page
linkedin.com/company/stamp-ready) 2026-05-26 evening. v3.0 body shipped (12,000+ Qs · diagnostic · heatmap · free-to-try · UTM=linkedin). Banner deferred. - Reddit r/FE_Exam post LIVE with UTM link. 162 views in first ~30 min (denser pace than r/PE_Exam's 1.2k/48h on the prior post). Devin's actual posted copy (canonical from now on):
- Hashtags:
#PE #FE #Engineer #Engineering(different from my earlier#PEExam #FEExam #EngineeringLicensuresuggestion — defer to Devin's choice) - Pricing line: "$29/mo or $100 for a 4-month pass. No upsells."
- Promo line: "First 100 users free with code FIRST100" — confirms FIRST100 = 100% off, cap 100. Patched yaml line 144.
- First qualified-lead feedback (user
ohkjonon r/FE_Exam post): cited 3 UX gaps vs the actual NCEES CBT — (1) reference handbook position (CBT puts it on the LEFT, StampReady does not), (2) UI color (CBT uses a specific dark-blue; PPI mirrors it), (3) keyword search feature/UI parity with CBT. Devin's reply: "deliberately avoided mirroring for legal reasons, but tried to retain core concepts. Plan to incorporate feedback to refine over coming weeks." — Good defensive framing; keep on future legal-mirroring questions. - Competitor named: PPI (Kaplan-owned Professional Publications Inc). First time canonical has logged PPI as a referenced competitor on a public-facing channel.
- Product backlog candidates from this feedback (not committed yet):
- Reposition reference handbook panel to the left (most-cited CBT UX detail; low trademark risk for layout-only)
- Dark-blue UI option / color theme
- Keyword-search UX parity (lower priority — feature gap, not visual mimicry)
- Memory adds:
reference_subreddits_devin.md(r/PE_Exam + r/FE_Exam confirmed live posting channels),project_ncees_cbt_ui_parity.md(recurring feedback theme — handbook position is the recurring complaint).
Session 2026-05-26 evening — FIRST EXTERNAL STRIPE ACTIVATION + promo retune:
- First external Stripe activation in StampReady history. User
boceg60672@noyavip.com(self-identified Jason Laxdon, TX student) came fromreddit.com(UTM=reddit on the r/FE_Exam launch post), signed up, completed Stripe checkout with FIRST100 — Pro tier provisioned through 2026-09-26. Funnel works end-to-end. $0 charged (FIRST100 = 100% off), but full Pro provisioning verified. - Funnel timing — landing → paid in 7m 36s: 16:11:13 UTC landed → 16:11:20 clicked to /app#signup → 16:12:26 signup created → 16:18:49 Stripe checkout completed → 16:19:01 first Pro sign-in.
- Attribution proven: UTM=reddit is the first verified Reddit→paid path in PostHog data — exactly what the UTM rollout was for.
- LinkedIn traffic also flowing: 16:41 UTC first
utm=linkedinpageview since the post went live. - Caveat — disposable email:
noyavip.comis a throwaway domain. boceg may be a coupon-farmer not a serious student. Watch their next-48h activity: if they actually use the platform, escalate; if no return visits, write off as freebie speculation. - Bouncer #2: Another Reddit-mobile visitor at 16:16 UTC hit /app#signup and left. Two mobile bouncers in 24h on the signup screen — friction signal worth watching (sample still 2).
- FIRST100 promo retune (Devin 2026-05-26): Old coupon
wARNgRBY= 100% off, 4 months repeating — too generous, since the marketing copy "First 100 users free with code FIRST100" never specified duration. Target = 100% off, 1 month. Existing 2 redemptions keep their 4-month benefit; new redemptions get 1-month only. - Action (Devin, in Stripe Dashboard):
- Archive coupon
wARNgRBYat https://dashboard.stripe.com/coupons/wARNgRBY (doesn't refund existing redemptions, just blocks new uses) - Create new coupon: 100% off, Duration = Repeating, 1 month
- Create new promotion code with code=
FIRST100, max_redemptions=98 (100 − 2 already redeemed) - Email sent to devindavidson7@gmail.com with these steps.
Session 2026-05-26 late — multi-agent buildout + AIT v4 math overhaul + marketing-director parked:
- Multi-agent research + 4 subagents drafted (NOT yet committed to git; live on disk in
.claude/agents/): ~/.claude/agents/marketing-copywriter.md(user-global, opus) — channel-locked drafter, reads canonical first, emails drafts to Devin~/.claude/agents/posthog-analyst.md(user-global, opus) — HogQL + Supabase + Stripe cross-check, anti-noise patternsStampReady/.claude/agents/qc-reviewer.md— gates question batches via 5-reviewer board, bucket-sorts into _approved/_revise/_rejectedkindredpics-site/.claude/agents/bipa-auditor.md— pre-merge biometric/retention/consent audit against 30-day workspace lock- AIT v4 question pipeline overhaul:
- QC ran on original 2026-05-24 drafts: 0/82 passed (graphic-labeling stems, empty distractors, no solutions). All 16 files moved to
data/questions/_rejected/ait-v4/. - Math audit on
assets/ncees_ait_graphics_v4.py: 12/16 PASS, 4 need fixes — graphic_01 (R_A formula used wrong moment arm), graphic_02 (M_A sign convention made M(L)=-240 instead of 0), graphic_10 (F_JB compression-vs-tension arrow inconsistency), graphic_12 (I_2 = 0.5 should be 0.67 = ⅔). - All 4 patched + sidecars regenerated: R_A=45.6, R_C=66.4, M_max=183.7, x_0=4.47 (was 74.4/37.6/346.9/6.87). Cantilever M_A=170 sagging-positive with M(L)=0 enforced. Truss FBD F_JB relabeled (T) + P_ext flipped down. Circuit I_2=0.67.
- Visual fixes: graphic_01 shear plot now has clean vertical step at x=4 (was a ramp due to np.where interpolation); graphic_01 M_B/M_max labels symmetric top-left/top-right; graphic_07 dashed y-axis line shortened so it doesn't bisect b_f + "y (weak axis)" labels, t_f label widened-into-canvas, table_x repositioned; graphic_12 R_3 label moved ABOVE resistor box (was crashing into I_2 label).
- Loader v2 shipped at
scripts/content-bank/build_ncees_ait_v4_questions.py(LLM-driven via Haiku 4.5, generates 5 assessment-grade questions per sidecar: 2 fill_blank + 2 point_click + 1 drag_drop). v1 backed up at.v1.py.bak. Dry-run on graphic_01: 5/5 valid with real formulas + distractor mapping + NCEES references. - Status: uncommitted in StampReady working tree. Devin reviewing PNGs on phone; graphic_07 confirmed re-fixed via email
19e6644efe151aad. 15 sidecars NOT yet run through loader v2 (would cost ~$0.50 API). Pending Devin's final visual verdict before commit + bulk-run. - Email messages sent this session (per
feedback_email_action_items.md): 19e65f76f29aced4— initial 16 graphics for visual confirm19e66219f6639635— revised 16 graphics after 3 visual fixes (shear step + moment labels + R₃ label)19e6644efe151aad— graphic_07 repatched after Devin's annotated screenshot (4 specific fixes: y-axis bisection × 2, t_f canvas clip, designation box layout)- Marketing-director agent IDEA researched + parked at
FounderOS/ideas/2026-05-26-marketing-director-agent.md. Revival trigger: 100 paying users OR post-October 2026 PE cycle. Build cost when revived: ~3–4 hr + ~$8/mo Anthropic API. Skips \(1,250–\)8K/mo human CMO and \(500–\)2K/mo packaged AI-CMO products (NoimosAI, Improvado AI CMO — overkill at n=10 external users). - Social-orchestrator agent IDEA also parked at
FounderOS/ideas/2026-05-26-social-orchestrator-agent.md. Drafter+poster automation via Telegram+X-API+LinkedIn-API+Reddit-one-tap-URL. Revival when posts/week >10 or copy-paste drag >30min/wk. - New
FounderOS/ideas/folder convention — parking-lot for researched-but-unbuilt concepts, distinct fromdecisions/(decided) anddeliverables/(shipped). README documents the structure. - FounderOS commits this session (pushed to origin/main):
3e35885FO hygiene + .gitignore,26e2d16KP canonical (OTP+pw, nanny-pics deleted),1dff5a3SR active brief sync to v3.0/b311747. NEW uncommitted FO state:ideas/README.md+ 2 idea files,active/stampready.md(this block),MEMORY.mdupdated. - Memory adds:
reference_ideas_folder.md(parking-lot convention pointer).
Session 2026-05-27 — legal-ip-researcher subagent shipped:
- Reddit fan-out clarified: profile post → r/PE_Exam crosspost → r/FE_Exam crosspost. View counts as of this session: profile=258, r/PE_Exam=1.6k (was 1.2k), r/FE_Exam=497 (was 162, now tagged "Brand Affiliate" by Reddit's disclosure system).
- New comment thread on profile post: u/MessageOk1085 asked "source of all the questions" — Devin replied with the multi-agent AI pipeline framing + introduced the "upload your own practice materials" as biggest differentiator. Converted skeptic to "wow comprehensive answer."
- Upload-your-own-materials feature is REAL (CSV/JSON questions via
app.html:338 triggerUpload+ PDF viewer atassets/pdfjs/web/viewer.html+ Reference pane tab injs/reference.js). Devin's "side-by-side with the handbook" framing = tab-switchable inside the simulator workspace, not literal dual-pane. NOT an overclaim. - BUT — legal status of the upload-PDFs differentiator is unresolved. That's why it's never been product-forward in marketing to date. Devin has a lawyer meeting in pipeline. Do NOT lead with this differentiator in X / Reddit / LinkedIn copy until legal clears it.
- New subagent:
legal-ip-researcherat~/.claude/agents/legal-ip-researcher.md(user-global, opus). Cross-venture (SR + KP + future). Produces structured legal-research briefs for attorney review — statutes, case law, risk matrices, lawyer-meeting question lists. Never produces legal advice. Tools: Read, Write, Bash, WebSearch, WebFetch. Exception to the "ship one subagent first" rule (memoryfeedback_ship_one_subagent_first.md) granted because cross-venture utility for all current + future businesses.
Open from this session:
- First test run for legal-ip-researcher: SR PDF/textbook user-upload IP risk (DMCA §512 safe harbor + §107 fair use + NCEES copyright posture).
- X #2: still drafted as cantilever warmup (not the differentiator version). Pending Devin's pick of next firing.
- FIRST100 Stripe retune (Devin Dashboard action): archive wARNgRBY coupon → create 1-month-repeating 100%-off coupon → new FIRST100 promo with max_redemptions=97 (3 already redeemed including boceg). Email sent 2026-05-26.
- boceg activity post-signup: 0 PostHog events in 48h → coupon-farmer thesis confirmed. Not a real student. Mark FIRST100 redemption #3 as bad-fit.
Session 2026-05-27 — legal-ip-researcher first run + IP gap remediation (UNCOMMITTED):
- First production run of
legal-ip-researchercomplete — brief atStampReady/deliverables/LEGAL-user_uploaded_pdf_dmca_v1.0_2026-05-27.md. Email19e6a01f611c327a. Headline reframe: SR's PDF-upload architecture is client-side only (IndexedDB + in-memory via FileReader, NO Supabase Storage / R2 server upload). That's Sony / Cartoon Network v. CSC, not Viacom. DMCA §512© likely doesn't apply because there's nothing server-side to immunize. Real risk = Grokster inducement, which lives in marketing copy. - Three concrete gaps flagged + remediated where possible:
stampready.app/termsreturned 404 → fixed: newterms/index.htmlwith §512(i) repeat-infringer policy + DMCA notice procedure + user-upload representations (mirrors privacy/index.html styling, marked "DRAFT — attorney review pending")- In-app attestation at
js/simulator.js:340-351called SR "a passive storage service" (architecturally inaccurate; legal brief flagged) → fixed: rewritten attestation reflects client-side-only architecture + strengthens permission language ("YOU HAVE THE LEGAL RIGHT to use this material...") - PDF upload at
js/reference.js:pickLocalPdfhad NO permission attestation → fixed: new confirm()-based gate added, first-time only, matching the question-upload pattern - Devin-required follow-ups (email
19e6a0a5ed1efed8sent to devindavidson7@gmail.com): - Register DMCA designated agent at copyright.gov/dmca-directory ($6 / 3-yr, preserves §512© optionality)
- Set up
dmca@stampready.appemail alias - Review + commit the 3-file diff (js/simulator.js, js/reference.js, terms/index.html)
- Cache-bust + deploy
- Bring legal brief to attorney meeting (6 specific questions in email body)
- Marketing implication: upload-PDFs differentiator can go forward IF marketing copy is Grokster-aware ("upload your own study materials" ≠ "upload pirated textbooks"). Attorney to confirm copy guardrails before X/Reddit/LinkedIn use.
Session 2026-05-27 — full IP audit + 5 source-code patches + deliverable hardening:
- 2 parallel audits via
legal-ip-researcheragent: deliverables/LEGAL-entity_ip_protection_audit_v1.0_2026-05-27.md(email19e6a7da64a3eeab) — what each entity (NCEES, PPI/Kaplan, School of PE, Pearson VUE, AASHTO/AISC/ACI/ASCE/TRB-HCM/ICC) protects + Doe v. GitHub case status (direct copyright claims DISMISSED). Big reframes: Pearson VUE CBT UI mimicry = LOW (Lotus, Google v. Oracle); formulas/data = LOW (§102(b) + Feist); NCEES = HIGH ($800K + $880K confidential settlements + Cameron-Ortiz $1M+ judgment).deliverables/LEGAL-codebase_ip_audit_v1.0_2026-05-27.md(email19e6a81fa8cb0f0b) — 4 HIGH / 5 MED / 10 LOW findings. Critical defensive posture confirmed in code: simulator layout is question-LEFT / reference-RIGHT (OPPOSITE of NCEES CBT), color palette cream/amber/navy (not NCEES dark-blue). DO NOT act on ohkjon's "put reference handbook on left" Reddit feedback — it would destroy the documented "deliberately avoided mirroring" trade-dress defense.- 5 source-code IP edits shipped (UNCOMMITTED):
js/i18n.js:27"mirrors Pearson VUE" → "exam-day style" (EN)js/i18n.js:217"replica Pearson VUE" → "estilo día del examen" (ES)js/marketplace.js:179comment "NCEES product card style" → "discipline-specific palette"data/config/data.js:493"StampReady calculator replicates the TI-36X Pro" → "Use the same model you will bring to the exam"js/simulator.js:1663comment "Mirrors NCEES Pearson VUE's pre-exam tutorial" → "Pre-exam tutorial that walks candidates through the CBT UI"- 3 deliverables hardened:
MARKET-social_bios_v1.0_2026-04-27.md→ archived, replaced byMARKET-social_bios_v1.1_2026-05-27.md(drops "mirrors Pearson VUE", bumps Q-count 2,200→12,800, adds pricing, switches Reddit hashtags to confirmed#PE #FE #Engineer #Engineering)MARKET-social_content_batch1_v1.0_2026-05-03.md→ archived, replaced by v1.1 (Post 3 reframed to "Similar CBT exam interface"; Post 10 reframed to "BRING YOUR OWN REFERENCES" matching upload-PDFs architecture)deliverables/post3.htmlpatched in place- Live-channel scan via WebFetch:
- stampready.app landing: clean — no audit phrases visible
- linkedin.com/company/stamp-ready: already softened to "Similar CBT exam interface" when Devin posted (deliverable was draft, live wording diverged in his favor) — no exposure
- x.com/getstampready: 402 / unauthenticated — DEVIN TO VERIFY MANUALLY (bio + pinned tweet)
- Reddit posts at u/Numerous-Ad-1225: unable to fetch bodies — DEVIN TO VERIFY MANUALLY
- H4-H5 pending (codebase audit):
data/config/data.js:135-280sections[]reproduces AISC/ACI/ASCE/AASHTO/OSHA tables (no signed licenses on file, only draft license-request letters inlegal/). Selection-and-arrangement = real risk vector. Attorney meeting prep first; rewrite-to-paraphrase or external-link replacement is ~30-min refactor. - 17 attorney questions queued across the 3 LEGAL briefs (7 entity-IP + 10 codebase-audit).
- Memory adds: none this session — patterns already covered by
feedback_verify_before_citing_canonical.md(canonical = cache, verify live) andfeedback_no_unverified_bank_quality_claims.md(audit findings ≠ live reality).
Session 2026-05-27 — handoff state (UNCOMMITTED in StampReady working tree):
- IP / legal: 5 source-code patches above +
terms/index.html(new draft ToS) + 2 attestation gates (js/simulator.jsrewrite + newjs/reference.jsPDF gate) + 3 deliverable changes + 2 audit deliverables - NCEES AIT v4 graphics + loader v2: still uncommitted from prior session (16 graphic PY + sidecars + loader script + 16 _seeded JSONs + 32 _images)
- Multi-agent files:
~/.claude/agents/legal-ip-researcher.md(NEW user-global),marketing-copywriter.md,posthog-analyst.md,StampReady/.claude/agents/qc-reviewer.md,kindredpics-site/.claude/agents/bipa-auditor.md. Heads-up: newly-created user-global agents need a Claude Code session restart before they appear in theAgent(subagent_type=...)registry. Workaround used this session: invoke viageneral-purposewith skill-file path in the prompt. - Marketing: held — X #2 still drafted (cantilever warmup), upload-PDFs differentiator still product-only pending attorney
- Devin pending actions (emails sent — all in inbox):
19e6a01f611c327a— first legal brief (PDF/DMCA architecture)19e6a0a5ed1efed8— DMCA registration steps + commit checklist19e6a7da64a3eeab— entity-IP audit19e6a81fa8cb0f0b— codebase IP audit (Devin-actionable)- Manually verify X bio + 3 Reddit post bodies don't contain "mirrors Pearson VUE"
- Stripe FIRST100 retune optional cleanups (leave as-is per Devin's earlier "leave 3 over")
Next-session restart priorities: 1. Devin to commit + cache-bust + deploy the IP source-code patches (5 files) 2. Devin to send terms/index.html draft + 17 lawyer questions to attorney 3. After lawyer meeting: decide on AISC/ACI/ASCE table rewrite (H4) + whether upload-PDFs can go marketing-forward 4. Resume marketing (X #2 + r/FE_Exam follow-up) once IP posture is locked 5. FIRST100 promo timing — 1-month duration is live, monitor next paid activation (boceg confirmed coupon-farmer, 0 return visits in 48h)
Session 2026-05-27 evening — reference panel pivot to upload-only + persistence + resource directory (PUSHED to origin/main):
- Persistence shipped (commit
3eab4a2): user-uploaded PDF library now persists across sessions in IndexedDB (was in-memory only, wiped every reload). Storestampready_local_pdfs/pdfs, hydrates on script load,navigator.storage.persist()opt-in for Safari background-eviction. PostHogreference_upload_completedevent added (file_type, size_kb, library_size). Verified end-to-end via chrome-devtools MCP (CRUD round-trip + post-reload hydration + close/clear sync). IP posture unchanged — IndexedDB is still client-side, no server touch. - All preloaded reference content stripped (commit
de54969): removed 117 lines of curated formulas + tables + embedded public-domain PDFs fromdata/config/data.jsREF_CATALOG. Eliminates the H4 selection-and-arrangement risk from the codebase IP audit. Catalog now metadata-only (13 entries: title, abbr, version, source, downloadUrl, purchaseUrl, cost, description, customPane='upload_prompt').renderRefContentsimplified to a single "Bring your own copy" pane with publisher CTA + "Load your PDF" handoff. AISC description softened ("LRFD/ASD" → "Steel design code"). All formula leak checks pass. - Supabase Storage bucket
stampready-refs/flushed: 15 PDFs deleted (12 MUTCD parts + FHWA HIF-24-002 + HIF-24-054 + DoD UFS 3-220-10). All were federal/§105 public-domain so legally harmless, but Devin chose clean-cut posture: zero hosted content. Both subfolders empty, empty bucket retained as no-op. - Resource directory in My PDF empty state (commit
aa6694c): blank "Choose PDF" screen now shows a grid of refs scoped to the active discipline (cards: FREE/PROVIDED vs PURCHASE pill, title, abbr, cost, Download/Purchase CTA → publisher's official URL). Pure factual aggregation, no copyrighted content, no logos. Helper_buildResourceGrid(disc)consumesDISC_REFS[disc]+REF_CATALOGmetadata; grid hidden once any PDF is loaded. Verified scoping across transport (5 cards), structural (4), fe_civil (1 fe_handbook only), water (3). - Cache busts (all shipped):
reference.js v58→v61,data/config/data.js v59→v60,sw.js v178→v181. - AIT v4 working tree declared garbage by Devin; uncommitted files left alone (not deleted in this session, not committed).
- Enterprise remote removed:
github.com/GSR_admin/stampready.git404'd (org doesn't exist on github.com — likely never set up or pre-rename). Removed viagit remote remove enterprise. Origin alone now. - Board session at start of work: product-only scrutiny of upload-content as differentiator (transcript inline in chat). Three Sarah Chen tasks: instrument PostHog upload events (DONE), document upload surface (partially: brief covers it), persist last-page-viewed per PDF (DEFERRED — pdf.js hook for
pagechangeevent, ~50 lines).
Open from this session:
- Push to deploy verification (Cloudflare ~1-2 min): hard-refresh /app, click any ref tab → "Bring your own copy" pane; My PDF tab → resource grid + upload button; upload a PDF, reload → confirm persists.
- Persist last-page-viewed per PDF (board task #3, deferred).
- Enterprise mirror remote fix.