docs: insert Phases 8–11 (feeding intake → scheduling → trends → synthesis) ahead of launch; renumber launch 8→12, post-launch 9→13#5
Merged
Conversation
…hesis) ahead of launch; renumber launch 8→12, post-launch 9→13
Docs-only restructure that earns two durable harness primitives — an
intake intent router (lib/harness/intake/, hybrid resolution: explicit
toggle authoritative, LLM for soft cases) and the lens pattern (each
husbandry dimension = {extraction schema, structured frontmatter,
deterministic rules, synthesis signals, reminder kind}). Food is lens
#1; grooming, environment, activity, body-condition-over-time inherit
the shape.
Two product walls that hold across all four phases: detect hazards
never treat (deterministic FoodHazardScreener + US-first poison-control
escalation, no LLM treatment advice ever); surface patterns never
predict (feeding synthesis describes the journal, never forecasts
diet-driven health outcomes).
Free/Pro split: intake + hazard gate FREE (safety can't sit behind a
paywall); feeding-aware weekly/monthly synthesis Pro (uses the existing
Phase 7 entitlement seam wired by 7.10).
Changes:
- ROADMAP.md: Phases 8–11 inserted with full task lists (8.0 router /
8.1 food-mode extractor / 8.2 structured food frontmatter / 8.3
FoodHazardScreener + assets/hazards/food_toxins.yaml / 8.4 capture-
flow branching / 8.5 wrap; 9.0–9.4 feeding scheduling; 10.0–10.2
feeding trends; 11.0–11.4 feeding synthesis). Current Phase 8 → 12
with all task IDs renumbered; post-launch Phase 9 → 13. Forward
references in Phase 7 wrap-up + H.2 historical narrative + line-387
scope wall updated to match.
- CLAUDE.md: new §3.5 'Intake dimensions: router + lens pattern';
new §10 sub-section 'Food hazard gate (Phase 8.3)' covering the
screener posture, US-first escalation, fixture floor (≥10 phrasings
per toxin category); §15 sentence reflects twelve build phases.
- DECISIONS.md: 7 new rows (append-only invariant preserved):
- 97 architecture — Phase 8 restructure rationale + renumber
discipline
- 98 architecture — Intake intent router primitive + lens pattern
- 99 storage — Food entry structured frontmatter (backward-compat
with freeform food entries; fed_at distinct from index ts;
MealPhase enum)
- 100 agent — FoodHazardScreener as deterministic sibling to
RedFlagScreener; known toxins only; over-warn posture
- 101 privacy — US-first hazard escalation; ASPCA APCC confirmed,
Pet Poison Helpline verify-at-implementation; numbers in
assets/hazards/escalation.yaml never in any prompt
- 102 monetization — feeding free/Pro split; intake + hazard gate
FREE, synthesis Pro
- 103 agent — synthesis boundary 'describe never predict' reinforces
row 25 verbatim into the feeding domain
- PRODUCT.md: feeding-dimension positioning paragraph after 'What it
is' — names both product walls.
- VOICE.md §6: examples 21 (clean meal capture) + 22 (hazard escalation
with locale-conditional poison-control contacts) added in §6
cadence.
- V1X_BACKLOG.md: Phase 9 → Phase 13 / Phase 10 → Phase 14 inside the
on-device-inference entry; row 85 posture unchanged.
- DESIGN.md: new 'Lens reuse — no new tokens per husbandry dimension'
sub-section under §6 Composition rules. Feeding flow reuses the
Phase 5 capture form, EditorialCard, RedFlagBadge (coral medical-
attention register), PhosphorIconsRegular.warningOctagon. Future
lenses inherit the no-new-tokens constraint.
Renumber scope discipline: forward-looking docs updated;
DECISIONS.md is append-only (row 97 anchors the renumber; historical
rows 1–96 use pre-restructure numbering, rows 98+ post-restructure);
code comments that name phase numbers stay as historical attribution.
Verification: flutter analyze --fatal-infos exit 0 (no issues),
flutter test exit 0 (1756/1756 unchanged from PR #4 baseline). No
code changed; the 4 new phases ship implementation as separate PRs
(one per task per DECISIONS row 40).
https://claude.ai/code/session_019ZiQQgMegczk4jZm4Ef3pB
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Docs-only restructure that inserts four new feature phases ahead of
the current launch phase and earns two durable harness primitives.
Why
Feeding is the highest-frequency thing an owner does with a pet —
multiple times daily — which makes it the richest source of compounding
memory we can add, and it touches almost every part of the harness
(photo intake stack, deterministic guardrails layer, wiki frontmatter,
scheduling/reminders, trends repo, both synthesis runners).
Building it as four sequenced phases (intake-with-hazard-gate →
schedule → trends → synthesis) lets each phase ship one
independently-shippable PR per DECISIONS row 40 while preserving the
safety-critical invariant that intake is hazard-screened the moment
it exists — the hazard gate is in the same phase as logging, not
after.
The two durable harness primitives (CLAUDE.md §3.5)
The food feature is how we earn these. Future husbandry dimensions
(grooming, environment, activity, body-condition-over-time) drop into
the same shape without reinventing infrastructure.
lib/harness/intake/intent_router.dart.A snapped photo today always resolves to
generalMemory. Therouter takes
{photo, optional caption, optional explicit toggle}and resolves to an intent (
logMealAfter,checkMealBefore,generalMemory; lens-extensible). Hybrid resolution: explicituser toggle is authoritative when present; lightweight LLM
classification handles only the soft cases ("is this a meal at
all / what kind").
things: extraction schema · structured frontmatter · deterministic
rules · synthesis signals · reminder kind. Food is lens fix(ci): restore green analyze + test across Phase 7 work #1.
The two product walls
Both hold across all four phases. Both stay inside the existing
clinical-vision boundary (DECISIONS row 25):
FoodHazardScreeneris adeterministic sibling to
RedFlagScreener— code, not LLM. Matchesextractor
identified_itemsagainstassets/hazards/food_toxins.yaml(chocolate, xylitol incl. "birch sugar", grapes/raisins, alliums,
macadamia, the rest of the canonical list). On hit: existing coral
RedFlagBadge+ escalation to vet/poison-control. US locale appendsASPCA APCC (888) 426-4435 + Pet Poison Helpline (number
verified at implementation, never from memory). Numbers in
assets/hazards/escalation.yaml, never in any LLM prompt(DECISIONS row 101). Over-warn posture per row 29. No treatment
advice generated — mirrors ASPCA's own "general info only, call your
vet" posture exactly.
describes what's in the journal (frequency, variety, table-scrap
rate, hazard-flag count). System-prompt boundary appended after the
existing "You are not a vet" line: "Describe feeding patterns from
the journal; never forecast diet-driven health outcomes." Assertion
tests pin the sentence verbatim (DECISIONS row 103).
Free / Pro split
Safety can't sit behind a paywall (DECISIONS row 102):
(Phase 9), descriptive feeding trends on the SOUL profile
(Phase 10).
via the existing Phase 7 entitlement seam (no new gate).
Phases inserted
ReminderKind.feeding· 9.1 yaml template · 9.2 schedule path · 9.3 surfaces · 9.4 wrapTrendsRepoextension · 10.1fl_chartsurface · 10.2 wrapCurrent Phase 8 (Play Store Prep & Launch) renumbers to Phase 12.
Current Phase 9 (post-launch on-device inference) renumbers to
Phase 13 (V1X-deferred / scoping-only per row 85, posture
unchanged).
What this PR changes
7 files, 207 insertions, 36 deletions. All docs, no code.
ROADMAP.md— Phases 8–11 inserted with full task lists;Phase 8 → 12 with all task IDs renumbered (
8.X→12.X,8.4b→12.4b); post-launch Phase 9 → 13; forward referencesin line 5 / line 7 (Current phase state) / line 387 (scope wall) /
task 7.H.2 (
Phase 8+→Phase 12+) all updated.CLAUDE.md— new §3.5 "Intake dimensions: router + lenspattern"; new §10 sub-section "Food hazard gate (Phase 8.3)"
covering the screener posture + US-first escalation + fixture
floor (≥10 phrasings per toxin category mirroring the 6.7
vision-cadence floor); §15 sentence reflects twelve build
phases.
DECISIONS.md— 7 new rows (append-only invariant preserved):97 architecture (restructure rationale + renumber discipline),
98 architecture (router primitive + lens pattern),
99 storage (food entry structured frontmatter, backward-compat),
100 agent (
FoodHazardScreenerposture),101 privacy (US-first escalation + numbers-in-config rule),
102 monetization (free/Pro split),
103 agent ("describe never predict" boundary).
PRODUCT.md— feeding-dimension paragraph after "What it is"naming both product walls.
VOICE.md§6 — examples 21 (clean meal capture) + 22 (hazardescalation with locale-conditional contacts) in the existing §6
cadence.
V1X_BACKLOG.md— Phase 9 → Phase 13 / Phase 10 → Phase 14inside the on-device-inference entry; row 85 posture unchanged.
DESIGN.md— new "Lens reuse — no new tokens per husbandrydimension" sub-section under §6 Composition rules. Feeding reuses
Phase 5 capture form,
EditorialCard,RedFlagBadge,PhosphorIconsRegular.warningOctagon. Future lenses inherit theno-new-tokens constraint.
Renumber scope discipline (DECISIONS row 97)
Forward-looking docs touched (ROADMAP / CLAUDE.md §15 / PRODUCT /
V1X_BACKLOG / VOICE / DESIGN).
DECISIONS.mdis append-only(CLAUDE.md §14) — historical rows that mention "Phase 8" or "Phase 9"
stay verbatim as the numbering at write time. Row 97 anchors the
renumber: rows 1–96 use pre-restructure numbering, rows 98+ use
post-restructure. Code comments that name phase numbers stay as
historical attribution (the same posture).
Test plan
flutter analyze --fatal-infos; echo "exit=$?"→exit=0,"No issues found! (ran in 19.8s)".
flutter test --reporter expanded; echo "exit=$?"→exit=0,1756 tests passed — same baseline as PR docs: audit cleanup + addendum — CLAUDE.md trunk protocol + DECISIONS 93–96 + ROADMAP ticks + Phosphor 5.6.B close + VOICE.md/A2 reconciliations + 8.4b SDK gate #4. No code changed;
no regressions.
intake → 9 feeding scheduling → 10 feeding trends → 11 feeding
synthesis → 12 launch → 13 (post-launch) on-device confirmed.
Phase 8 — Play Storestrings anywhere in theforward-looking docs.
Phase 9 (post-launch)outside DECISIONS append-onlyhistory.
Out of scope (lands in subsequent phase-task PRs)
lib/harness/intake/(Phase 8.0's first task).assets/hazards/food_toxins.yaml+assets/hazards/escalation.yaml(Phase 8.3).
Tool catalog (§7)entries forlog_meal/food_hazard_check(deferred so each tool lands with its implementation PR per the §7
footnote rule).
lib/harness/agent_loop.dartpre-screener wiring for the foodhazard screener (Phase 8.3).
Next session
After merge, planning the first subphase of the new Phase 8 — most
likely Phase 8.0 (intake intent router) as the harness primitive
that Phases 8.1–8.4 build on. The router is purely unit-testable
(no UI dependency), small enough to ship in one PR, and its enum +
contract design is the load-bearing decision the rest of the phase
inherits.
https://claude.ai/code/session_019ZiQQgMegczk4jZm4Ef3pB
Generated by Claude Code