Skip to content

Merge the next version: fixes, Claude Platform, Project Docs and enowX UI - #36

Merged
enowdev merged 258 commits into
mainfrom
release/next
Nov 4, 2026
Merged

enowdev merged 258 commits into
mainfrom
release/next

Conversation

@enowdev

@enowdev enowdev commented Nov 4, 2026

Copy link
Copy Markdown
Owner

What and why

Everything for the next version in one merge: 222 commits since main, the fixes and features of release/next, with feat/claude-platform-agent, feat/project-docs and feat/enowx-ui merged in. It replaces #30 to #35.

This merge deploys enowX Cloud. It changes go.mod, go.sum and cloud/, and runs migrations 0014, 0016, 0017 and 0018 (the library's tables; no DROP, DELETE or TRUNCATE) on a database at 13. The migration runner accepts the missing 0015: it sorts by number and runs what is above the last applied. Production's database was backed up first (enowx_cloud schema, 17 tables, 1.30 GB, not restored to test it).

How it was tested

GitHub CI wasn't waited for: the checks were run locally, one job at a time on a shared Linux host, as CI's own jobs but for what is below. macOS and Windows behaviour was not run: they were only compiled and vetted here, and CI's run on this merge is the first to cover them.

On this commit, f0a79c7:

Job Result
make lint (vet, staticcheck) passed
GOOS=darwin go vet ./... passed
go test ./cloud/... with ENOWX_CLOUD_TEST_POSTGRES passed, on Postgres 16.15 from a downloaded binary, not the postgres:16 image
./daemon passed: 481 tests, 2 skipped
Packages failed or touched: core/transcript, core/designshare, core/platformagent, cloud/..., cli, ui/canvasview, ui/notesview, ui/projectdocsview, proto, core/android, core/intercept 539 passed, 2 failed, below
./ui still running as this was opened

Only on the earlier f121e7e, two commits before; those commits changed lint findings, tests and how a session's mode switches: make daemons, every other package of the Linux suite, Windows vet, test compile and build for the packages CI tests there, macOS builds (arm64, amd64), Linux arm64 daemon build.

Failing, and failing the same on main at 048b78e:

  • TestFindSDKByTheADBOnPath: this host has /usr/lib/android-sdk.
  • TestToolsThroughTheProxy: this host's system Node 20 under a clean PATH. It passes with Node 24.
  • TestAlwaysAllowHibernateAndClose, flaky: it failed on f121e7e and 1 run in 12 on main, and passed on this commit.

Not covered: tests on macOS or Windows; packaging, darwin/universal, signing; real models in most of these features (stand-ins, with real Claude Code 2.1.318 on bypass and model changes). Frame-time tests TestLongSessionListsStayQuick and TestLongGOAPanelStaysQuick failed under load on the base too.

  • make test and make lint pass: lint yes, test as above
  • Works the same for a session on this device and on a server: by the daemon's tests, not on a real second host for every feature
  • Docs updated where behavior changed

🤖 Generated with Claude Code

enowdev and others added 30 commits November 4, 2026 22:00
Bypass didn't mean what it says: a plugin hook's ask still prompted, and enowX's own
trim asked in a session switched to bypass after it started, as it went by how the
session started rather than the mode the agent reports.

The rewrite now goes by the mode. What still prompts is answered by one policy, through
the agent's PermissionRequest hook, or by the screen for an agent without one: routine
work passes, and what the urgent rules or a sure judge hold for the owner doesn't. A
hook's deny never gets that far, and a session not in bypass asks as before. Each answer
is in decide log.

Checked on Claude Code 2.1.318 in a real terminal.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A turn reached GOA twice, by routes that knew nothing of each other: its goa report,
a tool call made before the turn ends, and its end, whose text was the transcript's
last assistant message at that moment. Claude Code's transcript lags its Stop hook, so
that could be an older message, even one from mid-turn.

The text now comes from the agent's turn-end hook where it says it, and else from a
transcript that holds the turn's end. A report made at work waits briefly for its
turn's end to join it. Another turn keeps its own line, and a question or a failure is
never merged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bypass

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OpenCode 2 owns its configuration in one background server per user, so what a session's
environment said was ignored once that server ran: the config's models weren't listed
and the session ran on OpenCode's free ones. enowX's guide and tools were lost the same
way. Sessions now start with --standalone from version 2; 1.x doesn't start with it.
OpenCode 2's own preset also takes a config now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The build panel could only be closed once its run was done, and grew with its review
past the top of the page. It now closes at any stage, with a button or Escape, and its
body scrolls inside it. The unslop panel closes while running too, and a session's notice
can be closed until it says something else.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The host checks a design before anything leaves it, and the cloud runs the same checks again on what it receives, so they live in one package neither UI nor server owns. A bundle has fields for a design and its files only: a canvas's comments, brief and chats have nowhere to go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Off unless its own bucket is set. Public reads, publishing from a device's token, the web sign-in that joins no team and opens only /v1/library, moderation with an append-only log, moderators the owner appoints, limits and usage. The server makes the documents people see itself and takes no host's word for a design's checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An empty folder under a canvas's ID counted as holding it, so the team's
canvas waited; the sync's place moved past it, and a failed pull then saved
the state without what waited, or a day on it was given up on. An empty
folder holds nothing now, a failed pull keeps what waited, it is asked for
hourly after a day, and a host already past items asks for all of them once,
those it has passing by on their versions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The statements before a command were found by a pattern reading across
lines and quotes: a cd on the first line took everything up to the first ;
as its own, a heredoc's lines or a for's header included, so the trimmer was
inserted in the middle of them. A statement is now read as the shell reads it,
and only a plain one on the first line stays outside. A plain variable no
longer does, as the command wrapped wouldn't see it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A design becomes a draft on the host, checked and packed with its picture, and leaves only once the user says so. Drafts and which item a design became stay in the host's own folder. The feature is registered without tools: agents point users at the form, they don't publish.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A nologin shell says why on stdout: the error said only the exit status.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A design's right-click menu opens the form on a draft the host checked: what goes public, what stays private, what the check found. Sending waits for the prompt's approval and the rights statement. The entry shows only when the host's cloud says it has a library.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The database migration tool installs as goose too, and it was told apart by
what its version prints, which changes with its versions; and a session
started whatever was on the PATH without asking. Goose is now confirmed by its
help, which lists sessions, a real agent behind the tool on the PATH is found
by its path, and a session on the other program is refused saying why.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…at shows

Signing in or a moderator's decision happen elsewhere, so an open menu asks again. An update starts from the item's own title and prompt, its approval and rights said again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OpenCode has no hooks, and its GOA was only told to delegate; from version 2,
a running background server ignored the session's config altogether. It now
gets a config for its version, with --standalone or a plugin, and keeps it
through a restart, when it came back with every tool. GOA edits only in its
own folder on every agent, and is offered only where it was seen to hold.
Its MCP server offers 11 tools rather than 222, and its guide stops promising
a shell.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The agent, its chat reader and token usage share the conversation's file format, so it comes first, with the seams subagents build to.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… gate and the write guard

Metadata lives in a body's first line, not the note's header: a daemon of
before rewrites a header without keys it doesn't know, whereas a body survives
it, sync, teams, exports and proposals, and reads as text in an app of before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The + menu opened an agent with its default config only. An agent with configs
now opens in the menu to pick one, as in New session, the preferred marked; one
with none stays one click. The menu scrolls when it doesn't fit the window.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The library shares the store of teams' files, wrapped so no key resolves outside its prefix, with its limits its own. The website holds no bucket token: R2's lasting tokens are per bucket and this one holds teams' files, so it fetches a live version's objects from the cloud with its secret.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude Platform's loop has to be tested end to end with no key and no network: scripted replies in the API's SSE shape, failures on the way, and a runnable default script for later end-to-end tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
enowdev and others added 28 commits November 5, 2026 02:56
Each handler opened its own Drafts, so the mutex guarded nothing. A form closed without saving left a whole packed design on the disk for good; they go after a week.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A watch reads the lists less often and, with the window out of sight, asks less.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A config's flags and variables come last at a start, so one could undo
GOA's tools, sandbox or OpenCode's config. GOA takes only its model and
effort flags and no variable it is held by. The fallback to another agent
would have started it as a plain session on any agent: refused. A config
no longer drops the permission mode GOA runs in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
goa.switch restarts GOA in its own session, so its tabs, board, collection
and waiting lines stay and its workers never notice. Another config goes
on with the same conversation, checked before GOA stops; another agent
starts a new one, once told so. What only shows by ending puts it back as
it was. Lines wait while it changes, none going to the agent on its way
out. GOA can't change itself: that would end the turn asking.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`goa switch` and goa_switch say what GOA runs on and change it, naming the
yes a change needs. Asked by an agent the user says yes first; in GOA's own
session it only reads, and GOA isn't offered the tool.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A session hibernated and woken by goa delegate came back in auto mode: it
started asking, so its restart carried only the flag allowing bypass and took
Claude Code's own default mode, and a session switched to bypass had that mode
dropped from its restart. Preset.Argv now holds the rule for every command line
enowX builds, new, spawn, delegate, resume, continue, wake, fork, tabs, import
and restore, and drops any mode named. keepBypass has the record say the same,
so a record of an earlier daemon comes back in bypass, and an agent run by hand
in a terminal comes back so too, a command an earlier daemon noted included.

As root Claude Code refuses bypass: the session starts asking and its note says
so. An agent taking over from Claude Code doesn't inherit the mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On a home that never saw it, a session started in bypass stops at a warning whose
first answer exits, so the rule would fail on every new host and account, and a
prompt typed in would answer it no. Passed in the one --settings enowX gives it, as
Claude Code takes only the last when repeated; nothing is written to the user's files.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Switching pressed Shift+Tab a fixed number of times, watching a screen that might
not have redrawn: a late redraw, or a mode not in the cycle as bypass isn't for a
session started without it, left the session wherever the presses ended, plan mode
included. Claude Code's cycle has plan just before bypass and it has no other way to
change mode as it runs, so what would go through plan now starts again on its
conversation in that mode, if its agent is at rest and nothing it runs would stop;
the rule's bypass stays what it comes back in after. Each key waits for the screen,
no key goes to a screen that doesn't say its mode, and the call says how it ended.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GOA on Claude Code now runs in bypass, where the prompt its hook left a secret's read
to would never show. Its hook now asks, which Claude Code still honours there, and
enowX doesn't answer that prompt for it. Its refusals are denies and stand as they were.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A stand-in whose --version never returned held each OpenCode session's start
for its whole minute, as what it started kept the pipe open: 480 s in one test,
and the same would hold a real session.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
While a wake's line was open, continuing a session already back said nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Now that a message waits for the woken agent, the dialog stayed open for up to
20 seconds. A message that can't go says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Its sessions run in bypass whatever is asked, so New session's switch and the mode a
new session starts on said something that wouldn't happen. A tab takes the user's
setting rather than a Claude Code session's bypass, which says nothing of another agent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What it covers, that no setting turns it off, what still stops it, where it can't, what
one started by hand gets, GOD of Agents' permissions, and how switching mode lands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The question was drawn before many dialogs, so one they asked came up
behind them, out of reach: GOA's rules' "Delete every rule?" among them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each agent GOA is offered on with its level, the configs of the agent
picked with the official one first, and what the pick does or why it can't
be done, before anything is pressed. The host's word decides what needs a
yes, so a GOA that just got to work is asked about too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex gave no id to resume by, so a hibernated or restarted session with a
conversation came back on a new one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: the Stop's fields stay in the hook's event now built in core/hooks; a
key waiting for the app is checked before the guide's env; kept args take the
model the session was given and its config's mode flag; input to a session with
no terminal to attach goes through the daemon, which also wakes one asleep.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts: both delegate's --note and --doc stay; its panel, the skipped first
line and New project docs go in the notes page as it now is; docs keep both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One mode switch at a time for a session keeps what the switch kept when it was
rewritten: two at once could end on a mode neither asked for.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude Platform's mode key goes through plan as its sessions may: only Claude
Code's restarts to keep off it. Tests follow Platform being first among agents
and the notes page as it now is.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@enowdev
enowdev merged commit cd071c6 into main Nov 4, 2026
2 of 4 checks passed
@enowdev
enowdev deleted the release/next branch November 5, 2026 04:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant