Consistency Audit: resource-selection / OOA

  • 修改文件resource-selection.ooa.md
  • 修改日期:2026-06-15
  • 編輯者:Alan
  • Diff 摘要:新建 resource-selection OOA(跨 feature 共用),完成 Step 1–3;其中子圖 A 宣告對 domain-model 的結構 deltaResource flat→abstract base + 4 子類 + type())與 N2ResourcePoolfindById())。Step 3 SOLID 四檢點全判、patterns 裁定不新增。
  • Audit 觸發時點:簽核前(mid-stage edit,路徑 B)

本份為前瞻式 audit:子圖 A/N2 的 delta 尚未套進 domain-model.ooa.md(該檔現行 diff 僅表格排版),僅在本 OOA 內「宣告」為待辦。故下游影響評估的是「若接受本 OOA,會逼 domain-model 與其已落地 code 做什麼」。


上游一致性

本 OOA 上游=已簽核的 resource-selection.fp.md(Stage 2,跨 feature 共用 Published Language)。走 workflow §3b(修改 OOA)的上游範圍。

項目狀態說明
Model 服務所有 Use Case§5 對照完整:UC-A→matchByCapability、UC-B→resolveByAssignment、UC-C→pruneByCoupling、UC-D→NoCapableResourceException§RS-FS-1~9 皆有對應(§RS-FS-7 無產能型別、§RS-FS-8 跨型別組合刻意不建模,一致)
resourceSelectionPriority 命名FS §RS-FS-9 欄名 → RankedResource.resourceSelectionPriority: int,一致(含刻意避開 RCS prioritySeq
引入未提概念(技術 vs 業務)ResourceSelector/兩 port/ResourceType/各 VO 均為實作 FS 行為的技術抽象,未引入新業務概念
N1 — declaredTypes() 放置(§RS-FS-6「有宣告才回、不反推」)2026-06-15 已裁定:受限型別(模具/操作員/技師)的「宣告」唯一合法來源即限制/指派設定——沒設限制即未宣告、不回(domain 規則:工廠未限定「哪支模具由誰更換」時不回技師才正確);機台為無條件 baseline、不經宣告閘。故 declaredTypes() 從設定推為 domain 本來形狀,非耦合。採選項 (a) 維持現行設計。
N3 — ResourceCouplingQuery 為 consumed port(§CAP-UR-62026-06-15 確認:維持 consumed port;capacity-module OOA 接著做,屆時兩邊對齊(follow-up,非矛盾)

需討論項目

(無遺留 —— N1、N3 已於 2026-06-15 對話中裁定)

矛盾項目

(上游無 ❌)


下游影響

resource-selection 自身無 pseudo/code(待建立,非引用失效)。真正下游=子圖 A 改動的是 domain-model 這個 sibling 共用 OOA,且其已落地為 code(消費 domain-model/spec-v1,SHA e01cacf)。

下游文件受影響章節行動
domain-model.ooa.md§DM-OA-4 Resource flat→abstract + type() + 4 子類(Published Language 結構改動)需更新 + 重打 domain-model/spec-v2
domain-model.ooa.md§DM-OA-9 ResourcePoolfindById()(N2,純附加)需更新(附加,不破既有)
…/com/agilelean/scheduling/domain/Resource.javapublic final classabstract + type() + ResourceType enum + 4 子類需更新
…/com/agilelean/acl/scheduling/in/ResourcePoolMapper.java 第 63 行new Resource(ResourceId.of(entry.getKey()), …) —— abstract 後無法編譯,建構須改為某子類(ACL inbound 須建 legacy 資料→子型別對照)需更新(矛盾來源,見下
…/com/agilelean/scheduling/fixture/ToyFixtures.java 第 130 行new Resource(ResourceId.of(id), …) 測試 fixture,同樣失效需更新 + 測試重跑
…/com/agilelean/scheduling/domain/ResourcePool.javafindById()(N2,附加)需更新(附加,不破既有)
docs/refactor/scheduling/SPEC-REF.md引用版本表 domain-model/spec-v1v2需更新

矛盾項目(❌,擋 OOA 簽核)

  1. 子圖 A note「粗排 code 不動(§RS-UR-9)」與下游 code 事實矛盾 — OOA 子圖 A 標註「粗排(已 coding)吃 base 視角、List<Resource> 不變 → code 不動」。讀取視角部分屬實eligible()resources()canPerform() 皆未動);但 Resource 由 concrete finalabstract 會讓 2 處 new Resource(...) 建構點無法編譯 —— ResourcePoolMapper.java:63(main,ACL inbound)與 ToyFixtures.java:130(test)。故「code 不動」不成立。

    註:本條為「OOA 對自身衝擊範圍的標註與 code 事實不符」,非評論設計對錯(audit 不評論設計)。標註與事實須對齊方可簽核。


建議行動清單

  • 處理矛盾項目 1(必達,擋簽核):由人(OOA 邊界)擇一方向—— (1) 標註誠實化:將 §RS-UR-9 從「code 完全不動」修正為「讀取視角不動、建構點需配合升 tag 改子類」,並列為 code repo 消費 domain-model/spec-v2 時的實作工項;或 (2) 改設計降衝擊:重新考慮子圖 A 的 abstract 化(如 type() 改吃欄位)——但此舉回退 Step 3 已拍板的 Fork 1b(保留子類階層)。
  • N1 採選項 (a):開 object-oriented-analysis-partner,於 OOA 補一句「機台為無條件 baseline、declaredTypes() 只管模具/操作員/技師」的模型澄清(清晰度,不擋)。
  • (v2 落地交接約束) 待時機成熟推進到 domain-model/spec-v2 時,code 端落地須為手術式最小範圍重構:僅限「Resource 升 abstract + 新增 4 子類 + type()ResourceType」與上述 2 處建構點改子型別 + N2 附加 findById()禁止波及讀取視角(eligibleresourcescanPerformList<Resource> 消費鏈)與既有粗排行為。驗收點:diff 範圍應可一一對應本表「需更新」列,超出即視為過度修改。
  • N2:domain-model OOA §DM-OA-9 + code ResourcePool.findById() 為純附加,隨 v2 一併落地。
  • capacity-module OOA:補做以對齊 §CAP-UR-6(N3 follow-up)。

統計

  • ✅ 5 | ⚠️ 0 | ❌ 1
  • 下游受影響點:7
  • 簽核擋判定:(❌ = 1)

簽核

  • 編輯者已跑過 audit:Alan / 日期 2026-06-15
  • AI 產出 Impact Report:consistency-audit skill / 2026-06-15
  • Reviewer 確認:____ / 日期 ____

❌ 矛盾項目 1 未處理前,本 audit 不應簽核通過;resource-selection OOA 的 Exit Gate 簽核應同步等待。 下游更新(domain-model OOA、code repo)由各階段對應的 partner skill/code repo /refactor-acl 執行,本 audit 不開處方。