---
title: "事前資料區：客戶有個地方上傳、大類跟著公司、資源庫自動帶入 — 需求討論稿 (FR-161)"
brand: "Guidant AI · **FR-161** 事前資料區"
eyebrow: "FR-161 · Pre-engagement Materials — 需求討論稿 · 2026-10-23 · 決策者已裁 D2／D4／D5／D6／D7／D8，待審雛形"
h1: "事前資料區"
subtitle: "客戶在訪談前把手上有的資料丟進分類格子；每個合規資源庫的程序書池打開時東西已經在；大類在系統設定、跟著公司"
lede: "顧問去客戶現場訪談之前，會請客戶先把手上有的東西準備好：網路架構、組織架構、資產清單、政策文件與程序書。現在這些檔案走信件與雲端硬碟，系統裡沒有落點，顧問整理 SSP 時還要再傳一次。本案加一頁很簡單的**事前資料區**——就是一個能上傳的地方：客戶把檔案丟進大類格子；大類跟著公司、顧問可以改成自己習慣的分法；檔案屬於公司不屬於任何框架，**每個合規資源庫的「程序書池」tab 打開時照大類分段全部已經在**（不多開 tab，只重新設計這一個），第二個框架不用客戶從頭再傳、也不用顧問再挑。大類在系統設定裡管。不做審閱、不做留言、不做通知——這些跟顧問的作業流程綁得太深，等系統更完善再慢慢補。"
chips: [
  {text: "已裁：另開介面；一個上傳的地方；大類在系統設定、跟著公司；檔案公司層、程序書池 tab 重新設計照大類分段自動帶入、不多開 tab；不做審閱留言", kind: ok},
  {text: "待審：三頁雛形", kind: accent},
  {text: "順手補齊：OSCAL 匯出 back-matter 目前為空（另開卡）", kind: warn}
]
footer: "FR-161 · 事前資料區 — 需求討論稿 · 2026-10-23 · 前作：FR-139 顧問訪談欄位與資源庫版本、FR-147 資源庫任務說明、FR-160 專案角色分層"
---

## 需求背景與目標 {#why nav="背景"}

### 決策者描述的流程（2026-10-23 原話整理）

1. 企業要導入法規合規，找了顧問來，說要導入某個框架（例如 ISO 27001）。
2. 顧問去開會前，先請**客戶**把目前知道的資料上傳到系統。項目會依公司或框架不同，常見有：網路架構、組織架構、資產盤點（硬體、軟體、服務）、政策文件與程序書。
3. 顧問去訪談之前，先看過客戶提供的事前準備資料。
4. 再去現場訪談，訪談完回來才做 SSP，再往後面走原本的專案流程。

### 討論中定下來的事

| 定下來的事 | 決策者的話 | 落到設計上 |
|---|---|---|
| 分類只到大類 | 「只要大類就好，有分類即可」 | 沒有子項目、沒有必填規則 |
| 要另開介面 | 「user 不會進去 SSP UI」 | 側選單獨立一頁，不出現控制項、評估目標、OSCAL 任何字眼 |
| 掛在合規資源庫、其他框架也能引用 | 「掛資源庫，但要考慮未來導入其他框架也可以引用」 | 入口在資源庫列表；**檔案本體存公司層**，不屬於任何一份 SSP |
| 不要顧問再挑一次 | 「要顧問再挑一次就多一道工」 | 每個資源庫的程序書池打開時**預設全部帶入**；顧問只有反向的「這框架不用」 |
| 四類都是附件、不多開 tab | 「D2 四項啊，都是附件吧」「把原本的程序書那個 tab 重新設計就好，不要多一堆 tab 出來」 | 資源庫只重新設計「程序書池」tab：照公司大類分段，客戶事前資料與顧問上傳並排；不開「附件」「網路架構圖」tab |
| 不做審閱 | 「太複雜了，可以有一個地方讓他們上傳就好；大多作業跟顧問綁，系統還不是很完善，慢慢再補」 | 沒有「看過」勾、沒有審閱紀錄、沒有留言、沒有通知 |
| 大類跟著公司、在系統設定管 | 「每個顧問的大類又會不同」→ 選「跟著公司」；「那現在大類要在哪邊設定？」→ 系統設定 | 系統出貨給四個起始值；「系統設定 ／ 事前資料大類」一頁增刪改名排序，只影響這家公司；事前資料頁與程序書池 tab 只讀這份 |
| 導入期間持續更新、進稽核才鎖 | 「有可能在導入期間又有人換了或異動，應該要可以持續更新才對；除了專案進入稽核這時才應該鎖」 | 事前資料區永遠可更新；稽核開始那刻給稽核輪一份鎖住的副本（與程序書池同一條 clone） |

