---
title: "CRA 第三期 — 法定文件匯出、支援期到期畫面討論稿 (FR-135)"
brand: "Guidant AI · **FR-135** CRA 合規框架"
eyebrow: "FR-135 · 第三期討論稿 · 2026-10-13"
h1: "CRA 專案從「填資料」走到「出文件、看期限」"
subtitle: "三份法定文件 docx 匯出、資訊系統版本支援期剩餘天數徽章——兩張卡、文件格式已裁"
lede: "決策者已在 CM-2706 看過假資料雛形，並於 2026-10-13 裁定第三期範圍：X1 三份法定文件匯出、S1 支援期剩餘天數徽章。本稿把兩張卡展開成可開工的規格：每件事列出**現在系統裡有什麼**（附檔案行號或 DEV 查詢）、資料從哪來、畫面改哪裡。通報、提醒、支援期到期通知併入平台級 FR「週期任務與條件通知」（FR-137），設計草案集中在 [phase3-deferred-to-recurring-tasks-fr](phase3-deferred-to-recurring-tasks-fr.md)。"
chips: [
  {text: "已裁 D4：只出 docx", kind: ok},
  {text: "兩張卡：X1 → S1", kind: accent},
  {text: "通報與提醒併入 FR-137", kind: warn},
  {text: "CMMC 專案一個像素都不變", kind: accent}
]
footer: "FR-135 · CRA 第三期討論稿 · 2026-10-13 · 輸入：Notion CM-2711、CM-2706 審稿結論、[FR-135-STATE](handoff/FR-135-STATE.md)「功能補齊」範圍、雛形 [phase3-index](prototype/phase3-index.html) · 併入 FR-137 的設計草案：[phase3-deferred-to-recurring-tasks-fr](phase3-deferred-to-recurring-tasks-fr.md) · 現況依據：程式碼行號與 DEV DB 唯讀查詢（2026-10-12）"
---

**狀態**：討論稿（D4 已裁，展開規格）　｜　**日期**：2026-10-13　｜　**輸入**：Notion CM-2711、[`FR-135-STATE.md`](handoff/FR-135-STATE.md)「功能補齊」範圍、[雛形](prototype/phase3-index.html)

## 變更紀錄 {#changelog nav="變更紀錄"}

| 日期 | 變更 | 對應 |
|---|---|---|
| 2026-10-13 | v1：第三期兩卡規格（X1 三份法定文件、S1 支援期徽章）；通報、提醒相關設計草案移至 [phase3-deferred-to-recurring-tasks-fr](phase3-deferred-to-recurring-tasks-fr.md) | CM-2710、CM-2711 |

---

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

整案一句話：**CRA 專案結案時從已填資料產出三份法定文件（docx，顧問可再改），資訊系統版本表直接看得到支援期還剩幾天。CMMC 專案一個像素都不變。**

給非工程讀者的背景：CRA（歐盟網路韌性法）要求製造商備妥技術文件（Annex VII）、給使用者的資訊（Annex II）、EU 符合性聲明，並對每個產品版本宣告支援期。這些內容大多已在 CRA 專案各頁填過（受評標的、風險評估、參與單位、資訊系統版本），本期把它們組成可下載的文件，並讓支援期快到的版本一眼看得出來。

::: {.callout .decided}
**本期前提（決策者 2026-10-13 已裁，不再討論）**

① 第三期兩張卡，順序 X1 → S1。② D4：文件只出 docx（見「已裁決策」節）。③ 通報、提醒排程、支援期到期寄信不在本期，併入 FR-137「週期任務與條件通知」；掃描結果加處理狀態屬 FR-134。④ 雛形不改，要改的點寫在本稿。
:::

| 卡 | 做什麼 | 產出 | 決策者檢查法 |
|---|---|---|---|
| **X1** 三份法定文件 | 三份 docx 範本（Annex VII 技術文件、Annex II 使用者資訊、EU 符合性聲明），沿用 docxtpl 產生器 | 範本三份、組資料的 service、下載端點 | 對照雛形 [phase3-docs-export](prototype/phase3-docs-export.html)：下載的 docx 欄位對得上畫面填的值 |
| **S1** 支援期到期畫面 | 資訊系統版本子表加「剩餘天數」徽章與篩選 | FE 為主 | 對照雛形 [phase3-support-reminder](prototype/phase3-support-reminder.html) 版本列 |

