Product

generated 2026-09-18 PT · Weekly Business Review ↗

summary

On top of the automatic 6am sweep. Queues the action — ask Claude to drain it to run it now.
ready to test (33)
Build 50 · cut Build 50 — preview. Runtime 30 → 32 — a FRESH INSTALL, not an update. **Label corrected 2026-09-16 (BASH-34):** this card read “Runtime unchanged since build 49”, which is false — build 49’s commit 654df0295 carries runtime 30 and build 50’s 74ee7db4c carries 32. Two bumps landed between them: 31 with the DEF-1607/1608/1609/1617 batch (3b97af6f7) and 32 with S-D-345 (74ee7db4c). The OTA lane was therefore shut across that gap and build 50 cannot arrive as an update. Verified by content (DEF-872). On the device vs build 49: S-D-345 (the Water Notes facet — a twenty-second voice note transcribed on the phone, or a typed note) plus a run of DEF fixes (DEF-1677, DEF-1672, DEF-1671 self-hosted Water Notes board font, DEF-1668/1669/1670, DEF-1665 Edit Fishery sheet scroll/cap, DEF-1662 Stop-nudge on-demand evaluation, DEF-1659/1660/1661, DEF-1657/1658, DEF-1656). Preview profile: dev tools on, direct install, preview channel. Delivery review recorded against 74ee7db4c (DEF-133): empty diff against origin/main, nothing new to review since this is the merged tip of main. Nate's walk: open a water, add a Water Note as a voice note, confirm it transcribes and appears on the Notes facet. · 33 to test
This is the build on your phone. Install or update it, then tap a card below for what to check.
Install on your phone ›
Install QR for build 50
ready to testBS-D-56Kill-relaunch recovery from on-disk segments (+ `guard !armed`)in build 50
what it is
If the app gets killed mid-recording — a crash, or you force-quit before stopping — the audio it already captured is now found and recovered on the next launch and processed normally, instead of being stranded.
On your phone · tap for how to check it

how to check it

  1. After the next build lands on your phone, start a recording and let it run for a bit.
  2. Force-quit the app (swipe it away) BEFORE pressing Stop.
  3. Reopen the app — that session's audio should be recovered and processed normally (it transcribes and is not marked failed).
  4. A normal record-then-stop should still work exactly as before.
ready to testES-E-33Test-session loader: "from transcript" vs "from audio" mode (true end-to-end)in build 50
what it is
Lets you replay a saved test recording either from its stored transcript (fast) or freshly from the original audio (so changes to the transcription actually get tested), instead of always replaying a frozen transcript.
Review the extracted output · tap for how to check it

how to check it

  1. Open the dev tools test-session list and find Cle Elum.
  2. Tap 'from audio' — it downloads the recording and transcribes it fresh (takes a bit longer).
  3. Confirm the cutthroat catch shows up (the 'black and purple chubby' moment) — that proves it ran the real transcription, not a saved copy.
  4. Tap 'from transcript' instead — it loads instantly with no transcribing step.
ready to testDS-D-40Map layer-picker real tile thumbnailsin build 50
what it is
Shows a real little preview of each map style in the layer picker — actual satellite, topo, and street imagery — instead of a flat colored box, so you can see what you're switching to.
On your phone · tap for how to check it

how to check it

  1. Open the map and tap the layers button: each box (Default, Satellite, Hybrid, Topo) shows a real little map preview of that style — recognizable satellite, a topo map, a streets map — not a flat color.
  2. The four previews look clearly different from each other.
  3. The currently-selected layer's box still reads as selected (highlighted).
  4. Tapping a box still switches the map to that style.
ready to testBS-B-19Confidence-radius observation placementin build 50
what it is
Pins your catches and notes at an honest spot: a precise dot when the GPS is fresh, a fuzzy circle when it's less sure, and a 'place it yourself' prompt when it can't tell.
On your phone · tap for how to check it

how to check it

  1. A catch logged right when the GPS had a fresh fix shows as a precise dot on the map.
  2. A catch logged a few minutes off the nearest GPS fix shows a dot inside a fuzzy circle — and the circle is bigger when you were moving faster (a drifting boat earns a wider circle than wading).
  3. A catch whose nearest GPS fix is too far off to trust shows no pin — it's listed as needing a location, with a 'place it on the map yourself' prompt.
  4. A spot you place by hand sticks exactly where you put it and reads as exact (no circle).
  5. A fuzzy circle never looks like a known exact spot.
ready to testDS-D-42Sentry crash/error reporting with coordinate-scrubbing + recovery boundaryin build 50
what it is
The app now reports crashes and errors to us automatically so we can fix them — with your location and any GPS coordinates scrubbed out first for privacy.
On your phone · tap for how to check it

how to check it

  1. Mostly behind the scenes: after a build that sends crash data, the CRM Health page starts showing crash/error counts, and the reports never include your coordinates or location.
ready to testDS-D-41Branded hybrid map layer + Inter Tight glyphsin build 50
what it is
The map now uses our own branded style and typeface (Inter Tight labels) instead of a generic look.
On your phone · tap for how to check it

how to check it

  1. Open the map — the labels and styling match the app's brand and read cleanly.
ready to testAS-A-72One-tap voice bug capture (tap to record → tap to stop + send)in build 50
what it is
The bug-report button is now one tap: tap once to snapshot the screen and start recording, tap again to stop and send — no extra modal in between.
On your phone · tap for how to check it

how to check it

  1. With debug capture mode ON, tap the floating bug button on any screen — it switches to a pulsing recording state; tap again — it briefly shows sending/✓ and returns to idle. (We confirm the report arrived with the screenshot, audio, and context.)
ready to testDS-D-38In-app Supabase test-session picker → real extraction → native placementin build 50
what it is
A developer tool that loads a saved test recording from the cloud, runs it through the real extraction pipeline, and shows the observations placed — so extraction can be tested without going fishing.
On your phone · tap for how to check it

how to check it

  1. In the dev tools, pick a seeded test session — it loads, runs through extraction, and the resulting day shows its observations placed on the map.
ready to testDS-D-345A water's Notes facet: speak a twenty-second note or type one, and read it back · 2026-09-15in build 50
what it is
A water's page gets a Notes tab where you can speak a twenty-second note or type one, and read it back as words. The phone turns speech into words itself, so it works with no signal. This needs a new phone build (a paid build, your go) before it shows up on your phone — it changes app.json. Until that build is cut, every other change merged after it waits behind it too.
On your phone · tap for how to check it

how to check it

  1. Open a water, swipe the facet ring to Notes. You should see a Coming soon card, an 'Add a note' plate with two tiles (the fish mark and a pencil), and nothing else on a fresh water.
  2. Tap the fish mark. A sheet slides up with a countdown from 0:20 and the mark moving as you talk. Say the river's name, a hatch and a fly pattern, then slide to stop. A card appears at the top: VOICE NOTE, JUST NOW, and the words you said.
  3. Tap the pencil. Type a sentence, tap Save note. A NOTE card appears above the voice note. Open the pencil again, type, tap Discard: nothing is saved.
  4. Swipe a card left and tap DELETE. It is gone with no confirm.
  5. Start a session from the Record tab, then open a water's Notes: the fish-mark tile is greyed out and does nothing; the pencil still works.
  6. Turn on airplane mode and speak a note. It still turns into words.
  7. Tap the × on the Notes Coming soon card. Open any Day's Lessons: its own Coming soon card is still there.
ready to testDS-D-343Other rivers are small dots while a river or a day is picked · 2026-09-15in build 50
what it is
When you have a river or a day picked, every other river on the map shows as a small dot instead of a full-size pin, so it is obvious which pins are yours.
On your phone · tap for how to check it

how to check it

  1. On the map, pick a river (tap one of its pins, or open a day). Zoom out until other rivers are in view: every other river is a small dot, yours keeps its normal pins.
  2. Zoom in to a stretch of your river near a neighbouring river's spots: the neighbour's spots are dots, your stretch's pins are full size. A neighbour's flow gauge, if it has one, is still a full marker for now — that one is your call.
  3. Open a day instead of a water: other rivers are dots, and they are not narrowed to that day.
  4. Tap a dot: the map switches to that river, its pins become full size, and the river you left becomes dots.
  5. Pick a river with no other rivers in view: no dots at all.
  6. Tap the X to go back to the main map: unchanged from today — dots only when zoomed right out, normal pins as you zoom in.
ready to testDS-D-342An aggregated pin shares like a single pin: TaleWater link, or open its spot in a map app · 2026-09-15in build 50
what it is
A pin that stands for several observations now shares the way a single pin does: send the TaleWater link, which carries the whole stretch, or open just that spot in Apple Maps, Google Maps or Waze.
On your phone · tap for how to check it

how to check it

  1. On the map, tap a pin that stands for several observations (the card opens with groups like Catches and Encounters), then tap the share mark in its top-right corner.
  2. The sheet should list 'TaleWater link' and 'Open in Apple Maps' — plus 'Open in Google Maps' and 'Open in Waze' if you have them — and no SHARE… button. Same rows as a single pin.
  3. Tap 'Open in Google Maps'. Google Maps opens on that spot with a dropped pin and nothing else — no notes, no fly, no link.
  4. Come back, open the same pin's share again and tap 'TaleWater link'. The Messages draft carries the run link, and the page behind it is the whole stretch, as before.
ready to testDS-D-341The card strip only holds what is on screen · 2026-09-15in build 50
what it is
On a water's map, the card strip only holds the pins that are on screen, so swiping it never slides the map more than about a screen — zoomed in on one stretch, the far stretch's card is simply not there; zoomed out until both show, the strip cycles both.
On your phone · tap for how to check it

how to check it

  1. Open the map and tap into East Walker River (or any water where you fished two places miles apart).
  2. Pinch in until only one of those places fills the screen.
  3. Swipe the card strip all the way to either end. The map should slide a little each time and never jump to the far place; its card is simply not there.
  4. Pinch out until both places are on screen. Swipe the strip again: now both places' cards are in it and the swipe moves between them.
  5. Still zoomed in, pan along the empty river between the two places. With no pin on screen the strip goes away, and it comes back when a pin does. Tell me if that feels wrong rather than right.
  6. While zoomed in, pan by hand to the far place. Its cards appear in the strip and the first place's cards drop out.
ready to testDS-D-332Share goes straight to Messages · 2026-09-14in build 50
what it is
Tapping Share… opens Messages with the text ready to send, instead of Apple's share sheet full of other apps. No new phone build is needed for the change itself, but the over-the-air lane is shut behind an earlier native change, so it rides the next phone build.
On your phone · tap for how to check it

how to check it

  1. Open a water (Cle Elum will do), tap share, then Share….
  2. Messages opens on a new message with "Nathan shared a river with you:" and the link already in the box, and no one in the To: field yet.
  3. No Apple sheet, no Amazon, no Facebook, no Quick Note.
  4. Close the message without sending: nothing was sent and TaleWater is where you left it.
  5. Do the same from a pin and from a gauge's corner share button.
ready to testDS-D-331Share the frame, not the ids · 2026-09-14in build 50
what it is
Framing a stretch of a river to share now always works, however many spots it holds: the link carries the edges of your frame instead of a list of every observation, so the 'Too much to leave out' refusal is gone. Anyone with the link sees what is inside the stretch, including spots you log there later; nothing outside it, ever. No new phone build is needed, but the over-the-air lane is shut behind an earlier native change, so it rides the next phone build.
On your phone · tap for how to check it

how to check it

  1. Your current phone build keeps working exactly as it does today, including framing a stretch of up to about sixty spots. The frame with no limit needs the next phone build.
  2. On the new build: open Cle Elum River, tap share, tap the Map row, frame about half the river, take the frame, tap Share…. Messages opens with a link. No "Too much to leave out".
  3. Open the link: the page shows only what is inside the stretch you framed. Nothing from outside it, not a put-in, not a camp.
  4. Frame out one pin on the edge and share again: the link mints and that pin is gone from the page.
  5. The one refusal left: if the pins sitting right on the frame's edge together hide more than sixty observations, the sheet asks you to move the edge so they are fully in or out. On Cle Elum this should never fire.
ready to testDS-D-330The Techniques facet says "soft inside seams", not "the soft inside" · 2026-09-15in build 50
On your phone
ready to testDS-D-326Recording refuses to start when the phone is only sharing a rough locationin build 50
what it is
If Precise Location is switched off for TaleWater, tapping Record now lands on a screen that says the phone is only sharing a rough idea of where you are and points you to the switch in Settings, instead of quietly recording a track that is off by kilometres. It is a code-only change, but no build on your phone can receive updates right now, so it arrives with the next phone build.
On your phone · tap for how to check it

how to check it

  1. Settings › TaleWater › Location: turn Precise Location off. Open TaleWater and tap Start Session — you land on a screen headed PRECISE · OFF that says TaleWater can't pin a rough location, with Open Settings and Go to my journal. Nothing starts recording.
  2. Tap Open Settings: it lands on the TaleWater location pane with the Precise Location switch on it. Turn it back on.
  3. Back in TaleWater, tap Start Session: a session starts as before.
  4. The other three screens (microphone off, location off, both off) behave exactly as they did.
ready to testDS-D-319The real TaleWater icon, on inkin build 50
what it is
The app's home-screen icon becomes the real TaleWater mark — the recording waveform with its blue reflection on a dark ink tile — with matching dark and tinted versions for iOS 18. This needs a new phone build (a paid build, your go) before it shows up on your phone — it changes app.json. Until that build is cut, every other change merged after it waits behind it too.
On your phone · tap for how to check it

how to check it

  1. Install the new build and look at the home screen: the TaleWater tile is dark ink with the recording waveform and its blue reflection — the same mark as the record screen. Does it hold its own next to the other apps at arm's length?
  2. Switch the phone to dark mode (Settings › Display & Brightness): the tile is the same dark ink one. Apple's own dark icons show a gradient through a transparent ground; ours is a flat tile by design — if it reads dead next to the system tiles, say so and there is a one-file follow-up.
  3. Long-press the home screen › Edit › Customize › Tinted: the icon should still show bars, reflection and ground as three different tones rather than one block.
ready to testDS-D-317Permission prompts at the first record tap, and a real screen when you say noin build 50
what it is
When you tap Start Session for the first time, the phone asks for the microphone and then for location, and 'Allow While Using App' is enough to start recording; if you say no to either, you land on a clear screen that says what's off and takes you to Settings. This needs a new phone build (a paid build, your go) before it shows up on your phone — it changes app.json. Until that build is cut, every other change merged after it waits behind it too.
On your phone · tap for how to check it

how to check it

  1. Delete the app and reinstall it from the new build, then tap Start Session: the phone asks for the microphone first, then for location. Say Allow, then Allow While Using App — the recording starts.
  2. Put the phone in your pocket for a real session. Later, on its own, iOS asks whether TaleWater can keep using your location in the background; pick Always Allow. That prompt comes from iOS, not the app.
  3. In Settings › TaleWater, turn the Microphone off and tap Start Session: you land on a screen that says TaleWater can't hear anything, with Open Settings and Go to my journal. Turn it back on and the next tap records again.
  4. Do the same with Location: the screen says TaleWater can't record without location. With both off, one screen says TaleWater can't record.
ready to testDS-D-310Open a pin's coordinates in an installed map app · 2026-09-11in build 50
what it is
A pin can open its exact spot directly in whichever map apps you have installed — Apple Maps, Google Maps, Waze and the like — with nothing but the coordinates.
On your phone · tap for how to check it

how to check it

  1. Install the next TaleWater build (this one needs a real build, not an over-the-air update).
  2. Open any pin on the map and tap share.
  3. Under "TaleWater link" you should see "Open in Apple Maps" — and "Open in Google Maps" if you have it installed (Waze too, if you have that).
  4. Tap Google Maps: it should open right on the pin's spot with nothing else attached.
ready to testS-D-257The Map tab renders the ladder, and the carousel becomes a carousel of the rungin build 50
what it is
Redraws the map so catches show as how full a place's ring is — one mark per water when zoomed out, then sections, runs, and single fish as you pinch in — and turns the bottom card strip into one card per thing on screen at that zoom, so a busy day never buries the water.
On your phone · tap for how to check it

how to check it

  1. Open the Map tab and pinch out until you see the whole region: each of your waters is one mark with a ring around it — the fuller the ring, the more fish that water has produced. No numbers anywhere on the map.
  2. Tap a water (or its card in the strip at the bottom). The map flies in to that water: the river wears shaded sleeves, one per mile-ish stretch, wider and darker where more fish came from; the access points sit at the ends. The strip lists the stretches.
  3. Pinch in. The stretches give way to the runs and structure, each with the same ring; pinch further and the individual fish appear, merging into one dot with stacked plates where they crowd. Pinch back out and they fold up again.
  4. Swipe the strip: the map glides card to card at the zoom you are at. Tap a run card to open it, tap a fish card to open the catch.
  5. Tap a run on the map: a sheet rises with its name, its note and how many fish were logged there; any hatch or technique you noted there is listed on it.
  6. Tap the fish pill at the top: the rings, sleeves and fish disappear and only the physical water remains — access points, runs, stretches. Tap it again to bring the catches back.
  7. Pick a day from the calendar: every place stays on the map; the rings and sleeves thin to just that day's fish.
  8. On your densest water, pinch through all the levels: it should feel responsive at every step.
ready to testS-D-250Device data at rest: the session moves to the keychain; the debug queue leaves the backup (2026-09-03)in build 50
what it is
Keeps your sign-in token in the phone's secure keychain instead of a plain file, and leaves the app's own debug upload queue out of your iCloud backup — your recordings and your log stay backed up.
On your phone · tap for how to check it

how to check it

  1. Install the next build over the one you have. Open the app: you are still signed in — no Welcome screen, no code to enter.
  2. Sign out and sign back in with your phone number: it works exactly as before.
  3. Nothing else is visible. The rest is an inspection Claude runs on the simulator: the sign-in token is no longer in the app's plain-text storage file, and only the debug upload folder carries the 'skip iCloud backup' mark — your recordings and your log do not.
ready to testBS-B-249Two dev test accounts and a switcher, so a share can be received by somebody who is not you · 2026-09-15in build 50
what it is
Two throwaway test accounts and a way to hop into them from the dev panel, so you can see what a share looks like when it arrives in somebody else's app without ever signing out of Apple on your own phone. Your own days stay on the phone the whole time — they are just hidden while you are somebody else. This needs a new phone build before it shows up on your phone, and that build is already owed for other changes — not an extra one.
On your phone · tap for how to check it

how to check it

  1. On the new build, go to You → Labs → 'Switch account'. The line above the buttons says 'Signed in as your own account'.
  2. Tap 'Switch to Test A'. The app signs you out, signs in as Test A, and lands you back in with an empty Journal and Map. The line now says 'Signed in as Test A'. Apple's sheet never appears.
  3. Tap 'Switch to Test B'. Same again, cleanly — nothing of Test A is left behind.
  4. Tap 'Switch to Test B' a second time. Nothing happens, and the note says you are already signed in as Test B.
  5. Tap 'Back to my account'. You are signed out and the Welcome screen shows. Tap Sign in with Apple to come back.
  6. Tap 'Back to my account' again now that you are on your own account. Nothing happens, and it says so.
  7. Check your own days, waters and recordings are all still there — switching hides them, it never deletes them.
  8. Turn on airplane mode and tap 'Switch to Test A'. You get a plain reason that the phone is offline, and you are left at the Welcome screen rather than a spinner. Turn airplane mode off and Sign in with Apple works again.
ready to testS-D-219Sessions-list status derived from evidencein build 50
what it is
The sessions list only ever says what is true about a recording — saved on this phone, how many chunks the server has verified, being written up, ready, or waiting for signal — and never that it is retrying.
On your phone · tap for how to check it

how to check it

  1. Install the next build, then open Record and flip to Sessions.
  2. Every recording shows one of nine words: Recording, Saved on this phone, Sending audio, k of N verified, Writing up your session, Ready, Waiting for signal, Needs attention, Checking status. Nothing ever says Retrying, Uploading, Saving, or Couldn't.
  3. Stop a recording with Wi-Fi off: the row reads Saved on this phone, then counts chunks as they verify once you have signal, then Writing up your session, then Ready.
  4. Turn Low Power Mode on while a recording is still sending: a small line under the word says so. Turn it off and the line goes away on the next reload of the list.
  5. There is no Export audio link under any row any more; the developer tools still have their export.
ready to testS-D-169Day Conditions gets a cleaner one-panel layoutin build 50
what it is
Redesigns the Day screen's weather/flow/water-conditions card into one cleaner panel, and lets you fill in any blank reading (flow, water temp, clarity) by hand for a day after the fact.
On your phone · tap for how to check it

how to check it

  1. Open a recent Day and look at its Conditions card — it should now read as one panel with a time-of-day header, instead of two separate cards.
  2. Weather should still be the biggest, most prominent number on the card.
  3. If flow, water temp, or clarity is blank for that day, tap the blank spot — it should let you type in a value, and it should stick after you back out and reopen the day.
  4. A reading that's already filled in should just display as plain text, not be tappable.
ready to testS-D-154Forecast opens your weather app, not a web pagein build 50
what it is
Tapping Forecast on a water's Conditions card now opens your actual weather app (Apple Weather, or a chooser if you have more than one recognized weather app installed) instead of a browser page.
On your phone · tap for how to check it

how to check it

  1. Open a water's Conditions tab and tap 'Forecast'.
  2. It should open Apple Weather (or another weather app) directly, not a web page in your browser.
  3. If you have more than one recognized weather app installed, you should get a pick-one menu first.
ready to testS-D-149Map pins: uniform 24px borderless pins, no pin-level aggregation (2026-07-20 handoff)in build 50
On your phone
ready to testS-B-147App, additive: grant inventory, seal-time upload, all-pending Stop, outcome ledgerin build 50
what it is
The phone sends each chunk of a recording to the server as soon as it is finished, while you are still recording, and hands anything left to the system at Stop so a pocketed phone keeps delivering.
On your phone · tap for how to check it

how to check it

  1. Install the new build, open Developer tools on the You tab, set Segment length to 60, and tap Refill grants (you need signal for that one step).
  2. Turn Wi-Fi off. Start a recording, lock the phone, and leave it for three minutes. Do not open the app.
  3. Claude reads the server: at least two chunks should show as verified before you press Stop. That is scenario 1.
  4. For scenario 2: start a new recording, lock the phone, wait two minutes, press Stop from the lock screen, and stay locked for five minutes.
  5. Claude reads the server again: the last chunk and the manifest should be verified, and whether that happened right away or was delayed gets written down.
ready to testS-D-128"Your session is ready" completion push notificationin build 50
what it is
Sends you a notification when your recording is done being written up, so you don't have to keep opening the app to check.
On your phone · tap for how to check it

how to check it

  1. Record something and let it finish writing up. Close the app completely.
  2. You should get a notification saying your session is written up.
  3. Tap it — it should open that day's write-up, not the home screen or a different day.
  4. Go to the You tab and switch 'Notify me when a session is written up' to Off.
  5. Record again and let it finish — no notification should arrive this time.
  6. With it still Off, open the app: the recording should still show as finished. (Notifications are just a heads-up — they're not what makes it work.)
ready to testS-D-78Continuous recording enginein build 50
what it is
Rebuilds the iPhone's recording engine so it runs continuously instead of stopping and restarting every 10 minutes — removing the restart gap that once killed a recording mid-trip, and adding a detector that can tell live audio from dead silence.
On your phone · tap for how to check it

how to check it

  1. Install the next build, then start a recording and keep it going past 10 minutes — it should carry straight through the boundary with no gap, and the finished recording should play back complete.
  2. While recording, unplug headphones or connect a Bluetooth mic — the recording should keep going without a hiccup.
  3. Take a phone call mid-recording — after you hang up, the recording should pick back up on its own.
  4. If you drive with CarPlay, record through connecting and disconnecting — capture should survive the churn.
  5. Optionally: record a minute in a silent room — this feeds the calibration for the new dead-audio detector; nothing should look different in the app.
ready to testS-B-66Capture-recovery hardening (DEF-347 near-term, no rewrite)in build 50
what it is
Stops recording from stopping itself when your car's Bluetooth or CarPlay connects and disconnects mid-drive — the app used to needlessly restart the microphone every time, which is exactly what tripped it up before. It also keeps a longer, more reliable record of exactly what happened around any interruption, so a future problem can be tracked down from real data instead of luck.
On your phone · tap for how to check it

how to check it

  1. Start a recording, then get in the car and let CarPlay and your phone's Bluetooth connect and disconnect a few times while it's running — the way that used to kill a recording.
  2. Recording should keep going the whole time without dying.
  3. This doesn't fix every possible way a recording could still get interrupted for a while (that's a bigger, separate project) — but if it does, you should still get the "Recording stopped" alert from the earlier fix.
ready to testS-B-65Dead-capture alarm can no longer be silently disarmed by a backgrounded interruption (DEF-347, safety-net half)in build 50
what it is
Makes sure you get a "Recording stopped" alert if a recording actually dies while you're not looking — instead of a phone interruption silently swallowing the alert and leaving you with no warning.
On your phone · tap for how to check it

how to check it

  1. Start a recording, then trigger something that kills capture in a way it can't recover from while the phone is in your pocket (not a real call). You should get a "Recording stopped" notification about 3 minutes later.
  2. Start a recording, then take a real phone call. You should NOT get a "Recording stopped" alert while you're on the call.
  3. If recording doesn't come back on its own after you hang up, you should get the alert then — not during the call.
ready to testS-D-62Haptic feedback (taps you can feel)in build 50
what it is
The app now gives a physical tap through the phone at key moments — starting and stopping a recording, swiping the fishery cards, switching Journal lenses or the map/knowledge view, and pressing a card. It uses the iPhone's built-in tap, so you feel it even when you're not looking at the screen.
On your phone · tap for how to check it

how to check it

  1. Install the new build (scan the QR or open the link).
  2. Start a recording — you should feel a firm tap when it starts, and again when you slide to stop; a lighter success tap once it finishes saving.
  3. On a fishery, swipe the bottom card carousel — a light tick as each card snaps to center.
  4. Switch the Journal lens (Days / Species / Skills) and the fishery MAP / Knowledge toggle — a tick on each switch.
  5. Press a Water, Day, Species, or Skill card — a light tap as it depresses.
ready to testS-B-30Server-side audio assembly (the device-stitch loss-mode root fix)in build 50
what it is
Moves audio assembly off your phone — instead of the phone stitching a recording together (which is what failed and lost the 1h35m take), it just uploads the raw pieces and the server puts them together, so a phone-side glitch can't lose a recording anymore.
On your phone · tap for how to check it

how to check it

  1. Install the new build (build 16) from the link — it has to be a fresh install, not an update, because this change is under the hood.
  2. Record a few short clips (10–30 seconds each) and stop them. Each one should save and process without the 'couldn't save' error.
  3. Record one longer session across a few minutes, then stop. It should save and show up with its write-up.
  4. Check that the ones you recorded all land in your log with their transcripts — nothing stuck or missing.
ready to review (7)
Verified at merge — no build needed. Review these wherever each card says (the extracted output, the dashboard, the docs, or the artifact).
ready to reviewDS-D-39Journal Skills category tier (canon 3-level hierarchy)delivered over-the-air
what it is
Your Journal's techniques are now grouped into clear skill categories (Casting & Mending, Presentation, and so on), so the knowledge is organized instead of one flat list.
On your phone · tap for how to check it

how to check it

  1. Open the Journal's Skills lens — techniques sit under category headings, and anything uncategorized still shows under "Other" (nothing disappears).
ready to reviewDS-D-37Journal lens-card canon re-skin + collated-notes drill-indelivered over-the-air
what it is
The Journal's lens cards got the app's letterpress look, and tapping one drills into its collected notes.
On your phone · tap for how to check it

how to check it

  1. Open the Journal — the lens cards show the new letterpress style; tap one to drill into its collected notes and confirm they read clearly.
ready to reviewDS-D-36Water/Fishery detail canon-match (stacked header, bounded map, sheet sizing)delivered over-the-air
what it is
The Water (Fishery) detail screen was brought back in line with the design — a header stacked above a framed map, and a properly sized pin/knowledge sheet.
On your phone · tap for how to check it

how to check it

  1. Open a water's detail screen — the header sits on paper above a framed map (not floating over a full-bleed map), and the bottom sheet shows the grab handle, the Pins/Knowledge toggle, and the first pin row clear of the home bar.
ready to reviewDS-D-350Dark mode is off; the Appearance pill leaves the You tab · 2026-09-18delivered over-the-air
On your phone
ready to reviewDS-D-349An unnamed-water day is pinned, labelled "Unnamed Water", and carries no gauge (DEF-1763) · 2026-09-17delivered over-the-air
what it is
A day recorded somewhere the map has no named river or lake no longer disappears from the map. It shows its pins and is called "Unnamed Water" — on the day's card, under the day's title, and on its map thumbnail — and it stops borrowing the nearest gauge from a creek you were never on. No new phone build needed for the code, but the over-the-air lane is shut, so it rides the next paid build.
On your phone · tap for how to check it