### 現況：缺的不是資料表，是一個入口

四類資料在系統裡大多有家（程序書池、設備主檔、資訊系統、部門人員），但都是顧問在維護、沒有客戶交件的入口。網路架構圖連畫面都沒有：套件 `ssp_diagrams` 表與 repo 都有，主專案沒有任何程式寫它。

所以本案要補的是：① 客戶能上傳的一頁；② 大類可管理；③ 資源庫自動帶入。

## 使用情境（決策者 2026-10-23 看過點頭，依後續裁示修訂） {#usecase nav="情境"}

甲公司要導 ISO 27001，找了乙顧問公司。小美是甲公司 IT 主管，老王是乙顧問公司的顧問。

| 時間 | 誰 | 做什麼 | 系統裡發生什麼 |
|---|---|---|---|
| 第 1 天 | 老王 | 建 ISO 27001 合規資源庫「甲公司 2026 ISO 27001 導入」；到「系統設定 ／ 事前資料大類」看到四個起始大類，加一個「機房與實體環境」；點資源庫那一列的「事前資料」把連結寄給小美 | 甲公司的事前資料區有五個空格子 |
| 第 2～5 天 | 小美 | 登入後側選單只有「事前資料」，把網路拓樸圖、組織圖、門禁規定、三年前的資產 Excel、兩份政策文件各丟進對的格子 | 五個大類有檔案；沒有必填、沒有任何合規術語 |
| 第 6 天 | 老王 | 出發前打開同一頁逐一下載來看 | 系統不記錄他看過沒；他自己整理筆記帶去開會 |
| 第 7 天 | 老王 | 現場訪談，帶既有訪談表 Excel | 流程不變（FR-139） |
| 第 8 天 | 老王 | 回來打開資源庫整理 SSP | 程序書池 tab 照五個大類分段，七個檔**已經在**；控制項「從程序書池選用」照舊能挑到政策文件；拓樸圖那檔勾「當網路架構圖匯出」。接著匯入訪談表、存版，全是既有流程 |
| 第 20 天 | 小美 | 公司換了一台防火牆，重畫網路圖，在原本那份底下按「上傳新版」 | 舊版留著可看；老王規劃中的資源庫程序書池看到的自動變成新版 |
| 第 30 天 | 老王 | 按「送審」，稽核開始 | 稽核輪拿到一份當下附件清單的副本，之後小美再傳什麼都不影響這次稽核 |
| 半年後 | 老王 | 建第二個資源庫「甲公司 CMMC L2」 | 程序書池同一批檔案自動在，連小美這半年補傳的也在；老王只把「機房門禁管理規定」點「這框架不用」。小美那頁沒有任何變化（事前資料屬於公司、不分框架），超過一年沒更新的檔案旁多一個「可能過時」 |

關鍵：小美始終只看一頁；老王「挑」的動作只有反向的「這框架不用」；檔案本體從頭到尾各一份；大類是甲公司自己那套。

