Product

generated 2026-07-31 18:11 PT · branch main · commit a8329ebf · 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 (17)
Build 34 · cut Jul 26 · runtime 8→9 fork for DEF-570's native recording-recovery Swift rework, reopening the OTA channel + DEF-577's Water/Day masthead fix (swipe-to-cycle steal on the map thumbnail, title vanishing behind content during over-pull); batches ~2 dozen merged PRs since build 33 · 17 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 34
ready to testBS-D-56Kill-relaunch recovery from on-disk segments (+ `guard !armed`)in build 34
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 34
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 34
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 34
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 34
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 34
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 34
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 34
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 testS-D-169Day Conditions gets a cleaner one-panel layoutin build 34
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 34
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 34
On your phone
ready to testS-D-128"Your session is ready" completion push notificationin build 34
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 34
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 34
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 34
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 34
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 34
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 (3)
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.
waiting for build (0)
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.
Nothing is waiting — everything merged is already in the current build or tested.
building (5)
BProduct architecture (MVB)S-B-110Fix the two live silent-data-loss defects — `DEF-603`, `DEF-604`, and `DEF-597` which `DEF-604` subsumes
Two defects on Nate's phone right now cause silent data loss with a green UI — can we close both without adding another mechanism to a state machine whose parent defect says every prior fix made it worse?
DConsumer product surfacesS-D-177Water summary description: own-recording primary, general-knowledge fallback, manual last resort
Can the Water summary screen (screen 14a) show a brief 2–3 sentence description of the water itself (not a trip/session summary) — quality bar per Nate: "Pearson Lake is a small, quiet 22-acre seepage lake in Price County, Wisconsin, featuring a maximum depth of 50 feet and popular for largemouth bass and panfish" —…
EExtractionS-E-67Make silent extraction repair LOUD
The extraction client's repair functions drop off-spec fields silently — nothing reports the loss to anyone. Can they report every drop through the error sink that already exists, without changing what they repair?
FBusiness readinessS-F-01Form WA LLC + EIN + business bank account
Is TaleWater LLC formed in Washington with EIN obtained and a business bank account opened — so subsequent F stories (trademark, Stripe, Apple Developer org transition, contracts, App Store listing under business name) can sign and bank under the entity from day one rather than against Nate personally?
FBusiness readinessS-F-05Privacy Policy + Terms of Service
Is a pre-legal-review draft of TaleWater's Privacy Policy and Terms of Service written, substantively covering every real data flow the product has today, with every genuinely-undecided real-world fact (entity name, retention window, DPA status) named as an explicit open question rather than guessed or left as a silen…
not ready (2)
AOperating model & agent orchestrationblocked
Next up is empty — no queued stories.
COperator back-officeblocked
Next up is empty — no queued stories.
recommendation
5 workstream(s) active, 2 blocked. No additional stories can start until a queue opens up.

runs — gated story bundles

e-pipeline-infraactive1/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 LOUDactive
  3. S-E-66Real concurrency pool, parallel dedup, delete the nested inner retryready
  4. S-E-68Structured-output PILOT on the dedup callblockedthe four live-API prereq checks pass (streaming `text_delta`; model support; nested discriminated-union expressibility; required-all semantics)
  5. S-E-69Structured-output extraction + fieldnotes + segment-boundary chunkingblockedawaiting S-E-68 merged; the field_meta contract change routed and landed
  6. S-E-29Re-tag / re-cluster existing stored learnings (backfill)blockedthe hatch-as-first-class-observation-type extraction story lands (STORY ID UNRESOLVED — Nate to name it; see the note below)
→ S-E-67 is already active — waiting for it to merge
defect-clear-2026-07active3/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)ready
  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 taxonomyready
