Public demo BDD execution evidence

The feature-owned runnable suite is feature/outreach/app/test/src/bdd/outreach.feature. It exercises the actual ten OutreachPage journeys with real button taps, text entry, and Select popup option taps, then asserts business records and inventory. The same controller instance is used when switching to the operations view. The suite also checks ten invalid submissions: failed transactions leave the world unchanged and editable values remain intact; missing consent and whitespace-only inquiry input are blocked by disabled controls with their effective enabled state asserted.

The detailed requirements remain in feature/outreach/app/features/*.feature. The executable suite covers representative main and invalid journeys rather than claiming that twenty scenarios independently exhaust every acceptance criterion. The feature-specific transaction and widget tests provide additional cancellation, stock-conflict, reset, locale and responsive coverage.

Executed locally

Evidence Command (from the owning package) Result
Feature BDD generation dart run build_runner build in feature/outreach/app PASS: generated test/src/bdd/outreach.widget_test.dart; exit 0
Runnable feature BDD flutter test --no-pub test/src/bdd/outreach.widget_test.dart --reporter expanded PASS: 20 scenarios; exit 0
BDD source analysis dart analyze --format machine test/src/bdd PASS: 0 errors and 0 warnings
Application Patrol generation dart run build_runner build in app/app PASS: generated integration_test/outreach/journeys.patrol_test.dart; exit 0
Application Patrol source analysis dart analyze --format machine integration_test/outreach PASS: 0 errors and 0 warnings
Actual application Patrol execution Chrome, COB_RUNTIME_MODE=localOnly, WEB_URL_STRATEGY=hash PASS: 20/20, zero failed/skipped, 4m05s; exit 0; HTML and JSON captured
Actual console Patrol execution Chrome, actual console startup, English/Arabic and surface changes PASS: 3/3, zero failed/skipped, 16s; exit 0; HTML and JSON captured
App count guard Recursive scenario discovery against actual Playwright JSON PASS: 20/20 scenarios
Console count guard Recursive scenario discovery against the actual Playwright JSON PASS: 3/3 scenarios
Nonserver workspace regression SKIP_SERVER=1 tool/dev/test_all.sh PASS: all 16 packages; exit 0
Nested scenario count guard python3 -m unittest tool/gates/tests/test_check_patrol_count.py PASS: 5 tests, including rejecting omitted nested scenarios

Local execution logs are /tmp/outreach-bdd-generation.log, /tmp/outreach-bdd-widget.log, /tmp/outreach-patrol-generation.log, /tmp/outreach-patrol-run-verbose.log, /tmp/outreach-console-patrol-run.log, /tmp/outreach-patrol-final-run.log, and /tmp/outreach-patrol-analyze.log. CI should retain equivalent logs as run artifacts.

Scenario-to-behavior mapping

Demo Main journey and assertions Invalid action and preservation
Bus Search, select departure and two seats, confirm; exactly one ticket, expected fare and occupied seats; same ticket in operations Past date rejected; date text and business world unchanged
Golf Tee time, lodging option and confirmation; tee unavailable, two rooms and four meals deducted; same reservation in operations Lodging shortage rejects whole package; tee, room and meal inventories unchanged
Travel comparison Choose two products, select departure, enter note and inquire; product/departure/comparison/note/total recorded Zero budget rejected; original filter state and budget input retained
Travel chat Select tour/date, begin chat, send a question and book; booking retains conversation context and message Whitespace message rejected; draft and conversation retained
Exam study Recommend curriculum, add three courses, consent and enroll; expected cart and tuition recorded Missing consent rejected; curriculum selection retained
Baby subscription Product, review, recurring consent and subscribe; active subscription and expected next date Missing consent disables subscribe; reviewed options retained
Bedding Product details, cart, confirmation and checkout; order and exact stock deduction Whitespace inquiry disables send; inquiry text retained
Distillery Session, confirmation and visit booking; expected remaining capacity Past visit date rejected; date input and business world retained
English placement Answer five practice items, choose recommended class and consultation slot; correct score, class and slot deduction Advancing without an answer rejected; question and answers retained
Dining and gifts Reserve room, enter gift message and order; separate room/order records, room blocked and gift stock deducted Sunday delivery rejected; gift date, message, cart and inventory retained

Shared steps and actual application execution

The pinned co_bdd parser recognizes the Scenario Outline heading but does not expand Examples rows (feature_parser.dart, lines 185–243 at package ref 5b479112d5f4c017572b304656239983d9cfae92). Therefore every demo is an explicit scenario using the same composite steps. This ensures twenty real test executions instead of an unexpanded placeholder scenario. No generator output is edited by hand.

The application-owned app/app/integration_test/outreach/journeys.feature uses patrol-only. Its Given step boots the actual app/main.dart, navigates with OutreachRoute, obtains the application's own outreachRuntime controller, and resets that isolated scenario. Action and assertion steps are generated mirrors of the feature BDD implementations. The Flutter web test compiler cannot resolve relative imports into another package's test directory. sync_steps.py copies the six test-only helpers into the application test boundary; sync_steps.py --check fails on any drift. The CI Patrol job runs this check before executing browser tests. No test helper is added to production libraries and no dependency cycle is introduced. Patrol execution is separate from widget execution and from public URL smoke tests.

The Select popup contains an animated search caret. The test helper advances its opening transition by a bounded frame duration, then clicks the actual option; it does not call onChanged directly or wait for an impossible globally idle caret frame. All other action and business assertions remain unchanged.

CI discovers Patrol files recursively and the count guard counts .feature scenarios recursively. Empty target lists fail before launch, and the JSON report must match all expected scenarios with no failures, flaky cases or skips. The obsolete kernel login scenarios were retired when the application entry points changed to these public demo journeys. The console now tests actual inventory, English/Arabic changes and customer/operations switching.

Final browser artifacts: /tmp/outreach-patrol-final-report/index.html, /tmp/outreach-patrol-final-report/results.json, /tmp/outreach-console-patrol-report/index.html, and /tmp/outreach-console-patrol-report/results.json. The recursive count guards verified 20/20 app scenarios and 3/3 console scenarios against these actual reports.

The complete nonserver workspace regression completed with all 16 packages passing (/tmp/outreach-workspace-tests.log). Existing platform-specific golden suites report local skips; this result does not substitute for Linux golden capture/compare evidence. The latest booking widget suite includes cancellation and rebooking after customer/operations remount, preserving idempotence while allowing a distinct new transaction.