# Evidence Topic: Channel BI database runtime verification

## Metadata

- Date: 2026-07-29
- Status: Superseded
- Scope: Local Web channel-BI read path from browser through PostgreSQL
- Confidence: Fact
- Source: Live local HTTP responses, browser DOM/console inspection, process/listener inspection and targeted automated tests
- Last verified: 2026-07-29
- Stale trigger: Restart or reconfiguration of the 8765 Web process; database migration or fact changes; changes to `arr_web`, `channel_analytics` or the BI frontend

Superseded for current values by
[`2026-07-30-channel-bi-post-update-data-contamination.md`](2026-07-30-channel-bi-post-update-data-contamination.md)
after real uploads changed the Finance projection. The connection-path finding remains valid.

## Question

Is the current Web “渠道BI” page actually connected to PostgreSQL, rather than only having an unverified code path or mock response?

## Evidence

- Static path: `arr_web/static/app.js` requests `/api/months` and `/api/analytics`; `arr_web/app.py` delegates the analytics route to `PostgresPortalRepository`; `channel_analytics/postgres.py` reads current Finance facts in `REPEATABLE READ READ ONLY` transactions and validates the target database as `booking_test`.
- Live health: `GET http://127.0.0.1:8765/api/health` returned HTTP 200 with `database_ready=true`.
- Live database-backed requests: `/api/months` returned the `2026-07` projection with one channel and one row; `/api/analytics?month=2026-07` returned BI schema 1.2 with QBD, one sold room, three room nights and total price 5400.
- Browser verification: the live “渠道BI” tab rendered the same month, KPIs, QBD ranking and channel-by-room-type matrix; browser console error count was zero.
- Runtime identity: the existing Web process uses the controlled `booking-test-db.env` and is bound to `0.0.0.0:8765`; upload processing is disabled, matching `processing_ready=false`.
- Regression: 24 tests covering channel analytics PostgreSQL behavior, analytics contracts, Web routes and repository schema passed.

## Finding

The current local Web channel-BI path is fully connected and functioning from the rendered page through the live Web API to PostgreSQL. No connection code change is required for this task. `processing_ready=false` is a separate XML-upload runtime state and does not invalidate the BI read path.

## Impact

Future channel-BI work should not begin by replacing or re-wiring the current repository. Reverify the live endpoints after process, configuration, migration or fact changes. Treat the existing all-interface listener as a local test process, not a production security boundary: bind it to loopback for local-only use or place it behind the documented Caddy HTTPS plus ARR application-login boundary.

## Open Items

- Reverify `database_ready=true`, `/api/months` and one known `/api/analytics` month after the formal server deployment.
- Do not expose port 8765 directly; use loopback for local testing or the Caddy boundary for deployment.
