Repository navigation
🏗️ Material Designer — rolling build log #1
Replies: 19 comments
✅ Phase 1 — the verbatim port has landedCommits (
🔬 How the copy was madeNot a working-tree copy. The tree was extracted as raw blob bytes straight out of the pinned submodule with conversion disabled on both ends: git -C vendor/open-design -c core.autocrlf=false -c core.eol=lf archive --format=tar HEAD | tar -xf - -C designThat matters on Windows, where the checked-out worktree is CRLF-smudged. Copying it would have produced 11,799 files that are basically the same — the two most expensive words in a port. Every blob id here is identical to upstream's, and the 73 executable bits were restored explicitly ( Two files are force-added past 📋 Verification — 0 gapsFull output of
|
🧩 Standalone application identity — and the first build has startedCommits (
|
| # | Collision | Consequence |
|---|---|---|
| 1 | Shared Electron userData directory |
One SQLite database, one artifacts tree, one credential store — two apps writing them |
| 2 | Shared single-instance lock (keyed on that directory) | This app silently app.quit()s while the other runs. No error, no window |
| 3 | Shared Windows named pipe | Second app talks to the wrong engine, or fails to start |
| 4 | Shared uninstall registry key | Uninstalling either deletes the other's Add/Remove Programs entry |
| 5 | Updater enabled by default, aimed upstream | The app downloads a different product and replaces itself with it |
Warning
Number 5 is the one worth staring at. An application must never update itself into something else. The default origin is now inert, and a packaged build enables the updater only when it was given a feed of its own.
Three quieter ones: buttons opening upstream's downloads page; the daemon fetching a remotely-controlled highlights document from an upstream-owned host on every launch and rendering its title, body, image and clickable link inside our UI — editorial control of a surface in this product, plus a launch signal from every user, configured by nobody; and a hardcoded menu label.
🔍 Why a search-and-replace would have failed
There were three separate product-name constants and a fourth copy of the identity logic hiding in the end-to-end test helper. Fixing the roots also surfaced two build-breaking literals: the payload writer looked for an executable under the old name while the builder produced the new one, and the launcher archive path disagreed with the paths module about its own filename. Both would have failed the build, not the review.
67 files changed, all 67 declared. Verifier: 0 gaps.
🚀 First build running now
Two workflows are executing for the first time ever:
- Verify — port integrity gate
- Release — install, typecheck, test, build the Windows installer, then install it, launch it, and make the running process answer its own health endpoint
Important
No outcome is known yet. This is the first time this code has been built by anything. The result — pass or fail — gets posted here as a new comment when it lands, with the run link.
🥟 粵語版
呢次唔係換個名咁簡單。 同上游個 app 裝埋一齊,喺 Windows 眼中根本係同一隻程式,八個地方撞,其中五個會真係整爛嘢:
共用 Electron 嘅 userData(一個 SQLite、一份 artifacts、一份密碼,兩隻 app 一齊寫);共用單一實例鎖(對面開住,呢邊靜雞雞閂咗,冇 error 冇窗);共用 named pipe;共用解除安裝嘅 registry key(拆邊個都拆埋人哋嗰個);最恐怖係自動更新預設開咗、而且指住上游 —— 唔理佢就會自己 download 另一隻產品覆蓋自己。
仲有三個安靜啲嘅:幾粒掣會開上游下載頁;daemon 每次開機去上游主機攞份文件,連標題、內文、圖同可以㩒嘅 link 一次過喺我哋個 UI render(即係人哋掌握住我哋一版嘢嘅編輯權);同埋一粒寫死咗人哋個名嘅選單。
點解人手改名一定會走樣: 個 codebase 有三個獨立嘅產品名常數,e2e helper 仲藏住第四份 identity 邏輯。順手捉到兩個會 build 唔到嘅硬編碼。67 個檔案,67 個都有交代,驗證 0 缺口。
Important
兩個 workflow 而家第一次跑緊。未知結果 —— 呢個係呢份 code 有史以來第一次被 build。無論綠定紅,落嚟都會喺呢度出返個 comment,connect 埋 run link。
🔴 First build: failed at the tests — and the failure is a good oneRun 30787963318 · commit ✅ What passed — the parts nobody knew would
Note That middle row was the single largest unknown in this whole project — an 11,799-file monorepo with native compilation, installing clean on a hosted runner at the first attempt. ❌ What failed258 tests passed. 3 failed. All three say the same thing:
Important This is not a rebrand regression. The failing paths read 🔧 The fix — a platform split, not a skip
Every spec still runs somewhere. Both files carry a comment saying which and why, so nobody later reads the Windows filter as "the mac tests were in the way". Also fixed: the line-count step now tees into the log rather than only the job summary. A table that exists only in the summary can't be read back when the number looks wrong — which is exactly when you want to read it. Retry running now on 🥟 粵語版第一次 build 喺測試度衰咗,但係衰得好。 過咗嘅先講:搬運驗證 11,799 個檔案、67 個聲明、0 缺口; 衰嗰邊:258 個測試過,3 個唔過,三個都嗌同一句 —— darwin 嘅 Important 呢個唔係改名改壞咗。錯誤訊息入面條路徑寫住 點解唔係「剷咗佢算」: Windows 嗰邊行返二十個真係關 Windows 事嘅 spec(身份、路徑、安裝目標、launcher payload —— 呢啲一衰就即係個 installer 壞);新開嘅 Linux job 行齊三個 package 嘅完整測試,淨低十七個(macOS 嗰批喺內)喺嗰度先至問得出真嘢。每個 spec 都仲有地方行,兩邊都寫低咗原因。 |
🌐 The site is livehttps://ding-ding-projects.github.io/material-designer/ Verified by request, not by assumption:
🔧 Four defects found while wiring itThe page shell existed but
Note The fix for the last one is a fallback, not a cover-up: an unknown key now leaves the element's own English text in place and the count is reported once to the console. The page reads correctly today, and the gap stays visible rather than quietly becoming the design. 🔒 Self-containment is enforced, not promisedThe deploy workflow fails the publish if the site ever loads a remote script, stylesheet, font, image, or makes a network request. No CDN, no analytics, no third party — checked on every deploy rather than asserted in a readme. 🏗️ Build statusStill red, still moving: No installer has been built yet. The current run is the first that should reach it. 🥟 粵語版個網站上咗線喇: https://ding-ding-projects.github.io/material-designer/ —— 逐個 asset 真係 curl 過先講,唔係靠估:首頁、CSS、main.js、點心圖鑑同一張菜相全部 200,serve 出嚟嘅 HTML 入面一個 駁線嗰陣捉到四個真問題: Note 最後嗰個嘅處理係「跌返落去」,唔係「冚住佢」:搵唔到 key 就唔郁,留返 HTML 本身嗰句英文,console 出一句總結。今日讀得通,個窿仲喺度睇得見,唔會就咁變成設計。 自我封閉係查出嚟嘅,唔係講出嚟嘅: 只要個站夾硬 load 外面嘅 script、字體、圖或者出 request,deploy 就會即刻紅。每次 deploy 都查,唔係喺 readme 寫句「我哋冇用 CDN」。 Build 仲係紅,但一路行緊: tools-pack 喺 Windows 過晒(20 個檔案、121 個測試),Linux 三個 package 完整跑晒都綠。到目前為止每次衰,衰嘅都係平台假設,唔係搬運或者改名出事。installer 一個都未砌出嚟 —— 而家跑緊呢次應該係第一次行到嗰步。 |
🔍 Five red builds, five different causes — and not one of them was the portA build log is only useful if somebody reads it, so here is what each failure actually was.
Important Five failures, and none of them was a defect in the ported code or in the standalone rebrand. Four were platform assumptions that had never been tested because upstream builds its Windows releases without running those suites there. The fifth was mine, in a workflow I wrote. 🩹 On the fifth oneI asked for a publisher name so the executable's It is removed, with a comment saying why — because that property name is exactly the sort of thing the next person adds back in good faith. This build does not sign, so Nothing else changed in that commit, deliberately: the next run tests the installer, not the installer plus a new variable. ✅ What is proven, as of now
Note Everything green so far proves this thing compiles, that its logic holds, and that the port has not drifted. None of it starts the program. That is what the smoke test is for, and it has not run yet. 🥟 粵語版五次紅,五個唔同原因,冇一個係搬運出事。 一、二、四係平台假設:macOS 嘅 第五個係我衰:我要求加個發行者名,想隻 exe 唔好連 Important 五次失敗,冇一次係 port 或者改名整壞嘢。四次係上游從來冇喺 Windows 行過嗰啲測試所以冇人發現嘅假設,第五次係我自己寫嘅 workflow。 而家證實咗嘅: 搬運驗證 0 缺口、帶原生編譯嘅安裝、完整 typecheck、三個 package 嘅單元測試、20 個 Windows spec 檔案 121 個測試、網站已發佈。 Note 但要講清楚:綠嘅嘢只證明佢砌得成、邏輯企得住、搬運冇走樣。冇一樣係真係開過個程式。 嗰樣要等 smoke test,而佢仲未跑過。 |
🎨 The application is on Material Design 3 — and it still installs, launches and uninstallsCommit Every gate green, including the one that starts the program:
🎯 How ~300 components changed design without being edited
Two things were checked specifically, because both fail silently rather than loudly:
🪟 Windows finally has its own title barFrameless, with the Material Design 3 caption bar from the mockup. Important The window-control IPC verifies the sender is the main window. macOS is byte-identical to before, the bar renders nothing outside Windows, and its labels are in all 19 locales — the gate that fails typecheck if one is missed. 🧩 The subtle one
Three departures from the mockup were recorded rather than quietly taken: its subtitle describes the mockup and not the product; the focus ring is inset because those buttons sit flush against two window edges and an outward ring would be clipped; and Material Symbols is not bundled, so the bar uses the app's existing icon set at the contract's sizes rather than adding a webfont for three glyphs. 🥟 The code name proved itselfRelease 7 took 📋 What is still not in the appThe Cantonese locale, the funny-level sliders, the in-app regex builder, the dim sum surprise and the changelog viewer. The site demonstrates every one of them; the application does not have them yet. Tracked in 🥟 粵語版個 app 轉咗 Material Design 3,而且照樣裝得到、開得到、解除安裝得乾淨。 每個關卡都綠,包括真係會開個程式嗰個。 點解三百幾個 component 一個都唔使改就轉咗設計: 有兩樣特登查過,因為兩樣都係靜靜雞衰,唔會嘈:冇跌過任何原有 token(跌咗唔會 compile error,係有個 component 冇晒樣,等用家嚟發現),同埋圖表嗰啲功能色照留自己嘅值 —— 如果連佢哋都對照埋主題色,幾條數據線就會變到一模一樣,嗰個係數據 bug 扮成設計改動。 Windows 終於有返自己嘅標題列: 無邊框,用 mockup 嗰個 MD3 caption bar。用 Important 視窗控制嘅 IPC 會查來源係咪主視窗。 最陰濕嗰個: 代號自己證明咗自己: 第七版用咗 仲未入 app 嘅: 粵語、好笑程度拉桿、regex builder、點心驚喜、changelog viewer。個網站全部示範緊,個 app 未有。 |
🚀 Session start — closing the remaining gaps · 開工:執埋剩返嗰啲窿Started: 🔴 First finding: the Release workflow was red · Release 連紅四鑊The last four Release runs on
The real culprit was one stray Fix pushed: 廣東話版: Release 一連瓜咗四次,查落原來係 📋 Session plan · 今節計劃
廣東話版: 一修紅燈 ✅、二畫返幅「仲爭啲乜」嘅地圖 🗺️、三做返嗰四條從來冇人問過嘅拷問 🕵️、四動手執漏 🛠️、五出一個真係載住成個改版嘅 release 📦。做完先算,唔會齋講。 |
👀 Milestone: somebody finally looked at the screenshot · 有人終於擘大眼睇咗張相The first review of a running-interface capture, everThe packaged smoke test has been saving a screenshot into every green release run's report — and asserting only that the file is non-zero. I downloaded the capture from the run that built
Fixed in 廣東話: 影咗咁耐相,第一次有人真係睇。一睇就見到個 title bar 同大堂都仲掛住人哋個朵 😅。依家改返做自己個名 — 不過 Open Design Cloud 照舊,人哋間舖真係叫呢個名,唔改先係老實。 🚪 A gate has been watched biting, at last · 個閘終於見過佢咬人The repository's oldest caveat was "every gate has been watched passing and none has been watched rejecting anything." Closed today for the port gate:
廣東話: 特登整污糟咗條 branch 餵個閘食,個閘一啖咬住 — 🛠️ Also committed in this batch · 呢批仲有
✅ Verified: the redesign is finally in a downloadable build · 個改版終於裝得落手Release run 30864189643 for the brace fix went green, and published Its smoke capture (reviewed, not just size-asserted): the M3 look holds in the packaged build and the notification centre's bell is present in the chrome. It also confirms the brand defect ships in r18.1 — the title bar and hero say "Open Design", because the ⏳ Still in flight · 未埋單
|
🕵️ The audit that never ran, finally ran — and it found real thingsThe Phase 4 surfaces were written by agents that hit a session limit before their adversarial review lenses executed. Those lenses ran. 44 findings, 15 confirmed by an independent refutation pass. The verification half then hit a session limit of its own, so 29 remain unverified — recorded as leads, not facts, because the same failure repeating twice is worth writing down rather than hiding. 廣東話: 嗰個一直冇跑過嘅拷問終於跑咗:44 條,15 條有第二個 agent 反覆質證後坐實。跟住連質證嗰半都撞到限額,所以仲有 29 條係「疑似」,唔算數 —— 同一個問題連續發生兩次,寫低好過扮冇。 💀 The finding that reframes the projectFour independent finders said the same thing, and it checked out:
The narrator was worse than unmounted, it was unmountable: it imports Important The lesson going into the roadmap: a module that nothing mounts is not a shipped feature, however complete its files look. The conformance matrix now judges every row on whether a user can open the surface. 廣東話: 三個 module 寫到靚仔靚女,但冇任何地方 import 過 —— 用家點撳都撳唔到 😵。個旁白仲慘,佢 import 嗰張 CSS 根本唔存在,想 mount 都 mount 唔到。所以而家個標準改咗:冇入口嘅嘢唔算做完。 🔧 Fixed this session
廣東話: 呢一輪執咗:旁白終於有入口;批次刪除唔再report自己㨂嘅成績;所有 dialog 一次過有咗 focus trap;個窗終於寫返自己個名。 ✅ Verified, with eyes
Open Design Cloud keeps its name throughout, deliberately: that hosted service is upstream's, and renaming it in copy would misdescribe where those accounts and balances actually live. 廣東話: 落咗 r19.1,我download返個 build 嘅截圖親眼睇過 —— 個窗同大堂終於寫「Material Designer」✅。之前講「捉到但未出街」,而家真係出咗街,唔係靠估。 🚧 Still open, and now tracked as workNew roadmap section 4.0 lists these so they cannot evaporate into a report nobody re-reads:
廣東話: 仲未搞掂而且已經記低:刪 project、刪記憶、刪素材通通唔經個安全閘;個閘本身都有五處漏洞;外觀編輯器同色彩選擇器仲係孤兒;另外 29 條疑似問題要逐條查證先算數。 📌 One external-state limitationDiscussion pinning is not available through the API. The GraphQL schema exposes |
🚦 Five gates wired in, and the first one went red immediatelyThe workspace shipped checks that nothing ever invoked. Wiring them in was the cheap part; what they said when they finally ran is the useful part.
廣東話: 呢個 workspace 一直有幾個檢查,但從來冇人叫過佢哋。今次全部駁返落去 —— 難嘅唔係駁,係佢哋開口之後講咗啲乜。 🔴 The guard failed on its first run, and that was correct
An earlier change gave two in-memory test fixtures The consumption is nominal: those strings are the provenance field of objects built inside the test, and the parser only carries the value through to Upstream's check offers exactly two remedies — move the dependency, or record a justified allowlist entry. With no dependency to move, it got the second, written in the same form as the three entries beside it. Note Rewriting the fixture paths to slip past the literal scanner was considered and rejected. It would have satisfied the check without changing what the test does — gaming a gate rather than answering it. 廣東話: 個 guard 一駁上去就變紅 —— 咁先啱。查落係 test 入面兩條 fixture 嘅路徑名咗人哋話唔好掂嘅檔案,但其實由頭到尾冇開過個檔。可以改個名扮冇事,但咁叫呃個閘,唔叫修佢。 📊 The web suite ran for the first time ever: 454 / 459All five failures are pre-existing. None was caused by the change that ran them. The clearest:
That regression arrived with the Phase 4 bulk-actions work and survived for exactly one reason: nothing ran this suite. The other four are The step is commented out with the measurement and all five filenames recorded beside it, and they are tracked in Important What was deliberately not done: wiring it in with 廣東話: 459 個測試檔案,454 個過。5 個唔過嘅全部都係之前就壞咗,唔關今次事 —— 最經典嗰個係測試仲以為㩒完刪除掣就即刻刪咗,但個 code 老早已經加咗個確認框喺中間。冇用 🌐 The site points at the current build againIt was still offering the r8.1 installer — two releases and most of the redesign ago. It now links (A blanket substitution briefly relabelled r8.1 with r19.1's dish — caught and corrected before the dew. Recorded because a code name's only job is telling two builds apart.) 廣東話: 個網站個下載掣終於指返最新嗰個 build,唔再俾人載舊嘢。順手改埋 checksum 同發佈記錄。 |
✅ Every gate green, and the audit's confirmed findings are closed
廣東話: 所有閘都綠燒 ✅ —— 包括嗰個 463 個檔案嘅 web suite,佢而家係真閘,唔再係擺設。 🕵️ The 29 unverified leads: settledA read-only refutation pass took the claims that never got checked. 7 confirmed, 4 refuted, 3 already fixed. Important Recording the refutations mattered as much as the confirmations. Every one looked entirely plausible:
An unrefuted finding is a lead, not a fact. Four would have become four pointless "fixes". 廣東話: 29 條疑似問題查晒:7 條坐實、4 條冤枉、3 條已經修好。捉錯良民嘅記錄同捉到真兇一樣重要 —— 嗰 4 條全部睇落好似真有其事,查落先知係睇漏眼。 🔒 What got fixedThe confirmation gate — five ways it could be defeated
The CLI was reaching around the gate entirely
All five now refuse without
Two orphaned modules got a way in; four colour spaces got written
廣東話: 個安全閘五個窿全部補晒(最搞笑嗰個:所謂「拉足全程」,一嘢㩒到尾就當拉咗)。CLI 以前打一句就刪到嘢,而家要 📊 The web suite, now a gateIt had never run in this repository. First run: 454/459. Every failure was a test describing behaviour the product had deliberately moved on from — a one-click batch delete that now opens a preview dialog, menu items that gained proper Now 463 files, all passing, and wired in without 🚧 Still open
|
🔒 Every confirmed audit finding is closed, and every gate is green
廣東話: 464 個測試檔案,所有閘全綠 ✅。審計查出嚟嘅問題,坐實嗰啲已經全部執完。 🚪 The gate now guards the doors it was built forThe audit's worst finding was not that the confirmation gate was weak — it was that most irreversible actions never reached it. That is closed:
Important What was deliberately NOT gated matters as much. The extraction records are a self-evicting 20-entry in-memory buffer that does not survive a daemon restart, and the memories it wrote are separate files that outlive it. Gating a dismissable log line is exactly how a gate stops meaning anything. A regression test now pins that decision so it is not quietly reversed. 廣東話: 最衰嗰樣唔係個閘唔夠硬,係大部分刪嘢嘅動作根本冇行過個閘。而家刪記憶、刪素材、CLI 刪嘢全部要過閘,而且個閘會讀出你即將失去嗰樣嘢嘅名同內容。至於嗰啲二十條就自動清走嘅記錄 —— 故意唔加閘,因為乜都加閘,個閘就等於冇。 🧮 The colour module, from zero tests to a tested one
This module had no test file at all, which is the same fact as it holding five of the seven confirmed findings. It has three now. 🧭 The four refutationsWorth repeating because they are the cheapest lesson here: four plausible-looking findings did not survive scrutiny. The contrast readout computes its verdict from the unrounded ratio; the off-grid slider step costs ≤0.07% of the track and no feedback loop exists; typed channel values are never clamped mid-keystroke; the notification centre does retain dismissed records. Acting on those would have been four confident changes to correct code. An unrefuted finding is a lead, not a fact. 🚧 Honestly still open
廣東話: 未搞掂嘅照樣寫明:個閘仲係喺兩個介面各自把守,唔係喺 daemon 嗰層守;個介面除咗預設大細之外,仲係冇人審視過。呢兩樣係下一步。 |
🧹 Every blocking browser dialog is gone, and the gate is green at 465 files
A repository-wide grep for 廣東話: 成個 web app 已經冇任何一個會 freeze 住成個程式嘅瀏覽器彈窗。465 個測試檔案全綠 ✅。 🚦 Eighteen call sites, three different right answersThe interesting part was not removing them — it was that they needed three different replacements, and picking the wrong one would have been its own defect.
Important The single dialog that deliberately did not get the gate is the one worth explaining. Closing a sketch tab is recoverable. Putting two keys and a slider in front of it would have taught users to power through the gate by reflex — and a gate everyone has learned to power through protects nothing. Over-gating is not caution; it is how a safety feature stops working. The worst of the informational six: it told the user their pop-up had been blocked — in an alert that was itself blocking them from reaching the browser control that would unblock it. 廣東話: 十八個彈窗,三種唔同嘅正確答案。最抵諗嗰個係「關 sketch tab」—— 特登唔加安全閘。關個 tab 都要㩒兩條鎖再拉 slider,用家好快就學識閂埋眼撳,個閘就等於冇。過度設閘唔係謹慎,係搞死自己個閘。 🧪 What the newly-wired suite caught, in real timeThe web suite went from "never run" to "gates every push" in this session, and it immediately started earning its place — every one of these was caught by the gate rather than shipped:
廣東話: 個 suite 啱啱由「從來冇跑過」變成「每次 push 都要過」,即刻就捉到嘢:一個重複 function、三個搵到幾個結果嘅 query、同埋一個真.flake(改文件都會紅,再跑一次又綠)。 📌 Standing lessons from this session
🚧 Honestly still open
|
🛡️ The gate is now a boundary, not three interfaces agreeing to be carefulThe standard has always said this:
It was being enforced in the interfaces. And not two of them, as the audit assumed — three:
Three independent gates and zero boundaries. Anything that was none of the three — a 廣東話: 三個介面各自把關,但一個真正嘅邊界都冇。唔屬於呢三樣嘅( 🔑 The mechanism
Important What this does not prove, stated plainly: that a human moved a slider. The web app mints the token at the moment of authorization and spends it immediately. What it buys is that no caller reaches the operation in one replayable request, and that every route now converges on a single enforcement point where policy can be strengthened later. That distinction went into the standard's own status table rather than the row being ticked green. ✂️ The line was drawn on restorability, not on the verbNot every Gated — genuinely irreversible, in no history domain:
Deliberately not gated — restorable through version history: memory entries, project files, templates, automations, BYOK profiles, connector accounts, MCP servers.
This corrected my own brief, which had listed memory entries as irreversible. They are not — 廣東話: 唔係見到 🐛 Caught by the gates on the way inEvery one of these was stopped by CI rather than shipped — which is the newly-wired suite paying for itself:
🚧 Split out rather than folded into the tick
Naming them as their own items is the whole difference between held out of scope and missed. |
📸 Nine pictures found three defects that 465 tests did notA reader looked at the published screenshot, compared it to the mockup, and said: "Still looks completely like the old app, not the design folder." They were right, nothing in this repository said so, and chasing it produced the most useful hour of the project. 廣東話: 有人攞張截圖同 mockup 一對,講咗一句「睇落仲係舊 app」。佢啱,而且成個 repo 冇一處講過。跟住查落去,係到今日為止最有用嘅一個鐘。 🔍 Why it looked like the old appThe colour layer had landed — every component resolves Material Design 3 roles. But the mockup's structural furniture was not on screen, and structure is what makes a screen read as M3 rather than as a recolour. The navigation rail was the sharpest case, and the diagnosis is worth stating exactly:
A Material Design 3 navigation rail is persistent by definition; that is what distinguishes it from a drawer. It is 88px as an icon rail and 260px with labels now — the widths this project's own Wave 1 specified all along. The 28px status bar, which simply did not exist, is there too.
廣東話: 條 rail 一直都有 render,但個格闊度係 0,仲加埋 🧨 Then the capture set ran, and found two moreThe smoke test now captures nine verified states instead of one. On its first run it caught: The UI scale is broken at every value except 100%At 125%, 150% and 200%: a horizontal scrollbar, the home heading cut off mid-word, the status bar pushed off the bottom of the screen, and at 125% the scroll hint overlapping the template cards. At 200% roughly half the interface needs sideways scrolling to reach. Warning This repository predicted it, in writing, and shipped it anyway. Roadmap § 2.5 says: "Replace the mockup's scaling mechanism. It sets a custom property that nothing reads and does the actual scaling with a non-standard CSS
Raising the UI scale is an accessibility action. What a user currently gets for taking it is a broken window — so this is a standard 14 blocker, not polish. Bilingual clips at the narrowest supported windowThe status bar's density readout runs off the right edge ( 廣東話: 影相機制第一次跑就捉到兩單嘢:UI 縮放除咗 100% 全部爛(呢件事 roadmap 白紙黑字預言過,但照抄咗個 🧾 The number that mattersAll three defects had passed: 465 test files · a full typecheck on two platforms · the workspace guard · the craft lint · the translation-coverage check · a port verifier at zero gaps. Not one is the kind of fault an assertion was ever going to catch. A rail rendered into a zero-width track. A layout that magnifies instead of reflowing. A label pair too long for its bar. A diff cannot see any of them. A picture sees all three. Important The failing captures are published in the README next to the good ones — the 200% overflow included. A README that shows only the flattering frames is a brochure. The whole value of the capture set is that it produces evidence somebody has to answer for. 🔎 One more, found by simply lookingThe settings capture shows "Spoken narrator" in its section list — that surface had zero importers until The same picture shows seventeen sections and no search field, which standard 4 requires on every settings surface. The command palette does index settings, but that is a different thing: someone who has already opened settings should not have to leave it to find a row. Recorded against the roadmap item rather than left for the next reader. 🚧 In flightTwo agents are fixing the scale mechanism and the bilingual clipping. The next capture set is the verdict — not the commit message, and not this comment. |
🖥️ Driving the real app found what nine fixed captures could notThe release smoke test photographs nine states. That is nine states somebody thought of — and the two most useful findings of this session were not among them. So the published portable build was downloaded, extracted, launched on an off-screen Windows desktop and driven through its own Chrome DevTools protocol. The visible desktop was never touched; the app was terminated and the desktop released afterwards. 廣東話: CI 影九張相,即係「有人諗得到嘅九個畫面」。今次最有用嘅兩個發現,一個都唔喺嗰九張入面 —— 所以直接載返個 portable build,喺一個隱形 desktop 開,用 DevTools protocol 揸住佢行。你部機由頭到尾睇唔到,行完即刻收檔。 Note A capture-tool limitation worth recording. The Lowlevel MCP screenshot tool documents background capture of windows on an off-screen desktop, and returned ✅ Finding 1 — the tabbed settings works, and nobody had seen itSettings gained a tab strip and a search field earlier today. Neither is one of the smoke test's nine states, so neither had ever been photographed. Driving the app opened it: a horizontal tab strip (Execution mode · Instructions / Rules · Memory · Media providers · External M…), an overflow control reading The DOM agreed with the picture: 17 section tabs enumerated, 🔴 Finding 2 — the first screen a new user sees carried the wrong nameFrom a clean profile the app lands on onboarding, which the smoke test never reaches because its captures begin past this point. It read:
…inside a window whose title bar says Material Designer. Both images are published in the README, the working one and the broken one. The fix was classification, not substitution111 occurrences in the English dictionary. 64 name this product and changed. The rest were kept, each for a reason:
Important Two calls worth surfacing. The cloud sign-in button became "Sign in to Open Design Cloud", not "Material Designer" — deliberately against the brief. It authenticates against upstream's service; there is no Material Designer account to sign into. Spelling the service out removes the "this app is called Open Design" reading without lying about where the credential lives. The copyright line is unchanged, and that one wants a human. Renaming broke grammar in three languages, and that was fixed"Material" is consonant-initial where "Open" is not. Hungarian's article changes and its vowel-harmony suffixes flip across 49 sites ( 廣東話: 難嘅唔係改字,係分得清邊個係邊個 —— 「Open Design Cloud」係人哋真係有戶口有錢包嘅服務,改咗就係呃人;仲有一句嘅「Open」根本係動詞。至於版權聲明特登唔郁:嗰個係署名,唔係產品名,Apache-2.0 要求保留,而且係用家唯一見到 upstream 署名嘅地方。 🧪 The smoke test itselfFrom the last green release: health endpoint 200 with title Material Designer, installed under the right directory name, desktop shortcut present, packaged PTY marker clean ( 🚧 Deliberately left
|
✅ CI is green again, and the last brand leak is closedTwo things landed since the last comment. CI went red and is now green, and the first words the application paints no longer say the wrong product name. 廣東話: 兩件事 —— CI 由紅變返綠,同埋開機第一句字終於唔再叫舊名。 🔴 → 🟢 What made it red, and what fixed itThe Wave 2 home-screen work moved the hero's switcher chip onto a Material Design 3 assist-chip rail. Two assertions in
Worth naming precisely, because it is a repeat offender: these style tests read the CSS text, not computed values. A test that expects Fixed in 🎬 The loading shell — and the 42 waits that were never really checking itWhy a one-line string change was the last thing done, not the first (click to expand)The web shell paints one string while the client bundle loads. It read It was also the most dangerous one-line change in the repository, because the string is not one string:
So the duplication was removed before the rename: // design/e2e/lib/loading-shell.ts — one declaration
export const LOADING_SHELL_TEXT = 'Loading Material Designer…';All 42 call sites now import it. Drift needs two files to disagree rather than one file to be forgotten. 🛡️ And a gate, because "we'll remember" is not a mechanism
It was verified to fail before it was trusted to pass: That is the second gate of this shape now in 廣東話: 個閘特登整壞佢,睇住佢真係紅咗,先至肯信佢綠嗰陣有意思。淨係「應該得」唔算驗證。 📦 Commit
🚧 In flight right nowFour agents are working in parallel on independent areas:
Each was given the same hard constraints: every 廣東話: 而家四個 agent 同時開工,各有各嘅範圍,唔會撞到。每個都收到同一句叮囑:冇得靠估,驗唔到就照直講驗唔到。 |
🔎 Four parallel workstreams, and three features that were doing nothingFour agents worked in parallel on independent areas. The conversions matter less than what each one found on the way, because all three findings share a shape: a feature that was written, compiled, shipped, persisted — and did nothing at all. 廣東話: 四條線同時開工。改咗啲乜其實唔係重點,重點係搵到嘅三件事都係同一個樣:寫咗、compile 到、出咗街、仲會記住你嘅設定 —— 但係乜都冇做過。 1️⃣ The density setting rendered a pixel-identical UI at all three levelsCompact, Default, Comfortable. A real control, writing a real It swapped five custom properties. Four had no reader anywhere in the codebase, and the fifth had one. Warning Every check anyone would think to run said this worked. The control existed. The attribute was written. The value survived a restart. A test asserting "changing density updates the stored preference" passes — and the user sees nothing, forever. Buttons, fields and selects now read their height and padding from tokens that actually move. The The same defect still survives in miniature, and is recorded rather than quietly leftCounting
2️⃣ Editing the dialog stylesheet had never changed anything on screen
:where(.dialog) { … } /* specificity 0-0-0 — never wins */
.modal { … } /* specificity 0-1-0 — wins, always */So the global rule has been deciding what every dialog in the application looks like, and anyone editing 3️⃣ …and that dialog had no viewport bound at allNo Two more of the same family: a slash-command popover and a plus-menu preview each capped their height and hid the overflow, so commands and example blocks past the cap were simply never drawn. 📐 And the scroll-hint overlap was only half fixedThe pill sat at 廣東話: 個 pill 寫住 ✅ Also landed
🚧 No wave box is ticked, deliberatelyA wave's definition of done is capture from an installed build, in both themes, at four display scales, at narrow width, and in bilingual mode. None of this has been rendered. What is verified: the declarations are present and token-driven, every stylesheet balances, the port has 0 gaps, every locale is complete, and the loading-shell gate agrees. Every agent was asked to state plainly what it could not verify without a build, and every one did. 廣東話: 一個 wave 都冇打勾,係特登嘅。打勾嘅條件係要喺真嘅安裝檔度影相,兩個主題、四個縮放、窄畫面、雙語 —— 呢啲嘢一格 pixel 都未畫過。而家證到嘅係:啲宣告寫齊晒、每張 stylesheet 括號都平、port 零 gap、20 個語言都齊。其餘嘅唔會當做咗。 |
🔴 CI went red, and the two failures were both the testsReporting this as it stands rather than after it is fixed, because a thread that only shows green is a thread nobody can use to judge anything. 477 of 479 web test files passed. Port integrity, the locale check and the loading-shell gate were all clean. Two failures, both from tests written in the same batch as the feature they cover — and in both cases the test was wrong and the code was right, which is worth writing down because the opposite is the usual assumption. 廣東話: 479 個 test file 過咗 477 個。兩個 fail,兩個都係 test 寫錯,唔係 code 錯 —— 呢個同大家慣性嘅假設啱啱相反,所以值得記低。 1️⃣
|
Uh oh!
There was an error while loading. Please reload this page.
🏗️ Material Designer — rolling build log
Note
This is the rolling progress thread for the Material Designer port. Every milestone lands as a new comment below, so the thread reads top-to-bottom as a build log. The opening post keeps only a short current-status pointer.
Current status: ✅ verbatim port landed and verified · ⏳ nothing built or run yet (CI has never executed)
📦 What this project is
A Material Design 3 rebuild of a local-first design tool, ported from the Apache-2.0 upstream
nexu-io/open-designv0.16.1 and brought up to this project's standards — language modes, appearance customization, regex-capable search everywhere, browser-style tabs, and the rest.nexu-io/open-designv0.16.1517f39acde402c1a7af2189167a8d6957a3dac71design/LICENSE)scripts/verify-port.sh— 0 gaps🎯 Roadmap at a glance
graph LR A["✅ Phase 1<br/>verbatim port"] --> B["⏳ Phase 1b<br/>CI + docs"] B --> C["⬜ Phase 2<br/>Material Design 3"] C --> D["⬜ Phase 3<br/>language + core surfaces"] D --> E["⬜ Phase 4<br/>long tail"]📖 How to read this thread
running,failed, orverified. Never a predicted success.粵語版喺每個 comment 入面都有,唔會淨係得英文。
All reactions