決策者 2026-09-27 裁:「資料庫應統一存 UTC」,並裁「這次就修」——進 b4。 來源:FR-114 第 9 棒 b3 總測回報 #16(CM-2231)、CM-2234 拆出、CM-2245 過渡不再需要。
timestamp without time zone(public 31 表 65 欄/compliance 20 表 51 欄/survey 10 表 21 欄/oscal 2 表 3 欄)。這種欄位存的數字沒有時區概念,寫入端用什麼時間就存什麼,讀取端只能「假設」它是某時區。remote_agents.last_seen_at、review_marks.reviewed_at;jedi-iam 改密碼兩張待 .1 真機核。原判 flow-engine 三張為 UTC 是 DEV 舊開發庫特例,安裝版實為本地寫入)。jedi_common/session/database/db_mw.py:to_local() 對 naive 一律當 UTC 轉 Asia/Taipei → 本地時間寫入的表畫面多 8 小時(b3 總測 #16)。所有時間欄位改 timestamp with time zone(timestamptz)。PostgreSQL 內部一律以 UTC 儲存,讀出依連線時區自動轉;Python 端一律用 aware datetime。之後不再有「naive 當什麼時區」的邏輯,db_mw.to_local() 的 naive 分支可刪。
db_mw.to_local() 刪 naive 分支;grep 全 monorepo datetime.utcnow/naive datetime.now() 寫入改 datetime.now(timezone.utc);ORM DateTime 改 DateTime(timezone=True);CM-2245 的過渡邏輯拆掉;守衛測試「全庫不得再有 timestamp without time zone」。每張子卡固定步驟:
information_schema 列出該 schema 的欄位,逐欄判斷寫入端是本地還是 UTC(grep model default/server_default/寫入程式),列表進卡。ALTER TABLE t ALTER COLUMN c TYPE timestamptz USING c AT TIME ZONE '<Asia/Taipei 或 UTC>',依上一步逐欄選。只套 DEV。表屬套件的 migration 放該套件 migrations/,主線表放 scripts/sql/(先看既有放法)。date_trunc/::date 比較引用這些欄位的,git grep 欄位名確認型別改動後語意不變(view 與 SQL 字串是守衛盲區)。TZ 改成 UTC 重啟後畫面時間仍正確(驗不綁時區)。scripts/init/02-schema.sql)。--upgrade 時自動套;舊資料依表逐欄正確轉換。見 FR-114-LOG.md 第 9 棒與 CM-2231 #16/CM-2234/CM-2245。
db_mw.to_local() 不刪,改成「aware UTC → 顯示時區」;顯示時區單一來源(設定/TZ,預設 Asia/Taipei),留 get_display_tz(user_context) 介面給 profile 接。只刪 naive 分支。