一句話:本卡為 FR-109 母案,掃 jedi-survey(問卷:建題與填答)套件本體 81 支有邏輯的正式碼,兩棒,只掃不修。子卡清單在末段。
問卷功能分兩半:建題(管理者建問卷、分頁、題目、資料夾,可從 Excel 匯入、可複製、可發佈)與填答(稽核任務指派給某人填、可多人同時填、有歷史版本可還原、可從 Excel 匯入答案、可在題目底下討論)。建題那半靠「有沒有買問卷功能」+四顆能力點守;填答那半靠「你是不是被指派的人或專案管理者」守——而後者是 2026-07 補的洞,補之前任何登入者可改任何人的填答。
survey_route.py 讀取只掛授權、寫入(新增/修改/刪除/匯入/搬移/複製/發佈)全掛能力點(:107/:135/:158/:177/:246/:267/:290)。但分頁、題目、資料夾、討論四條 route 檔的能力點掛法要逐支對(首腦 grep:folder 4/question 6/page 6/discussion 3 處 capability,未逐支核)。@jwt_required()(9 支 0 能力點),歸屬檢查靠 assert_task_survey_writer/_manager(7 個呼叫點)。要對照 32 條 route 逐支找「哪些填答/讀取路徑沒經過這兩支」——例如 TaskSurveysAnswersRoute.get(讀答案)、QuestionAnswerHistoryMenuRoute.get、QuestionAnswerHistoriesRoute.post、TaskSurveyRoute.get——首腦初看讀取類沒有任何一支呼叫 writer/manager 守門。survey_discussion_service.py:78 delete_discussion(uid) 不收 user、不比對 created_user——與 CM-1630(回饋改刪不驗本人)同型。survey_route.py:171-216 存 tempfile;填答 task_survey_route.py:128-166 secure_filename+load_workbook)——公式注入反向(讀)不是問題,要看的是解析炸彈(openpyxl 無 read_only)與 tempfile 清理。fill_survey_socketio_handler.py:59-103 on_join(room) 用 room 名(task_survey_uid)取答案快照廣播——有沒有驗這個人能不能看這份問卷。剔除 81 支無邏輯檔(__init__、mapper、純資料 entity、model、dto);query entity 保留。主專案接線 10 檔(core/plugins/survey.py、三顆 DI、infra/survey/adapters.py、survey_handler.py)另棒。
low;scanRoot /Users/chouraymond/Projects/Jedicogy/module/jedi-python-package/jedi-survey;V2 先派(補洞驗證是主目的),V1 後派;可與別套件的棒用另一帳號並行。6119da5(branch feature/review)。