the /offscale route comment, and the store learns about ssh

The platform's own reference to offscale was one stale comment naming /headscale
as an example route pair. Everything else that matches "offscale" in src/ is a
test fixture using it as an example app name, or the bundled catalogue entry.

Re-synced the marketplace so the catalogue advertises the ssh dependency the
manifest now declares — which is the point of the sync being cheap to re-run: a
plugin's manifest changing is not a marketplace deployment.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-16 04:23:39 +00:00
co-authored by Claude Opus 5
parent ba20155a09
commit bfb20b6916
2 changed files with 21 additions and 5 deletions
+20 -4
View File
@@ -406,10 +406,26 @@ outside the example's new README:
`usePanelMemory`. A key collision between those namespaces would produce exactly this: one panel's
text arriving in another's buffer, with no server involvement and nothing persisted.
First moves, in order: reproduce with a job whose output is distinctive (`seq 1 100000`), then check
whether the editor's content state or only its RENDER is affected — `Cmd+S` at that moment answers it,
as does closing and reopening the tab. If the buffer really is clean and only the view is wrong, the
suspect is a shared component instance; if the buffer is polluted, it is a key collision.
**Screenshot 2026-08-16 answers the first question and kills two theories.** The tab carries a DIRTY
dot, and the log lines have Monaco line numbers continuing the file's own sequence (…180, then eight
lines of dotenv/POSTGRES_URL output, then 189 `</Link>`). So the MODEL was mutated — this is the
editor's content state, not its render, and the earlier "the file was okay" means it was simply never
saved. Note the splice is mid-file, not a replacement: JSX text and log text share line 180
(`Forgot?--env-file=.env --watch src/server.tsx`).
Ruled out by that: `CodeSurface` renders with shiki, not Monaco, so the two cannot share an editor
instance. And the app's only other Monaco mount (`FileViewer/renderers/EditorRenderer.tsx`) passes no
`path`, so its model URI is `inmemory://model/N` and cannot collide with the editor's `file:///…`.
So the pollution arrives as TEXT through the editor's own content path — `openFile`, `setContent`, or
the end-of-turn refresh that re-reads every clean file. That last one is the prime suspect: it is the
only thing that writes a buffer without a keystroke, it runs exactly when a background job is
producing output, and it lands its result by path.
One thing to rule out first, because it is mine and it is recent: `2b70a570` gave `<Editor>` a real
`path`, so models are now keyed by file URI globally rather than being per-mount `inmemory://`. Two
panels open on the same file now share one model. That should be an improvement, but it is a change
in exactly the layer that turned out to be involved.
Worth noting because it is the reason to look at all: an editor that can show content the file does
not contain is a correctness problem even when it never writes — the next person's instinct will be to
+1 -1
View File
@@ -34,7 +34,7 @@ export function App() {
<Dashboard.DashboardLayout>
<Routes>
<Route path="/" element={<Dashboard.HomeScreen />} />
{/* Route pairs, like /headscale and /photos below: the bare page route exists so the
{/* Route pairs, like /offscale (a plugin now) and /photos below: the bare page route exists so the
existing links into it keep working, and its `SettingsRoute` guard redirects to the
first section. The section is the URL rather than a `*_SELECTED` global, so a settings
sub-page is linkable, bookmarkable and cmd-clickable. */}