兩卡互不依賴，可平行；X1 排前面，因為決策者先看得到成品。

```{.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'}}}%%
flowchart LR
    SC[受評標的 ext 欄] -.-> X[X1 三份 docx]
    R[風險評估 ssp_risks] -.-> X
    V[資訊系統版本<br/>information_system_versions] -.-> X
    P[參與單位 Party] -.-> X
    V -.-> S[S1 剩餘天數徽章]
```

---

## 現況盤點：可直接用 vs 要新做 {#inventory nav="盤點"}

座標皆於 2026-10-12 實查。FE 路徑相對 `compliance-manager-fe/`。

| 接入點 | 現況（證據） | 本期動作 |
|---|---|---|
| docx 產生器 | `app/oscal/service/export/ssp_docx_generator.py`（260 行）用 `DocxTemplate`（`:23`）＋ python-docx 補章節；範本路徑寫死 `templates/ssp/ssp_cmmc_template.docx`（`:29`），建構子可傳別的範本（`:52`）；資料模型 `ssp_export_model.py`（169 行）已有 Party、盤點、元件 | X1 沿用產生器的「範本＋context」作法，各文件各寫 context 組裝 |
| CRA 範本池 | `app/oscal/templates/cra/` 現有 5 份（CVD 政策、安全通告、支援期聲明、更新與汰除程序、使用者資訊），由 `scripts/generate_cra_doc_templates.py`（309 行）產；**是空骨架、沒有 `{{ }}` 欄位**（grep 0 處） | X1 另加 3 份**帶欄位**的範本，不改這 5 份 |
| 受評標的 ext 欄 | `app/oscal/service/framework_library_defaults/cra_2024.py:13-53` 定義 `ext:cra-*` 欄（用途、環境、分級、產品名與識別、SBOM 取得、文件位置、支援期結束日） | X1 讀取 |
| 風險評估 | `oscal.ssp_risks`（R1-a `a6cef11f3`），含 `threat_ids` 依據標準 | X1 讀取（Annex VII 風險評估、符合性聲明的適用標準） |
| Party 角色 | `cra_2024.py:136-138` 預建「Manufacturer」「Vulnerability contact」兩個 party（role `manufacturer`／`vulnerability-contact`），名稱含 `(to be filled)` 佔位 | X1 三份文件讀同一個 party |
| 資訊系統版本 | `compliance.information_system_versions`（jedi-asset migration 006）有 `support_end_date`、`support_end_reason`；DEV **0 筆**；FE `src/views/information-system/InformationSystemVersionTable.vue`（169 行）支援期欄 `:136-141` | S1 加徽章；X1 讀支援期 |
| 顯示時區 | FE 顯示時區寫死 `src/utils/dateTime.js:9`（`getDisplayTimeZone()`） | S1 以此算「今天」 |

---

## X1 三份法定文件 {#x1 nav="X1"}

### 做什麼

CRA 專案的「匯出」多三個下載：Annex VII 技術文件、Annex II 使用者資訊、EU 符合性聲明（Annex V）。都是 docx，顧問下載後可再改字（D4）。

### 作法

沿用 `SspDocxGenerator` 的路線：`DocxTemplate(範本).render(context)`。三份範本各配一支 context 組裝函式，放新檔（不往 260 行的 `ssp_docx_generator.py` 塞，也不改它的 CMMC 流程）；範本放 `app/oscal/templates/cra/`，檔名加 `-Export` 之類後綴與 C3 五份空骨架區分。範本產生方式比照 `scripts/generate_cra_doc_templates.py` 用腳本產（可重產、可 diff），不手工編 docx。

### 欄位來源對照

