FR-049.1 問卷顯示條件(目標側重構)— 收尾 SUMMARY(2026-07-18)

狀態:四段鏈全收、user 手測通過、jedi-survey 0.0.27 已發 Nexus、pin 已還原。 三 repo commits 全數落 feature/v1.8.1-test-regression未 push(等 user 上版)。

§1

為何做

FR-049(來源側 goto)四段完成後被 user 手測推翻模型——來源側四瑕疵(隱式副作用/漏網坑/零全局視圖/心智模型錯位)。FR-049.1 翻轉為目標側 display_condition(業界主流),趁未部署零遷移成本。實作期間 user 三輪手測又追加 7 個決策(7~13),最終形態=目標側資料模型 + 雙入口 UI(目標側顯示條件區+來源側跳題精靈,同一份資料)。

§2

行為差異(相對 FR-049 來源側)

  • 規則掛目標(題目/題組本體 display_condition JSONB)非來源選項;null=恆顯示;未作答=顯示、已作答才比對 answers 集合。
  • 來源題型 radio+dropdown(決策 8);子題不吃自身條件、顯示跟隨母題(決策 9:僅 FE 隱藏入口、BE 能力保留)。
  • Designer:條件 badge 全文化(「當 X=『A』或『B』時顯示」)、來源題選項尾端反向提示、雙入口統一詞根;母題卡「+新增延伸題」(題號自動 AC-1-N)取代父題目下拉。
  • 填答端:改答即時重算、選項尾端「+將增加 N 題」;稽核端快照換新形狀 [{target_type,target_uid,source_question_uid,answers}],舊 goto 快照/null 全可見 fallback。
  • 與 jedi-common 翻譯 bug 零耦合(display_condition 不入 translatable_fields,讀寫走主表)——FR-049 goto 掛 options 依賴 bug 副作用的耦合已解除。
§3

Commits(三 repo,未 push)

BEfeature/v1.8.1-test-regression):

  • af2afd1b design 開案(前棒)/ 677db118 決策7,8 / a453114a 決策9,10 / d1d5a0c6 決策9二修 / 2c5e4690 決策11,12,13
  • 4b985c9e 段① serializer+migration / 68e5c580 段② null-清除 / d090e496 段④ 快照抽取 / 6eccf7ce FR-049 plan 實測歸檔
  • (同支 branch 另有 cd048f39 FR-050 開案、7e754e0d pin 0.0.27 還原)

FEcc03aae 段② Designer 全套 / 6371cd7 段③ 引擎+UX 11/12/13(另 a36215f 規劃頁效能修,非本案)

jedi-surveyec03f6e 段① / dbfa998 段② dropdown / 5118f98 release 0.0.27

§4

發版與部署狀態

  • jedi-survey 0.0.27 已發 Nexus(whl+tar.gz);主專案 pin ==0.0.27、path 還原、symlink 已清(realpath 驗證)。
  • jedi repo git push 卡 gitlab.com 認證(指揮官環境無憑證)——3 commits 在本地,user 需自行 push。
  • Migration2026-07-18-fr0491-display-condition.sql(兩表 display_condition 欄)+ 2026-07-18-fr049-flow-rules-snapshot.sql(快照欄)DEV 已套、STG/POC 未套——隨下次部署必排。
  • DEV 殘留 25 題舊 goto 鍵=inert 死鍵(新引擎不讀),不清理。
§5

測試證據

  • jedi-survey pytest 82 passed(display_condition 18+2 案);BE 快照抽取 7 案;FE 引擎 15 案(throwaway);user 四輪手測(段②×2/段③/段④)全過。
  • E2E 未做——舊 goto 場景已止損,重派待辦(見 follow-up)。
§6

