# Campus Rink transfer reporting

Open **Around the Rink → Player profiles → Transfer Portal**, or use `#portal`.

## Coverage

The initial September 10, 2026 snapshot includes all 471 player rows in APX Hockey’s published 2026 trackers: 344 Division I men and 127 Division I / National Collegiate women. This is complete relative to those two imported public sheets, not a claim to include every NCAA portal record. DII, DIII and club entrants are not connected. D1 departures to those levels or Canadian schools remain listed under their originating competition.

- [APX Hockey men’s tracker](https://www.apx-hockey.com/news-detail-83)
- [APX Hockey women’s tracker](https://www.apx-hockey.com/news-detail-82)
- Each player’s source details also link to the publisher’s public spreadsheet.
- [NCAA explanation of restricted portal access](https://www.ncaa.org/story.aspx?file_date=8-20-2019&filename=what-to-know-about-division-i-transfers)

Only factual movement fields are imported. Publisher commentary, contact information and private NCAA records are not imported.

## What fields mean

- **Entry reported:** the DATE field in the public tracker, not independently verified NCAA entry time.
- **Reported commitment:** a destination school listed by the tracker. This does not establish enrollment or eligibility.
- **No destination reported:** a blank destination in the source. It does not prove the player is currently available.
- **Withdrawn / signed professionally:** retained as distinct outcomes, not college commitments.
- **Possible destinations:** reserved for explicit, dated reporting with a source URL. The initial sheets do not provide this field, so no possible destinations are invented or imported from unsourced rumors.
- **Commitment date:** not supplied by these sheets. It remains “Not reported”; the entry date is never substituted.
- **Source checked:** last successful retrieval, not the date of a commitment or the publisher’s latest edit.

Player profiles link only when normalized name and former school both match the existing 2025–26 directory. Historical roster information is preserved. College logos use the existing school registry; international schools without a verified mark use a text fallback.

## Updates

Run the included `server.py` as usual. `/api/portal` fetches only the two known public Google Sheets tables. Checks are cached for 15 minutes. The page checks on entry and every 15 minutes while open and visible; the check button respects the same server cache. There is no direct NCAA feed or instantaneous entry notification.

The server uses bounded fetches, timeouts, allowed redirects and strict season/column validation. Each competition retains its last good rows in memory when its source is unavailable. Saved source data supports offline viewing. A changed spreadsheet layout or season fails visibly instead of silently mislabeling records.

To rebuild the bundled offline snapshot, run `python3 transfer_portal.py` from the app directory. Both source fetches must succeed before the snapshot files are rewritten. In-app refreshes use memory and do not rewrite the bundled snapshot.

## Checks

Verified imported counts, unique record IDs, distinct status outcomes, missing dates, origin/destination filters, favorites, gender filters, historical profile joins, unavailable levels, malformed source rejection and cached fallback. The existing news endpoint tests also pass.
