# Artifact 產物契約
這份規則是需求級 HTML、截圖與議題附件的唯一正本。
## 資料流
1. `/sdlc-analyze` 完成排程後重新取得需求與工作包抽取 JSON。
2. 流程組成一個 `schemaVersion: 1` 的需求根物件,暫存於 `.tmp/`。
3. `scripts/overview-render.js --input --output --manifest ` 驗證並產生自包含 HTML。
4. 預覽平台優先;沒有預覽能力時,使用可用 ephemeral port 短暫啟動 Node 靜態伺服器。
5. 瀏覽器產生 full-page 與圖表局部 PNG,寫入 manifest。
6. `scripts/issue-assets.js --repo ... --index ... --manifest ...` 上傳附件並就地更新需求議題附件索引。
JSON、HTML、SVG 與 PNG 全部寫入 `.tmp/`,不寫入目標專案。
## 根物件
必要欄位:`schemaVersion`、`source`、`requirement`、`workPackages`、`overview`。
`schemaVersion` 不是目前 renderer 支援的版本時必須停止;未知欄位保留。
## 圖表
圖表以抽象資料保存:`kind`、`direction`、`nodes`、`edges`。議題輸出由 renderer 產生 Mermaid;HTML 重新產生 SVG 或 HTML/CSS,不得直接搬用 Mermaid。
流程、依賴、架構與網路圖使用 SVG;卡片與清單使用 HTML/CSS。布局必須固定且可重跑。
## 公式
公式是可選欄位,保存 LaTeX 原文、標題、說明與用途。議題使用 `formula` fenced block;HTML 使用自包含 SVG。單一公式解析失敗時保留原文並標記未渲染,不得靜默遺失;公式欄位結構錯誤仍使整體 schema 驗證失敗。
## 截圖與附件
manifest 的每個 screenshot 必須包含 `role`、`path`、`fileName`、`sha256`。PNG 使用固定語意檔名,內容 hash 用 SHA-256。
full-page 與局部圖全部上傳為需求議題附件,不直接嵌入圖片。正文只保留一行附件索引;重跑時內容相同就重用,無法確認 hash 就新增附件。附件上傳或議題索引更新失敗是硬錯誤。
若平台提供真正可用的 preview URL,才使用既有 `--overview-url` 回寫;不可把 `.tmp/` 或 `0.0.0.0` 寫回議題。
## 截圖 backend
平台 preview 是首選。沒有平台 preview 時,可執行:
```
node scripts/overview-capture.js --backend auto --url --output
```
若沒有瀏覽器但有 SVG rasterizer:
```
node scripts/overview-capture.js --backend svg --svg --output
```
`auto` 優先使用 Firefox,再使用 `rsvg-convert` 或 `resvg`。找不到任何 backend
必須失敗並保留 `.tmp/` 的 HTML/SVG,不得假裝已完成截圖。