This commit is contained in:
Ian Gulliver
2026-10-20 22:56:37 -07:00
parent a2de021f3c
commit 85138e31bf
2 changed files with 5 additions and 5 deletions
+3 -2
View File
@@ -10,8 +10,9 @@ The app joins the tailnet as its own node with libtailscale and reaches byre's H
## Stack ## Stack
- Swift 6, SwiftUI, Observation. Minimum macOS is the major version byre's host runs (`sw_vers --productVersion` prints it); there is no back-deployment. Minimum macOS is the major version byre's host runs (`sw_vers --productVersion` prints it); there is no back-deployment.
- AppKit where SwiftUI falls short (see "Gaps in SwiftUI"), and for `NSAlert`, the update progress panel, key and window monitoring, and Core Animation layers for the transcript's scanner and spinner, which animate in the render server so SwiftUI never redraws around them.
The transcript's scanner and spinner animate in the render server so SwiftUI never redraws around them.
The project is a Swift package built with `swift build`, not an Xcode project. It builds with Xcode's toolchain: `xcode-select --print-path` must print `/Applications/Xcode.app/Contents/Developer`. With the Command Line Tools selected while Xcode is installed, Swift Build finds two toolchains for the Command Line Tools path and picks one at random on each run; the pick is part of the build request, so every change of pick rebuilds every target. The project is a Swift package built with `swift build`, not an Xcode project. It builds with Xcode's toolchain: `xcode-select --print-path` must print `/Applications/Xcode.app/Contents/Developer`. With the Command Line Tools selected while Xcode is installed, Swift Build finds two toolchains for the Command Line Tools path and picks one at random on each run; the pick is part of the build request, so every change of pick rebuilds every target.
+2 -3
View File
@@ -74,7 +74,7 @@ A model's name picks its vendor: `gpt-*` runs on Codex, `gemini-*` on Antigravit
- Claude Code records `--append-system-prompt` on a session's first request and reuses it on resume, so a running session keeps the guidance it started with; the `UserPromptSubmit` hook re-attaches the guidance to every turn so existing sessions see changes. On a fork Claude Code can reuse the system prompt recorded for the source conversation, the source's cwd included, so the hook's copy is what reliably tells a fork where it is. - Claude Code records `--append-system-prompt` on a session's first request and reuses it on resume, so a running session keeps the guidance it started with; the `UserPromptSubmit` hook re-attaches the guidance to every turn so existing sessions see changes. On a fork Claude Code can reuse the system prompt recorded for the source conversation, the source's cwd included, so the hook's copy is what reliably tells a fork where it is.
- A Claude `result` with `num_turns` 0, no `result` text and no error, outside an interrupt, isn't a turn end: the CLI emits one on its own, for example after a resume when it reports a background shell left over from the previous process. byre logs `ignored result with no model turns` and keeps the turn running. - A Claude `result` with `num_turns` 0, no `result` text and no error, outside an interrupt, isn't a turn end: the CLI emits one on its own, for example after a resume when it reports a background shell left over from the previous process. byre logs `ignored result with no model turns` and keeps the turn running.
- stream-json doesn't expand `@path` the way the interactive CLI does, so the composer has no `@`-file mentions; the agent reads any file a message names with its own tools. - stream-json doesn't expand `@path` the way the interactive CLI does, so the composer has no `@`-file mentions; the agent reads any file a message names with its own tools.
- A snapshot always sits on a turn boundary, the only place a Codex conversation can be forked. Older snapshot rows also carry the triggers `message`, `tool_call` and `timer`. - A snapshot always sits on a turn boundary, the only place a Codex conversation can be forked.
## Agent behavior ## Agent behavior
@@ -102,10 +102,9 @@ byre never signs with a key on the machine it runs on. When a project checkout's
## Client Macs ## Client Macs
Task agents use the Macs the human has byre's app open on, through the app's WebSocket to `/api/clients/connect`. Task agents use the Macs the human has byre's app open on.
- The app pings every 10s and reconnects after 25s with no pong. That catches a socket byre dropped while the Mac slept: the close never reached the Mac, and without something sent on it the app would wait on it indefinitely. - The app pings every 10s and reconnects after 25s with no pong. That catches a socket byre dropped while the Mac slept: the close never reached the Mac, and without something sent on it the app would wait on it indefinitely.
- Messages are allowed up to 256 MiB each way, so file contents fit in one message; `client_read` refuses files over 64 MiB so the base64 reply stays well under it, past which byre would drop the connection.
- `log show --info --last 10m --predicate 'subsystem == "run.fc.byre.mac"'` on a client shows `client request <id>: <op>` lines and `byre-hands` starts and exits, which are info level and kept only in memory, so they cover the last few minutes at most; connection drops (`client connection closed`, `client connection got no pong`) are notices, kept on disk, so `log show --start` reaches much further back for them. byre's log shows `client connected` and `client disconnected`. - `log show --info --last 10m --predicate 'subsystem == "run.fc.byre.mac"'` on a client shows `client request <id>: <op>` lines and `byre-hands` starts and exits, which are info level and kept only in memory, so they cover the last few minutes at most; connection drops (`client connection closed`, `client connection got no pong`) are notices, kept on disk, so `log show --start` reaches much further back for them. byre's log shows `client connected` and `client disconnected`.
## Screen and app control ## Screen and app control