# Company-channel period card copy

## Metadata

- Date: 2026-07-31
- Scope: `arr_web/static/index.html`, `arr_web/static/styles.css`, `arr_web/static/app.js`, `tests/test_arr_web.py`
- Change type: display copy, card hierarchy and result-detail presentation
- Business-data mutation: none

## Behavior facts

- The three generation cards no longer show the generic `第一期`, `第二期`, `第三期` labels.
- The card headline values now read `C/O:01-10`, `C/O:11-20` and a month-aware final range: `C/O:21-30` for 30-day months or `C/O:21-31` for 31-day months.
- These are display labels only. The internal period keys remain `01-10`, `11-20` and `21-month-end`; release-date
  calculation, button enablement, confirmation context, POST payload and generation polling are unchanged.
- Period-completeness chips (`周期未结束` / `周期已结束`) and the computed Bangkok completion time remain below each
  C/O headline. The old duplicate C/O detail line was removed so each card has one clear range label.
- A targeted execution check confirms June resolves to `C/O:21-30` and July resolves to `C/O:21-31`.
- Result problems are deduplicated by kind/code/period for display; the internal warning and error arrays are not mutated.
- The result table now shows `生成时间` from `job.finished_at`, falling back to `job.created_at`; `version_no` remains in
  the API payload but is no longer exposed as a user-facing revision label.

## Verification

- `node --check arr_web/static/app.js`: passed.
- HTML parser check: passed.
- Focused suite: `28 tests`, `OK` (`tests.test_arr_web`, `tests.test_arr_web_company_reports`).
- Full discovery: `348 tests`, `OK (skipped=10)`.
- Targeted execution check: repeated same-code/same-period warnings collapse to one display item.
- Isolated authenticated fake-server browser QA at 1280x720 and 390x844 confirmed all three labels, no stage-name
  remnants, the requested C/O values and zero horizontal overflow. Page console warnings/errors: none. No upload,
  extraction, deletion, activation or report generation was submitted.
