GEODE v0.99.333
Added
geode updatenow updates persistent uv installs without crossing a
release series by default. The command detects uv ownership from its tool
receipt, replaces the standard stored request with
geode-agent~=CURRENT_VERSION, installs the newest compatible patch, verifies
the CLI, and restarts a running daemon.--latestis the explicit opt-in for
minor or major package upgrades. Editable installs still pull, sync, and
refresh their CLI, but now resolve the GEODE checkout from PEP 610 metadata
and project identity instead of treating an arbitrary current git repository
as GEODE source. Registry resolution runs from an isolated temporary directory
with uv config discovery disabled, so the caller's project configuration
cannot redirect it. Non-default uv tool and executable directories are
preserved from the receipt, and verification plus daemon restart use that
recorded executable even when it is absent fromPATH. Customized receipts
and non-editable direct installs stop instead of silently dropping options or
changing install mode; source-backed recovery guidance keeps the original
source reference instead of redirecting the install to PyPI and identifies
the receipt that holds every custom option. Metadata-free installs no longer
fall back to the caller's Git checkout. A running daemon stays up until the uv
replacement passes verification, then restart proceeds only after its old
socket is confirmed closed and its new socket is confirmed ready.
Fixed
- Docs sidebar keeps its place across page navigation. The independently
scrolling desktop navigation now restores its position whenDocsShell
remounts, so following a deep docs link no longer jumps the menu to the top. - Wide docs tables stay inside the mobile viewport. Reference tables now
scroll horizontally within the article instead of widening the whole page. - Public release verification handles checksum manifests deterministically.
The stable-release tail now calls a reusable standard-library verifier that
strips line terminators before comparingSHA256SUMS, retries complete
public snapshots, and checks the exact requested PyPI version against the
annotated tag target and GitHub release assets. Repairing an older immutable
release no longer depends on whichever package version is currently latest.
Changed
-
Homebrew distribution is core-only. The former custom distribution
repository has been deleted, and release automation, public docs, and the
distribution skill now forbid recreating a qualified-tap fallback. The
geode-agentHomebrew/core candidate defaults to Homebrew's current Python
3.14 formula and must pass strict audit, source build, formula tests, official
API discovery, and an unqualified clean-machine install before the brew
command can return to the public installation surface. -
Slack transport rewritten — direct Web API, no MCP subprocess.
Root cause of the dead Slack surface: theslackMCP server lost a
startup race on every daemon boot (StdioMCPClient.connectwaits at
most 10s while a warm-cachenpx @modelcontextprotocol/server-slack
spawn measures 10.1s), so the poller's health gate silently disabled
ALL inbound and outbound Slack while the bot token was valid the whole
time. Newcore/messaging/slack_transport.pyposts straight to the
Web API over httpx (chat.postMessagewith 39k chunking + threaded
follow-ups,conversations.history,reactions.addwith
already-reacted tolerance, 429 Retry-After backoff, cached
auth.testavailability, token resolution falling back to the
global~/.geode/.env).SlackNotificationAdapterand
SlackPollernow consume the transport (names and NotificationPort/
ChannelManager contracts unchanged); the deprecated npm package, the
10s race, and the MCP health-gate coupling are gone. Inbound stays
polling — Socket Mode needs an app-levelxapp-token the
deployment does not have yet (documented follow-up). -
Gateway config has a root-level SoT.
[gateway](+ binding
rules) now loads from the user-level~/.geode/config.tomlas the
authoritative source with the project.geode/config.tomlas an
explicit overlay (scalar keys override, binding rules append), and the
hot-reload watcher observes both files. Previously only the project
file was read, so the daemon's entire Slack surface depended on its
launchd WorkingDirectory. Boot logs now name the config sources used. -
Notification adapter survives daemon threads.
get_notification()falls back to a process-wide last-set adapter
(mirroring the gateway's module global) —send_notificationand
ask/reply publishes from poller/IPC threads previously read a
thread-empty ContextVar and silently no-oped. -
geode doctor slackdiagnoses instead of misreporting. Credential
checks resolve os.environ THEN the global.env(a valid
dotenv-stored token was reported "not set"); the stale
pgrep server-slackprocess check is replaced by a live
auth.testprobe through the same transport the daemon uses.
Deleted per the rewrite: MCP tool calls in the poller, the MCP-backed
Slack adapter body, the legacy constructor shape, and the
server-slackdoctor check. Guards:
tests/core/messaging/test_slack_transport.py(13),
tests/core/wiring/test_gateway_config_sot.py(5), migrated
tests/core/mcp/test_notification_adapters.py.