| 文件 | 主要欄位 | 來源 |
|---|---|---|
| Annex VII 技術文件 | 產品描述與預期用途、設計架構、風險評估、採用標準、漏洞處理流程、支援期、SBOM 取得方式 | 受評標的 `ext:cra-intended-purpose`／`ext:cra-operational-environment`／`ext:cra-product-class`（`cra_2024.py:13-53`）、`ssp_risks` 全表（含 `threat_ids` 依據標準）、控制項實作說明、`information_system_versions`、`ext:cra-sbom-access` |
| Annex II 使用者資訊 | 製造商名稱地址聯絡、漏洞通報窗口、產品識別、預期用途、可預見誤用、符合性聲明網址、支援期結束日、SBOM 取得處 | Party `manufacturer`／`vulnerability-contact`、`ext:cra-product-name`／`ext:cra-product-identifier`、`ext:cra-intended-purpose`／`ext:cra-foreseeable-misuse`、`ext:cra-doc-location`、版本 `support_end_date`（或 `ext:cra-support-end-date`）、`ext:cra-sbom-access`；條文順序照 `docs/reference/CRA/annex-I-II-original-text.md` Annex II 第 1～9 項 |
| EU 符合性聲明 | 產品名與識別、製造商、聲明唯一性、適用標準、簽署欄 | Party、受評標的 ext、`ssp_risks.threat_ids` 依據標準；簽署人與日期留空給人填 |

匯出權限比照既有 SSP 匯出（參與者可讀即可下載）。

---

## S1 支援期到期畫面 {#s1 nav="S1"}

### 做什麼

資訊系統盤點的版本子表，每個版本多一個「剩餘天數」徽章（超過 90 天灰、90 天內橘、30 天內紅、已過期深紅），並可篩選「90 天內到期」。不另建產品主檔，讀既有 `support_end_date`。

### 現況與改動

- FE `InformationSystemVersionTable.vue:136-141` 已有支援期欄，加徽章即可；剩餘天數以 `src/utils/dateTime.js` 的顯示時區算「今天」，純日期照字面（不換算）。
- 雛形 [phase3-support-reminder](prototype/phase3-support-reminder.html) 的「專案首頁提醒卡」與「通知設定」本期不做：提醒卡雛形寫明是提案；到期通知屬 FR-137。
- 不寄提醒信。
- DEV 版本表 0 筆，S1 驗收前要先在 DEV 建幾筆不同到期日的版本。

---

## 已裁決策 {#decisions nav="已裁"}

::: {.callout .decided}
**✅ D4 — 文件格式**

**定案**：只出 docx，沿用 `ssp_docx_generator.py` 的 docxtpl 路線，顧問可再改字；不做 PDF。

**理由**：法定文件交出去前幾乎一定要人改；docx 產生器已有、已出貨。

**被排除**：`common/util/html_pdf.py`（HTML 轉 PDF，27 行）是第二條路，本期不做——產出不可改字，且要另維護一套 HTML 版型。
:::

D1、D2、D3、D5、D6 作廢（2026-10-13 改裁，見歸檔 [phase3-deferred-to-recurring-tasks-fr](phase3-deferred-to-recurring-tasks-fr.md)）。

---

## 拆卡草案（依「何時看得到畫面」排序） {#cards nav="拆卡"}

| 順序 | 卡 | 規模 | 主要檔案 | 前置 |
|---|---|---|---|---|
| 1 | **X1 三份法定文件** | M | 範本產生腳本、三份 docx、context 組裝新檔、下載端點 | 無 |
| 2 | **S1 支援期到期畫面** | S | FE `InformationSystemVersionTable.vue` | 無（可與 X1 平行） |

兩卡都不建新表、不寫 migration。

---

## 不做清單 {#out nav="不做"}

- 通報案件頁籤：通報在系統裡只剩「掃描掃到 high 以上時通知通報人員並留紀錄」，併入 FR-137；`CRA.ART.14.RP` 的證據由客戶上傳 ENISA 平台送件截圖。
- 弱點處理狀態／揭露狀態：掃描結果要不要加狀態欄屬 FR-134（STATE §3 第 14 列），證據來源已指到掃描頁，稽核員看那頁判定。
- 提醒排程與寄信紀錄（通報期限提醒、支援期到期提醒）：併入 FR-137。
- 早期警示、72 小時通知、最終報告三份文件：沒有案件資料，產不出內容。
- 多法規（台灣資安法、NIS2、GDPR）、多送件對象、情資來源（STIX／TAXII）、ENISA SRP 對接（平台無 API）。
- PDF 版法定文件（D4）。
- 專案首頁支援期提醒卡、通知設定畫面（雛形提案）。
- 改 C3 五份空骨架範本；改 `source_scan_findings` 表結構。
- 自家 SBOM 成證據（STATE 總圖第三期另一列，D14）不在這兩卡內。

---

沿革見 [`handoff/FR-135-LOG.md`](handoff/FR-135-LOG.md) 與 git log。
