aboutsummaryrefslogtreecommitdiff
path: root/CHANGELOG.md
diff options
context:
space:
mode:
Diffstat (limited to 'CHANGELOG.md')
-rw-r--r--CHANGELOG.md86
1 files changed, 82 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 409b069..090694e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,13 +4,90 @@ Generated from git history by `scripts/build-changelog.py` — do not edit by ha
<!-- generated:start -->
+## v4.6.155 — 2026-11-07
+
+_Touches modules (10), CHANGELOG.md (1), main.html (1) · fix 1_
+
+- **Second review round — identity for every stock node, load dedup, sweep race, a11y** `0acee7d`
+ - Four models (kimi-k2.7-code, deepseek-v4-pro, minimax-m3, glm-5.3) reviewed the shipped change set. Review log with every accepted and rejected finding: .hermes/plans/2026-11-07_163420-newos4-six-ui-modes.review-log.md
+ - identity guard now covers every snapshot node, not just #terminal-container: terminal.js also
+ - binds #output, #command-input, #input-area and #status-bar, so a cloned one leaves the terminal writing into a detached node while the page looks perfect
+ - _restoreStock anchors on the next stock node already home, then on the recorded trailing
+ - sibling; a raw child index was measured wrong (terminal,input,status-bar,quick-actions)
+ - _loading map: a double-clicked card or a repeated 'ui easy' loads the mode once
+ - _sweepPending returns while that id is in flight instead of declaring failure at 6 s and
+ - overwriting the stored preference
+ - … run `git show <sha>` for the rest
+
+## v4.6.153 — 2026-11-07
+
+_Touches CHANGELOG.md (1), main.html (1), modules (1) · project 1_
+
+- **V4.6.153 — cache-bust the review fixes** `13271e5`
+
+## v4.6.152 — 2026-11-07
+
+_Touches modules (18), CHANGELOG.md (2), README.md (1), help.html (1) · docs 2, fix 2, release 1_
+
+- **Six interface modes (easy -> cockpit) over one terminal** `5dafaa4`
+ - Symptom: newOS4 had exactly one layout. A first-time user had no way in that did not require learning commands, and an operator had no surface showing live runtime state; the only way to see heap/VFS/tool-call telemetry was to type cat /sys/...
+ - Root cause: no UI layer existed. main.html hard-codes one flex column, and terminal.js binds the stock nodes by id at construction, so an alternative layout had to either duplicate the output stream or reparent the real nodes.
+ - Fix:
+ - modules/core/module-uishell.js (new): mode registry, #ui-root, stock-node
+ - snapshot/restore, identity check that reverts to classic when a mode removes or clones #terminal-container, shell-docked #ui-foot (the AI stop button exists in every mode), ui command, gated first-run picker, ?ui= honoured only if the mode actually registers, lazy mode loading via the same loader ext modules use.
+ - … run `git show <sha>` for the rest
+- **V4.6.152 changelog + change-history row for the six modes** `38e75c5`
+- **Mode layout constraints, capture() arg split, suppress classic welcome modal** `61ba8b5`
+ - #ui-root is a flex column (it was display:block, so every mode's flex:1 was inert and the
+ - terminal collapsed to 0px while the composer sat at the bottom of a 4600px flow)
+ - overflow:clip on #ui-root and body: overflow:hidden is still a scroll container, and the
+ - terminal's scrollIntoView() on new output scrolled the mode's own chrome off-screen
+ - terminal min-height 100px: in the tabbed/panel modes its grid parent is not a flex parent
+ - api.capture() split arguments itself; term._parseArgs does not exist, so every panel showed
+ - 'unavailable: term._parseArgs is not a function'
+ - the classic Let's Get Started modal is suppressed in non-classic modes: it covered easy's cards
+- **Rebuild changelog for v4.6.152** `5d9e037`
+- **Four-model review — lazy-load race, restore order, a11y, key handling** `fcd58a4`
+ - Reviewed the shipped change set with kimi-k2.7-code, deepseek-v4-pro, glm-5.3 and minimax-m3. Findings below are the ones that survived verification against file:line; the rest are in .hermes/plans/2026-11-07_163420-newos4-six-ui-modes.review-log.md
+ - Accepted and fixed:
+ - apply() had no generation token: a lazy mode load that finished after the user switched to
+ - another mode force-applied the abandoned one (`apply(want,{force:true})` in the .then). Every apply() now bumps `_loadSeq` and the callback acts only while its token is newest. Same token also removes a double mount: registerMode() already applies the mode as it registers, so the callback was mounting every lazy mode twice (teardown+cleanup twice).
+ - _restoreStock() used the recorded `nextSibling` as insert anchor. Every real mode moves
+ - … run `git show <sha>` for the rest
+
+## v4.6.151 — 2026-11-07
+
+_Touches modules (5), main.html (1), help.html (1) · project 1, fix 1_
+
+- **V4.6.151 — wget that actually saves, web_fetch that actually pages** `f84a82d`
+ - S1 (reported by agent-os4-maint-01, wrongly refuted by the chat auto-reply): wget existed but was unusable and dishonest.
+ - Cause 1: _cmdWget used the page's own fetch(url), so every cross-origin URL
+ - died on CORS ("Failed to fetch"). Measured in the served v4.6.150 page: fetch(cgit README) threw, /api/fetch returned 200/1954 bytes.
+ - Cause 2: _vfsWriteBytes ignored writeFile()'s boolean, so the command printed
+ - a green tick when the target directory did not exist. Measured: fs.writeFile('nosuchdir/x.txt') === false.
+ - Cause 3: bytes were round-tripped through String.fromCharCode, mangling UTF-8.
+ - Fix: fetch through /api/fetch (raw source), mkdir -p, writeFile + read-back
+ - verification, error instead of a tick on failure. Register curl with -s/-o parsing delegating to the same writer so the two cannot drift.
+ - … run `git show <sha>` for the rest
+- **Document curl in help command table (auto)** `f8e4c51`
+ - Plan: .hermes/plans/2026-11-07_061825-newos4-curl-help-row.md (T1) Root cause: curl shipped in v4.6.151 (cryptogzip.js:19 getHelpInfo, :612 commands['curl']) but help.html's command table was never updated, so check_help_coverage() reported 365/366.
+ - Change: one <tr> row added after the wget row in help.html's command table. No JS/PHP touched; cryptogzip.js, modules-index.json and atlas unchanged as specified in T2.
+ - Verification: grep -c '<code>curl ' help.html -> 1 wget row at 1086, curl row at 1087 -> adjacent grep -c "_isBase64" modules/ext/cryptogzip.js -> 0 (unchanged) git diff --stat -> help.html | 1 + python3 scripts/newos4-maintain.py -> PASS: help coverage 366/366, maintenance result: OK, needs OK: none HTTP help.html -> 200
+
+## v4.6.150 — 2026-11-06
+
+_Touches modules (7), main.html (1), CHANGELOG.md (1) · project 2_
+
+- **Commit the module work that has been live but uncommitted** `6bea062`
+ - Operator commit-approve, 2026-11-06. These changes have been served since 2026-11-02/03 while git HEAD still stamped v4.6.146, so the mirror published a tree four builds behind the running instance and the release tag named the wrong build.
+ - … run `git show <sha>` for the rest
+- **Regenerate for v4.6.150** `10e2ac2`
+
## v4.6.146 — 2026-11-06
-_Touches docs (11), modules (3), README.md (3), CHANGELOG.md (3) · docs 10, fix 4, release 3_
+_Touches docs (11), CHANGELOG.md (4), modules (3), README.md (3) · docs 10, fix 4, release 3_
-- …and 4 earlier commit(s) in this build
-- **Per-OS clone guide (Linux, macOS, Windows, Termux, iOS)** `8e34256`
- - Served at https://newos.webx11.duckdns.org/usage.html from docs/usage.html in this repo, so the page, the mirror and the README share one source. Covers the four failure modes that actually bite: CRLF on Windows (core.autocrlf), missing CA bundles, cloning into /sdcard from Termux (FUSE has no POSIX permissions), and the read-only 403 on push.
+- …and 5 earlier commit(s) in this build
- **Drop hardcoded file/commit counts from the usage page** `d2bb158`
- 310 files / 182 commits were already wrong at publish time (184). A count that changes on every publish is a rot vector; the page now says what the tree is and lets the reader run the commands.
- **No byte count either — it grows with every publish** `a24ec6b`
@@ -47,6 +124,7 @@ _Touches docs (11), modules (3), README.md (3), CHANGELOG.md (3) · docs 10, fix
- Symptom: after bodies were rendered, this fix's own commit was missing from its own entry, and a long URL inside an expanded detail was clipped at the right edge on a 390 px screen.
- Cause: items took group[:MAX_ITEMS] from a CHRONOLOGICAL list, so a 17-commit build showed its first 14 and dropped the newest three (the count line said "…and 3 more", hiding which three). And the injected detail CSS set no overflow-wrap, so a 47-character URL pushed the paragraph to 320 px of unbreakable text — the document stayed at 0 overflow only because the li clipped it.
- … run `git show <sha>` for the rest
+- **Regenerate after the render and ordering fixes** `2feefc0`
## v4.6.145 — 2026-11-02