Follow-ups

  1. E2E 重派(最優先)已收案,見下方「E2E 收尾(2026-07-19)」
  2. 頁面 spec 更新(收尾漏做項):docs/specs/v1.8.0/survey/survey-v2-designer.md + survey-v2-fill.md 需反映 display_condition 模型(走 writing-feature-specs skill)。
  3. jedi-common 翻譯 bug 修復批(issue 已開)——修復者必回歸跳題(耦合警告在 FR-049 plan §0-a-2)。
  4. STG 套兩支 migrationSTG 已套(2026-07-19 上版時,含 perf-fk-indexes 共三支,對帳綠);POC 未套(隨 POC 部署日);jedi repo push(仍待 user)。
§7

補丁批增補(2026-07-18 夜間,上版前 user 手測揪出)

修正 Commit 說明
snapshot 複製鏈漏 display_condition + uid 重映射 jedi e1d1df8 填寫走 snapshot 問卷、clone 未帶條件→跳題全失效;補複製+source_question_uid 重映射(懸空→null+warning)。教訓:新欄位落地必 grep 全部 clone/copy 路徑
題數提示改靜態計數(決策 15) FE a006638 what-if 動態 diff 在「未作答=顯示」語意下恆 0,改靜態反向索引
歷史紀錄清單存檔後不更新 FE 0985858 既有 bug(v1.8.2 基準已在):checkpoint 後與開 sidebar 補 loadHistories
條件答案欄反面提示(決策 14 防呆) FE 94a3373 三處答案 MultiSelect 加「未勾選的答案作答時將隱藏」即時提示
jedi-survey 0.0.28 發版 jedi 0966ed5 / BE pin f9ed30c1 0.0.27 含 snapshot 缺陷即廢,0.0.28 為上版版本;Nexus 已發、pin 已還原、symlink 已清

語意備忘(user 確認過的理解):「未作答=顯示;答了才篩」——有條件的題在來源題未作答前照常顯示,作答且未命中才隱藏。

§8

E2E 收尾(2026-07-19)

E2E 重派已交付並驗收完成,test repo commit 902709c(site-regression 套件):

  • survey-v2-designer.feature 新增 5 場景:顯示條件+badge 全文化、跳題精靈雙入口、來源題刪除防呆、子題嵌套+題號自動衍生、反面提示——取代舊 goto 模型 @known-bug 佔位場景。
  • survey-v2-fill.feature 新增 8 場景:三分流(含未作答全可見)、新增選項無漏網、同組跳題+進度分母+改答保留、必填同源、靜態題數提示、歷史紀錄回歸、稽核快照不漂移、存量 fallback。
  • survey-factory.js 擴充 updateSurveyQuestion/updateSurveyPage + displayCondition 建立參數,支援新場景的測試資料建置。

指揮官親跑驗收:designer 22/22、fill 27/27,皆連跑兩次全綠(default profile 排除 @known-bug);全套件 dry-run 455 scenarios 零 undefined/ambiguous;STG 資料回收核實乾淨。

@known-bug 場景確認產品缺口屬實survey-v2-designer.feature:225 子題編輯 dialog 無顯示條件區與跳題精靈區):E2E 實跑追出根因——子題嵌套預覽區(SurveyDesigner.vue question.subQuestions v-for 區塊)完全沒掛 @clickonOpenEditQuestion 只被頂層題目卡呼叫,決策9「編輯既有子題時同樣隱藏顯示條件區」因此是死碼、UI 層無法觸發。

  • 已修:FE e424020d(子題補編輯入口,複用 onOpenEditQuestion;順帶修暗雷——GET /surveysub_questions 序列化不帶 pid,原 _pid/parentId 判定在編輯既有子題時必為 false,決策9 隱藏邏輯不生效)+ c668c1d(子題工具列常駐化:上移/下移/編輯/複製/刪除 + 卡片式邊框 + 全頁 loading 反饋,user 直接督導三輪追加)。
  • Notion case:3a2346da-4cd0-8193-ab09-cb0df3c2c813修正待驗證
  • @known-bug tag 待 STG 部署後移除轉綠回歸(尚未移除,因修正尚未跟 STG 環境對過)。