# Reflection: Formatting is not business state

## Trigger

An early Booking parser interpretation treated a yellow source row as cancellation. The supplied real workbook showed
that a fully yellow row can still be the authoritative active Tour Code row, and the user confirmed that only explicit
source cancellation text should cancel it.

## Expected Behavior

The parser should derive replacement/cancellation from explicit business content and documented row order, not from
presentation-only cell formatting.

## Actual Behavior

A visual formatting heuristic could have removed a valid final Tour Code allocation.

## Root Cause

- Weak gate: a spreadsheet style was promoted to business meaning without an explicit contract or counterexample test.

## Evidence

- Files: `booking_ingestion/excel.py`, `tests/test_booking_excel_ingestion.py`
- Command output: the supplied workbook retains its yellow final row; the regression test
  `test_yellow_formatting_alone_does_not_cancel_a_tour` passes.
- Docs involved: `.project-docs/40-domain/business-rules.md`

## Lesson

Spreadsheet color, font, border and other presentation metadata must remain non-authoritative unless the user explicitly
defines that formatting as a business field. When row state matters, prefer text/column contracts and add a real-style
counterexample before accepting the rule.

## Action

- Add check/eval: retain a yellow-row regression fixture and keep cancellation text-based.
- Update docs: promote the rule to durable Booking business rules.

## Promotion

Business rule plus parser regression test.