```{.mermaid cap="圖 1 — 事前資料從客戶上傳到進入資源庫與稽核"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB','actorBkg':'#E2F0F1','actorTextColor':'#14201F','actorBorder':'#0E7C86','actorLineColor':'#C7D1D2','signalColor':'#4A5A5C','signalTextColor':'#14201F','labelBoxBkgColor':'#EEF2F3','labelBoxBorderColor':'#C7D1D2','labelTextColor':'#14201F','loopTextColor':'#14201F','noteBkgColor':'#F6EBD5','noteTextColor':'#14201F','noteBorderColor':'#9C6B12','activationBkgColor':'#EEF2F3','activationBorderColor':'#C7D1D2','sequenceNumberColor':'#FFFFFF'}}}%%
sequenceDiagram
  participant K as 客戶（小美）
  participant P as 事前資料區（公司層）
  participant C as 顧問（老王）
  participant R1 as 資源庫 ISO 27001
  participant A as 稽核輪
  participant R2 as 資源庫 CMMC（半年後）
  C->>R1: 建資源庫，點「事前資料」
  R1->>P: 第一次開：建公司事前資料區＋四個起始大類
  C->>P: 加大類「機房與實體環境」
  K->>P: 五個格子各丟檔案
  C->>R1: 整理 SSP
  R1->>P: 讀公司全部檔 − 此資源庫排除 → 程序書池 tab 照大類分段
  Note over R1: 顧問不用挑，東西已經在
  K->>P: 網路圖上傳新版
  R1->>P: 規劃中的資源庫看到新版
  C->>A: 送審
  A->>P: 拍一份當下程序書池清單的副本（鎖）
  K->>P: 之後再傳的不影響這次稽核
  C->>R2: 半年後建第二個資源庫
  R2->>P: 同一批檔案自動帶入
  C->>R2: 把「門禁規定」點「這框架不用」
```

## 分工概述（30 秒版） {#overview nav="分工概述"}

整案一句話：**客戶有一頁可以把檔案丟進大類格子；大類在系統設定、跟著公司；每個合規資源庫的程序書池打開時檔案照大類全部在，不用再傳、不用再挑；稽核開始才鎖一份副本。**

| 階段 | 做什麼 | 產出 | 完成怎麼判定（決策者檢查法） |
|---|---|---|---|
| **一、大類設定＋事前資料頁** | 公司層大類表與檔案表（含版本）；「系統設定 ／ 事前資料大類」一頁（增刪改名排序，有檔案的不能刪）；事前資料頁：上傳、上傳新版、看舊版、刪除、標過時，客戶顧問完全同一頁；側選單與資源庫列表兩個入口；`system_menus` 四個起始大類 | 兩張新表、API、兩個 Vue 頁、seed | 顧問到系統設定把「網路架構」改名「網路與連線」並新增「機房」；用受稽方帳號登入只看到「事前資料」一頁、格子名稱已變，丟一個檔到「網路與連線」，再對它按「上傳新版」看到 v2 與舊版可看；換顧問帳號從資源庫列表點「事前資料」看到同一個檔 |
| **二、程序書池 tab 重新設計** | 不多開 tab；程序書池改成照公司大類分段：讀公司全部檔（各取最新版）減去此資源庫排除，顧問上傳的也選一個大類進對應段並排；每檔「這框架不用」與「恢復」；「網路架構」段的檔可勾「當網路架構圖匯出」（寫套件 `ssp_diagrams`）；控制項「從程序書池選用」照舊、清單排除「不用」的 | 排除表、程序書池讀寫端改動、diagram 勾選與 app service | 第一階段丟的檔，不做任何事直接開資源庫程序書池，照大類分段看得到；再建第二個資源庫同樣看得到；點「這框架不用」只有這個資源庫看不到；某條控制項「從程序書池選用」能挑到政策文件、挑不到「不用」的 |
| **三、稽核鎖定與匯出** | 送審時把程序書池清單（含事前資料各檔當時那版）快照進凍結 SSP（既有 clone，共用 `file_id`）；匯出 OSCAL 時進 back-matter、勾了的進 network-architecture diagram；複製資源庫時排除表跟著複製 | clone 與匯出改動 | 送審後客戶再傳新版，稽核計畫頁看到的程序書仍是舊版；匯出 OSCAL JSON 的 back-matter 有這些檔；被快照引用的檔按刪除被擋、只能標過時 |

依賴：第二階段吃第一階段的表；第三階段吃 FR-139 的送審存版與複製資源庫（已上線）。決策者功課：審兩頁雛形。

## 已定案事項 {#decided nav="已定案"}

::: {.callout .decided}
**D2 四類全部當附件，不分落點；資源庫不多開 tab，只重新設計「程序書池」**