how to check it

  1. Open the long recording from Sept 17 (the day that showed no map): under the date it now says "Unnamed Water", and the Summary shows a map thumbnail captioned "Unnamed Water".
  2. Tap that map thumbnail: the Map tab opens zoomed to that day's pins.
  3. Swipe to Conditions on that day: no gauge, no "Issaquah Creek", no "not on your reach" line.
  4. Open any earlier day on a known river: nothing changed — name, map and gauge as before.
  5. In the Journal list, that day's card headline reads "Unnamed Water".
ready to reviewDS-D-300The selection holds the spot you chose across a zoom, and the card row stops spinning · 2026-09-08delivered over-the-air
what it is
The pin you pick stays picked as you zoom: its card keeps the same name, and the card row holds still while the other cards come and go around it.
On your phone · tap for how to check it

how to check it

  1. On the Cle Elum, swipe the card row to the boat launch (or tap its pin and close the sheet by swiping the row to it again).
  2. Pinch in and out: the boat launch stays selected, its card keeps the same name, and the cards around it come and go without the row sliding.
ready to reviewDS-D-285The pin layer as its own subtree: measured on the real Cle Elum, then isolated so a camera move re-draws no marker · 2026-09-07delivered over-the-air
what it is
The map's pins draw as their own layer, so zooming on a river with many pins re-draws the pins and the card row, not the whole screen — measured on the real Cle Elum before and after.
On your phone · tap for how to check it

how to check it

  1. Open the Cle Elum with all your pins showing and pinch in and out a few times.
  2. Watch for any stutter as the pins regroup — there should be none you can feel.
waiting for build (5)
Merged and done, but not in the build on your phone yet — a fresh build would pick these up. Ask Claude to cut one when you want to test them.
needs a buildDS-D-348Add ™ to the TaleWater brand on its formal surfaces · 2026-09-17
what it is
TaleWater's name now carries the ™ mark once on each formal surface — the landing site, the sign-in screen, and the privacy policy and terms — now that it's filed with the USPTO. The App Store description we hold in the repo carries it too, but the live listing in App Store Connect still needs that edit made by hand. No ® anywhere yet; that waits for the registration certificate.
On your phone · tap for how to check it

how to check it

  1. Open talewater.app: the header says "TaleWater™."
  2. Open the app signed out: the sign-in screen's brand text says "TaleWater™."
  3. Open the privacy policy and terms pages: each opening paragraph carries one "TaleWater™," reading naturally.
  4. Nowhere shows "®" — it isn't available yet.
needs a buildBS-B-267Recorder housekeeping: the events snapshot is written at boundaries plus a 300 s cadence; the heartbeat leaves the relevant ring (DEF-1766, DEF-1746) · 2026-09-17
what it is
The recorder stops burning the phone's disk on its own diagnostics: the big event file it used to rewrite every two seconds for the whole recording (about 20 GB over your nine-hour day, which iOS flagged twice) is now written only when the recording stops, goes to the background or seals, plus once every five minutes. And when another app takes the mic and you leave the phone in your pocket, the once-a-second retry no longer floods the log that explains what happened. Needs a new phone build (the one that carries SOAK-1 too).
On your phone · tap for how to check it

how to check it

  1. Record a long session on the next build. In Sentry that day there should be no 'disk write exception' warning for the app.
  2. Let another app take the mic (start a voice memo, say) and leave the phone alone for 20 minutes, then reopen TaleWater. On crm.talewater.app/capture.html the recording's timeline should still show the 'resume denied' lines, not a wall of one-per-second retry lines.
  3. On a long recording's capture page (crm.talewater.app/capture.html), the two-second watchdog lines now carry a snapshot-write count that climbs about once every five minutes, not every line.
needs a buildS-D-248Sync wakes the screen
what it is
When the app finishes writing up a session, the screen you open updates itself the moment the results arrive, and shows 'Syncing' instead of a false 'All caught up' while they are still on the way.
On your phone · tap for how to check it

how to check it

  1. On the next build, record a short session and let it finish.
  2. When the 'your session is written up' notification arrives, tap it without opening the app first.
  3. The session screen should show either the pins/observations, or a 'Syncing your session…' line.
  4. It must never show 'All caught up' on an empty screen.
  5. Stay on the screen: the observations should appear on their own without leaving and coming back.
needs a buildBS-B-240Sign in with Apple is the only front door; phone OTP retired · 2026-09-12
what it is
Signing in is one tap with your Apple ID (Face ID) instead of typing a phone number and a texted code; the phone-code path is gone, and deleting your account also tells Apple to forget the sign-in. This needs a new phone build (a paid build, your go) before it shows up on your phone — it changes app.json.
On your phone · tap for how to check it

how to check it

  1. Install the new phone build. You should still be signed in (your session carries over).
  2. Open You → Labs → tap 'Link Apple ID'. Apple's sheet appears; confirm with Face ID. The note under the button says it linked.
  3. Sign out. The front door shows only one button: Sign in with Apple. No phone-number option anywhere.
  4. Tap it, Face ID, and you land in the app with every day, water and recording you had before.
  5. Sign out and sign in again — same account, same data.
needs a buildS-B-149Delete the ladders
what it is
The phone stops running its own retry timers and give-up rules for uploads; instead it asks the server what has arrived and sends only what is missing, and it never deletes audio the server has not verified.
On your phone · tap for how to check it

how to check it

  1. Nothing to do until the next build is on your phone; this story deleted the old upload machinery and replaced it with one rule: ask the server what it has, send what is missing.
  2. When the build lands: Developer tools on the You tab, Segment length 60, Refill grants once with signal, then Wi-Fi off. Work the thirteen scenarios in CAPTURE_RELIABILITY.md; Claude reads the server after each.
  3. Scenario 3 (airplane on, start, stop, airplane off, never open the app): the row goes Saved on this phone, then counts chunks, then Ready. It never says Retrying and there is no give-up.
  4. Scenario 1 is still the kill switch: if chunks do not reach the server with the phone locked, the whole approach is wrong and we revert this rather than patch it.
  5. Local audio is only ever deleted after the server has verified every chunk and finished the write-up; an unverified recording keeps its audio forever.
building (3)
BProduct architecture (MVB)S-B-270promote not yet merged
Building on an unmerged branch — the promote commit is folded into its build PR, so this lane is taken even though main does not show it yet.
DConsumer product surfacesS-D-347promote not yet merged
Building on an unmerged branch — the promote commit is folded into its build PR, so this lane is taken even though main does not show it yet.
EExtractionS-E-100promote not yet merged
Building on an unmerged branch — the promote commit is folded into its build PR, so this lane is taken even though main does not show it yet.
ready to fire (2)
AOperating model & agent orchestrationS-A-138Constraint birth invariant, CI-enforcedsmall–medium (~1× S-18).
The 2026-07-31 expired-constraints review (DEF-640–643, the AUDIT.md register) found constraints — exclusions, registries/allowlists, vendor pins, "not-applicable" claims, thresholds — rot because they are born with no feedback mechanism: nothing names when or how each would be rechecked. Enforce the invariant at birth, in CI: no new constraint lands withou…

question
The 2026-07-31 expired-constraints review (DEF-640–643, the AUDIT.md register) found constraints — exclusions, registries/allowlists, vendor pins, "not-applicable" claims, thresholds — rot because they are born with no feedback mechanism: nothing names when or how each would be rechecked. Enforce the invariant at birth, in CI: no new constraint lands withou…

prereqs
none.

acceptance sketch
a new exclusion/registry entry/pin added without a recheck annotation fails CI naming the missing declaration; the same change with the annotation passes; untouched existing constraints never fail the build.

sizing
small–medium (~1× S-18).

FBusiness readinessS-F-03Obtain D-U-N-S number from D&B~30 min Nate's active work (D&B online form). Free path: 7–30 business days for D&B issuance. Expedited paid path ($229…
Is a D-U-N-S number issued for TaleWater LLC and visible to Apple's enrollment system, so S-F-04 (Apple Developer org transition) has its required prerequisite in hand?

question
Is a D-U-N-S number issued for TaleWater LLC and visible to Apple's enrollment system, so S-F-04 (Apple Developer org transition) has its required prerequisite in hand?

prereqs
S-F-01 complete (LLC formed — D&B requires legal entity name + business address). Can run in parallel with S-F-02 (TM filing).

sizing
~30 min Nate's active work (D&B online form). Free path: 7–30 business days for D&B issuance. Expedited paid path ($229…

not ready (1)
COperator back-officeblocked
Next up is empty — no queued stories.
recommendation
S-A-138, S-F-03 are all ready — different workstreams, no P-22 collisions, can run concurrently. 3 workstream(s) already active.

runs — gated story bundles

water-delete-one-door-2026-09-16active0/2 merged
Nate's single run-level go 2026-09-15, verbatim:
  1. S-B-253DEF-1656 freeze fixes: truthful `rowsChanged` + Waters fan-out decoupleready
  2. S-B-254One door out of `fisheries`: `unbindWaterIn` + a single row-set predicate (DEF-1672 + DATA_LAYER §9f)blockedawaiting S-B-253 merged
→ next to promote: S-B-253 DEF-1656 freeze fixes: truthful `rowsChanged` + Waters fan-out decouple
share-receive-2026-09-14active3/3 merged
Nate's single run-level go 2026-09-14, verbatim:
  1. S-B-249Dev test accounts and an account switchermerged
  2. S-D-334The saved copy remembers where it came from (core: origin ids, dedupe, saved state, stats exclusion, sign-in survival; folds `DEF-1623`/`DEF-1624`)merged
  3. S-D-336The save suggests the water and carries its lessonsmerged
→ all members merged — run complete
e-access-reliability-2026-09-11active1/1 merged
Nate's single run-level go 2026-09-11, verbatim:
  1. S-E-101Access points gleaned from implied cues, not just "this is the put-in"merged
→ all members merged — run complete
submit-signin-2026-09-12active1/1 merged
Nate's 2026-09-12 go (chat, App Store submission sprint proposal). Verbatim, in sequence: **"keep apple sign in out if I do that Ill do separately. 1. screenshots 2. 2 biz days 3. ok"** — then reversed: **"No sorry, we need apple sign in, sorry for reversing direciton."** Net ruling: Apple sign-in is IN, as its own run. Model tier: **Opus**.
  1. S-B-240Sign in with Apple becomes the only front door; phone OTP is retired.merged
→ all members merged — run complete
submit-app-2026-09-12active4/5 merged
Nate's 2026-09-12 go, same sequence as `submit-signin-2026-09-12`. Model tier: **Opus**.
  1. S-D-317Permission moments, mic & location.merged
  2. S-D-319App icon export + dark/tinted variants.merged
  3. S-D-318Plans table catches up with the entitlement revision, one build with `S-D-216`.merged
  4. S-D-216You-tab plan card: the four states the design added, same build as `S-D-318`.ready
  5. S-D-316Account deletion, the full path.merged
→ next to promote: S-D-216 You-tab plan card: the four states the design added, same build as `S-D-318`.
submit-store-2026-09-12active2/3 merged
Nate's 2026-09-12 go, same sequence as `submit-signin-2026-09-12`. Model tier: **Sonnet**.
  1. S-F-15Publish the legal + support pages on `talewater.app`.merged
  2. S-F-08App Store subscription/IAP product configuration.merged
  3. S-F-06App Store listing assets.ready
→ next to promote: S-F-06 App Store listing assets.
share-sheet-2026-09-11active2/2 merged
Nate's 2026-09-11 go in chat ("ok build please") on the two share stories filed the same day; he chose "trim Apple's sheet" over a custom chooser for the send half.
  1. S-D-309Share sheet shows messaging apps onlymerged
  2. S-D-310Open a pin's coordinates in an installed map appmerged
→ all members merged — run complete
shared-map-full-screen-2026-09-11active1/1 merged
Nate's 2026-09-11 go in chat ("Yes I want recipients to be able to pan and zoom. Could link out to a full map even.").
  1. S-D-313The shared page's map opens full-screen, pan and zoommerged
→ all members merged — run complete
cle-elum-water-lock-2026-09-10active1/1 merged
Nate's 2026-09-10 direction: "Build story S-B-228 (sync the day's hand-set-water lock) and repair Nate's Cle Elum day so it stops reverting to Yakima. Nate has said 'go'."
  1. S-B-228Sync the day's hand-set-water lock and repair Cle Elummerged
→ all members merged — run complete
a-lean-2026-09-13active2/2 merged
Nathan approved the final two-unit plan after two Claude
  1. S-A-247LEAN-FIXmerged
  2. S-A-248LEAN-APPLYmerged
