diff --git a/design/README.md b/design/README.md new file mode 100644 index 00000000..98bd44ba --- /dev/null +++ b/design/README.md @@ -0,0 +1,27 @@ +# 設計來源檔 + +從 Claude Design 專案「RedLog 設計規範」取回的原稿,供不能開那個專案的人使用。 +規範本文在 [`../docs/UIUX-STANDARD.md`](../docs/UIUX-STANDARD.md);往返記錄在 +[`../docs/design-project-sync.md`](../docs/design-project-sync.md)。 + +## assets/ + +| 檔案 | 是什麼 | 現況 | +|---|---|---| +| `redlog-mark.svg` | 1024×1024 app 圖示原稿。切角 22%、環外徑 45%、環寬 16%、內點 30%(`UIUX-STANDARD.md` §16) | **尚未套用** | +| `redlog-mark-small.svg` | ≤256px 變體,環收成實心點;16px 用它 | **尚未套用** | + +**▲ 分歧,已知**:`resources/icon.svg`、`resources/logo.svg`、`tray-icon.svg` 與 +`src/renderer/src/assets/logo.svg` 目前仍是**舊標**——圓角方形漸層底、漸層 R、斜線、外光暈。 +§16 明說那一版已由上面的字標取代,理由是「漸層、外光暈與斜線在 16px 下全部糊成一團,且與 §1 +『去飽和、不發光』的整體方向相反」。 + +換過去不只是替換檔案:`.icns` / `.ico` 由原稿產生,`electron-builder` 的設定、系統列圖示與 +renderer 內嵌的 logo 都要一起動,並且要在三個平台目視確認。所以這裡只放原稿,不動打包路徑—— +接手的人請把它當成一項待辦,別當成「已經套用」。 + +## 沒有放進來的 + +**設計稿本體(`RedLog 設計規範.dc.html`)**——1a 到 9b 的所有畫板。它在 Claude Design 專案裡 +著作與編輯,複製一份進 repo 只會產生第二個會漂移的真相。要看畫面本身就開那個專案;repo 這邊 +有的是從它萃取出來的文字規範(22 節,全文)。 diff --git a/design/assets/redlog-mark-small.svg b/design/assets/redlog-mark-small.svg new file mode 100644 index 00000000..351e77b7 --- /dev/null +++ b/design/assets/redlog-mark-small.svg @@ -0,0 +1,6 @@ + + RedLog + + + + diff --git a/design/assets/redlog-mark.svg b/design/assets/redlog-mark.svg new file mode 100644 index 00000000..0a73fb87 --- /dev/null +++ b/design/assets/redlog-mark.svg @@ -0,0 +1,8 @@ + + RedLog + + + + + + diff --git a/docs/HANDOVER-2026-09.md b/docs/HANDOVER-2026-09.md new file mode 100644 index 00000000..345ccee2 --- /dev/null +++ b/docs/HANDOVER-2026-09.md @@ -0,0 +1,237 @@ +# 交接 — 2026-09-04 + +這一輪從「設計專案與 repo 對帳」開始,做完了設計稿 turn 8–9 的五項提案,順帶清掉一批既有缺陷。 +八個 PR(#25–#32)已併入 `main` @ `952e968`。 + +這份文件寫的是**接手的人需要知道、但從 diff 看不出來的事**:每個決定的理由、還開著什麼、 +以及這個 codebase 有哪些會咬人的地方。規範本身在 [`UIUX-STANDARD.md`](UIUX-STANDARD.md), +設計專案往返記錄在 [`design-project-sync.md`](design-project-sync.md)。 + +--- + +## 現在的狀態 + +``` +main @ 952e968 · v0.14.3 +分支:只有 main(本機與遠端) +開著的 PR:0 +封存 tag:archive/ux-design-and-tickets(見下方「已關閉的方向」) +``` + +驗證(**照這個順序**,原因見下方「native module 的 ABI 陷阱」): + +```bash +npm run typecheck && npm test && npm run build +npx electron-rebuild -f -w better-sqlite3 && npx playwright test +npm rebuild better-sqlite3 # 換回 Node ABI,否則下次 npm test 會整批 skip +``` + +目前基準:typecheck 乾淨 · unit **1055 passed (98 files)** · e2e **89 passed, 1 skipped**。 + +--- + +## 這一輪做了什麼 + +| PR | 內容 | 值得記住的決定 | +|---|---|---| +| #25 | 設計專案對帳 + §21 rule-6 測試 | 設計稿長到 22 節、repo 只有 11 節的部分鏡像,兩邊都不知道對方動了 | +| #26 | **8b 標記修訂** | 修訂是新的鏈上事件,不是 UPDATE。fold 的排序刻意不用 Timeline 的比較器 | +| #27 | **8a 範圍回溯** | 撤回由「違規紀錄」算,不是重掃語料 | +| #28 | **9a/9b/5c 漸進揭露** | 每個「比較寬鬆的解鎖判準」都會讓某一頁說謊 | +| #29 | 設計稿全文進 repo | 反方向的整份複製才安全;加上實作狀態註記 | +| #30 | 四個安靜的缺陷 | 包含一份宣稱自己已出貨的規格文件 | +| #31 | **typecheck 進 CI** | 367 → 0,其中三個是活的 bug | +| #32 | **書籤裁決** | quickmarks 本來就不是紀錄,是產品一直宣稱它是 | + +### 三個核心決定,展開來說 + +**8b — 為什麼修訂是新事件。** `events` 表用兩個 trigger 拒絕 UPDATE 與 DELETE,那是設計而不是 +要繞過的障礙。所以修訂寫成 `marker` + `data.subtype:'amended'`,只夾帶變更欄位,原列一個位元組 +都沒動;操作員看到的標記是 (原列, 修訂們) 的 fold(`lib/markerFold.ts`)。復原就是再修一次。 + +排序上有個坑值得記住:fold **不能**用 Timeline 的 `eventCompare`(當時),因為牆鐘時間會在 NTP +校正時回跳,而「最後一次修訂勝出」必須指寫入順序。後來 #30 把那個比較器的死碼修掉並抽成 +`lib/eventOrder.ts`,兩邊現在共用同一份。 + +**8a — 撤回為什麼不重掃。** 語料大半在 logged 層,30 天後被 retention 清掉。重掃式的撤回會讓 +那些違規永遠掛著,因為來源列已經不在了。所以撤回是從**違規紀錄**本身算的。另外三個必須知道的: +- `in_scope` 判定也寫成 `system.scope_violation` 列(遵循度統計需要正面證據),**不能**算成既有 + 違規,否則新排除的主機會變成「改判」而不是「新標」。 +- 候選目標用 SQL 依 live 路徑的方式推導,**不是 `target_id`**——DNS producer 存的是帶結尾點的 + FQDN,當初判定的是去點形式,而網域比對是精確比對。 +- 寫入包在單一 transaction 裡,catch 必須先 `invalidateChainHeadCache()`:`insertEvent` 每次成功 + INSERT 就推進快取、只在該次 INSERT 失敗時重置,所以其他原因造成的 rollback 會讓下一筆插入接到 + 一個不存在的列上。 + +**9b — 每個寬鬆版都會讓某一頁說謊。** 這是整個功能真正的工作量所在: +- 「證據」不能定義成「非 housekeeping」。alert runtime 每次開專案就啟動、IP policy 無條件送出第一 + 筆判定(離線也送),所以幾秒內就有一筆非 housekeeping 的上鏈列——首次執行畫面會自己消失。用正面 + 述詞 `EVIDENCE_SQL`;`HOUSEKEEPING_SQL` 刻意不擴大,因為 Timeline 鏡像它、那筆判定該留在時間軸上。 +- 「目標」只算**指令**推導出的目標。proxy addon 對每筆 HTTP/DNS、連線監控對每個 socket 都會蓋 + `target_id`,跨型別去算的話開一次瀏覽器就解鎖兩頁。 +- HTTP 等 logged 層的流量(那頁只查 logged 層);標記等書籤列,不是 `marker` 事件。 +- 首次執行畫面必須**閂鎖**:直接讀「還沒有資料」的話,第一列進來的瞬間畫面就被卸載,而那正是它 + 要讓人看到的一刻。這是 e2e 抓到的。 + +--- + +## 還開著的事 + +按「接手時的價值 ÷ 風險」排序。每一項都寫清楚為什麼還沒做。 + +### 1. 內部識別字改名(書籤)— 中等,機械性,有外部契約風險 + +#32 只改了使用者可見的一半。程式碼裡仍是舊名: + +| 現在 | 應為 | 需要別名嗎 | +|---|---|---| +| `src/core/db/findings.ts` · `QuickMark` 型別 | `bookmarks.ts` · `Bookmark` | 否,純內部 | +| `src/renderer/src/components/FindingsView.tsx` | `BookmarksView.tsx` | 否 | +| `quickmarks:*` IPC 頻道 + preload bridge | `bookmarks:*` | 否,前後端同時改 | +| `GET|POST /api/quickmarks` | `/api/bookmarks` | **是**,舊路由要保留 | +| CLI `quickmark` / `quickmarks` 動詞 | `bookmark` | **是** | +| 外掛能力字串 `read:findings` + `findings.list` | `read:bookmarks` | **是**,這串活在第三方 manifest 裡 | +| SQL 表名 `quickmarks` | `bookmarks` | **需要人決定**(見下) | + +**為什麼還沒做**:三個外部契約(REST、CLI、外掛能力)要連別名一起改才不會弄壞已安裝的整合, +而那和 #32 的行為變更(移出證據包)混在同一個 PR 裡會讓兩者都難 review。 + +**SQL 表名要人決定**:`ALTER TABLE quickmarks RENAME TO bookmarks` 是既有 migration 區塊裡的一行, +但舊版本 RedLog 開啟已遷移的專案會找不到表、那頁變空。如果有混用版本的工作流程,就別改。 + +**現在有 typecheck 了**,這正是讓這種大範圍改名安全的守衛。 + +### 2. 書籤沒有保存期限清理 — 小,但裁決之後更該做 + +`src/core/retention.ts` 會清 casts、screenshots、agent 逐字稿、http bodies 與 `events_logged`, +但 `quickmark` 這個字在裡面出現 **0 次**。 + +一個存著貼上憑證與擷取到的外部 IP(`quickmarks:create` 會注入 `alertRuntime.ipStatus().externalIP`) +的私人便條本永久留存,在「它只是便條本、不是紀錄」這個裁決之後**更**站不住腳,不是更站得住。 +沒有 keep-days,也沒有任何清理路徑。 + +### 3. `redlog-verify.py` 從不檢查 `manifest["files"]` — 結構性的洞 + +驗證器只走事件鏈。`manifest.json` 列的每個檔案都有 SHA-256,但驗證器從不重算它們,所以 +`screenshots/`、`casts/`、`chain_anchors.json`、`operators.json` 全都是「列在 manifest 但從不檢查」。 + +`quickmarks.json` 是其中最尖銳的一例——它是唯一連對應鏈上紀錄都沒有的條目——#32 移掉了那一例, +**洞還在**。收件人拿到證據包,無法察覺截圖或錄影被換掉。 + +### 4. `SPEC-SCOPE-AWARE-LIFECYCLE.md` 的規格尚未實作 + +#30 改寫了它那段「✅ shipped」的假宣告(點名的模組一個都不存在),但規格本身仍然成立: +scope-aware sanitize 與 artifact rotation 都還沒做。文件現在誠實了,東西還沒有。 + +### 5. 設計專案已知、但仍是單向的部分 + +`github.md` 已回寫(見 `design-project-sync.md` 2026-09-04),但設計專案的 +`docs/UIUX-STANDARD.md` **刻意沒有被覆寫**——那份 22 節是著作處,整份寫回會蓋掉設計側內容。 +repo 這份是它的鏡像加實作狀態註記。要改規範本身,去設計專案改,再同步回來。 + +### 7. 出貨的圖示還是舊標 + +設計端在 §16 定案了新標——切角矩形、中空環、實心點——原稿已放在 `design/assets/`。 +但 `resources/icon.svg`、`resources/logo.svg`、`resources/tray-icon.svg` 與 +`src/renderer/src/assets/logo.svg` 都還是舊標(漸層底、漸層 R、斜線、外光暈), +`.icns` / `.ico` / 系統列 PNG 也都是從舊標產生的。 + +**為什麼還沒做**:換標不是替換四個 SVG。`.icns`、`.ico` 與六個尺寸的 PNG 要重新產生, +macOS 系統列那組是 Template 圖(純黑加 alpha,系統自己反白),錄製中/暫停兩個狀態各有一張, +不能直接餵新標的紅色。還要在三個平台實際看過 16px 與 Dock 尺寸——那正是舊標壞掉的地方, +所以這步不能只看 SVG 檔就算數。整件事跟這一輪的行為變更無關,混在一起 review 只會兩邊都看不清。 + +`docs/UIUX-STANDARD.md` §16 已標上 ▲ 分歧,寫明規範描述的是設計端定案、不是現在裝起來會看到的東西。 + +### 6. `env.d.ts` 仍是手抄的 preload 鏡像 + +#31 把它補正了,但它仍會漂。真正的修法是讓它推導自 preload(`typeof api`),這樣漂移不可能發生; +代價是 `env.d.ts` 會從 global script 變成 module,連帶影響每個裸用 `ProjectMeta` / `HookInfo` 等 +全域型別的檔案。屬於另一次重構。 + +--- + +## 這個 codebase 會咬人的地方 + +接手前讀完這一節,可以省下我這輪踩過的每一個坑。 + +### native module 的 ABI 陷阱 + +`better-sqlite3` 是原生模組,**vitest 需要 Node ABI,e2e 需要 Electron ABI**。切換: + +```bash +npx electron-rebuild -f -w better-sqlite3 # 換成 Electron ABI(跑 e2e 前) +npm rebuild better-sqlite3 # 換回 Node ABI(跑 unit 前) +``` + +忘了換回來的症狀是 **unit 測試整批 skip 而不是失敗**——DB 相關的 suite 用 +`describe.skipIf(!available)` 保護。看到 `Tests 8 skipped (8)` 就是這件事。 + +那個保護的正確寫法在 `test/cast-index.test.ts:11-21`:**必須 `new Database(':memory:')` 探測**, +只 import 是不夠的(binding 是延遲載入的,import-only 的守衛會回報「可用」然後在被測模組內部炸掉)。 + +### TDZ:只在打包後才出現的崩潰 + +React hook 的 dep array 在 render 時求值。一個 hook 若引用**宣告在它下面**的 `const`,在 +esbuild 打包後會是 temporal-dead-zone 崩潰——而 **vitest 看不到**,因為它是逐檔轉譯原始碼。 + +這個 codebase 已經被咬過**三次**(`TargetView` 的 listNav、`Timeline` 的 `collapsedBands`、 +`App` 的 visibility memo)。相關檔案裡都寫了契約註解,照著擺:`Timeline.tsx` 的 fold memo 在 +`effectsById` 之後、`badgesById` 之前,`App.tsx` 的 visibility memo 緊接狀態區。 + +**e2e 是唯一的守衛。** 動過 Timeline.tsx 或 App.tsx 的 hook 順序就跑 `npm run build && npm run e2e`。 + +### 兩層事件表 + +`events`(上鏈)與 `events_logged`(支撐證據,30 天後清)。`classifyTier` 決定去哪一張, +未列出的 pair 預設 chained。**任何 join 或聚合都必須考慮兩張表**——語料大半在 logged 層 +(所有 HTTP、DNS、browser console、agent thinking)。 + +已知的例外:`searchEvents` 只查 `events`。這是既有行為,不是這輪造成的。 + +### 腳本化編輯要 assert + +我這輪犯過一次:一個 `s.replace(old, new)` 的錨點不符、靜默跳過,害 `scopeSignalFor` 的 import +沒落地。dispatch 在 insert 之前,所以**任何帶目標的 shell POST 都會 500,連事件都沒寫進去**—— +擷取靜默停掉,三個 commit 後才被 e2e 抓到。 + +現在有 typecheck 會接住這一類。但仍然:批次編輯後,grep 一下該編輯應該引入的識別字。 + +### 不要對正在編輯的檔案下 `git checkout --` + +它會還原到 HEAD,包含未提交的工作。我用它撤銷一行故意改壞的測試,連帶清掉了同一個檔案裡 +一小時的改動。 + +### 從原始碼解析的守衛測試 + +這個 repo 有一批測試是讀 `.ts` 原始碼、用 regex 斷言規則的(`design-tokens`、`lane-colours`、 +`buttons`、`truncation`、`danger-not-on-numbers`、`list-keyboard`、`i18n-keys`、 +`housekeeping-parity`、`redaction-boundary`、`typecheck-guard`)。改 UI 前先看它們要什麼。 + +兩個容易忘的:**截斷的 span 一定要有 `title`**;**危險紅絕不出現在數字上**(`tabular-nums` 與 +danger 類名不能出現在同一個 className)。 + +### i18n 掃描器看不到動態鍵 + +`test/i18n-keys.test.ts` 只掃字面 `t('a.b')`。用變數組出來的鍵它看不到——`sidebar.http_history` +就是這樣漏掉的,那個鍵兩本語言檔都沒有,直接把鍵名印給操作員。 + +掃描器現在也認 `reasonKey: 'a.b'` 字面值。再有這種模式,記得一起加進去。 + +--- + +## 已關閉的方向 + +**PR #8「時間軸重建軸線」** 已關閉未合併,分支封存為 tag `archive/ux-design-and-tickets`。 +47 個 commit 沒有進 main。 + +關的理由是**方向不同,不是過期**:它的核心動作是換掉泳道模型並刪除 `TargetView.tsx`,而 main +後來出貨的目標聚焦(`47cc2ef`)、18 泳道分帶(`183b9ac`)與 §22 漸進揭露都建立在那兩樣東西上—— +§22 更是把「目標」當成一個依資料揭露的頁面,而不是要移除的頁面。 + +要回頭撿: + +```bash +git checkout -b revive archive/ux-design-and-tickets +git cherry -v main archive/ux-design-and-tickets | grep '^+' +``` diff --git a/docs/README.md b/docs/README.md index 626b9140..84145b3e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # RedLog Docs -Wiki-style index for **v0.11.7**. Every page is self-contained; follow the links inside each for cross-references. Downloads on the [releases page](https://github.com/guan4tou2/REDLOG/releases/latest). +Wiki-style index for **v0.14.3**. Every page is self-contained; follow the links inside each for cross-references. Downloads on the [releases page](https://github.com/guan4tou2/REDLOG/releases/latest). ## What RedLog is (and isn't) @@ -10,6 +10,7 @@ Wiki-style index for **v0.11.7**. Every page is self-contained; follow the links ## Start here +- **[交接 2026-09](HANDOVER-2026-09.md)** — **read this first if you are picking the work up.** Where `main` stands, what the last eight PRs decided and why, what is still open (with the reason each was deferred), and the traps in this codebase that cost real time: the native-module ABI swap, the temporal-dead-zone crash that only appears in the bundled build, the two-tier event tables, and the source-scanning guard tests. - **[Agent integration](agent-integration.md)** — if you're wiring an agent to RedLog, start here. Covers everything from hook setup to MCP tool usage. ## Product & planning @@ -20,7 +21,7 @@ Wiki-style index for **v0.11.7**. Every page is self-contained; follow the links - **[Audit 2026-08-08](AUDIT-2026-08-08.md)** — standing defect list from a full-tree review: correctness, trust-model gaps, presentation, test coverage, doc drift. Each item tagged verified/reported. - **[UX & complexity audit 2026-08-10](UX-AUDIT-2026-08.md)** — persona-driven review of the renderer: where breadth has outrun the solo operator (Timeline 3,875 lines / Settings 2,681 lines), the first-run friction gap, and a prioritized backlog. Companion to the correctness audit above. - **[Core purpose and capture coverage](DESIGN-core-and-capture.md)** — the 2026-08-21 review that moved the core from *defensibility* to *knowability*, and what that does to capture: four gaps (non-HTTP traffic, remote commands, Windows output, queryable tool output), the point/span timeline model, and the purple-team activity record. Read alongside `PRODUCT-POSITIONING.md`, which it revised. -- **[UI/UX 標準](UIUX-STANDARD.md)** — the rule book UI code lands against, extracted from `src/renderer` itself: colour tokens, type scale, density, the component contract, UX principles, Timeline/HUD rules, and the three-phase checklist the PR templates in `.github/pull_request_template/` check against. Written and maintained in the Claude Design project — see [design-project-sync.md](design-project-sync.md) for the screen-to-source map and the last sync. +- **[UI/UX 標準](UIUX-STANDARD.md)** — the rule book UI code lands against, extracted from `src/renderer` itself: colour tokens, type scale, density, the component contract, UX principles, Timeline/HUD rules, and the three-phase checklist the PR templates in `.github/pull_request_template/` check against. Written and maintained in the Claude Design project — see [design-project-sync.md](design-project-sync.md) for the screen-to-source map and the last sync. The two app-icon masters it names live at [`design/assets/`](../design/assets/) — pulled in, not yet shipped (§16 ▲ 分歧). - **[Timeline UX deep-dive 2026-08-10](UX-TIMELINE-2026-08.md)** — the F2 deep-dive: why the timeline feels unintuitive (invisible, overloaded, context-dependent gestures), what it is *not* (lanes/data are fine), and the T1–T6 simplification plan. - **[UX backlog — ticket specs](UX-BACKLOG-TICKETS.md)** — every finding (F1–F7, T1–T6) broken out into an independently implementable ticket: problem, proposed solution, acceptance criteria, pure test seam, effort, priority order. - **[Timeline interaction redesign draft](DESIGN-TIMELINE-INTERACTION.md)** — concrete UI proposal with ASCII wireframes for the legend (T1), the wheel-mode decision matrix (T2), and the active-modes row (T3), plus the build order. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 45c0d7e9..0d969d07 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,5 +1,12 @@ # Roadmap +> **Stale as a status document (2026-09-04).** This was written against v0.9.3; +> `main` is v0.14.3 and five releases of work have landed since, none of it +> reflected below. The positioning section still holds. For what is actually +> open right now — and why each item was deferred — see +> [`HANDOVER-2026-09.md`](HANDOVER-2026-09.md). Rewrite this page against the +> current tree before planning from it. + Written 2026-08-08 against v0.9.3. Sources: `AUDIT-2026-08-08.md`, `timeline-io-visibility.md`, `WINDOWS_COMPAT_AUDIT.md`, and the open items CHANGELOG entries deferred. diff --git a/docs/UIUX-STANDARD.md b/docs/UIUX-STANDARD.md index 75535a43..43453924 100644 --- a/docs/UIUX-STANDARD.md +++ b/docs/UIUX-STANDARD.md @@ -228,6 +228,12 @@ - **字標沒有 SVG 檔,這是刻意的。** 它在每個出現的地方都是即時文字(app 介面、證據包報告的 HTML 與 PDF),幾何由 §4 的 em 規則決定,會隨字級自動正確。手寫座標的向量字標試過一次就壞了三處:環壓到 L、環在兩字之間偏 29 單位、G 被 viewBox 切掉 —— 位置是猜的,不是量的。真的需要向量字標時(貼紙、投影片),從打包的 Noto Sans TC 700 轉外框,不要手排 - 舊標 `assets/logo.svg`(圓角方形漸層底 + 漸層 R + 斜線 + 右上紅點與外光暈)由新標取代。新標保留了它唯一真正在說話的元素——那顆紅色錄製點——並把它從角落的裝飾升成名字本身;漸層、外光暈與斜線移除,因為它們在 16px 下全部糊成一團,且與 §1「去飽和、不發光」的整體方向相反 + - ▲ **分歧**:**repo 出貨的圖示仍是舊標。** `resources/icon.svg`、`resources/logo.svg`、`resources/tray-icon.svg` + 與 `src/renderer/src/assets/logo.svg` 都還有漸層與外光暈;`.icns` / `.ico` / 系統列 PNG 也都由舊標產生。 + 兩個新標原稿已放進 [`design/assets/`](../design/assets/),但沒有接上打包路徑——換標要一起動 `electron-builder` + 設定、系統列的 Template 圖與 renderer 內嵌 logo,並在三個平台目視確認,那是一次獨立的變更。 + 在那之前,本節描述的是設計端的定案,不是現在裝起來會看到的東西。 + ## 17. 串連檢查(turn 6,設計稿 6a) 一次任務從建立專案到交付八步,比對同一件事在不同畫面是否一致。三個只在串起來時才浮出的問題: diff --git a/docs/design-project-sync.md b/docs/design-project-sync.md index f4f4c518..a41eb5ae 100644 --- a/docs/design-project-sync.md +++ b/docs/design-project-sync.md @@ -218,6 +218,15 @@ append-only trigger 本來就不允許,這正是把修訂做成新事件而非 - 新增原生右鍵選單子系統(`src/main/context-menu.ts`),規範新增右鍵互動規則,並標記它與時間軸「右鍵落標記」的衝突。 - 產出 `docs/UIUX-STANDARD.md`(規範摘要 + 三期檢查表)與三張分期 PR 模板。 +### 2026-09-04 · 標誌原稿取回 + +`assets/redlog-mark.svg` 與 `assets/redlog-mark-small.svg` 從設計專案取回,放在 repo 的 +[`design/assets/`](../design/assets/)。取回不等於套用:出貨的圖示仍是舊標,已在 +`UIUX-STANDARD.md` §16 與 `HANDOVER-2026-09.md` 第 7 項記為分歧與待辦。 + +設計稿本體(`RedLog 設計規範.dc.html`,畫板 1a–9b)**沒有**複製進 repo。它在設計專案裡著作與編輯, +複製一份只會多出一個會漂的真相;repo 這邊有的是從它萃取的文字規範全文(22 節)。要看畫面就開設計專案。 + ## Screen map | 專案畫面 | 依據的 repo 檔案 |