Diagnostic Trace

Feature: Service Item Diagnostic Trace
  When the evaluator is run with a ServiceItemTraceCollector wired in, it
  records every eligibility decision (accepted + rejected with reason),
  expansion outputs, status verdicts, and the final result. Production
  callers opt in by setting VehicleLookupRequestOptions.TraceServiceItemEvaluation;
  here the collector is wired directly because BDD instantiates the evaluator.

Scenario: Trace records each eligibility decision with rejection reason
  Given vehicles in dealer stock:
    | VIN               | InvoiceDate | CompanyID | BranchID | BrandID |
    | 1FDKF37GXVEB34368 | 2026-01-15  | 1         | 10       | 1       |
  And service items:
    | ServiceItemID | Name            | BrandID | ActiveForMonths |
    | SI-MATCH      | 5K Service      | 1       | 24              |
    | SI-OTHERBRAND | Other-Brand Svc | 2       | 24              |
  And the trace free service start date is "2026-01-15"
  When evaluating service items with trace for "1FDKF37GXVEB34368" with language "en"
  Then the trace records 2 eligibility decisions
  And the trace records "SI-MATCH" as accepted
  And the trace records "SI-OTHERBRAND" as rejected at "Brand"
  And the trace final result has 1 items
  And the trace has at least 1 stage timing