IDX: キー番号の正本としてIDXレイヤーを確定し、MAPの参照をPHYへ移す

キー番号はPHYの幾何からもELCの配線からも導出できない決めごとなので、IDXが正本を持つ。
公開した基板のキー番号は他人のキーマップが依存する公開インターフェースであり、
出力のたびに生成し直さず固定する。

「最も重要な抽象化層」「最も欠けている層」という位置づけは誤りだったので落とした。
QMKのLAYOUTマクロの引数順、ZMKのmatrix transformのmap、KMKのcoord_mappingとして
既に存在していて、形式化されていないだけである。

あわせて2点。MAPはキー番号ではなくPHYのキーIDを参照する(IDXへの挿入でMAPがずれないため)。
IDXの保存形式は order: string[] とし、ELCのLEDChain.orderと同じく並びの位置を番号とする。

phase1-json-schema.md の P-1 を解消。

Journal: journal/2026-09-21-idx-necessity.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-21 08:52:27 +09:00
co-authored by Claude Opus 5
parent fdd3c7def1
commit 2eb2867c13
6 changed files with 263 additions and 54 deletions
+26 -38
View File
@@ -5,11 +5,11 @@
```txt
PHY (物理配置)
├─→ ELC (電気配線)
└─→ IDX (キー識別)
└─→ MAP (キーマップ)
├─→ IDX (キー識別)
└─→ MAP (キーマップ)
```
ELCとIDXはどちらもPHYを参照する。ELCはIDXを参照しない。
ELC・IDX・MAPはどれもPHYを参照する。ELCはIDXを参照せず、MAPもIDXを参照しない。
ファームウェアやVIA/Remap向けの出力は、各レイヤーの情報を統合して生成する。
他レイヤーからキーや部品を指す参照には、PHYのノードIDを使う。
@@ -316,9 +316,10 @@ ELCとIDXはどちらもPHYを参照する。ELCはIDXを参照しない。
## 2. IDXレイヤー JSON Schema
IDXが持つのは、PHYのキーとキー番号の対応だけとする [推測:P-1]。
マトリックス座標(row/col)とLEDの識別番号はここに置かない。どちらも配線で決まる情報で、
row/col はELCの配線から導く派生情報、LEDの番号はELCが正本を持つ。
各フィールドの意味は `IDXレイヤー.md` を正とする。
番号を振るキーの並びだけを持つ。並びの位置がキー番号になるため、欠番・重複・番号の飛びは
構造として起こらない。
### 基本構造
@@ -327,9 +328,9 @@ row/col はELCの配線から導く派生情報、LEDの番号はELCが正本を
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://beyond-kle.org/schemas/idx-layer.json",
"title": "IDX Layer - Key Identification",
"description": "Mapping between PHY keys and key numbers",
"description": "Ordered list of PHY keys; the position in the list is the key number",
"type": "object",
"required": ["version", "phyReference", "keyMap"],
"required": ["version", "phyReference", "order"],
"properties": {
"version": { "type": "string" },
"phyReference": {
@@ -340,27 +341,12 @@ row/col はELCの配線から導く派生情報、LEDの番号はELCが正本を
"checksum": { "type": "string" }
}
},
"keyMap": {
"order": {
"type": "array",
"uniqueItems": true,
"items": {
"$ref": "#/$defs/keyMapping"
}
}
},
"$defs": {
"keyMapping": {
"type": "object",
"required": ["keyId", "index"],
"properties": {
"keyId": {
"type": "string",
"description": "Reference to PHY layer key ID"
},
"index": {
"type": "integer",
"minimum": 0,
"description": "Key number"
}
"type": "string",
"description": "Reference to PHY layer key ID"
}
}
}
@@ -518,6 +504,9 @@ row/col はELCの配線から導く派生情報、LEDの番号はELCが正本を
## 4. MAPレイヤー JSON Schema
キーの参照にはPHYのキーIDを使う。キー番号は参照しない。
配列としての並べ替えは、ファームウェア出力時にIDXの並び順で行う。
### 基本構造
```json
@@ -527,10 +516,10 @@ row/col はELCの配線から導く派生情報、LEDの番号はELCが正本を
"title": "MAP Layer - Keymap Configuration",
"description": "Key code assignments and layers",
"type": "object",
"required": ["version", "idxReference", "layers"],
"required": ["version", "phyReference", "layers"],
"properties": {
"version": { "type": "string" },
"idxReference": {
"phyReference": {
"type": "object",
"required": ["source", "checksum"],
"properties": {
@@ -562,9 +551,12 @@ row/col はELCの配線から導く派生情報、LEDの番号はELCが正本を
},
"keyAssignment": {
"type": "object",
"required": ["keyIndex", "keycode"],
"required": ["keyId", "keycode"],
"properties": {
"keyIndex": { "type": "integer" },
"keyId": {
"type": "string",
"description": "Reference to PHY layer key ID"
},
"keycode": { "type": "string" }
}
}
@@ -577,7 +569,7 @@ row/col はELCの配線から導く派生情報、LEDの番号はELCが正本を
### PHY → IDX変換
1. PHYレイヤーからキーのリストを取得
2. 各キーにキー番号を割り当て
2. 番号を振るキーを選び、並び順を決める
### PHY → ELC変換
@@ -588,7 +580,7 @@ row/col はELCの配線から導く派生情報、LEDの番号はELCが正本を
### IDX + ELC + MAP → ファームウェア出力
1. ELCの配線から、ターゲットが要求する row / col を割り当て
2. キー番号の配列とキーマップ配列の生成
2. IDXの並び順に従って、MAPのキーコードを配列へ並べ替え
3. VIA/QMK形式への出力
## 次のステップ
@@ -600,8 +592,4 @@ row/col はELCの配線から導く派生情報、LEDの番号はELCが正本を
## 未確認事項
### P-1 IDXがキー番号以外に持つものがあるか
- 位置づけ: 本文「2. IDXレイヤー JSON Schema」が前提にしている。IDXには仕様ドキュメントがなく、
決定済みの情報(row/col と LEDの番号はELC)から引き算した最小形として書いている
- 格上げ条件: IDXレイヤーの仕様をユーザーと決め、`IDXレイヤー.md` に書く
(なし)