→ all members merged — run complete
a-lean-2026-09-09parked0/0 merged
    d-places-are-the-water-2026-09-07done5/5 merged
    Nate's "go" 2026-09-07 (verbatim: **"go on all"** — the run's go and the DEF-1360 repair together). Members 1–4 merged and delivered: Member 1 `S-D-286` MERGED 2026-09-07 (#3267), delivered OTA `eager-osprey`. Member 2 SWAPPED 2026-09-07 — `S-E-97` withdrawn (see its Scoped entry), replaced by `S-D-288` on Nate's ruling ("If its one spot, it should be one pin and we describe the spot using the feature data"); `S-D-288` MERGED 2026-09-07 (#3270, `a96aa22ba`), delivered OTA `eager-osprey`. Member 3 `S-D-287` MERGED 2026-09-07 (#3273), delivered OTA `jade-eddy`. Member 4 `S-D-284` MERGED 2026-09-07 (#3279), delivered OTA `plucky-osprey`. Member 5 `S-D-285` MERGED 2026-09-07 (#3283, `0dcd52fd8`), delivered OTA `umber-trout` (ledger PR #3286). Readiness GO. Run COMPLETE 2026-09-07.
    1. S-D-286A place belongs to the water: the day view keeps every place, filters only catches and encountersmerged
    2. S-D-288One spot, one pin: same-day place observations within 25 m fold into one pin described by their feature datamerged
    3. S-D-287"Not a place": dismiss an extracted feature that is really narration, and teach extraction from itmerged
    4. S-D-284River order without a centerlinemerged
    5. S-D-285Isolate the pin layer from the map screen's re-rendermerged
    d-pin-slide-2026-09-07active1/1 merged
    Nate's go 2026-09-07, after the umber-trout walk, verbatim: **"The
    1. S-D-293The pin slide on zoom, done right: marks slide out of their group on every regroup, animated on the UI threadmerged
    → all members merged — run complete
    d-one-tree-phase-b-2026-09-06active1/1 merged
    Nate's "go!" 2026-09-06 (verbatim: **"Ok I'll take your recommendation. go!"**), on `Q-MAP11` as presented: linkage = H (hybrid: single-linkage tree with the cut-time diameter policy, k = 3); sub-item — a feature's description (`notes`) stands in as its pin/card title when it has no `location_name`; accepted trade-offs, the real day: reach up to 1.2 km at the widest zoom, hidden-seat rate 18% (pair-weighted), 0 pairs under 44 px.
    1. S-D-276Phase B — the producer swapmerged
    → all members merged — run complete
    d-one-tree-2026-09-06done1/1 merged
    Phase A member merged (PR #3237, `S-D-274`). Nate's single "go" 2026-09-06 (verbatim: **"looks like you have plenty of context, just go"**), after the Claude ↔ GPT Astra adversarial review converged on Phase A first. Readiness-gate 2026-09-06: `S-D-274` GO on all eight checks (the two judgment flags — an "open fork" mention that is Q-MAP11, the gate at the END of Phase A, and a GATING/design-surface mention that is Phase B's — cleared by judgment; the `S-D-269` prereq wording re-shaped so the parser stops reading it as a predecessor: Phase A is tooling only). Member 1 promotes to `Active_Story_D.md` (slot D, free — S-D-267 merged #3215) under run-mode, the promote commit being the first commit on `claude/D-274-one-tree-harness` (S-A-163).
    1. S-D-274Phase A — the measurement harnessmerged
    bash-12-identity-tail-2026-09-03active5/5 merged
    Nate's single "go" is the sprint dispatch itself (`/sprint BASH-12` "GO", 2026-09-03), per the brief's `Run:` line ("PM registers the run at promotion"). Member 1 (`S-B-197`) ACTIVE 2026-09-03 on `claude/B-197-a-b-assertions` (folded run-mode promote, S-A-163) in slot B3; member 5 (`S-D-250`) has slot D4 claimed (`claude/D-250-session-keychain`) and builds concurrently — cross-workstream, P-22 unrestricted.
    1. S-B-197The A→B assertions (story zero)merged
    2. S-B-195the residue: identity-leaks tail (`DEF-1139`→renderer routed, `DEF-1141`, `DEF-1142`, `DEF-1143`, `DEF-1178`; the story itself merged in `BASH-9`, PR #2938, so this rides `fix/identity-leaks-tail-2026-09-03`, not a promotion)merged
    3. S-B-194the keep-current rule, template-form amendmentmerged
    4. S-B-192half (i): per-user consent keying (`DEF-1138`)merged
    5. S-D-250session to the keychain; debug queue out of backupmerged
    → all members merged — run complete
    d-container-ladder-2026-09-03done3/3 merged
    completed 2026-09-03; **all three members merged** (`S-B-196` #2934, `S-D-256` #2949, `S-D-257` via its reconcile PR); Nate gave the single "go" 2026-09-03 (verbatim: **"go on 196, 256, 257"**) after four one-at-a-time rulings recorded on the members' Scoped entries (scope = every water in view; encounters count, hatch/technique are place attributes; day = a filter over the ladder; both step-zero spikes run first). Readiness-gate 2026-09-03: `S-B-196` GO and `S-D-256` GO (the one `?` flag — each names the other as a soft sequencing preference — cleared by judgment: they are independent builds); `S-D-257` NO-GO on unmet predecessors, by design — it is member 3.
    1. S-B-196A real centerline per water (the ladder's spine)merged
    2. S-D-256The ladder engine — pure, zoom-independent model + per-rung placement, with a perf budgetmerged
    3. S-D-257The Map tab renders the ladder, and the carousel becomes a carousel of the rungmerged
    e-pipeline-infraactive4/6 merged
    Nate gave the single "go" (relayed 2026-07-31), scope-locking all
    1. S-E-65Delete the KV stage-event log; read Workflows' own step historymerged
    2. S-E-67Make silent extraction repair LOUDmerged
    3. S-E-66Real concurrency pool, parallel dedup, delete the nested inner retrymerged
    4. S-E-68Structured-output PILOT on the dedup callmerged
    5. S-E-69Structured-output extraction + fieldnotes + segment-boundary chunkingready
    6. S-E-29Re-tag / re-cluster existing stored learnings (backfill)ready
    → next to promote: S-E-69 Structured-output extraction + fieldnotes + segment-boundary chunking also: S-E-29
    defect-clear-2026-07active5/8 merged
    Nate gave the single "go" on 2026-07-16 (verbatim: **"GO on above"**),
    1. S-A-123Make defect numbers allocatable and collisions mechanically impossible, then sweep the registermerged
    2. S-A-124e2e net fail-aggregation + drain the flow repairs behind itblockednone stop the e2e Maestro runner from fail-fast masking downstream flows — is **already shipped**. `.maestro/run-all.sh` already runs every wired flow independently and aggregates pass/fail into one summary (credited in its own header to DEF-453/DEF-431/ DEF-384, not this story's numbers); `package.json`'s `e2e` script already calls this runner, not the `for f in ...; do maestro test "$f" || exit 1; done` loop the Question above describes — that description is stale. Of the 9 defects claimed above: **DEF-200 is CUT** (verified moot, surface deleted, 2026-07-24); **DEF-233 was renumbered away** during the DEF-372 Phase B sweep to an unrelated DEF-470 audio-capture bug that won the number-collision — the original e2e-side DEF-233 claim's current identity is unclear and needs the `S-A-125` register-sweep to resolve, not this story; **DEF-230, DEF-173, DEF-284, DEF-174, DEF-088, DEF-220 do not exist as entries** under those numbers in the current register — likely stale/never-flipped or already renumbered elsewhere. **DEF-295 is the one exception — still genuinely OPEN and real** (a rollup-sheet rendering bug, unrelated to e2e fail-fast masking); it is NOT closed by this finding, stays in the OPEN register, and needs its own fix path separately. **Nate's disposition (chat, 2026-07-24, verbatim "1"):** mark this run member **closed-by-other-means / no action needed** — do not promote or build it. The DEF-233/DEF-230/etc. stale-ID confusion this finding surfaced is `S-A-125`'s (the deferred register-sweep) to actually resolve, not a new action item here
    3. S-B-67Honest recording state: the recording never liesblocked`PR #668 merged`
    4. S-D-111Observation-detail: Undo net + `MASTHEAD_CLEARANCE` validation (REDUCED 2026-07-31)merged
    5. S-D-112Water-map camera restore + carousel index correctnessmerged
    6. S-D-113Day-level Weather write pathmerged
    7. S-D-114June bug-batch re-validation passready
    8. S-E-60Adopt Nate's 7-item technique taxonomymerged
    → next to promote: S-D-114 June bug-batch re-validation pass (out of order — head S-A-124 blocked: none stop the e2e Maestro runner from fail-fast masking downstream flows — is **already shipped**. `.maestro/run-all.sh` already runs every wired flow independently and aggregates pass/fail into one summary (credited in its own header to DEF-453/DEF-431/ DEF-384, not this story's numbers); `package.json`'s `e2e` script already calls this runner, not the `for f in ...; do maestro test "$f" || exit 1; done` loop the Question above describes — that description is stale. Of the 9 defects claimed above: **DEF-200 is CUT** (verified moot, surface deleted, 2026-07-24); **DEF-233 was renumbered away** during the DEF-372 Phase B sweep to an unrelated DEF-470 audio-capture bug that won the number-collision — the original e2e-side DEF-233 claim's current identity is unclear and needs the `S-A-125` register-sweep to resolve, not this story; **DEF-230, DEF-173, DEF-284, DEF-174, DEF-088, DEF-220 do not exist as entries** under those numbers in the current register — likely stale/never-flipped or already renumbered elsewhere. **DEF-295 is the one exception — still genuinely OPEN and real** (a rollup-sheet rendering bug, unrelated to e2e fail-fast masking); it is NOT closed by this finding, stays in the OPEN register, and needs its own fix path separately. **Nate's disposition (chat, 2026-07-24, verbatim "1"):** mark this run member **closed-by-other-means / no action needed** — do not promote or build it. The DEF-233/DEF-230/etc. stale-ID confusion this finding surfaced is `S-A-125`'s (the deferred register-sweep) to actually resolve, not a new action item here)
    Multi-user auth & onboardingparked1/4 merged
    1. S-B-16Apple Sign Inparked
    2. S-B-17Phone + OTP + phone-anchor linkingmerged
    3. S-D-27Onboarding / sign-in flow screensparked
    4. S-D-28Account-management screenparked
    self-healing-loop-triggersactive1/3 merged
    gated by Nate 2026-06-29 ("go with the scoped item"). Members auto-promote in
    1. S-A-94Wire the bug-intake triage pollmerged
    2. S-A-95Wire the autonomous auto-fix pollready
    3. S-A-96Surface auto-merged fixes in the CRM verification inboxblockedawaiting S-A-93, S-A-95 merged; coordinate with `S-A-93`. *(2026-08-29: the delivery target is gone — `S-C-45` killed `inbox.html`, the `crm-inbox-drainer`, and the `crm_inbox_actions` apply path. See the kill-notes on the `S-A-96` and `S-A-93` Scoped entries; this member needs reshaping against a surviving surface before it can promote.)*
    → next to promote: S-A-95 Wire the autonomous auto-fix poll
    paid-call-guardrailsactive4/7 merged
    Nate gave the single "go" 2026-07-02 in chat (verbatim: "OK great.
    1. S-A-107DEF-179 fix: bring bug-intake-triage back online, fencedmerged
    2. S-A-108Paid-call inventory & registrymerged
    3. S-A-109Account-level spend walls (per-provider hard caps)ready
    4. S-A-110Spend telemetry + alert busmerged
    5. S-A-111The unattended-paid-call rule, mechanically enforcedmerged
    6. S-A-112Minimal-context runner for scheduled agent jobsready
    7. S-A-113Andon cord: fleet halt flag + per-run watchdogs + auto-pullblockedawaiting S-A-112 merged
    → next to promote: S-A-109 Account-level spend walls (per-provider hard caps) also: S-A-112
    fly-shop-curation-at-scale-2026-07-20parked2/3 merged
    awaiting Nate's single "go." Nate asked only to **group** the three
    1. S-C-38`curate-region` skill: browser-driven fly-shop registry sweepparked
    2. S-C-39Feed-freshness watchdog: detect dead/stale shop feeds before they show stale contentmerged
    3. S-D-149Honest empty-state + manual add-a-URL for waters with no shop coveragemerged
    capture-conformance-2026-07-27active6/6 merged
    Nate gave the single "go" on 2026-07-27 (verbatim: **"Alright. lets get
    1. S-A-133Close the design-time gate that covers zero capture files, and give the architecture second-read a condition-fired trigger (DEF-602)merged
    2. S-B-109Harness hardening: make the live capture bugs reproducible on a simulator before any of them is fixedmerged
    3. S-B-110Fix the two live silent-data-loss defects (DEF-603, DEF-604 — and DEF-597, which DEF-604 subsumes)merged
    4. S-B-111One evaluator: route every handler through a single decision function, behaviour held equivalentmerged
    5. S-B-112Delete the mute windows (event integrity)merged
    6. S-B-113Recompute every decision (decision integrity)merged
    → all members merged — run complete
    d-maps-and-pins-2026-07-28active5/6 merged
    Nate gave the go on **2026-07-28**, verbatim **"Go on sprint 2"**, plus
    1. S-D-139River gauge pin glyph: land the missing 2026-07-18 glyph handoff into the SORmerged
    2. S-D-141Permanent fixtures layer (landmarks + gauges)merged
    3. S-D-110Map-pin disaggregation: expand a rollup type-group → split its map pin into individual constituent pinsready
    4. S-D-170Merge gauges as first-class members into run/water pin consolidation (`fisheryId` on `RunRenderPin`)merged
    5. S-D-132Water scope becomes focus, not a filter: stop hiding off-water pinsmerged
    6. S-D-178Summary map thumbs: replace the live GL map with a static rendermerged
    → next to promote: S-D-110 Map-pin disaggregation: expand a rollup type-group → split its map pin into individual constituent pins
    d-water-and-conditions-2026-07-28active5/5 merged
    Nate's 2026-07-28 go (verbatim **"Go on sprint 2"**) + the per-fork
    1. S-D-125River gauge: multi-gauge list renders (day-crossed + Water "see all gauges")merged
    2. S-D-151Favorite a gauge (manual override + honest dead-fallback)merged
    3. S-D-126Stillwater level/temp on lake conditionsmerged
    4. S-D-180Define + surface a water subtype taxonomymerged
    5. S-D-179Retry mechanism for a failed Stop-time flow capturemerged
    → all members merged — run complete
    d-design-system-2026-07-28done7/7 merged
    completed 2026-08-24; **all seven members merged**: `S-D-81` (PR #2098),
    1. S-D-81Consolidate the duplicated Anthropic client configmerged
    2. S-D-181`<EmptyState>` primitive (deferred half of `S-D-89`)merged
    3. S-D-182Waters card title: never wrap, abbreviate insteadmerged
    4. S-D-175Introduce a shared type-scale module in `src/constants/`merged
    5. S-D-48CI invariant: no unbounded network await in the pipelinemerged
    6. S-D-191Render hygiene, non-session-log halfmerged
    7. S-D-192Move `<DismissibleSheet>`'s gesture engine to RNGH + Reanimatedmerged
    d-journal-and-day-2026-07-28active2/2 merged
    Nate's 2026-07-28 go (verbatim **"Go on sprint 2"**); scope-locked at that
    1. S-D-111Observation-detail: Undo net + `MASTHEAD_CLEARANCE` validation (REDUCED 2026-07-31)merged
    2. S-D-184Fresh-install restore: gate entry or show an honest "restoring your data" statemerged
    → all members merged — run complete
    e-contract-foundation-2026-07-31active7/7 merged
    Nate gave the go on **2026-07-31**, verbatim **"Gate the sprint."** Scope is
    1. S-E-70Single-source the harness prompts to the harness `.md` files (closes DEF-490)merged
    2. S-E-60Adopt Nate's 7-item technique taxonomy (closes DEF-363's taxonomy half only — see gap note)merged
    3. S-E-71Catch/encounter "how was it caught" metadata (depth, presentation, rig)merged
    4. S-E-72Write the technique-pin model into `EXTRACTION.md`merged
    5. S-E-73Hatch as a first-class extracted observation typemerged
    6. S-E-74Extracted-vs-persisted field auditmerged
    7. S-E-77Restructure the `field_meta` contract so it is expressible under grammar-constrained JSON-Schema outputmerged
    → all members merged — run complete
    e-quality-2026-08active3/5 merged
    Nate gave the single "go" on **2026-08-21**, verbatim **"OK go on your proposed sprint."**
    1. S-E-79Extract fishery-name canonicalization out of `transcript-extract.ts`merged
    2. S-E-78Species taxonomy passthrough + species-verbatim decompetemerged
    3. S-E-61Give feature and knowledge records the attributes their surfacing decisions actually needmerged
    4. S-E-52Objective feature capture bar + structured feature tagsready
    5. S-E-63Guard `notes` against invented entitiesblockedawaiting S-E-52 merged
    → next to promote: S-E-52 Objective feature capture bar + structured feature tags
    test-net-integrity-2026-08active2/2 merged
    Nate's single "go" given 2026-08-25 (verbatim: "GO - The sprint — test-net-integrity-2026-08, three stories in order"). Filed 2026-08-23; member 1 landed ahead of the gate as a defect fix (struck below), member 2 merged 2026-08-25 (`e2d8e2de`, PR #2320), member 3 promoted to Active 2026-08-25. **Member 3 is the final member — the run completes when `S-A-148` merges.**
    1. S-A-147Two-sided test authoring: red-first in `story-build` + boundary/Boolean-arm rulesmerged
    2. S-A-148Ratcheted mutation gate on the pure-logic tier, diff-scopedmerged
    → all members merged — run complete
    audit-consumption-2026-08-29active9/9 merged
    Nate's run-level "go" given in chat 2026-08-29 (verbatim: **"ok go"**),
    1. S-C-45Kill the "Waiting on you" CRM surfacemerged
    2. S-A-165Give main's push-run test signal a consumermerged
    3. S-B-134Persist the upload-error KIND beside the messagemerged
    4. S-A-166One home and one queue client for the ops drainsmerged
    5. S-E-87One binding mechanism for cross-runtime extraction contractsmerged
    6. S-B-139Build the two owed structural detectors (S-B-133 split 1; build FIRST)merged
    7. S-B-140Render the honest status that already exists (S-B-133 split 2)merged
    8. S-B-141Shrink the device status machine; end the `complete` overload (S-B-133 split 3)merged
    9. S-B-142DEF-946 verdict honesty (S-B-133 split 4; joined 2026-08-30)merged
    → all members merged — run complete
    bind-dont-build-2026-08-30done5/5 merged
    completed 2026-08-30; **all five members shipped**: `S-A-168` (BDB-4,
    1. S-A-168tools/lib shared plumbing + settled-diagnostic deletion (BDB-4)merged
    2. S-D-210Swipe-gesture consolidation onto ReanimatedSwipeable (BDB-1)merged
    3. S-B-136One geometry home, turf + web-mercator (BDB-2)merged
    4. S-B-137One retry/timeout/sleep home (BDB-3)merged
    5. S-B-138Store factory generalization (BDB-5)merged
    subscription-outfitter-2026-08-30active7/7 merged
    Nate's single "go" landed in chat 2026-08-30 (verbatim "Go!") on the campaign proposal; members auto-promote in order.
    1. S-B-143Entitlement data layer (OUTFITTER-1)merged
    2. S-B-144Server enforcement at mint (OUTFITTER-1)merged
    3. S-D-211You tab (OUTFITTER-2)merged
    4. S-D-212Plans screen (OUTFITTER-2)merged
    5. S-D-213Gated console + Quick Note rename (OUTFITTER-2)merged
    6. S-C-49CRM entitlements admin (OUTFITTER-3)merged
    7. S-B-145RevenueCat end to end (OUTFITTER-4)merged
    → all members merged — run complete
    recording-delivery-2026-09-02active5/5 merged
    Nate's single "go" is the sprint dispatch itself (`/sprint DELIVERY-1`, 2026-09-02), per the brief's `Run:` line: *"dispatch = Nate's 'go' on the five Scoped entries as ONE ordered bundle."* Members auto-promote in order. Member 1 (`S-B-146`) merged 2026-09-02 (#2794); member 2 (`S-B-147`) ACTIVE. Members 4 and 5 (`S-B-149`, `S-D-219`) dispatched 2026-09-02 by sprint `DELIVERY-3` — `S-B-149` under Nate's standing override of its scenario predicate, `S-D-219` on its own predicate (`S-B-147` merged).
    1. S-B-146Server: grants, verified ingest, one processing claim (DELIVERY-1)merged
    2. S-B-147App, additive: grant inventory, seal-time upload, all-pending Stop, outcome ledger (DELIVERY-1)merged
    3. S-B-148Shadow period, deterministic scenarios, duration-scaled alarms (DELIVERY-2)merged
    4. S-B-149Delete the ladders (DELIVERY-3)merged
    5. S-D-219Sessions-list status derived from evidence (DELIVERY-3)merged
    → all members merged — run complete
    through-2026-09-04active5/6 merged
    Nate's single "go" on the five-sprint plan, 2026-09-04 (verbatim: *"GO on the through plan."*). Members auto-promote in order via `story-promote` run-mode when each sprint is dispatched (`/sprint THROUGH-N` in a fresh session); model tier is recorded per brief.
    1. S-B-204THROUGH-1: the six structural closes with fault-injection testsmerged
    2. S-B-205THROUGH-2: the device pass, measured (13 rows + 2)ready
    3. S-B-206THROUGH-3: honest `processed`, owned recovery, the redrive policymerged
    4. S-B-207THROUGH-4: the executable ownership matrix, row-before-capture, the hidden statesmerged
    5. S-B-208THROUGH-5: enforced limits, the deletion pass, the re-grademerged
    6. S-B-179Retire the legacy delivery routes and the server-side holds (THROUGH-5, second member)merged
    → next to promote: S-B-205 THROUGH-2: the device pass, measured (13 rows + 2)
    arrive-2026-09-05active3/5 merged
    Nate's single "go" on the ARRIVE campaign, 2026-09-05 (verbatim:
    1. S-B-216ARRIVE-1: Ready means ready — six truth fixes, OTAmerged
    2. S-B-217ARRIVE-2: No door stays closed — delivery keeps moving without the app's helpmerged
    3. S-B-218ARRIVE-4: One Stop owns one session — the native bundle, build 45merged
    4. S-B-219ARRIVE-5: Measured on the phone — the rows on ~~build 45~~ build 49 (2026-09-14)ready
    5. S-B-220ARRIVE-6: The open segment survives a killblockedawaiting S-B-219 merged
    → next to promote: S-B-219 ARRIVE-5: Measured on the phone — the rows on ~~build 45~~ build 49 (2026-09-14)
    data-sync-wakes-2026-09-02active2/2 merged
    Nate's single "go" (`/sprint DATA-3`, 2026-09-02) scope-locks both members; both promoted at once on one branch (`S-A-212` rides `S-D-248`'s reconcile), so there is no sequencing to auto-promote.
    1. S-D-248Sync wakes the screenmerged
    2. S-A-212The data layer gets an ownermerged
    → all members merged — run complete
    data-account-erasure-2026-09-02active1/1 merged
    Nate's single "go" is the sprint dispatch itself (`/sprint DATA-1`, 2026-09-02), per the brief's `Run:` line: *"dispatch = Nate's 'go' on the Scoped entry `S-C-57`. One member. PM registers the run at promotion."* Member 1 (`S-C-57`) ACTIVE 2026-09-02 on `claude/C-57-account-erasure` (folded run-mode promote, S-A-163).
    1. S-C-57Account erasure: deleting an account deletes the account's data (DATA-1)merged
    → all members merged — run complete
    data-honest-terminal-2026-09-02active1/1 merged
    Nate's single "go" is the sprint dispatch itself (`/sprint DATA-2`, 2026-09-02), per the brief's `Run:` line: *"dispatch = Nate's 'go' on the Scoped entry `S-B-178`. One member. PM registers the run at promotion."* Member 1 promoted to `Active_Story_B2.md` 2026-09-02 (`claude/B-178-honest-terminal`).
    1. S-B-178Honest terminal on the server (DATA-2)merged
    → all members merged — run complete
    bash-3-day-water-bindingdone3/3 merged
    all three members merged in PR #2996 (`540e5221b`), verified by the BASH-3 Outcome. Nate's single "go" is the sprint dispatch itself (`/sprint BASH-3` … "go", 2026-09-03), per the brief's `Run:` line: *"`S-B-182` → `S-B-183` → `S-B-186`, in that order — all three touch `src/lib/day-reconcile.ts`, so they serialize inside one session. PM registers the run at promotion."* That dispatch is the one-time scope-lock for all three members; no per-story gate is outstanding. Members 1–3 (`S-B-182`, `S-B-183`, `S-B-186`) all ACTIVE 2026-09-03 on `claude/B-182-day-water-binding` — the three serialize on one branch in one session, as the brief's Run line directs, and land in one PR (folded run-mode promotes, S-A-163).
    1. S-B-182A manual binding is an anchor, not a suggestion (BASH-3)merged
    2. S-B-183One definition of membership; a pin's stated water (BASH-3)merged
    3. S-B-186The current-water lesson tag is derived at read time (BASH-3)merged
    bash-11-water-identityactive2/2 merged
    Nate's single "go" is the sprint dispatch itself (`/sprint BASH-11` … "go", 2026-09-04), per the brief's `Run:` line: *"`S-B-185` → `S-B-190`, in that order. PM registers the run at promotion."* That dispatch is the one-time scope-lock for both members; no per-story gate is outstanding. Members 1–2 (`S-B-185`, `S-B-190`) ACTIVE 2026-09-04 on `claude/B-185-water-identity-mint` — the two serialize on one branch in one session and land in one PR (folded run-mode promotes, S-A-163), because `S-B-190`'s one-shot key must ship in the same build as `S-B-185`.
    1. S-B-185The split-off day arrives named: OSM identity + delete tombstone (BASH-11)merged
    2. S-B-190Repair the days already mis-bound: the `_v2` one-shot re-file (BASH-11)merged
    → all members merged — run complete
    bash-4-flow-answer-2026-09-03active5/6 merged
    Nate's single "go" is the sprint dispatch itself (`/sprint BASH-4` + "go", 2026-09-03). **RE-REGISTERED 2026-09-03 (same day, later) against the brief's RE-CUT** — the first registration of this run recorded the SUPERSEDED first-cut chain, including `S-B-122` as a member, because the dispatching session read `Sprints/BASH-4.md` from a working checkout (`7a666173`) that predated the re-cut landing on `origin/main` at 19:09:36Z (`2cabd5e5`, PR #2930). See [[DEF-1171]]. The re-cut brief's `Run:` line is authoritative: *"`S-B-188` and `S-B-123` first (independent of each other) → `S-B-198` → `S-B-187` → `S-B-189`. PM registers the run at promotion. **`S-B-122` is NOT in this sprint** — it is `BASH-13`, funded only after `S-B-198` has been measured alone."* The dispatch is the Scoped → Next-up scope-lock for every member below at once; **no fresh per-story Nate gate is owed at any member**, and the re-cut changes the membership, not the gate. **Progress as of 2026-09-03 (later — supersedes the sentence this replaces, which read "BUILT and RECONCILED, PR about to open, NOT merged" for member 1 and "nothing else in the run has started").** Member 1 (`S-B-188`) is **MERGED** — PR #2939, `c99a593a5` on `main`; verified by content rather than by a status field ([[DEF-872]]): the corpus test and its 34,248-row fixture are both present on `main`. Member 2 (`S-B-123`) is **MERGED** — PR #3056, `548d4c9c5` on `main`, verified by content rather than by a status field ([[DEF-872]]). Member 3 (`S-B-198`) is **MERGED** — PR #3073, `da9289913` on `main`, verified by content ([[DEF-872]]): zero `nwps_lid` references in `src/` outside migration history, migration v87 present. Member 4 (`S-B-187`) is **ACTIVE** on `claude/B-187-one-anchor-one-writer` (`Active_Story_B.md`, folded run-mode promote), promoted 2026-09-05 under sprint `SWEEP-5`. Member 5 (`S-B-189`) is **not started.** Outside the run, sprint scope items 6 and 7 ([[DEF-1124]], [[DEF-1127]]) are **MERGED** and item 8 ([[DEF-1096]]) is **not started** — see the `In the sprint, NOT members of this run` bullet. **Members 1–5 are now MERGED** (1: #2939, 2: #3056, 3: #3073, 4: #3088, 5: #3091). **Progress as of 2026-09-05 (later — supersedes the sentence above).** Member 6 (`S-B-122`)'s predicate (`S-B-198` merged AND measured) **CLEARED before the build started, verified by content**; member 6 is **MERGED-pending-PR** — BUILT and RECONCILED on `claude/B-122-stamp-the-resolver` (`96e308bd`), PR about to open, NOT yet merged; closure entry in `Completed_Stories.md` dated 2026-09-05. **All six members have now shipped their build — the run is COMPLETE.** (This doc's `DONE` convention names every-member-*merged*; that gate is member 6's still-open PR, so `Status` above stays `ACTIVE` rather than `DONE` until it lands — noted here rather than overclaiming a merge that hasn't happened.)
    1. S-B-188Check in the name-gate corpus (BASH-4, scope item 1)merged
    2. S-B-123Discriminated absence, and the fallback carries its DISTANCE (BASH-4, scope item 2)merged
    3. S-B-198NWPS goes marker-only (BASH-4, scope item 3)merged
    4. S-B-187One resolution point, one writer (BASH-4, scope item 4)merged
    5. S-B-189extend the existing envelope-shape guard, half (a) only (BASH-4, scope item 5)ready
    6. S-B-122Stamp the resolver for BOR and USGS (BASH-13 / SWEEP-10)merged
    → next to promote: S-B-189 extend the existing envelope-shape guard, half (a) only (BASH-4, scope item 5)
    sweep-12-build-loop-tail-2026-09-04active5/5 merged
    Nate's single "go" is the sprint dispatch itself: chat, 2026-09-04, verbatim **"yeah promoth them please"**, replying to a 12-sprint list that named every member below by story ID. That confirm is the Scoped → Next-up scope-lock for the whole bundle; no fresh per-story Nate gate is owed at any member.
    1. S-A-178Pin staleness watch (`DEF-642`)merged
    2. S-A-162Ring-1 flows into a scheduled/CI signal (`DEF-752`)merged
    3. S-A-227retire the 14 dead one-shot diagnosticsmerged
    4. S-A-229price the ratchet tighten-on-improve policy at 8-way concurrencymerged
    5. S-A-219fix `readiness.py`'s false NO-GO on `closes_acceptance_testable`merged
    → all members merged — run complete
    water-map-collapse-2026-09-05active5/5 merged
    Nate's single "go" is the sprint dispatch itself, chat, 2026-09-05, verbatim **"1. settled. 2. yes. 3 go."**, replying to a plan that named all five stories and the wave ordering below. That is the one-time Scoped → Next-up scope-lock for the whole bundle; **no fresh per-story Nate gate is owed at any member.** Member 1 (`S-D-260`) is **MERGED** (PR #3109). Member 2 (`S-D-261`) is **MERGED** (PR #3115). Member 4 (`S-D-264`) is now **ACTIVE** on `claude/D-264-fish-filter-thumb` (`Active_Story_D.md`, folded run-mode promote), promoted 2026-09-05, **brought forward ahead of `S-D-262`** — see the [[DEF-1284]] note on that member below.
    1. S-D-260Un-ladder the map; master and day scope return to their pre-ladder render.merged
    2. S-D-261The collapse pass: river-order grouping over chainage, access-wins, no repulsion.merged
    3. S-D-262The map draws the collapse, the rail agrees: one card per pin, counts move to the sheet.merged
    4. S-D-264The fish filter moves to the thumb: retire the masthead catch toggle.merged
    5. S-D-263Tap a merged pin and it opens: progressive disclosure, centred, never slammed to the floor.merged
    → all members merged — run complete
    audit-r3-product-2026-09-05parked3/3 merged
    awaiting Nate's single "go." Nate asked only to **bundle** the
    1. S-B-214One recovery owner for capture: retire the family `src/lib/delivery/merged
    2. S-B-215One claim rule for day↔water identity: the reconcile ladder has not found bottom.merged
    3. S-D-266Decompose `usgs-streamflow.ts` (really: one importable home for the same-water selection policy).merged
    d-selection-holds-2026-09-08active1/1 merged
    Nate's go, verbatim, 2026-09-08, on the S-D-300 report: **"builf"**
    1. S-D-300The selection holds the pin you chose across a zoom, and the card row stops spinningmerged
    → all members merged — run complete
    privacy-honest-2026-09-08active13/13 merged
    Nate's single "go" on the whole 13-member set (chat, via the
    1. S-B-235Raw audio and raw GPS expire 30 days from capture, server side.merged
    2. S-B-231Raw audio and raw GPS expire 30 days from capture, device side.merged
    3. S-B-232Deletion is complete, synced immediately, and bounded in time.merged
    4. S-C-59the CRM's debug and tuning copies follow the source (existing Scoped entry, EXTENDED 2026-09-08).merged
    5. S-B-233A journal entry is closed until it has been shared, and only its owner can mint a link.merged
    6. S-B-234The outside-AI permission is recorded, withdrawable, and honored by every upload.merged
    7. S-D-306Legal links, a way to reach us, and the outside-AI permission screen.merged
    8. S-D-307The shared page and the app say the true thing about links and expiry.merged
    9. S-C-61Operator listening is gated to a reason and logged.merged
    10. S-A-237Founder-owned test data is declared, fenced, and never grows customer content.merged
    11. S-F-17Privacy operations: provider dossier, assessments, runbooks, and the facts the policy rests on.merged
    12. S-F-16Publish the Privacy Policy and Terms at talewater.app and wire the App Store fields.merged
    13. S-F-18Counsel packet, synthetic end-to-end verification, and the readiness map closed.merged
    → all members merged — run complete
    card-naming-2026-09-11parked3/3 merged
    1. S-E-103Spot naming at extraction.merged
    2. S-B-239Stored name, container membership, group extent + backfill.merged
    3. S-D-311Card titling, Stretch, count, selected pin never folds.merged
    soak-2026-09-17done5/5 merged
    Nate's go 2026-09-17: `/sprint SOAK-1` (members 1–3) and
    1. S-B-264Nothing settles onto a dead runtime: a null guard where Expo dispatches onto the React schedulermerged
    2. S-B-265A bounded water lookup: measure the Overpass body at the 2026-09-16 kill site, then cap itmerged
    3. S-B-266The phone reports its memory footprint beside its CPU lagmerged
    4. S-D-349Days and observations are always pinned; an unidentified water is shown as "Unnamed Water"merged
    5. S-B-267Recorder housekeeping: the snapshot is written at boundaries, the heartbeat leaves the relevant ring, and the slow handoff path if it falls out cheaplymerged

    sprints — brief files

    4 in flight · 12 planned · 178 done

    workstreams

    AOperating model & agent orchestrationSOR · CLAUDE.md
    0 active0 in acceptance2 next up0 scoped82 unscoped
    Active
    No active story.
    In acceptance (0)
    No PRs awaiting acceptance.
    Next up (2)
    S-A-138Constraint birth invariant, CI-enforcedsmall–medium (~1× S-18).
    The 2026-07-31 expired-constraints review (DEF-640–643, the AUDIT.md register) found constraints — exclusions, registries/allowlists, vendor pins, "not-applica…

    question
    The 2026-07-31 expired-constraints review (DEF-640–643, the AUDIT.md register) found constraints — exclusions, registries/allowlists, vendor pins, "not-applicable" claims, thresholds — rot because they are born with no feedback mechanism: nothing names when or how each would be rechecked. Enforce the invariant at birth, in CI: no new constraint lands withou…

    prereqs
    none.

    acceptance sketch
    a new exclusion/registry entry/pin added without a recheck annotation fails CI naming the missing declaration; the same change with the annotation passes; untouched existing constraints never fail the build.

    sizing
    small–medium (~1× S-18).

    S-A-235extraction-cost doorbell + trigger wideningS–M.
    can a fourth *_owed doorbell, binding the shared tools/_owed/diffscan.py, close both gaps the extraction-rule skill's failure exposed — its failure-shaped trig…

    question
    can a fourth *_owed doorbell, binding the shared tools/_owed/diffscan.py, close both gaps the extraction-rule skill's failure exposed — its failure-shaped trigger, and the "Pay the diet" self-serve escape hatch?

    prereqs
    none.

    acceptance sketch
    a diff touching the extraction prompt/schema/field-disposition ledger without a recorded cost analysis is held OWED and blocks reconcile; the same diff with the analysis recorded clears; the extraction-rule skill's trigger explicitly names new-field and new-observation-type requests; the CLAUDE.md T1 line lands with its displaced line named; the doorbell never auto-runs a paid golden-set measurement — it surfaces the paid ask to Nate as a question he can decline.

    sizing
    S–M.

    Scoped — awaiting your gate (0)
    No scoped proposals.
    Unscoped ideas (82)
    show 82 ideas tagged [A]
    2026-09-15from S-A-250 (the scenario-matrix slot in the lifecycle skills). TESTING.md says nothing about the scenario matrix. (Captured at S-A-250's reconcile, DEF-050; QA's fork at the pre-handoff read.) The matrix is the artifact QA maps rows onto test tiers from, so the per-story tier map in TESTING.md is the natural home for "a matrix row a test or Maestro flow can cover names its covering test; rows only a device or a second account can reach are Nate-verifies items." The rule works today without it (CLAUDE.md + qa.md carry it). Class-3, via PM. Sizing: one paragraph.
    2026-09-15from S-A-250. One qa.md touch-up: name the template as the second copy of the six rows, and say how QA dates a matrix. (Captured at S-A-250's reconcile, DEF-050; Review R5 + the QA read's second gap. qa.md was outside the story's surface.) The six cross-cutting rows now live in full in both .claude/agents/qa.md and the story-promote template, with CLAUDE.md pointing at qa as the source; nothing tells an editor of one copy about the other. And qa.md makes "a matrix first written at pre-handoff" a finding but gives no way to tell when it was written
    the tell is git log --follow -p -- "Project Documentation/Active_Story_<W>.md". Two sentences; micro-change shaped.
    2026-09-03Process / review templates
    **The DEEP proposal-set template has no "what gets deleted" field, and two sets failed the subtraction pass the same way: add a mandatory Subtracts field.** (Captured 2026-09-03 from the DEEP-5 adversarial second read (DEEP/DEEP-5-adversarial-review.md, "What the set is missing: it never subtracts"). Pure-additive cap…
    2026-08-30Nothing would tell us if the public-land overlay quietly died. S-D-208 binds a USGS PAD-US feature service with no SLA, no contract and no notice of change. If USGS reshapes Pub_Access/MngTp_Desc, moves the layer id, or retires the endpoint, the overlay fails silently in every installed build, and the only route back is an app update. Raised by the story's own P-40 read as the single operational burden it introduces with no mechanism behind it
    and by P-47's own test this is a detector we owe, not platform fate: "we'll notice" is a discipline, not a mechanism. Cheapest honest shape: a scheduled CI job that hits the live service weekly with the real query and asserts the response is still a FeatureCollection carrying Pub_Access and MngTp_Desc, failing loudly…
    2026-08-24filed by PM at the S-D-192 step-4 closure, from a process note in AUDIT.md
    The instance. S-D-192's PR #2240 auto-merged while its code review was still running: the review was launched in the background concurrently with the PR opening, auto-merge took the PR the moment CI went green, and two high-severity findings reached main and needed follow-up PR #2244. Both were engine-semantics differ…
    2026-08-22filed by PM at Nate's direction, re-filing deliverable (c) of the retired S-A-86
    Origin: the S-A-86 tombstone in the Scoped pool (Rule-enforcement WBR lens + hook inventory, RETIRED 2026-08-21). Two of that story's three deliverables died with their substrate — (a) a hook count in tools/wbr/collect.py and (b) a new WBR lens — when PR #1982 deleted all of tools/wbr/ at the Weekly Review retirement.…
    2026-08-21filed by PM alongside the [[DEF-746]] Scoped captures (S-A-143/S-A-144/S-A-145)
    Do not add capacity before serialization is measured. Expanding the sim pool from 1 to 2 is explicitly out of scope for S-A-144 and must not be folded in. A second simulator runtime costs ~82% of a core and ~2 GB on a host already at load 71; adding it before admission control lands deepens [[DEF-656]] rather than rel…
    2026-08-21filed by PM at the Weekly Review retirement
    S-A-101 gave the Chief-of-Staff a standing gate — each cycle, check that workstreams A–F each carry a Done (MVB) + priority line in V2_STRATEGY.md, and push Nate to define any that is missing (advisory; COS never decides done). That gate shipped as deliverable (2) of S-A-101, riding the wbr-product roadmap lens — and…
    2026-08-21filed by PM at the S-A-136 step-1 promote
    Source: [[DEF-598]] fix-direction candidate (2), deliberately split out from the S-A-136 sweep rather than folded into it. Should a shipped capability be checkable against the requirements its own design named — so a requirement that is written down, agreed, and then not built is caught by a mechanism rather than by a…
    2026-07-31CI / branch protection
    **main has no merge queue — a correctness gap, not only a tail-cost one: the strict: true up-to-date requirement makes PR tail-cost scale with merge rate, and the same missing mechanism let red code merge to main (DEF-818). Evaluate GitHub merge queue — but confirm it is even available to this repo first. Branch prote…
    2026-07-26from an ops hygiene pass (escalated: unmerged content orphaned from every worktree)
    Companion to DEF-575 (DEFECTS.md, OPEN, medium), which records the broken state and the full inventory; this entry owns the decision, which is Nate's. Five untracked items sit in the shared main checkout (mtime 2026-07-20 09:35, no worktree holds them): the device-forensics dump Project Documentation/Handoffs/stuck-re…
    2026-07-26from the S-D-172 follow-up session (Ops finding)
    Companion to DEF-568 (DEFECTS.md, OPEN, high), which records the incident and the mechanism; this entry owns the fix scope. Two parts: (1) parameterize the dev-server port — scripts/start-metro.sh records the port it actually bound, and the .maestro flows read it rather than hardcoding .8081., which 18 of the 19 flow…
    2026-07-26from the 2026-07-26 Type Size Floor intake
    P-17 (PRINCIPLES.md:540) states body ≥13 / secondary ≥11 / labels ≥9. The 10px ladder shipped by S-D-174 dominates those thresholds everywhere, so it supersedes rather than conflicts — but the numbers now read two revisions out of date. Separately, P-17 still points at Design/_inbox/design_handoff_paper_theme/screens/…
    2026-07-26from an ops inventory sweep
    (Inventoried as 22; one — ci/regen-30126524813 — was misclassified and is verified merged. See the 2026-08-01 correction at the foot of this entry.) This is the one hygiene category that is NOT Ops's to clean unilaterally — genuinely-unmerged content orphaned from every worktree, i.e. possible lost work. The two with…
    2026-07-26from the S-D-172 reconcile sweep (Ops)
    scripts/hygiene-sweep.sh's stale-branch and stale-worktree passes both continue on ! git merge-base --is-ancestor <branch> origin/main, commented "unmerged work — active, not stale" — but that inference is only sound when a worktree actually holds the branch. With no worktree, no session holds it, so "active" is unfou…
    2026-07-24Nate's request (session 2026-07-24)
    Nate flagged that wrapping small work (a data add, a modest fix) in the full run/promote/build/reconcile machinery — separate worktrees, PRs, and closure paperwork for each phase — is disproportionate. Define a lighter path for changes below some size/risk bar: one branch, one PR, review, merge, deploy, minimal record…
    2026-07-23bug-bash triage
    [[DEF-378]] logs the recurring process defect — asking Nate to authorize finishing work that is already gated and pre-authorized. No code fix is owed; CLAUDE.md already states the rule verbatim. What's open is a detection mechanism: a cheap check that flags a Claude turn ending on that exact question shape against an…
    2026-07-23bug-bash triage
    [[DEF-466]]: a concurrent process ran a bare branch-switching git checkout directly in the shared main checkout (reproduced twice), silently moving HEAD out from under a session mid-task and once landing a commit on the wrong branch (recovered cleanly both times, no data lost). scripts/hook-shared-main-git-safety.sh f…
    2026-07-23bug-bash triage
    [[DEF-427]]: tools/readiness/readiness.py's _DESIGN_MARKERS/_FORK_MARKERS/_PHYS_MARKERS are fixed phrase lists; a real, explicitly-worded blocker (S-D-124's own bolded "Open design surface (GATING...)" text) phrased outside the list produced a false GO — inverting the gate's own stated contract ("conservative by const…
    2026-07-23bug-bash triage
    [[DEF-325]]: at least six ## Scoped — proposal pool entries (S-D-74/75/76/77/103/104, spot-checked, likely more across the pool) name stories already CLOSED in Completed_Stories.md with no promoted/struck marker — a scan for genuine refill candidates has to manually cross-reference Completed_Stories.md. The defect's o…
    2026-07-23bug-bash triage
    [[DEF-350]] is a meta-reflection (not a code fix) from a past session (the DEF-347 recording-recovery investigation) where a sound plan was reached only after Nate repeatedly caught over-scoping, wrong root-cause framing, and unverified iOS-behavior claims. Candidate levers named in the entry, none decided: run advers…
    2026-07-18PR #738 merge, Release-Manager observation
    talewater.app is served by a Cloudflare Pages project (talewater-landing) wired to the repo through Cloudflare's own Git integration — root landing, output public, no build step — publishing automatically on merge to main. It did work this time (verified live ~40s after the PR #738 merge). But the CRM has an explicit…
    2026-07-18DEF-398 reconcile Ops sweep
    **Triage the ~16 remote claude/ branches that never had a PR opened, plus two long-open PRs.* An Ops sweep found ~16 remote claude/* branches spanning 2026-06-07 → 2026-07-15 with no PR ever opened, plus two long-open PRs: #166 (claude/doc-principles-prune) and #664 (claude/external-models-adversarial-review-152g4n).…
    2026-07-16PM run-gate hygiene capture
    tools/docs-check/doc_checks.py (was tools/wbr/doc_checks.py) reported, at filing, 5 defects, including a CRITICAL story-clash (S-B-20 defined in 7 sites) and docs/dashboard.html stale vs BACKLOG.md. The checker works; its findings have no consumer and no owner, so they accumulate unread. This is the same failure shape…
    2026-07-16PM run-gate hygiene capture
    S-B-99 appears in a DEFECTS.md note (~line 1860) as a test-fixture ID, not a real story. Today it is harmless because Workstream B's counter has not reached 99; the moment it does, a grep for S-B-99 returns a fixture note alongside a real story, and the canonical allocator (tools/story-number/next.py) may well read th…
    2026-07-16PM run-gate hygiene capture
    DEF-369 attributes a report to Nate about the "pin-detail kicker"; shown the entry, Nate said verbatim "I dont know what pin detail kicker is." The report-capture path let internal jargon stand in for the user's own words, producing an entry sourced to Nate that he cannot verify or recognize — and which a later sessio…
    2026-07-13S-A-117 follow-on
    ~~S-A-117 shipped the ship:batch/ship:now disposition + Release Manager's back-to-back batch-merge capability as on-demand only — someone has to ask RM to "ship the ready batch." Once that on-demand path has actually run a few times and the mechanism is proven, a scheduled trigger (e.g. an hourly Routine that invokes…
    2026-07-13S-A-117 follow-on
    S-A-117's v1 merges already-separate ship:batch PRs back-to-back, relying on existing cancel-in-progress concurrency groups to collapse redundant CI runs — deliberately simpler than rebasing/cherry-picking multiple branches onto one physical PR (real conflict-resolution complexity, rejected for v1). If measured Action…
    2026-07-06WBR tooling / doc-lens
    (From the 2026-W28 Weekly Review — the deterministic doc-lens floor keeps re-reporting the same false positives cycle over cycle, eroding the "deterministic floor" it exists to be.) Every cycle tools/docs-check/doc_checks.py (was tools/wbr/doc_checks.py) re-emitted the same non-defects the reviewer then subtracts by h…
    2026-07-03Operating model / quality
    (From Nate, explicit request 2026-07-03.) A standing, rigorous, artifact-grounded audit practice across the subsystems Nate can't directly see — transcription, extraction, the recording/capture pipeline, journal/placement, UI-state correctness — that proactively pulls the EXACT artifacts (device-DB rows, stored output…
    2026-06-30Extraction prompt management
    Stand up the create/update/manage counterpart to the prompt-diet skill (which only subtracts): a defined section architecture the extraction prompt must conform to (Framing → Core principles P-EX → Observations-by-type → Learning items → session/field_meta → Output format), written into EXTRACTION.md as the normative…
    2026-06-16CRM back-office
    2026-06-16Automation
    2026-06-18Observability
    **Device-interaction telemetry so device-only bugs are
    2026-06-30QA / acceptance net (V3
    deferred, not current scope) — Add a multi-device sim pass to the acceptance net. Extend the Maestro / e2e acceptance net to run the covering flows against at least a small (SE / mini) and a large (Pro Max) sim profile, asserting no-clip / safe-area correctness on bottom-sheet and tab-bar screens — the forcing functio…
    2026-06-16auto-fixer (#3b) follow-ups, deferred from S-A-76. Three named
    2026-06-15CRM inbox
    2026-06-14CRM auth
    2026-06-14Operating model
    Today the per-workstream concurrent 2-slot (Active_Story_<W>2.md) opens only on Nate's explicit direction; independent same-workstream stories otherwise serialize behind one primary slot. Nate wants concurrency within a workstream to be the default whenever P-22 disjointness holds (no file/SOR-section conflict) or con…
    2026-06-04Operating model
    Engineering-health, audit-pass, and extraction-quality reviews that fire on a cadence with mandatory follow-up, rather than only when Nate opens a session. Depends on the agent-roster work (Next up — A). Mechanism likely a scheduled-task / cron agent per review type.
    2026-06-04Operating model
    A branded, editable health surface showing active stories, per-workstream queue depth, open audit items, build status, and cost burn (the C1 cost feed lands here). Reads from main. Not in-app; for Nate to drive from.
    2026-06-04Operating model
    One agent's output triggers another; blocked work routes to the agent that can clear it instead of waiting for Nate. Emerges from the roster + handoff design.
    2026-06-04Operating model
    AI-agent management platform (https://paperclip.ing) — agents as employees, org hierarchy, per-agent budgets, governance, audit, heartbeat scheduling. Recommendation: prove the agent pattern manually first; adopt the platform once roles have earned their seats. Open decision in V2_STRATEGY.md.
    2026-06-09Build tooling
    Surfaced by S-A-59: the root config's greedy "**/.ts" / "*/*.tsx" include pulls in the sibling sub-projects that carry their own toolchains — landing/ (Cloudflare Pages, needs @cloudflare/workers-types) and extraction-harness/ (standalone Node, own deps) — so a root tsc --noEmit carries ~12 pre-existing non-app errors…
    2026-06-10Operating model / tooling
    Vision (Nate, sharpened 2026-06-10): a debug-mode in-app record button. Nate speaks a bug aloud during a device walk, stops, sends. A session picks it up near-immediately, fixes it, and ships the fix over-the-air to his already-installed preview build — he cold-relaunches and the bug is gone. No reinstall, no switch-t…
    2026-06-12Operating model / build-loop
    Today step-3 pre-handoff is a manual "is it green?" pass. Claude Code's /goal primitive runs the work turn-by-turn until an independent grader confirms a stated completion condition. Candidate: drive the in-story loop with a /goal condition — "iterate until tsc + npm test + npm run e2e (+ the P-14 canonical-design com…
    2026-06-12Operating model / P-14
    **Tighten P-14 into a closed vision-verify signal for B/D product-UI stories.** Today P-14 is a manual "compare the built screen to the canonical design" pass. Candidate: close the loop — render the built screen to a screenshot, have a vision check compare it against the canonical design + design tokens, hand back a s…
    2026-06-12Operating model / agent roster
    Today the roster splits roles but does not pin models per role. Candidate: an explicit cost policy — cheap graders/classifiers on Haiku 4.5, high-volume fan-out workers on Sonnet 4.6, reserve Opus 4.8 / Fable 5 for the orchestrator/heavy-reasoning seats — composed with the two documented cost levers: prompt caching (c…
    2026-06-12Operating model / state-store
    Evaluate replacing the hand-built markdown state-store — BACKLOG / QUESTIONS / DEFECTS / AUDIT / GAPS / Completed_Stories plus the story- and DEF-number allocation — with an off-the-shelf store (a database, or an agent-native / MCP-fronted store). This is the concrete application of P-39 (Bind, don't build): the store…
    2026-06-04Operating model
    The startup hook currently reports stale worktrees (merged-branch worktrees) but doesn't remove them. A one-line cleanup command per stale worktree isn't the problem; the pattern of two stale worktrees surfacing at once (D-03, C-01 in S-A-40/S-A-42 sessions) suggests the startup hook should offer to clean them up auto…
    2026-06-05Operating model / dashboard
    Today a Next-up section showing "empty" conflates two states: nothing proposed vs. proposed-but-blocked on another workstream's deliverable. The cross-WS gates live as prose in section headers and entry Prereqs: fields — readable to humans, invisible to the dashboard generator, which renders the same 'blocked' card ei…
    2026-06-06Brand / internal-screen tooling
    Surfaced during S-A-48 (WBR dashboard) — Nate noted he's building lots of internal screens and asked about a "brand it" skill. Priority: medium (do it when internal screens multiply / brand drift actually bites). Today the brand (color tokens, fonts, TaleWater wordmark SVG, header/mark-row treatment, theme toggle) is…
    2026-06-06Release process / dashboard
    Nate's stated target operating model for cutting builds (2026-06-06, after the first batched OTA-bootstrap preview build) — today the ceremony is done by hand in chat; he wants it to become: (1) batch by default — accumulate merged-but-unbuilt stories (the "release train") and cut one preview build covering the batch,…
    2026-06-04Process
    Two operating-model proposals (preserved from an unmerged branch; not yet adopted — Nate's gate): (1) a /code-review pass over the story diff during reconcile for any story in the 2–3×-S-18 band or beyond (where reconcile shallows and early decisions drift out of context), findings resolved in-worktree or deferred to…
    2026-06-29AUDIT process
    Surfaced by the 2026-W27 WBR. No formal AUDIT weekly review pass has run since 2026-06-09; the AUDIT.md OPEN inventory is being maintained ad-hoc via per-story appends, with no scheduled reconciliation pass to triage/close/age the OPEN set. Establish (and schedule) the weekly AUDIT reconciliation pass — most naturally…
    2026-06-29Doc-defect
    Surfaced by the 2026-W27 WBR. S-D-53 resolves to two ## headers in Completed_Stories.md — a "Phase 0" entry plus a main entry under the same bare ID — which trips the doc_checks story-clash invariant (one ID must resolve to one header). Fix: give the Phase 0 entry a distinct ID (e.g. S-D-53.0) or fold it into the mai…
    2026-06-29Doc-defect
    Surfaced by the 2026-W27 WBR. SPEC.md:1047 cites "Privacy (§1.2.4)", but only a ### 1.2 header exists in SPEC.md — no §1.2.4 sub-header resolves. Fix: either add the §1.2.4 sub-header it points at, or repoint the citation to the section that actually carries the privacy content. (SPEC edits route to PM/Nate per the do…
    2026-06-29AUDIT hygiene
    Surfaced by the 2026-W27 WBR. AUDIT.md A-68's header still reads "OPEN — catch-up backlog" even though its own same-day disposition records 66 of 73 fixed (including both criticals). Refresh the A-68 header status to reflect the recorded disposition (e.g. the 66/73 state + the residual open count), so the register doe…
    2026-05-23Tooling
    Add scripts/build-app-icon.mjs to automate SVG→PNG rasterization for the icon + splash + Android adaptive assets, mirroring scripts/build-pin-glyphs.mjs. Uses @resvg/resvg-js (already in node_modules per the pin-glyphs script). Earns its place on the second icon edit; not built in S-12 because manual rsvg-convert invo…
    2026-05-24Testing
    Maestro E2E acceptance walks. Replace the manual per-story acceptance walk with YAML flows driven against the iOS simulator on a dev build. Each closed story's acceptance test becomes a saved flow that re-runs on every subsequent story — the regression net the project does not have today. Lower setup cost than Detox a…
    2026-05-30Testing / Process
    → SUPERSEDED by S-A-58 (2026-06-08) — this note's negative-path proof + keep-the-net-current obligation is absorbed into the QA-agent stand-up S-A-58 (Maestro re-arm leg), which carries it into the executing path; resolved on S-A-58's promotion. S-A-30 shipped the 5-flow Maestro net and verified the passing direction…
    2026-05-24Testing
    DAL + migration tests against real SQLite. src/db/migrations.ts, src/db/gps-recordings.ts, src/db/track-points.ts, src/db/meta.ts have no automated coverage today; this is the layer where a silent bug eats real trip data. Cheap, durable, narrow. Use the existing node --experimental-strip-types --test runner; decide be…
    2026-05-23Config
    Define what's configurable. Three-tier framework: hard-coded (design decisions, e.g. the 5 observation types, color palette), admin-configurable / Nate-only (empirically tunable values where only Nate has the data — GPS sample interval, ±60s reconciliation window, success-metric thresholds M1–M4, Anthropic model name,…
    2026-05-30Tooling
    A git worktree add (P-19) does not copy gitignored or subproject files. Three gaps hit in S-A-28: (a) expo-env.d.ts (gitignored, generated by expo start or expo prebuild) — without it, tsc errors on @/global.css import in src/constants/theme.ts and animated-icon.module.css; (b) .expo/types/router.d.ts (gitignored, sam…
    2026-05-30Dev tooling
    Surfaced during S-A-29's device walk — Nate had no way to clear track data in the preview build, and old dev-build recordings (5/24 onward) persisted into it. Diagnosis: (a) the Map tab's dev panel (src/app/(tabs)/index.tsx:413), which holds "Wipe DB" → wipeDb(), is __DEV__-gated, so it's absent in any standalone buil…
    2026-05-30Tooling
    S-A-29 shipped the preview profile in eas.json with channel: preview as a marker, but no OTA infrastructure lit up — every story today still costs a full ~20-min EAS build cycle even when changes are JS-only. Punted from S-A-30 slot 2026-05-30 (Nate's call); recaptured here at S-A-30 closeout. Two pieces when promoted…
    2026-05-30Dev tooling
    S-A-31 removes the Log tab's + button, which today opens an expo-document-picker to load a transcript file in-app (src/app/(tabs)/log.tsx:200, :291). The 2026-05-30 handoff makes recording (Map REC FAB) the only capture route — no manual-add path on Log. Before S-A-31 removes it, confirm the same in-app transcript-imp…
    2026-05-30Dev tooling
    Surfaced in S-A-31: the floating Expo dev-client menu bubble sits fixed in the top-right corner and is an overlay above the RN view tree, so it eats taps on any app affordance placed there — the S-A-31 edit pencil (initially on the back-card's top-right) opened the dev menu instead of the edit modal under Maestro and…
    2026-05-31Docs
    S-A-33 renamed the product surface from "Diary" to "Journal" (routes, files, types, user strings, SPEC.md prose). The rename did NOT touch lingering "Diary" references in EXTRACTION.md (§ headings + tables that describe the Journal tab), BACKLOG.md (the 2026-05-26 "Diary V2" entries), PRINCIPLES.md (historical P-XX en…
    2026-06-03Docs
    The SPEC split (2026-06-03) moved the Intended sections §13–§19 out of SPEC.md into the new VISION.md, keeping their original section numbers. In-SPEC cross-references were all swept to read "VISION.md §NN." But other docs still reference those sections bare (as §14, §15, §16, §18, §19) and now silently resolve to VIS…
    2026-07-06Process / review backlog
    (Surfaced during the 2026-07-06 Ops/PM branch-hygiene sweep.) Open since 2026-06-11, green CI, mergeable, never reviewed. Rewrites PRINCIPLES.md (1319→1117 lines) plus matching edits to pm.md, chief-of-staff.md, the story-build skill, and CLAUDE.md. Not shaped as a build story — it's a review-and-decide item: does the…
    2026-07-06Recovered branch / process
    (Surfaced during the 2026-07-06 Ops/PM branch-hygiene sweep — real, finished, never-shipped work.) Whoever picks this up decides: cherry-pick the branch's actual diff, or re-do the work fresh (branch may be stale against current main). Branch stays live until built. Status: Unscoped — awaits Nate's gate.
    2026-07-27Process / branch hygiene
    (Surfaced during the 2026-07-27 Ops hygiene sweep; pre-existing accumulation from ad-hoc web-session branches, unchanged by that day's work. Blocks nothing.) Count corrected 2026-08-22 — the entry understated its own problem by nearly 3×: it was filed saying "~20"; an Ops recount on 2026-08-22 found 57 remote claude/…
    2026-08-27Process / build-loop
    (Filed from Sprint SB12; DEF-678's own investigation surfaced this, not SB12's own scope — routed per DEF-079.) DEF-678 is about nothing reconciling a branch's actual changed files against its declared P-22 file surface, so disjointness silently decays mid-build. An S8 (2026-08-26) attempt to build a mechanical check…
    2026-07-31from the ops post-merge sweep closing the DEF-568/DEF-560 sprint
    The hygiene sweep decides "is this worktree alive?" by inspecting git shape — commit count, ancestry against origin/main, first-parent membership per scripts/is-untouched-claim.sh. DEF-613 made that inference correct and gave it one implementation; it did not make the decision inference-free, and inference has false p…
    2026-08-30Process / build-loop
    (Fixes DEF-993; bundles DEF-987 — same file, trivial mode-bit fix. Landed Unscoped by PM rather than Scoped: the Unscoped→Scoped placement is a Nate-gated scope decision and no confirmation was attached to the invocation. The design work below is complete and this entry IS the spec — promotion is a verbatim lift into…
    2026-09-02Process / collision model
    (Captured 2026-09-02 during the S-D-223 build, which hand-resolved the same head-of-section BACKLOG.md conflict on four separate merges from main — 2a3729d6c, 5b974ea33, 46ffa8e60, bd7713e07; three of them inside a single session, each one costing a PM invocation to resolve. Pure-additive capture, filed by PM with no…
    2026-09-03Process / documentation accuracy
    ~~DOMAINS.md is stale as a dossier index: its - Deep record: lines are wrong in both directions, measured 2026-09-03.~~ (Captured 2026-09-03 from sprint BASH-5, which surfaced this OUTSIDE its own scope — routed to this register per DEF-079 rather than carried to Nate. Pure-additive capture, no Nate confirmation attac…
    2026-09-03Process / branch hygiene
    ~~Three BASH-1 fix/ branches carry unmerged content orphaned from every worktree — recover-or-drop, per branch.~~ (Surfaced by ops at BASH-5's claim gate on 2026-09-03; OUTSIDE BASH-5's scope, so routed here per DEF-079 and DEF-036 rather than relayed to Nate as an inventory. Pure-additive capture, no Nate confirmatio…
    2026-09-05Process / build-loop skill
    (Captured 2026-09-05 by the session that dispatched SWEEP-10, which is BASH-13 by design — Sprints/SWEEP-0.md:16 and Sprints/BASH-13.md:14 both state "SWEEP-10 is BASH-13 — run it with /sprint BASH-13; there is no SWEEP-10.md." Filed here rather than DEFECTS.md per DEF-079: the defect allocator is currently fail-close…
    2026-09-05Process / build-loop tooling
    (Captured 2026-09-05 by the same session as the sprint-alias entry above, which hit this refusal directly when trying to file that finding and had to route here instead, per DEF-079. Pure-additive capture, no Nate confirmation attached. Distinct from S-A-230 (Scoped, same day): that entry is about --ceiling misreporti…
    2026-09-05CI / gates
    (Captured 2026-09-05 by the session working fix/sprint-alias-dispatch-2026-09-05, which hit Gate 2/6 failing on its own PR (#3119) for a finding it did not author, then reproduced the break on a clean origin/main checkout. Pure-additive capture, no Nate confirmation attached.) node tools/gates/check-dead-code.mjs on a…
    BProduct architecture (MVB)SOR · SPEC.md
    0 active0 in acceptance4 next up0 scoped48 unscoped
    Active
    No active story.
    In acceptance (0)
    No PRs awaiting acceptance.
    Next up (4)
    S-B-225Publish the device-resolved river gauge to the server, one-wayMedium — one migration, one device-side push path; no Worker change expected beyond the select-widening check above.
    can the device push usgs_site_no, usgs_site_resolved_at, flow_source, bor_item_id to the server without turning them into a synced, round-tripping pair?

    question
    can the device push usgs_site_no, usgs_site_resolved_at, flow_source, bor_item_id to the server without turning them into a synced, round-tripping pair?

    prereqs
    none blocking — schema-additive only.

    acceptance sketch
    a device with a hydrologically-resolved gauge (no favourite set) publishes the four fields to the server on next open; the shared water page's Flow cell renders for that water; a second device's independent re-resolution is never suppressed by the first device's published stamp; flow_source_resolved_at and flow_resolver_version never leave the device.

    sizing
    Medium — one migration, one device-side push path; no Worker change expected beyond the select-widening check above.

    [B]/[D] S-B-243 — SC10 run-2 fix sprint — the 14 highs, then the clustered mediumsL — 14 high-severity fixes plus 18 mechanism-level clusters spanning app, Worker, and DB-cascade code; sizing detail be…
    What it is: drain the survivors of the 2026-09-13 full-tree review (563 files / ~162K lines over src/, workers/, supabase/functions/; 159 raw → 151 unique → 74…

    sizing
    L — 14 high-severity fixes plus 18 mechanism-level clusters spanning app, Worker, and DB-cascade code; sizing detail be…

    S-B-253Sync engine stops announcing "rows changed" on a refused delete, and the Waters list stops re-running its network fan-out on a no-op reloadS.
    can the sync engine and the Waters list stop treating a refused, no-op delete cycle as a change worth re-rendering and re-fetching for every water?

    question
    can the sync engine and the Waters list stop treating a refused, no-op delete cycle as a change worth re-rendering and re-fetching for every water?

    prereqs
    none.

    acceptance sketch
    a table where every row in a sync cycle is refused announces no remote-applied change to any mounted screen; the Waters list's per-water fan-out does not re-run when a reload leaves the list's ids/coordinates unchanged; the map.tsx/water/[id].tsx sibling check has a stated disposition.

    sizing
    S.

    S-B-254Extract the water unbind into one DAL primitive the sync engine's remote delete calls too, and unify the four "which rows belong to this water" answers into one predicateM.
    can deleteFishery's unbind become the one door every deletion path walks through, stamping as today, with one shared "which rows belong to this water" definiti…

    question
    can deleteFishery's unbind become the one door every deletion path walks through, stamping as today, with one shared "which rows belong to this water" definition?

    prereqs
    S-B-253 merged.

    acceptance sketch
    a remote fisheries delete with a live local child converges in one sync cycle, child fishery_id NULL and stamped; deleteFishery throws on changes !== 1; the Waters-list count, delete gate, and unbind all derive from one shared row-set predicate; the received-day assumption is flagged to Nate, not silently decided.

    sizing
    M.

    Scoped — awaiting your gate (0)
    No scoped proposals.
    Unscoped ideas (48)
    show 48 ideas tagged [B]
    2026-09-15Water/day binding
    Nate, verbatim, 2026-09-15: "No no fixes for now... this is a bigger change that we shouldn't worry about now. Add it to the punch list: Logic for Sessions and Quick notes that specifically name other waters." This is the product-scope half of DEF-1659/DEF-1660/DEF-1661 (PR #3675, e3b1447f4) — those carry the evidence…
    2026-09-12Spot naming / per-water collision
    **A bare head noun already
    2026-09-11Payments / emergency shutdown
    (Captured at S-B-238's reconcile from the cross-model P-40 read, DEF-050. Pure-additive capture, no Nate confirmation attached.) A grant record carries its policy (workers/pipeline/src/grants.ts); remint copies existing.policy (index.ts), adjudication enforces the duration ceiling and the delivery sweep derives transc…
    2026-09-08Day conditions / flow trend
    (Captured at S-D-291's reconcile, DEF-050.) days.flow_cfs is captured once at recording stop (flow-capture.ts, DEF-383); nothing records whether the gauge was rising or falling over the session, and the app's GaugeTrendKind is a live-gauge/pressure concept. The shared day page omits the arrow honestly. If the trend is…
    2026-08-23filed by the S-E-71 step-4 reconcile, from the [[DEF-786]] fork (the instance is fixed; the mechanism is not)
    S-E-71 fixed [[DEF-786]]: insertObservations (workers/pipeline/src/supabase.ts) had been dropping outcome / technique_group / rig on every capture since S-B-36 — the only live capture path — while its own header comment claimed it "mirrors the device's createObservations column mapping exactly". Four fields are now pi…
    2026-08-23filed by the S-E-71 step-4 reconcile, routed rather than fixed in-story because the section is contested (P-22)
    Both halves are now false. S-E-71 (a) wired the extraction persistence path for rig for the first time — the column existed since migration v33 but mapObservation never carried it and createObservations had no binding, so extraction-emitted rig was silently discarded — and (b) widened rig, depth and technique_group on…
    2026-08-23Dead-code removal / pipeline hygiene
    The directory has zero callers: activeProvider is imported by nothing, both WhisperReplicateProvider and AssemblyAIProvider are unreachable, and server-side transcription moved to workers/pipeline some time ago. A repo-wide grep returns only segments, a pure parser pulled in by two unrelated files. Why this is worth a…
    2026-08-21filed by PM from the S-A-136 Handoffs/ requirement sweep (stranded item: specified, agreed, never built, never tracked)
    The 2026-06-28 LOCKED decision 6 specified a storage watchdog using volumeAvailableCapacityForImportantUsage that stops capture gracefully before the disk fills. The API is used — but only reactively, to classify a start that has already failed: if freeDiskBytes() < 50_000_000 { waitingOn = "disk-full" } (modules/reco…
    2026-08-21filed by PM from the S-A-136 Handoffs/ requirement sweep (three stranded measurements)
    Three on-device measurements were specified on 2026-06-28 as things that must be established rather than assumed, and none has been made: (1) Segment-seam integrity — no lost or duplicated audio at a boundary; the mechanism is built (rollSegment swaps the file under tapLock with no engine teardown, modules/recorder-la…
    2026-08-21filed by PM from the S-A-136 Handoffs/ requirement sweep (stranded item
    and the point of filing it is the tracking mechanism, not the work) — The multipart/resumable upload follow-up that lives only in a code comment. S-B-20 Phase 0 §5 named resumable multipart upload direct to R2 as an early-validation risk. Phase 1 shipped a single-part presigned PUT, and the follow-up was recorded only…
    2026-07-26from the DEF-569 fix review (DEF-569-R4)
    The DEF-569 fix (fix/def-569-captured-row-unrouted-2026-07-26, PR #1130) left a TODO(DEF-569) on the await runFullSync() call in src/lib/recording/capture-finalize.ts. DEF-386 Layer 1 put that call on the Stop path to order the recording-row push before the first upload mint — without the ordering the mint 404s not-sy…
    2026-07-24from S-B-74 reconcile (DEF-050)
    S-B-74 shipped v1 of the general diagnostics-telemetry mechanism scoped to exactly one category (flow-resolution). Two things its "Out of scope" section named as future candidates rather than committed work: (1) a second category for the recording/upload pipeline (would cover open defects DEF-219/DEF-118/DEF-349) — ju…
    2026-07-19S-B-68 reconcile capture (DEF-050)
    **NOAA NWPS as a live-flow forecast source.** api.water.noaa.gov — predicted stage/flow plus non-USGS observation points. A distinct capability (prediction, not just current reading) that the best-source-per-water seam (src/lib/flow-source.ts, S-B-68) could host as another tenant. Named out-of-scope future increment o…
    2026-07-19S-B-68 reconcile capture (DEF-050)
    National-scale coverage beyond the federal USGS/BOR/USACE feeds; deferred while PNW-first. Each a new adapter behind the S-B-68 source-abstraction seam. Cross-ref: QUESTIONS.md Q-FLOW1, FLOW_PIPELINE.md, S-B-68. Status: Unscoped — awaits Nate's shaping + gate.
    2026-07-19S-B-68 reconcile capture (DEF-050)
    The Conditions strip shows air temperature; water temperature (00010 on the USGS side, and the equivalent on other sources) is the angler-relevant number and is not yet surfaced. Separate parameter axis, cross-source. Cross-ref: QUESTIONS.md Q-FLOW1, FLOW_PIPELINE.md, the older [D] S-D-115 streamflow-residuals capture…
    2026-07-19S-B-68 reconcile capture (DEF-050)
    S-B-68 ships a curated 5-dam Yakima Project seed + NLDI upstream-flowline proximity matching. A general matcher that resolves any dam-controlled reach to its RISE station straight from the full RISE catalog — navigating the dirty catalog (the CA Friant-Kern template-row trap S-B-68 hit) safely at scale — would remove…
    2026-07-19S-B-68 reconcile capture (DEF-050)
    S-B-68 persists the resolved flow_source/bor_item_id per water and does not retroactively recompute already-persisted picks. When a new source, a seed expansion, or a matcher change would resolve an existing water differently, whether/how to backfill or invalidate the persisted picks is an open follow-up (not S-B-68's…
    2026-07-14Product-scope input follow-on
    Nate (2026-07-14, verbatim): "5 hours should be considered a typical length" for a recording — a 4h47m/5h01m session (DEF-346's 9f11771c) is core expected usage, not an edge case. SPEC.md does not currently state the recording-duration usage range as one precise, prominent line — the "a few seconds → all-day sessions"…
    2026-07-13S-B-52 / AUDIT S-B-52-1 follow-on
    **R2 lifecycle rule expiring orphaned seg-.m4a objects.* The S-B-52-1 audit fix bounded segment-upload-url abuse with a per-recording mint-count ceiling (MAX_SEGMENT_MINTS_PER_RECORDING = 300, app-code, shipped), but did not add the third fix-direction item — an R2 bucket lifecycle rule expiring audio///seg-*.m4a obje…
    2026-07-13S-B-52 follow-on
    S-B-52 uploads each capture segment to R2 as it finishes rotating, which shortens the upload portion of the post-Stop wait — but does not touch when transcription itself starts. POST /recordings/:id/finalize (which kicks off the Workflow's transcribeSegments, the actual Replicate calls with CONCURRENCY=3 sequential ba…
    2026-07-12S-B-34 follow-on (JS-only)
    S-B-34 shipped the cpu-probe with only its generic event-loop-lag signal wired, so a future background-CPU kill's Sentry auto-report names the mechanism (JS-thread spin) but leaves hottestPath null, and no cpuProbe field reaches the operator dashboard. The scaffolding is already in src/lib/cpu-probe.ts (tested probeTi…
    2026-07-12S-B-34 follow-on (native)
    When the OS force-kills the app mid-recording (the DEF-278 background-CPU kill, or any other process kill), no in-app detector runs — the process is gone — so the user is never told their recording died. A dead-man's-switch notification (DEF-279 native subset, expo-notifications) tells them on the next launch (or via…
    2026-07-11Principal-Engineer audit (native audio)
    The 1,189-line Swift module (~15 defect fixes accreted) can only be proven by device soaks; no unit/automated coverage exists or is cheaply addable. Mitigation posture: keep decision logic extractable to testable Swift/TS where changes touch it, and lean on the fleet-level pipeline health metric (S-C-29, shipped 2026-…
    2026-07-11Principal-Engineer audit (native audio)
    — first start() on Android rejects deep in the pipeline with no clear signal. If Android ever matters, add a loud early guard (explicit "unsupported platform" at the entry point). Status: Unscoped — inert until Android is in scope.
    2026-07-11Principal-Engineer audit (server Worker)
    — fine as a runaway guard, not spend control. Overlaps the paid-call-guardrails run (S-A-108 registry / S-B-27 customer-side metering) — fold there rather than a standalone story. Status: Unscoped.
    2026-06-04Architecture
    Separate recording (atomic capture — one start→stop, one transcript, one GPS segment) from session (a user-meaningful grouping over place + time; one session holds many recordings). Today one session = one upload = one transcript. Open: how grouping happens — automatic (temporal + spatial clustering), manual, or both.…
    2026-06-06Architecture
    When one calendar day spans two clearly different fishing locations (river in the morning, a different river in the afternoon), allow that day to split into separate sessions rather than aggregating every recording under one day. Counter-direction to S-B-12's calendar-date aggregation; the case where same-date recordi…
    2026-06-05Capture
    While recording, chunk and upload audio segments progressively (assuming cell signal) so that by the time the trip ends, most transcription and extraction is already complete — zero wait on return. Pairs with the on-device VAD + 16kHz recording decisions from S-B-05. Requires: background upload queue, chunk-boundary V…
    2026-06-06Hands-free recording trigger (AirPod button + Siri)
    Follow-on to S-B-06 (native audio capture); surfaced from a session asking whether the AirPod buttons could start a recording. Priority: medium (not urgent). Goal: let the angler start/stop a water snippet hands-free, while still recording from the lapel/phone mic (the AirPod microphone stays rejected per SPEC §3.3; t…
    2026-06-06Auth
    Surfaced in the S-B-07 device walk: with Supabase "Confirm email" ON, signUp() returns no session and the app shows nothing — the user is stuck on the sign-in screen with no feedback while a verification email arrives. Two coupled parts: (1) product decision — whether the shipped product keeps email confirmation on (t…
    2026-06-06Onboarding
    The umbrella over the three narrower auth captures above (email-confirmation handling, the multi-user infra fork, the canonical auth-screen design) plus permission priming and the first-run welcome flow — the whole path a brand-new user walks from first launch to first usable recording. S-B-07 shipped a placeholder: e…
    2026-06-14Observability / runtime telemetry
    From Nate (2026-06-14): track the actual root cause of API errors and set up alerting for them. Today an extraction failure traced to a self-set monthly API usage limit on the Anthropic account — every extraction call was rejected (a 429-class error) but the app surfaced only a generic "couldn't process," giving no si…
    2026-06-04Architecture
    Managed (Supabase: Postgres + auth + storage + edge functions) vs. roll-your-own (Railway). Sets the data model, sync, sharing, telemetry, payments. HISTORICAL/RESOLVED (annotated 2026-08-25, PM): the managed-vs-roll-your-own fork was decided 2026-06-05 (Q-V2) — Supabase (see V2_STRATEGY.md line 77) — and is built and…
    2026-06-04Architecture
    For Journal synthesis / Insights — retrieve real prior observations rather than letting the model invent patterns. The hallucination-safe path for "more summarization." Also codify hallucination-prevention (evidence-substring floor, null-over-placeholder, the timestamp demotion) as a PRINCIPLES.md entry when the next…
    2026-06-04Architecture
    A read-only web view of a user's data + the share surface (overlaps the guide-trip-summary D item). A full second client stays out of MVB unless a pilot signal demands it.
    2026-06-04Architecture
    One diagram of the V2 system: devices → capture → VAD → transcription → extraction proxy → backend → per-user store → app + operator console. Worth producing early; it's how the multi-user fork gets reasoned about.
    2026-05-30Architecture
    Explore why we might want to abstract the transcript-extraction pipeline out to a real backend. Today's design (SPEC.md §3.2/§3.3) is deliberately the opposite: a minimal stateless serverless proxy that holds the Anthropic key, forwards one transcript synchronously, returns JSON, and stores nothing — with a full cloud…
    2026-05-19watchOS
    Explore using watch for audio and/or GPS capture and/or starting fishing session
    2026-05-23GPS
    Surfacing UX for unresolved user-initiated GPS recordings. Principle locked in D-30: a gps_recordings row with resolved_at IS NULL AND dismissed_at IS NULL is an unresolved intent signal that the product flags so the user can resolve (upload a transcript, log manually, or dismiss). UX shape deliberately undefined — co…
    2026-05-23GPS
    In-app configurable GPS tolerance as a developer tuning tool. The ±60s reconciliation window (§5.2) is hard-coded today; making it adjustable in a hidden / dev-only settings surface would let Nate tune the product against real paired transcript + GPX data without rebuilding. Not user-facing; pure dev tooling. Possibly…
    2026-05-24GPS
    Live track polyline rendering on the Map tab. While a recording is active, render track_points (since the recording's started_at) as a thin LineLayer over the basemap. Same MapLibre data path as the pins; new GeoJSONSource + LineLayer. Visual confirmation that the background task is delivering fixes without opening th…
    2026-05-24GPS
    Q-G1 deeper cases. S-13 handled the simplest survival case (an open gps_recordings row survives an app-kill; the user closes it next open). Case (b) — mid-session permission downgrade — was closed by S-B-10 (2026-06-11): on startup/foreground an open recording under a downgraded permission is now closed + the user not…
    2026-05-24GPS
    Revisit iOS auto-pause + the broader battery-lever set. Unblocked 2026-06-09: Q3 is resolved — measured baseline is ~8% / hour (voice + GPS, healthy iPhone 15), accepted as within tolerance — so this is no longer waiting on a missing measurement. The measured verdict makes it a low-priority optimization, not urgent wo…
    2026-05-26Web
    Guide-shareable trip summary. After a guided session, the guide hands the client a QR code / short link (e.g., talewater.app/trip/<id>) that opens a web-viewable summary of the day's fishing — pins, observations, narrative — with an upsell CTA to download the TaleWater app and start their own Tale. Open design: what's…
    2026-05-28Capture
    Self-recording capture path (lapel mic capture path) as an alternative or supplement to Plaud. Provider analysis, pricing, and integration shape captured in Research Material/transcription-services-analysis.md. Short version: transcription itself is cheap (~$0.12–0.40/hr) and integration is ~3–5 days once a provider i…
    2026-09-06Architecture / delete-before-optimize
    (Captured 2026-09-06 at the S-B-221 step-1 promotion — named out of scope there, per DEF-050.) Once S-B-221 removes the first-run consent screen, no user-visible screen sits behind onboarded — it is redundant with session presence. Deleting it is a real delete-before-optimize win but is a rewrite of onboardingGateVerd…
    2026-09-08filed from the cross-model architecture review of S-B-235 (sprint PRIVACY-1)
    Every tick calls listGrants and listAudioRetirements, each accumulating its entire population in memory, while only MAX_GRANTS_PER_TICK (100) grants are actually evaluated — so evaluation latency grows linearly as ceil(live grants / 100) minutes while the memory and KV-operation cost grows with the whole population. T…
    2026-09-17Docs drift
    §5 still describes pipeline-process.ts, drainServerUploadQueue, and retryStrandedServerUploads as the device-side picture; all three were deleted by S-B-149. A session reading §5 today reaches for modules that no longer exist and believes the every-minute sweep covers granted recordings when the code excludes them (wo…
    COperator back-officeSOR · (deferred — self-describing stories)
    0 active0 in acceptanceblocked next up0 scoped22 unscoped
    Active
    No active story.
    In acceptance (0)
    No PRs awaiting acceptance.
    Next up (0)
    Blocked — empty queue. Workstream halted; no story can start until Nate passes a new entry through the Scoped → Next up gate.
    Scoped — awaiting your gate (0)
    No scoped proposals.
    Unscoped ideas (22)
    show 22 ideas tagged [C]
    2026-09-11Release / OTA adoption
    (Captured at S-B-238's reconcile from the cross-model P-40 read, DEF-050. Pure-additive capture, no Nate confirmation attached.) An OTA is applied on the launch after the one that downloads it; ota-apply.ts defers during capture; a failed download leaves the old bundle running; a rollback lands on the embedded bundle.…
    2026-07-24from S-C-41 reconcile (DEF-050)
    S-C-41 shipped the Aggregate lens's Journal and Day Write-up sections with real per-bundle content, but Day summary (screen 10·b AI recap line) and Water summary (screen 14a Summary facet lead paragraph) render as honest placeholder text — no live generator for either destination is wired into this tool (deliberate sc…
    2026-07-24from S-C-41 reconcile (DEF-050)
    Code review flagged that setLens()'s .step-chip.current toggle lights all three chips sharing a lens (e.g. Transcript/Extraction/Knowledge together for Attribute) rather than indicating a single specific stage — cosmetic, not a functional break, but dilutes the stepper's own navigational affordance. Needs a design cal…
    2026-07-23from S-C-40 reconcile (DEF-050)
    Code review on S-C-40 flagged that extraction-harness/src/backfill-fixtures.ts re-implements ~120 lines of cluster.ts's cluster-call + gradeClusters taxonomy-check logic (same model/prompt, near-verbatim) instead of importing a shared module — the same pattern backfill-fixtures.ts already correctly uses for placements…
    2026-07-20Fly-shop registry scaling (from S-C-38)
    Once the curate-region skill (S-C-38) lands, run it per state to land that state's shops with tests green — one story per state in Nate's priority order WA / CA / OR / ID / MT / WY / NV / UT / CO; group sparse states (e.g. NV+UT, or WY+MT) into a single story where shop counts are thin. Each run drafts candidate block…
    2026-07-17S-C-34 reconcile capture
    docs/debug/index.html (a static file with no bundler) carries a hand-mirrored groupIntoDaysJs/groupKeyForBundle copy of the tested groupIntoDays/groupKeyForRow in functions/_lib/debug-index-core.ts. Two reviewers confirmed the mirror is byte-faithful today, and a keep-in-sync comment names the invariants — but nothing…
    2026-07-11S-C-29 follow-on
    S-C-29 computes the weekly capture-death rate from the Supabase recordings failed-status fleet proxy — honest and fleet-enumerable, but coarse (it can't distinguish a death at capture from a later-stage failure). The richer per-capture signals (capture_interrupted / has_capture_segments from CaptureSummary, and the de…
    2026-07-11S-C-29 follow-on
    S-C-29 ships the metric (a passive weekly trend on the CRM); it does not alert when the completion rate drops below a floor or the death rate spikes. Turning the signal into an action (a page/notification, or a repo-variable trip) ties into the spend-watchdog/andon arc (S-A-110 detectors → S-A-113 fleet halt) — fold t…
    2026-07-11Principal-Engineer audit (CRM functions)
    inbox-action.ts validation and bug-reports.ts want -core splits + tests, matching the 8 read cores that all have them. (inbox-action.ts deleted at S-C-45, 2026-08-29 — only the bug-reports.ts half remains live.) Status: Unscoped.
    2026-06-14CRM debug index
    **pagination / search / filtering of the
    2026-06-04Back-office
    One operator surface: per-pilot-user list, their sessions/observations/extraction output, cost-per-user, basic CRM fields. The extraction-review half doubles as training-data collection (connects to E's discard-as-signal). Needs user-keyed data off the pilot's device → depends on multi-user (B), OR a thin interim coll…
    2026-06-04Back-office
    Pin-adjustment rate, discard rate, usage, share-engagement. Behind multi-user (B) or the interim path. Pin-adjustment and discard rates are extraction-quality signals — shared with E. FLAG (informational, 2026-08-25, PM, not actioned this pass): same as the entry above — looks substantially superseded by S-C-23/S-C-27…
    2026-06-07Operator back-office
    The existing static-bundle debug viewer (docs/debug/index.html, 3-pane observation-list | detail | transcript, live at crm.talewater.app/debug/<bundle-id>) becomes a CRM surface for triaging real user sessions. Three capabilities Nate named (2026-06-07): (1) Browse real user session logs and triage observation-vs-tran…
    2026-06-09Back-office / Trust
    A section (under Business, or its own) showing privacy posture, recording-consent status, data-handling/retention, and security at a glance. Surfaces the Q-L1 (recording-consent) / Q-PV1 (privacy) / AUDIT A-27 items once they're being worked. Surfaced 2026-06-09 in the Chief-of-Staff business-area pass.
    2026-06-09Back-office / Data
    (Graduated 2026-07-07 in the S-C-24 reconcile queue-refill to S-C-25 in ## Scoped — proposal pool.) The accumulating structured fishing knowledge (fisheries / techniques / patterns / catch data across users) viewed as a business asset: growth, coverage, quality. The moat, looked at as a moat — distinct from Customers…
    2026-06-09Back-office / Stage gating
    People/HR (solo founder), fundraising/investors (bootstrapped), partnerships/BD (post-launch). Captured so they aren't re-surfaced as "gaps" every review; revisit when the stage changes. Surfaced 2026-06-09 in the Chief-of-Staff business-area pass.
    2026-06-29Back-office / Customers
    The fourth bullet of the original Customers stub: a support queue, conversations, refunds, escalations (folded in from the dissolved "Operations"). Deferred out of S-C-23 (which shipped the user directory + drill-down) because no support system exists yet — there is nothing to surface. Shape when a support/ticketing c…
    2026-06-29Back-office / Customers
    Active anglers, lapsed users, re-engagement — the third Customers-stub bullet. Deferred out of S-C-23: thin until there is a real user base to measure. The S-C-23 directory already surfaces per-user last-activity, which is the raw signal a retention view would aggregate. Shape post-launch. Surfaced 2026-06-29 in the S…
    2026-06-29Back-office / Customers
    (Graduated 2026-07-07 in the S-C-25 reconcile queue-refill to S-C-27 in ## Scoped — proposal pool.) Two S-C-23 enhancements: (1) fold pilot_extraction (the S-C-03 user-attributed extraction bundles) in as a second drill-down source alongside the S-B-15 sync tables, so imported/Plaud sessions are reviewable too; (2) po…
    2026-06-29Back-office / Tech-debt
    S-C-23 built the Customers 3-pane reading view (observations | detail | transcript + Leaflet map) as a self-contained inline render rather than refactoring the 3159-line docs/debug/index.html viewer (whose render functions are bound to global state — a clean factor was judged out of proportion to the slice and a regre…
    2026-08-30Docs / domain sheets
    (Captured at the S-C-46 scoping, 2026-08-30. Pure-additive routing — DOMAINS.md is a class-2 per-section doc, not PM's to edit, so the sheet itself is deliberately left untouched.) DOMAINS.md:58-68 (Freshness: 2026-08-21, seeded at S-A-140) reads under Maturity: "single-user solid, multi-user immature by design — C-wo…
    2026-09-03Back-office / observability
    (Captured 2026-09-03 at the Q-SEC1 ruling: Nate said "I dont have any uptime monitor" and asked "should we?" — answer: yes, it is cheap. Pure-additive capture; the Q-SEC1 ruling is Nate's, this filing is PM's.) Nothing outside the repo polls functions/api/health.ts, the Field Notes worker or the pipeline worker — an o…
    DConsumer product surfacesSOR · SPEC.md
    0 active0 in acceptance8 next up0 scoped149 unscoped
    Active
    No active story.
    In acceptance (0)
    No PRs awaiting acceptance.
    Next up (8)
    S-D-189Merge or move a day by handsmall. 8. ~~S-D-223 — Day Summary: replace the CATCHES list with a three-part reading of the day.~~ (S-D-223 promoted t…
    when flow and temperature come from the same gauge at different times, which time does the card's single "as of" note describe?

    question
    when flow and temperature come from the same gauge at different times, which time does the card's single "as of" note describe?

    prereqs
    S-B-114's day↔recording primitive (that story builds the move primitive regardless; this is the surface on top). Firm the sizing at step 1 against its settled relation. **Plus S-B-182, RULED as a hard predecessor — see Sequencing below.**

    acceptance sketch
    no reading is displayed under a timestamp that belongs to a different reading.

    sizing
    small. 8. ~~S-D-223 — Day Summary: replace the CATCHES list with a three-part reading of the day.~~ (S-D-223 promoted t…

    S-D-253Put the hatch on the pin: surface the extracted hatch text, build no season filtersmall — ~0.5× S-18. One widened query + row type, one type extension, one composition function, plus tests.
    a hatch observation's insect / season / spot_anchor are extracted, stored and synced today and displayed nowhere on the map pin — a hatch pin's title is its lo…

    question
    a hatch observation's insect / season / spot_anchor are extracted, stored and synced today and displayed nowhere on the map pin — a hatch pin's title is its locationName and its sub-line is its free-text note. What does the hatch read as on the pin?

    prereqs
    none in the data layer — verified in the tree 2026-09-03, and this is why the story is small. The columns landed in migration v61 (insect, stage, proposed_stage, season, time_of_day, spot_anchor) and have been extracted, stored and synced since: no extraction change, no prompt b…

    acceptance sketch
    a stored hatch observation with insect='BWO', spot_anchor='flats', season='#18 in fall, #14 in spring' renders that text on its map pin instead of a bare location name; a hatch missing those fields renders as it does today (no empty labels, no placeholder); node tests pin the composition including the all-null case; no season filter appears anywhere.

    sizing
    small — ~0.5× S-18. One widened query + row type, one type extension, one composition function, plus tests.

    S-D-254Close the Day-side technique vocabulary: the Day surfaces read the ruled list, the pins are untouchedsmall–medium — ~1x S-18. The read-side edit is contained; the legacy-row decision and its §12.3 rewrite are the bulk.
    resolveMethod (src/lib/day-facets.ts:544-546) returns o.technique_group?.trim() || o.fly_type?.trim() || null — falling back from the closed 7-item technique_g…

    question
    resolveMethod (src/lib/day-facets.ts:544-546) returns o.technique_group?.trim() || o.fly_type?.trim() || null — falling back from the closed 7-item technique_group to free-text fly_type — and both techniqueCards (:570, the Techniques facet) and buildWorked (:916-943, S-D-223's "What worked" rows) consume it. So a day's method label can be whatever was said…

    prereqs
    none in the data layer — technique_group (v48) and the ruled 7-item taxonomy are merged and live. No extraction change, no prompt bump, and no migration for the read-side close itself (options (b) and (c) above would each add one — part of what step 2 decides).

    acceptance sketch
    a Day's method label resolves from the closed ruled list; two days that recorded the same real technique join on the same key regardless of the words spoken; a pre-v48 day renders whatever the chosen legacy answer specifies and is never blank; node tests pin the legacy case explicitly; the map's euro/streamer pin split is unchanged, pinned by a test that fails if it moves.

    sizing
    small–medium — ~1x S-18. The read-side edit is contained; the legacy-row decision and its §12.3 rewrite are the bulk.

    S-D-234Render the hatch attributes — six extracted, persisted and synced fields that reach no screen, plus fly_size and depthSmall–Medium (unchanged from the Scoped entry). Step 1 is mechanical; step 2 is a real render addition with a design de…
    Nate's direction, verbatim (2026-09-03): "OK why isn't this fixed then???" — asked after the gap was described to him and nothing was queued. The Scoped entry…

    acceptance sketch
    per the Scoped entry, unchanged — npx tsc clean, npm test green, a test proving getObservationById returns the eight fields, a P-14 design pass on the hatch detail, and a Maestro flow that opens a hatch observation and asserts the attributes render. Nate verifies — opens a real hatch observation on device and sees what the model extracted, in plain language. Non-hatch types must render exactly as they do today, pinned by test.

    sizing
    Small–Medium (unchanged from the Scoped entry). Step 1 is mechanical; step 2 is a real render addition with a design de…

    S-D-262The map draws the collapse, the rail agrees: one card per pin, counts move to the sheetLarge — ~2× S-18.
    wire S-D-261's grouping into map.tsx — one card per pin 1:1, no separate merged/real card distinction, counts move off the pin onto the sheet as one glyph per…

    question
    wire S-D-261's grouping into map.tsx — one card per pin 1:1, no separate merged/real card distinction, counts move off the pin onto the sheet as one glyph per kind.

    prereqs
    S-D-261 merged; S-D-260 merged or in flight.

    acceptance sketch
    collapsed pin renders one glyph per kind, never a numeral; single-spot sheet has no chevron and doesn't repeat its own name; group sheet lists every mark grouped by type, fish count unchanged (fish-only, per S-D-259's carried-forward ruling); knip clean. ~~Closes DEF-472.~~ CORRECTION 2026-09-05 (PM, P-40-caught) — FALSE, do not carry forward: at zoom 12 pinTierForZoom returns 'water' (REGION_MAX_ZOOM = 10 ≤ 12 < WATER_MAX_ZOOM = 14), and the water tier groups by fisheryId (…

    sizing
    Large — ~2× S-18.

    S-D-263Tap a merged pin and it opens: progressive disclosure, centred, never slammed to the floorMedium — ~1.5× S-18.
    tapping a merged pin zooms just far enough to split it, centred on the tap; if nothing can split, the camera holds and the sheet seats instead of slamming to t…

    question
    tapping a merged pin zooms just far enough to split it, centred on the tap; if nothing can split, the camera holds and the sheet seats instead of slamming to the zoom floor.

    prereqs
    S-D-262 merged.

    acceptance sketch
    a splittable group's tap animates the camera toward the split zoom, centred on the tap; an unsplittable group holds the camera (pinned by test) and opens the sheet. Nate verifies on device.

    sizing
    Medium — ~1.5× S-18.

    S-D-304Best-fish cell needs a minimum-support floorS.
    on the Cle Elum day of 2026-09-01, 27 catches were extracted and exactly ONE carried a length_in — should n=1-of-27 measured render the same "Best fish" cell a…

    question
    on the Cle Elum day of 2026-09-01, 27 catches were extracted and exactly ONE carried a length_in — should n=1-of-27 measured render the same "Best fish" cell as a fully-measured day, or nothing, matching the n=0 treatment?

    prereqs
    none.

    acceptance sketch
    a day with n=1-of-27 measured renders no "Best fish" cell (same as n=0 today); a day with adequate support still renders one; both callers (src/app/day/[id].tsx, workers/share/src/day-page.ts) agree.

    sizing
    S.

    S-D-328The Day Techniques facet groups one entry per method, not per utterance; a card's fish list is the real, per-method outcome, never a hardcoded "Rise."~1× S-18 — a techniqueCards() regroup, a label fix, two amended tests, no model/prompt change.
    Nate's ruling, verbatim (2026-09-15, in conversation) — retires the original Fork 1/Fork 2, does not resolve them: "The list of techniques and the catches unde…

    prereqs
    none — technique_group/fly_type merged and live; no extraction or migration change.

    acceptance sketch
    Claude verifies — the Techniques facet renders one entry per method (no duplicate identically-titled cards), each method's fish list is that method's real, EncounterOutcome-labelled catches/encounters exactly once (no day-wide over-claim), no card or copy asserts "didn't work"/"no takers," node tests pin the per-method grouping, the real-outcome label, and the fish-attribution boundary; npx tsc --noEmit clean. Nate verifies — the Techniques facet reads as one entry per metho…

    sizing
    ~1× S-18 — a techniqueCards() regroup, a label fix, two amended tests, no model/prompt change.

    Scoped — awaiting your gate (0)
    No scoped proposals.
    Unscoped ideas (149)
    show 149 ideas tagged [D]
    2026-09-17Map
    (Captured at S-D-349's reconcile, DEF-050 — named out of scope there.) S-D-349 makes "show on map" from an unnamed day frame its pins on the master map; the map tab's masthead cannot read "Unnamed Water" because every scope is a water scope (enterWaterScope(waterId, dayId)) and an unbound day has none. A day-only scop…
    2026-09-15Map
    (Captured at S-D-343's reconcile, DEF-050 — named out of scope there.) S-D-343 draws every other water's PIN as the 12 px dot while a water or a day is scoped. Nate's East Walker screenshot also showed a full-size campground pin beside the other river's wave pin; whether a place on another water should be a dot, a sma…
    2026-09-15Map
    (Captured at S-D-341's reconcile, DEF-050; Nate dropped it from that story — "one change at a time".) With S-D-341 the scoped card strip holds only the cards whose pins are on screen, so a stretch miles away is reachable only by zooming out or panning; nothing on screen says it exists. The candidate: a small chip ("1…
    2026-09-14Sharing
    (Captured at S-D-331's reconcile, DEF-050. NOT decided — a design-SOR rule.) Today the sheet decides inclusion at the drawn PIN (whole disc inside; a merged pin all-or-nothing — Design/screens/sharing-what-goes.html: "the rule that makes it shippable"), and the wire carries the frame plus the list of in-frame members…
    2026-09-14Sharing
    (Captured at S-D-331's reconcile, DEF-050.) The frame is on the wire now (token v3), so the shared page COULD draw the rectangle the sender saw — "the crop on your screen is the crop on the page" (the design's own promise, which SPEC §15 currently says sender-side copy must not make). Today spot-map.ts fits the still…
    2026-09-14Sharing
    APP_STORE_URL is unset in workers/share/wrangler.toml; the interstitial falls back to talewater.app labelled "What is TaleWater?" (workers/share/src/share-io.ts:1078-1103). Long-lead: needs the App Store listing to exist first. Flagged 2026-09-14, PM-routed.
    2026-09-14Sharing
    When a sender re-shares a pin the recipient saved and then edited, or shares a richer version (dates or notes previously withheld), offer "Keep mine / See changes" instead of a silent skip. Post-launch. Nate 2026-09-14: "agreed, log it." Cross-ref S-D-334 row 11.
    2026-09-13from S-D-326 (Precise Location is part of the record-gate grant). What an OPEN recording does when Precise Location is switched off mid-session. (Captured at S-D-326's reconcile, DEF-050. Pure-additive capture, no Nate confirmation attached.) The gate now refuses to START on a reduced grant, but shouldCloseOnPermissionDowngrade (src/lib/gps-permission-policy.ts) still closes an open recording only on denied
    a user who flips Precise off with a session running keeps recording on kilometres-wide fixes, and nothing tells them (the same Q-G1 shape S-D-317 narrowed). Three answers on the table: close the recording the way denied does (reconcileLocationPermission already runs on app foreground, so the seam is one comparison); k…
    2026-09-13from S-D-322 (the share picker is the map). Converge the remaining aggregateRunPins surfaces onto the one tree. S-D-322 put the share picker on the map's tree via one builder (src/lib/onetree/water-pins.ts buildWaterPins) and deleted the picker's older grouping and the viewfinder's own screen-space merge. aggregateRunPins (src/lib/run-pin-aggregation.ts) still groups three surfaces: the all-waters (master) map at run tier (src/app/(tabs)/map.tsx renderPins / buildFocusPins's "others" half), the session screen's pins (src/app/session/[id].tsx), and the share Worker's run/water pages (workers/share/src/run-members.ts runMemberRows / waterSpotClusters). Nate, 2026-09-13, on the picker's divergence: "sounds like a poor architectural decision. confirm your new direction simplifies the product and doesn't add more exceptions to rules."
    this is the rest of that convergence. Shape: each surface takes the tree (master needs a cut per water at the camera's zoom; the session screen a day-scoped tree; the Worker already cuts one for the water page and could reuse it for run membership), then aggregateRunPins and toAggPins's pin-side helpers are deleted. N…
    2026-09-12Map tap frame / smallest shape
    **showFrame as {center, zoom} +
    2026-09-12Map pins / stretch containment
    **A container-free group that
    2026-09-12Map state / selection anchor
    **Retire selectedAnchorId —
    2026-09-11Sharing / open in map app
    (Captured at the S-D-310 reconcile.) Anglers use both, and both were on the story's wish list, but neither documents coordinate parameters on its custom URL scheme — so a row would open the app to wherever it was last (the DEF-556 failure) and only feel like it worked. Add either the day a documented contract exists (…
    2026-09-08Sharing / the viewfinder's dimming bands
    (Captured at S-D-299's reconcile, DEF-050 — the story's source comment claimed this was filed, and code review (S-D-299-R6) caught that it was not. Pure-additive capture, no Nate confirmation attached.) The visual SOR draws the four bands outside the crop as rgba(26,26,23,.34) plus backdrop-filter: blur(3.5px) saturat…
    2026-09-08Sharing / map pins
    (Captured at S-D-299's reconcile, DEF-050 — same missing-filing as the entry above, caught by S-D-299-R6.) The pin's on-screen size owns the viewfinder's inclusion test — a spot is in only if its whole 24px disc sits inside the crop — so src/components/share-viewfinder.tsx needs the value. It restates it rather than i…
    2026-09-06Map / offline reliability
    (Captured 2026-09-06, alongside the paired Scoped public-land-overlay caching entry above. Pure-additive capture, no Nate confirmation attached.) Nate confirmed this is a real annoyance but ranked it second, behind the overlay re-fetch/status-pill fix. Distinct problem from the caching work: on water with no cell sign…
    2026-09-03Design SOR / staleness
    (Captured 2026-09-03. Pure-additive capture, no Nate confirmation attached.) TECH_SET = ['Dry', 'Nymph', 'Euro', 'Streamer', 'Swing'] still lives at Design/screens/day-facets.js:192, while shipped code resolves technique_group ?? fly_type through resolveMethod (src/lib/day-facets.ts:544-546). The proposal was already…
    2026-09-07Sharing / deletion semantics
    (Captured 2026-09-07 at the S-D-299 filing. Pure-additive capture, no Nate confirmation attached.) Deleting a shared object takes its page with it — the recipient's link stops resolving, not merely stops updating. True today across the share surface, but never written into a durable doc (SPEC.md §15 states "once share…
    2026-08-25filed from the S-D-204 (Sprint SA5) close and its mandated
    2026-08-24filed by the S-E-73 step-4 reconcile (DEF-050)
    S-E-73 shipped insect, stage, season and time_of_day (plus proposed_stage and spot_anchor) through the entire chain — prompt v0.19, both schema homes, createObservations, insertObservations, sync dataColumns, SQLite v60, Supabase — and no surface reads any of them. A hatch pin draws its mayfly glyph (that half was alr…
    2026-08-24filed by the S-E-73 step-4 reconcile (DEF-050), pre-existing and reported-not-taken
    src/components/type-glyph.tsx:68 reads PRE_COLORED = new Set(['catch']) and tints every other glyph flat to theme.ink3 — so hatch's canon two-tone profile (shipped a160cbf2, revised 2026-07-24 with the hook stroke per Design/screens/fly-glyphs.html) renders as a flat silhouette on cards, pills and floating-card glyph…
    2026-08-24filed by PM from the Q-MAP3 partial resolution (QUESTIONS.md)
    Doc-only, no code — the code is already right. Q-RUN1 (Nate, 2026-07-12) settled that the run-card order governs, and S-D-109 reconciled the code to it. Verified at origin/main 2026-08-24: Design/screens/run-card.html:184 reads ['catch','encounter','hatch','technique','feature','named'] and src/lib/run-pin-aggregation…
    2026-08-02from Nate's bug-filing session (screenshot of the Day screen → Summary facet, Jun 2 2026 / Frenchman Cut; verbatim: "Needs design. List of catches is just a list. Meangless. Give it context and a visual story of the day.")
    Nate is rejecting the form, not reporting a malfunction. This is a design need first: the deliverable is a design handoff from Nate's canvas into Design/_inbox/ for design-intake, not a build story — nothing here is scopeable until that lands. The app is faithful to the current canon, so this supersedes design rather…
    2026-08-02from Nate's bug-filing session (verbatim: "Need more robust search and filtering ability. Include businesses or not, landmarks, etc. needs to be so that if someone tells me about a water. I can find it with different info than just the river name")
    The core need is the last sentence: someone tells Nate about a spot by a name that isn't the river's — an access, a ranch, a town, a shop, a landmark — and there is no way in. Today the Map search is a thin pass-through to Nominatim place-name lookup (src/components/map-search-bar.tsx + src/lib/nominatim-client.ts sea…
    2026-08-02from Nate's bug-filing session (screenshot of the fullscreen day-scoped map, Frenchman Cut, satellite basemap, one pin selected with the carousel showing "Smallmouth · 20″"; verbatim: "Needs design. The halo for selected pin doesn't pop enough. It mutes the pin because it's in front of it.")
    This is a design need: the deliverable is a design handoff from Nate's canvas into Design/_inbox/ for design-intake, not a build story — nothing here is scopeable until that lands. The strongest finding is that the glow was specified against a cream-paper map ground and the screenshot is satellite. The canonical selec…
    2026-07-25from S-D-172 reconcile (DEF-050)
    **Make the record-cycle position indicator a tappable record picker (jump, not just step). S-D-172 shipped vertical record cycling on the water/day journals with a · N/M indicator in the masthead, display-only. The natural follow-on Nate may ask for once he lives with it: tap the indicator to open a picker and jump to…
    2026-07-25from S-D-172 reconcile (DEF-050)
    S-D-172's mechanism is the native over-scroll of each facet's ScrollView (onScrollEndDrag + alwaysBounceVertical), which is an iOS rubber-band behaviour. Android has no bounce by default (overScrollMode shows a glow and content offsets clamp at the boundary), so on Android the pure decision function simply returns 'no…
    2026-07-25from S-D-169 reconcile (DEF-050)
    S-D-169 added per-field provenance tracking for flow/water_temp_f/water_clarity, but the legacy session/[id].tsx screen (still live, reachable from recorded-sessions.tsx in the Journal tab) edits these same three columns through the older, un-stamped updateDayFields — a real, structural gap: any edit made from that sc…
    2026-07-24from S-D-158 reconcile (DEF-050)
    Anchored-regex date extraction for feed-less shops whose report page carries a stably-placed prose date but no machine-readable one — House of Fly (ordinal date) and Confluence Outfitters (yearless positional dates among ~400 archive links). Fast-follow to S-D-158's publisher-declared-date tier. Confluence's CA waters…
    2026-07-24from S-D-158 reconcile (DEF-050)
    A headless/rendering fetcher for report pages that 403 or JS-render — Troutwater (Square Online JS shell) and Avid Angler (Cloudflare 403). A separate paid-dependency decision (P-49 registry row if a paid rendering service is adopted). Status: Unscoped — awaits Nate's shaping + gate.
    2026-07-24from S-D-158 reconcile (DEF-050)
    S-D-158's worker exposes GET /shop-reports/health listing structurally-rotted parser shops (P-47), but nothing renders it where Nate would look; wire a small card into the CRM / pipeline-health dashboard that reads it. Small UI story. Status: Unscoped — awaits Nate's shaping + gate.
    2026-07-24from S-D-160 reconcile (DEF-050)
    ~~The 2026-07-24 wind-unit design handoff (PR #967) specified a plain-language day narrative and a tappable 7-day forecast strip inside the Weather card, driving temp/wind/pressure/arc/glyph together. S-D-160 deliberately did NOT build this half — the handoff's own forecast values are placeholders with no real feed ("…
    2026-07-23from S-D-157 reconcile (DEF-050)
    S-D-157 adopted a complete OpenMapTiles style reskinned to Paper/Slate with our branded water overlay pushed prominent. Two deferred, render-dependent calls Nate makes once he sees it on device: (1) always-on vs. a "water detail" toggle in the layer picker — should the refined water emphasis always be on, or a flip th…
    2026-07-23from S-D-152 reconcile (DEF-050)
    (1) fished provenance — the time-of-day tag is derived from started_at's local hour; an angler-editable override (in case a trip's actual fished window differs from the recording's start time) is a candidate future story, not committed. (2) Extend the "name never wraps/truncates" hard constraint to the Waters-card (fi…
    2026-07-23from S-D-124 reconcile
    S-D-124 added an independent src/lib/gauge-coords.ts (USGS OGC monitoring-locations read) because no exported function returned a gauge's own lat/lng and the only impl was private in the S-D-150-owned usgs-streamflow.ts. Once S-D-150 has merged, consolidate to one shared coordinate reader (export the existing helper o…
    2026-07-23from S-D-124 reconcile
    S-D-124 shipped the gauge detail sheet with a fixed 7-day hydrograph and no reach-description line (kicker + station name only). The design canon (river-gauge-pin-detail.html) shows a 24h/7d/Season window toggle and an authored reach description ("the reach it measures"); the toggle was deferred ("only if cheap") and…
    2026-07-21Nate capture
    When the user taps to start a recording and either permission is denied/not-determined, the app should show a full-screen blocking state that explains why the permission is needed and gives a direct path to Settings — not fail silently or show a toast. Nate attached a screenshot from Fi (a dog-collar tracker app) as a…
    2026-07-20Map Pins design-handoff intake / PR #808 follow-on
    Two accepted-not-solved render-time engineering calls flagged by the 2026-07-20 "Map Pins (uniform, no aggregation)" handoff: (a) the run-pin grouping radius is a fixed ~50m (RUN_GROUPING_RADIUS_M), tuned for wading — boats travelling fast over-split into several run pins; consider mode-aware or per-water. (b) The zoo…
    2026-07-20Map Pins design-handoff intake / PR #808 follow-on
    The handoff flags Project Documentation/Design/foundation/pin-glyphs/ (catch.svg / encounter.svg etc.) as unreferenced by any shipped screen now that all Map Pins glyphs are inline SVG recreated in the native layer. Decision needed: retire / update to the new inline values / leave. Hygiene, not a defect. (SOR never de…
    2026-07-20S-D-133 reconcile capture (DEF-050)
    S-D-133/DEF-418 ships a 3-attempt retry against the public overpass-api.de endpoint plus honest error-surfacing (a Retry affordance rather than a silent unbound pin) as its reliability answer; DEF-418's own investigation hit sustained rate-limiting and a hard HTTP 406 from a handful of hand-run queries on one IP, and…
    2026-07-20S-D-148 (reserved)
    Nate (2026-07-20, verbatim): "I need to be able to delete days that don't have anything associated with it… I have a blank untitled day in the app that I can't do anything with." A day with zero recordings AND zero non-discarded observations is currently undeletable from every surface — verified this session: day soft…
    2026-07-19S-D-147 reconcile capture (DEF-050)
    S-D-147 introduced a second water mark — the generic ripple — for the map pin and the Waters nav tab only, at sizes where a per-water outline can't read. The pre-existing water identity mark is the water's own map-feature outline (lake polygon / river reach — the "Water Glyph (paper)" canon promoted 2026-07-01), which…
    2026-07-19S-D-143 scoping (Nate's ruling)
    A persisted catalog of USGS/BOR gauge sites (id, name, coordinates, source), populated and refreshed by some mechanism TBD, sized so it can back a map-viewport query. It is the resolved answer to "what is the corpus of all water gauges in our data" and the blocking prereq for S-D-143 (the Basemap/Layers overlay system…
    2026-07-19River Flow Gauge Glyph intake (Design Intake)
    screens/landmark-glyphs.html states a landmark shows at every zoom and never aggregates. screens/map-pins.html tier 0 (zoomed-out region) states every pin collapses to a bare presence dot with no glyph — and in fact draws no landmark at all. The contradiction spans all five landmark kinds (access, camp, prospect, name…
    2026-07-20S-D-137 reconcile capture (DEF-050)
    Named in S-D-137's "Out of scope" section: fly_pattern, air_temp_f, weight_lb, access_kind, rig and similar are all nullable on one wide row, only ever populated for a subset of observation types — a different axis of tech debt from the day/water resolution cluster S-D-137 fixed (per-type sub-tables, or a narrower cor…
    2026-07-16S-D-116 review capture
    src/app/water/[id].tsx's masthead subtitle reads the new fisheries.region column — nullable, no authoring flow ships in S-D-116, so it reads empty for every water indefinitely. The sibling Waters-tab list (fisheries.tsx) already computes a real region for the identical display purpose via src/lib/water-region.ts's get…
    2026-07-16S-D-115 reconcile capture (DEF-050)
    The pilot shipped the day-CONDITIONS-card live gauge read (S-D-115, USGS-only, river fisheries, client-side, in-module cache). Deferred, each its own future decision: (1) fishery-sheet placement — the same live read on fishery-sheet.tsx's detail face (deferred partly because in-flight S-D-92 owned that file surface at…
    2026-07-16S-D-115 review capture (L2)
    src/lib/usgs-streamflow.ts (haversineKm), src/lib/reconcile.ts:118 (haversineMeters, exported), and src/lib/overpass-client.ts:82 (private copy) now carry three implementations of the same great-circle distance. Mechanical consolidation story: one shared home, three call sites re-pointed, unit parity pinned. Status: U…
    2026-07-12Observation taxonomy
    Nate (2026-07-12): technique "is kind of a mess right now and several things are conflated." Concrete threads to resolve when it's shaped: (1) the picker description is "Gear or method in use this session" — it mixes gear vs method; (2) it's coded Water-only despite the "this session" wording (isDayMember in src/lib/o…
    2026-07-12Map pins / recovery
    Deleting a manual map pin is irreversible from the UI today — no undo, no recently-deleted list — so an accidental delete has no in-app recovery; add an undo affordance and/or a "Recently Deleted" recovery surface for pins. Cheap because the persistence already exists (pointers for whoever scopes it): manual pin delet…
    2026-07-11S-D-102 review follow-on (L2)
    getRecordingsForVisibleDays (S-D-102) runs a correlated COUNT(*) FROM observations WHERE recording_id = r.id AND user_id = ? per recording, once per Sessions-screen load and every 2.5s while a recording is processing. observations is indexed on user_id but not recording_id, so the subquery is O(recordings × user-obser…
    2026-07-11S-D-100 follow-on
    S-D-100 swapped the fishery map off <ObsPin variant="fishery">-per-observation onto the neutral run pins — but FisheryPin is NOT yet dead: the Session-Log map (session/[id].tsx:922) still renders variant="fishery" per-observation, and obs-pin.test.tsx still tests it (a code-review catch — the initial S-D-100 note wron…
    2026-07-11S-D-99 follow-on
    S-D-99 made provisional observation + fishery pins render identically to confirmed ones on the map (verification is no longer a pin-appearance channel), but the visual SOR still documents the old pending treatment — Design/screens/fishery.html .fp-house.pending (dashed pend-bg housing) and the map-pins canon's provisi…
    2026-07-11S-D-99 follow-on
    Per Nate (2026-07-11), the longer-term direction beyond S-D-99: the review workflow "likely goes away entirely" eventually, and confirm/delete just happens on any pin at the user's discretion rather than provisional captures routing through a review queue. S-D-99 removed only the pin's pending look; the session-log "N…
    2026-07-11S-D-98 follow-on
    The adopted "Recordings per Day" design cleared the day row to date + water + yield + a rail, which removed two deliberate prior features from the Sessions face: the S-B-45 export-audio hatch (hand the user their durable audio for a stuck/failed recording — the "never lose your audio" affordance made actionable) and t…
    2026-07-11S-D-95 follow-on
    S-D-95 built run-pin aggregation (src/lib/run-pin-aggregation.ts + the RunPin/RunPinCard render) on the Map tab (screen 03) only. The Water/Fishery map (src/app/fishery/[id].tsx), the Session Log map (screen 08), and the Day map each have their own pin-render loop and still draw one pin per observation. The aggregator…
    2026-07-11S-D-91 follow-on
    S-D-91 gave every migrated screen a real error value from the shared hook, but only the "explicit" screens (day/fishery/entry) render it; the screens that historically swallowed errors (journal/axis, journal/skills, the bare null-sentinel screens) now have error available but still render nothing on a failed load (a s…
    2026-07-11Principal-Engineer audit (UI layer)
    (runtime-gated, not build-stripped). Candidate for a build-time strip. Status: Unscoped.
    2026-07-11Principal-Engineer audit (UI layer)
    Split opportunistically when stories touch them, extracting pure geometry/state helpers first — advisory, NOT a standalone story. Status: Unscoped — advisory.
    2026-07-09Motion tokens / Reanimated
    Left inline during S-D-87 (the motion-token extraction) because they sit inside a Reanimated gesture worklet — dragging a module constant into a worklet is a DEF-180-class capture concern that S-D-87 deliberately excluded (same reason session/[id].tsx:267's worklet 220 was left). Small tech-debt: a future Reanimated-m…
    2026-07-07Map / overlays
    A map overlay showing where dispersed camping is legally allowed on public land (BLM/USFS), for the existing MapLibre-based map's Streets/Satellite/Hybrid/Topo toggle set (SPEC.md's Map architecture row, ~line 227) — useful for anglers planning multi-day trips near water. Conceptually similar to onX Offroad's disperse…
    2026-06-11Day detail / conditions card
    (Recovered 2026-07-06 from an orphaned unmerged branch (claude/lake-flow-logic-backlog-deow64) during an Ops cleanup sweep; confirmed still unbuilt — src/app/day/[id].tsx's FLOW rendering is unchanged.) From Nate, on the Day detail page for a lake (Beaver Lake): the CONDITIONS card shows three fixed columns — WATER /…
    2026-06-11Day detail / recap completeness
    (Recovered 2026-07-06 from an orphaned unmerged branch (claude/lake-flow-logic-backlog-deow64) during an Ops cleanup sweep; confirmed still unbuilt — getSessionScopeObservationsForDay still exists but is still uncalled from src/app/day/[id].tsx.) From Nate, same Day detail page: it footers "FROM 8 RECORDINGS" but surf…
    2026-06-11Education / content mode
    (Recovered 2026-07-06 from an orphaned unmerged branch (claude/university-mode-guide-e46o96) during an Ops cleanup sweep; confirmed not already captured under any existing entry.) A learning/educational surface in the app — Nate's framing names three (possibly overlapping) modes: a "university mode," a "guide mode," a…
    2026-07-02Design/canon
    Canon puts a radial-gradient dot grain on every screen; the app has no paper-grain overlay anywhere (AUDIT.md FIDELITY-2026-07-02). A cross-screen call Nate held out of S-D-71; the dark-mode grain-flip rule is already specced (rgba(255,255,255,.04), rides S-D-70) but is N/A until grain exists.
    2026-07-01Pin clustering / aggregation
    When multiple feature observations fall within a small radius (Nate's example: 5 features in a ~100ft radius), aggregate them into a single map pin whose description carries everything known about that stretch of water — so the map stays legible at low zoom and one pin answers "what do I know about this run?"
    2026-06-30Day notes editing
    S-D-61 adopted the simpler "A Day" Day-detail design (per Nate's direction), which removed the inline Field Notes editor — the manual days.notes editor — so manual note editing now has no home on the Day detail (src/app/day/[id].tsx). Decide whether note-editing needs a new home (e.g. inside the /writeup/[id] screen,…
    2026-06-29Capture health
    (deferred-from S-D-55). The S-D-55 capture-issue marker reads a LOCAL-ONLY capture_summary column; syncing was deferred (delete-before-optimize — no server-side consumer reads a capture summary yet; operator back-office C is deferred). When a consumer exists (operator dashboard / multi-device), add capture_summary to…
    2026-06-29Capture health
    (deferred-from S-D-55). The marker is covered at the component tier; an end-to-end Maestro assertion needs the e2e seed (scripts/seed-test-db.mjs / reset) to support seeding a recording with a capture_summary, then a recorded-sessions.yaml step asserting the marker on that row. Status: Unscoped.
    2026-06-28Capture diagnostics
    (deferred-from S-D-54 code review #2, LOW). trimCaptureLog keeps every transition + every stalled watchdog tick (so the anomaly itself is captured) + a 1/min healthy heartbeat — but not the last N healthy ticks immediately preceding an anomaly. Adding a small look-back buffer in the trim loop would give the lead-up co…
    2026-06-19Knowledge display
    **Make a learning's technique scope visible so applicability: universal doesn't read as "applies to all fishing." From Nate's Cle Elum review drain (surfaced during S-E-37): Nate thumbed-down Euro-nymphing tips tagged applicability: universal, reading "universal" as "true for every kind of fishing." The extraction is…
    2026-06-20Processing UI
    From S-D-46: Nate chose the compact Log-card treatment for pipeline-stage progress + timing; a full-screen processing view (a richer live walk of the stages with timings, for a recording in flight) is a possible later D surface, explicitly out of scope at S-D-46. Status: Unscoped — shape if the Log-card line proves to…
    2026-06-18AI day-summary follow-up
    S-D-44 generates the Day-summary recap narrative lazily on first view and caches it on days.summary; it is not regenerated when the day's data later changes (a catch added, conditions/field-notes edited) — the cached recap can go stale. Out of scope at S-D-44 per the story. When promoted: decide the refresh trigger (a…
    2026-06-18AI day-summary follow-up
    The S-D-44 recap is built from catches / observations / conditions / field-notes only; the richer technique-spot + location-scope signals S-E-14 adds are not fed to the narrative. Gated on S-E-14 landing. When promoted: extend DaySummaryInput + buildDaySummaryFacts in src/lib/day-summary-generate.ts with the new signa…
    2026-06-16Observability
    2026-06-16Observability
    Wire
    2026-06-17Fishery
    From in-app bug report 63ab9794 (captured 2026-06-17). A fishery that has no sessions and no logs still persists with no way to remove it; Nate wants to delete it directly from the fisheries list or the fishery screen. Feature request, not a defect — no defined prior behavior was violated; there is simply no delete af…
    2026-06-07Fishery
    S-19 shipped delete-a-fishery via long-press in the session-edit fishery picker; S-A-32 retired that modal and S-D-12 (session-fishery assign) rehosted create / pick / assign but not entity deletion. The deleteFishery / countSessionsWithFishery / reassignFishery DAL (src/db/fisheries.ts) is intact but uncalled, so a f…
    2026-06-15Fishery / Manage Fisheries surface
    From the 2026-W25 WBR Product lens. Fishery-entity deletion/reassign lost its UI host when the session-edit modal was retired (S-A-32) — the deleteFishery / reassignFishery DAL (src/db/fisheries.ts) is intact but uncalled (tracked as GAPS.md G-10). A dedicated Manage Fisheries surface would re-home deletion and host t…
    2026-06-15Map / observation–learning-item union
    From the 2026-W25 WBR Product lens. The SPEC §6.1 Map observation/learning-item union is unbuilt (GAPS.md G-09): the Map (src/app/(tabs)/index.tsx) renders only observations, so fishery & technique learning-item pins never appear, and §6.9 durable-place pin routing (entry point (c)) has nothing to bind to. Worth scopi…
    2026-06-07Map
    The ability to filter which pins are shown on the map view. Open for scoping: what attribute(s) pins filter by — date / time, observation type, species, fishery, tag, or some combination — and the filter UI affordance. Relates to SPEC.md §6.1 (filter set) and the [E] "Encounters as a UX-wide lens" idea.
    2026-06-10App-entry / landing UX
    From the build-2 device walk (Nate): "'Proceed to journal' is the wrong UX — need a story to fix it. Need to update the design on entering the app. Can't land on journal." Problem: on entering the app you land on the Record launch face, and the only path into the journal is the "Proceed to Journal →" link — the user c…
    2026-06-11Fishery / water-shape rendering
    From Nate: the "water picture" shown next to a fishery — the visual that conveys whether it's a lake or a river — isn't coming out right; the shapes look wrong. Wants a better design for it. Where this lives in code (pointers for the future scoping session — confirm which surface Nate means): (1) the water-type glyph/…
    2026-06-11Journal / Fishery
    Likely V3 (post-MVB). When a user adds a fishery manually because they want to fish it later, pull in AI-curated information about that river/lake — making the fishery entry a research tool to prepare for a fishing trip. The same idea applies to seeding an empty/sparse Journal. All AI-generated content must be clearly…
    2026-06-14Navigation / detail screens
    From the S-A-70 bug-report intake (DEF-057, now closed→here): Nate expects the bottom nav bar on the Day and Fishery detail screens; today it's absent because those screens were deliberately built as full-bleed full-screen pushes outside the tab navigator (for the map-hero look — src/app/_layout.tsx root Stack routes,…
    2026-06-14Session / review interaction
    From the S-A-70 bug-report intake (DEF-058, now closed→here): Nate reports tapping "Review" on a session does nothing / no review screen opens. Today (story S-D-30) Review deliberately scrolls in-place to the first provisional observation (scrollToFirstProvisional in src/app/session/[id].tsx) instead of opening a moda…
    2026-06-11Knowledge surfaces / presentation
    Lead with discoveries, collapse fundamentals into a "basics covered" section. Rank/demote, never hard-hide (reversible — the rank/fold-never-system-hide posture). Consumes the leveling score from the [E] Knowledge leveling / salience layer above. Gated on the E leveling spike landing. Layer 3 (Presentation) of the thr…
    2026-06-11Journal
    The Journal Day-summary recap (screen 10·b, day/[id]) assumes one water per day; a day spent on multiple waters is unmodeled, so the recap would mis-represent such a day. Deferred per Nate (Q-JD1 disposition, 2026-06-11): "design when it appears in real data." Low priority. Track the assumption as a known one, not a s…
    2026-06-04Placement
    offsetSecondsForEvidence (S-A-38) does a whitespace-normalized, case-sensitive substring match against the transcript; model-cleaned quotes (dropped fillers, collapsed repeats per EXTRACTION.md P-EX3) that no longer substring-match fall to unplaced (correct-but-lossy). Add a normalized/fuzzy fallback (filler/punctuati…
    2026-06-04Consumer
    Needs a one-sentence definition before scoping: free-text user notes per observation, or a Claude narrative note per observation? Different builds. Open decision in V2_STRATEGY.md.
    2026-06-04Consumer
    Refine how pins render and adjust. Partly covered by the existing drag-to-place item + the P-10 precision channel; this captures any further treatment Nate wants.
    2026-06-06Auth UI
    S-B-07 built the sign-in / sign-up screen (src/components/auth-screen.tsx) to the Paper/Slate tokens because no canonical design existed in Design/. Produce a canonical auth-screen design (sign-in + sign-up states, error treatment, and the "Continue with…" social-button slots if social auth ever lands) and reconcile t…
    2026-05-29Map
    Catch-spot pin aggregation. When many catches accumulate at one good spot, the map ends up with dozens of overlapping pins. Collapse them into a single aggregate pin that, when tapped, shows the number of fish and the associated sessions; an exploded view of all individual fish/observation pins is available on demand…
    2026-06-02Insights / Fishery
    Captured from Nate's product intuition: as observations accumulate at a fishery across trips, the map gets crowded with discrete pins; he wants them to "collapse into the fishery summary" so the next visit starts from understanding rather than a pin field. Layer correction (the important part — do NOT route this to th…
    2026-06-08Recording UI
    When a capture/recording session is active and the user navigates away from the recording screen, the rest of the app must surface an unmistakable, persistent affordance that a recording is still in progress (ideally a tap-target back to the recording screen). Today, navigating away leaves no global signal that record…
    2026-06-08SPEC hygiene follow-up (residual from S-D-16)
    S-D-16 left, by deliberate scope decision: (a) ~11 behavioral references to sessions/gps_recordings in §5/§6 prose, retained as conceptual entity names mapped by the §3.4/§4.1 rename notes — a full literal-token sweep to days/recording_gps_sessions is low-value and readability-negative on its own; (b) two entangled ou…
    2026-06-05Cleanup
    F-27/F-47/F-48 ✓ Done by S-D-15 (2026-06-08) — see Completed_Stories.md (~~F-27: Expo starter scaffold still ships navigable (explore tab, web tab-bar, animated-icon, hint-row, web-badge, collapsible) — extends the existing 2026-05-22 [D] Cleanup entry. F-47: LocationAnchor type declared twice (location-anchor.ts + no…
    2026-05-22Cleanup
    Dead code & asset sweep. Delete confirmed dead scaffold and orphan assets: src/app/explore.tsx (S-06 reconcile); src/components/app-tabs.web.tsx and src/components/animated-icon.web.tsx (web variants on an iOS-only project); Project Documentation/Design/foundation/icon-splash/talewater-splash-options.html (superseded…
    2026-05-23Components
    Build a small OverlayText component that always uses explicit colors (default color: '#0d1612' on a light overlay surface). Map-overlay UI (pin labels, callouts, controls) needs explicit text colors per D-23; a reusable wrapper avoids re-implementing the explicit-color escape on every future overlay. Drop-in replaceme…
    2026-05-23Onboarding
    First-run onboarding (explain + populate). Two facets of one problem: (a) an explanatory layer up front — what TaleWater does, how Plaud capture feeds into the app, what the review/log/map loop looks like (carousel, short video, or coachmarks on the live empty UI); (b) sample-session preload so a new user sees the map…
    2026-05-23Sessions
    A session-edit surface. §4.3 calls title (and implicitly water temp / clarity / flow) editable, but no §6 feature or §7 screen sites the edit affordance. Screen 11 (session picker) and screen 07 (observation detail's "session conditions" block) are the candidate entry points.
    2026-05-23Splash
    Splash → fish morph animation. Replace the static splash with the morph treatment prototyped in talewater-wave-morph.html and outlined in Design/foundation/icon-splash/README.md's "Morph" section: trigger on splash completion (~3s in), hold the fish shape for 1s, then transition to home. Requires moving off expo-splas…
    2026-05-23Review
    Better visual treatment for the §6.3 "Review N observations" entry point. The S-11 implementation is a static banner under the Log session header (per Active_Story §E) — it gets lost visually once the user scrolls into the list, and there's no way to dismiss-and-defer or surface from elsewhere. Candidates to design: f…
    2026-05-23Review
    Per-field "worth a look" policy + copy. §5.1 says a field is pending when "Claude expected a value and missed it," but there's no field-by-field policy specifying which observation columns are eligible for the flag and under what extraction conditions — today the flag is whatever the extraction client decides to write…
    2026-05-23Review
    Map-tab review entry point (prototype line 503). Cross-session "all unreviewed" surface for entering review from the Map tab, not just from inside a Log session. Deliberately deferred until Log-tab CTA proves out on device (D-42). Needs a sequencing decision: oldest-first, most-recent-first, or grouped by session.
    2026-05-23Review
    Map-top split layout on the review surface (§7.1 row 05). The spec calls for "Map top, card bottom" on the review screen; S-11 ships card-only. Polish story once the core verification loop proves out on real device against real sessions. Will need a map snapshot or live map showing the current observation's pin.
    2026-05-24Onboarding
    First-launch tour that explains what TaleWater does before the user reaches screen 01's empty state — what it captures, how Plaud feeds in, what the review/log/map loop looks like. Distinct from the existing 2026-05-23 "first-run welcome / get-started demo" entry, which is about populating the app with sample data; th…
    2026-05-25Fishery
    Define fishery as a first-class entity, and design the "fishery block" UI surface that displays fishery-scope observations (e.g., "this river fishes well in fall"). Surfaced during the §6.6 trip-pin retirement requirements discussion: extraction will tag every observation with scope: point | session | fishery, and fis…
    2026-05-25Cleanup
    ~~Sweep live D-XX references across the project docs to point at Decisions_Archive.md instead of the now-deleted DECISIONS.md. Known live references at minimum: QUESTIONS.md (Q-A2 → D-16, Q-D1 → D-35, Q-SE1 → D-30, Q-PF1 → D-57/58/59/60). Same pattern likely lives in SPEC.md and Completed_Stories.md — verify and sweep…
    2026-05-26Weather
    Tiered weather endpoint upgrade (low priority). Switch weather-client.ts to a two-tier strategy: observations ≤5 days old use the current forecast endpoint (api.open-meteo.com/v1/forecast, near-zero lag); observations >5 days old use the Open-Meteo Archive endpoint (archive-api.open-meteo.com/v1/archive, ERA5 reanalys…
    2026-05-26Weather
    Manual "retry weather" affordance on the observation detail screen. A button (or pull-to-refresh gesture) that re-triggers backfillWeatherForObservations for the current observation from the detail screen. Covers two cases: (a) original backfill failed due to outage (fields are blank); (b) user wants to re-fetch after…
    2026-05-25Placement
    Drag-to-place on the S-15 placement modal map. Today (src/components/place-on-map-modal.tsx) the placement primitive is tap-on-map: each tap drops a candidate pin at the tapped lngLat; a different tap moves it. Surfaced as confusing during S-15 acceptance — the user's natural expectation is to drag the pin, not tap-an…
    2026-05-26Design
    Per-screen design coverage gap. Design/ ships visual SOR for screens 03 (Map), 05 (Review), 07 (Observation detail), 12+13 (Diary), and the launch splash. Screens 01 (first run), 02 (Log), 04 (Add a session), 08 (GPS recording), 09 (GPS permission), 10 (Filters), 11 (Session picker) have no current design SOR. Address…
    2026-05-27Diary
    Functional search on the Diary landing. S-17 ships the search row visually (src/app/(tabs)/diary.tsx) but it is inert per story scope — tapping it does nothing. Promote when there are enough entries that scanning the axis list becomes work. Open shape questions: (a) does search filter the current axis list (reduce the…
    2026-05-27Diary
    Toggle state persistence on the Diary landing. S-17's axis state lives in component-local useState so the toggle resets to Fisheries on every tab switch (the useFocusEffect reloader doesn't preserve the user's last choice). For someone who lives on Techniques day-to-day, this is a small recurring friction. Lift state…
    2026-05-27Diary
    Per-axis row icons on the Diary landing. S-17 ships a uniform colored placeholder square (styles.rowIcon in src/app/(tabs)/diary.tsx). The design (Design/screens/diary.html) has distinct glyphs per axis — a curved fish-water wave for fisheries, a peak/mountain for techniques, presumably a fish silhouette for species.…
    2026-05-27Fishery
    Fishery detail screen with Q3 (aggregations) + Q4 (composition) proposals carried forward from the 2026-05-25 Fishery entry. Once S-19 ships the fishery entity (typed flat body — river/lake/salt — with name + optional coords) and the fishery-naming story ships waterway autocomplete, the user has fisheries in their DB…
    2026-05-28Fishery
    ~~Fishery naming, standardization, and waterway name autocomplete.~~ Partially shipped S-22 (2026-05-29). Waterway autocomplete via OSM Nominatim and V1 naming normalization (trim + smart title-case) landed in src/lib/nominatim-client.ts + src/lib/fishery-naming.ts + the session-edit CreateFisheryModal. What remains f…
    2026-05-27Fishery
    Fishery parent-child hierarchy. V1 (S-19) ships flat typed fisheries with no parent relationships. Hierarchy emerges as a natural product need once a user has fished multiple named sections of the same body of water — e.g., "Upper Sacramento River" + "Lower Sacramento River" would benefit from a parent "Sacramento Riv…
    2026-05-29Fishery
    "Get directions to fishery" affordance on the fishery detail screen (and possibly the session-edit modal). Tap → opens the fishery's coordinates in the device's default maps app (Apple Maps via maps:// URL scheme, or Google Maps via comgooglemaps:// if installed, with a chooser if both). Requires the fishery to have c…
    2026-05-29Accessibility
    ABSORBED into S-D-174 (2026-07-26) — the app-wide 10px type-floor rebase covers this entry's remaining work, and its 10px ladder supersedes the "body ≥13 / secondary ≥11 / labels ≥9" phrasing below. Not open; retained for history. Original text: At the iOS smallest text size, TaleWater text reads significantly smaller…
    2026-05-29Accessibility
    Paper-canonical screens pin text to design-specified sizes via allowFontScaling={false} (S-25 decision). This is intentional and defensible — pixel-locked designs are the norm — but it means users who rely on larger system font sizes get no benefit on those screens. A proper Dynamic Type workstream requires: (a) desig…
    2026-05-29Log
    The S-26 Log session-selector card at the top reads as a "drill into this session" affordance but actually opens a session picker sheet — two interaction models in tension. Nate's call (during S-26 device walk): redesign the Log as a multi-step screen mirroring the Journal hierarchy. Proposed shape: top level = a list…
    2026-05-29UX convention
    Across the app, intermediate-level screens currently render as pull-up cards (modal sheets) where they should instead be styled like their parent — full-screen paper canvas, push navigation. The pull-up card pattern should be reserved for the LOWEST level in the stack: the detail card. Corollary: pickers (type picker,…
    2026-05-29Map cartography
    S-A-28 widened river casings (fixed) and tuned zoom-level thresholds, but place-city-town and place-region still show no text on device. Likely cause: 'Noto Sans Bold' is not the exact glyph name Stadia hosts — MapLibre silently drops text when a font name doesn't resolve. S-A-28 added 'Noto Sans Regular' as fallback…
    2026-05-30Splash polish
    The paper launch splash (src/components/launch-splash.tsx) ships with the reflection mark flex-centered + translateY(-40) ("Nate's height lock"), but on device the mark's height is still not where Nate wants it. Root cause is P-21: the position was tuned against browser/HTML mockups of the canonical, which confirm con…
    2026-05-30Map
    Handoff 2026-05-30 makes the rust live-location puck (paper-2 puck + rust core dot + faint rgba(196,84,30,.13) halo) always on, even when not recording. Today the puck is bound to the active GPS recording lifecycle in src/lib/location-recorder.ts; the change lifts puck position to an ambient subscription that runs whe…
    2026-05-30Design
    Handoff 2026-05-30 ships canonical pin-glyph SVGs at Design/_inbox/TaleWater Handoff 2026-05-30/assets/pin-glyphs/{catch,encounter,feature}.svg. Compare against the current scripts/build-pin-glyphs.mjs source SVGs (assets/images/pin-glyphs/); promote handoff SVGs as canonical if they differ visually. Note: no techniqu…
    2026-05-30Capture
    Per Nate's 2026-05-30 call: the current Plaud + file-picker is being demoted to a dev-only control as part of the Session Log redesign. Email ingestion (B-line 47, 2026-05-26) is the planned user-facing replacement once the backend pipeline exists. A productized manual upload affordance is likely required later — for…
    2026-05-30Sessions
    ~~Session details view / edit (Nate-directed).~~ SHIPPED as S-A-32 (2026-05-30) — the v2 design's collapsible session-detail card on Level 2 (Date / Air / Water / Flies / Notes, per-row inline edit) + inline back-card name rename; session weather added (migration v10); session-edit modal retired. _Original entry:_ S-A…
    2026-05-30Cleanup
    Retiring src/app/session-edit/[id].tsx (S-A-32) removed the only UI that created/assigned fisheries. The fishery entity is intact per Nate ("fishery is the name; leave the entity"), but its write DAL is now unreachable from any screen: createFishery, assignFisheryToSession, reassignFishery, deleteFishery, countSession…
    2026-05-30Design
    The 2026-05-30 v2 Log (paper).html Level-2 chip row reads "All / Catches / Encounters / Conditions" — "Conditions" is not an observation type (it's a session attribute per the S-25 taxonomy: catch / encounter / technique / feature). S-A-32 kept the real taxonomy chips (All / Catch / Encounter / Feature / Technique) ra…
    2026-05-31Brand
    The 2026-05-30 handoff specifies the iOS app icon (cream ground, ink bars, lake reflection; squircle applied at runtime by iOS). S-A-33 swapped the iOS assets/images/icon.png (re-rendered via existing npm run build:icon from the paper-theme assets/icon-src/app-icon.svg). Android adaptive icon — assets/images/android-i…
    2026-05-31Log
    Surfaced during S-A-33 device walk. Today the only way to confirm or discard a provisional observation is to enter the Review sweeper (or, post-S-A-33, open the Observation Detail screen directly). On the Level 2 opened-session observation list, the user can't act on rows in-place. Proposed: wrap <ObsRow> (src/compone…
    2026-07-06Recovered branch / dev-tools
    (Surfaced during the 2026-07-06 Ops/PM branch-hygiene sweep — real, finished, never-shipped work.) The underlying bug is still live on main today: a synced account's DB wipe gets silently undone by the next sync pull. Whoever picks this up decides: cherry-pick the branch's actual diff, or re-do the work fresh (branch…
    2026-07-06Recovered branches / brand
    (Surfaced during the 2026-07-06 Ops/PM branch-hygiene sweep — real, finished, never-shipped work.) Place-on-map modal skin + map-layer thumbnail images; main's modal is still unbranded, thumbnails still missing. Whoever picks this up decides: cherry-pick either branch's actual diff, or re-do the work fresh (branches m…
    2026-07-16Journal / Knowledge codex
    Surfaced via a real, good example: a Cedar River learning card appeared in the Knowledge tab distilled from a spoken tangent about the Cedar River during a 2026-06-02 session logged at a different water (Frenchman Cut). Nate was glad this worked — extraction correctly captured knowledge from conversation regardless of…
    2026-07-23from S-D-155 reconcile (DEF-050)
    S-D-155's Day-screen Flow card shows the reading time as the ALREADY-RESOLVED live gauge read's own observedAt (unchanged S-D-115/118 behavior) rather than a new query for the gauge reading nearest the day's actual session midpoint — a Day viewed well after the fact currently shows the reading time from whenever the s…
    2026-08-31Journal / Knowledge lenses
    (Captured 2026-08-31 at Nate's call to HIDE, not delete, the two lenses — recorded here so the punt has a home rather than living only in the hiding commit, per DEF-079/DEF-050.) Nothing was removed: observations feeding the knowledge axes are still captured, aggregated and synced, and both screens (journal/axis/[axis…
    2026-09-12Record console
    (Captured from the App Store Submission design-intake handoff, PR #3461 — a record-console.html edit is implied but no board is drawn yet.) Pairs with S-D-317 (permission moments) but is a separate console-state change; needs a design pass before it's a Scoped story.
    2026-09-12Support surface
    (Captured from the App Store Submission design-intake handoff, PR #3461.) Built canvas-side in the bundle, not reviewed, not promoted; needs a backend endpoint and a read inbox before it's worth Scoping.
    2026-09-12Map / design drift
    (Captured from the App Store Submission design-intake handoff, PR #3461.) Four-item control stack, horizontal card rail, tab glyphs, and the public-land layer are all absent from the map-screen board relative to the shipped build. Note, 2026-09-12: Q-STORE2 resolved route 1 (capture the real app), not route 3 (render…
    2026-09-12Console / undrawn
    (Captured from the App Store Submission design-intake handoff, PR #3461.) Console states, most likely; no board exists yet.
    2026-09-12App icon / platform HIG
    (Source: the S-D-319 P-40 read, 2026-09-12.) S-D-319 ships the opaque ink tile as the dark variant too (the board: "direction B is already dark"). Apple's HIG draws dark icons on a TRANSPARENT ground so the system's own dark gradient shows through; the opaque tile will sit as a flat #1a1a17 slab beside gradient system…
    2026-09-14Sharing / auth gate
    (Captured 2026-09-14 from the same conversation that filed S-D-327. NOT decided — needs Nate's product call.) A signed-out read-only day view in the app would be a new surface. (The web viewer at talewater.app/s/t/<token> already serves this audience.) Nate said 2026-09-14 that forcing account creation is OK, so this…
    2026-09-16Lessons
    Users need to be able to edit and delete individual lessons. Nate, verbatim, 2026-09-16: "need to be able edit, delete lessons. Need proper design for adjust pin. Need proper design for what a shared day looks like." Status: Unscoped — awaits Nate's shaping.
    2026-09-16Adjust pin
    Nate, verbatim, 2026-09-16: "need to be able edit, delete lessons. Need proper design for adjust pin. Need proper design for what a shared day looks like." Status: Unscoped — awaits Nate's shaping.
    2026-09-16Shared day
    Nate, verbatim, 2026-09-16: "need to be able edit, delete lessons. Need proper design for adjust pin. Need proper design for what a shared day looks like." Status: Unscoped — awaits Nate's shaping.
    2026-09-17Branding
    Follow-up to S-D-348 (™ rollout, Scoped above). TALEWATER was filed 2026-09-17 (serial 50114293, S-F-02); registration is 12–18 months out. Do not build until the certificate actually issues — the filing alone does not permit ®. (Captured 2026-09-17, PM-routed, pure-additive.) Status: Unscoped — awaits the certificate.
    EExtractionSOR · EXTRACTION.md
    0 active0 in acceptance1 next up0 scoped67 unscoped
    Active
    No active story.
    In acceptance (0)
    No PRs awaiting acceptance.
    Next up (1)
    S-E-100the day's own read on fish size, extracted safely or not at all~2–3× S-18 (schema + prompt + rule-filter + grader extension + eval fixtures).
    should a day carry the angler's own spoken characterisation of the day's fish size — resolved YES by Nate (Q-EX19), against the shape below, not as a bare flag.

    question
    should a day carry the angler's own spoken characterisation of the day's fish size — resolved YES by Nate (Q-EX19), against the shape below, not as a bare flag.

    sizing
    ~2–3× S-18 (schema + prompt + rule-filter + grader extension + eval fixtures).

    Scoped — awaiting your gate (0)
    No scoped proposals.
    Unscoped ideas (67)
    show 67 ideas tagged [E]
    2026-09-11Extraction / spot naming
    (Captured at S-E-103's reconcile. The design asked for "retry once" on an over-budget name; the story did not build it — a second model call per failing spot is a rung-4 cost, and the type noun is the fallback. The trigger is a measured number: on the regenerated place-bearing fixtures (cleelum-technique-spots, cleelu…
    2026-09-08Field Notes / the day's lesson
    (Captured at S-D-291's reconcile, DEF-050.) The 2026-09-07 design puts "the day's lesson as the headline" on the shared day page (Fish the inside before you wade) and no generated field holds one: FieldNotesSchema (src/lib/field-notes-schema.ts) has a masthead title ("Cle Elum Fishalong — 6/1"), a date-line subtitle,…
    2026-09-03Extraction / field disposition
    (Captured 2026-09-03 alongside the S-D-253 filing. Pure-additive capture, no Nate confirmation attached — awaits his shaping + gate.) src/lib/extraction-field-disposition.ts:314-323 flags it GAP in its own words: added by S-E-73 so a told-about hatch could be detected rather than being byte-identical to a first-hand o…
    2026-08-24filed by the S-E-85 step-4 reconcile (DEF-050)
    src/lib/extraction-client.ts:1936-1944 calls ClusterExtractionOutput.safeParse(raw) and throws ExtractionError('schema', 'Journal synthesis failed — try again.') on any failure, so one malformed cluster record discards the whole journal-synthesis result for that recording — verified first-hand at main b535a50c. S-E-85…
    2026-08-24filed by the S-E-85 step-4 reconcile (DEF-050)
    src/lib/extraction-client.ts:1818 runs the chunk fan-out under Promise.all(chunks.map(...)), and isTransientExtractionError (:1780-1782) is err.kind === 'network' only — a deliberate S-E-32 guard against re-running a doomed truncation→continuation spiral — so a schema/parse failure is never retried and a single bad ch…
    2026-08-24filed by the S-E-85 step-4 reconcile (DEF-050)
    src/lib/extraction-schema.ts:568 exports it with an F-13-era comment describing lenient learning_items handling; a repo-wide grep across src/, tools/, extraction-harness/ and workers/ returns the declaration and nothing else — zero call sites. It is an ancestor of exactly what S-E-85 built, left behind when validateEx…
    2026-08-24filed by the S-E-85 step-4 reconcile (DEF-050)
    Harness copies: run.ts:189, cluster.ts:130, dedup.ts:89, backfill-fixtures.ts:94, reconcile-bundle.ts:242 (whose own comment reads "mirrors run.ts stripFences"), place-from-audio.ts:27. A seventh lives in production at src/lib/extraction-client.ts:991 — the reconcile's note said six across the harness, which is right;…
    2026-08-24filed by the S-E-85 step-4 reconcile (DEF-050)
    extraction-harness/src/tuning-server.ts:247 returns drops and dropSummary in its payload as of S-E-85, but docs/debug/index.html's paneMetaHtml (line 3092) renders only obs / learn / ev-fail — dropSummary appears nowhere in that file. This is the silent half and it is why the item is filed rather than dropped: before…
    2026-08-24filed by the S-E-85 step-4 reconcile (DEF-050)
    src/lib/extraction-client.ts carries safeIssuePath (:1425), collectIssueFields (:1440) and rejectContextType/REJECT_CONTEXT_TYPES (:803-806); extraction-harness/src/parse-tolerant.ts now carries a port of the same three. The drift is not hypothetical — it happened on the first draft: the harness copy initially dropped…
    2026-08-24filed by the S-E-73 step-4 reconcile, from review finding S-E-73-R1 (the code half is FIXED; the prompt half is not)
    extraction-harness/prompts/dedup-v0.1.md opens with an inventory of the record types it may see and lists five — catch/encounter/technique/feature/access_point — and its "keep these distinct" guidance covers fish, techniques, features and tips, never bugs. S-E-73 added a sixth type whose contract mandates something no…
    2026-08-24filed by the S-E-73 step-4 reconcile
    S-E-73 bumped the extraction prompt v0.18 → v0.19, added a sixth observation type with its own boundary rules, and ran no live model call — none are approved (DEF-578), and the story said so. So the adherence cost of the new type is entirely unmeasured: every rule added to a prompt lowers adherence to all the others (…
    2026-08-23Eval-net coverage
    Measured 2026-08-23 across extraction-harness/corpus/*/meta.json against shipped EXTRACTION_PROMPT_VERSION = v0.18 (src/lib/extraction-prompt.generated.ts, on the S-E-71 branch; main is still v0.17): applicability-cedar-def379 (v0.15) and cleelum-technique-spots (v0.16) are offline_eval: false — skipped. The only two…
    2026-08-01from the S-E-68 gate review (PM)
    extraction-client.ts:327-331 documents, inside DEF-211's own comment, that cache_control is a deliberate silent no-op for the dedup calls because their small system prompts (~1K and ~0.4K tokens) sit "below the cacheable minimum" — and names that minimum as 2048. This is explicitly NOT a defect: the behaviour is docum…
    2026-07-31from the principal-engineer P-40 second-read that restructured S-E-67
    extraction-schema.ts:49 is FieldMeta = z.record(z.string(), FieldMetaEntry) — dynamic keys, which the structured-output subset's additionalProperties: false rule cannot express. It is load-bearing, not vestigial: extraction-prompt.ts (P-EX5) instructs the model to set field_meta.<field>.pending, and the value flows to…
    2026-07-12Extraction taxonomy
    The observation taxonomy (src/lib/observation-types.ts) has catch / encounter / technique / feature (plus the manual-only landmark kinds) but no hatch type — the extraction model doesn't recognize "a hatch was coming off / bugs on the water" as its own observation. Adding it takes the usual new-extractable-type set of…
    2026-07-11Principal-Engineer audit (harness)
    bug-intake/inbox-drain/tune-drain (inbox-drain since deleted at S-C-45, 2026-08-29) are production drainers (service-role key, cloud Actions) housed in extraction-harness/ because it's the de-facto Node+secrets home — different blast radius from eval code; wants a separate tools/ home eventually. Status: Unscoped.
    2026-07-11Principal-Engineer audit (harness)
    cluster.ts, reconcile-bundle.ts, place-from-audio.ts, bug-intake.ts IO glue; also verify dedup.test.ts actually exercises dedup-core (possible orphaned split). Status: Unscoped.
    2026-07-07Extraction
    (Split off from the encounter-pin-bar Scoped entry above per the dual-nature flag; not the same mechanism, and not shaped.) If Nate wants the system to notice a pattern across many separate bare sightings over time (rather than requiring the angler to say the generalization aloud) and infer something like "you often s…
    2026-07-06Extraction / day screen
    Pull out the notable questions raised during a session for the day screen — specifically questions about fishing technique/knowledge/locations that show curiosity or reasoning, NOT a log of every operational question asked. Three parts:
    2026-06-30Extraction prompt diet (deep phase)
    S-E-50 merged the technique section (the exemplar); the other v0.11 sections are still sorted-laundry-list, not truly abstracted. Each remaining section gets its own E story under the prompt-architect discipline (the paired [A] item), behaviorally verified (the Cle Elum probe pattern), shipped via the build-loop tail…
    2026-06-30Transcription accuracy
    WhisperX mishears fishing-domain terms (euro→hero, Cle Elum→Clay Island, sag→snag from the prior drain). Captured 2026-06-30. Originally cross-referenced to "the DEF-093 family" during the Cle Elum review drain — that was imprecise: DEF-093 is COVERAGE (dropped speech, now point-fixed + S-E-31-guarded), these are ACCU…
    2026-08-27Transcription confidence
    (Filed by PM 2026-08-27 from the salmonfly evidence on the ASR-mishearings entry above; deliberately separate from it.) The engine substituted "the popular hatch" for a clearly-audible "salmonfly" and emitted the substituted word with no uncertainty signal of any kind. Nothing downstream can distinguish a word the eng…
    2026-06-19Lens routing
    — Was promoted to Scoped as S-E-43 (2026-06-19), but S-E-43 was abandoned 2026-07-11 per Nate — drifted/never-built, so this routing-precedence concern is un-built again and re-raisable. Line retained as a pointer; the abandoned Scoped S-E-43 entry carries the full shape as history. Status: Unscoped — re-raisable.
    2026-07-11Lens routing
    A seasonal/gear/craft/hatch fact that is genuinely about a specific species lands in Skills→"Other" instead of the right lens — concrete case: cle-elum item #58 "smallmouth spawn timing" (recording 12049fd0-7518-4b16-9a71-039dd7e7693e) routed to Skills→Other though the species was correctly extracted, because deriveEn…
    2026-06-19Tuner
    (deferred-from the S-E-42 discussion). Show the clusters as their own review surface (which learning_items grouped together and why), since clustering is the non-deterministic stage and the current top failure mode (cf. DEF-110 / DEF-086 cluster-pass failures); a bad merge (one stray member) poisons placement and is i…
    2026-06-19Tuner
    (deferred-from the S-E-42 discussion). Surface items that were extracted but filtered out (closed-taxonomy filtering, dedup) so a reviewer can tell "misplaced" from "never extracted" from "dropped." (No-silent-caps.) Status: Unscoped.
    2026-06-19Tuner
    (deferred-from the S-E-42 discussion). Compare two full-pipeline runs of one recording side by side to see how stable the non-deterministic cluster pass is. Status: Unscoped.
    2026-07-07Extraction / prose style
    (Nate, 2026-07-07.) Ban a specific writing style from all extraction-generated text (observation summaries, journal entries, any model-authored prose surfaced to the user) — not just "Real Estate Listing Voice" (over-adjectived sales hype), but a distinct and broader failure mode: writing that reaches for literary/poe…
    2026-06-20Extraction spec
    From S-D-46 (DEF-114/116 fix): deriveEntryLensTags now attributes a kind=fishery learning about the CURRENT water (S-E-14 location_scope='here' / the schema default, or a null/relative location shape — "this river", "this fishery", null, a spot-name) to the resolved dayFisheryName, while a genuinely-other named water…
    2026-06-20Extraction harness
    From S-E-38: the device learning-dedup (dedupLearningItems / applyDedupLearnings) shipped + is unit-tested + verified end-to-end via a one-off script, but the named harness eval path covers observations only. A --learnings mode (mirror projectLearningsForDedup + the DEDUP_LEARNINGS_SYSTEM_PROMPT over an extract run's…
    2026-07-31Extraction prompt single-sourcing
    **Author a dedup-learnings-v0.1.md harness source so DEDUP_LEARNINGS_ joins the generated set.* (Captured at the S-E-70 reconcile, from that story's code review (AUDIT.md S-E-70-R4). Workstream E.) S-E-70 made extraction-harness/prompts/.md the single source for the vendored prompt constants and put six of eight under…
    2026-06-18Doc debt
    The extraction-harness dev CLIs (extract, cluster, dedup, tune, reconcile-bundles, eval:corpus, regen-fixture in extraction-harness/package.json) have no command reference in EXTRACTION.md or a harness README — a session doing extraction work must reverse-engineer them from package.json. Add a command reference (the d…
    2026-06-11Extraction / fishery setup
    When a recording mentions a different, named water (the "there"/elsewhere case — not the water being fished), the system should (a) recognize the named location, (b) create it as a fishery entity (even with no coordinates and never fished), and (c) attach the associated knowledge to it, regardless of where the user ph…
    2026-06-14Extraction / diarization
    V3 backlog item (Nate, 2026-06-14) — beyond current V2/MVB scope; future idea, not build-soon. Enroll the owner's voice from their accumulated past recordings into a speaker embedding (a "voiceprint"), then on every new recording reliably label which segments are the owner vs. not-the-owner. Explicitly scoped as high-…
    2026-06-11Extraction / knowledge leveling
    The V3 consumer of the per-Knowledge-item thumbs up/down signal that the Scoped D "Thumbs up/down feedback on Knowledge entries" story collects in V2. A separate post-capture pass — NOT folded into primary extraction, which stays tuned for completeness — that scores each Knowledge item: substantive discovery vs. basel…
    2026-06-14**EPIC
    Extraction Reliability: eliminate unforced errors + a success-rate SLO. Created 2026-06-14 (Nate). Status: pre-scoping — NOT scoped; nothing here builds.** Organizing index for a single future conversation that runs requirement-definition then scoping back-to-back; slicing into stories after requirements are set is Cl…
    2026-06-15**EPIC
    Apple Intelligence (on-device Foundation Models) for the extraction pipeline — V3. Created 2026-06-15 (Nate). Status: pre-scoping — NOT scoped; nothing here builds.** Thesis (Nate): "If this works it's a game-changer — better in every way (free, on-device, fully private, offline, no per-token API cost), and it makes u…
    2026-06-18**EPIC
    Knowledge categorization schema (kinds → lenses, decomposition, fishery-by-name). Created 2026-06-18 (Nate — reviewed and signed off the model in chat). Status (updated 2026-06-18): DISPOSITIONED — broken by sprint-plan into 5 stories; Nate made the two open calls and said "execute on this epic." (a) auto-create-fishe…
    2026-06-18Extraction / transcription vendor
    From the 2026-06-18 deep-research pass. Pure-additive capture, parked — NOT scoped; do not promote. Problem: production WhisperX-on-Replicate non-deterministically drops large stretches of quiet/low-SNR speech via its VAD pre-gate (DEF-093) — a lost catch is the #1 product risk. Root cause is architectural: WhisperX (…
    2026-06-07Extraction
    runJournalGeneration in src/lib/transcript-import.ts is wired only into the Plaud import path; the native recording pipeline (src/lib/recording-pipeline.ts, S-B-06) calls extractObservations only — so after a native recording, observations / map-pins land but learning_items / diary_entries stay empty. The follow-up: (…
    2026-06-04Ingestion
    The 2026-06-01 Cle Elum summary was multiple concatenated segments (repeated [00:00:00] + Start Date/Time lines); passed as model context it scrambled the timestamp conversion (diagnosed in S-A-38) and shifted obs count (22 with summary → 19 without). S-A-38 made placement immune, but extraction quality still degrades…
    2026-06-04Extraction
    After per-recording extractions settle on a day, a second pass over the combined day output to resolve cross-recording coreferences (fish named in clip 1, fly named in clip 2), aggregate learning items, and surface day-level insights. Depends on per-recording extraction (S-B-04) and native audio.
    2026-06-04Extraction
    pass 1 raw → pass 2 cleanup/cluster/dedup → pass 3 synthesis/narrative. A real pipeline change with data-model implications — scope after B settles the session + storage shape.
    2026-06-04Extraction
    Five catches of the same fish in 20 minutes shouldn't be five list items. Roll-ups by species/time/place. Belongs in the multi-level pass-2. First weak signal seen in findings/v0.3.md (F-v03-3).
    2026-06-17Extraction / transcription
    The S-D-38 "from-audio" experiment ran Nate's real ~5-hour Cle Elum trip audio through the production Whisper/Replicate model (the pinned model WhisperReplicateProvider uses), then the real v0.4 extraction + evidence-position GPS placement. Measured silence-hallucination: of 3,243 transcript segments, 959 (30%) were c…
    2026-06-17Extraction / transcription
    The app's pinned production model openai/whisper (in src/lib/transcription/WhisperReplicateProvider.ts, version 8099696689d2…) is the slow sequential model. Measured 2026-06-17 (S-D-38 from-audio work, real trips): the 5-hour Cle Elum recording took 61.6 min of compute and $0.83; a 3.2-hour file took 71.4 min. Because…
    2026-06-17Extraction / determinism
    The same transcript run repeatedly through the same extraction pipeline yields materially different observation counts run-to-run — a real extraction-quality problem (a user re-processing a trip would see a different result set) with no actionable home today. Measured: the S-D-38 from-audio Cle Elum runs produced 15 /…
    2026-06-04Extraction
    A discarded observation is a labeled negative — for prompt tuning and for per-user RAG. Connects to C2's training-data harvest. Two uses: improve the global prompt; personalize a user's future extractions.
    2026-06-04Extraction
    Today "encounter" is one observation type; make it also a filter across the whole app — lens the map, Journal, and Log by encounter. As much a product-design call as an extraction one; flag the dual nature before slicing.
    2026-06-04Extraction
    Rather than a single verbatim-quote substring match, allow evidence to span a start-to-end timestamp range when the quote itself is too short or ambiguous to anchor uniquely. Complements F-v03-1 verbatim-span discipline (v0.4 fixes the quote; this would handle cases where even a perfect verbatim quote isn't uniquely a…
    2026-06-11extraction / evidence-quality
    A second harness call path that collects records failing the evidence-substring check after primary extraction and re-runs only those through a repair prompt, merging repaired results back (v0.4 prompt untouched, additive). This was the old S-E-05, graduated into S-E-12, and returns to the pool here with corrected fra…
    2026-06-13Extraction / capture-mode prior
    Shaped into Scoped S-E-88 (2026-08-30, Nate's direction); the Scoped entry is now the shape of record, including the deferred solo row and its attribution-trap analysis.
    2026-06-07Placement / GPS-reconcile
    Pins from Nate's 2026-06-07 Frenchman62 device run clustered at the launch with duplicate pins. Root-caused 2026-06-07: rerunning the production placement path against Nate's real exported GPS track (Test Data/Frenchman 62.json, 70,418 points) + the Frenchman62 transcript with CURRENT code (the S-A-38 evidence-anchore…
    2026-05-30Extraction
    Use user edits to provisional items as learning signal for a better extraction prompt. When a user corrects an extracted observation at review time — fixing a field value, retyping an observation, deleting a hallucinated record, resolving a "worth a look" flag, or accepting an unchanged value — that edit is ground-tru…
    2026-06-11Extraction / feedback loop
    (Tagged [E] — driving purpose is capturing correction signal to iterate the extraction prompt — with a hard [D] dependency: the affordance lands on consumer screens.) Extractions need a feedback loop that feeds back to help iterate the extraction prompt. Today observations already have a feedback affordance — confirm…
    2026-06-13Extraction / personalization
    Terminology guard (read first): "learning items" already means something specific in EXTRACTION.md — the extracted knowledge claims (kind=fishery etc.). This entry is NOT about that, and NOT about training/fine-tuning a model. It is about in-context personalization (memory + retrieval). The idea (one line): make extra…
    2026-05-26Extraction
    Allow uncertainty as a terminal state for a field value. A "worth a look" flag today implies the user should resolve it to a confident value; but in reality the user may not know either, and a hedged final value is more truthful than a forced guess. Example: species recorded as "Maybe — Smallmouth." Open design questi…
    2026-05-26Diary V2
    Multi-paragraph synthesis on Diary entries. V1 caps the synthesized body at 1–3 sentences (SPEC §12.2 / §12.8) to prevent drift toward "writing a book." V2 allows essay-style entry bodies when a topic has enough source material to support it. Open questions when promoted: (a) what triggers the longer form — explicit u…
    2026-05-26Diary V2
    Cross-topic narrative arcs. V1 Diary entries are per-topic only (SPEC §12.8). V2 introduces entries that span and connect multiple sub-topics — "the story of your spey casting journey" linking anchor pressure, sweep speed, mending, and reading water into one coherent thread. Open questions: (a) is a narrative arc a ne…
    2026-05-26Diary V2
    Self-observational pattern recognition. V1 Diary produces only directly-extractable insight (SPEC §12.8). V2 lets Claude identify patterns about the angler rather than the technique — "you tend to rush anchor sets when starting fresh," "your catch rate drops 30% after the third hour." This is genuinely different AI wo…
    2026-05-26Diary V2 / §16
    Computed-pattern Diary entries. V1 Diary entries are generated from transcript extraction only (SPEC §12.8). V2 (or §16 Insights once it specifies) adds entries generated from SQL queries over the observations table: "your catch rate on the N. Fork is highest of any fishery," "rainbows hit best between 11am and 2pm."…
    2026-05-26Diary V2
    Proposed-new-tag review surface. V1 captures Claude's proposed-new-technique and proposed-new-species entries in learning_items.proposed_techniques / proposed_species (SPEC §4.1.1 / §12.4) but provides no admin UX for reviewing them. V2 builds the surface: a list of proposed new tags with item counts, source samples,…
    2026-05-31Extraction
    Findings from the first natural-speech transcript (extraction-harness/findings/v0.3.md). Priority order: F-v03-1 — verbatim-span discipline: on disfluent speech the model paraphrases/stitches quotes (prepends a word; reconstructs a claim from two spans; condenses a long passage) so they fail the stage-6 evidence subst…
    2026-05-29Extraction
    dotenv path resolution fails under Node v26. Harness dotenv.config({ path: join(HARNESS_ROOT, '.env') }) failed silently; workaround is set -a && source .env before running. Fix options: process.loadEnvFile() (Node 21+), dotenv.config({ path: resolve(process.cwd(), '.env') }), or explicit absolute path. See extraction…
    2026-05-27Extraction
    Schema change-management for the extraction prompt. Surfaced as Finding A4 of extraction-harness/findings/v0.1.md during S-20 reconcile: the output schema lives in three places (authoritative — SPEC.md §4.2 / §4.1.1 / §5.1; model-facing — prompts/v.md; code-side — extraction-harness/src/schema.ts (Zod)) with no automa…
    2026-07-13Extraction
    A lightweight post-processing correction pass sitting between the raw ASR transcript and the rest of the pipeline, using a fly-fishing domain lexicon (fly patterns, species, techniques, gear, tippet/leader notation like "5X", location names, angler slang) plus phrase-level fuzzy matching to fix systematic ASR misses o…
    2026-09-09Extraction
    A guide's written follow-up notes for the 2026-08-28 Naches day (Red's Fly Shop Indicator Course + Tributary Fishalong) are captured in Research Material/guide-follow-up-notes-naches-2026-08-28.md with the raw emails in Research Material/assets/: the guide's knowledge skeleton (water → conditions → rigging → flies → p…
    FBusiness readinessSOR · (self-describing stories)
    0 active0 in acceptance3 next up0 scoped6 unscoped
    Active
    No active story.
    In acceptance (0)
    No PRs awaiting acceptance.
    Next up (3)
    S-F-03Obtain D-U-N-S number from D&B~30 min Nate's active work (D&B online form). Free path: 7–30 business days for D&B issuance. Expedited paid path ($229…
    Is a D-U-N-S number issued for TaleWater LLC and visible to Apple's enrollment system, so S-F-04 (Apple Developer org transition) has its required prerequisite…

    question
    Is a D-U-N-S number issued for TaleWater LLC and visible to Apple's enrollment system, so S-F-04 (Apple Developer org transition) has its required prerequisite in hand?

    prereqs
    S-F-01 complete (LLC formed — D&B requires legal entity name + business address). Can run in parallel with S-F-02 (TM filing).

    sizing
    ~30 min Nate's active work (D&B online form). Free path: 7–30 business days for D&B issuance. Expedited paid path ($229…

    S-F-04Apple Developer org transition~1× S-18 Nate's active work (~2–3 hours enrollment form + responding to Apple verification calls). Apple-side review: t…
    Is the Apple Developer Program account converted from individual to TaleWater LLC organization, so TestFlight builds and App Store listings ship under the enti…

    question
    Is the Apple Developer Program account converted from individual to TaleWater LLC organization, so TestFlight builds and App Store listings ship under the entity name rather than Nate's personal name?

    prereqs
    S-F-01 (LLC + EIN — required for the organization enrollment form). S-F-03 (D-U-N-S issued + Apple-visible). Existing individual Apple Developer Program enrollment in good standing.

    sizing
    ~1× S-18 Nate's active work (~2–3 hours enrollment form + responding to Apple verification calls). Apple-side review: t…

    S-F-06App Store listing assetsS — one session; website only, no phone build.
    does talewater.app have the plumbing a real public site has — a real 404 page (today every unknown path returns the homepage with HTTP 200, the Cloudflare Page…

    question
    does talewater.app have the plumbing a real public site has — a real 404 page (today every unknown path returns the homepage with HTTP 200, the Cloudflare Pages SPA fallback left out of S-F-15/S-F-16), a robots.txt with a Sitemap: line and a sitemap.xml, a 1200×630 Open Graph card instead of the square app icon, screenshots sized for the page (the three PNG…

    prereqs
    none. Analytics token is created in the Cloudflare dashboard by Claude via Chrome. Legal pages stay script-free; S-F-21 (branded legal shells) untouched.

    sizing
    S — one session; website only, no phone build.

    Scoped — awaiting your gate (0)
    No scoped proposals.
    Unscoped ideas (6)
    show 6 ideas tagged [F]
    2026-09-13Stadia Maps account is on the FREE tier, but Stadia's terms restrict free-tier use to non-commercial/evaluation purposes and forbid "any commercial purpose without an active, paid (non-free) subscription" (checked 2026-09-13, stadiamaps.com/terms-of-service). PREREQUISITES.md §3.3 still reads "Free tier sufficient." TaleWater is shipping to the App Store
    a commercial product on a non-commercial account. Becomes a hard dependency, not just a compliance gap, if the Scoped [D] entry S-D-325 ("the shared page's map is our own map") goes route (a) — direct-to-Stadia tile serving from the public share page's own browser, which is unambiguously commercial traffic. Nate's cal…
    2026-07-18Landing-page screenshot refresh (PR #738)
    landing/public/assets/{record,map,log}-clean.png are visually inconsistent in the status bar: the Map shot is a real capture from Nate's iPhone (silent-mode bell, cellular bars, 58% battery), while Record and Log are simulator captures (wifi, full battery, different clock time). Likely shape: pick one canonical status…
    2026-06-04Business
    Subscription billing for pilot→paid; requires entity + bank account. Ties to multi-user (B) per-user billing.
    2026-06-09Operations
    Runtime observability for the shipping app plus the paging layer that rides on it. Three distinguishable capabilities: (a) health monitoring / observability — crash + error tracking (Bugsnag / Sentry-class tooling), error-rate tracking, and general runtime health signals for the production app (crashes, unhandled exce…
    2026-06-04Business
    Confirm talewater.app ownership; a business inbox (also wanted by the Plaud-by-email ingestion idea below).
    2026-06-04Business
    (likely premature at pilot scale; noted so it isn't forgotten).

    open questions

    Technical Q-S1 Sentiment inference reliability
    Can sentiment be reliably inferred from oblique transcript lines
    Technical Q-M1 Offline tile strategy
    How offline map tiles are stored for North American backcountry use.
    Technical Q-GAUGE1 Stranded record-time gauge-snapshot work on origin/fix/def-383-2026-07-17b: keep it or let it go?
    origin/fix/def-383-2026-07-17b carries 945 insertions across 17 files
    Pipeline durability &… Q-CEG1 Should the concurrency-owed backstop add an explicit boolean-coverage sub-check for compound guards?
    Should tools/ceg/concurrency_owed.py (DEF-602) add an explicit
    Product Q4 Offline tile strategy (North American backcountry signal)
    How the app behaves with no cell signal in North American backcountry —
    Product Q-DM2 Dark map cartography ramp: design gap — no dark values exist
    The map cartography ramp tokens (--water-fill, the casings,
    Product Q-EX2 The durable judgment boundary for technique pins
    Should a first-person "how I fished this spot" report count as durable
    Product Q-EX3 EXTRACTION applicability doctrine — residual CEG gaps (from DEF-379)
    DEF-379 (PR #810, fix/def-379-2026-07-20) reframed the learning-item
    Product Q-EX4 Cluster-merge sensitivity: threshold for extending vs. spawning a Diary entry
    What is the threshold for the cluster pass to extend an existing
    Product Q-MAP3 Pin-ladder reconciliation: Map Pins §02's spec ladder is still stale against the Run Card's ladder
    Q-RUN1 (resolved 2026-07-12) fixed the shipped code's map-pin
    Product Q-SRCH1 Search-hit → water-scope navigation path (consolidated map)
    S-D-117's master-scope search field is explicitly mocked in the
    Product Q-WTR1 Water-page Summary facet: catch list stays out unless usage argues otherwise
    S-D-116's Summary facet deliberately excludes a catch list for now
    Product Q-NAV3 SPEC §7.1 IA reconcile: consolidated map deletes a control, retires the Fishery screen's primary role, adds an unrowed screen
    S-D-117's consolidated map deletes the MAP/Knowledge segmented
    V2 strategy Q-PV1 Privacy & data-governance posture for launch
    What is TaleWater's privacy/data-governance posture? Covers App Store privacy
    V2 strategy Q-PV2 What is the right intake pattern for privacy / data-rights requests?
    The You tab's Privacy requests row (src/app/(tabs)/you.tsx:307-317,
    V2 strategy Q-MN1 Monetization / pricing model
    (Narrowed 2026-06-30 — see below.) What is TaleWater's pricing model — the
    V2 strategy Q-MN2 App Store subscription: how far can setup + sandbox testing go pre-public-launch?
    Can App Store auto-renewable subscriptions be configured and **sandbox-tested
    Canon 2026-06-12 desi… Q-FLOW1 Multi-source live-flow data model: which sources make MVB, and in what order?
    Fixing DEF-437 (the Cle Elum River Water screen showing "Yakima River at
    Canon 2026-06-12 desi… Q-EX6 Unstated location_scope on a point-scope technique candidate: defaults to here, or nulls per the general closing rule?
    EXTRACTION.md §5's technique_group row defines location_scope as
    Canon 2026-06-12 desi… Q-FLOW2 Irrigation-wasteway waters with no live USGS data: alternate source, or honest-blank indefinitely?
    DEF-537 investigated Frenchman Cut / Frenchman Hills Wasteway (~46.974, -119.43):
    Canon 2026-06-12 desi… Q-WTR2 Water Summary facet: dead space below the days card
    The Water entity page's Summary facet runs short below the days card,
    Canon 2026-06-12 desi… Q-MAP4 Map cut-in crop offset: fixed/centered vs. geometry-bounding-box-centered
    Both the Water and Day map cut-ins currently use a fixed/centered crop
    Canon 2026-06-12 desi… Q-WTR3 Water Summary days-list: row count and truncation
    How many rows should Water's Summary facet days-list show, and does it
    Canon 2026-06-12 desi… Q-DSG2 Kicker label treatment not unified between Water and Day
    Water's Summary facet uses an inside-card kicker label ("Days on this
    Canon 2026-06-12 desi… Q-CAP1 S-B-109's capture harness is #if DEBUG-gated, so no preview build can ever carry it: sim/dev-only by design, or an unsatisfiable intent?
    S-B-109's native capture-harness payload — the lying_start_begin /
    Canon 2026-06-12 desi… Q-OWN1 Server-pipeline ownership: extend audio-pipeline's remit, or stand up a separate owner?
    The audio-pipeline agent's remit scopes to the device half of capture;
    Canon 2026-06-12 desi… Q-LLM1 Day-summary LLM call: fold it under the extraction quality apparatus?
    src/lib/day-summary-generate.ts has its own prompt, zero eval coverage,
    Canon 2026-06-12 desi… Q-EXP1 Standing constraint-expiry check: do we want one at all?
    Do we want a standing constraint-expiry check at all — a new, small
    Canon 2026-06-12 desi… Q-CEG2 CEG and the hooks: accept the honest re-word only, or carve scripts/hook-*.sh in?
    ceg_owed.py excludes scripts/ / .claude/ as "not product
    Canon 2026-06-12 desi… Q-OPS1 Merged branches keep being force-removed under a prohibition that has no non-forcing alternative: does the rule get a proof-gated exception, or stay flat and keep being routed around silently?
    DEF-081's prohibition on casual git branch -D — restated flatly as
    Canon 2026-06-12 desi… Q-OPS2 Three unlanded no-PR branches touching the map surface: is anything in them worth salvaging before they are closed?
    Three remote branches carry unlanded content, hold **no worktree, no
    Dedup contract ambigu… Q-EX8 Observations have no never-merge-across guard (highest blast radius in the ledger)
    Learning items get a named structural invariant — *"never merges across
    Dedup contract ambigu… Q-EX9 "Safe-apply" and "non-fatal" describe incompatible failure policies in the same paragraph — and "a failure" is never enumerated
    Two clauses, one mechanism, opposite policies: *"Non-fatal: a failure
    Dedup contract ambigu… Q-EX10 "Conservative" is undefined, and the two readings point in opposite directions from P-EX1
    "Conservative" (:886, :898) is asserted for both streams and defined
    Dedup contract ambigu… Q-EX12 Dedup silently deletes records, against the doc's own no-silent-drop doctrine
    S-E-64 (:383) states "nothing is silently dropped at either layer" and
    Dedup contract ambigu… Q-EX13 S-E-48's "moments apart" may not be evaluable from what the dedup call actually sees
    The extended S-E-48 rule (:964) needs a temporal predicate and
    Dedup contract ambigu… Q-EX14 MEDIUM cluster: survivor selection, evidence quality, the two merge bars, and the projection
    Four MEDIUM findings the reader judged worth carrying, all downstream of
    Technique contract —… Q-EX16 Does technique_group populate when two or more styles are offered as alternatives?
    The blind CEG reader (S-E-60-CEG-3) recommended the operative rule be
    Catch/encounter prese… Q-EX17 Does a catch inherit depth/rig/technique_group from an earlier, un-restated rig change?
    EXTRACTION.md §5's Span-local (P-EX4) rule, shipped by S-E-71, says the three
    Sharing — residue of… Q-SH1 Where does A Day put its share? The masthead is retired there and nothing replaced it
    A Day has no designed share placement, and the handoff says explicitly: **do not
    Sharing — residue of… Q-SH2 The map selection gesture behind Leave something out
    How does "all of it" stay one tap while a deliberate exclusion stays easy — and
    Sharing — residue of… Q-SH3 Share → install → account: the first run that starts from a share is not designed
    Someone taps a shared link, has no app and no account, and decides to keep what they
    Sharing — residue of… Q-SH13 The all-off payload sentence under-promises against Nate's own Q-SH7/Q-SH11 rulings, in the dangerous direction
    When a sender unticks every category, the payload sentence reads, verbatim from the
    Sharing — residue of… Q-SH14 An empty spot set is reachable, and the SOR has no position on whether it is a legal share
    Nothing stops a sender unticking every spot in the drill-down. The selection then
    Sharing — residue of… Q-SH15 Is type a fish-governed field on every extent, or only on a run?
    keepRunMembers deletes every type === 'catch' member outright when
    Sharing — residue of… Q-SH16 Does a day extent get the spot picker?
    SPEC.md §15 assigns categories + the per-spot include-list to a
    Sharing — residue of… Q-SH18 Is locationName (a spot's evidence string) governed by the said category?
    locationName is derived from speech — it is the angler's own words
    Sharing — residue of… Q-SH19 Is a second Save of the same link a legitimate second copy?
    Nothing prevents tapping Save twice on the same shared link, or
    Sharing — residue of… Q-SH20 A future-dated share is accepted and creates a day in the future
    A share minted with date: "2099-01-01" — whether crafted by hand
    Sharing — residue of… Q-SH21 A share trimmed to nothing still saves a water with no spots and no day
    Q-SH14 asked whether an empty spot set is a legal share on the
    Sharing — residue of… Q-SH22 character is absent from the wire while setting travels
    A water's character and setting columns are two independent axes
    Sharing — residue of… Q-SH23 An adopted water carries no osmIdentity, so the mint ladder can re-mint it as a duplicate
    A water created by S-D-278's planner (via matchExistingWater /
    Entitlement fair-use… Q-ENT1 What should a fair-use cap of zero mean?
    workers/pipeline/src/cost.ts accepts a per-account cap override **only when it is
    Entitlement source co… Q-ENT2 Should a real App Store subscription automatically supersede an operator comp?
    entitlements.source is single-valued, and S-C-49 gives an operator comp
    Water Map One Tree —… Q-ID2 What happens to the GPS trail (track_points, gps_recordings / recording_gps_sessions) when an account signs out of a shared phone?
    IDENTITY.md §7 / §10 R2 left "wipe the DB on sign-out vs keep-and-scope" unposed. The second system-scoped identity read (2026-09-03, sprint BASH-12) found the tree has since answered most of it by accretion — user_id-stamped tables keep-and-scope (they are synced, so co-residen…
    Day Lessons facet mem… Q-DAY2 Should the Day's Lessons facet hide itself entirely on a note-free day?
    Should the Day screen's Lessons facet hide itself entirely from the
    Sharing frame — the v… Q-SH25 Ink vs lake for the viewfinder stroke over satellite
    S-D-299's viewfinder ships the design's chosen stroke — ink (--rt
    Sharing frame — the v… Q-SH26 Catches off by default may be friction
    S-D-299 (and its predecessor S-D-290) ships Catches off by
    Sharing frame — the v… Q-SH27 What happens when a selection-signing key LEAKS?
    SPEC §15 promises a sent share link opens forever — no revoke, no
    Day preservation — re… Q-DAY3 Should the app ever merge or delete a day on its own?
    Should the app ever automatically merge or delete a day, or should
    DEF-731 primary-check… Q-OPS4 What should the DEF-731 primary-checkout guard do when git worktree list shows exactly one checkout AND the branch is harness-assigned, non-main?
    pm's DEF-731 preflight (.claude/agents/pm.md Step 0) stops any
    CX audit 2026-09-14 —… Q-CX1 Two sections of the SPEC disagree on when the one notification dialog is spent, and the app has two askers
    iOS lets us ask for notification permission once. SPEC §3.5 (the capture section) says ask at the first Record tap, and specifies the capture-death alarms and their tiers; SPEC §13.3 says ask only after the first write-up completes. The native recorder asks at Record; a second J…
    CX audit 2026-09-14 —… Q-CX2 A customer with Live Activities off and notifications denied has no signal for the whole trip. Say so once, or not at all?
    With Live Activities disabled in iOS Settings the card never appears (the module returns false, silently); with notifications denied every alarm and the 30-minute "recording is waiting" notice return early. Nothing in the app knows this combination or says anything. Options: (a)…
    CX audit 2026-09-14 —… Q-CX3 Can a user delete a recording that is already uploading?
    A pocket-dial or wrong-tap recording cannot be deleted until it is terminal: the in-progress shelf has no delete; delete lives on the day rail only after the write-up. Options: (a) as-is; (b) put the existing hard delete (the day-rail delete, S-D-102) on the in-progress row and…
    CX audit 2026-09-14 —… Q-CX4 The 12-hour auto-stop tells the user nothing
    The recording ends at hour 12 by a bound Nate set (SPEC §3.5); the reason goes to the ledger only, and the customer on a long float finds out at dinner. Options: (a) as-is; (b) the row says why it stopped ("Reached the 12-hour limit"); (c) (b) plus a notification at the stop; (d…
    CX audit 2026-09-14 —… Q-CX5 Should the app say how long a write-up usually takes?
    The shelf row shows "Writing up your session" with an indeterminate bar and no time expectation anywhere; measured typical is about 90 seconds from Stop to transcript, but the worst case is a sum of step budgets that can run to hours, and a six-hour recording is a different orde…
    CX audit 2026-09-14 —… Q-CX6 "Did not finish": final, or parked?
    Every terminal failure reads "Needs attention · The write-up did not finish", with no cause and no action. The no-action half is Nate's ruling (no user retry, no raw-audio hatch); the no-cause half is not. Today the honest terminal PARKS some recordings for an operator re-drive…
    CX audit 2026-09-14 —… Q-CX7 The raw transcript: the SPEC says discarded, the app stores and syncs it
    SPEC §6.2 says the raw transcript is discarded after extraction; the data-model section and the schema store it on the recording and sync it to every device; no screen shows it and there is no way to correct a mishearing at the source. The privacy review just went out on the SPE…
    CX audit 2026-09-14 —… Q-CX8 The app already sends a non-completion notification the SPEC forbids; should a failed write-up get one too?
    SPEC §13.4 declares any notification other than "your session's written up" out of scope as of S-D-128. The shipped 30-minute "Your recording is waiting" notice already breaks that line and is unmentioned in §13. A recording that ends "did not finish" is discovered only by openi…
    CX audit 2026-09-14 —… Q-CX9 Sign out with a recording still sending: block, warn, or let it go?
    Sign out is one tap with no confirmation. If an upload is pending, the teardown empties the upload grants and bumps the identity epoch, so the recording cannot finish sending until the same account signs back in on this phone. The audio stays on disk on purpose (src/lib/recordin…
    CX audit 2026-09-14 —… Q-CX10 A second account on the same phone: the SPEC leaves wipe-vs-scope open on purpose. Close it.
    Rows are scoped by user id so account B never sees account A's journal, but A's audio files and capture directories stay on disk after sign-out; only account deletion clears them. The honest fork: A's undelivered recordings vs B's privacy on a shared phone. Options: (a) keep sco…
    CX audit 2026-09-14 —… Q-CX11 Should account deletion have a grace period?
    Deletion is immediate and irreversible: typed word, Apple re-authorization, server erase, local wipe, no undo window. Signing in again with the same Apple ID yields a brand-new empty account. Options: (a) immediate, as today; (b) a 7-day grace with a sign-in-to-cancel path (the…
    CX audit 2026-09-14 —… Q-CX12 "No copy stays behind" beside a consent record kept for 24 months
    The delete page's "Links you've sent stop working. No copy stays behind." is scoped to shared pages and is true of them. But SPEC §18 keeps the privacy_choices consent rows for 24 months after deletion, on purpose, with no cascading delete; and a row is written even for an accou…
    Day/water binding — r… Q-BIND1 Which wins when a short recording and a long GPS dwell disagree about where the day was fished?
    The Beaver Lake stack (shipped OTA silver-otter, 2026-09-16) resolves a segment's water from the track points inside a recording — the premise being that a recording is the angler asserting "I am fishing, here, now" — with no floor on how many points, because the reported case w…
    Trip scheduling — res… Q-TRIP1 What date does the trip end?
    Needed to fill the window-end dates on S-B-270/S-B-271's closure entries and the disk-write (S-B-273) and memory (S-B-274) reads.

    open audit findings

    2open / deferred audit findings — detail & trend on the Weekly Business Review↗

    open gaps

    G-07   Diary Fisheries axis still reads diary_entries.fisheries strings, not fisheries.id FKs   Open

    Status
    Open

    Expected next story
    Diary edit-affordances story (post-S-21).

    G-08   On-device VAD / speech-only upload not implemented (native audio)   Open

    Status
    Open

    Expected next story
    Real-time chunked audio processing ([B] Unscoped 2026-06-05).

    G-11   Dev-only nightwater/graphite dark-variant toggle not ported to RN   Open

    Status
    Open

    Expected next story
    A small D (or dev-tooling A) story once the design side hands off full nightwater/graphite RN token sets — then the toggle is a dev-tools-panel selector wiring use-theme to pick Slate/Nightwater/Grap…

    G-12   Gauge selection omits the major-tributary-confluence filter   Open

    Status
    Open — **and this entry is now the ONE home for this finding (SE7,

    Expected next story
    A D refinement that adds a stream-order/VAA-backed "no major intervening confluence" guard (escalate the existing logged name-mismatch signal), built only if a real water proves the nearest-mainstem…

    G-13   Technique vocabulary is closed on the map and open on the Day surfaces, so techniques are not comparable across days   Open

    Status
    Open

    Expected next story
    TBD — no story is proposed and none is implied. A

    recent closes

    Track A S-23 custom-basemap-and-layer-togglesPassed | Partially passed | FailedYYYY-MM-DD
    B S-D-56 Kill-relaunch recovery from on-disk segments (+ `guard !armed`)2026-06-29
    E S-E-25 Per-kind decomposition + 7-kind inclusion tests2026-06-20
    D S-D-45 In-app Field Notes write-up (the comprehensive recap)2026-06-19
    E S-E-37 Applicability classification correctness (a `there`-claim is never `this_fishery`; DEF-107)2026-06-19

    live worktrees

    No active story worktrees (only main checkout).