[h1-request] 同期v2: 識別子(UUIDv4受け入れ)と端末の系列コード #58

Open
opened 2026-10-09 19:56:40 +00:00 by joe · 1 comment
Owner

背景

h1 の各テーブルの主キーは既に UUIDv4。v2 では主キーをそのまま集約 uuid として送る(別途 UUIDv7 を発行して対応表で管理する方式をやめる)。また伝票番号の端末間衝突を防ぐため、端末ごとの系列コードを番号に埋め込む。

依頼内容(ADR-0002 §3・§10)

  • 集約 uuid として UUIDv4 / UUIDv7 の両方を受け付ける(v7 必須の検証があれば緩める)。ADR-0001 期に送られた v7 uuid はそのまま継続
  • POST /api/sync/peers の応答に series_code(テナント内一意・英大文字1〜2文字)を追加。同一端末の再登録では同じコードを返す

受け入れ条件

  • v4 / v7 双方の uuid で push/pull できるテスト
  • series_code の一意性・再登録時の同一性テスト

契約の正本: ADR-0002(ブランチ docs/adr-0002-offline-first-sync-v2。未マージなら先に main へマージしてから着手)
https://git.cyberius.biz/joe/o2/src/branch/docs/adr-0002-offline-first-sync-v2/docs/adr/0002-offline-first-sync-v2.md

h1 側の内部設計(参考): https://git.cyberius.biz/joe/h1-c2/src/branch/main/docs/superpowers/specs/2026-10-09-offline-first-sync-design.md

前提: h1 は本体単体で完全稼働し、o2 接続時のみ同期する。v1(/api/sync/push|pull・/api/sync/corrections*)は h1 の移行完了まで並行稼働を維持すること(v1 を壊さない)。
検証データ: 入出力例を tests/fixtures/sync_v2/*.json に追加する。h1 は同じ fixture を Dart テストで検証する(sales_calculation fixture と同じ運用)。

## 背景 h1 の各テーブルの主キーは既に UUIDv4。v2 では主キーをそのまま集約 uuid として送る(別途 UUIDv7 を発行して対応表で管理する方式をやめる)。また伝票番号の端末間衝突を防ぐため、端末ごとの系列コードを番号に埋め込む。 ## 依頼内容(ADR-0002 §3・§10) - 集約 uuid として UUIDv4 / UUIDv7 の両方を受け付ける(v7 必須の検証があれば緩める)。ADR-0001 期に送られた v7 uuid はそのまま継続 - `POST /api/sync/peers` の応答に `series_code`(テナント内一意・英大文字1〜2文字)を追加。同一端末の再登録では同じコードを返す ## 受け入れ条件 - [ ] v4 / v7 双方の uuid で push/pull できるテスト - [ ] series_code の一意性・再登録時の同一性テスト --- **契約の正本**: ADR-0002(ブランチ `docs/adr-0002-offline-first-sync-v2`。未マージなら先に main へマージしてから着手) https://git.cyberius.biz/joe/o2/src/branch/docs/adr-0002-offline-first-sync-v2/docs/adr/0002-offline-first-sync-v2.md **h1 側の内部設計**(参考): https://git.cyberius.biz/joe/h1-c2/src/branch/main/docs/superpowers/specs/2026-10-09-offline-first-sync-design.md **前提**: h1 は本体単体で完全稼働し、o2 接続時のみ同期する。v1(`/api/sync/push|pull`・`/api/sync/corrections*`)は h1 の移行完了まで**並行稼働を維持**すること(v1 を壊さない)。 **検証データ**: 入出力例を `tests/fixtures/sync_v2/*.json` に追加する。h1 は同じ fixture を Dart テストで検証する(`sales_calculation` fixture と同じ運用)。
Author
Owner

実装完了(o2側)— 識別子(UUIDv4 受け入れ)と端末の系列コード

実装

  • 集約 uuid は UUIDv4 / UUIDv7 を両方受理(既存 UUIDv7 は書き換えない)。UUID形式を意図した不正値のみ rejected_invalid_uuid
  • SyncPeer.series_code を追加。テナント内で一意な英大文字1〜2文字を採番(A..Z→AA,AB…)
  • 再登録(同一 device_id)では同じ series_code を返す(新規払い出ししない)。POST /api/sync/peers 応答・GET /api/sync/peers 一覧に含める
  • migration c1d2e3f4a5b6(既存端末へバックフィル)、fixtures(push_uuid_v4)

インフラ注意: 現在リモートへの git push が SSH タイムアウト(www.cyberius.biz:18)で失敗中。実装はローカル main にマージ済み・o2.db 適用済みで、push は回復後に実施します。回帰確認: 全 6422 passed, 1 skipped。

## 実装完了(o2側)— 識別子(UUIDv4 受け入れ)と端末の系列コード ### 実装 - 集約 `uuid` は **UUIDv4 / UUIDv7 を両方受理**(既存 UUIDv7 は書き換えない)。UUID形式を意図した不正値のみ `rejected_invalid_uuid` - `SyncPeer.series_code` を追加。**テナント内で一意な英大文字1〜2文字**を採番(`A`..`Z`→`AA`,`AB`…) - **再登録(同一 `device_id`)では同じ `series_code`** を返す(新規払い出ししない)。`POST /api/sync/peers` 応答・`GET /api/sync/peers` 一覧に含める - migration `c1d2e3f4a5b6`(既存端末へバックフィル)、fixtures(push_uuid_v4) --- **インフラ注意**: 現在リモートへの git push が SSH タイムアウト(`www.cyberius.biz:18`)で失敗中。実装はローカル main にマージ済み・`o2.db` 適用済みで、push は回復後に実施します。回帰確認: 全 **6422 passed, 1 skipped**。
Sign in to join this conversation.
No labels
h1-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
joe/o2#58
No description provided.