Problem
OpenGD77 CPS CSV is our first (but not only) vendor interchange format (#38), but the field mapping documentation is scattered and incomplete:
Neither is an authoritative reference for third-party ↔ internal field mapping. Missing today:
- Bidirectional conversion rules (e.g.
Yes/No booleans, Off/On VOX, ID Type → TalkGroup vs Contact, name-based FK denormalisation on export).
- Validation constraints — required columns, allowed enum values, parse failure vs skip behaviour.
- Field size / cardinality limits — channel name length, zone member cap (80), TG list member cap (32), etc.
- Lossy vs lossless fields — what round-trips via
vendorExtras, what is header-only (DTMF.csv, APRS.csv), what is not modelled.
- Planned adapter behaviour that needs a stable doc home — e.g. multi-talkgroup channel denormalisation (#36), future qDMR YAML (#37).
Feature docs under docs/features/import/ and docs/features/export/ should describe how the feature works in the app (UI, registry, progress logs). Canonical vendor format knowledge should live alongside other reference material (cf. docs/reference/bands.md), with implementation code (src/lib/import/opengd77/, src/lib/export/opengd77/) expected to mirror it.
Intended outcome
Create docs/reference/opengd77/ as the authoritative OpenGD77 CPS CSV reference and refactor existing feature docs to link there instead of duplicating column tables.
Proposed reference layout
| File |
Contents |
docs/reference/opengd77/README.md |
Hub — file set overview, classification heuristics, skip vs error, links to per-file docs |
docs/reference/opengd77/file-format.md |
Cross-cutting rules: header-name parsing (not index), case-sensitive name FKs, round-trip guarantees, vendorExtras policy |
docs/reference/opengd77/channels.md |
Channels.csv — every column, internal field, import parse, export serialise, conversion fns, validation |
docs/reference/opengd77/zones.md |
Zones.csv — Channel1…Channel80, zone cap, nested-zone export notes (#33 if relevant) |
docs/reference/opengd77/contacts.md |
Contacts.csv — Group/Private, TS Override |
docs/reference/opengd77/tg-lists.md |
TG_Lists.csv — Contact1…Contact32, promiscuous RX semantics |
docs/reference/opengd77/dtmf-aprs.md |
DTMF.csv / APRS.csv — header-only status, future modelling notes |
docs/reference/opengd77/limits.md |
CPS-imposed max lengths, member counts, naming constraints (source: OpenGD77 CPS / firmware where known) |
docs/reference/opengd77/multi-talkgroup.md |
Placeholder/stub for #36 denormalisation rules (channel × TG expansion, naming template, zone membership) |
Adjust filenames if a simpler split works — goal is one obvious place per concern, not feature-doc sprawl.
Per-field table shape (each file)
For every vendor column, document at minimum:
| Vendor header |
Internal field |
Required |
Max size / range |
Import rule |
Export rule |
Round-trip |
Notes |
Populate from existing code:
Feature doc updates
Affected
docs/reference/opengd77/ (new)
docs/features/import/opengd77.md
docs/features/export/README.md
docs/features/README.md
- Optionally: brief comment in
columns.ts / adapter files pointing at the reference (mirror pattern in src/lib/bands.ts → docs/reference/bands.md).
Notes / dependencies
- Builds on shipped import/export (#38) — document what exists today; flag gaps where code and docs disagree (code wins until fixed).
- Feeds #36 — multi-TG denormalisation rules should be drafted in reference before/alongside implementation.
- Feeds #37 — establishes the
docs/reference/<vendor>/ pattern for future formats (e.g. docs/reference/qdmr/ later).
- Research CPS limits from OpenGD77 CPS UI / firmware docs or qDMR's
OpenGD77Codeplug where our code is silent.
- Use gitignored
sample-exports/ for examples; do not commit operator codeplugs.
Out of scope
- Implementing new validation or export behaviour — this ticket is documentation only (file follow-up issues for code gaps discovered during the audit).
- qDMR YAML reference docs (#37) — separate directory when that adapter is scoped.
- Native YAML schema (#10) — internal format, not vendor reference.
Workflow note (for whoever picks this up)
Docs-only work: branch from origin/main, use atomic conventional commits per logical unit (e.g. docs(reference): add opengd77 hub, docs(import): link opengd77 adapter to reference), open a PR linking Closes #. No progress/outstanding logs needed unless the audit surfaces code bugs worth ticketing.
Problem
OpenGD77 CPS CSV is our first (but not only) vendor interchange format (#38), but the field mapping documentation is scattered and incomplete:
Neither is an authoritative reference for third-party ↔ internal field mapping. Missing today:
Yes/Nobooleans,Off/OnVOX,ID Type→TalkGroupvsContact, name-based FK denormalisation on export).vendorExtras, what is header-only (DTMF.csv,APRS.csv), what is not modelled.Feature docs under
docs/features/import/anddocs/features/export/should describe how the feature works in the app (UI, registry, progress logs). Canonical vendor format knowledge should live alongside other reference material (cf. docs/reference/bands.md), with implementation code (src/lib/import/opengd77/,src/lib/export/opengd77/) expected to mirror it.Intended outcome
Create
docs/reference/opengd77/as the authoritative OpenGD77 CPS CSV reference and refactor existing feature docs to link there instead of duplicating column tables.Proposed reference layout
docs/reference/opengd77/README.mddocs/reference/opengd77/file-format.mdvendorExtraspolicydocs/reference/opengd77/channels.mdChannels.csv— every column, internal field, import parse, export serialise, conversion fns, validationdocs/reference/opengd77/zones.mdZones.csv—Channel1…Channel80, zone cap, nested-zone export notes (#33 if relevant)docs/reference/opengd77/contacts.mdContacts.csv—Group/Private,TS Overridedocs/reference/opengd77/tg-lists.mdTG_Lists.csv—Contact1…Contact32, promiscuous RX semanticsdocs/reference/opengd77/dtmf-aprs.mdDTMF.csv/APRS.csv— header-only status, future modelling notesdocs/reference/opengd77/limits.mddocs/reference/opengd77/multi-talkgroup.mdAdjust filenames if a simpler split works — goal is one obvious place per concern, not feature-doc sprawl.
Per-field table shape (each file)
For every vendor column, document at minimum:
Populate from existing code:
src/lib/import/opengd77/columns.tssrc/lib/import/opengd77/parse.tssrc/lib/export/opengd77/serialise.tssrc/models/codeplug.ts+ data-model docsFeature doc updates
docs/reference/opengd77/row to docs/features/README.md Reference table.Affected
docs/reference/opengd77/(new)docs/features/import/opengd77.mddocs/features/export/README.mddocs/features/README.mdcolumns.ts/ adapter files pointing at the reference (mirror pattern insrc/lib/bands.ts→docs/reference/bands.md).Notes / dependencies
docs/reference/<vendor>/pattern for future formats (e.g.docs/reference/qdmr/later).OpenGD77Codeplugwhere our code is silent.sample-exports/for examples; do not commit operator codeplugs.Out of scope
Workflow note (for whoever picks this up)
Docs-only work: branch from
origin/main, use atomic conventional commits per logical unit (e.g.docs(reference): add opengd77 hub,docs(import): link opengd77 adapter to reference), open a PR linkingCloses #. No progress/outstanding logs needed unless the audit surfaces code bugs worth ticketing.