對 OSCAL 來說四類都是 back-matter resource。資源庫的 tab 列完全不動，只把「程序書池」這一個改成照公司大類分段：客戶事前資料（各取最新版）與顧問自己上傳的並排在對應的段。不開「附件」tab、不開「網路架構圖」tab；「網路架構」段的檔要當 OSCAL diagram 匯出，在那檔上勾「當網路架構圖匯出」即可（寫套件 `ssp_diagrams`，主專案原本沒程式寫它）。控制項與 AO「從程序書池選用」照舊，清單就是這個 tab 看得到的檔。大類只是分類標籤，沒有「落點」欄。
:::

::: {.callout .decided}
**D4 事前資料區永遠可更新，稽核開始那刻才鎖一份副本**

導入期間人員異動、網路圖改版，客戶照傳，規劃中的資源庫看到的永遠是最新版。只有稽核輪拿到的那份副本是鎖的：送審那刻把「當下附件清單」複製進凍結 SSP，客戶之後傳的新檔或新版不影響這次稽核。覆核輪回到規劃中、或新年度複製資源庫時，顧問整理的那份又回到看最新版。這與程序書池送審時的 clone 是同一條路。
:::

::: {.callout .decided}
**D5 兩顆系統層權限**

「事前資料：上傳與查看」（受稽方、顧問）、「事前資料：管理大類」（顧問）。這個動作沒有「專案」這個對象，照 FR-160 的分層判準屬系統層；掛 `common/authz` capability 軸，不另開守門。FR-160 分層表定稿時列進去。
:::

::: {.callout .decided}
**D6 客戶與顧問都能刪，被稽核副本引用的不能刪只能標過時**

規劃中資源庫的引用不算鎖，刪了就從它的程序書池消失。一旦某次送審把這份檔拍進副本，誰都不能刪（刪了稽核的副本就破洞），只能標「已過時」並上傳新版。
:::

::: {.callout .decided}
**D7 既有程序書池的檔怎麼辦**

程序書池 tab 重新設計後，顧問直接上傳的檔也要選一個大類；既有資料（升級前的程序書池列）一律歸進「政策文件與程序書」段，不搬進事前資料區、不要求客戶重傳。

順帶記一筆：目前匯出 OSCAL 時 back-matter 是空的——主專案沒有任何地方寫套件的 `resources` 表，程序書池是另一張表。本案把附件寫進 `resources` 會打通這條路；程序書池要不要一併搬過去**另開卡裁**，不在本案。
:::

::: {.callout .decided}
**D8 時效性：同一份資料上傳新版，舊版留著、引用跟最新版**

每個檔案可「上傳新版」，新版接在原檔底下，客戶頁面一份資料永遠只顯示一列，旁邊標 v2、v3，舊版可看。頁面上不放提示文字教客戶這件事，改在上傳時擋：在某個大類上傳一個與該格已有資料**同檔名**（比對去掉副檔名與版本字樣後的檔名，或同顯示名稱）的檔，對話框先問「當成新版／另存一份新資料」，預設當成新版。不擋的後果是同一份資料變兩列，程序書池出現兩份網路圖、送審兩份都進稽核副本、舊那份刪不掉。規劃中的資源庫看最新版；稽核副本停在當時那版（D4）。每個檔案顯示最後一版日期，超過一年標「可能過時」提醒，不自動催客戶。所以「第二個框架不用客戶再傳」精確說是「不用從頭再傳，只要更新有變的」。
:::

::: {.callout .decided}
**大類跟著公司，在「系統設定 ／ 事前資料大類」管**

系統出貨 `system_menus` 給四個起始大類（網路架構、組織架構、資產盤點、政策文件與程序書），公司第一次開系統設定那頁時帶進公司層那張表；之後在那頁增刪改名排序，只影響這家公司；底下還有檔案的大類不能刪。事前資料頁與資源庫程序書池 tab 都**只讀**這份，不在頁面上改大類（設定不該藏在客戶也看得到的頁裡）。不跟著資源庫：一個檔只屬於一個大類，跟資源庫走會讓同一個檔在第二個框架再歸一次類。落地版一台機器一家公司，與「跟著系統」看起來幾乎一樣，差別到 SaaS 多家公司才顯出來。
:::

::: {.callout .decided}
**「公司」＝租戶，與專案、資源庫同一套，不另做「選公司」**