→ 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
awaiting Nate's single "go" (expected once Twilio US A2P 10DLC
  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`
→ 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)
fly-shop-curation-at-scale-2026-07-20parked1/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 contentparked
  3. S-D-149Honest empty-state + manual add-a-URL for waters with no shop coveragemerged
capture-conformance-2026-07-27active2/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)active
  4. S-B-111One evaluator: route every handler through a single decision function, behaviour held equivalentblockedawaiting S-B-110 merged
  5. S-B-112Delete the mute windows (event integrity)blockedawaiting S-B-111 merged
  6. S-B-113Recompute every decision (decision integrity)blockedawaiting S-B-112 merged
→ S-B-110 is already active — waiting for it to merge
d-maps-and-pins-2026-07-28active1/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)ready
  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`)ready
  5. S-D-132Water scope becomes focus, not a filter: stop hiding off-water pinsready
  6. S-D-178Summary map thumbs: replace the live GL map with a static renderready
→ next to promote: S-D-141 Permanent fixtures layer (landmarks + gauges)
d-water-and-conditions-2026-07-28active0/6 merged
Nate's 2026-07-28 go (verbatim **"Go on sprint 2"**) + the per-fork
  1. S-D-151Favorite a gauge (manual override + honest dead-fallback)ready
  2. S-D-126Stillwater level/temp on lake conditionsready
  3. S-D-125River gauge: multi-gauge list renders (day-crossed + Water "see all gauges")ready
  4. S-D-173Server-side flow-resolution telemetryready
  5. S-D-180Define + surface a water subtype taxonomyready
  6. S-D-179Retry mechanism for a failed Stop-time flow captureblockedPR #1180 merged
→ next to promote: S-D-151 Favorite a gauge (manual override + honest dead-fallback)
d-design-system-2026-07-28active0/5 merged
Nate's 2026-07-28 go (verbatim **"Go on sprint 2"**); scope-locked for all
  1. S-D-81Consolidate the duplicated Anthropic client configready
  2. S-D-181`<EmptyState>` primitive (deferred half of `S-D-89`)ready
  3. S-D-182Waters card title: never wrap, abbreviate insteadready
  4. S-D-175Introduce a shared type-scale module in `src/constants/`ready
  5. S-D-48CI invariant: no unbounded network await in the pipelineready
→ next to promote: S-D-81 Consolidate the duplicated Anthropic client config
d-journal-and-day-2026-07-28active0/5 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)ready
  2. S-D-184Fresh-install restore: gate entry or show an honest "restoring your data" stateready
  3. S-D-185Days Techniques facet doesn't read `outcome` / `technique_group` / `rig`ready
  4. S-D-186Session Log list performance: restore virtualization + stop per-seat row churn (REDUCED 2026-07-31)ready
  5. S-D-187UI data freshness: build a real change-subscriber API, wire UI subscribers, delete the pollsready
→ next to promote: S-D-111 Observation-detail: Undo net + `MASTHEAD_CLEARANCE` validation (REDUCED 2026-07-31)
e-contract-foundation-2026-07-31active0/6 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)ready
  2. S-E-60Adopt Nate's 7-item technique taxonomy (closes DEF-363)blockedawaiting S-E-70 merged
  3. S-E-71Catch/encounter "how was it caught" metadata (depth, presentation, rig)blockedawaiting S-E-60 merged
  4. S-E-72Write the technique-pin model into `EXTRACTION.md`blockedawaiting S-E-71 merged
  5. S-E-73Hatch as a first-class extracted observation typeblockedawaiting S-E-72 merged
  6. S-E-74Extracted-vs-persisted field auditblockedawaiting S-E-73 merged
→ next to promote: S-E-70 Single-source the harness prompts to the harness `.md` files (closes DEF-490)

workstreams

