feat(*): upgrade everos to 1.4.1, lift the windows gate, guard the embedding width - #791
Conversation
…bedding width EverOS 1.4.0 runs natively on Windows and 1.4.1 pins openai below 3, so the plugin's exact pin moves from 1.2.3 to 1.4.1; pyarrow 25.0.1, everalgo-boundary 0.2.1, everalgo-core 0.3.0 and msvc-runtime on win32 follow through the lock. Every internal everos symbol the adapter reaches is present in 1.4.1 with the same signature, so the adapter is unchanged. The Windows gate from #737 and #750 (everos_platform_note, its five call sites, ServiceState.UNSUPPORTED, the wizard's WSL notice and the zh catalogue line) is removed, and _everos_executable looks for everos.exe on win32. The manifest and package version move to 1.4.0. Two guards, found while verifying against a copy of a real 1.2.x store: - set_embedding_endpoint measures the model's vector width before it writes the pin and refuses anything narrower than the 1024-wide memory index; the wizard's own check reads the same constant and probe. A 768-dimension model pinned through the settings page had left every store and search answering 500 about a mismatched width. - ensure_everos_server reads the running server's /health version and sends a mismatch with the installed everos through the same precheck, stop and spawn chain a rotated credential takes, so an upgrade no longer leaves the old server serving until something else restarts it. Verified on a 46 MB copy of a store written by 1.2.x: 1.4.1 opens it with no schema complaint, keyword searches return the same ids in the same order, a real turn writes a new episode and a fresh session recalls it together with episodes written months earlier, and a 1.2.3 server left on the port is replaced by 1.4.1 on the next start. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
Blocking: the embedding-width guard must not reject valid non-EverOS configurations.
I found one blocking issue, marked inline.
Coverage: I read the complete github/main...HEAD diff, the embedding/knowledge callers, EverOS backend and server lifecycle callers, relevant history, dependency and lock changes, and the Windows compatibility and stale-server paths. I also checked AGENTS.md/CLAUDE.md, CONTEXT-MAP.md and the Runtime context, backward compatibility, and the deleted/replaced tests for weakening. No additional issue survived concrete-failure refutation.
Verification:
uv lock --check: passed.- Selected changed-area suite after
uv sync --all-packages: 835 passed. The first fresh-environment attempt could not collect because the workspace plugin was not installed; the first synced run then hit one non-reproducible failure in an untouched environment-mirroring test (555 passed before stop), whose isolated retry passed; the full rerun passed. uv run pytest tests/test_knowledge_manager.py tests/test_knowledge_embedding.py -q: 73 passed.uv run python scripts/check_source_language.py github/main...HEAD: passed. (makeitself is unavailable in this environment.)git diff --check github/main...HEAD: passed.
The width check in set_embedding_endpoint refused a 768-dimension model for every install, including one whose memory.backend is null or another backend. A knowledge base sizes itself to whatever width the model returns, so that refusal blocked a valid knowledge-only configuration. The check now runs only when the raw config names everos as the memory backend (an absent key is the schema default, everos; an explicit null is memory off), read raw so the loader's migrations stay out of a settings write. Also covers the three new readers the coverage gate found bare: probe_embedding_dimensions against a mock transport, running_everos_version against a faked /health, and installed_everos_version with the package present and missing. The two autouse network stubs hand the real function back to the tests about it. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
Blocking: the missing-plugin knowledge path must bypass the EverOS-only width requirement.
The explicit memory.backend = null and alternate-backend cases from the prior finding are fixed. The original thread remains open because the separately distributed everos-memory plugin can be absent while the schema default still names everos; in that supported knowledge-only installation, this revision still rejects a valid 768-dimensional pin. The concrete reproduction and required boundary are in the thread reply.
Coverage for this revision: the delta from 881428a45e95, the full standing diff, generic embedding and knowledge callers, default-backend and plugin-presence semantics, tests added or changed, relevant history and docs, backward compatibility, AGENTS.md/CLAUDE.md/CONTEXT terminology and layer constraints, and import architecture. No other candidate survived concrete-failure refutation.
Verification:
uv lock --check: passed.uv run --frozen --python 3.12 --extra dev pytest -q tests/test_rpc_settings.py tests/test_config_update.py tests/test_everos_server.py tests/test_everos_config.py tests/test_cli_onboard_commands.py tests/test_knowledge_manager.py tests/test_knowledge_embedding.py tests/test_everos_backend.py tests/test_rpc_memory.py tests/test_rpc_import_sync.py: 961 passed.uv run --frozen --python 3.12 --extra dev lint-imports: 10 contracts kept.- Ruff on the changed Python files: passed.
- Source-language gate and
git diff --check: passed.
… raven.core _everos_consumes_the_pin imported SHIPPED_DEFAULT_BACKEND from raven.core.plugin_stack, and raven.core imports raven.config, which drew config and core into a mutual pair and pushed the import-cycle budget over its ceilings (20 packages in cycles over 18, 14 mutual pairs over 13). The same value is the default of MemoryConfig.backend inside this package, so it is read from there. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
Blocking: the missing-plugin knowledge path still has to bypass the EverOS-only width requirement.
The new commit fixes the dependency direction by reading the shipped backend name from the schema, but it does not test whether that backend is installed. With everos-memory absent, everos_plugin_installed() is false while this predicate still follows the schema default; a 768-dimensional knowledge model is therefore rejected and the embedding pin is not written. The existing thread remains outstanding.
Coverage included the repository rules, the revision delta, the shared writer and its knowledge/memory callers, relevant history, backward compatibility, test changes, and import-layer constraints. The direct missing-plugin reproduction failed as above. The affected test selection reported 947 passed and 14 failed in unrelated web-onboarding environment tests; five representative failures passed in isolation, so the run is not green but those failures are not attributed to this one-file delta. Ruff, all 10 import contracts, diff hygiene, and the source-language check passed (the underlying script was run directly because make is unavailable).
…absent A core or knowledge install ships without the everos-memory distribution and still carries the schema default memory.backend = "everos", so the gate read "EverOS consumes this pin" where no EverOS backend existed and refused a valid 768-dimension knowledge model. _everos_consumes_the_pin now also asks whether the plugin is present, the same way raven.core.plugin_stack.everos_plugin_installed does, kept as a copy in this package because importing it back would close a cycle. Two cases pin both sides: without the plugin a 768-dimension pin is written under the default backend; with the plugin it is refused. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
The missing-plugin fix is effective: the supported core/knowledge installation can now save a narrow embedding pin, while installed and present-but-broken EverOS states retain the 1024-width guard. The original review thread has been resolved.
Coverage included the repository rules, the full PR diff and latest delta, affected callers, relevant history, backward compatibility, test-strength changes, and config/core architecture constraints. Verification: 237 focused config/RPC/knowledge tests passed; 4 import-cycle budget tests passed; Ruff, all 10 import contracts, diff hygiene, and the source-language check passed. No tests were weakened in this revision.
With the platform gate gone the stale-server path runs on Windows, and it
never identified the server raven itself spawned there. Two reasons:
_cmdline_of asked ps, which native Windows does not have, so lock_holder
read an empty command line and answered None; and the marker
"everos server start" never matched a Windows command line, which prints
the executable quoted with its extension ("...\Scripts\everos.exe" server
start). Restart-on-role-change and restart-on-version-change therefore
left the old server serving with "could not be identified".
_cmdline_of now asks WMI through PowerShell on win32 (console set to
UTF-8 so a non-ASCII path survives), _is_everos_server reads through it
instead of running ps a second time, and the marker is a pattern that
accepts both shapes. The pidfile fallback that names the pid already
existed. The listening-port lookup still answers None on Windows: it only
feeds one wizard sentence.
Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
The case waits out two 1500 ms ready timeouts, 3.0 s of idle against the suite's 3 s ceiling, and failed two CI shards at 3.04 s and 3.07 s. The silent stub never answers, so the budget is arbitrary; 1000 ms is what the neighbouring silent-stub case already uses. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
The new revision makes Raven-owned EverOS process recognition work with the quoted everos.exe command line returned on native Windows, while retaining the command-marker and root checks that prevent acting on unrelated processes. POSIX process lookup remains unchanged in behavior, and the subagent timeout adjustment tightens rather than weakens its test.
Coverage included the repository rules, the full PR diff and latest delta, affected lifecycle callers, relevant history, backward compatibility, test-strength changes, and architecture constraints. Verification: 388 EverOS server/subagent tests passed, 4 resolved embedding-width regression cases passed, Ruff passed, all 10 import contracts held, and diff/source-language checks passed. The previously opened thread remains resolved.
Section 7.4 said restart-on-role-change and orphan cleanup answer "unknown" on Windows; the previous commit made them work there and a Windows 11 box confirmed the role-change restart. The paragraph now says what changed, what was verified, and the two things still true on Windows: the listening-port lookup answers None and the stop is TerminateProcess. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
This revision only updates the memory-plugin architecture record, and its Windows lifecycle description matches the implemented command-line lookup, process ownership checks, stop behavior, and optional port reporting.
Coverage included the repository rules, full PR context and latest delta, lifecycle callers and history, backward compatibility, test-strength changes, and architecture constraints. Verification: 114 EverOS server tests passed; large-file, source-language, and diff-hygiene checks passed. No tests were changed or weakened, and the previously opened thread remains resolved.
|
Not a blocker. Accepted on The Windows work is real and the doc rewrite in But the rewrite kept one sentence, and it is the one I would most want changed. 1.
|
…addressable Four gaps the Windows gate removal exposed, each verified on a Windows 11 box: - The upgrade helper could not replace Scripts\everos.exe while the server raven had started was still running (uv: os error 32). After waiting for the parent, the helper now stops every process whose executable lives under the tool environment, then installs. - The server is spawned in a process group of its own (the Windows counterpart of start_new_session) and stopped with Ctrl-Break, which uvicorn takes as a shutdown. A server that ignores it for ten seconds, or one no group can be addressed to, gets TerminateProcess as before. A Ctrl-C at the gateway no longer reaches the server. - _listening_port asks the TCP table through PowerShell and walks the launcher's descendants: the socket belongs to the base interpreter two launchers below everos.exe, so the wizard's port step no longer reports raven's own server as a stranger. Also pins the wire contract: every request body the plugin and the memory page send is validated against everos 1.4.1's own request models, so a schema move on the next upgrade fails in the suite rather than as a 422 in a user's gateway log. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
This revision closes the remaining Windows lifecycle gaps coherently: Raven-created servers get their own process group for graceful Ctrl-Break shutdown, listener discovery follows the launcher descendants, forced fallback remains bounded, and the detached upgrade helper sweeps only executables under the Raven tool environment before invoking uv. The added EverOS-model validations also exercise the upgraded wire contracts directly.
Coverage included the repository rules, the full PR diff and latest delta, process/restart/upgrade callers, relevant history, backward compatibility, test-strength changes, and architecture constraints. Verification: 436 EverOS server/backend and upgrade tests passed; Ruff passed; all 10 import contracts held; large-file, source-language, and diff-hygiene checks passed. No tests were weakened, and the previously opened thread remains resolved.
|
Not a blocker. Accepted on This commit answers two of the five items in my note on the previous head, and it answers them properly rather than by rewording. Item 3 ( One thing I checked before anything else, because it was the only way this could have been blocking, and it holds: the sweep cannot kill the upgrade itself. And it does run: The one thing I would most want changedThe descendant walk validates nothing, and a wrong port is worse than no port.
What the wrong value reaches, if holder is not None and holder.port:
found_at = f"http://localhost:{holder.port}"
...
_set_base_url(found_at)
_report_everos_capabilities()
return StepOutcome.CONFIGUREDSo it points memory at a stranger and reports CONFIGURED. Before this commit that branch could not be entered on Windows, because the port was always
I am rating this non-blocking, and I want to be exact about why: it needs a coincidence, and I have no Windows host, so this is read, not run. Every Windows statement in this review is a reading of the script text. What nothing pinsFive of the six findings are the same shape -- the delta's load-bearing decisions ship green when retracted:
Nit
One finding died"The sweep prints 'Stopped ...' for pids it may not have stopped" was refuted on its own payoff: Two observations, neither filedBy the commit's own account of the process tree -- "the pid raven holds is the The sweep also leaves the plugin's bookkeeping behind: What I did not checkNothing on a real Windows host: no |
…o away What a six-angle review of the branch turned up, each a scenario a real install reaches. The rule behind the fixes: memory degrades with a notice and never blocks a turn, a start or an upgrade. - A gateway starts the server again when it finds nothing listening and nothing holding the OME lock (at most once per thirty seconds, only for a root raven owns, never over a child of its own). The only spawn used to be in start(), so a server that went away left a running gateway without memory until it was restarted by hand. - A stop that was sent and did not finish is not adopted: uvicorn closes the port at once and finishes the requests it had, so ensure raises and the probe above starts a replacement once the lock is free. - A command-line lookup that failed is distinct from a process that is gone: the stop keeps waiting, the lock names nothing, and a settings save over a server that answers but cannot be identified is not reported as applied. A losing spawn no longer overwrites the live server's pidfile. - stop_pid counts wall time and takes a grace; on Windows a backend drains the server it started at stop(), so an upgrade finds nothing to terminate mid-write. The helper asks again after Stop-Process and refuses to run uv while anything from the environment survives: --force removes the environment before writing. - An embedding pin narrower than the index is measured at backend start and withheld from the spawn, so EverOS runs keyword recall and keeps storing instead of answering 500 to everything; the notice names the model and the width. The probe no longer raises on an odd response, times out at ten seconds, honours plugins.disabled, and migrate_roles runs off the event loop it had put a provider round-trip onto. - The memory page uses the /api/v2 routes, asks /health before a search the way the chat adapter does, and shows the server's own sentence on a refusal. The recalled profile is rendered as lines rather than a namespace repr; a tool-call-only row stores empty content; top_k stays within 1..100; an empty query asks nothing; a failed capability probe is not cached. The wizard accepts a model wider than 1024 and re-prompts on the host's refusal. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; suggestions only, and they are marked inline.
This revision materially strengthens the Windows server lifecycle and the degraded-memory paths: stopped servers can respawn, draining servers are not adopted as healthy, unknown process lookups stay unknown, upgrade survivors prevent a destructive install, narrow out-of-band embedding pins degrade to keyword recall, and the memory page now speaks the current EverOS routes and request shapes.
Named nonblocking follow-up: test_upgrade_helper_refuses_to_install_over_a_survivor reads capsys twice and ends its PID assertion with or True, so that assertion cannot fail. Reading stderr once and asserting both fragments would make the new survivor diagnostic coverage real; this does not hold the runtime change.
Coverage included the repository rules, full PR diff and latest delta, lifecycle/config/RPC callers, relevant history, backward compatibility, test-strength changes, and architecture constraints. Verification: 939 affected tests passed; Ruff passed; all 10 import contracts held; source-language and large-file checks passed. The previously opened thread remains resolved.
On a Windows box a connection to a port nobody listens on took two to four seconds to be refused, longer than the probe waits, so the verdict read "slow" rather than "gone" and the gateway never started a replacement. A server that is merely slow still holds the lock, which the respawn checks first. Verified on that box: the server killed behind the gateway was back six seconds after the next turn began. Also formats the onboard test file the lint job flagged. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
…ments The assertion ended in "or True" and read capsys twice, so it could not fail; the reviewer named it. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; suggestions only, and they are marked inline.
The new TIMEOUT recovery path is safe to merge. _may_respawn still limits it to a Raven-owned HTTP backend with no live child and outside the cooldown, while _respawn checks the EverOS lock before starting anything; a merely slow live service therefore remains untouched in ordinary use. The added regression test covers the Windows dead-port behavior that motivated the change.
The previously named test-only assertion follow-up remains on this revision, so the whole-record stance stays nonblocking rather than clean. No new inline findings.
Covered this round: repository rules, the full PR diff and d8a5ee43f33c..a2dcb6aee778 delta, surrounding probe/respawn callers and history, backward compatibility, test integrity, and the config/core architecture boundary. Verification: git diff --check github/main...HEAD; 313 affected tests passed; Ruff passed; all 10 import contracts passed; source-language and large-file checks passed via their underlying scripts (the make executable is unavailable in this environment).
The lookup returns None for "could not be asked" since the last commit; the signature still said str, which the type check refused. Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
The remaining test-only follow-up is fixed: stderr is captured once, and the survivor diagnostic now has to contain both the general warning and pid 2. This removes the unconditional pass without changing runtime behavior. No other issue surfaced in the delta.
Covered this round: repository rules, the full PR diff and a2dcb6aee778..5c4a4dae05ef delta, the affected upgrade helper behavior and history, backward compatibility, test integrity, and architecture constraints. Verification: git diff --check github/main...HEAD; 142 upgrade tests passed; Ruff passed; all 10 import contracts passed; source-language and large-file checks passed. The review thread opened earlier is already resolved.
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
The revised _cmdline_of annotation now accurately describes its existing three outcomes: a command line, an empty string for a vanished process, or None when lookup is unavailable. Both callers already narrow None before using the value, so this introduces no runtime or compatibility change.
Covered this round: repository rules, the full PR diff and 5c4a4dae05ef..e8d4306f2486 delta, both callers and relevant history, backward compatibility, test integrity, and architecture constraints. Verification: git diff --check github/main...HEAD; 125 server tests passed; Ruff and targeted ty checks passed; all 10 import contracts passed; source-language and large-file checks passed. The review thread opened earlier remains resolved.
|
Not a blocker. Accepted on Nothing here blocks the merge. But eight of the eighteen are one shape, and I think naming the shape is worth more than the list. One predicate, two readers, one of them already fixedThree times in this delta, a value that means three things is read as if it meant two -- and in each case the correct reading is present in the same commit, a few hundred lines away. 1.
# ``None`` (the question could not be asked) keeps waiting: the caller
# would otherwise start a second server against a lock this one holds.
if _is_everos_server(pid) is False:
if isinstance(recorded, int) and _is_everos_server(recorded):
Your own doc states the protection unconditionally -- 2. This is the one I most want changed, because it is the claim the whole TIMEOUT widening rests on. if await asyncio.to_thread(lock_holder, everos_root(), with_port=False) is not None:
returnThe correct reading of the same if outcome is None and await asyncio.to_thread(_probe_health, base_url):
# Something answers on the address and the lock could not name it
# (a lookup that failed, a pidfile lost on Windows).
Second-order, read but not reproduced: the loser still rewrites 3.
The same architecture fact underneath all three: nothing in the tree owns "the everos server this process is responsible for". A fourth instance: The cheapest one to fix, and it is measurable today
This delta recognised the problem twice and fixed it twice -- The pin guard: "Three things" is still not exhaustiveI raised two states on an earlier head. The rest of the non-blocking set
Nits
What I checked myself, and what I did notI read both readers of each predicate directly rather than taking the lanes' word: No Windows host. Every win32 statement in this review is a reading of code, never a run; where a reproduction stood in for the environment it says so, and the one stand-in used throughout ( |
|
No blockers; suggestions only, and they are marked inline. The evidence in the latest review changes the standing stance from clean to nonblocking. The cited tri-state asymmetries are present: the boot-race pidfile path treats an unavailable command-line lookup as false; automatic respawn treats an unidentifiable lock holder as no holder without the health cross-check used by config restart; and the RPC search path duplicates the backend tuning policy with different outcomes. The environment-managed embedding case is also absent from Verification on the unchanged head: |
…ce at start Eight of the open items from the 1.4.1 verification round, all in code this branch added or in the two lines the memory page shares with it. - Agent-track recall without a rerank role asks for VECTOR instead of the LLM rerank lane. Measured against a 1.4.1 store: the LLM lane took 10-12 s a call with or without candidates, past the 4 s recall budget, so agent cases and skills were never recalled on such installs and an LLM call was billed per turn for nothing; VECTOR answers in 0.3-1.5 s. Same change on the memory page, which timed out at 15 s the same way. - A withheld embedding role is bound to the pin it was measured on. The notice asks the user to pick another model; the settings page then restarts the server without measuring anything, and the withhold used to outlive the fix until the gateway itself restarted. - The self-heal respawn waits for start() to return. A turn arriving while start() was still measuring roles found nothing listening and spawned a server beside the one start() then spawned, which died on the OME lock and was reported as "exited with code 1". - A server still booting past the start budget raises its own error, EverosStillStartingError, and the backend reports it as a wait rather than an outage: an upgraded server rebuilding its index over a large store outruns the budget every time. - The memory page names the timeout when the error has no message, instead of "everos unreachable: " and nothing after the colon. - _spawn_kwargs no longer claims the process group shields the server from the gateway's Ctrl-C; measured, both stop, the server cleanly. - Tests: the loser of a start race not overwriting the pidfile gets its cases; two search tests stop resolving the hostname "x" (5 s each). Co-authored-by: Claude (claude-fable-5-1) <noreply@anthropic.com>
gloryfromca
left a comment
There was a problem hiding this comment.
No blockers; suggestions only, and they are marked inline.
This delta is merge-safe and closes several of the named follow-ups: the RPC tests no longer reach DNS, the UI and adapter now agree on keyword/vector degradation, withholding follows the measured pin rather than lingering across a model change, and background self-heal cannot race the initial start. The distinct still-starting result also preserves recovery while improving the operator message.
The previously named pidfile tri-state, unidentifiable-lock respawn, and environment-managed embedding-pin follow-ups remain unchanged, so the whole-record stance stays nonblocking. No new inline findings.
Covered this round: repository rules, the full accumulated PR diff through the reviewed deltas, e8d4306f2486..07fbff1918cf, changed callers and relevant history, backward compatibility, test integrity, and architecture constraints. Verification: git diff --check github/main...HEAD; 475 affected tests passed; Ruff and targeted ty checks passed; all 10 import contracts passed; source-language and large-file checks passed. The review thread opened earlier remains resolved.
## Summary Bump the package version from 0.2.1 to 0.2.2 for the next release. Only pyproject.toml and uv.lock change. Since v0.2.1, main merged one PR (#791). It moves the memory plugin's everos pin to 1.4.1, removes the Windows memory gate, and adds two guards: an embedding narrower than the memory index is refused where it is pinned and withheld from the spawn, and a running server whose version no longer matches the installed everos is replaced rather than reused. It carries no BREAKING CHANGE footer, so this is a patch bump, the way v0.2.1 was for its three features. The tag and release notes follow once this lands. ## Type - [ ] Fix - [ ] Feature - [ ] Docs - [ ] CI / tooling - [ ] Refactor - [x] Other ## Verification - `uv lock` on a clean worktree cut from main: Resolved 251 packages, Updated raven v0.2.1 -> v0.2.2 - `git diff --stat github/main..HEAD`: pyproject.toml and uv.lock, 2 insertions, 2 deletions - `PYTHONPATH=. python scripts/check_commit_messages.py github/main..HEAD`: exit 0 - `npx commitlint --from github/main --to HEAD --config commitlint.config.cjs`: exit 0 - `python -c "import importlib.metadata as m; print(m.version('raven'))"` after the sync: 0.2.2 - No test run: the change is version metadata only. - [ ] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [ ] User-facing docs or screenshots are updated when needed ## Risk No code change. Rollback is reverting this commit before any v0.2.2 tag is pushed. - [ ] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes ## Related Issues N/A Co-authored-by: gloryfromca <23442919+gloryfromca@users.noreply.github.com> Co-authored-by: Claude (claude-opus-5) <noreply@anthropic.com>
## Summary The everos 1.4.1 upgrade (#791) landed without a changelog entry. This adds four bullets to `## Unreleased`, in the section's own voice, and changes nothing else. Under `### Added`: memory runs on native Windows now that the platform gate is gone, and an embedding model narrower than the 1024-wide memory index is refused where it is pinned and withheld from the spawn. Under `### Changed`: a running EverOS whose version no longer matches the installed one is replaced rather than reused, with the gateway starting one again when it finds nothing listening; and recall on the `agent_case` and `agent_skill` tracks searches by vector when no reranker is configured. The numbers each bullet names were read from the source rather than from the PR text: `REQUIRED_EMBEDDING_DIMENSIONS = 1024` (raven/config/update.py), `_RESPAWN_MIN_INTERVAL_S = 30.0` and `_RECALL_TIMEOUT_S = 4.0` (plugins-dist/everos-memory/raven_everos/backend.py), and `CTRL_BREAK_EVENT` as the graceful signal (raven_everos/server.py). The two tracks are named as the page names them, Cases and Know-how. ## Type - [ ] Fix - [ ] Feature - [x] Docs - [ ] CI / tooling - [ ] Refactor - [ ] Other ## Verification - `git diff --stat github/main..HEAD`: CHANGELOG.md, 34 insertions, 0 deletions - `PYTHONPATH=. python scripts/check_commit_messages.py github/main..HEAD`: exit 0 - `npx commitlint --from github/main --to HEAD --config commitlint.config.cjs`: exit 0 - The inserted lines are ASCII only, checked per character - No test run: the change is a documentation file. - [ ] Relevant tests pass locally - [x] Relevant lint / type checks pass locally - [x] User-facing docs or screenshots are updated when needed ## Risk No code change. Rollback is reverting this commit. - [ ] Security impact considered - [x] Backward compatibility considered - [x] Rollback path is clear for risky changes ## Related Issues #791 Co-authored-by: Claude (claude-opus-5) <noreply@anthropic.com>
Summary
EverOS 1.4.0 runs natively on Windows and 1.4.1 pins
openaibelow 3, so the memory plugin's exact pin moves fromeveros[multimodal]==1.2.3to==1.4.1. The lock follows:pyarrow24.0.0 -> 25.0.1 (EverOS's new floor),everalgo-boundary0.2.0 -> 0.2.1,everalgo-core0.4.0 -> 0.3.0 (EverOS now pins its everalgo layer with==), andmsvc-runtimeonwin32only.lancedbstays at 0.34.0. Every internal everos symbol the adapter reaches is present in 1.4.1 with the same signature, so the adapter itself is unchanged. The plugin manifest and package version move to 1.4.0.The Windows gate is gone.
everos_platform_note(#737) and its five call sites,ServiceState.UNSUPPORTED, the import.scan refusal (#750), the wizard's WSL notice and its zh catalogue line are removed;_everos_executablelooks foreveros.exeonwin32. Spawning, probing and reusing the server were already portable. Identifying and stopping a stale server was not:_cmdline_ofaskedps, and the markereveros server startnever matched a Windows command line (...\Scripts\everos.exe server start). The command line now comes from WMI through PowerShell onwin32and the marker accepts both shapes;_listening_portasks the TCP table through PowerShell there, walking the launcher's descendants: the socket belongs to the base interpreter two launchers beloweveros.exe. The server is spawned in a process group of its own (the Windows counterpart ofstart_new_session, which also keeps a Ctrl-C at the gateway off it) and stopped with Ctrl-Break, which uvicorn takes as a shutdown; one that ignores it for ten seconds, or one no group can be addressed to, getsTerminateProcessas before. And because Windows cannot replace a running executable, the upgrade helper stops whatever still runs from under the tool environment before it installs (the server outlives the gateway by design); without that,uvfailed onScripts\everos.exewith os error 32. Recorded indocs/memory-plugin-architecture.mdsection 7.4.Two guards, found while verifying against a copy of a real 1.2.x store:
set_embedding_endpointmeasures the model's vector width before writing the pin and refuses anything narrower than the 1024-wide memory index (REQUIRED_EMBEDDING_DIMENSIONS), but only where an EverOS backend will read the pin: theeveros-memorydistribution is installed and the config nameseverosas the memory backend (an absent key is the schema default; an explicitnullor another backend is not gated, and a knowledge base sizes itself to whatever width the model returns). The wizard's own check imports the same constant and probe. A 768-dimension model pinned through the settings page had left every memory store and search answering 500 about a mismatched width, with nothing on the page saying why. A probe that cannot reach the provider is not a verdict: the pin is written and a warning logged. The two RPC writers run the (now network-touching) writer in a thread.ensure_everos_serverreads the running server's/healthversion and, for a root raven owns, sends a mismatch with the installed everos through the same precheck / stop / spawn chain a rotated credential takes (stale_reason). Raven used to reuse whatever answered on the port, so an upgrade left the old server serving until something unrelated restarted it. A root the user manages is never touched.The wire contract is pinned. Every request body the plugin and the memory page send (
/addwith a tool exchange,/flush, the four/searchshapes, the four/getkinds) is validated against everos 1.4.1's own request models inTestRequestBodiesMatchEverosModels, so a schema move on the next upgrade fails in the suite rather than as a 422 in a gateway log.A six-angle review then hardened the degraded paths (turn survival under every EverOS failure, Windows lifecycle, upgrade paths, the embedding guard, the wire contract, concurrency). The rule: memory degrades with a notice and never blocks a turn, a start or an upgrade.
start(), so a server that went away left a running gateway without memory until restarted by hand. A stop that was sent and did not finish is not adopted (uvicorn closes the port at once and finishes what it had), so the version-mismatch restart after an upgrade cannot leave the gateway on a dying server.ps, PowerShell blocked, WMI wedged, timeout) is distinct from a process that is gone: the stop keeps waiting, the lock names nothing, and a settings save over a server that answers but cannot be identified is reported as not applied. A losing spawn no longer overwrites the live server's pidfile.stop_pidcounts wall time and takes a grace; on Windows a backend drains the server it started atstop().Stop-Processand refuses to runuvwhile anything from the environment survives (an elevated or another user's process):--forceremoves the environment before writing and would have left every file but the one that could not go.plugins.disabled;migrate_rolesruns off the event loop it had put a provider round-trip onto./api/v2routes (v1 is EverOS's legacy alias), asks/healthbefore a search the way the chat adapter does, and shows the server's own sentence on a refusal. The recalled profile is rendered as lines rather than anamespace(...)repr with its evidence fields; a tool-call-only row stores empty content, not"None";top_kstays within 1..100; an empty query asks nothing; a failed capability probe is not cached. The wizard accepts a model wider than 1024 (EverOS keeps the first 1024, as the settings page already allowed) and re-prompts on the host's refusal instead of a traceback.docs/memory-plugin-architecture.mdsection 7 records the upgrade (7.4) the way 7.3 recorded 1.2.1 -> 1.2.3.Type
Verification
Unit and RPC tests over every touched area:
Against a 46 MB copy of a store written by everos 1.2.x (568 episodes, 5528 atomic facts, seven LanceDB tables), never touching the live one:
everos server starton 1.4.1 opens it with no schema complaint;/healthreportsversion 1.4.1,cascade.healthy true.The same four
/api/v2/memory/searchrequests on 1.2.3 and 1.4.1 return the same ids in the same order; BM25 scores drift in the third decimal place.raven agent -mon this branch spawns everos 1.4.1, a "remember this" turn lands inepisodes/episode-2026-09-24.mdand.atomic_facts/, a fresh one-shot session recalls it, and a third session recalls episodes written under 1.2.x months earlier.With a 1.2.3 server left on the port, the next
raven agent -mlogsruns everos 1.2.3 while this raven installs 1.4.1; restarting, the old pid exits and/healthreports 1.4.1. The 1.2.3 server had opened the index 1.4.1 wrote with no complaint.Windows 11 box, this branch checked out and synced:
raven servespawnseveros.exenatively, the Memory page shows its four tabs instead of the platform sentence, a chat turn lands as an episode (/add200,/flush200, cascadeupserted=1), and after a memory role change the next start logsholds credentials raven has since changed; restarting, the old everos pid exits and the new one answers/health1.4.1.The settings page refuses
BAAI/bge-base-en-v1.5on deepinfra withreturns 768-dimension vectors and the memory index is 1024 wide(real probe), and the pin stays unchanged.Adapter import smoke against 1.4.1: all 13 internal symbols present, signatures unchanged.
Windows 11 box, second round: with the server up,
uv pip install --reinstall --no-deps everos==1.4.1fails onScripts\everos.exe(os error 32, exit 2); after the helper's sweep (Stopped what was still running from the old install (pid ...)) the same command succeeds and the relaunched gateway spawns a fresh 1.4.1. A stop from the spawning console runs the full uvicorn shutdown (Shutting down...Finished server process) in 3 s; a stop from another console falls back and the process is gone in 2 s.lock_holder(root).portreads 18997 (launcher -> venv python -> base python).tests/test_everos_server.py tests/test_updates_upgrade.py: 261 passed, 1 skipped;tests/test_everos_backend.py -k RequestBodies: 7 passed.Review round (
env -u SERPER_API_KEY uv run --frozen --python 3.12 --extra dev pytestover the everos, config, settings, memory page, import, onboard, plugin-stack, boundary, cycle-budget and contract files): 1225 passed, 1 skipped;test_everos_server.py124,test_everos_backend.py188.Windows 11 box, review round: with the gateway serving, the everos launcher was terminated by hand (
Stop-Process, nothing on 18997); the next turn answered without memory (recall failed ... state=unresponsive), and six seconds after it began the gateway loggedstarted everos server/everos server ready, the pidfile named the new pid and/healthanswered 1.4.1. The first attempt did not fire because a dead port there takes 2-4 s to be refused, longer than the 1 s probe; the respawn now fires on a timed-out probe as well, guarded by the lock holder. The memory page's four counts and a search on the Cases tab went through the v2 routes.Relevant tests pass locally
Relevant lint / type checks pass locally
User-facing docs or screenshots are updated when needed
Risk
Windows installs that used to read "long-term memory is not available on Windows yet" now spawn EverOS, and a stale server is identified and replaced there too. The stop there is Ctrl-Break with a ten-second fallback to
TerminateProcess. An upgrade on Windows first stops every process whose executable lives under the tool environment: raven's own gateway, sub-agents and server, nothing outside that directory.An embedding pin narrower than 1024 dimensions is refused at the settings page and the wizard, with the width in the message, only for an install whose memory runs on EverOS (plugin installed, backend
everosor the default). Knowledge-only installs, memory off, and other backends keep any width. Existing pins are not touched.An owned EverOS server whose version differs from the installed package is restarted on the next session start. A root the user manages is never restarted.
A gateway may now start an EverOS server on its own when its probe finds nothing listening and nothing holding the lock (owned roots only, at most every thirty seconds). On Windows a backend stops the server it started when it shuts down (Ctrl-Break, sixty seconds to drain), so a settings change or an upgrade there restarts the server rather than leaving it. An upgrade on Windows refuses to proceed while a process from the tool environment cannot be stopped, and says which pid.
An embedding pin narrower than 1024 that reached the config around the settings check is no longer handed to EverOS: recall runs on keywords with a notice naming the model, until a 1024-dimension model is pinned.
Rollback: revert the commit and
uv sync.lancedbdid not move, so an index written by 1.4.1 opens under 1.2.3 (exercised on the copy).Security impact considered
Backward compatibility considered
Rollback path is clear for risky changes
Related Issues
N/A