Changelog
What we shipped, in reverse chronological order. Each entry maps to a phase ID in
deps.toml [product.next_phases]. Newest first.
0 */6 * * * (HN), 30 */6 * * * (enrich), 45 */6 * * * (GitHub).
2026-05-11 16 shipped
-
P25
GitHub stargazers scraper — second autonomous lead source
Added /api/leads/sources/github + scheduled cron `45 */6 * * *`. Five competitor repos rotate 2/fire. Parallel /users/{login} fetches via Promise.all. Authed mode via GITHUB_TOKEN secret pushes budget 60→5000/h. First scrape ingested 9 real leads from neo4j + supabase stargazers.
-
P37
OpenAPI 3.1 spec at /openapi.json
27 paths, 9 component schemas, BearerAuth security scheme, CORS-enabled. Imports cleanly into Postman / Swagger UI / openapi-typescript / openapi-python-client. Linked from /docs.
-
P36
schema.org JSON-LD on landing
SoftwareApplication + 5 Offer subtypes (Free/Starter/Developer/Business/Enterprise) + Organization (etz hayim, T9007028460042) for Google rich snippets and SEO discovery.
-
P35
/privacy + /terms legal pages
Privacy maps each retention column to its statute (法人税法 §126, GDPR Art 30, CCPA, etc.). Terms is JP-governed (Tokyo District Court), USD-100 / 12-month-fees liability cap. Linked from landing footer.
-
P34
/robots.txt + /sitemap.xml
Allows public marketing surfaces; disallows API + operator paths. Sitemap lists 7 routes daily.
-
P33
/docs API reference
Self-contained 18 KB HTML covering Quickstart / Auth / Cypher / SPARQL / Storage / S3 / MCP / XRPC / Plans / Privacy / Errors / Compliance. Sticky sidebar + working curl examples.
-
P32
/status + /team public pages
/status: live uptime + 7d agent activity from vertex_yata_qa_run + vertex_yata_agent_run. /team: 4-actor roster with public DIDs and run counts. Both edge-cached 60 s.
-
P31
/api/leads/sendable — operator's ready-to-fire list
GET endpoint returning only leads where `outreach_status='approved' AND contact_email <> '' AND outreach_outbox <> ''`. Powers the Studio Leads pane sendable filter.
-
P30
Autonomous enrichment cron
Domain enrichment now runs on its own cron `30 */6 * * *`. scheduled() dispatches by event.cron prefix. yatabase-deploy.sh updated to preserve the multi-cron trigger config across gftd deploys.
-
P27
Lead enrichment via homepage scrape
GET https://{domain}/ + regex extract mailto: + role-prefix emails (info@/hello@/contact@/...) + tech-stack hints. Self-identifying UA so site owners can robots.txt-block. RFC 2606 example/test/invalid skip. Verified live on supabase.com / hackaday.com / val.town / cyberinsider.com.
-
P26
Studio Leads pane (operator UI)
Sidebar entry + admin-key prompt. Lists vertex_lead with status filter (new/drafted/approved/dismissed/sent/sendable). Per-row buttons: enrich / approve / dismiss / set email / send. Calls existing admin endpoints over fetch().
-
P24
Send pipeline — dry-run + live
POST /api/leads/{vertex_id}/send. Without RESEND_API_KEY: returns dry-run preview {from, to, subject, body}. With it: POSTs Resend, flips outbox + lead status='sent'. Same code path either way. Validates lead.outreach_status='approved' + non-empty contact_email + valid outreach_outbox vertex.
-
P23
Stripe webhook plan-flip integration test
70-tools/scripts/yatabase-stripe-webhook-test.mjs — synthesizes a Stripe-signed `checkout.session.completed` event, verifies signature + plan flip + bad-signature reject. End-to-end proven: free → starter in 41 s.
-
P22
HN Algolia scraper + CF Cron Trigger
/api/leads/sources/hn + scheduled() every 6 h. Seven queries (graph database, neo4j, supabase, hasura, dgraph, arangodb, firebase migrate). 19-host skip-list filters aggregators. Conservative fit scoring.
-
P21
/api/leads/ingest + nishino lead-drain extension
vertex_lead schema. handleLeadIngest is idempotent (skip-if-exists). Operator endpoints: approve / dismiss / set contact_email. nishino's third pass drains leads with status='new' into outbox drafts.
-
P18
/welcome landing page
Marketing surface at /. Hero pitch, 6-card feature grid, 5-tier pricing table, 30-second curl Quickstart, compliance footer. Studio moved to /studio + /embed.