Dated source reference. Current release status: handoff state. Full original relative paths are in the developer archive.
College roster authoring standard — version 1
Private editor source 0.1.0.dev8 adds the College Fields form and bulk metadata CSV. The hosted dev7 download is unchanged. The machine-readable contract is college-fields-v1.json; the companion container remains extension format 1. These versions are independent of API/native ABI versions.
The current browser editor exposes these same fields directly in the grid, column presets and bulk tools. Its mixed CSV starts ID,ROS_SHA256,EXTRAS_SHA256,..., protecting both native and metadata revisions; reexport after teammate changes. This web contract supplements the preserved desktop instructions below. The91-field vocabulary and extension format remain unchanged.
All 91 fields are optional. Start with the Recommended view; use All fields or a group when needed. Unknown information should stay Not set or Unknown, rather than being filled with invented values. No new field changes native gameplay, selects a rules profile, loads artwork or renders presentation. The hook/API do not consume this vocabulary yet.
Start here
- Open the roster and select a team or player record.
- Open Tools → College fields, or the College fields toolbar button. The form offers field descriptions, examples, enum dropdowns, true/false choices and a color picker. Filtering never discards hidden edits.
- Not set removes a field. Unknown stores an explicit JSON null. Value stores the value you enter. Opening the form creates no defaults or guessed information.
- Apply the changes. They share the editor's Undo/Redo and change review.
- Use Save a copy and keep the
.ROSand.ROS.openhoops.jsonpair together. Do not rename or attach an unmatched companion to another roster. Native game saving can invalidate the pair; no automatic reconciliation is claimed.
Tools → Roster / season fields edits dataset title/version/credits, season context and the default ID namespace. Existing native names, ratings, positions, jersey numbers, team assignments and colors remain in their existing tables. Optional display fields describe future consumer overrides; leave them unset when native values suffice.
Recommended authoring priorities
| Entity | Useful starting fields | Optional additions |
|---|---|---|
| Roster | Dataset title/version, season start year, ID namespace | Credits, data date, season label, overall competition context |
| Teams | Stable ID; NCAA/NAIA association and NCAA division; school name; conference ID/name/abbreviation | Preferred national ranking, separate AP/coaches/NET values, entering-game records, tournament seed/region, display branding |
| Players | Stable ID, basketball class, high school, previous college, hometown | Earlier colleges, recruiting source/stars/rank, academic context, declared availability, portrait key |
| Staff | Stable ID and native name/team assignment | Display name, descriptive role, alma mater, first year, provided career totals |
| Arenas | Native arena selection and name | Venue location/capacity/timezone and display name/logo key |
| Uniforms | Native graphics/texture association | Friendly name, home/away/alternate role, season label, maker, display colors |
| Schools table | Existing alma-mater institution record | Institution identity, display names/location/branding. This table is not repurposed as conferences. |
Player class, availability, seasons played/remaining and transfer background are creator declarations. The editor does not calculate eligibility, enforce participation, set injuries or rewrite lineups from these values. High school and previous college are separate fields. There are no redshirt fields in this vocabulary.
NCAA D1 / D2 / D3 and NAIA
Set these team fields for each school in a mixed roster:
| School level | org.openhoops.competition.association |
org.openhoops.competition.division |
|---|---|---|
| NCAA D1 | ncaa |
d1 |
| NCAA D2 | ncaa |
d2 |
| NCAA D3 | ncaa |
d3 |
| NAIA | naia |
not_applicable |
These values have no relationship to the native NBA Division column. A roster-level competition value describes dataset context; it does not silently assign all teams in a mixed dataset. Individual team values are explicit. Leave unknown information unset/null; do not identify NAIA as an NCAA division.
Stable identities and 90+ conferences
Use string IDs, for example team north-university and conference northern-conference, in a creator-owned ID namespace such as com.example.college. IDs are case-sensitive, preserve leading zeros and must remain stable when names or physical rows change. An ID namespace is the creator/dataset identity; an entity ID is not an executable address or a physical row number.
org.openhoops.identity.namespace on a record overrides the roster namespace. An absent record namespace inherits the roster value; an explicit null means unknown and suppresses that fallback. The record's identity.id never inherits. A previous-college ID and conference ID use the containing record's effective namespace. This version does not resolve cross-namespace links or infer identity from a name.
On every team in a conference, set the same conference ID, name and abbreviation. Optional conference subdivision is a label such as East/West; it is distinct from competition division. Schools can have different NCAA levels and separate conference identities without changing native packed fields. A conference's identity is the pair (ID namespace, conference ID). Only declared members are listed; empty conferences need a future separate package/app registry.
For an independent, explicitly set org.openhoops.conference.independent=true and leave conference identity fields unset/null. Missing conference information alone means unknown, not independent. A team with independent=false and no ID is still missing conference information.
Tools → Conference declarations groups teams by those IDs and reports conflicting conference labels, duplicate stable entity IDs and missing namespaces. Check roster includes the metadata warnings. No realignment, scheduling, standings or native playoff behavior is inferred or changed. Metadata grouping has no 90-conference cap within the existing companion/record bounds.
The native field is only four bits. Original instruction inspection and bounded execution show regular division IDs 0–2 map to one native conference category, 3–5 to the other, and 6–9 to other. Unused IDs 10–15 exceed the lookup's valid dispatch entries. Expanding native association/standings/scheduling/playoffs therefore needs broader recovery and changes; changing a byte or renaming a conference is insufficient. See conference research.
Rankings and changing season data
org.openhoops.ranking.national_rank is the preferred positive numeric rank for a future consumer. Add national_source (for example ap or coaches) and national_as_of (YYYY-MM-DD). national_status=ranked requires a rank. unranked and unknown require that numeric rank be absent/null. A positive rank by itself supplies a rank; missing status never automatically means unranked. Zero is not a national rank.
AP and coaches polls also have optional separate rank/status/date fields. NET is a separate metric rank. None automatically replace the preferred national value. No polls or proprietary data are downloaded, calculated or supplied. A tournament seed is a separate postseason value.
The catalog marks changing fields with lifecycle=season_or_match: rankings, season records, postseason context, availability, class/season participation and staff career totals. They are authored baselines. A future client/consumer must explicitly advertise support and its match-override behavior before these fields can be promised as live features. This task does not introduce runtime overrides or a scorebug. A future match value must not silently mutate the source roster.
Bulk metadata CSV
Select Teams, Players or another supported table. Tools → Export college CSV exports either Recommended or All standard fields, across the entire selected table. The CSV contains ID, ROS_SHA256, read-only NativeLabel context and fully qualified field keys. It is not limited to the visible editor page or current filter. Imports address existing physical rows and require the same native roster revision hash; they do not match people or teams by names.
- Blank cell: leave the existing value unchanged.
@unset: remove the field.@unknown: explicit unknown/null.- Text starting with
@: prefix another@, so literal@unknownbecomes@@unknown. - Boolean:
true/false. Integer: whole decimal number. Text enums: use the catalog's exact lowercase values. - Do not modify
IDorROS_SHA256to transplant metadata between unrelated rosters. Export again after native/row edits.NativeLabelis context only and never writes a native name.
Tools → Import college CSV validates the complete file before applying it as one undoable transaction. Wrong-scope columns, duplicate rows/headers, stale roster hashes, invalid dates/types or contradictory rank values refuse the whole import. Custom fields not mentioned in the CSV remain intact. Files are bounded to 16 MiB and export refuses existing destinations. A partial CSV can contain a subset of rows and standard columns, while retaining ID/hash columns.
CLI equivalents, using the same writer:
python run.py college-fields --section 10
python run.py export-college Source.ROS Teams.csv --section 10
python run.py export-college Source.ROS Players.csv --section 3 --profile all
python run.py import-college Source.ROS Teams.csv Edited.ROS --section 10
python run.py export-college Source.ROS Season.csv --profile all
python run.py conferences Edited.ROS
Custom fields remain available through Extra fields using a namespace controlled by the mod/app, such as com.example.scouting.role. They do not require registration here. The org.openhoops namespace is reserved for published OpenHoops contracts. Unknown/future fields are preserved without assigning them invented semantics. Values remain scalar text/numbers/booleans/null; complex dynasty state belongs in an app document.
Complete version-1 field catalog
The following table is generated from the machine-readable catalog. Every row is optional and accepts explicit null. Examples are fictional authoring examples, not current season data. Scopes: roster, team, player (including native player-template tables), staff, arena, uniform, school (native Colleges table).
| Field | Type | Scope | Meaning |
|---|---|---|---|
org.openhoops.identity.id |
text | roster, team, player, staff, arena, uniform, school | A creator-owned stable ID, independent of physical ROS row numbers. Use with ID namespace; never reuse it for another entity. |
org.openhoops.identity.namespace |
text | roster, team, player, staff, arena, uniform, school | Identifies the creator or dataset owning stable IDs. An absent record namespace inherits the roster namespace; explicit null remains unknown. Conference and previous-college IDs use this namespace. |
org.openhoops.display.name |
text | roster, team, player, staff, arena, uniform, school | Optional full display name for consumers. Leave unset to use the existing native name. |
org.openhoops.display.short_name |
text | team, player, school | Optional compact name for future graphics; does not change the native name. |
org.openhoops.display.abbreviation |
text | team, school | Optional compact abbreviation. Use the existing native abbreviation unless a consumer needs another form. |
org.openhoops.display.pronunciation |
text | team, player, staff, school | Human-readable pronunciation guidance, not synthesized speech or a native audio identifier. |
org.openhoops.dataset.title |
text | roster | Human-readable title of this authored roster. |
org.openhoops.dataset.version |
text | roster | Creator-chosen content version; separate from the OpenHoops vocabulary version. |
org.openhoops.dataset.author |
text | roster | Creator or roster-team attribution. |
org.openhoops.dataset.source |
text | roster | Human-readable source or credit for the authored data. |
org.openhoops.dataset.as_of |
text / date | roster | Date of the roster data, in YYYY-MM-DD form. |
org.openhoops.season.start_year |
integer | roster | Calendar year in which the represented basketball season begins. No eligibility or schedule calculation. |
org.openhoops.season.label |
text | roster | Optional display label; the start year remains the machine-readable season identity. |
org.openhoops.competition.association |
text: ncaa, naia, njcaa, other |
roster, team | NCAA, NAIA or another association. Team values can describe a mixed-association roster. Metadata only. |
org.openhoops.competition.division |
text: d1, d2, d3, not_applicable, other |
roster, team | NCAA D1/D2/D3 are d1/d2/d3. Use not_applicable for NAIA rather than inventing an NCAA division. This is separate from native NBA Division. |
org.openhoops.competition.category |
text: mens, womens, mixed, other |
roster, team | Optional category for consumers; does not select or enforce a game rule profile. |
org.openhoops.school.name |
text | team, school | Institution name, separate from the team mascot. |
org.openhoops.school.mascot |
text | team, school | Human-readable team nickname. |
org.openhoops.school.city |
text | team, school | City used for institution context. |
org.openhoops.school.region |
text | team, school | Human-readable state, province or region. |
org.openhoops.school.country |
text | team, school | Human-readable country name; not a nationality eligibility rule. |
org.openhoops.conference.id |
text | team | Stable conference ID in the team ID namespace. Use the same ID on every member; never store a native ROS row number here. |
org.openhoops.conference.name |
text | team | Full name of the basketball conference for this season. Repeat consistently for teams with the same conference ID. |
org.openhoops.conference.abbreviation |
text | team | Short conference label used by future clients. |
org.openhoops.conference.subdivision |
text | team | Optional internal grouping such as East or West; independent of NCAA competition division. |
org.openhoops.conference.independent |
boolean | team | True explicitly declares no basketball conference. Leave conference ID/name/abbreviation unset for an independent. |
org.openhoops.conference.logo_key |
text / asset_key | team | Opaque future asset-package key. Does not load an image or accept a filesystem path. |
org.openhoops.ranking.national_rank |
integer | team | Preferred rank for future scorebugs. Positive integers only; null is unknown. Use status=unranked explicitly for an unranked team. |
org.openhoops.ranking.national_status |
text: ranked, unranked, unknown |
team | ranked requires a positive rank; unranked and unknown cannot carry a numeric rank. Missing rank/status never means unranked. |
org.openhoops.ranking.national_source |
text | team | Poll or ranking source selected by the creator or app, for example ap or coaches. No poll data is supplied by OpenHoops. |
org.openhoops.ranking.national_as_of |
text / date | team | Date this preferred rank applies, in YYYY-MM-DD form. |
org.openhoops.ranking.ap_rank |
integer | team | Optional separate poll rank. Does not automatically replace the preferred national rank. |
org.openhoops.ranking.ap_status |
text: ranked, unranked, unknown |
team | Explicit ranked/unranked/unknown status for this poll only. |
org.openhoops.ranking.ap_as_of |
text / date | team | Date this poll value applies. |
org.openhoops.ranking.coaches_rank |
integer | team | Optional separate poll rank. Does not automatically replace the preferred national rank. |
org.openhoops.ranking.coaches_status |
text: ranked, unranked, unknown |
team | Explicit ranked/unranked/unknown status for this poll only. |
org.openhoops.ranking.coaches_as_of |
text / date | team | Date this poll value applies. |
org.openhoops.ranking.net_rank |
integer | team | Optional creator/app-provided metric rank; separate from a poll or tournament seed. No metric is calculated or fetched. |
org.openhoops.ranking.net_as_of |
text / date | team | Date the provided metric rank applies. |
org.openhoops.record.wins |
integer | team | Creator/app-provided season record entering a match; not a replacement for native match statistics. |
org.openhoops.record.losses |
integer | team | Creator/app-provided season record entering a match; not a replacement for native match statistics. |
org.openhoops.record.conference_wins |
integer | team | Creator/app-provided season record entering a match; not a replacement for native match statistics. |
org.openhoops.record.conference_losses |
integer | team | Creator/app-provided season record entering a match; not a replacement for native match statistics. |
org.openhoops.record.as_of |
text / date | team | Date the provided season record applies. |
org.openhoops.postseason.tournament |
text | team | Optional tournament context for this team. Does not create or seed a native tournament. |
org.openhoops.postseason.seed |
integer | team | Positive seed within the named tournament; separate from national rank. |
org.openhoops.postseason.region |
text | team | Optional tournament region label. |
org.openhoops.college.class_year |
text: freshman, sophomore, junior, senior, graduate, other |
player | Creator-declared basketball class, separate from academic standing. No automatic eligibility calculation. |
org.openhoops.college.academic_year |
text | player | Optional academic standing when it differs from basketball class. |
org.openhoops.college.seasons_played |
integer | player | Creator-declared history; no deduction or NCAA/NAIA policy is inferred. |
org.openhoops.college.seasons_remaining |
integer | player | Optional creator/app-declared remaining participation. No eligibility decision or automatic enforcement. |
org.openhoops.college.is_transfer |
boolean | player | Creator-declared transfer background for this roster season. Does not enforce transfer or eligibility rules. |
org.openhoops.college.previous_college |
text | player | Most recent previous college name; not high school and not an NBA draft-history field. |
org.openhoops.college.previous_college_id |
text | player | Optional stable institution/team ID in this record ID namespace. No automatic native team lookup. |
org.openhoops.college.previous_colleges |
text | player | Optional human-readable older history, oldest to newest; use semicolons. Not a machine-readable list of identities. |
org.openhoops.college.previous_college_season |
text | player | Human-readable season context for the most recent previous college. |
org.openhoops.bio.high_school |
text | player | High school attended, separate from previous college. |
org.openhoops.bio.high_school_city |
text | player | City of the listed high school. |
org.openhoops.bio.high_school_region |
text | player | State, province or region of the listed high school. |
org.openhoops.bio.hometown_city |
text | player | Creator-provided hometown; not necessarily birthplace. |
org.openhoops.bio.hometown_region |
text | player | State, province or region of the listed hometown. |
org.openhoops.bio.hometown_country |
text | player | Human-readable hometown country. |
org.openhoops.bio.major |
text | player | Optional creator-supplied academic major. |
org.openhoops.recruiting.stars |
integer | player | Creator-supplied scale: 0 explicitly unrated, 1-5 stars; missing/null is unknown. No recruiting data is fetched. |
org.openhoops.recruiting.source |
text | player | Source of the provided recruiting assessment. |
org.openhoops.recruiting.class_year |
integer | player | Calendar year of the provided recruiting class. Separate from basketball class. |
org.openhoops.recruiting.national_rank |
integer | player | Positive recruiting rank from the stated source. Missing/null is unknown. |
org.openhoops.availability.status |
text: available, questionable, doubtful, out, suspended, unavailable, unknown |
player | Creator/app declaration for future consumers. Does not change the native injury state or remove a player from a lineup. |
org.openhoops.availability.note |
text | player | Optional short display context supplied by the creator/app. No medical or rule decision is inferred. |
org.openhoops.availability.as_of |
text / date | player | Date the declared availability applies. |
org.openhoops.branding.logo_key |
text / asset_key | team, arena, school | Opaque future asset-package key. Data only; this does not load or publish artwork. |
org.openhoops.branding.wordmark_key |
text / asset_key | team, school | Opaque future asset-package key. Data only; this does not load or publish artwork. |
org.openhoops.branding.portrait_key |
text / asset_key | player, staff | Opaque future asset-package key. Data only; this does not load or publish artwork. |
org.openhoops.branding.color_primary |
text / color | team, uniform, school | Optional future display color as #RRGGBB. Leave unset to use existing native colors; no native color is changed. |
org.openhoops.branding.color_secondary |
text / color | team, uniform, school | Optional future display color as #RRGGBB. Leave unset to use existing native colors; no native color is changed. |
org.openhoops.branding.color_accent |
text / color | team, uniform, school | Optional future display color as #RRGGBB. Leave unset to use existing native colors; no native color is changed. |
org.openhoops.staff.role |
text: head_coach, associate_head_coach, assistant_coach, director, trainer, other |
staff | Optional descriptive role; does not replace the native staff/team assignment. |
org.openhoops.staff.alma_mater |
text | staff | College attended by the staff member. |
org.openhoops.staff.since_year |
integer | staff | Calendar year the staff member started at the current institution. |
org.openhoops.staff.career_wins |
integer | staff | Optional creator/app-maintained career total; no native statistics are replaced. |
org.openhoops.staff.career_losses |
integer | staff | Optional creator/app-maintained career total; no native statistics are replaced. |
org.openhoops.venue.city |
text | arena | Location of this venue; not a team conference or campus identity. |
org.openhoops.venue.region |
text | arena | Location of this venue; not a team conference or campus identity. |
org.openhoops.venue.country |
text | arena | Location of this venue; not a team conference or campus identity. |
org.openhoops.venue.capacity |
integer | arena | Optional declared basketball seating capacity. Does not change the native crowd. |
org.openhoops.venue.opened_year |
integer | arena | Optional calendar opening year. |
org.openhoops.venue.timezone |
text / timezone | arena | IANA timezone name for future external scheduling; not a Windows zone name or a native clock setting. |
org.openhoops.uniform.role |
text: home, away, alternate, throwback, special, other |
uniform | Descriptive uniform category. Does not enforce home/away colors or change native uniform selection. |
org.openhoops.uniform.season_label |
text | uniform | Optional season context for this uniform. |
org.openhoops.uniform.manufacturer |
text | uniform | Optional creator-supplied maker label. |
org.openhoops.uniform.notes |
text | uniform | Short creator guidance, for example intended special event. Does not create a selection restriction. |
Windows verification
Private source53b passes148 Windows writer tests (101 existing writer +15 preparation +32 college), MS .NET compilation with warnings-as-errors,32 college cases against the independently assembled factual-catalog runtime, and16 production-EXE control/edit/save/fresh-open checks. Corrected player/team controls were visually inspected through service-session captures; this is not physical-user desktop certification. The original-instruction conference fixture adds49 bounded cases. No game/API/native DLL build, new dependency, shared desktop input or public package is required. Exact identities and scoped evidence are in the checkpoint.