[h1-request] 同期v2: マスタ申請と無人モード(自動承認) #56

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

背景

共有マスタ(顧客・商品・カテゴリ・仕入先)は o2 を正とし、h1 の変更は「申請」とする。o2 が無人でも業務が止まらないよう、自動承認の無人モードを設ける。h1 は申請中もローカルで仮反映して使い続ける。

依頼内容(ADR-0002 §8)

  • テナント設定 master_review_mode: manual / unattended(既定 unattended)
  • push 応答: pending_review / accepted / held
  • 無人モードの判定:
    • 新規 → 自動承認。既存と類似(正規化名の類似度 ≥ 0.82、同一バーコード、同一 code)なら held
    • 変更 → 自動承認。申請の base_rev 以降に o2 側で同じ項目が変更されていれば held
    • 削除 → 自動承認しない。伝票から未参照なら論理削除のみ自動、参照ありは held
  • held 一覧画面(承認/却下)
  • pull に master_decision(approved+正規データ / rejected / held)

受け入れ条件

  • 判定表の全パターンにテストと fixture
  • manual / unattended の切替テスト
  • 却下・承認が pull で配信される

契約の正本: 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 と同じ運用)。

## 背景 共有マスタ(顧客・商品・カテゴリ・仕入先)は o2 を正とし、h1 の変更は「申請」とする。o2 が無人でも業務が止まらないよう、自動承認の無人モードを設ける。h1 は申請中もローカルで仮反映して使い続ける。 ## 依頼内容(ADR-0002 §8) - テナント設定 `master_review_mode`: `manual` / `unattended`(**既定 `unattended`**) - push 応答: `pending_review` / `accepted` / `held` - 無人モードの判定: - 新規 → 自動承認。既存と類似(正規化名の類似度 ≥ 0.82、同一バーコード、同一 `code`)なら `held` - 変更 → 自動承認。申請の base_rev 以降に o2 側で同じ項目が変更されていれば `held` - 削除 → 自動承認しない。伝票から未参照なら論理削除のみ自動、参照ありは `held` - `held` 一覧画面(承認/却下) - pull に `master_decision`(`approved`+正規データ / `rejected` / `held`) ## 受け入れ条件 - [ ] 判定表の全パターンにテストと fixture - [ ] manual / unattended の切替テスト - [ ] 却下・承認が pull で配信される --- **契約の正本**: 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側)— マスタ申請と無人モード

実装

  • MasterRequest(new/update/delete、pending/accepted/held/rejected)+ テナント設定 SyncSetting.master_review_mode(manual/unattended、既定 unattended)
  • 無人モード判定: 新規=自動承認(ただし正規化名類似 ≥0.82 / 同一 code・バーコードで held)/変更=自動承認(base_rev 以降に o2 が同一項目を変更していれば held)/削除=参照なしは論理削除のみ自動・参照ありは held
  • push 応答に accepted/pending_review/held を統合、pull に master_decision
  • API: GET /api/sync/v2/master-requests、POST .../{id}/approve|reject、GET/PUT /api/sync/v2/settings
  • Web UI /sync-master-requests(承認/却下・無人モード切替)
  • migration c56a1b2c3d4e、fixtures(master_decision)

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

## 実装完了(o2側)— マスタ申請と無人モード ### 実装 - `MasterRequest`(new/update/delete、pending/accepted/held/rejected)+ テナント設定 `SyncSetting.master_review_mode`(`manual`/`unattended`、**既定 unattended**) - **無人モード判定**: 新規=自動承認(ただし正規化名類似 ≥0.82 / 同一 code・バーコードで `held`)/変更=自動承認(`base_rev` 以降に o2 が同一項目を変更していれば `held`)/削除=参照なしは論理削除のみ自動・参照ありは `held` - push 応答に `accepted`/`pending_review`/`held` を統合、pull に `master_decision` - API: `GET /api/sync/v2/master-requests`、`POST .../{id}/approve|reject`、`GET/PUT /api/sync/v2/settings` - Web UI `/sync-master-requests`(承認/却下・無人モード切替) - migration `c56a1b2c3d4e`、fixtures(master_decision) --- **インフラ注意**: 現在リモートへの 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#56
No description provided.