Files
2meet-data-optimizer/docs/adr-002-dual-write-naming-collision.md
T
wpdev b63ab46f54
Tests / Integration Tests (push) Successful in 1m11s
Tests / Unit Tests (push) Failing after 11m56s
Anti-EAV Lint + Quality Gate / anti-eav-lint (push) Failing after 12m7s
Tests / PHPStan (push) Failing after 14m37s
Tests / PHPCS (push) Failing after 14m46s
Tests / PHP Lint (push) Failing after 14m57s
docs: 移植 readme.txt / CONTEXT.md / docs(backport A v3.4.6)
- readme.txt(WP 外掛目錄格式,隨 ZIP 發佈):Stable tag 對齊 1.0.0,
  changelog 補 1.0.0 條目
- CONTEXT.md(領域詞彙表):Status 區塊改寫為 v1.0.0 實況;
  HPCT_INTERCEPTORS 與 HivePress Adapter 兩節標註「已搬到 AddOn,核心無此常數」
- docs/:ENTITY_ADAPTER_COOKBOOK、2 篇 ADR、INTEGRATION_PATTERN_DECISION、
  anti-eav-lint.yml.template
  - cookbook 修掉兩個死連結(ANTI_EAV_PLAYBOOK 在來源外掛就不存在)
  - INTEGRATION_PATTERN_DECISION 加 v1.0.0 後記:結論已被 AddOn 拆分取代
  - template 改 wpdev/2meet-data-optimizer + ref v1.0.0 + wp tmdo lint
- README.md 文件索引補上以上 7 個檔案

前綴改寫刻意只動類別/函式/slug(WPDO_→TMDO_、wp-data-optimizer→2meet-...),
wpdo_ option/cron/hook/表名與 wpdo/v1 REST namespace 一律保留 —— 這是資料層
零遷移的前提。
2026-07-31 10:06:03 +08:00

2.5 KiB

ADR-002: Acknowledge 'dual_write' naming collision between Mode_Manager and Feature_Flags FSMs

Status: Accepted — deferred rename
Date: 2026-05-15
Deciders: wpdev


Context

Two distinct FSMs in the codebase both use the string 'dual_write':

FSM Class Constant Stored in Semantics
Entity Bridge TMDO_Mode_Manager MODE_DUAL_WRITE wpdo_bridge_modes Writes go to both UAE flat table AND wp_*meta
Zone Migration TMDO_Feature_Flags STATUS_DUAL_WRITE wpdo_features Writes go to both Zone A/B/C table AND wp_postmeta

The two FSMs are orthogonal — a post type can be in Zone dual_write (actively migrating) while the Entity Bridge is in aeav_only mode, or vice versa. The collision was introduced when the Entity Bridge FSM was added in v2.5.x alongside the pre-existing Zone Migration FSM.


Decision

Defer the rename. Document the collision instead.

Renaming either constant (e.g. Mode_Manager → bridge_dual) would require:

  1. Updating ~85 call sites across 30+ files.
  2. Writing a DB migration to translate stored option values ('dual_write''bridge_dual' in wp_options['wpdo_bridge_modes']).
  3. Updating all WP-CLI commands that accept mode strings as user input.
  4. Updating all admin UI dropdowns and confirmation messages.
  5. Handling sites that run the old code against a DB that has already been migrated (or the reverse — new code on an un-migrated DB).

The risk of introducing bugs via a mechanical rename outweighs the naming improvement at the current stage of the project.

The collision is mitigated by:

  • A disambiguating docblock in class-tmdo-mode-manager.php (added 2026-05-15)
  • This ADR, which explains the overlap to future developers
  • The two FSMs operating on different option keys and being unreachable from each other's code paths

Consequences

  • Future rename path: When a DB migration is warranted (e.g. alongside another schema change), rename MODE_DUAL_WRITE → 'bridge_dual' and add a migration in TMDO_Installer::maybe_upgrade() that rewrites the stored string.
  • Linter: If PHPStan or a custom rule ever flags string literal comparisons across FSMs, this ADR is the canonical explanation for why the overlap is intentional.

  • includes/engine/class-tmdo-mode-manager.php — naming note in class docblock
  • includes/class-tmdo-feature-flags.php — Zone FSM (7 states)
  • P1-10 from full-review report (2026-05-15)