系統裡資源庫（`module_frames`）與專案（`compliance.projects`）都帶 `tenant_id`，DEV 實查 5 個專案、8 個資源庫全在 Billows Tech（102）底下。事前資料區的大類表與檔案表同樣 tenant-scoped；顧問服務多家客戶＝帳號掛多個租戶、頂欄切換（既有 `AppTopbar` 租戶選單）。頁首印公司名。落地版一台機器一家公司，客戶不會有「這是哪間公司」的疑問；SaaS 多家客戶掛在顧問公司底下時靠頂欄切。
:::

::: {.callout .decided}
**不做審閱、留言、通知（原 D1／D3／D9 取消）**

決策者原話：「太複雜了，可以有一個地方讓他們上傳就好；大多作業跟顧問綁，系統還不是很完善，慢慢再補。」顧問看過沒是顧問自己的事，系統不記；要留話走既有管道。
:::

## 做出來長什麼樣 {#ui nav="畫面"}

三頁雛形在 [prototype/index.html](prototype/index.html)，用現有設計系統刻、純假資料。

| 頁 | 誰看 | 重點 |
|---|---|---|
| 畫面 1 事前資料頁 | 受稽方與顧問看完全同一頁 | 側選單一個入口；頂欄左側是既有租戶切換；頁首只有大標與「公司：甲公司」（不顯示框架或資源庫名稱、不顯示顧問、不顯示總數、沒有提示文字）；每個大類一張卡：拖檔上傳、檔案列（檔名、版本、誰傳、何時、過時標記）、上傳新版、看舊版、刪除；在某格上傳與該格已有資料同名的檔時，對話框先問「當成新版／另存一份」。沒有設定鈕、沒有合規術語、沒有勾、沒有留言 |
| 畫面 2 程序書池 tab 重新設計 | 顧問 | tab 列不變；程序書池照公司大類分段，客戶事前資料與顧問上傳並排、各標來源；每檔「這框架不用」；顧問上傳時選大類；「網路架構」段可勾「當網路架構圖匯出」；右上可切 ISO 與 CMMC 看同一批檔 |
| 畫面 3 系統設定：事前資料大類 | 有「管理大類」權限者 | 表格模式：排序把手、名稱（起始值標籤）、說明、資料數、最後更新、操作；新增與編輯開對話框；拖曳排序；有檔案的不能刪；改名立刻反映到畫面 1 與 2 |

## 資料模型草案 {#data nav="資料"}

| 表 | 層 | 放什麼 | 備註 |
|---|---|---|---|
| `compliance.pre_engagement_categories` | 公司層（tenant） | 大類：`name`、`description`（給客戶看的一句提示，選填）、`sort` | 第一次開啟時從 `system_menus` group `pre_engagement_category` 帶四筆；之後只在這張表增刪改 |
| `compliance.pre_engagement_files` | 公司層（tenant） | 一份資料：`category_id`、`title`（顯示名，預設檔名）、`is_obsolete` | 審計四欄；RLS 同其他 tenant-scoped 表 |
| `compliance.pre_engagement_file_versions` | 公司層 | `pre_engagement_file_id`、`version_no`、`file_id`（→ `upload_files`）、上傳者、時間 | 最新版＝`version_no` 最大；舊版留著可看 |
| `compliance.pre_engagement_exclusions` | 資源庫層 | `module_frame_id` × `pre_engagement_file_id` | 「這框架不用」；複製資源庫時跟著複製 |
| 引用（讀取時計算） | — | 某資源庫程序書池 ＝ 公司全部未過時檔（各取最新版） － 該資源庫排除 ＋ 該資源庫顧問上傳 | 不另存引用表，免兩份真相 |
| 稽核副本 | 凍結 SSP | 送審時把程序書池清單（指到當時的 `file_id`）照既有 clone 複製；匯出寫 `resources`（back-matter）與勾了的 `ssp_diagrams` | 與程序書池 clone 同一條路；刪除守門查這裡 |

