Mantis Excel Update
將最新的 Mantis CSV 套用到既有問題單 Excel。預設是「更新既有問題單」:相同問題單更新最新欄位,CSV 新出現的問題單新增列,不把每次 CSV 重新製成無歷史的新清單。
依當下 runtime 可用的工具改寫「作用中工作簿副本」;Spreadsheets skill 可用時可依其 workbook authoring / verification 流程處理,但不是唯一 writer。無論實際使用何種工具,處理開始前都要讀取 CSV、現有工作簿、相關欄位與格式;不要以 CSV 欄位名稱或工作表名稱猜測對應關係。writer 的 API 回傳成功、記憶體 workbook model 或單純畫面預覽都不是交付證據;輸出後一律以本 skill 的獨立 raw OOXML validator 回讀 artifact,並依結果修正或回報限制。
範本與工作簿選擇
- 使用者提供 Excel 範本時,該檔案及其儲存格備註是本次唯一的格式、工作表與規則基準;不要混用預設範本的格式或備註規則。
- 使用者沒有提供範本時,使用此 skill 目錄內的 assets/template.xlsx。以 skill 根目錄解析此相對資產;不得參照桌面或其他外部固定路徑。
- assets/template.xlsx 是唯讀的種子檔。先將它複製到本次使用者指定的工作/輸出位置,再於副本上更新;絕不可寫入、覆寫或把這個資產本身當成交付檔。
- 正常工作以使用者提供的「既有問題單 Excel」為更新基礎;也應先建立工作副本。只有沒有既有更新檔時,才從選定範本的副本建立第一版。
- 除非使用者明確要求覆寫,將更新結果另存成可追溯的新檔;不修改來源檔。實際交付只可回傳本次建立的輸出副本,不可回傳或取代內建範本。
預設範本有三張工作表:
| 工作表 | 預設處理 |
|---|---|
| 概要 | 更新統計區 E3:H17,以及已確認的規則儲存格。 |
| 問題單清單 | 以 A:K 欄位對應 Mantis CSV,最小化地更新問題單資料列或新增列。 |
| 過版調整 | 僅在 CSV 偵測到待過版問題單、且使用者確認要更新後,更新已確認的問題單與版號欄位;否則維持當前狀態。 |
初始化:首次回覆必問
對每個新的 CSV 更新任務,尚未取得確認前,不開始寫入、產出或覆寫 Excel。第一輪固定輸出以下表單;已知資料填入,未知資料要求使用者確認。只有使用者明確說「略過範圍確認並接受既有預設」時,才可略過。
Mantis CSV→Excel 更新範圍確認
- 範本:是否提供本次 Excel 範本?若未提供,使用預設 Mantis 範本;若提供,會完全依該範本的格式與工作表配置更新。
- 更新目標與問題單欄位:請提供最新 CSV、要更新的 Excel,並確認問題單工作表及其「問題單號」欄位。CSV/Excel 欄位名稱不明確時,請確認對應;至少需要問題單號與狀態。
- 替位符號規則:偵測到新的 ${...} 替位符號時,會先轉成儲存格備註規則並請你確認,之後才計算;既有備註規則會沿用。是否有新的規則或要停用的規則?
- 其他轉換規則:CSV 找不到既有問題單時,預設狀態改為「不明」;請確認或指定替代狀態。也請確認「處理中/待過版/已解決」各自包含哪些原始狀態值。
請回覆「接受預設」或逐項補充/修改。
如果必要檔案、問題單號欄位、狀態欄位或輸出位置仍未確認,停止在確認階段,不猜測或修改資料。
更新規則
識別與欄位對應
- 將問題單號當文字處理,保留 Excel 顯示的前導零。比對時可用去除空白與前導零的正規化鍵(例如 0037745 與 37745),但不得因此改寫既有顯示值。
- 問題單號若重複、空白,或 CSV 內同一問題單有多筆且無法以更新時間安全判定最新一筆,先列出衝突並請使用者決定。
- 預設範本的問題單清單欄位是:編號、分配給、優先權、嚴重性、出現頻率、類別、回報日期、已更新、摘要、狀態、備註。僅更新已確認對應的欄位;沒有明確對應的 Excel 欄位、人工備註、色彩、資料驗證與公式一律保留。
- CSV 中不存在於 Excel 的問題單,新增到確認的問題單清單末端,並沿用相鄰資料列的格式、公式、驗證和條件格式。
- Excel 有、CSV 沒有的問題單,預設把已確認的狀態欄改為「不明」。這是獨立的「缺單轉不明」統計;不得把它混入一般 CSV 狀態更新。
工作表保留範圍
- 完整檢視工作簿的工作表、格式、公式、註解、篩選與隱藏狀態,再進行最小必要變更。寫入前建立本次 preflight:記錄工作表順序、作用中工作表/儲存格、確認的欄位 mapping、完整 issue ID 集合、每一個摘要公式及其預期快取值、保留工作表與其應維持的內容;以此建立 validator 所需 contract 與 preflight snapshot。若使用者未授權「過版調整」更新,snapshot 的
preservation必須以更新前作用中工作簿副本做為source_workbook,將「過版調整」列為protected_sheets,並啟用版本化規則備註保留。使用預設範本時,還要確認來源與輸出各有 20 筆去重後的MANTIS_RULE_V1規則。無法完整建立這些確認資料時,不得修改工作簿。 - 「概要」可更新統計區與已確認的規則儲存格。
- 「問題單清單」只可更新已確認資料列的對應欄位或新增列;不可重建、清空或全表重設樣式。保留既有篩選與檢視狀態;既有 hidden 狀態只保留在非 populated issue rows。進入 post-save validator 前,所有 populated issue rows 必須有效可見:含 issue cells 的 explicit
<row>不得有hidden=true,且有效列高必須大於零;有 row-levelht時以它為準,否則才使用已宣告的sheetFormatPr.defaultRowHeight。sheetFormatPr.zeroHeight只預設隱藏未寫出/unused rows,不會使含 issue cells 的 explicit<row>自動不可見。這是固定驗證契約,不可設定 contract 例外;任一 populated issue row 未達有效可見時,validator 必須回報visibility: FAIL,而不是修補 artifact。 - 寫入後以當下工作表順序計算問題單工作表的 zero-based active tab;若 workbook view 或 sheet view 缺失則建立必要節點,將目標工作表設為 visible,並將其
activeCell、sqref都設為A1。目標外不可留下衝突的tabSelected。如果既有 filter criteria 會遮住任何本次寫入問題單,只清除該 criteria、保留 filter range,並在交付回報記錄。這些是已確認目標可見性的 allowlist,不得藉此全表 unhide 或改動非目標工作表。 - 每個已確認概要公式都要同時保留
<f>與依本次獨立計數計算的 numeric cached value,包括前次/本次異動比例;只設定開檔重算旗標或把公式替換為靜態值均不可接受。若 workbook runtime 無法產生並回讀該快取,停止交付並回報公式快取驗證失敗。 - 待過版/過版調整工作表預設維持既有結構、版面、公式、格式、註解、篩選與檢視狀態;只有依「待過版工作表與 GitHub 版號」流程取得使用者確認後,才可最小化地更新問題單列及其已確認的版號欄位。
- 使用者提供不同範本時,先確認對應的總表、問題單工作表及其餘保留工作表,再套用相同的最小變更原則。
待過版工作表與 GitHub 版號
完成 CSV 解析、問題單號比對與狀態正規化後,先計算本次分類為「待過版」的問題單。若為 0 筆,不詢問、不修改待過版工作表,繼續其餘更新。若至少有 1 筆,在任何待過版工作表寫入前,先詢問:
偵測到 N 筆待過版問題單。是否要更新本次 Excel 的待過版/過版調整工作表,並依 GitHub Release 的 PR 內容填入對應版號?
使用者選擇更新時,再請其提供本次要採用的 GitHub Release URL 或可明確定位 Release 的 repository、tag 與版本範圍;同時確認待過版工作表、問題單號欄,以及後端/前端版號欄位。預設範本的「過版調整」只是候選工作表,必須先檢視其現有欄位後才能寫入。使用者選擇不更新時,保留該工作表且完成 CSV、問題單清單與概要的其餘工作。
Release 與 PR 證據
依 GitHub Release/PR 唯讀流程 讀取使用者指定的 Release 及其 PR。以 Release tag、PR title/內容、merge commit 與必要時的變更檔案作為對照證據;將可直接對應的後端或前端版號填入該問題單的已確認欄位。版本顯示格式必須沿用目標工作表,例如只有在既有欄位格式已確認時才移除 tag 後綴。
- 有直接 PR 證據才填版號;一張問題單若對應前後端 PR,分別填入相應欄位。
- 多個候選 PR、沒有相符 PR,或 Release 範圍不明時,不猜測版號。保留版號空白(或既有值),在可用備註欄記錄「待確認」及來源,並在完成回報列出。
- 新增或更新待過版列時,以正規化問題單號比對,保留顯示前導零、既有人工內容與列格式。不要重建整張工作表。
- GitHub 資料未能取得時,若使用者已確認更新待過版工作表,仍可依 CSV 更新/新增已確認問題單列,但不得填造版號;明確標示未填原因,並繼續完成其他可執行的工作表更新。
概要統計
在套用 CSV 前,以既有問題單清單建立「前次」快照;更新後再產生「本次」統計。預設範本的概要區 E3:H17 是一組可由備註規則重跑的摘要:
| 分類 | 預設定義 |
|---|---|
| 處理中 | 已確認不是待過版、已解決、已結束或不明的進行中狀態 |
| 待過版 | 使用者確認的待過版狀態值 |
| 已解決 | 已解決與已結束,兩者合併為結案狀態 |
| 不明 | CSV 找不到既有問題單後所設定的預設狀態 |
狀態比較表位於 E3:H7:E 欄是分類、F 欄是更新前快照、G 欄是問題單清單的目前公式計數、H 欄是異動比例。前次與本次用整數問題單數表示;異動比例以 (本次-前次)/前次 計算,前次為零時要避免除以零。
更新摘要位於 E9:F17,依序為:本次 CSV 筆數、問題單總數、新增問題單數、更新既有問題單數、缺單轉不明數、未變更、更新時間、來源 CSV。問題單總數是工作表公式;其餘結果由本次更新的已確認差異寫入。
版本化備註規則與 placeholder 的實際資料只存在於本次「作用中工作簿副本」的儲存格備註;skill 檔案不保存任何工作簿的規則 payload、公式、欄位名稱或統計設定。每次更新先從作用中工作簿探索有效備註:formula 規則重建公式,snapshot 規則在指定時點寫入值。使用預設範本時,沿用其副本中的備註;使用者提供範本時,只沿用或新增該範本副本中已存在或經本次確認的新規則。不可只依賴目前顯示值,或只將規則硬編碼在更新程式中。
狀態值的實際對應以初始化確認為準;如果使用者變更狀態對應,先在作用中工作簿副本更新相關備註規則與公式,再進行更新。無法分類的值要列為待確認,而不是靜默併入「處理中」。
可選的實用統計(僅在範本已有位置或使用者同意後加入)是:分配人員分布、優先級分布、待過版清單、未完成天數與最近更新趨勢。不要為此新增未經同意的工作表。
替位符號與備註規則
替位符號與備註是工作簿內容,不是 skill 設定。只從本次作用中工作簿副本讀取;不得在 SKILL.md、references/ 或其他 skill 檔案快取、複製或預先設定任何實際規則資料。
當作用中工作簿的儲存格完整文字是 ${...} 時,視為待設定規則,不把它當 Excel 公式或任意程式碼執行。
- 初次偵測時,擷取其自然語言要求,依 替位符號規則 轉成受限、可重複執行的規格,並在初始化確認中請使用者核准。
- 核准後,僅在作用中工作簿副本的該儲存格備註寫入版本化規則規格。保留原有人工備註;必要時新增回覆或以清楚的區段附加,而非覆寫。
- 將儲存格顯示值更新為規則的計算結果。規則的來源工作表、問題單號欄與狀態分類必須明確記錄。
- 後續更新以作用中工作簿備註中的版本化規則為準,即使 ${...} 已被計算值取代也要重新套用。
- 不支援、歧義或高風險的規則保留原替位符號,列出原因並要求使用者確認;不推測。
驗證與完成回報
輸出工作簿完成 export/save 後,先確認 workbook writer 的 handle 已釋放;只有 writer 位於獨立 process 時,才需等待該 process 結束。接著必須對已儲存的輸出路徑執行獨立 artifact 驗證;不得以 writer 記憶體中的 workbook 物件代替磁碟回讀:
python3 scripts/validate_artifact.py "<artifact.xlsx>" --contract "<contract.json>" --renderer auto --visual-verdict not-run
只有在要建立或檢視 contract,或要解讀 validator 的 report、outcome 與 exit code 時,才讀 artifact 驗證契約與報告。
資料正確性、可見性、公式快取三層一律由 raw OOXML validator 獨立驗證;這三層不依賴視覺化能力。若環境有 Spreadsheets 的工作簿檢視能力或其他可實際檢視輸出的 renderer,完成逐工作表視覺檢查後才可將同一份 artifact 以 --visual-verdict pass 重跑 validator。不得因為成功產出 PDF,或僅因為環境宣稱有 renderer,就填入 pass。無視覺化能力時保留 not-run,讓 validator 回傳 PARTIAL;這不是資料驗證失敗,也不是完整成功。
完成前,依可用能力檢查並確認:
- 每一筆 CSV 問題單都正確更新或新增,且既有不在 CSV 的問題單依確認規則轉為不明。
- 問題單號沒有因數字格式而失去前導零;沒有未處理的重複鍵。
- 問題單清單的非目標內容、公式、格式、註解、篩選與檢視狀態,以及未經確認的過版調整工作表內容均未被非必要改動。
- 概要的前次/本次/異動比例能與更新前後清單的獨立計數相互核對;公式沒有錯誤。
- 當使用預設範本或使用者確認相同概要版面時,匯出後先檢查「概要」的浮動繪圖物件與其錨點。空白、白底黑框、覆蓋 A1:J6、且實際尺寸與錨點明顯不符的文字方塊是已知異常特徵;名稱為 Text Box 21 時尤其須排查。
- 僅在確認該浮動物件不是使用者有意保留的內容、且符合上述異常特徵時,才以最小 OOXML 變更移除該圖形及其 drawing 關聯。不可藉此刪除其他圖形、圖表、圖片或註解物件。
- 移除前後都要核對摘要 sheetData、公式與所有既有儲存格註解未變;預設範本輸出還要確認 20 筆版本化規則註解仍在。E3:H3 與 E9 的 12 pt 字級可作交叉檢核,但 styleId 重編本身不代表字型異常,也不得因此重設字型。
- 若已確認 Text Box 21 是異常物件,將其名稱列入 preflight
preservation.forbidden_drawing_names;唯讀 validator 必須在輸出所有 drawing parts 中確認它已不存在。不可只憑名稱推定未確認的使用者圖形可刪除。 - 替位符號的可執行規則都已寫入備註,且其值與問題單清單一致。
- 若使用者選擇更新待過版工作表,每個新填版號都有本次指定 Release/PR 的唯讀證據;無法對應者未被猜測填入,且已列入回報。
完整驗證的完成條件是上述檢查均完成,且 validator outcome 為 PASS。PARTIAL 表示資料正確性、可見性與公式快取均已通過獨立回讀,但 renderer 或視覺檢查未完成;必須明示此限制,不得稱為完整成功。FAIL 時依 report 修正輸出流程,重新儲存、關閉 writer 後再驗證;validator 本身不修復工作簿。
交付時分開回報:新增問題單數、更新既有問題單數、缺單轉不明數,以及目前不明總數;不能把「缺單轉不明」併進一般更新數。若偵測到待過版問題單,也回報其數量、使用者是否選擇更新待過版工作表、寫入/新增的列數、成功填入的後端/前端版號數、待確認數,以及採用的 GitHub 資料來源或無法取得原因。若使用者沒有指定缺單規則,明確說明採用預設「不明」,並列出或附上受影響問題單的數量。