turbo-editors/turbo-rustpublic Fork 0
v1.0.0
Commits
Clone
git clone https://git.rickub.com/turbo-editors/turbo-rust.git
git clone ssh://git@rickub.com/turbo-editors/turbo-rust.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

history.md · 156 lines · 26.6 KBmarkdown Blame HistoryRaw
📦 Turbo Rust 713ea5c k33g 11h ago1# History
2
3*Append only. One dated entry per session. Never rewrite or delete an entry, including your own.*
4
5## 2026-09-01 — Turbo Rust built on turbo-core
6
7- **Goal**: ticket 0001 in the `turbo-editors` parent — a second editor, for Rust, on the same model as Turbo Go, sharing a versioned library. Options chosen by the user before implementation: the library holds `app`; the language scanner lives in its own editor; `require` plus a committed `replace`; per-editor configuration directories; and the toolchain menu spelt `Rus~t~` rather than `~C~argo`.
8- **Changes**: the whole repository. `main.go` adapted from Turbo Go's around `rustlang.Profile()`. `internal/rustlang` written from scratch: the profile, a six-hundred-line Rust scanner in three files, and the three starter templates. `Makefile`, `scripts/install.sh` and the four numbered release scripts adapted; the installer's language-server check rewritten to *run* rust-analyzer rather than stat it.
9- **Decisions**: `Rus~t~` over `~C~argo``C` was free and `T` is the last letter of the word, but the menu holds whatever the project put in its tools file, and a menu called Cargo holding `docker compose up` is a lie about what the menu is. A hand-written scanner, because `rustc` is not a Go library. A depth rather than a flag for block comments, because Rust nests them. A leading capital meaning a type, with the `SCREAMING_SNAKE_CASE` cost documented rather than patched with a second rule that would mis-colour acronyms.
10- **The scanner's tests caught four real defects**, all of them mine and none of them the library's: `#![no_std]` ended at its second rune because the bracket matching counted from the `#`; a lifetime was emitted as two spans **in the wrong order**, which the editor draws wrongly rather than noticing; `::` came out as an operator because `:` is an operator rune; and `..` came out as punctuation because `.` is a punctuation rune.
11- **Tests**: 30-odd in `internal/rustlang/scan_test.go` covering every construct and the three carried states; a template suite that checks the five cargo commands, that snippets indent with spaces, and that no template still says `turbo-go`; `editor_test.go`, which builds a whole Turbo Rust on a simulated terminal and drives a **real rust-analyzer** end to end; and `reference_test.go`, which holds `docs/*/reference/languages.md` to the code, row by row, including the row that documents the `SCREAMING_SNAKE_CASE` limitation.
12- **Verified end to end** twice over: against a real rust-analyzer, typing text that exists only in the buffer and getting `String::len` back — a fixture already containing the text would pass whether or not the editor said a word; and in a real pty, reading the SGR off the wire to confirm a nested comment, a raw string with quotes inside it, `println!` with its `!`, and `3u8` with its suffix each come out as one correctly-coloured run.
13- **A real-world trap, found and handled**: rustup installs a shim called `rust-analyzer` whether or not the component is installed, and it fails only when run — the end-to-end test found the server, started talking to it, and got `connection closed`. The test now probes it; so does the installer.
14- **Quality**: PASS after one round. Two smells — `classOfWord` had six returns and `scan.go` was 69 complexity against a limit of 60 — fixed by splitting the scanner into three files and collapsing three word tables into one lookup, which reads better than what the linter complained about. 0/0/0, complexity 98.
15- **Docs**: 33 pages × EN + FR. The pages about the *editor* were adapted from Turbo Go's, since it is the same editor; `reference/languages.md`, `explanation/colouring-and-completion.md`, `explanation/architecture.md`, the tools pages and the tutorial were written for Rust. The tutorial's program was run for real (`cargo run``Hello from Turbo Rust!`) and its colour claims read back off a pty. A drawio diagram generated from `go list` and verified against it.
16
17## 2026-09-01 — Tool parameters, from turbo-core
18
19- **Goal**: part of the same request as turbo-core's entry of this date — a tool whose command needs a value must be able to ask for it. The feature is the library's; what changed here is the starter file people are given.
20- **Changes**: `internal/rustlang/templates.go` — the tools template's comments now teach `{{label}}` and `{{label...}}`, with an example for THISrustlang and the warning about single braces. `install_test.go` — one test asserted before checking whether it was in a git checkout at all, so it failed in a tree with no `.git` where `unknown` is the correct answer.
21- **Decisions**: the examples go in the **comments**, not as a sixth tool. The five starter commands are what a project runs before it commits; `cargo new` is a different kind of thing, and adding it would change what `Create tools file` gives everybody in order to demonstrate a syntax.
22- **Tests**: 2 in `internal/rustlang/templates_test.go` — the created file teaches the syntax, and none of the five starter commands accidentally became parameterised by the prose around them.
23- **Quality**: PASS. 0/0/0, complexity 98 — unchanged; the change is comments and a test.
24- **Docs**: a section in `reference/rust-tools.md`, one in `how-to/run-cargo-commands.md` and one in `explanation/rust-tools.md`, both languages.
25
26## 2026-09-01 — Released as v0.1.0
27
28- **Goal**: the user committed and released everything and asked for the record to be brought up to date. This entry is what was verified, not what was intended.
29- **Verified from the repository and the Codeberg API**: **v0.1.0** at `2d5dbec`, which is exactly HEAD, with a release page. Working tree clean, on `main`. This is the editor's first release.
30- **The dependency is the published library**: `require codeberg.org/turbo-editors/turbo-core v0.1.0` with no active `replace`, and a `go.sum` whose checksum matches sum.golang.org. A clean clone now builds without turbo-core beside it, which is what the whole extraction was for.
31- **One wart, left alone deliberately**: the old replace block is commented out rather than deleted, and its comment still says "drop it once the version above is tagged and published" — which is done. It sits inside a released commit, so it was written down rather than changed.
32- **Nothing was built or changed in this entry** — no code, no tests, no docs. The suite and the gate were last measured at the previous entry and are unchanged.
33
34## 2026-09-01 — Dockerfile, compose, YAML and XML colouring (ticket 8)
35
36- **Goal**: ticket 8 — "add syntax for Dockerfile, compose file, yaml, xml". The scanners themselves belong in turbo-core; this repository's part was to use them and to say so.
37- **Changes**: `internal/rustlang/templates.go` — the snippets template's `languages` comment now lists the nine names this editor knows. `go.mod` requires `turbo-core v0.2.0`. Documentation: the YAML, XML and Dockerfile sections in `docs/{en,fr}/reference/languages.md` with the recognition and class tables brought up to date, and the language counts corrected in the architecture and colouring explanations, both READMEs, and the snippets references.
38- **Decisions**: none taken here — the three that matter (a compose file is just YAML, XML gets its own scanner for CDATA's sake, `Filenames` matches the stem) were taken in turbo-core and are recorded there.
39- **Tests**: `TestTheCreatedSnippetsFileListsEveryLanguageTheEditorKnows` iterates `syntax.Registered()` rather than a hardcoded list, so the template cannot fall behind the registry again. Falsified by removing a name from the template.
40- **A stale claim found while sweeping**: the reference said themes were "the three shipped themes" when eight ship, and turbo-rust's English snippets reference listed `go` where it meant `rust`. Both fixed.
41- **Quality**: PASS, 0 errors / 0 warnings / 0 smells, complexity unchanged.
42- **Verified in a real pty**: a `Dockerfile`, a `compose.yaml` and a `pom.xml` opened in the built binary and coloured, with a CDATA section's contents arriving as a string rather than as markup.
43- **Blocked on a release**: this branch does not build until turbo-core v0.2.0 is tagged and published.
44
45## 2026-09-01 — The build checks the version it stamped
46
47- **Goal**: the user asked that the build verify it really embeds the right version number.
48- **Changes**: new `scripts/check-version.sh`, called by `make build` after linking, by `scripts/install.sh` on the staged binary **before** the install, and by `03-build-releases.sh` on the one asset this machine can run. The release script's own `grep -qF` check was replaced by it.
49- **The failure it catches**: a linker stamp is a string, and a wrong one is not an error. `-X` naming a symbol that does not exist links happily and stamps nothing; the binary then reports whatever Go build info says — `devel`, on a binary attached to a release. Reproduced by hand: `make build LDFLAGS="-X '….version.stampX=v9.9.9'"` linked cleanly and reported `0.2.2+dirty`, and now fails the build.
50- **Decisions**: the version comparison is an **equality**, not a search — `0.2.0` is a substring of `10.2.0` and of a commit hash that contains it, and a stamp that is nearly right is the case worth catching. The check runs **before** the install, so a binary that cannot name itself never replaces one that can. With no version to expect — a build outside a git checkout — the only claim left is that the number is not `unknown`.
51- **Tests**: 8 in a new `version_check_test.go`, driving the script against binaries built for the purpose. Three were falsified: the wiring in the Makefile, the ordering in the installer, and the substring case.
52- **Verified for real**: `make build`, `scripts/install.sh --prefix $(mktemp -d)`, and a deliberately misspelt `-X`.
53- **Docs**: a "Checked at build time" section in `docs/{en,fr}/reference/versioning.md`.
54- **Quality**: PASS 0/0/0, complexity unchanged.
55
56## 2026-09-01 — Tickets 9 to 14: autosave on in a created settings file
57
58- **Goal**: tickets 9–14. Only ticket 9 is editor-side; the other five are turbo-core's and reach Turbo Rust through the library.
59- **Changes**: `internal/rustlang/templates.go` — the settings template now writes `autosave = true`, with the reason in the comment above it. `.gitignore` gained `go.work`.
60- **Decision**: the template, **not** `settings.Default()`. A project that has created a settings file has said what it wants, and the file is the visible, editable place to say otherwise. Turning the library default on would mean the editor writing to disk in any directory it is started in, which is a different and much larger claim; the user was asked and chose the narrower one.
61- **Tests**: `TestTheCreatedSettingsFileTurnsAutosaveOn` loads the created file rather than grepping it, and `TestAProjectWithNoSettingsFileStillDoesNotAutosave` holds the other half of the decision. The first was falsified by putting `false` back.
62- **Docs**: the settings reference gained a "When a change takes effect" section; the menus reference now states the enabled condition of all six create/open items; the tools and snippets references gained their `Open …` rows and lost "a project that already has one is opened unchanged"; `configure-a-project.md` was rewritten around autosave already being on; `run-the-tests.md` gained a section on testing against an unreleased turbo-core with `go work`. EN and FR throughout.
63- **Quality**: PASS 0/0/0, complexity unchanged.
64- **Verified in a real pty**: all six menu items flipping between available and greyed, and the created settings file holding `autosave = true`.
65- **Note**: this branch builds and passes against the published `turbo-core v0.2.0`. The other five tickets only become visible once turbo-core v0.3.0 is released and the `require` here is bumped.
66
67## 2026-09-02 — Code navigation: documentation only
68
69- **Goal**: the Code menu and the eight questions it puts to the language server. All the code is turbo-core's; Turbo Rust changes only by describing it.
70- **Changes**: a new `docs/{en,fr}/how-to/ask-about-code.md`; the **Code** section in the menus reference, with Describe symbol and Go to definition removed from Run and Search; `Shift-F12` and `Ctrl-T` in the keyboard reference; a "Nine questions, one connection" section in the colouring-and-completion explanation. EN and FR throughout.
71- **Decision**: a **separate** guide rather than an extension of `navigate-code.md`. That page answers "how do I get to the piece of code I am looking for" — searching, line numbers, windows. This one answers "what does this name mean" — a different need, so a different page, with the old one linking to it.
72- **Docs traps met**: the new guide was first written *over* `navigate-code.md` and had to be restored from git. And the two moved menu items had to be deleted from Run and Search in **four** files, not two — the French tables are separate text.
73- **Quality**: PASS 0/0/0, complexity unchanged.
74- **Note**: this branch builds against the published `turbo-core v0.3.0`. Nothing here needs v0.4.0 to compile; the menu it documents appears once that is released and the `require` is bumped.
75- **Follow-up the same day**: the user asked whether the LSP features were documented for users. They were — `how-to/ask-about-code.md`, EN and FR, both editors — but the neighbouring `enable-completion.md` still had a "what else the server gives you" section listing three keys and no mention of the Code menu, Problems, or the gutter marks. Fixed in all four files. That is the "adapting is not substituting" trap from the `turbo-new-editor` skill, met on a page I had not thought to re-read: **a new feature makes its neighbours stale, and the neighbours are where a user already is.**
76
77## 2026-09-02 — Ticket 19: better code editing, documentation only
78
79- **Goal**: ticket 19 — double-click to select a word, insert line, delete line. All the code is turbo-core's; this repository documents it.
80- **Changes**: the keyboard and menus references in EN and FR, and a "Select and edit whole lines" section in `how-to/navigate-code.md`.
81- **The one thing to notice**: **redo is `Ctrl-R` now, not `Ctrl-Y`**`Ctrl-Y` deletes a line, as it did in Turbo C. That is a key changing under people who had learnt it, so it is stated in the menus reference rather than only in the table of keys.
82- **Quality**: PASS 0/0/0, complexity unchanged.
83
84## 2026-09-02 — Starter templates moved out of the source into embedded files
85
86- **Goal**: the user asked for the three starter templates to live in three files in `internal/rustlang/` and be embedded into the binary, instead of Go constants in `templates.go`. Extended to both editors at their choice.
87- **Changes**: `settings.toml.tmpl`, `snippets.toml.tmpl` and `tools.toml.tmpl` beside the code; `templates.go` reduced to three `//go:embed` declarations. `profile.Templates` is unchanged — it takes strings, and an embedded variable is one, so turbo-core needed nothing.
88- **Decisions**: **`.tmpl`, not `.toml`**, put to the user with the measurement behind it — `settings.toml.tmpl` holds `theme = %q`, which `tomllib` rejects, so naming it `settings.toml` would be a claim it cannot meet: a linter would reject it and the editor would colour it as TOML and draw it as broken. The snippets and tools templates *are* valid TOML (their verbs sit in comments), but all three take the suffix so the set is consistent. **The user accepted that the editor will not colour `.tmpl` files.**
89- **Method**: the constants were **evaluated, not cut out of the source** — each is a concatenation of a raw string with a quoted one, because a raw string cannot contain the backtick in `\`turbo-rust -list-themes\``. A throwaway test wrote the three files from the constants themselves, then was deleted.
90- **A guard added for a risk this refactoring created**: the format verbs no longer sit next to the `profile.Templates` contract that documents them, so three tests now count the verbs per file, check none is empty, and fill each template asserting no `%!` marker comes out — Go writes `%!q(MISSING)` into the output rather than failing, so a wrong count produces a starter file that is written, opened, and wrong. All three falsified.
91- **A verification that went stale under me.** I compared the six new files against HEAD byte for byte and they matched — and then `turbo-go/internal/rustlang/snippets.toml.tmpl` was overwritten with the contents of the playground's own `bin/.turbo-go/snippets.toml`, which a test caught. I could not attribute the overwrite. Restored from HEAD's evaluated constants and re-verified **after** the last step rather than in the middle. The lesson is the ordering: verify at the end, not when convenient.
92- **Quality**: PASS 0/0/0 in both, complexity unchanged.
93- **Docs**: turbo-core's `how-to/write-the-starter-files.md` gained a section on keeping them in files, in EN and FR; both architecture explanations list the new files; the `turbo-new-editor` skill's step 3 now prescribes this shape.
94
95## 2026-09-03 — Family count corrected, and the defects the third editor exposed here
96
97- **Documentation only; no code changed.** `docs/{en,fr}/explanation/architecture.md`'s "both editors use them unchanged" became "every editor built on it", now that `turbo-python` exists.
98- **turbo-python's documentation was adapted from this one's, and adapting it found three defects that were here all along.**
99 - **The English `reference/menus.md` said project menus appear "between Go and Help", twice, in an editor whose menu is called Rust** — the exact mistake this project already recorded in French, in the tools reference, and fixed there. The French menus reference had it right. Fixed.
100 - **The menu bar listing omitted the Code menu**, in the tutorial and in `reference/menus.md`, EN and FR. A pty run of this editor's own binary gives `File Edit Search Run Code Options Window Snippets Rust Help`.
101 - **The tutorial said `→` four times to reach Options.** It has been five since the Code menu shipped. Re-counted in a pty.
102- **Still unchecked here, and worth doing**: `docs/diagrams/packages.drawio` is a file nothing imports, so nothing notices when it stops describing the code — turbo-python's copy of it shipped labelled `internal/rustlang` for exactly that reason. turbo-python now has a `diagram_test.go` holding it to `go list`; adopting it here is a small job.
103- **This repository's suite was already red at `HEAD`** — three tests in `internal/rustlang/templates_test.go` still assert a five-tool starter file that deliberately grew to six. Verified pre-existing by stashing and re-running; not caused here and not fixed here. Detail in the handoff.
104- Not committed.
105
106## 2026-09-09 (later) — the theme list gained three entries
107
108- **Goal**: none of its own. turbo-core gained `monochrome-light`, `darcula` and `intellij-light`, and renamed `monochrome` to `monochrome-dark`; this repository's documentation had to follow. Eleven themes ship now.
109- **Changes**: `docs/{en,fr}/reference/themes.md` — the embedded list, three new table rows, and a new "a name a theme used to answer to" section saying `monochrome` still loads; `docs/{en,fr}/how-to/write-a-theme.md` — the inherit-from advice and the shipped-theme count; `README.md`'s themes bullet. No code change.
110- **History was left alone**: "comments were the dimmest colour in six of the eight shipped themes" in `write-a-theme.md` is a true sentence about when that rule was written.
111- **Not yet true of the binary.** This repository pins turbo-core v0.4.2, which ships eight themes. The documentation is ahead until turbo-core is tagged and the `go.mod` here is bumped — see turbo-core's handoff of the same date.
112
113## 2026-09-15 — ACP agent windows, ported from turbo-go
114
115- **Goal**: carry the Agent Client Protocol support to this editor. The feature itself is turbo-core's — the protocol client, the conversation model, the window widget, the `Agent` menu and the permission dialog all live there. See turbo-core's history for the same date.
116- **Changes**: `internal/*/acp.toml.tmpl`, embedded in `templates.go` and wired into `profile.Templates.Agents`. That is the entire code change — one file and one line. Plus six documentation pages (EN + FR: how-to, reference, explanation) and their index entries.
117- **Decisions**: the example agent is `docker agent`, as in every other editor, because the protocol is the point and the agent is the user's choice; the one sentence in the starter file that is about **this** editor names its own fence, and a test holds it to that — a starter file copied from another editor and left naming that editor's language is the obvious way to get this port wrong.
118- **Tests**: 5 new in `internal/*`: both blanks filled with no `%!` marker, the file loads back as exactly one agent, it explains its keys, it names this editor's own language, and creating it twice leaves the first alone.
119- **Quality**: PASS 0/0/0.
120- **Docs**: adapted rather than copied — the slug, the language, the fence, the build command and the language server all differ from turbo-go's, and each was replaced.
121- Not committed.
122
123## 2026-09-15 (night) — slash commands and `@` mentions, documented
124
125- **Documentation and the starter file only in this repository**; the code is turbo-core's (see its `.memory/` of the same date). The user asked for the ACP changes that let an agent's commands be discovered the way Zed discovers them, then for `@` as a file selector.
126- **Changes**: `docs/{en,fr}/reference/acp.md` — seven key rows for the list, a **Commands and mentions** section, the `session/prompt` and `available_commands_update` rows, the Limits bullet; `docs/{en,fr}/how-to/talk-to-an-agent.md` — "Use the agent's own commands" and "Point the agent at a file"; `docs/{en,fr}/explanation/agent-windows.md` — the "left out" bullet narrowed to images, two sections appended; the embedded `acp.toml.tmpl` — two key lines. Applied by one script across the five editors with an exactly-once anchor check.
127- **Tests**: `go test ./...` green (the template change is a comment; the tests that read the created file still pass).
128- **Ahead of the binary**: this repository pins turbo-core v0.7.0, which has none of this. The pages are true once turbo-core is tagged and the pin moved.
129- Not committed.
130
131## 2026-09-16 — the trace variable and a troubleshooting bullet, documented
132
133- turbo-core gained `TURBO_ACP_TRACE=<file>` and an "update this editor could not read" line in Agent status, because the user saw no `/` commands from their own agent and nothing on screen could say why. Documented here EN + FR: a bullet in the how-to's Variants, a section in `reference/acp.md`. Docs only; not committed.
134- **Later on 2026-09-16**: `demo/.turbo-rust/acp.toml` (and `agent.yaml`, docker agent's config copied from turbo-go) now hold two agents — **Bob (llama.cpp)** via `docker agent serve acp`, and the user's **mini-me (llama.cpp)** (`mm -acp`, `AGENT_CONFIG` env) — placed where this repository's demo project already keeps its settings. Verified to load as two agents with this editor's own `Profile()`; not opened, `mm` and `docker` are on the user's Mac. Working files for trying the `/` picker, not part of the feature.
135
136## 2026-09-17 — documentation: terminal windows and tools on Windows
137
138- **Asked**: nothing of this repository directly. turbo-core gained pseudo-console (ConPTY) terminal windows and a per-platform tools shell (cmd.exe on Windows); the pages here that said "Linux and macOS" or `/bin/sh -c` went false the moment that landed.
139- **Changes** (EN + FR): `README.md` (terminal windows: Linux, macOS and Windows), `docs/*/reference/terminal.md` (shell row, controlling-terminal row, platform table, error row), `docs/*/explanation/terminal-windows.md` (the Windows section rewritten: a pseudo-console and why it is a file of its own, built and vetted but not yet run), `docs/*/how-to/use-a-terminal.md` (`%COMSPEC%`, the five things to try first on Windows), `docs/*/reference/rust-tools.md` (shell row, cmd.exe's globs and `;`, error row), `docs/*/explanation/rust-tools.md` (`cmd.exe /S /C`). Applied by one script across the six editors, one anchor per file.
140- **Not changed**: code, `go.mod`. **The documentation is ahead of the binary** until turbo-core is tagged (v0.9.0) and re-pinned here; the feature has never been run on Windows by anyone.
141- **Tests**: none affected — documentation only.
142
143## 2026-09-18 — the "Untitled window has no LSP" fix: docs variant added, fix is turbo-core's
144
145- **Asked**: propagate to every editor the fix made in turbo-core the same day — saving now announces a document the server does not know (a window that started Untitled gets LSP from its first save), and Save As under a new name closes the old document. See turbo-core's `.memory/history.md` of 2026-09-18 for the defect and the fix.
146- **Changes here**: `docs/{en,fr}/how-to/enable-completion.md` gain one variant — completion in a window that started without a name works from its first save, no relaunch needed. No code in this repository is involved.
147- **Quality**: gate not re-run — a Markdown-only change; the gate measures the Go code.
148- **Docs ahead of the binary**: the behaviour arrives only when turbo-core is tagged and this editor re-pinned. Not committed.
149
150## 2026-09-19 — moved to Rickub: turbo-core v1.0.0 re-pinned, releases published by a workflow
151
152- **Asked**: the same migration turbo-go received the same day, for all five remaining editors — turbo-core moved to `rickub.com` and was published as v1.0.0 with a Release workflow.
153- **Changes, module**: `codeberg.org/turbo-editors``rickub.com/turbo-editors` in `go.mod`, every `.go` file, `Makefile`, `scripts/install.sh`, `README.md`, `docs/{en,fr}`, `.memory/summary.md` (turbo-core deep links also from Codeberg's `src/branch/main/` to `blob/main/`). `require rickub.com/turbo-editors/turbo-core v1.0.0`; `go mod tidy` with `GOWORK=off` rewrote `go.sum` from the proxy.
154- **Changes, release tooling**: `.github/workflows/release.yml` (new), `01-release.tag.sh` (rewritten), `03-build-releases.sh``02-build-releases.sh` (tag from `$1`, validation, `replace` check, fresh `release/${TAG}/`, `go install` line in the README, no hand-off to 04), `02-release.publish.sh` and `04-release.upload-binaries.sh` deleted, `release.env` rewritten (`TAG="v1.0.0"`, `ABOUT="Turbo Rust"`). All generated from turbo-go's final files with the names substituted; the README paragraph naming this editor's language server and the example file (`src/main.rs`) kept from the old 03. Docs: the release section and the wrong-commit variant of `docs/{en,fr}/how-to/make-a-release.md` rewritten.
155- **Tests**: `release_test.go` regenerated from turbo-go's — see `summary.md`. The file-writing helper is `writeTestFile` because turbo-python's `main_test.go` owns `writeFile`, and the command helper `runOrFail` because `main.go` owns `run`.
156- **Not done**: nothing committed or pushed — no commit exists yet and `origin` is unreachable from the sandbox. The workflow has not run on Rickub for this editor; turbo-go's identical one has, and published.