v3.11 — Goal Flow & App Polish Batch
Seven independent feature PRs (#1077–#1083) reviewed, merged, and shipped as a coordinated batch: Coach-drafted goal creation, app-wide haptics, goal roadmap polish, Pipes board upgrades, and a marketing hero refresh.
Summary
This batch was not a formal GSD milestone — no ROADMAP or REQUIREMENTS file governs it. The seven PRs were developed independently and merged sequentially (reviewed by Roy, shipped by Vicki) on a single merge train coordinated through OBJ-903. The batch tag v3.11.12 covers the full set; v3.11.10 and v3.11.11 were cut mid-train for two PRs before the batch-release plan was confirmed.
The flagship delivery is Coach-drafted goal creation (PR #1082): a cross-stack feature that added the generateGoalDraft GraphQL mutation on Rails and a useGoalDraft composable on the frontend, letting Coach draft a full goal plan — name, description, category, milestones, and target date — from a freeform idea sentence. This is the most substantive new surface for Coach in the app since v1.14.
The rest of the batch rounds out the goal-flow experience (inline roadmap creation on goal detail, Log Progress form polish matching the design prototype), sharpens two daily touchpoints (Pipes board, Critical Path tile), and adds an app-wide haptics layer that users can toggle in Settings.
Scope — What Shipped
generateGoalDraftGraphQL mutation —Mutations::Ai::GenerateGoalDrafton Rails;GoalDraftTypefor the response shape;useGoalDraft.tscomposable on the frontend- New Goal hero card — frontend entry point for Coach-drafted goals: describe an idea, Coach returns a prefilled
GoalForm - Desktop route animation fix —
App.vue:routeAnimated = !(isPlatform('desktop') || isPlatform('electron'))onion-router-outletto stop full-page crossfade overlap affecting all desktop route transitions - schema.graphql + Rubocop regen — regenerated after the new mutation was added (confirmed clean by CI Schema Drift + RSpec gates)
- Inline Coach + Stones roadmap creation — goal detail view: roadmap creation stays in-page; no modal hop (PR #1081, frontend-only)
- Log Progress form polish — form layout, spacing, and interactions matched to the design prototype (PR #1083, frontend-only)
- App-wide haptic feedback —
useHaptics.tscomposable (@capacitor/haptics); wired into badge unlocks, level-ups, milestone advances, Pipes solves, and check-ins;hapticsEnabledpreference persisted in localStorage; Settings toggle (PR #1079) - Critical Path tile auto-dismiss —
CriticalPathTilenowv-if="!isPlayed"; UTC-dated localStorage key removes the tile after solve; reappears at UTC midnight (PR #1078) - Pipes board visual polish — Aqueduct glass panels, flowing network animation, gold solve state (PR #1077)
- Marketing hero refresh — removed chip overlays, updated screenshots, dropped "Our Story" section (PR #1080)
- Docs updated —
docs/features/ai-coach.mdupdated forGenerateGoalDraftmutation,CoachService#generate_goal_draftmethod, anduseGoalDraftcomposable (in PR #1082; Last updated: 2026-06-04)
Phases
| # | PR | Title | Status | Highlights |
|---|---|---|---|---|
| 1 | #1077 | Pipes board polish | Shipped | Aqueduct glass, flowing network, gold solve effect |
| 2 | #1078 | Critical Path tile dismiss | Shipped | Tile self-removes after solve; reappears UTC midnight |
| 3 | #1079 | App-wide haptics + Settings gate | Shipped | useHaptics.ts; badge, check-in, milestone, Pipes trigger points |
| 4 | #1080 | Marketing hero refresh | Shipped | Removed overlays, updated screenshots, dropped Our Story |
| 5 | #1081 | Inline Coach + Stones roadmap | Shipped | Roadmap creation stays in-page on goal detail |
| 6 | #1083 | Log Progress form polish | Shipped | Form matches design prototype |
| 7 | #1082 | Coach-drafted goal creation | Shipped | New generateGoalDraft mutation + useGoalDraft composable; desktop animation fix |
Merge train order: 1077 → 1078 → 1080 → 1079 → 1081 → 1083 → 1082 (LAST — widest blast radius: new mutation, schema regen, app-wide desktop animation change).
Key Decisions
- Batch release with a single prod tag —
production.ymlusesconcurrency: group=production-deploy, cancel-in-progress: false, which silently drops tag pushes 3..N when several land close together. A single batch tag was agreed after v3.11.10 was already cut per-PR for #1079; v3.11.11 covered the next group (#1083, #1080, #1078) and v3.11.12 was the final batch tag for #1082. Future batches should plan this from the start. - #1082 merged last — cross-stack PR with the broadest blast radius (new GraphQL mutation, schema regen, app-wide desktop animation change) was held until all others were on master, so it was the obvious suspect if anything regressed.
- Desktop route animation disabled on
isPlatform('desktop') || isPlatform('electron')— app-wide, not scoped to New Goal flow. Fixes a full-page crossfade overlap that appeared on desktop when navigating to the new goal form. This is a global behavioral change for all desktop route transitions. - Haptics opt-out, not opt-in —
hapticsEnableddefaults true; only the literal string'false'in localStorage disables haptics. User can toggle off in Settings.
Requirements Coverage
This was a batch of seven independent PRs, not a milestone with a formal REQUIREMENTS.md. All seven PRs passed CI (Schema Drift, RSpec, Vitest, Playwright smoke) and received Roy's code review approval before merge.
| PR | Roy verdict | CI at merge |
|---|---|---|
| #1077 | APPROVE WITH NITS | CLEAN |
| #1078 | APPROVE WITH NITS | CLEAN |
| #1079 | APPROVE WITH NITS | CLEAN |
| #1080 | APPROVE WITH NITS | CLEAN |
| #1081 | APPROVE WITH NITS | CLEAN |
| #1083 | APPROVE WITH NITS | CLEAN (was UNSTABLE pre-merge; cleared before merge) |
| #1082 | APPROVE WITH NITS | CLEAN (was UNSTABLE pre-merge; cleared before merge) |
Outcomes
- Users can ask Coach to draft a full goal (name, category, milestones, target date) from a sentence describing what they want to achieve.
- Haptic feedback is now woven through the app's key celebration and action moments; users on devices that support haptics get a physical layer of feedback alongside the visual one.
- The Pipes board has a polished look consistent with the rest of the game suite.
- The Critical Path tile clears itself after the daily puzzle is done, reducing dashboard noise.
- Goal roadmaps can be created inline on the goal detail page without a modal.
- The Log Progress form matches the design prototype fidelity.
Tech Debt
- (v3.11 batch)
is_played_todayconstant guarantee formalized in docs (docs/development/) — see commitdde04e9a4. - (v3.11 batch) Marketing "Our Story" page removed;
our-story-publicroute refs cleared from docs in commits037ce565b/6de15c8c9. - (v3.11 batch) The desktop route animation change (
:animated="routeAnimated") is app-wide. If any future feature needs per-route animation control on desktop, this will need to be made more granular.
Related Artifacts
- Git tags: v3.11.10 · v3.11.11 · v3.11.12
- PRs: #1077 · #1078 · #1079 · #1080 · #1081 · #1082 · #1083
- Coordinating issue: OBJ-903 — Review & coordinate merge of PRs #1077–#1083
- Feature docs updated:
docs/features/ai-coach.md(GenerateGoalDraft mutation, generate_goal_draft method, useGoalDraft composable)
Related Commits
246123af9— feat(haptics): app-wide haptic feedback + Settings gate (#1079)4323c7bb8— feat(checkin): polish the Log Progress form to the prototype (#1083)7b6c63a1a— feat(marketing): refresh landing hero (#1080)412c22330— feat(dashboard): dismiss Critical Path tile once today's puzzle is done (#1078)011fab1cb— feat(goals): Coach-drafted goal creation (New Goal hero) (#1082)ac1565dc6— chore(release): update CHANGELOG for v3.11.12 (batch tag)
Last updated: 2026-06-05