AOperating model & agent orchestrationSOR · CLAUDE.md
0 active0 in acceptanceblocked next up0 scoped68 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 (68)
show 68 ideas tagged [A]
2026-07-31CI / branch protection
Branch protection on main is required_status_checks.strict: true / contexts: ["test"] / enforce_admins: true (DEF-487/DEF-501 — correct and load-bearing, not a defect). The test check runs 4.2–4.5 min. On a busy day (39 merges 2026-07-31; 219 on 07-25) every upstream merge invalidates an open PR's up-to-date state, so…
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
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 real weight, and the ones to adjudicate first because they touch class-2/class-3 docs: fix/def-383-2026-07-17b (17 files, +945/−134; touches AUDIT.md…
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/wbr/doc_checks.py currently reports 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 as DEF-372 one level up — there, the ch…
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/wbr/doc_checks.py re-emits the same non-defects the reviewer then subtracts by hand: (1) ECC curve strings (P-256/P-384…
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-29WBR tooling
Surfaced by the 2026-W27 WBR. tools/wbr/collect.py:parse_completed() keys only on a - Date. line to date a closed story, but ~10 recent Completed_Stories.md entries (including S-D-53, the W27 headline) encode the date inline as (merged YYYY-MM-DD) in the header with no Date. line — so they are invisible to the collect…
2026-06-29WBR tooling
**defects_ device-defect-by-severity dashboard column missing (3rd cycle).* Surfaced by the 2026-W27 WBR — flagged in W24, W25, and W26 and still unbuilt. The WBR auto-collector has no defects_ metric (device-defect counts by severity), so the device-defect stream — the load-bearing product risk — is structurally abse…
2026-06-29WBR tooling
Surfaced by the 2026-W27 WBR. Per-story Reviews already emit the raw signal (e.g. S-D-53: "4 candidates refuted", "0 dead-code LOC"), but nothing aggregates a cycle-level rate, so the WBR fields code.adversarial_kill_rate and code.dead_code_loc are structurally blank. Fix: add an aggregatable source/register (a struct…
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.) The question is Nate's: is any of this abandoned branch content worth recovering, or is it all superseded by what has since landed on main? Ops deleted none of t…
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…
BProduct architecture (MVB)SOR · SPEC.md
1 active0 in acceptanceblocked next up0 scoped38 unscoped
Active
S-B-110Recording bugs: the fix
what it is
Fixes two recording bugs: one where the app notices a recording has stopped capturing audio but then cancels its own warning seconds later, so you never hear about it — and one where a recording that hits trouble while the app is in the background takes a drastic recovery step it shouldn't, which can end the recording instead of saving it.
ACTIVE — S-B-110 (Fix the two live silent-data-loss defects — DEF-603, DEF-604, and DEF-597 which DEF-604 subsumes).
Two defects on Nate's phone right now cause silent data loss with a green UI — can we close both without adding another mechanism to a state machine whose parent defect says every prior fix made it worse?

what gets built
1. DEF-603 — the silent-loss detector can never alarm. watchdogTick:2203 closes the observer episode on advancing && deadSinceMs > 0 (frames advancing alone), while the file-stall opens on advancing && !fileGrew (:2189). The close predicate is a subset of the open predicate, so the fault satisfies its own cure — the episode opens at ~20 s, closes on the very next 2 s tick, and the 45 s alarm is cancelled ~43 s early, forever. Write the close as "close on bytes-confirmed heal…

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 (38)
show 38 ideas tagged [B]
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. Long-lead — flag and decide before any V2 data-model story. Hard requirements: location encryption before any sharing ships; auth; migration of local-only SQLite into the…
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-06-07Ingestion / Plaud parser
parseSummaryStartedAt (src/lib/plaud-parser.ts:181) builds the start instant with new Date(y, mo-1, d, h, mi, s) — the device's local timezone at import time. If a Plaud transcript is imported from a different timezone than where it was recorded, started_at_ms is offset by the TZ delta and observations silently fail t…
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-26Ingestion
Plaud-by-email transcript ingestion. Each customer's Plaud is configured to auto-email recordings to <customer-id>@talewater.app; the backend's catch-all inbound pipeline parses the message, identifies the customer from the local-part, and writes the transcript into their account — no manual upload step. Removes the l…
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-05-28GPS
Persistent active-recording indicator via iOS Live Activities (lock-screen card primary; Dynamic Island pill as free byproduct on supported devices). Originally framed as an in-app indicator (tab-bar pill / banner / status dot); reframed during the S-22 story-proposal discussion 2026-05-28 — in-app indicators don't ad…
COperator back-officeSOR · (deferred — self-describing stories)
0 active0 in acceptanceblocked next up0 scoped19 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 (19)
show 19 ideas tagged [C]
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. 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.
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…
DConsumer product surfacesSOR · SPEC.md
1 active1 in acceptanceblocked next up0 scoped115 unscoped
Active
S-D-177Water summary description: own-recording primary, general-knowledge fallback, manual last resort
what it is
Fills in a short description of each water — from your own recordings first, general knowledge as a backup, or you can type it in yourself.
ACTIVE — S-D-177 (Water summary description: own-recording primary, general-knowledge fallback, manual last resort).
Can the Water summary screen (screen 14a) show a brief 2–3 sentence description of the water itself (not a trip/session summary) — quality bar per Nate: "Pearson Lake is a small, quiet 22-acre seepage lake in Price County, Wisconsin, featuring a maximum depth of 50 feet and popular for largemouth bass and panfish" —…

what gets built
1. Priority-1 (transcript synthesis). A new on-device generation module (parallel to day-summary-generate.ts's shape) that gathers the water's own diary_entries/lesson material via selectWaterLessons()/ getLessonsForWater() plus any other transcript-derived facts already available for that water, and — only if real material exists ("nothing real ⇒ no call," matching day-summary-generate.ts's existing guard) — calls the LLM (reusing streamAnthropicText/parseExtractionJson fro…

In acceptance (1)
your verify · on device (click to expand)
branch claude/D-177-water-summary-description

nate verifies (on device)

  • A newly-created water with existing recorded content (transcripts/diary entries about it) gets a lead_writeup populated from that content, no trust-tier label shown.
  • A newly-created water with NO recorded content, for a well-known water (e.g. a famous river), gets a lead_writeup populated from general knowledge, visibly labeled "via general knowledge — may be inaccurate."
  • A newly-created water with no recorded content AND an obscure/unfamiliar name stays blank (honest-empty, "No write-up yet for this water") rather than a fabricated guess.
  • The Fisheries edit modal lets Nate type a description by hand for a blank water, and it sticks (never silently overwritten later).
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 (115)
show 115 ideas tagged [D]
2026-07-31from Nate's 2026-07-31 device walk (the DEF-624 disposition
the defect needs a design answer, so it gets a live home here rather than sitting only in the register) — Keep the water identifiable on the Day screen when off the Summary facet. Swiping day-to-day on any facet other than Summary (Conditions, Lessons, Techniques, Questions, Field Guide), there is nothing on screen na…
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
Default session naming from date + location instead of the Plaud transcript filename. §4.3 keeps title user-editable; this changes the default the user is editing from. Likely depends on having a location for the session (GPS-derived or trip-pin) at the moment the title is generated.
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…
EExtractionSOR · EXTRACTION.md
1 active0 in acceptance1 next up0 scoped51 unscoped
Active
S-E-67Make silent extraction repair LOUDconcurrent slot
what it is
When the app tidies up an imperfect extraction result, it quietly throws away anything it doesn't recognise — this makes it say out loud exactly what it dropped, so the loss stops being invisible.
ACTIVE — S-E-67 (Make silent extraction repair LOUD).
The extraction client's repair functions drop off-spec fields silently — nothing reports the loss to anyone. Can they report every drop through the error sink that already exists, without changing what they repair?

what gets built
Route repairSession's and repairObservation's drops through deps.reportError instead of a __DEV__-only console.warn, naming the dropped fields. 1. repairObservation (src/lib/extraction-client.ts:899) — when it strips stray keys, report through the existing sink, naming the dropped field keys. 2. repairSession (:932) — same: when the known-fields-only rebuild discards anything, report it, naming the dropped field keys. 3. Thread the sink to where it is needed. Both functions…

In acceptance (0)
No PRs awaiting acceptance.
Next up (1)
S-E-66 Real concurrency pool, parallel dedup, delete the nested inner retry
(S-E-67 promoted to Active_Story_E2.md — the E2 concurrent slot — on 2026-07-31 as member 2 of the e-pipeline-infra run, the run's single "go" being the scope lock, no fresh per-story gate. Promoted in the same session as S-E-65 (member 1, primary E slot, merged as PR #1280) and sequenced after it so the two Next-up removals stack cleanly. The two are file-disjoint — src/lib/extraction-client.ts…
Scoped — awaiting your gate (0)
No scoped proposals.
Unscoped ideas (51)
show 51 ideas tagged [E]
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 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-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-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
Capture mode (snippet / solo / trip) is an intent prior the app already holds as structured metadata and extraction currently throws away. Stop making the LLM re-derive "is this even about fishing" from a cold start when the capture UI already knows the mode. Feed capture-mode into the extraction prompt; map each mode…
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…
FBusiness readinessSOR · (self-describing stories)
2 active0 in acceptance4 next up0 scoped5 unscoped
Active
S-F-01Form WA LLC + EIN + business bank account
ACTIVE — S-F-01 (Form WA LLC + EIN + business bank account).
Is TaleWater LLC formed in Washington with EIN obtained and a business bank account opened — so subsequent F stories (trademark, Stripe, Apple Developer org transition, contracts, App Store listing under business name) can sign and bank under the entity from day one rather than against Nate personally?

what gets built
1. WA SoS name availability check. Before any filing, query the WA Corporations & Charities Filing System ([ccfs.sos.wa.gov](https://ccfs.sos.wa.gov)) for "TaleWater" availability. If TaleWater LLC is unavailable, surface to Nate and stop until name decision (e.g., TaleWater Software LLC, TaleWater Labs LLC). 2. Registered agent decision. Two real options: (a) Nate himself with his physical WA address (public on filing forever), (b) a paid commercial registered agent service…

S-F-05Privacy Policy + Terms of Serviceconcurrent slot
ACTIVE — S-F-05 (Privacy Policy + Terms of Service).
Is a pre-legal-review draft of TaleWater's Privacy Policy and Terms of Service written, substantively covering every real data flow the product has today, with every genuinely-undecided real-world fact (entity name, retention window, DPA status) named as an explicit open question rather than guessed or left as a silen…

what gets built
The actual policy/ToS prose is step-3 work, done by whoever picks up this story next in its own isolated worktree branched from this promotion. This step-1 promotion names the concrete facts step 3 must ground the draft in — gathered this session from a full research pass across SPEC.md, EXTRACTION.md, app.json, package.json, and the codebase: 1. Location data. Always-permission background GPS, 10-second sampling interval. Raw trail data stays device-local; only placed-obser…

In acceptance (0)
No PRs awaiting acceptance.
Next up (4)
S-F-02File TaleWater trademark~1× S-18 of Nate's active work (~2–3 hours form prep + filing). Out-of-pocket ~$350–$450 USPTO fee per class.
Is the "TaleWater" word-mark trademark application filed with USPTO under TaleWater LLC's name?

question
Is the "TaleWater" word-mark trademark application filed with USPTO under TaleWater LLC's name?

prereqs
S-F-01 complete (LLC formed, EIN issued — so applicant is the LLC, not Nate personally, avoiding later assignment + recording fee). Trademark class(es) decided (likely IC 009 — mobile apps; possibly IC 042 — SaaS). Filing basis decided (use-in-commerce if launched, intent-to-use…

sizing
~1× S-18 of Nate's active work (~2–3 hours form prep + filing). Out-of-pocket ~$350–$450 USPTO fee per class.

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 assets~1–2× S-18 (~4–6 hours assets gathering + Connect form-filling). May spawn a downstream design story if screenshots nee…
Are all App Store submission assets prepared and uploaded under the TaleWater LLC developer name, so a first TestFlight build can be submitted to the App Store?

question
Are all App Store submission assets prepared and uploaded under the TaleWater LLC developer name, so a first TestFlight build can be submitted to the App Store?

prereqs
S-F-04 (Apple Dev org transition — developer name "TaleWater LLC" must appear in the listing). S-F-05 (Privacy Policy URL is a required App Store field). The TestFlight build itself is out-of-scope here — that's a separate B/D story that ships the binary.

sizing
~1–2× S-18 (~4–6 hours assets gathering + Connect form-filling). May spawn a downstream design story if screenshots nee…

Scoped — awaiting your gate (0)
No scoped proposals.
Unscoped ideas (5)
show 5 ideas tagged [F]
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-EX1 Extraction contract contradictions (EXTRACTION.md / SPEC.md / impl)
The S-A-60 CEG blind second-reader, run against the shipping
Product Q4 Offline tile strategy (North American backcountry signal)
How the app behaves with no cell signal in North American backcountry —
Product Q-NAV1 SPEC §7.1 IA reconcile: 5-slot nav vs. old 3-tab model
The bottom nav shipped as 5 slots (Map · Fisheries · ●Record ·
Product Q-YOU1 You tab product destination undefined
The You tab ships as an inert placeholder
Product Q-FSH1 Fisheries data model: water geometry + per-session conditions placement
Two open sub-questions the design cannot settle (a basic Fisheries
Product Q-OBS1 Observation Detail "worth a look" (.wol) block: strip or keep?
Review Mode cut the banner field-counts / chip-summary as an
Product Q-OBS2 Observation Detail vs. the new screen-08 inline detail sheet
The 2026-07-04 screen-08 SOR ships its own tap-a-row pull-up detail
Product Q-JD1 Multi-water day in the Journal Day-summary (unmodeled)
The Journal Day-summary recap assumes one water per day — a
Product Q-DM1 Dark mode: follow iOS system appearance vs manual-only setting?
Does the app follow the iOS system light/dark appearance, or is dark
Product Q-NAV2 Slot-2 tab label: "Waters" vs "Water"
The 2026-07-01 nav.js renames Fisheries → "Waters"; the app
Product Q-DM2 Dark map cartography ramp: design gap — no dark values exist
The map cartography ramp tokens (--water-fill, the casings,
Product Q-LBL1 Card/pin-detail titles need a 1–2-word content LABEL the data model doesn't carry
The 07-01 canon's title-is-a-label rule puts a 1–2-word content label
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-RUN1 Run card's glyph-rank ladder disagrees with the map pin's rank ladder
The 2026-07-12 "Run Card + Rollup" handoff (Design/screens/run-card.html)
Product Q-RUN2 Hatch-only pin sizing + can a Named Location ever group into a run
Two sub-questions the new card ladder raises but doesn't answer: (a)
Product Q-RUN3 Technique: rollup pill or fold into the collapsible groups?
The new rollup sheet design shows Technique as a standalone header
Product Q-RUN4 Map-pin-disaggregation mechanism (expand-a-type-in-rollup → split its map pin)
Nate's new request (not in the design handoff bundle): when a type
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-L1 Ambient-audio recording vs. all-party-consent law
Does TaleWater's ambient-audio session recording comply with all-party-consent
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-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

open audit findings

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

open gaps

G-02   Scaffold coordinates on observations (no real §5.2 / §6.6 pipeline)   Partial

Status
Partially closed by S-14 on 2026-05-25 (reconciliation half); trip-pin half open.

Expected next story
§6.6 (trip-pin fallback) closes the remaining half.

G-05   Delete and pin-drag affordances missing on the detail screen   Partial

Status
Partially closed by S-15 on 2026-05-25 (pin-adjust half); delete half open.

Expected next story
TBD — pin-drag pairs with the embedded-map

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-09   Map durable-place pin does not route to fishery detail (entry point (c))   Open

Status
Open

Expected next story
The §6.1 map observation/learning-item union story (renders fishery pins); the (c) routing branch is trivial once it lands.

G-10   Fishery entity deletion has no UI host (lost with the session-edit modal)   Open

Status
Open

Expected next story
A fishery-detail edit/delete or "Manage fisheries" story — restore a delete affordance honoring the §4.1.2 session-count-aware cascade. Also captured as a BACKLOG follow-up (2026-06-07).

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

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…

recent closes

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
E S-E-36 Self-contained learnings + session-context injection (the #1 review theme)2026-06-19

live worktrees

No active story worktrees (only main checkout).