```{.mermaid cap="圖 2 — 資料關係"}
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#E2F0F1','primaryTextColor':'#14201F','primaryBorderColor':'#0E7C86','secondaryColor':'#EEF2F3','secondaryTextColor':'#14201F','tertiaryColor':'#FBFCFC','tertiaryTextColor':'#14201F','lineColor':'#4A5A5C','textColor':'#14201F','mainBkg':'#E2F0F1','nodeBorder':'#0E7C86','nodeTextColor':'#14201F','edgeLabelBackground':'#FBFCFC','titleColor':'#14201F','clusterBkg':'#FBFCFC','clusterBorder':'#E4EAEB','actorBkg':'#E2F0F1','actorTextColor':'#14201F','actorBorder':'#0E7C86','actorLineColor':'#C7D1D2','signalColor':'#4A5A5C','signalTextColor':'#14201F','labelBoxBkgColor':'#EEF2F3','labelBoxBorderColor':'#C7D1D2','labelTextColor':'#14201F','loopTextColor':'#14201F','noteBkgColor':'#F6EBD5','noteTextColor':'#14201F','noteBorderColor':'#9C6B12','activationBkgColor':'#EEF2F3','activationBorderColor':'#C7D1D2','sequenceNumberColor':'#FFFFFF'}}}%%
flowchart LR
  subgraph T[公司層 tenant]
    CAT[大類<br/>pre_engagement_categories]
    F[資料<br/>pre_engagement_files]
    V[版本<br/>pre_engagement_file_versions]
    U[upload_files]
    CAT --> F --> V --> U
  end
  subgraph L[資源庫層 module_frame]
    EX[排除<br/>pre_engagement_exclusions]
    SSP[範本 SSP 程序書池 tab]
    EX -.這框架不用.-> F
    SSP -.讀取時：全部檔最新版 − 排除.-> F
  end
  subgraph Z[凍結 SSP（送審副本）]
    BM[back-matter resources]
  end
  SSP ==送審==> BM
  BM -.共用 file_id，指當時那版.-> U
```

## 與既有功能的接點 {#touch nav="接點"}

| 既有東西 | 本案動作 |
|---|---|
| 合規資源庫列表（`ModuleFrame.vue`） | 每列加「事前資料」鈕，開同一頁並帶 `module_frame_uid` 當頁首與排除的脈絡 |
| 程序書池頁籤（`DocumentPoolPanel.vue`） | 重新設計：照大類分段、合併事前資料與顧問上傳、「這框架不用」、上傳時選大類、「當網路架構圖匯出」勾（寫套件 `ssp_diagrams`，主專案補 app service） |
| 系統設定 | 新頁「事前資料大類」 |
| FR-139 送審存版、複製資源庫 | 快照附件清單、複製排除表 |
| OSCAL 匯出 `_build_back_matter` | 第一次有東西可匯 |
| `system_menus` | 新 group `pre_engagement_category` 四筆起始值 |
| 側選單 `ui_routes` | 新入口「事前資料」、系統設定下新入口「事前資料大類」 |
| FR-160 分層表 | 補兩顆系統層權限 |

## 不做什麼 {#notdo nav="不做"}

- 不做審閱、看過勾、留言、通知。
- 不做子項目、必填、進度百分比、截止日。
- 不把組織圖自動變成部門人員、不把資產 Excel 自動變成設備主檔。
- 不接 Agent 掃描結果進事前資料區。
- 不搬既有程序書池的檔到事前資料區。
- 不自動催客戶更新過時檔案。

## 風險 {#risk nav="風險"}

| 風險 | 怎麼擋 |
|---|---|
| 自動帶入把客戶亂丟的檔全進程序書池，顧問覺得吵 | 照大類分段看得清楚來源，一鍵「這框架不用」；丟錯格在事前資料頁可搬 |
| 送審漏帶附件，稽核計畫頁看不到 | 走程序書池同一條 clone，並在 FR-139 送審存版的驗收清單加一條 |
| 網路架構圖從零補，範圍膨脹 | 不開畫面，只在程序書池那檔上一個勾＋一行圖說寫進 `ssp_diagrams`，不做預覽、不做線上繪圖 |
| 權限兩顆與 FR-160 重整撞期 | 先掛 capability 軸，FR-160 定稿時歸位 |
| 既有程序書池升級 | 升級前的程序書池列歸「政策文件與程序書」段；沒有大類表的公司第一次開時自動帶起始值 |
| 版本累積吃儲存 | 舊版不刪，但 `upload_files` 本來就不刪（既有缺 GC 的已知事項），不因本案惡化 |
