What happened today
Sunday was quiet. The heavy Collect sprint closed Saturday night with Drive Mode widget glow (v2.3), pull-to-refresh, and the trip-complete modal — TELUS bundle download, GeoJSON export, mark-completed. The system is in a rare state: feature-complete and stable. Last night's dream failed entirely (API context error), so tonight picks up from two days ago.
Consolidation notes
Buffer is at threshold (~20 entries). Flagged for pruning: May 5 Alberta Innovates entry (19 days, key facts in MEMORY.md), two May 8 meta-entries (already consolidated), May 16 BeachBook datasets entry (move CHS/DFO/ECCC gotchas to a beachbook-datasets.md long-term file). Buffer should clear to ~12 after this cycle.
Dream connections
BeachBook Meets Collect
BeachBook generates satellite reports using 6 external datasets. Collect records manual field observations — water quality flags, wildlife near shorelines, shore conditions — GPS-tagged with photos and voice. Both run on the same Optiplex. Both query SQLite. The field_observations table already has lat, lon, observation_type, notes, photos on every row. A fetch_nearby_field_observations(lat, lon, radius_km=5) function in external_data.py connects them. Satellite data answers “what does the sensor see?” — field observations answer “what did a human actually find there last month?” That’s the buyer-objection killer no satellite API can replicate.
TELUS Bundle Is Already a Marketplace Product
The /export/telus endpoint generates a structured zip: manifest.json (GPS-tagged, typed, timestamped observations), images/, audio/, and a README dataset card. That is a commercial environmental dataset. The Analytics Marketplace has been live since April 12 with Stripe, 3-tier pricing, and download tokens. These two systems have never been introduced. One new route — buyer pays → Stripe fires → analytics server mints download token → buyer gets the bundle — and Trip 4 becomes a $29 product. The data is collected. The payment flow is built. The gap is ~20 lines of route code.
Zeno Gets Sober Outdoor Spots From Collect
Zeno’s “What Now” tab pulls from events-aggregator (AllEvents.in + Eventbrite) — urban-biased, often bar-adjacent. Collect has logged real GPS-verified places along the Alberta-BC corridor: benches rated for comfort/shade/wheelchair, campsites, scenic stops, wildlife sighting locations. These are sober-compatible by definition. The public Collect API (/api/field/public/trips/:tripId) requires no auth. Zeno needs a half-day wiring job to filter for bench/camp/scenic observations within the user’s radius and render them as cards. A person on day 3 of sobriety in Calgary gets: “Bench at Wyndham-Carseland — shaded, quiet, wheelchair accessible, 45 min east.” More useful than a Ticketmaster listing.
BeachBook reports with first-party ground truth validation
What already exists: external_data.py has a proven pipeline for fetching and injecting a new data source — it already does this 6 times. external_data_section.py renders arbitrary sections into DOCX + HTML without any new rendering code. The field_observations table in emf_data.db (same machine, same SQLite) is queryable today. Trip 4 data — GPS-tagged water/wildlife observations near water bodies — is real and ready to surface.
The one missing piece: A ~50-line Python function fetch_nearby_field_observations(lat, lon, radius_km) in external_data.py. Open a second SQLite connection to the Collect DB, run a bounding-box SELECT, return typed observations. Nothing else changes — rendering pipeline, report generator, email delivery are all pre-wired. If no observations exist nearby, the section is silently skipped.
Smallest concrete step: Write the function. Hook it in beach_report_generator.py the same way GBIF is hooked. Test on Sidney Spit. One file edit, one test run.
The big idea
The Corridor Exchange — one drive, sold four times
The 10 TRIP_CATEGORIES in field-collection.js already map observation types to buyer profiles: enviro-consulting sees vegetation/invasives, county-roads sees pavement conditions, connectivity-survey sees dead zones, research sees wildlife/water. These are not the same buyers. The current Ground Boots model sells one route to one client. The Corridor Exchange lists each trip as four segmented datasets in the Marketplace — same drive, sliced by type, priced separately. CSRD buys the fire-risk segment. Rogers buys the connectivity segment. Miistakis buys the wildlife segment. A ranch buyer gets the water/fuel segment. The June Salmon Arm run (30 stops) could generate $29 × 4 in passive Marketplace sales, plus open the door for a $1,500/qtr Monitoring subscription from whichever buyer wants quarterly updates. The Marketplace has the payment plumbing. The TELUS bundle has the data. TRIP_CATEGORIES knows the buyer mapping. The missing connector is a segment_type query param on the export endpoint that filters by observation type before zipping. One param, four products.
Tomorrow’s suggestion
Wire the TELUS bundle into the Marketplace as a self-serve product listing. This creates a revenue path that doesn’t depend on email replies — the CSRD and Miistakis outreach is still unsent; the Marketplace doesn’t wait on inboxes. List the June Salmon Arm trip as a pre-order with an estimated delivery date before the drive happens. That’s a real commercial signal: the Marketplace has live inventory.