feat(flight-finder): implement milestone M3 - prompt migration and smoke test fixtures
This commit is contained in:
@@ -17,6 +17,7 @@ This repository contains practical OpenClaw skills and companion integrations. I
|
||||
| Skill | What it does | Path |
|
||||
|---|---|---|
|
||||
| `elevenlabs-stt` | Transcribe local audio files with ElevenLabs Speech-to-Text, with diarization, language hints, event tags, and JSON output. | `skills/elevenlabs-stt` |
|
||||
| `flight-finder` | Collect structured flight-search inputs, run bounded multi-source travel searches, rank results in USD, and gate fixed-template PDF/email delivery through Luke’s sender path. | `skills/flight-finder` |
|
||||
| `gitea-api` | Interact with Gitea via REST API (repos, issues, PRs, releases, branches, user info). | `skills/gitea-api` |
|
||||
| `nordvpn-client` | Install, log in to, connect, disconnect, and verify NordVPN sessions across Linux CLI and macOS NordLynx/WireGuard backends. | `skills/nordvpn-client` |
|
||||
| `portainer` | Manage Portainer stacks via API (list, start/stop/restart, update, prune images). | `skills/portainer` |
|
||||
|
||||
@@ -5,6 +5,7 @@ This folder contains detailed docs for each skill in this repository.
|
||||
## Skills
|
||||
|
||||
- [`elevenlabs-stt`](elevenlabs-stt.md) — Local audio transcription through ElevenLabs Speech-to-Text
|
||||
- [`flight-finder`](flight-finder.md) — Typed flight-search intake, bounded source orchestration, PDF report rendering, and Luke-sender email delivery
|
||||
- [`gitea-api`](gitea-api.md) — REST-based Gitea automation (no `tea` CLI required)
|
||||
- [`nordvpn-client`](nordvpn-client.md) — Cross-platform NordVPN install, login, connect, disconnect, and verification with Linux CLI and macOS NordLynx/WireGuard support
|
||||
- [`portainer`](portainer.md) — Portainer stack management (list, lifecycle, updates, image pruning)
|
||||
|
||||
158
skills/flight-finder/examples/dfw-blq-2026-report-payload.json
Normal file
158
skills/flight-finder/examples/dfw-blq-2026-report-payload.json
Normal file
@@ -0,0 +1,158 @@
|
||||
{
|
||||
"request": {
|
||||
"tripName": "DFW ↔ BLQ flight report",
|
||||
"legs": [
|
||||
{
|
||||
"id": "outbound",
|
||||
"origin": "DFW",
|
||||
"destination": "BLQ",
|
||||
"earliest": "2026-05-30",
|
||||
"latest": "2026-06-07",
|
||||
"label": "Outbound"
|
||||
},
|
||||
{
|
||||
"id": "return-pair",
|
||||
"origin": "BLQ",
|
||||
"destination": "DFW",
|
||||
"relativeToLegId": "outbound",
|
||||
"minDaysAfter": 6,
|
||||
"maxDaysAfter": 10,
|
||||
"label": "Return for 2 adults"
|
||||
},
|
||||
{
|
||||
"id": "return-solo",
|
||||
"origin": "BLQ",
|
||||
"destination": "DFW",
|
||||
"earliest": "2026-06-28",
|
||||
"latest": "2026-07-05",
|
||||
"label": "Return for 1 adult"
|
||||
}
|
||||
],
|
||||
"passengerGroups": [
|
||||
{
|
||||
"id": "pair",
|
||||
"adults": 2,
|
||||
"label": "2 adults traveling together"
|
||||
},
|
||||
{
|
||||
"id": "solo",
|
||||
"adults": 1,
|
||||
"label": "1 adult returning separately"
|
||||
}
|
||||
],
|
||||
"legAssignments": [
|
||||
{
|
||||
"legId": "outbound",
|
||||
"passengerGroupIds": ["pair", "solo"]
|
||||
},
|
||||
{
|
||||
"legId": "return-pair",
|
||||
"passengerGroupIds": ["pair"]
|
||||
},
|
||||
{
|
||||
"legId": "return-solo",
|
||||
"passengerGroupIds": ["solo"]
|
||||
}
|
||||
],
|
||||
"recipientEmail": "stefano@fiorinis.com",
|
||||
"preferences": {
|
||||
"preferOneStop": true,
|
||||
"maxStops": 1,
|
||||
"maxLayoverHours": 6,
|
||||
"flexibleDates": true,
|
||||
"excludeAirlines": ["Turkish Airlines"],
|
||||
"excludeCountries": ["TR"],
|
||||
"requireAirlineDirectCrossCheck": true,
|
||||
"specialConstraints": [
|
||||
"Exclude itineraries operated by airlines based in Arab or Middle Eastern countries.",
|
||||
"Exclude itineraries routing through airports in Arab or Middle Eastern countries.",
|
||||
"Start from a fresh browser/session profile for this search."
|
||||
],
|
||||
"geoPricingMarket": "Thailand",
|
||||
"marketCountry": "TH",
|
||||
"normalizeCurrencyTo": "USD"
|
||||
}
|
||||
},
|
||||
"sourceFindings": [
|
||||
{
|
||||
"source": "kayak",
|
||||
"status": "viable",
|
||||
"checkedAt": "2026-03-30T21:00:00Z",
|
||||
"notes": [
|
||||
"KAYAK returned multiple one-stop DFW -> BLQ options and exposed direct-booking hints for British Airways."
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "skyscanner",
|
||||
"status": "viable",
|
||||
"checkedAt": "2026-03-30T21:05:00Z",
|
||||
"notes": [
|
||||
"Skyscanner returned one-stop and multi-stop DFW -> BLQ results with total USD pricing."
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "expedia",
|
||||
"status": "viable",
|
||||
"checkedAt": "2026-03-30T21:10:00Z",
|
||||
"notes": [
|
||||
"Expedia returned one-way DFW -> BLQ options with clear per-traveler pricing."
|
||||
]
|
||||
},
|
||||
{
|
||||
"source": "airline-direct",
|
||||
"status": "degraded",
|
||||
"checkedAt": "2026-03-30T21:15:00Z",
|
||||
"notes": [
|
||||
"United's direct booking shell loaded with the route/date context but failed to complete the search."
|
||||
]
|
||||
}
|
||||
],
|
||||
"quotes": [
|
||||
{
|
||||
"id": "kayak-outbound-ba",
|
||||
"source": "kayak",
|
||||
"legId": "outbound",
|
||||
"passengerGroupIds": ["pair", "solo"],
|
||||
"bookingLink": "https://www.kayak.com/flights/DFW-BLQ/2026-05-30?adults=3&sort=bestflight_a&fs=stops=-2",
|
||||
"itinerarySummary": "British Airways via London Heathrow",
|
||||
"airlineName": "British Airways",
|
||||
"departureTimeLocal": "10:59 PM",
|
||||
"arrivalTimeLocal": "11:45 PM +1",
|
||||
"stopsText": "1 stop",
|
||||
"layoverText": "6h 15m in London Heathrow",
|
||||
"totalDurationText": "17h 46m",
|
||||
"totalPriceUsd": 2631,
|
||||
"displayPriceUsd": "$2,631 total",
|
||||
"directBookingUrl": "https://www.britishairways.com/",
|
||||
"crossCheckStatus": "failed",
|
||||
"notes": [
|
||||
"Observed on KAYAK at $877 per traveler for 3 adults.",
|
||||
"Airline-direct cross-check remains degraded in this implementation pass."
|
||||
]
|
||||
}
|
||||
],
|
||||
"rankedOptions": [
|
||||
{
|
||||
"id": "primary-outbound",
|
||||
"title": "Best observed outbound baseline",
|
||||
"quoteIds": ["kayak-outbound-ba"],
|
||||
"totalPriceUsd": 2631,
|
||||
"rationale": "Lowest observed one-stop fare in the bounded spike while still meeting the layover constraint."
|
||||
}
|
||||
],
|
||||
"executiveSummary": [
|
||||
"The bounded implementation-pass smoke test produced a viable report payload from real DFW -> BLQ search evidence.",
|
||||
"KAYAK, Skyscanner, and Expedia all returned usable results on this machine.",
|
||||
"Direct-airline cross-checking is currently best-effort and should be reported honestly when it fails."
|
||||
],
|
||||
"reportWarnings": [
|
||||
"This smoke-test payload captures the bounded implementation-pass workflow, not the full old prompt's multi-leg optimization."
|
||||
],
|
||||
"degradedReasons": [
|
||||
"Airline direct-booking cross-check is still degraded and must be treated as best-effort in this pass."
|
||||
],
|
||||
"comparisonCurrency": "USD",
|
||||
"marketCountryUsed": "TH",
|
||||
"lastCompletedPhase": "ranking",
|
||||
"generatedAt": "2026-03-30T21:20:00Z"
|
||||
}
|
||||
74
skills/flight-finder/examples/dfw-blq-2026-request.json
Normal file
74
skills/flight-finder/examples/dfw-blq-2026-request.json
Normal file
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"tripName": "DFW ↔ BLQ flight report",
|
||||
"legs": [
|
||||
{
|
||||
"id": "outbound",
|
||||
"origin": "DFW",
|
||||
"destination": "BLQ",
|
||||
"earliest": "2026-05-30",
|
||||
"latest": "2026-06-07",
|
||||
"label": "Outbound"
|
||||
},
|
||||
{
|
||||
"id": "return-pair",
|
||||
"origin": "BLQ",
|
||||
"destination": "DFW",
|
||||
"relativeToLegId": "outbound",
|
||||
"minDaysAfter": 6,
|
||||
"maxDaysAfter": 10,
|
||||
"label": "Return for 2 adults"
|
||||
},
|
||||
{
|
||||
"id": "return-solo",
|
||||
"origin": "BLQ",
|
||||
"destination": "DFW",
|
||||
"earliest": "2026-06-28",
|
||||
"latest": "2026-07-05",
|
||||
"label": "Return for 1 adult"
|
||||
}
|
||||
],
|
||||
"passengerGroups": [
|
||||
{
|
||||
"id": "pair",
|
||||
"adults": 2,
|
||||
"label": "2 adults traveling together"
|
||||
},
|
||||
{
|
||||
"id": "solo",
|
||||
"adults": 1,
|
||||
"label": "1 adult returning separately"
|
||||
}
|
||||
],
|
||||
"legAssignments": [
|
||||
{
|
||||
"legId": "outbound",
|
||||
"passengerGroupIds": ["pair", "solo"]
|
||||
},
|
||||
{
|
||||
"legId": "return-pair",
|
||||
"passengerGroupIds": ["pair"]
|
||||
},
|
||||
{
|
||||
"legId": "return-solo",
|
||||
"passengerGroupIds": ["solo"]
|
||||
}
|
||||
],
|
||||
"recipientEmail": "stefano@fiorinis.com",
|
||||
"preferences": {
|
||||
"preferOneStop": true,
|
||||
"maxStops": 1,
|
||||
"maxLayoverHours": 6,
|
||||
"flexibleDates": true,
|
||||
"excludeAirlines": ["Turkish Airlines"],
|
||||
"excludeCountries": ["TR"],
|
||||
"requireAirlineDirectCrossCheck": true,
|
||||
"specialConstraints": [
|
||||
"Exclude itineraries operated by airlines based in Arab or Middle Eastern countries.",
|
||||
"Exclude itineraries routing through airports in Arab or Middle Eastern countries.",
|
||||
"Start from a fresh browser/session profile for this search."
|
||||
],
|
||||
"geoPricingMarket": "Thailand",
|
||||
"marketCountry": "TH",
|
||||
"normalizeCurrencyTo": "USD"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user