From 4863e0244c437d59badf69e77eee946afff0fccf Mon Sep 17 00:00:00 2001 From: guan4tou2 Date: Fri, 4 Sep 2026 13:03:11 +0800 Subject: [PATCH 1/2] docs: a handover for whoever picks this up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eight PRs landed in this stretch and the reasoning behind most of it lives in commit messages nobody reads twice. This is the part a diff cannot carry: why each decision went the way it did, what is still open and why it was deferred, and the traps in this tree that cost real time. The open items are written as work, not as a wish list — each says what it is, why it is not done, where to start, and what needs a human decision. The bookmark rename is blocked on aliasing three external contracts; the SQL table rename is blocked on whether anyone runs mixed versions against one project. The traps section is the part I would most want handed to me. The native-module ABI swap, whose failure mode is unit tests SKIPPING rather than failing. The temporal-dead-zone crash that only appears in the bundled build, which has bitten this codebase three times and which vitest structurally cannot see. The two-tier tables, where most of the corpus lives in the half that gets pruned. The source-scanning guard tests. And two of my own mistakes from this stretch: a scripted edit whose anchor silently missed and stopped capture for three commits, and a `git checkout --` that ate an hour of uncommitted work in the file I was editing. ROADMAP.md gets a staleness banner rather than a rewrite — it was written against v0.9.3, five releases back, and rewriting someone's planning document from the outside is worse than pointing at what is current. The docs index has been claiming v0.11.7; it now says v0.14.3 and leads with the handover. Every relative link and code path in the new page is checked to resolve. Co-Authored-By: Claude Opus 5 --- docs/HANDOVER-2026-09.md | 223 +++++++++++++++++++++++++++++++++++++++ docs/README.md | 3 +- docs/ROADMAP.md | 7 ++ 3 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 docs/HANDOVER-2026-09.md diff --git a/docs/HANDOVER-2026-09.md b/docs/HANDOVER-2026-09.md new file mode 100644 index 00000000..09341db2 --- /dev/null +++ b/docs/HANDOVER-2026-09.md @@ -0,0 +1,223 @@ +# 交接 — 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 這份是它的鏡像加實作狀態註記。要改規範本身,去設計專案改,再同步回來。 + +### 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..024a9127 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 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. From 6bbee6740a0b0e671c104667fedc458b6f46635f Mon Sep 17 00:00:00 2001 From: guan4tou2 Date: Fri, 4 Sep 2026 13:22:10 +0800 Subject: [PATCH 2/2] docs: bring the mark masters in, and say plainly that the icon still is not them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The written standard has been in the repo since #29, but two things it names were not: the app-icon masters, and the design canvas itself. The masters are now at design/assets/. The canvas is deliberately not — it is authored in the design project, and a copy in the repo would just be a second truth that drifts. Pulling the masters in surfaced a contradiction worth writing down: §16 says the old logo "was replaced", while resources/icon.svg, resources/logo.svg, resources/tray-icon.svg and the renderer's logo.svg are all still the old one, gradients and glow included, and every .icns/.ico/PNG derives from them. So §16 now carries a ▲ 分歧 saying it describes the design ruling, not what you get when you install the app, and the handover carries the swap as item 7 with the part that makes it more than a file replacement: the macOS tray set is a Template image with two states, and 16px is exactly where the old mark failed. Co-Authored-By: Claude Opus 5 --- design/README.md | 27 +++++++++++++++++++++++++++ design/assets/redlog-mark-small.svg | 6 ++++++ design/assets/redlog-mark.svg | 8 ++++++++ docs/HANDOVER-2026-09.md | 14 ++++++++++++++ docs/README.md | 2 +- docs/UIUX-STANDARD.md | 6 ++++++ docs/design-project-sync.md | 9 +++++++++ 7 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 design/README.md create mode 100644 design/assets/redlog-mark-small.svg create mode 100644 design/assets/redlog-mark.svg 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 index 09341db2..345ccee2 100644 --- a/docs/HANDOVER-2026-09.md +++ b/docs/HANDOVER-2026-09.md @@ -129,6 +129,20 @@ scope-aware sanitize 與 artifact rotation 都還沒做。文件現在誠實了 `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`),這樣漂移不可能發生; diff --git a/docs/README.md b/docs/README.md index 024a9127..84145b3e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,7 @@ Wiki-style index for **v0.14.3**. 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/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 檔案 |