feat(builder): M6 — deterministic trip builder (replaces StubBuilder) #13

Merged
charles merged 1 commit from feat/m6-trip-builder into main 2026-06-17 14:15:12 +00:00
Owner

Roadmap M6: validated tree → priced Trip. The product payoff.

Changes

  • New geneatrip-builder: DeterministicBuilder implements service::TripBuilder. From a validated+geocoded tree → order places by relevance → one stop each (capped by trip length) → transport/lodging/activity Offers from the M5 sources → priced Proposals (anchored to the family event) → Trip with legs, total + per-category breakdown (FR-TRP-4/8/10/12/16/20).
  • Port change: TripBuilder::build now takes &Tree (the service loads it and passes it in); StubBuilder/FailBuilder/call-site updated.
  • api wires DeterministicBuilder(StaticSources) (placeholder prices until real vendors).

Verification

  • just qa green. Builder tests: 2-place tree → 2 stops (high relevance first), 1 transport leg, lodging+activity per stop, total 500€, breakdown checked; empty → NoPlaces.

Build is account-gated, so the browser build UI needs the login flow (next iteration); the builder itself is wired + tested. Traces: FR-TRP-* · tech-spec 03/05.

Roadmap **M6**: validated tree → priced **Trip**. The product payoff. ## Changes - New **geneatrip-builder**: `DeterministicBuilder` implements `service::TripBuilder`. From a validated+geocoded tree → order places by relevance → one stop each (capped by trip length) → transport/lodging/activity `Offer`s from the M5 sources → priced `Proposal`s (anchored to the family event) → `Trip` with legs, **total + per-category breakdown** (FR-TRP-4/8/10/12/16/20). - **Port change**: `TripBuilder::build` now takes `&Tree` (the service loads it and passes it in); StubBuilder/FailBuilder/call-site updated. - **api** wires `DeterministicBuilder(StaticSources)` (placeholder prices until real vendors). ## Verification - `just qa` green. Builder tests: 2-place tree → 2 stops (high relevance first), 1 transport leg, lodging+activity per stop, **total 500€**, breakdown checked; empty → `NoPlaces`. Build is account-gated, so the browser build UI needs the login flow (next iteration); the builder itself is wired + tested. Traces: FR-TRP-* · tech-spec 03/05.
feat(builder): M6 — deterministic trip builder (replaces StubBuilder)
All checks were successful
qa / qa-1 (pull_request) Successful in 1m55s
qa / qa-1 (push) Successful in 1m56s
qa / qa (pull_request) Successful in 0s
qa / qa (push) Successful in 0s
fd5d3c3714
- new geneatrip-builder crate: DeterministicBuilder implements
  service::TripBuilder. From a validated+geocoded tree: order family places by
  relevance → one stop each (capped by trip length) → fetch transport/lodging/
  activity Offers from the M5 sources → map to priced Proposals (anchored to the
  family event) → assemble Trip with legs, total + per-category breakdown
  (FR-TRP-4/8/10/12/16/20).
- port change: TripBuilder::build now takes &Tree (service loads + passes it);
  StubBuilder/FailBuilder/build_trip call-site updated.
- api wires DeterministicBuilder(StaticSources) as the builder (placeholder
  prices until real vendors).

Tests: 2-place tree → 2 stops (high relevance first), 1 leg, lodging+activity
per stop, total 500€, breakdown checked; empty → NoPlaces. just qa green.
Browser build UI needs the account/login flow (next); builder itself is gated +
tested.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/geneatrip!13
No description provided.