diff --git a/plugin/skills/diagram-recipes/SKILL.md b/plugin/skills/diagram-recipes/SKILL.md index 225454fb..95f693b4 100644 --- a/plugin/skills/diagram-recipes/SKILL.md +++ b/plugin/skills/diagram-recipes/SKILL.md @@ -162,6 +162,8 @@ type + the knobs that make it read, and adapt the named recipe (in `examples/`). | Geo / locations + routes | `component` `Map` (Leaflet+OSM) — markers + route polylines; table as legend | `map-routes` | | Video / tutorial reference | `component` `Video` — thumbnail card + play button (YouTube poster auto-derived); link-out or `embed:true` to play inline | (see `diy-project-plan`) | | Project / build / DIY plan | `component` **top-down report** — badges + materials `Table` + interactive `Checklist` steps + `Video` tutorials + `Map` (where to buy) + `VegaLite` budget | `diy-project-plan` | +| Trip / travel itinerary | `component` **top-down** — badges (days/season/budget) + ordered per-day sections + `Map` of stops (color-coded pins) beside a legend `Table` + `VegaLite` budget + packing `Checklist`. Keep each day TIGHT (comprehension drops when dense) | `travel-planning` | +| Event / conference plan | `component` **top-down** — badges (date/headcount/budget) + phase `Timeline` + task `Checklist` (owners) + `VegaLite` budget + RACI `Table` + venue `Map` | `event-planning` | | Agent run / long transcript | `component` `Timeline` window + **progressive windowing** | `agent-trace` | | Data flow across tiers | `flow` **zones** (Sources→Marts→Consumers) | `data-lineage` | | Event/queue topology | `flow` producers→broker→consumers, animate, `TB` | `event-driven` | diff --git a/plugin/skills/diagram-recipes/component.md b/plugin/skills/diagram-recipes/component.md index e8093668..f832add4 100644 --- a/plugin/skills/diagram-recipes/component.md +++ b/plugin/skills/diagram-recipes/component.md @@ -170,6 +170,25 @@ pins 1..N in marker order (great for an ordered route). ] } ``` +### planning/travel-planning — `component` (trip itinerary, top-down) +**When to use:** a trip/vacation **itinerary** the reader plans and follows. A cohesive **top-down** +document (NOT a flat grid of peers): a `Title` + badge row (duration · season · region · budget); +an **ordered per-day spine** of `Card`s (Day 1…N, each with a theme + 2–4 concise activities — the +dominant vertical element); then a `Grid` pairing a `Map` of the stops (one **color-coded pin per +day**, routes connecting them) **beside a legend `Table`** that keys each pin colour → day → stop; a +`VegaLite` **budget** bar chart (or a transport/lodging logistics `Table`); and an interactive +packing/booking `Checklist`. **Keep each day TIGHT** — GEPA optimization showed comprehension +collapses when day sections get dense and the board clips, so prefer short activity lines and ≤8 +map pins over exhaustive detail. → `examples/travel-planning.component.json`. + +### planning/event-planning — `component` (event/conference plan, top-down) +**When to use:** planning an **event** (conference, wedding, launch, festival, party). Top-down: +a `Title` + badges (date · headcount · budget); a phase **`Timeline`** (Concept → Venue → Promotion +→ Run-of-show → Wrap-up) as the spine; a `Grid` with a `VegaLite` **budget** chart beside an +interactive task `Checklist` whose labels carry the **owner** (e.g. "Sign venue contract — Ops"); +a **RACI/responsibilities `Table`** (one **A** per row); and a venue **`Map`**. Same density rule — +keep phases and tasks concise. → `examples/event-planning.component.json`. + ### media/video — `component` (`Video` — YouTube-style thumbnail card) **When to use:** referencing a video (a tutorial, a demo, a recording) — show a real **thumbnail card with a play button**, not a bare link. Give it a `url`; for YouTube the poster + watch link + diff --git a/plugin/skills/diagram-recipes/examples/event-planning.component.json b/plugin/skills/diagram-recipes/examples/event-planning.component.json new file mode 100644 index 00000000..1ee3ea8c --- /dev/null +++ b/plugin/skills/diagram-recipes/examples/event-planning.component.json @@ -0,0 +1,397 @@ +{ + "type": "Stack", + "props": { + "gap": "md", + "p": "md" + }, + "children": [ + { + "type": "Stack", + "props": { + "gap": 4 + }, + "children": [ + { + "type": "Title", + "props": { + "order": 3 + }, + "children": "DevConf 2026 — Conference Planning Board" + }, + { + "type": "Group", + "props": { + "gap": 6, + "mt": 2 + }, + "children": [ + { + "type": "Badge", + "props": { + "color": "blue", + "variant": "light" + }, + "children": "Oct 15, 2026" + }, + { + "type": "Badge", + "props": { + "color": "teal", + "variant": "light" + }, + "children": "500 attendees" + }, + { + "type": "Badge", + "props": { + "color": "grape", + "variant": "light" + }, + "children": "¥6.2M budget" + } + ] + } + ] + }, + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm", + "mt": 4 + }, + "children": "Phases" + }, + { + "type": "Timeline", + "props": { + "active": 3, + "bulletSize": 18, + "lineWidth": 2 + }, + "children": [ + { + "type": "Timeline.Item", + "props": { + "title": "Concept" + }, + "children": [ + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed" + }, + "children": "Theme, goals, budget sign-off · date locked Oct 15" + } + ] + }, + { + "type": "Timeline.Item", + "props": { + "title": "Venue & logistics" + }, + "children": [ + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed" + }, + "children": "Hall contract · catering · A/V · security" + } + ] + }, + { + "type": "Timeline.Item", + "props": { + "title": "Promotion" + }, + "children": [ + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed" + }, + "children": "Site + CFP · ticket tiers · email + social" + } + ] + }, + { + "type": "Timeline.Item", + "props": { + "title": "Run-of-show" + }, + "children": [ + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed" + }, + "children": "Schedule · speaker prep · staffing rota" + } + ] + }, + { + "type": "Timeline.Item", + "props": { + "title": "Wrap-up" + }, + "children": [ + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed" + }, + "children": "Surveys · invoices · recordings · retro" + } + ] + } + ] + }, + { + "type": "Grid", + "props": { + "gutter": "md", + "mt": 4 + }, + "children": [ + { + "type": "Grid.Col", + "props": { + "span": { + "base": 12, + "md": 6 + } + }, + "children": [ + { + "type": "Card", + "props": { + "withBorder": true, + "padding": "sm", + "radius": "md" + }, + "children": [ + { + "type": "VegaLite", + "props": { + "spec": { + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "title": "Budget by category (¥M)", + "data": { + "values": [ + { + "category": "Venue", + "yen": 2.4 + }, + { + "category": "Catering", + "yen": 1.5 + }, + { + "category": "A/V", + "yen": 0.9 + }, + { + "category": "Marketing", + "yen": 0.8 + }, + { + "category": "Speakers", + "yen": 0.6 + } + ] + }, + "mark": { + "type": "bar", + "tooltip": true + }, + "encoding": { + "x": { + "field": "category", + "type": "nominal", + "sort": "-y", + "axis": { + "labelAngle": -30 + } + }, + "y": { + "field": "yen", + "type": "quantitative", + "title": "¥M" + } + }, + "width": "container", + "height": 170 + } + } + } + ] + } + ] + }, + { + "type": "Grid.Col", + "props": { + "span": { + "base": 12, + "md": 6 + } + }, + "children": [ + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm", + "mb": 4 + }, + "children": "Tasks (owner)" + }, + { + "type": "Checklist", + "props": { + "id": "event-tasks", + "editable": true, + "items": [ + { + "id": "venue", + "label": "Sign venue contract — Ops", + "checked": true + }, + { + "id": "cfp", + "label": "Open CFP — Marketing", + "checked": true + }, + { + "id": "sponsors", + "label": "Close 5 sponsors — Sales", + "checked": false + }, + { + "id": "catering", + "label": "Confirm catering headcount — Ops", + "checked": false + }, + { + "id": "sched", + "label": "Publish run-of-show — PM", + "checked": false + }, + { + "id": "av", + "label": "A/V rehearsal — Ops", + "checked": false + } + ] + } + } + ] + } + ] + }, + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm", + "mt": 4 + }, + "children": "Responsibilities (RACI)" + }, + { + "type": "Table", + "props": { + "withTableBorder": true, + "withColumnBorders": true, + "data": { + "head": [ + "Deliverable", + "R", + "A", + "C", + "I" + ], + "body": [ + [ + "Venue contract", + "Ops", + "PM", + "Finance", + "All" + ], + [ + "Catering", + "Ops", + "PM", + "Finance", + "Speakers" + ], + [ + "Website + CFP", + "Marketing", + "PM", + "Eng", + "All" + ], + [ + "Sponsorships", + "Sales", + "PM", + "Finance", + "Marketing" + ], + [ + "Day-of staffing", + "Ops", + "PM", + "—", + "All" + ] + ] + } + } + }, + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm", + "mt": 4 + }, + "children": "Venue" + }, + { + "type": "Map", + "props": { + "h": 260, + "tileLayer": "osm", + "markers": [ + { + "lat": 35.6309, + "lng": 139.7945, + "label": "Tokyo Int'l Forum (main)", + "color": "#3b82f6" + }, + { + "lat": 35.6284, + "lng": 139.7387, + "label": "Speaker hotel", + "color": "#a855f7" + }, + { + "lat": 35.633, + "lng": 139.796, + "label": "After-party", + "color": "#f97316" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/plugin/skills/diagram-recipes/examples/travel-planning.component.json b/plugin/skills/diagram-recipes/examples/travel-planning.component.json new file mode 100644 index 00000000..5b64254d --- /dev/null +++ b/plugin/skills/diagram-recipes/examples/travel-planning.component.json @@ -0,0 +1,601 @@ +{ + "type": "Stack", + "props": { + "gap": "md", + "p": "md" + }, + "children": [ + { + "type": "Stack", + "props": { + "gap": 4 + }, + "children": [ + { + "type": "Title", + "props": { + "order": 3 + }, + "children": "Kagoshima → Miyazaki — 5-Day Summer Itinerary" + }, + { + "type": "Group", + "props": { + "gap": 6, + "mt": 2 + }, + "children": [ + { + "type": "Badge", + "props": { + "color": "teal", + "variant": "light" + }, + "children": "5 days" + }, + { + "type": "Badge", + "props": { + "color": "orange", + "variant": "light" + }, + "children": "August" + }, + { + "type": "Badge", + "props": { + "color": "blue", + "variant": "light" + }, + "children": "Kyushu" + }, + { + "type": "Badge", + "props": { + "color": "grape", + "variant": "light" + }, + "children": "¥185,000 / person" + } + ] + } + ] + }, + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm", + "mt": 4 + }, + "children": "Itinerary" + }, + { + "type": "Stack", + "props": { + "gap": "xs" + }, + "children": [ + { + "type": "Card", + "props": { + "withBorder": true, + "padding": "sm", + "radius": "md", + "style": { + "borderLeft": "4px solid #2dd4bf" + } + }, + "children": [ + { + "type": "Group", + "props": { + "justify": "space-between", + "align": "center" + }, + "children": [ + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm" + }, + "children": "Day 1 · Cape Toi" + }, + { + "type": "Badge", + "props": { + "color": "gray", + "size": "xs", + "variant": "light" + }, + "children": "Day 1" + } + ] + }, + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed", + "mt": 4 + }, + "children": "Wild Misaki horses on the cliffs · lighthouse · sleep Nichinan" + } + ] + }, + { + "type": "Card", + "props": { + "withBorder": true, + "padding": "sm", + "radius": "md", + "style": { + "borderLeft": "4px solid #3b82f6" + } + }, + "children": [ + { + "type": "Group", + "props": { + "justify": "space-between", + "align": "center" + }, + "children": [ + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm" + }, + "children": "Day 2 · Obi & Nichinan" + }, + { + "type": "Badge", + "props": { + "color": "gray", + "size": "xs", + "variant": "light" + }, + "children": "Day 2" + } + ] + }, + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed", + "mt": 4 + }, + "children": "Samurai castle town · Udo-jingū sea-cave shrine · Sunmesse moai" + } + ] + }, + { + "type": "Card", + "props": { + "withBorder": true, + "padding": "sm", + "radius": "md", + "style": { + "borderLeft": "4px solid #06b6d4" + } + }, + "children": [ + { + "type": "Group", + "props": { + "justify": "space-between", + "align": "center" + }, + "children": [ + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm" + }, + "children": "Day 3 · Aoshima" + }, + { + "type": "Badge", + "props": { + "color": "gray", + "size": "xs", + "variant": "light" + }, + "children": "Day 3" + } + ] + }, + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed", + "mt": 4 + }, + "children": "Devil's Washboard rock shelves (low tide) · island shrine · beach" + } + ] + }, + { + "type": "Card", + "props": { + "withBorder": true, + "padding": "sm", + "radius": "md", + "style": { + "borderLeft": "4px solid #6366f1" + } + }, + "children": [ + { + "type": "Group", + "props": { + "justify": "space-between", + "align": "center" + }, + "children": [ + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm" + }, + "children": "Day 4 · Hyūga · Mimitsu" + }, + { + "type": "Badge", + "props": { + "color": "gray", + "size": "xs", + "variant": "light" + }, + "children": "Day 4" + } + ] + }, + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed", + "mt": 4 + }, + "children": "Preserved Edo port town · Hososhima fishing port" + } + ] + }, + { + "type": "Card", + "props": { + "withBorder": true, + "padding": "sm", + "radius": "md", + "style": { + "borderLeft": "4px solid #f97316" + } + }, + "children": [ + { + "type": "Group", + "props": { + "justify": "space-between", + "align": "center" + }, + "children": [ + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm" + }, + "children": "Day 5 · Cape Hyūga" + }, + { + "type": "Badge", + "props": { + "color": "gray", + "size": "xs", + "variant": "light" + }, + "children": "Day 5" + } + ] + }, + { + "type": "Text", + "props": { + "size": "xs", + "c": "dimmed", + "mt": 4 + }, + "children": "Umagase glass deck · Sea Cross power spot · fly out Miyazaki" + } + ] + } + ] + }, + { + "type": "Grid", + "props": { + "gutter": "md", + "mt": 4 + }, + "children": [ + { + "type": "Grid.Col", + "props": { + "span": { + "base": 12, + "md": 7 + } + }, + "children": [ + { + "type": "Map", + "props": { + "h": 300, + "tileLayer": "osm", + "markers": [ + { + "lat": 31.366, + "lng": 131.337, + "label": "Day 1 · Cape Toi", + "color": "#2dd4bf" + }, + { + "lat": 31.638, + "lng": 131.344, + "label": "Day 2 · Obi", + "color": "#3b82f6" + }, + { + "lat": 31.797, + "lng": 131.478, + "label": "Day 3 · Aoshima", + "color": "#06b6d4" + }, + { + "lat": 32.423, + "lng": 131.625, + "label": "Day 4 · Hyūga", + "color": "#6366f1" + }, + { + "lat": 32.711, + "lng": 131.308, + "label": "Day 5 · Cape Hyūga", + "color": "#f97316" + } + ], + "routes": [ + { + "from": 0, + "to": 1, + "color": "#94a3b8" + }, + { + "from": 1, + "to": 2, + "color": "#94a3b8" + }, + { + "from": 2, + "to": 3, + "color": "#94a3b8" + }, + { + "from": 3, + "to": 4, + "color": "#94a3b8" + } + ] + } + } + ] + }, + { + "type": "Grid.Col", + "props": { + "span": { + "base": 12, + "md": 5 + } + }, + "children": [ + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm", + "mb": 4 + }, + "children": "Map legend" + }, + { + "type": "Table", + "props": { + "withTableBorder": true, + "withColumnBorders": true, + "data": { + "head": [ + "Pin", + "Stop" + ], + "body": [ + [ + "● Day 1", + "Cape Toi" + ], + [ + "● Day 2", + "Obi & Nichinan" + ], + [ + "● Day 3", + "Aoshima" + ], + [ + "● Day 4", + "Hyūga · Mimitsu" + ], + [ + "● Day 5", + "Cape Hyūga" + ] + ] + } + } + } + ] + } + ] + }, + { + "type": "Grid", + "props": { + "gutter": "md", + "mt": 4 + }, + "children": [ + { + "type": "Grid.Col", + "props": { + "span": { + "base": 12, + "md": 7 + } + }, + "children": [ + { + "type": "Card", + "props": { + "withBorder": true, + "padding": "sm", + "radius": "md" + }, + "children": [ + { + "type": "VegaLite", + "props": { + "spec": { + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "title": "Budget by category (¥)", + "data": { + "values": [ + { + "category": "Lodging", + "yen": 70000 + }, + { + "category": "Car + fuel", + "yen": 42000 + }, + { + "category": "Food", + "yen": 38000 + }, + { + "category": "Activities", + "yen": 20000 + }, + { + "category": "Train/ferry", + "yen": 15000 + } + ] + }, + "mark": { + "type": "bar", + "tooltip": true + }, + "encoding": { + "x": { + "field": "category", + "type": "nominal", + "sort": "-y", + "axis": { + "labelAngle": -30 + } + }, + "y": { + "field": "yen", + "type": "quantitative", + "title": "¥" + } + }, + "width": "container", + "height": 170 + } + } + } + ] + } + ] + }, + { + "type": "Grid.Col", + "props": { + "span": { + "base": 12, + "md": 5 + } + }, + "children": [ + { + "type": "Text", + "props": { + "fw": 700, + "size": "sm", + "mb": 4 + }, + "children": "Packing & booking" + }, + { + "type": "Checklist", + "props": { + "id": "travel-prep", + "editable": true, + "items": [ + { + "id": "car", + "label": "Reserve rental car (IDP)", + "checked": true + }, + { + "id": "ryokan", + "label": "Book ryokan nights 1-4", + "checked": true + }, + { + "id": "flight", + "label": "Book Miyazaki return flight", + "checked": false + }, + { + "id": "toi", + "label": "Cape Toi conservation fee (cash)", + "checked": false + }, + { + "id": "sun", + "label": "Sunscreen + rain shell (tsuyu)", + "checked": false + }, + { + "id": "ic", + "label": "Top up IC card", + "checked": false + } + ] + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/scripts/experiments/gepa-flowchart/gepa_flowchart/journeys_catalog.json b/scripts/experiments/gepa-flowchart/gepa_flowchart/journeys_catalog.json index a634019f..aa5028b8 100644 --- a/scripts/experiments/gepa-flowchart/gepa_flowchart/journeys_catalog.json +++ b/scripts/experiments/gepa-flowchart/gepa_flowchart/journeys_catalog.json @@ -5150,5 +5150,137 @@ "purpose": "brief the team" } ] + }, + { + "name": "travel-planning", + "diagram_type": "component", + "criteria": [ + { + "key": "title_badges", + "desc": "A trip title plus badges (duration, season, region or budget) head the board" + }, + { + "key": "day_sections", + "desc": "The itinerary is broken into clearly labeled, ordered per-day (or per-stop) sections/lanes, each listing that day's activities" + }, + { + "key": "stops_map", + "desc": "An interactive map shows the trip's stops as labeled, color-coded pins (none cut off)" + }, + { + "key": "map_legend", + "desc": "A legend or table keys the map's pins to their day/category" + }, + { + "key": "budget_chart", + "desc": "A budget breakdown (VegaLite) or a logistics table (transport/lodging) is included" + }, + { + "key": "checklist", + "desc": "An interactive packing or booking checklist is present" + }, + { + "key": "top_down_report", + "desc": "The board reads as a cohesive top-down itinerary, not a flat grid of equal peers" + } + ], + "instances": [ + { + "id": "kagoshima-summer", + "topic": "A one-week summer itinerary based in Kagoshima with day-by-day stops, a map of the route, a budget breakdown, and a packing checklist", + "audience": "A family traveler with young kids", + "purpose": "Plan a relaxed week and see how the days and stops fit together" + }, + { + "id": "kyushu-coast", + "topic": "A coastal road-trip itinerary down the Kyushu coast with seaside towns per day, a route map, drive times, and a budget", + "audience": "A couple on a road trip", + "purpose": "Sequence the seaside stops and gauge daily driving" + }, + { + "id": "kyoto-3day", + "topic": "A 3-day Kyoto culture trip with a themed plan per day, a map of temples and districts, a budget, and a what-to-pack checklist", + "audience": "A first-time visitor to Kyoto", + "purpose": "Cover the highlights without backtracking" + }, + { + "id": "iceland-ringroad", + "topic": "A 7-day Iceland Ring Road itinerary with a stop map, daily drives and sights, lodging logistics, and a budget chart", + "audience": "An adventurous road-tripper", + "purpose": "Plan the loop and book lodging in the right towns" + }, + { + "id": "nyc-weekend", + "topic": "A weekend city break in New York with a day-by-day plan, a neighborhood map of stops, a budget, and a booking checklist", + "audience": "A weekend traveler", + "purpose": "Fit the must-dos into two days efficiently" + } + ] + }, + { + "name": "event-planning", + "diagram_type": "component", + "criteria": [ + { + "key": "title_badges", + "desc": "An event title plus badges (date, headcount, budget) head the board" + }, + { + "key": "phase_timeline", + "desc": "Planning phases or a timeline (concept, venue, promotion, run-of-show, wrap-up) are clearly sequenced sections" + }, + { + "key": "task_checklist", + "desc": "An interactive task checklist (with owners or due dates) tracks the to-dos" + }, + { + "key": "budget_chart", + "desc": "A budget breakdown (VegaLite) splits cost by category" + }, + { + "key": "responsibilities", + "desc": "A vendors/RACI or responsibilities table makes ownership clear" + }, + { + "key": "venue_map", + "desc": "A map shows the venue or relevant locations" + }, + { + "key": "top_down_report", + "desc": "The board reads as a cohesive top-down plan, not a flat grid of equal peers" + } + ], + "instances": [ + { + "id": "tech-conference", + "topic": "Planning a 500-person technical conference from concept through wrap-up with phased tasks, an owner table, a budget chart, and a venue map", + "audience": "A conference organizer", + "purpose": "Track every phase, owner, and cost in one place" + }, + { + "id": "wedding", + "topic": "Planning a 120-guest outdoor wedding with a timeline, a vendor/responsibilities table, a budget breakdown, a task checklist, and a venue map", + "audience": "A couple planning their wedding", + "purpose": "Coordinate vendors and stay on budget" + }, + { + "id": "product-launch", + "topic": "A product-launch event plan with phases from teaser to day-of execution, team responsibilities, a budget, and the venue location", + "audience": "A launch manager", + "purpose": "Align teams on tasks, owners, and timing" + }, + { + "id": "music-festival", + "topic": "A two-day music-festival plan with phased logistics, a stage/area map, a vendor table, a budget chart, and an ops checklist", + "audience": "A festival producer", + "purpose": "Run a safe, on-budget multi-stage event" + }, + { + "id": "birthday-party", + "topic": "A kid's birthday-party plan with a simple timeline, a to-do checklist, a small budget breakdown, a supplies/responsibilities table, and the venue map", + "audience": "A busy parent", + "purpose": "Pull off the party without forgetting anything" + } + ] } -] \ No newline at end of file +] diff --git a/scripts/experiments/gepa-flowchart/reviews/travel-event-journeys-gepa.md b/scripts/experiments/gepa-flowchart/reviews/travel-event-journeys-gepa.md new file mode 100644 index 00000000..917f8063 --- /dev/null +++ b/scripts/experiments/gepa-flowchart/reviews/travel-event-journeys-gepa.md @@ -0,0 +1,40 @@ +# GEPA journeys: travel-planning + event-planning + +Two new `component` journeys added to `gepa_flowchart/journeys_catalog.json` (7 rubric criteria, 5 +instances each) and optimized with GEPA + repeated self-critique. + +## Setup +- Generator/judge/reflection/vision: `claude-opus-4-8`; reader: `claude-sonnet-4-6` (Vertex, `global`). +- `GEPA_SELF_REPAIR=1` (measurement-driven fix pass) + `GEPA_CRITIQUE_PERSONAS=3` (novice / + practitioner / skeptic comprehension critique each rollout). +- Metric axes: comprehension (0.35) · geometry (0.5) · visual-quality (0.15) + journey rubric. + +## Results (seed → best) + +| Journey | Round 1 (val 2, budget 30) | Round 2 (val 3, budget 45) | +|---|---|---| +| travel-planning | 0.4555 → **0.4555** (+0.00) | 0.4049 → **0.4049** (+0.00) | +| event-planning | 0.6624 → **0.6624** (+0.00) | 0.6240 → **0.6240** (+0.00) | + +(Absolute scores differ between rounds because the val split differs — val 2 vs val 3 selects a +different instance mix; what matters is best-vs-seed within a round.) + +## Finding: the comprehension ↔ density tension is fundamental +Across both rounds (4 reflective iterations each, 3-persona critique, self-repair), **no reflected +candidate beat the auto-composed seed on aggregate** — but not because reflection did nothing. The +Pareto trace shows reflected variants *raised* `visual_quality` (travel 0.5 → 0.9) and `rubric`, +while **`comprehension` collapsed** (travel new-program comprehension ≈ 0.14 vs the seed's higher +value). The reflected prompts pushed more map coordinates / budget rows / legend detail into the +board, which made it **clip and crowd**, so a reader could extract fewer facts. The leaner seed +prompt therefore stayed Pareto-best. + +This mirrors what we hit hand-building these boards: **packing in detail makes a planning board less +readable, not more.** The lesson is baked into the shipped recipes — both `travel-planning` and +`event-planning` instruct authors to keep day/phase sections TIGHT (short activity lines, ≤8 map +pins) and treat the map/budget/checklist as supporting rows beneath the day/phase spine. + +## Artifacts +- Optimized prompts (= seed, Pareto-best): `runs/{travel,event}_v2/best_prompts.json`. +- Shipped recipes: `plugin/skills/diagram-recipes/{SKILL.md, component.md}` + + `examples/{travel-planning,event-planning}.component.json` (both render clean: `ok=true`, no + x/y overflow, validated against `validateComponentTree`).