feat(io): standardize io types and enforce the vocabulary#539
Conversation
schema/io-types.yaml was advisory -- unknown values warned but did not fail CI -- so the vocabulary drifted. Three distinct problems had accumulated: Spelling variants: spdif alongside s/pdif, wordclock and word-clock alongside word clock, aes3 and aes-ebu alongside aes/ebu. A consumer filtering on 'has S/PDIF' silently missed them. Connectors in the type field: Electro-Voice wireless receivers carried type: bnc with connection: bnc, where the ports are in fact RF antenna inputs. type is the signal; connection is the connector. Values too vague to query: audio, analog, digital, other -- 133 ports whose type said nothing the category field did not already say. Fix the data rather than alias it at read time. An alias map makes the wrong value canonical forever and hides the mistake from review, and the 23-value enum was never the right shape for aliasing anyway (contrast categories: 335 canonical + 262 aliases, where synonyms are real). - widen the vocabulary with 10 genuinely missing types - canonicalize 371 ports across 78 hardware entries - promote unknown io types to a hard error (E117) via the Zod IOSchema, matching how signalFlow, category, and position already behave - add the io.type enum to the generated JSON Schema for editor autocomplete Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
🦋 Changeset detectedLatest commit: a561df1 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
WalkthroughThe PR expands and enforces the ChangesIO type standardization
Estimated code review effort: 3 (Moderate) | ~25 minutes Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
schema/CONTEXT.md (1)
808-834: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winUpdate the IO types heading to reflect hard validation.
The list is now enforced by
IOSchema, but the heading at Line 800 still says unknown values produce warnings. Update it to describe E117 failures.Proposed fix
-### IO Types (advisory — unknown values produce warnings) +### IO Types (enforced — unknown values fail validation with E117)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@schema/CONTEXT.md` around lines 808 - 834, Update the IO types heading in the surrounding documentation to state that values outside the IOSchema list trigger E117 validation failures, replacing the outdated warning behavior description while leaving the enumerated IO types unchanged.Source: Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@data/hardware/bastl-instruments-klik.yaml`:
- Around line 27-33: Update the Clock Output entry in the hardware definition to
use the canonical type clock instead of cv/gate, while preserving its
signalFlow, category, connection, maxConnections, and position values.
In `@data/hardware/mackie-dlm12.yaml`:
- Around line 36-57: Update the signal type for the Channel 1 Input entry to mic
and the Channel 2 Input entry to instrument; keep both Channel 2 RCA entries as
line.
In `@docs/VALIDATION_ERRORS.md`:
- Line 291: Update the validation example’s connector value to one listed in
schema/io-connections.yaml, such as 1/4-inch or 1/8-inch, instead of trs; only
use trs if it is first added to the connection vocabulary.
In `@schema/io-types.yaml`:
- Line 47: Update the clock entry in the schema type definitions to describe
only the modular sync/clock pulse signal, removing the 1/8-inch physical
connector reference. Keep connector-specific values assigned through the
connection field rather than type.
---
Outside diff comments:
In `@schema/CONTEXT.md`:
- Around line 808-834: Update the IO types heading in the surrounding
documentation to state that values outside the IOSchema list trigger E117
validation failures, replacing the outdated warning behavior description while
leaving the enumerated IO types unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: cab7cd3b-3944-4687-9e08-a445bb1a2c31
📒 Files selected for processing (86)
.changeset/olive-pandas-attack.mddata/hardware/allen-and-heath-cc-7-cc-10.yamldata/hardware/allen-and-heath-dlive-mixracks.yamldata/hardware/allen-and-heath-dlive-surfaces.yamldata/hardware/allen-and-heath-dx164-w.yamldata/hardware/allen-and-heath-dx168.yamldata/hardware/allen-and-heath-gr4.yamldata/hardware/allen-and-heath-me-u.yamldata/hardware/allen-and-heath-qu-5.yamldata/hardware/allen-and-heath-qu-6.yamldata/hardware/allen-and-heath-qu-7.yamldata/hardware/allen-and-heath-xone24.yamldata/hardware/allen-and-heath-xone43.yamldata/hardware/austrian-audio-pb17.yamldata/hardware/austrian-audio-pg16.yamldata/hardware/bastl-instruments-1983.yamldata/hardware/bastl-instruments-abc.yamldata/hardware/bastl-instruments-aikido.yamldata/hardware/bastl-instruments-basil.yamldata/hardware/bastl-instruments-buddy.yamldata/hardware/bastl-instruments-ciaoii.yamldata/hardware/bastl-instruments-cinnamon.yamldata/hardware/bastl-instruments-citadel-alchemist.yamldata/hardware/bastl-instruments-citadel-fx-wizard.yamldata/hardware/bastl-instruments-citadel-wave-bard.yamldata/hardware/bastl-instruments-crust.yamldata/hardware/bastl-instruments-cv-trinity-exp.yamldata/hardware/bastl-instruments-dark-matter.yamldata/hardware/bastl-instruments-dup-dup.yamldata/hardware/bastl-instruments-dynamo.yamldata/hardware/bastl-instruments-ikarie.yamldata/hardware/bastl-instruments-klik.yamldata/hardware/bastl-instruments-knit-rider.yamldata/hardware/bastl-instruments-kompas.yamldata/hardware/bastl-instruments-kong.yamldata/hardware/bastl-instruments-pizza.yamldata/hardware/bastl-instruments-popcorn-cv-exp.yamldata/hardware/bastl-instruments-popcorn.yamldata/hardware/bastl-instruments-propust.yamldata/hardware/bastl-instruments-quattro-figaro.yamldata/hardware/bastl-instruments-sense.yamldata/hardware/bastl-instruments-servo.yamldata/hardware/bastl-instruments-skis-2.yamldata/hardware/bastl-instruments-softpop.yamldata/hardware/bastl-instruments-solenoid.yamldata/hardware/bastl-instruments-tea-kick.yamldata/hardware/bastl-instruments-timber.yamldata/hardware/bastl-instruments-tromso.yamldata/hardware/bastl-instruments-waver.yamldata/hardware/dbx-166ad.yamldata/hardware/dbx-166xl.yamldata/hardware/dbx-166xs.yamldata/hardware/dbx-2031.yamldata/hardware/dbx-215.yamldata/hardware/dbx-215s.yamldata/hardware/dbx-2215.yamldata/hardware/dbx-266xl.yamldata/hardware/dbx-266xs.yamldata/hardware/dbx-286a.yamldata/hardware/dbx-286s.yamldata/hardware/dbx-376.yamldata/hardware/dbx-386.yamldata/hardware/electro-voice-r300-e.yamldata/hardware/electro-voice-r300-hd.yamldata/hardware/electro-voice-r300-l.yamldata/hardware/electro-voice-re3-bpcl.yamldata/hardware/electro-voice-re3-bpgc.yamldata/hardware/electro-voice-re3-bphw.yamldata/hardware/electro-voice-re3-bpnid.yamldata/hardware/electro-voice-re3-bpol.yamldata/hardware/electro-voice-re3-nd76.yamldata/hardware/electro-voice-re3-nd86.yamldata/hardware/electro-voice-re3-nd96.yamldata/hardware/electro-voice-re3-re520.yamldata/hardware/mackie-dlm12.yamldata/hardware/mackie-dlz-creator.yamldata/hardware/mackie-hr824mk2.yamldata/hardware/mackie-thrash215.yamldata/hardware/mackie-thump15v4.yamldocs/VALIDATION_ERRORS.mdschema/CONTEXT.mdschema/io-types.yamlschema/json/hardware.jsonscripts/generate-json-schemas.tsscripts/lib/error-codes.tsscripts/validate.ts
| - name: Clock Output | ||
| signalFlow: output | ||
| category: audio | ||
| type: trigger | ||
| type: "cv/gate" | ||
| connection: 1/8-inch | ||
| maxConnections: 1 | ||
| position: Top |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n== schema/io-types.yaml ==\n'
sed -n '1,220p' schema/io-types.yaml
printf '\n== data/hardware/bastl-instruments-klik.yaml ==\n'
cat -n data/hardware/bastl-instruments-klik.yaml | sed -n '1,220p'
printf '\n== related Bastl hardware entries ==\n'
for f in data/hardware/bastl-instruments-knit-rider.yaml data/hardware/bastl-instruments-kompas.yaml data/hardware/bastl-instruments-microgranny.yaml; do
if [[ -f "$f" ]]; then
printf '\n-- %s --\n' "$f"
rg -n 'Clock|clock|cv/gate|type:' "$f"
fi
doneRepository: existential-engineering/catalog
Length of output: 5845
Use type: clock for Clock Output.
Clock Output is the sync pulse here, so clock is the correct canonical type; cv/gate is too generic for downstream consumers.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@data/hardware/bastl-instruments-klik.yaml` around lines 27 - 33, Update the
Clock Output entry in the hardware definition to use the canonical type clock
instead of cv/gate, while preserving its signalFlow, category, connection,
maxConnections, and position values.
| type: line | ||
| connection: combo jack | ||
| maxConnections: 1 | ||
| position: Bottom | ||
| - name: Channel 2 Input | ||
| signalFlow: input | ||
| category: audio | ||
| type: audio | ||
| type: line | ||
| connection: combo jack | ||
| maxConnections: 1 | ||
| position: Bottom | ||
| - name: Channel 2 RCA Left | ||
| signalFlow: input | ||
| category: audio | ||
| type: audio | ||
| type: line | ||
| connection: rca | ||
| maxConnections: 1 | ||
| position: Bottom | ||
| - name: Channel 2 RCA Right | ||
| signalFlow: input | ||
| category: audio | ||
| type: audio | ||
| type: line |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## target file\n'
git ls-files 'data/hardware/mackie-dlm12.yaml'
wc -l data/hardware/mackie-dlm12.yaml
sed -n '1,140p' data/hardware/mackie-dlm12.yaml | cat -n
printf '\n## io type vocabulary\n'
git ls-files 'schema/io-types.yaml' 'schema/io-connections.yaml'
sed -n '1,220p' schema/io-types.yaml | cat -n
printf '\n--- connections ---\n'
sed -n '1,220p' schema/io-connections.yaml | cat -n
printf '\n## search for related mackie DLM entries\n'
rg -n "mackie-dlm12|DLM12|Channel 1 Input|Channel 2 Input|RCA Left|RCA Right" data/hardware schema -SRepository: existential-engineering/catalog
Length of output: 14923
🏁 Script executed:
#!/bin/bash
set -euo pipefail
printf '\n## target file around io entries\n'
sed -n '20,90p' data/hardware/mackie-dlm12.yaml | cat -n
printf '\n## canonical io type values\n'
python3 - <<'PY'
import yaml, pathlib
p = pathlib.Path('schema/io-types.yaml')
data = yaml.safe_load(p.read_text())
print(data)
PY
printf '\n## similar combo-jack modeling in hardware entries\n'
rg -n "connection: combo jack|type: mic|type: instrument|type: line" data/hardware -g '*.yaml' -S | head -n 120Repository: existential-engineering/catalog
Length of output: 10096
🏁 Script executed:
#!/bin/bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import yaml, re
target = Path('data/hardware/mackie-dlm12.yaml')
data = yaml.safe_load(target.read_text())
print('TARGET NAME:', data.get('name'))
for io in data.get('io', []):
print(io.get('name'), '|', io.get('signalFlow'), '|', io.get('category'), '|', io.get('type'), '|', io.get('connection'))
print('\nSIMILAR ENTRIES WITH COMBO JACKS:')
for path in Path('data/hardware').glob('*.yaml'):
if path.name == 'mackie-dlm12.yaml':
continue
try:
d = yaml.safe_load(path.read_text())
except Exception:
continue
ios = d.get('io') or []
combo = [io for io in ios if io.get('connection') == 'combo jack']
if combo:
print(path.name, '=>', d.get('name'))
for io in combo[:5]:
print(' ', io.get('name'), '|', io.get('type'), '|', io.get('connection'))
PYRepository: existential-engineering/catalog
Length of output: 21858
🌐 Web query:
Mackie DLM12 channel 1 mic line channel 2 Hi-Z line documentation
💡 Result:
The Mackie DLM12 loudspeaker features two versatile input channels with distinct capabilities for microphones, line-level signals, and instruments [1][2][3]. Channel 1 Channel 1 is equipped with a female XLR/TRS combo input [1][3]. It features a Mic/Line switch that allows you to optimize the input sensitivity for either microphone-level or line-level signals [4][2][3]. The input impedance is 3.3 kΩ (balanced) for the Mic setting and 20 kΩ (balanced) or 10 kΩ (unbalanced) for the Line setting [5][3][6]. Channel 2 Channel 2 includes a female XLR/TRS combo input and dual RCA phono inputs [3]. The 1/4" TRS input on this channel is specifically designed as a Hi-Z (high-impedance) input for instruments [7][5][3]. The input impedance for the Hi-Z instrument input is 1 MΩ (unbalanced), while the XLR line input is 20 kΩ (balanced) and 10 kΩ (unbalanced) [5][3][6]. The RCA inputs have an impedance of 25 kΩ (unbalanced) [5][3][6]. Users can select whether the Thru output carries only the Channel 1 signal or a mix of both channels using the Ch 1/Mix switch [2][3].
Citations:
- 1: https://mackie.manymanuals.com/audio-mixers/dlm12/owners-manual-43908
- 2: https://mackie.com/img/file_resources/DLM8_12_12S_QSG.pdf
- 3: https://www.idjnow.com/mackie-dlm12-2000-watt-12-full-range-powered-loudspeaker.html
- 4: https://www.manualslib.com/products/Mackie-Dlm12-2981879.html
- 5: https://mcgrp.ru/files/viewer/989814/22
- 6: https://www.gear4music.ie/PA-DJ-and-Lighting/DISC-Mackie-DLM12-12-Active-PA-Speaker/MNK
- 7: https://mackie.com/img/file_resources/DLM8_12_SS.pdf
🌐 Web query:
Mackie DLM12 user guide mic line Hi-Z inputs
💡 Result:
The Mackie DLM12 loudspeaker features an integrated mixer with two distinct input channels [1][2]. Each channel has specific capabilities for microphones, line-level signals, and instruments: Channel 1 This channel is equipped with an XLR/TRS combo input [3]. It features a mic/line switch that adjusts the input sensitivity [1]. When the switch is depressed (Mic), it provides an additional 30 dB of gain, which is designed to optimize the input for microphones [2]. If you are connecting a line-level signal (such as a mixer output), the switch should be in the OUT position [2]. Channel 2 This channel is designed for instruments and line-level sources [1][2]. It includes: - A 1/4" TRS input, which functions as a Hi-Z (high-impedance) instrument input suitable for guitars, basses, and other high-impedance devices [4][5]. - RCA connectors for stereo line-level signals [1][6]. For further details, refer to the official Mackie DLM8 and DLM12 Owner's Manual [7][8].
Citations:
- 1: https://mackie.com/img/file_resources/DLM8_12_12S_QSG.pdf
- 2: https://mcgrp.ru/files/viewer/989814/5
- 3: https://mackie.manymanuals.com/audio-mixers/dlm12/owners-manual-43908
- 4: https://mackie.com/img/file_resources/DLM8_12_SS.pdf
- 5: https://www.thedjshop.co.uk/mackie-dlm12.html
- 6: https://www.adorama.com/mackie-dlm12-2000w-12-inch-powered-loudspeaker/p/madlm12
- 7: https://mackie.com/img/file_resources/DLM8_12_OM.pdf
- 8: https://www.manualslib.com/manual/543351/Mackie-Dlm12.html
Use the primary input modes here
Channel 1 should be mic and Channel 2 should be instrument; keeping both as line drops the supported mic and Hi-Z instrument modes from the catalog. The RCA inputs remain line.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@data/hardware/mackie-dlm12.yaml` around lines 36 - 57, Update the signal type
for the Channel 1 Input entry to mic and the Channel 2 Input entry to
instrument; keep both Channel 2 RCA entries as line.
Source: Path instructions
|
|
||
| **Common mistakes:** | ||
|
|
||
| - `bnc`, `xlr`, `trs` -> connectors, not signals. Put them in `connection` and give `type` the actual signal (`rf`, `line`, `mic`) |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
rg -n '(^|[[:space:]])trs([[:space:]]|$)' schema/io-connections.yaml schema/CONTEXT.mdRepository: existential-engineering/catalog
Length of output: 169
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Find the docs section and the connection vocabulary sources.
git ls-files | rg '^(docs/VALIDATION_ERRORS\.md|schema/(io-connections\.yaml|CONTEXT\.md))$'
echo '--- docs/VALIDATION_ERRORS.md (around line 291) ---'
sed -n '280,305p' docs/VALIDATION_ERRORS.md
echo '--- schema/io-connections.yaml ---'
cat -n schema/io-connections.yaml | sed -n '1,220p'
echo '--- schema/CONTEXT.md ---'
cat -n schema/CONTEXT.md | sed -n '1,220p'Repository: existential-engineering/catalog
Length of output: 7905
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Check whether trs is used anywhere else as an accepted connection value or just informal wording.
rg -n --hidden --glob '!*.git' '\btrs\b' .Repository: existential-engineering/catalog
Length of output: 5903
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo '--- W121 / connection validation references ---'
rg -n 'W121|connection.*warning|unknown values generate warnings|io-connections|trs' schema docs data -g '!**/*.png'
echo '--- schema files with connection-related enums ---'
fd -a 'io-.*connections.*|validation.*|errors.*' schema docsRepository: existential-engineering/catalog
Length of output: 7118
Use a listed connector value here. trs isn’t in schema/io-connections.yaml, so this example would shift from E117 to W121. Use a canonical value such as 1/4-inch/1/8-inch, or add trs to the connection vocabulary first.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/VALIDATION_ERRORS.md` at line 291, Update the validation example’s
connector value to one listed in schema/io-connections.yaml, such as 1/4-inch or
1/8-inch, instead of trs; only use trs if it is first added to the connection
vocabulary.
Source: Path instructions
| # Control types | ||
| - expression | ||
| - cv/gate | ||
| - clock # modular sync/clock pulse (1/8-inch), distinct from `word clock` |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win
Keep the clock type connector-agnostic.
type describes the signal/function, while connection owns physical connector values. Mentioning 1/8-inch here can encourage connector-specific classifications.
Proposed fix
- - clock # modular sync/clock pulse (1/8-inch), distinct from `word clock`
+ - clock # modular sync/clock pulse, distinct from `word clock`; connector belongs in `connection`📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - clock # modular sync/clock pulse (1/8-inch), distinct from `word clock` | |
| - clock # modular sync/clock pulse, distinct from `word clock`; connector belongs in `connection` |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@schema/io-types.yaml` at line 47, Update the clock entry in the schema type
definitions to describe only the modular sync/clock pulse signal, removing the
1/8-inch physical connector reference. Keep connector-specific values assigned
through the connection field rather than type.
Source: Path instructions
befaco-vcmc-2 carried a midi port with connection '5-pin DIN'; the canonical spelling is '5-pin din'. The casing variant made the device invisible to consumers filtering for MIDI DIN ports. Connection drift is broader than this (31 off-vocabulary values across 324 ports: trs/trs-male/trs-female, rj45/rj-45, etherCON/ethercon). That needs the same data-fix-plus-enforce treatment this PR gives io types, and is tracked separately. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Apply verified CodeRabbit findings from #539: Bastl Klik clock output uses type clock; Mackie DLM12 channel 1 is mic and channel 2 is instrument (per owner's manual); io-types clock comment drops the connector reference; docs no longer suggest trs as a connection value; CONTEXT.md and CLAUDE.md reflect that io type is enforced via E117. Expand the connection vocabulary with usb-b-mini (verified against the Bastl Klik manual), canonicalize mini-usb on the Artiphon INSTRUMENT 1, and canonicalize trs/minijack on the Xone:43 to 1/4-inch and 1/8-inch. Encode the expansion policy in CLAUDE.md: verified new values grow the schema instead of being force-fit onto near-miss values. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Summary
schema/io-types.yamlwas advisory — unknown values warned but did not fail CI — so the vocabulary drifted. Found while addingioto the web index (#538).This fixes the data and closes the door, rather than aliasing the drift away at read time.
Three distinct problems had accumulated
1. Spelling variants.
spdifalongsides/pdif;wordclockandword-clockalongsideword clock;aes3andaes-ebualongsideaes/ebu. A consumer filtering on "has S/PDIF" silently missed them.2. Connectors in the
typefield. Electro-Voice wireless receivers carriedtype: bncwithconnection: bnc— but those ports are named "Antenna A (Diversity)". They're RF antenna inputs.typeis the signal;connectionis the connector. 24 ports.3. Values too vague to query.
audio,analog,digital,other— 133 ports whosetypesaid nothing thecategoryfield didn't already say.Why fix the data instead of aliasing it
An earlier revision of #538 normalized these in the index builder. That was wrong, and it's been removed:
build-sqlite.tsdoesn't normalize I/O types, so patching only the index would makecatalog.sqliteandcatalog-index.jsondisagree about port types.bncwould have permanently enshrined a connector as a signal type.Changes
rf,hdmi,video,gpio,insert,clock,bluetooth,wifi,ground,proprietary. These fixed 89 files with zero data edits — the data was right, the schema was incomplete.clock(modular 1/8" sync) is deliberately distinct fromword clock(BNC digital clock distribution).IOSchema— matching howsignalFlow,category, andpositionalready behave.io.connectionstays advisory (it has its own drift; separate cleanup).io.typeenum to the generated JSON Schema for editor autocomplete.docs/VALIDATION_ERRORS.md.The error is actionable:
Test plan
pnpm validateon a clean tree — exit 0, all files passtype: bnc-> fails withE117, suggests a fixtype: spdif-> fails withE117, suggestss/pdifQuery impact (combined with #538)
bnc)Follow-ups
io-connections.yamlis still advisory and likely has the same problem.Summary by CodeRabbit