July 26 sweep: bugs, lags, clipping, leaks, regex-builder audit / 七月廿六大掃除 #54
Replies: 27 comments
|
Milestone 1 — release-distribution bug found and fixed (local commit, not yet pushed). While setting up the sweep I found installed apps were being starved of updates: releases publish with Scope addition from the user: split Cheap LFS settings into their own Repository Settings tab — an implementation agent is on it in an isolated worktree. The #34 submodule branch-picker agent and the six-dimension discovery sweep (bugs/lags/leaks/clipping/regex audit) are still running. 里程碑一:執咗個「裝咗App等極都冇更新」嘅釋出分發蟲 — promote步驟而家識得沿住main單調向前upgrade Latest,唔會再俾中途push搞到擺爛。本地測試全綠,收尾先一次過push。用戶加單:Cheap LFS設定要自立門戶做獨立tab,agent開緊工;捉蟲六路大隊照跑緊。 |
|
Milestone 2 — discovery complete: 31 confirmed findings; fix wave launched. The six-dimension sweep (12 agents, adversarial verification) confirmed: all 9 Cheap LFS perf defects (#35 — 7 deferred + 2 new), 3 canonical-remote bypasses in cheap-lfs network paths, a document-level cut/copy listener leak in the diff view (fixed + committed: 里程碑二:偵察收隊,31條蟲證據確鑿。diff頁嗰條聽筒漏已經即場執咗(290ec7dcdf)。十隊修理agent分頭開工,每隊霸一忽檔案免撞車。用戶中途加單:全App時間要加「幾耐之前」相對顯示,仲要全部24小時制 — 等修理隊合流先郁,費事撞。 |
|
Milestone 3 — two features merged locally, two new user-reported bugs under investigation. Merged to local main: the #34 Add Submodule searchable branch picker ( 里程碑三:submodule揀branch同Cheap LFS獨立tab已合流本地main;權限彈窗識得收聲(撳咗遲啲先就唔再日日彈);全App預設24小時制。用戶新報兩單:#55 commit完大檔又重新下載、#56 批量上傳中途無故話release變咗 — 兩隊偵察agent查緊,十隊修理agent照開工。全部未push。 |
|
Milestone 4 — pushed. Contents: Latest-release monotonic reconcile (auto-update was stranded), diff-view cut/copy listener leak, OAuth-permissions prompt persistence, 24-hour default time format, Add Submodule searchable branch picker (Refs #34), dedicated Cheap LFS settings tab. External-state blocker recorded: Discussion pinning is unavailable for this repository through the API — the GraphQL Still in flight (not in this push): the ten-group fix wave (4 of 10 agents returned so far) and the #55/#56 investigations. They land in a later integration push with its own changelog. 里程碑四:推咗!本地四道閘全綠先至推,CI跑緊未敢認叻。有一樣做唔到要照直講:呢個repo經API釘唔到Discussion(GraphQL冇個mutation,REST 404),所以changelog出咗但釘唔到頂——好彩本身都冇釘住任何嘢,冇整亂人哋。修理大隊十隊返咗四隊,同兩單新bug嘅偵察報告,留返下轉一次過埋單。 |
|
Milestone 5 — sweep complete and fully pushed. Pushed across four pushes this session: Verification on the pushed tree: root tsc exit 0, prettier clean, Open, with confirmed root causes: #55 (commit re-downloads payloads), #59 ( 里程碑五:大掃除收工,全部推晒上去。本地同remote零分歧、冇worktree、冇stash、冇漏branch,每條branch都證實咗喺remote先至刪。測試:cheap-lfs 450/450、git同releases 812條零失敗。斷點續傳、三件齊發、自動重試排住隊,佢哋要等今次個append guard打底先做得,所以放喺後面。 |
|
Milestone 6 — fifteen pushes;
The finding that matters most this stretch was a genuine fail-open, and CI caught it rather than review. A Also root-caused on the real machine: #66. The Win11 sparse package is registered ( Screenshot blocker cleared, partially. The Electron runtime had been sitting in the download cache since July 12 in a zip the postinstall never extracted — which is why every visual issue had been "blocked on a build host" for days. Extracted it; single-repository captures now work and produced #70's genuine evidence. Multi-tab scenes still need a fixture (#75) after three UI-driven routes proved fragile. No substitute screenshot was posted for anything. Shipped: #55, #56, #59, #63, #64, #65, #67, #69, #70, #72, #73, #74, plus the Latest-release reconcile and README diagrams. Open with honest blockers: #22, #34, #35, #62, #66, #68, #71, #75. Two CI breaks were self-inflicted and fixed in the same session: a screenshot added without its wiki-manifest row, then the same screenshot missing from the Pages gallery — a second pinned count that cross-references the first. 里程碑六:十五次push,本地全套 6,508 個測試零失敗,CI 跑緊未敢認。 今轉最重要係一條真.fail-open,而且係 CI 捉到唔係人肉 review 捉到:同一個時鐘格內改同樣大細嘅檔案,時間戳同 size 一模一樣,個身份核對就話「冇改過」— 而成個慳 hash 嘅優化就係靠佢,即係話舊內容可以當驗證過。本機 40 次試到 11 次中。仲有個細節:呢部機時間戳跳格係 0.79–3.1 毫秒,唔係 Windows 預設 15.6 — 所以當初如果寫死個常數,就會錯向唔安全嗰邊。 仲有 #66 都喺真機查到底:個 package 其實註冊咗、架構啱、狀態 Ok,但佢指住 最好笑係:Electron 執行檔由 7 月 12 號就 download 咗落 cache,不過冇人解壓。所以連續幾日「要影相但冇 build host」其實係差一個 unzip。而家單一倉庫影得到,多分頁嗰啲要整個 fixture 先(#75)。一張冒充嘅圖都冇貼過。 |
🏁 Session handoff —
|
| Area | Result |
|---|---|
| Correctness | Racily-clean identity fail-open (#72) — same-size writes inside one filesystem tick looked identical to the stat cache, reproduced 11 of 40 trials; Cheap LFS owned-artifact rule (#65); post-commit payload restore (#55); append-guarded uploads (#56); UTF-8 byte budget (#67, long CJK files could not be pinned at all); push no longer blocked by a merge commit (#58) |
| Performance | Scratch-ODB worktree fingerprint (#59) — multi-GB payloads no longer written into .git/objects |
| Security | docs/search.html ReDoS (#69) — terminated at 768 ms in a real browser while the UI thread ticked 69 times |
| Features | Ignored-files → local submodule (local phase), collapsible repository groups (#74), tab-overflow search + customization (#73), repository sync summary (#70), complete feature list (#64), tabbed docs hub (#63), mermaid pre-rendering (#71), capture fixture (#75), Win11 registration (#66), private-repo compression routing (#68) |
| Release | Latest-release monotonic reconcile — installed apps had silently stopped receiving updates because promotion only crowned a release whose commit still equalled the tip of main |
⚠️ Verification honesty
CI runs were still in flight at handoff. Nothing was closed on a green badge — every closing comment says so and commits to reopening rather than burying a later failure. The verification claimed is the local gate (6,508 tests / 808 files / 0 failures, clean tsc + eslint + prettier) plus per-fix regression tests, each proven to fail without its fix.
📋 The 6 still open
| Issue | Why |
|---|
| #66 | Fixed and pushed; not closed because no real re-registration was exercised — needs an installed build updated over |
| #68 | Fixed and pushed; the private route deliberately ends at builder-unavailable because creating the public builder needs a token this feature never holds. Compression not running is the safe outcome, not a silent fallback |
| #34 | Shipped; wants a framed capture |
| #23 | 79-capture campaign, now unblocked by the fixture |
| #62 | 🙋 Needs you — all 21 desktop-plus features referenced in the tree are already implemented. Which one did you notice missing? |
| #78 | 🙋 Needs you — Cheap LFS payloads before upload, or working-tree files in place? |
🧰 Traps recorded so nobody repays for them
- Electron had been broken since July 12 — the postinstall downloaded the 144 MB zip into the cache and never extracted it. Every earlier "blocked on a build host" note traced to this one missing unzip.
- Captures have two paths, not interchangeable.
script/capture-app.js(CDP) drives interaction by seeding IndexedDB and using the app's own IPC — no app behaviour was changed to make capture possible. The Lowlevel MCP headless desktop launches and captures off-screen but cannot drive Chromium: posted input toChrome_RenderWidgetHostHWNDis ignored. - Screenshot counts are pinned in two places. Fixing one and not the other turns a red test into a different red test. This broke CI twice.
- New docs need
node script/generate-docs-hub-catalog.mjs. Caught three times in one session. - A junctioned submodule breaks
git statusoutright in a worktree. ghpicks its default repo from remotes — after addingupstream, one comment landed ondesktop/desktop. Deleted within the minute;gh repo set-defaultnow pins this fork. Keep that pin.
🔭 Risk carried forward
The racily-clean fix makes publishing pay one timestamp tick. Ordinary revalidation is unchanged (3.95 → 3.68 ms, so #35's win survives), but publishTextBatch pays roughly 17 ms × N. Settling members in parallel is the obvious follow-up if it bites on a large batch.
🇭🇰 中文總結
main 喺 1bdc8d694e,同remote零分歧,工作目錄乾淨,除咗仲跑緊嗰個agent之外所有branch都合流兼刪走。完整交接寫咗喺 HANDOFF.md 最頂。
23單issue收到剩6單。最有價值嗰幾單:一條CI先捉到嘅真fail-open(同一個時鐘格入面改同size嘅檔,40次試中11次認唔出);長中文檔名以前根本pin唔到;搜尋頁嘅ReDoS而家768毫秒斬到,主線程照跳69下冇卡過;仲有自動更新其實一直斷咗纜 —升Latest嘅邏輯太硬頸,build途中有人push就永遠唔升。
**要老實講:CI仲跑緊,冇一單係靠CI綠燈收嘅。**每個結案留言都寫明咗,而且講明CI之後爆嘢就重開,唔會扮冇事。
剩低兩單真係要你答:#62 — desktop-plus嗰21個功能全部已經做咗,你見到邊個唔見咗?#78 — 加密係指上傳前加密Cheap LFS,定係直接加密工作目錄啲檔(後者同Git嘅diff直接對撼)?
用血汗換返嚟嘅陷阱全部記低咗,其中最抵死係:Electron由7月12號就download咗落cache但冇解壓,搞到之前每單「要影相」都賴冇build host — 其實部機一直得,淨係差一個unzip。
🧭 New user-reported push defect — root cause confirmedA production screenshot and sanitized production-log correlation added issue #80 to this same sweep.
Implementation and focused regression tests are now in progress on |
🧭 Git Email label regression follow-up startedAt $started, work began on main to make the Git author Email-label test exercise the actual Other selection path and assert visible-label ownership, not merely the existing accessible name. The implementation is being aligned with the documented condition �mailIsOther && accountEmails.length > 0; focused unit, formatting, production-build, and headless UI evidence are pending.
Refs #23. |
🧭 Scope expanded — group management and progressive loadingTwo direct user requests have joined the active
Both are in progress. No commit has been pushed for either yet. Focused implementation and tests are running in parallel with #78 and #80. The GitHub Project item remains externally blocked because the current token lacks |
🧪 Git Email label focused verification🧪 Focused gates green; production capture blocked by concurrent tree movementAt
Note The requested unit/format gates are verified. No visual-success claim is being made from a failed or mixed-tree build. 廣東話: 兩個真正有用嘅回歸測試同 Prettier 都綠。大 build 行緊嗰陣 Refs #23. |
✅ Finished · Git author Email-label regressionStarted: What landed
Verification receipt
Warning A fresh production screenshot is not claimed. The required Lowlevel build read the shared checkout while another task advanced 廣東話收據呢次唔再畀 Refs #23. |
Checkpoint correction — $stampBefore the requested handoff/push, independent review found two ship blockers: backward compatibility with the already-pushed encrypted pointer grammar, and several promise-returning network recovery paths outside the toolbar. Work remains branch-only on codex/final-checkpoint-20260727.
Nothing in this checkpoint is pushed yet. Full tests, lint, production build, documentation receipts, and remote proof remain next. |
🔐 Encryption landed · 📸 the gallery was caught lying · 🤝 push finally reports its own errorsTimestamp: Note Nothing was closed this round on purpose. Three surfaces are merged and green but have no visual evidence yet, and the build that would produce it is currently failing. Details below — the honest state matters more than a tidy checklist. 今次特登乜都冇 close。三個畫面 merge 咗又全綠,但一張真相都未影到,而負責出相嗰個 build 而家仆咗街。詳情喺下面 —— 講真話重要過張靚靚嘅剔剔清單。 ✅ Merged and pushed
#78 — the two-digest decision 🔑An encrypted part records both digests: The stored pair verifies the object at the provider without the passphrase, so integrity stays publicly checkable. The plaintext pair is what #55 and the never-re-pin check compare working-tree hashes against — dropping it would have silently broken both. Restore gates in order: stored pair → GCM tag → plaintext pair → whole-file check, every one fail-closed. AES-256-GCM, scrypt at 2^17, fresh salt and nonce per call, passphrase stored only in the OS credential manager. 635/635 Cheap LFS tests pass. #80 — the "reported once" question, settled empirically 🎯Two failure classes leave
So a rejection arriving at a call site is by construction unreported — meaning the fix is observe-and-report, not observe-and-swallow. A test now pins that invariant directly. The regression test was proven to bite by reverting the fix and watching 2 of 17 fail as clean assertions. Pull and fetch shared the identical preflight and the identical defect, so they were fixed too. 📸 The gallery was quietly lyingThe capture wave turned up screenshots whose captions did not match the pixels:
Both are fixed. Worth dwelling on: these passed every automated check, because no test compares a picture to the sentence underneath it. 呢啲相之前全部 test 都過到,因為冇一個 test 會拎住張相同下面段字對一對口供。 A proposed CDP 🐛 Three defects filed rather than buriedAll three were found during #78 and disclosed instead of quietly shipped:
🔥 Blocker: the dev build now exhausts a 10 GB heap
Warning The first two failures were reported to me as exit code 0, because the command was piped into 頭兩次 build 仆咗,但因為條命令 pipe 咗去 Both webpack configs use 🚧 In flight
📋 Next
|
🔴➡️🟢 CI had been red for sixteen runs · 📸 real captures at last · 🤝 two implementations collidedTimestamp: 🔥 The headline: nothing had been releasingCI had failed sixteen consecutive runs, so 1. A Cheap LFS test that was testing string similarity, not code 🎭
It was not testing the code. It was testing whether two strings happened to look alike on your laptop. Now resolves the same way the code does, and asserts out loud that it actually broke something before demanding to see the wreckage: 2. A TUI fixture that pointed HOME at a directory it never created 🏠The folder browser's Home button sensibly declined to navigate somewhere that does not exist, stayed put, and got blamed for it. Real home directories exist; the fixture now makes one. Caveat stated plainly: only Python 3.9 is installed here and the TUI needs ≥3.10, so this fix is reasoned from the failure message, not run locally. CI is the verification. 🤝 Two implementations of the same feature met in the middle
Warning The collision itself broke three things that neither implementation broke on its own, all fixed in
📸 Captures, finally — and what they cost
Getting a screenshot took three failed builds and a wrong diagnosis:
Then a concurrent build clobbered 三次 build 仆街、一次診斷完全捉錯用神,先影到兩張相。最抵死係第三點:build 接住 ✅ Also landed
🚧 Open#23 (blocked on credentials/live state), #80/#81/#82/#85/#87/#89 (awaiting captures or a live provider). CI on CI 仲跑緊,兩個修正驗咗未我唔知,亦都唔會扮知。 |
✅ CI verdict is in: both test repairs confirmed green on the runnerTimestamp:
Note The TUI fix is the one worth calling out. Only Python 3.9 is installed on this host and the TUI requires ≥3.10, so I could not run those tests locally at all — the fix was reasoned from the failure message ( TUI 嗰個修正值得講一講:呢部機淨係得 Python 3.9,而 TUI 要 ≥3.10,即係我本地一條 test 都跑唔到。個 fix 純粹係睇住錯誤訊息推出嚟,push 嗰陣我講明係未驗證,驗證交俾 CI。結果啱,但係 runner 講佢啱,唔係我講佢啱。 🎯 Then Lint got its turnWith the suites green, the Lint job finally reached the front of the queue and failed with exactly one complaint: an assertion in Sixteen builds of nothing shipping, and the last word belongs to a line wrap. Why it survived every local check — worth writing down, because it will happen again:
大家本地淨係 check 自己郁過嗰幾個檔,CI 就成個 repo 咁 check。今次出事嗰個檔今次冇人郁過,所以本地見唔到、遠端一擊即死。 Fixed and pushed in
|
🧩 Third generated artifact in a row — this is a pattern, not bad luckTimestamp: The Lint fix landed and the suites stayed green, so CI moved on and failed all three Linux TUI jobs on something that is not a test at all:
🔁 Three in a row, same shape
Important Checking only what you touched is not checking. All three passed every local gate I ran and failed on the runner anyway — each costing a full CI cycle to discover, one at a time. 淨係 check 自己郁過嘅嘢,等於冇 check。三個都係本地全綠、上到 runner 先紅,而且要一個 CI cycle 捉一個。 ✅ The full gate set, now enumerated from all three workflowsyarn lint \
&& node tui/tools/generate-parity-contract.mjs --check \
&& node script/generate-docs-hub-catalog.mjs \
&& npx tsc --noEmit \
&& node script/test.mjs app/test/unitPlus Current results: parity ✅, catalog drift 0 ✅, 全套 gate 而家一次過跑齊。parity、catalog、tsc、lint 都綠咗;成套 test 同 CI 仲跑緊,未出結果之前唔會扮知。 |
📉 CI: five failing jobs down to one, and the last one may not be realTimestamp: The parity regeneration worked. Every Linux TUI job is green again:
🤔 The arm64 failure is being treated as unproven, not fixed
Reasons to doubt it is a real regression:
Ruled out already: the server binds port 0 (ephemeral), so it is not a fixed-port collision. Important I am not patching this yet. Two newer runs are already in flight and will answer the question for free. Changing a test to chase a failure I cannot reproduce, and whose cause I have not established, is how a flake becomes a permanently weakened assertion. 而家唔會郁佢。已經有兩個新 run 喺度跑緊,答案自己會出。捉唔到、又講唔出原因就急住改個 test,咁樣只會將一個間歇性問題,變成一個永久廢咗武功嘅 assertion。 ✅ Local gates on the pushed treeFull suite 839/839 files · 6,866 tests · 0 fail · 🆕 Also this round
|
Uh oh!
There was an error while loading. Please reload this page.
Rolling progress thread for the July 26 full-repo sweep requested by the user: fix bugs, lags, UI clipping, slow performance, and memory leaks; audit every search bar for full regex-builder access; finish with merge-to-main and push.
Status pointer: discovery phase running — six parallel finder agents (memory leaks, Cheap LFS perf per #35, renderer perf, UI clipping, regex-builder coverage, correctness/canonical-remote risks) with adversarial verification. No fixes claimed yet. Milestones land as comments below.
呢條係七月廿六大掃除嘅滾動進度線:捉蟲、修lag、執UI剪裁、通渠慢位、堵memory leak,仲要逐個搜尋欄驗明有冇齊全regex builder。而家六路agent同步偵察緊,未有任何修復落地,遲啲逐個里程碑喺下面留言交代。
All reactions