Repository navigation
GEODE v1.0.33
Changed
- Workspace and credential cutover. Daemons and session stores share a
canonical directory digest with verified ownership. Startup migrates local
legacy stores once, without a reader fallback; ambiguous global stores require
geode config migrate-workspace. Search-index project identifiers move with
their verified owner. Live legacy runtimes and conflicting histories block
migration without discarding data. - User-owned authentication. Trusted project files cannot choose LLM keys,
credential sources, endpoints, or authentication roots. Credential refresh
reconciles removed file entries and the imported Codex snapshot. Requests and
diagnostics share route eligibility, including disabled/cooldown decisions.
GEODE-owned OpenAI OAuth refreshes on its selected subscription route with
account checks, coordinated grants and durable publication; vendor-owned
tokens remain read-only. Updates refuse other active workspace daemons and
preserve the restarted daemon's gateway mode.
Added
- Research desktop navigation. Recognize one bounded horizontal wheel
stroke per scene inside artwork, with direction and momentum guards. Keep
native scrolling, zoom, nested controls, and mobile touch navigation; widen
the existing desktop pager targets and add the existing neutral focus fill. - GPT-6.1 Sol. Select
gpt-6.1-solon the Platform API and the Codex
subscription. Requests accept onlylow..maxeffort (nonone,minimal
or Codexultra), budget context per route (1.05M/922K input on the API,
the Codex client's 500K default and 872K ceiling on the subscription) and
price API usage at the published rates, including the full-request tier
above 272K input tokens. - Claude Sonnet 5.5 and Haiku 5.5. Add both with their own request
contracts: adaptive thinking with signed-block binding, the
computer_toolset_20260801computer toolset, local rejection of forced tool
choice on Sonnet 5.5 (Haiku 5.5 keeps it), and Haiku 5.5's 5x tariff when a
prompt, counting cache reads and writes, exceeds 100,000 tokens. Account-bound
thinking drops are now reported by reason and count. - Peer-session messages and persistent session forks (R6.9).
/send,
geode session send, and thesend_session_messagetool queue a message for
another existing root session of the same project. The sender comes from the
bound session or explicit operator intent, never from tool arguments; child,
gateway, unknown, and other-project sessions are refused before any write.
The result is a durablequeuedreceipt;geode session message-status
reportsappliedonly after the target checkpointed the message, and neither
means a turn ran. The target is never woken. At its next loop boundary it
receives only a GEODE notice; its model reads the text with the
read_session_messagestool, so peer text reaches a provider only as
tool-result data, never as user or system input, and each message is
returned once. Messages are at most 4,000 characters without control
characters (line breaks and tabs allowed), and a read returns up to 5 within
8,000 serialized characters. A message counts asappliedonly after the
checkpoint holds the read result carrying it; a read whose result was lost,
interrupted or cancelled returns the message to unread. Peer backlog never
delays a child's messages or completion. A full peer mailbox (200 unread)
refuses new input instead of evicting.
/fork,geode session fork, and thefork_sessiontool publish a new
paused session from a frozen completed-turn cut of a permitted source. The
operator may fork root sessions and finished children. A root session may
fork only itself or its own finished child. The fork records source session,
generation, and cut, and copies bounded, balanced conversation history and
model settings only. Busy or incomplete sources are refused, the source stays
byte-identical, and publication is atomic, with crashed partial forks removed.
A fork reads only messages bound to the source's last committed checkpoint
(a failed save is never copied; a checkpoint written before this release
needs one completed turn first), refuses symlinked source files and histories
with an orphaned, duplicate or open tool call, and lets the owning parent
fork a finished child after its run record was pruned. A cancelled IPC fork
keeps the source Lane until the fork has actually finished.
geode session listand/resumeshow the lineage. Live sub-agent controls
are now keyed by store, parent, child, and generation, so equal child ids in
two projects cannot interrupt each other. - Research reader touch navigation. Swipe artwork left or right to move
between GEODE, Jev, and JEVDB scenes. Preserve scene URLs, language, browser
history, vertical scrolling, pinch zoom, and taps on full-size image links.
Fixed
-
Site dependency security. Update Next.js to 16.4.3 and the locked Zod
dependency to a patched release while retaining the reviewed local ESLint
plugin. The existing moderate-or-higher dependency audit remains required. -
Start GEODE from any directory. CLI auto-start uses the invoking
workspace and Python installation, with separate sockets, logs, and daemon
ownership per resolved directory. Concurrent startup cannot replace a live
server; stop/status address only that workspace. Automatic local servers do
not launch external messaging gateways, and failed startup reaps its owned
child and returns a nonzero CLI status. Existing workspace admission checks
remain in force. -
Context pressure is measured in provider tokens. The in-turn check
estimated 4 characters per token plus a 1.2x margin, but dense text such as
hex digests costs about 2 characters per token. A livecodex-oauth
gpt-6-solturn reading eighteen 57 KB files sent 259,201 input tokens on a
272K route, past its 176K warning and 227K critical levels, before any
maintenance ran. Each action request now records its provider-reported
input and attributes it to the text it sent: strings already measured keep
their own ratio, raised whenever a later measurement shows they were
under-priced (a first request mixing prose and dense text prices both at
its average), and text added since the last response (a new tool batch)
is estimated at no less than the hex density (2.2x the 4 chars/token
guess). The pressure check, the pre-send budget guard and recovery use these
estimates, so compaction starts at the warning level and pruning at
critical on every route. When a tool batch that compaction and pruning must
keep still exceeds the budget, or the provider rejects the request, the
largest tool results are bounded through the result guard, keeping their
failure fields, instead of sending the request or ending the turn.
Adaptive prune targets the warning level as measured instead of up to 1.2x
above it. Requests below 8,000 estimated tokens, planner and judge prompts,
and Anthropic responses that compacted on the server do not recalibrate. -
Effect failures no longer freeze a session. When a write tool such as
memory_saverefused a request before acting (for example, project memory
not initialized), its error was replaced by a generic "Effect outcome is
uncertain" and every later write in the session, such asgenerate_report,
was refused until an operator reconciled it. A tool can now declare that it
refused before doing anything (effect_applied: false; set for
memory_save's missing-argument, missing-memory, and invalid-insight paths
and the argument checks ofmanage_ruleandgenerate_report), and that
error reaches the model as a
recoverable result recorded as the operation's outcome. Every other effect
error, even one labelledvalidationorauthorization, may have partly
applied and stays quarantined, but now states its bounded, redacted cause, and
a blocked later call names the unresolved operation and its
geode session resolve-effectcommand. -
Gateway conversation isolation in search tools.
memory_searchand
session_search(both its default andscope="all"modes, including indexes
built before this change) return a gateway conversation only to that thread
or its workers, resolved from the tool context rather than arguments, so one
channel or sender can no longer read another's messages. Rows whose owner
cannot be established are visible only to their own session, and
geode reindexrecords each row's owner; a global index built without that
ownership data is not searched until it is rebuilt.memory_searchresponses
are capped at 4,000 serialized characters in total (1,000 per match) and
session_searchsnippets at 1,000, with explicit truncation markers. -
Peer reads within the tool-result limit.
read_session_messagesbounds
the whole serialized result by min(8,000, the live tool-result limit), so a
read is never offloaded or truncated into a redelivery loop; an oversized
message is delivered once as a marked prefix, and a limit too small for any
message returns a short final error naming the setting to raise instead of
an empty batch. Positive tool-result guard and offload limits below 32
tokens are raised to 32 so that error always fits, and a truncated tool
result of any tool keeps itserror,error_type,recoverable, and effect
flags even after hooks add context. Concurrent reads no longer
return the same message twice, and notified ids stay within the unread
backlog. -
Session ownership and fork recovery. Resuming a child session keeps its
durable parent marker. Fork cleanup removes database rows before the
directory and.fork-pendingmarker, keeps or restores the marker when row
cleanup or directory removal fails so a later sweep retries, and bounds the
swept-directory set. -
Scheduler claims under write failures. A failing dispatch callback no
longer releases a running turn's claim; claim and settlement writes that fail
restore the job, its pending command, and its run id, so one-shot jobs are not
lost and_ACTIVE_RUNSdoes not leak. -
Non-finite audit samples. A dimension with any NaN or infinite sample is
unscored (NaN mean and stderr), so the promotion gate rejects instead of
promoting on the remaining samples. -
Self-improving hub post-processing. Table wrapping is idempotent for any
label length, and the row filter's border meets 3:1 contrast. -
Eco² links. The about page and RSI roadmap link to the moved Eco²
case page atmangowhois.ai/eco2/; the retired GitHub Pages address
returned 404. -
Guarded roadmap closure merges.
scripts/merge_pr.pynow admits the
roadmap §0.3 tracking-only topic →mainPR instead of rejecting every
non-promotion main target. Admission additionally requires the current-main
diff to modify onlydocs/architecture/extensibility-roadmap.md, reads both
exact-commit blobs from GitHub and verifies their git blob ids, proves from
the commits' Git trees that the file stays a regular100644blob, then runs the
existing roadmap checker and requires at least oneIN_DEVELOP→DONE
closure. Every existing protection, check, ancestry, double-snapshot and
merge-parent requirement is unchanged. Receipts name theflowand, for
closures, the blob ids and closed GAPs. -
Current models in evaluations. Petri and seed-generation roles now admit
current catalog offerings (opt-incurrent_models = true; pinned defaults
and customallowed_modelsunchanged), so explicit GPT-6/6.1 and Claude 5.5
selections are no longer rejected or silently replaced. Petri API-key judges
and auditors use GEODE-ownedopenai-platform/andanthropic-platform/
inspect_ai providers. GPT-6 requests use the Responses API with their
effort, and Claude requests keep explicittool_choice. Unsupported effort,
thinking-off or forced-tool combinations are rejected before any request.
Rawopenai/andanthropic/ids remain the stock escape hatch. Seed
voters without an explicit effort no longer sendnoneto models that
reject it,maxis a valid voter effort, and bare-id subscription mapping
follows the catalog instead of agpt-5name prefix. -
Startup import cost. Importing the runtime, hook types, adapter registry
or extension policy no longer loadscore.config, its routing manifest or
pydantic; the policy source is imported when a policy is read, and the key
masker when an auth profile key is rendered. Runtime creation still loads
configuration as before.
Runtime startup no longer imports httpx (and its optional CLI dependencies)
to build the Google calendar adapter; Google OAuth and Workspace requests
import it when they send. Credentials are still discovered at call time. -
CLI channel shutdown. Stopping the daemon's CLI channel while a client is
disconnecting no longer fails withEvent loop is closedor leaks an
unawaited close coroutine: a client whose loop already shut down has had
its connection closed by its own handler. Other scheduling failures still
propagate. -
Approval cancellation. Release a lock acquired after its awaiting request
was cancelled, so later tool approvals continue instead of waiting forever. -
Provider setup. Offer OpenRouter alongside the other API-key providers
during initial setup and collect only the selected provider's hidden key. -
Setup menu input. The setup wizard re-asks on an empty or unknown choice
instead of treating it as the API-key route; no key is requested or saved. -
Auth recovery advice.
/login healthand the model-facing credential
note no longer present planuseas a provider switch (it only reorders
plans within one provider); provider switches point to/modelor a
user-requestedswitch_model. Expired OAuth advice distinguishes native
/login openaifrom an imported Codex CLI token (codex login, then
/login refresh). -
Research resource routes. Add a standalone publication collection and
correct the Jev reader URL to/research/jev-system1-offloading/. Preserve
shared homepage anchors and legacy reader/download addresses, and restore
language and selected pages when navigating browser history.
Shorten collection selection URLs to the default report,#jev, or#jevdb,
preserving historical selection links without duplicate history entries. -
Truthful tool outcomes.
trigger_eventlists and fires the runtime's
realTriggerManager(unknown, disabled or callback-less triggers are
errors).schedule_jobrejects malformed mutations instead of answering with
a listing.memory_save,note_saveandmanage_rulereport the project
memory owner's real result (written, already recorded, missing file,
invalid, conflict, not found, failed), andmemory_searchsearches by query
and tier.generate_reportwrites the requested markdown, JSON or HTML,
keeps the supplied findings and data, leaves an absent score unknown instead
of0.0, and returns the saved path, size and digest. -
MCP failure envelopes. Notification and calendar adapters treat
isErrorand transport errors as failures: nosent/created/deleted
success, no event without an ID, and a failed calendar read is an error
rather than an empty schedule (a partial multi-source read is labelled with
its failed sources). Calendar sync skips pushing when existing events
cannot be read. -
Scheduler store and run lifecycle. Every job change reloads the store
under a cross-processflockbefore writing, so concurrent instances no
longer lose additions or resurrect deleted or paused jobs; an unreadable or
malformed store is refused and left byte-identical. A run is claimed in the
store with arun_id, owner process and manual/scheduled provenance after
re-checking eligibility; one occurrence fires once, elapsed time never takes
over a live run, a manual run does not consume a scheduled occurrence, and a
stale outcome cannot settle a newer run. Queued action runs settle only from
the turn's real termination after the session state is saved; a failed
required write leaves the run claimed and unsettled. A failed run-claim
write leaves that occurrence retryable (recurring, cron and session-only
jobs alike), and a still-owned stuck run is reported once per run instead
of on every tick. -
Project memory integrity. PROJECT.md and rule changes lock a separate
inode, reload, validate and write atomically, so concurrent threads and
processes do not lose updates and unreadable content is left unchanged.
Symlinked or project-escaping memory and rule paths are neither read into
context nor written, and nothing is created outside the project. -
Collaboration mailbox. Message admission uses a checkpointed,
recipient-scoped receipt instead of searching message text for
mailbox_id=markers, so quoted text can no longer suppress and
acknowledge a real message. A full child inbox rejects new input instead of
evicting accepted messages, and a new child is refused while its parent's
completions would not fit, so every child result stays deliverable. -
Promotion coverage. Scaffold-search promotion (gate, bootstrap and random
control arm) requires every weighted dimension to be measured in both the
audit and the baseline; a missing dimension is unknown, not a best-case score.
NaN and infinite dimension scores are dropped at extraction and rejected
before scoring, so they can no longer pass the bootstrap floor, the margin or
the random arm; a non-finite stderr on any dimension is rejected too. With
anchor confidence enabled, an anchor dimension missing from the audit blocks
promotion (gate, bootstrap and random arm) instead of scoring as best case,
and a baseline with only some anchors requires a rebaseline. A
non-finite bench field is unmeasured rather than clamped to 1.0, and an
unreadable baseline sample count applies the conservative N=1 margin.
Weights, margins and thresholds are unchanged. -
Petri split judge. A live
--judge-mode splitaudit is refused before
dispatch; split remains a cost preview.
Removed
- CLI memory action module.
core/cli/memory_handler.pyand the module
hook globals it alone used are deleted;manage_ruleuses the injected
project memory owner directly. - Duplicate sync approval gates. The unused synchronous
ApprovalWorkflow.apply_safety_gates/confirm_write/confirm_cost/
confirm_sensitive/confirm_mcp/request_bash_approvaltwins are
deleted; the async gates are the single policy implementation. The blocking
terminal prompt (prompt_with_always) stays as the prompt owner.
Changed
-
Rule mutations require approval.
manage_ruleis a write tool (cached
approval) rather than an auto-approved safe tool, because rules persist
into later system prompts. -
Scheduler dispatch callback.
on_job_firedreceives a fifthrun_id
argument and reports outcomes throughrecord_run_outcome; a legacy
four-argument callback still works and its runs settle asdispatched
(outcome unknown).SchedulerLockis a non-reentrantflockand its
session_idargument is ignored. -
Public documentation destination. Publish the moved landing and docs
routes as redirects tomangowhois.ai, preserving language and fragments.
Retain research readers, replay, experiment archives and PDFs on GitHub
Pages, and save the complete static export before applying redirects.
Relocate that complete export to/products/geode/by changing owned URL
prefixes only, preserving the original design, Next.js interactions,
language queries, route spellings and binary assets with a hash manifest.
Keep explicit Korean landing requests as?lang=koin the redirect map
and unknown-path fallback, since the preserved landing defaults to English. -
Model lifecycle (2026-10-14). GPT-5.5 (retired 2026-10-14) and
GPT-5.3-Codex-Spark (retired 2026-09-14) are rejected on the Codex
subscription before credential or network access, with the documented
replacement named; their Platform API routes and historical prices remain.
Saved selections are never remapped. Deprecated Sonnet 4.5, GPT-5.3 Codex and
GPT-5.4 Nano stay selectable, labelled with their retirement date. Claude
secondary and budget defaults move toclaude-sonnet-5-5and
claude-haiku-5-5; retired Sonnet families nameclaude-sonnet-5-5. -
One-time approvals stay one-time. Three
yanswers no longer promote a
tool to session-wide always-allow; only an explicitagrants a standing
allow. Consecutive-denial auto-deny, per-invocation personal-data consent,
HITL levels and skip-permissions are unchanged. -
geode setup --resetkeeps credential files. It reopens the credential
wizard even when a credential already works, instead of unlinking
~/.geode/.envand clearing the dry-run marker first. A successful entry
replaces only the selected provider's key (and clears the dry-run marker, as
any successful setup does); cancelling or failing leaves.env,auth.toml
and the marker as they were. The later sandbox and Computer Use steps are
unchanged. -
In-context slot policy schema.
InContextSlotexposes only the consumed
max_entries; ranking and placement stay fixed. Saved policies whose retired
rank_by/injection_pointvalues were valid still load with identical
output (keys ignored; delete them to migrate). Previously invalid legacy
values keep their old rejection: a non-string value rejects the file, and an
unknowninjection_pointdrops only that slot. -
Credential entry.
/login addselects ChatGPT sign-in or a provider API
key in one menu. Setup and direct Anthropic login share the same key-input
flow and existing credential persistence, validation and client invalidation. -
Restore light research readers. GEODE, Jev Decision Offloading and JEVDB
use their previous light reading workspaces, preserving source artifacts,
bilingual copy and navigation. The main and Research collection retain
their dark palette. -
Research color and surface copy. Match the collection and reader controls
to GEODE's dark palette while preserving source slide colors and layout.
Describe actions and observations directly; consolidate measurement scope
and provenance in the existing evidence sections. -
Main landing restoration. Restore the pre-TypeUI dark design and controls,
remove publication lists and previews from the main body, and keep Research
navigation pointed at the standalone collection. Isolate the two stylesheets
so the Research collection and readers retain their current appearance. -
Research publication readers. Replace framed text cards with source-cover
previews and publication tabs. Add a bilingual 92-page GEODE reader and Jev
focus/text views while preserving the original PDFs, scenes, measurement
conditions, and public links. Use Jev Decision Offloading consistently
for publication labels in both languages. -
Research landing collection. Separate public experimental studies and paper
reviews from implementation topics. Jev and JEVDB now expose their readers,
reports, presentation materials, and pinned sources together, with language
matched links and mobile layouts. -
JEVDB paper review reader. Present the 19 original v25 slides in the
Decision Offloading reader layout, with bilingual notes, scene navigation,
a source sheet, and early video/PPT access. The original PPT bytes and
distinctions between paper results, examples, and GEODE evidence remain intact. -
Harness and experimental research entry points. The bilingual landing
and docs now introduce the Autonomous Agent Harness alongside its Experimental
Loop, with a two-layer map and question-led routes to Scaffold Search, Seed
Scenario Generation, SIL, and Jev. Research observations retain their source
pins and limits; local selection, independent validation, and release remain
distinct. The landing now exposes an explicit KO/EN control; Escape closes
mobile docs navigation even while its search field contains a query. -
Responsive Self-Improving Hub shell. Every generated hub page, the 11
templates and the seedgen sub-pages alike, now takes one nav from
render_hub_navand is written throughwrite_hub_pagein
scripts/build_self_improving_hub.py. Narrow screens get a brand bar with a
native "Contents" disclosure and start at the content; from 64rem the same
list is a sticky sidebar. Pages gain a skip link, breadcrumbs, a
build-time "On this page" map, and a first-screen surface list on the hub
landing. Each table now scrolls inside a labelled, keyboard-reachable region
instead of widening the page; no column is hidden. A deferred
assets/hub.jsadds a row filter to tables with 8+ rows and keeps pages
fully usable without JS. Type sizes and touch targets were raised (12px
floor, 44px rows). The hub now wears the mangowhois research room (hub
design schema 3): a night substrate with paper ink, condensed display titles,
mono ledger tables, square forms and hairline rules, chips as outlines in
their own tone, and one signal vermilion for the current place, hover and
focus only; every text colour keeps at least 4.5:1, and the title's single
registration settle is off under reduced motion. The research host supplies
the mangowhois fonts; elsewhere the system stack renders the same layout.
Rendered data, page URLs and viewer routes
are unchanged; every page's nav now lists the full route set, and the
duplicate "Recent audits" link to the log viewer became a disclosure label.
--refresh-presentation DIRapplies the same shell to a copy of the
already-published pages without recomputing data, so values with no tracked
source (runtime baselines, local Crucible ledgers, retired runs) and their
build stamps stay as published; Inspect bundles are left byte-identical and
a rerun changes nothing. Two chrome corrections ride along: the Autoresearch
nav status readssnapshotinstead oflive(stale/absentunchanged),
and the 404 Crucible link/geode/docs/architecture/crucible-kernelnow
points to the kernel source pinned at80b130c3, next to the official
Crucible bounded-search docs page.
Security
- Lock
certifiat 2026.10.19 to address PYSEC-2026-4320 reported by the
runtime dependency audit; it is a transitive dependency, no declared range
changes. - Lock
mcpat 1.30.0 to address CVE-2026-59951 reported by the runtime
dependency audit; the declaredmcp>=1.28,<2range is unchanged. - Lock the site's optional sharp dependency at 0.35.5 and its prebuilt libvips
packages at 1.3.4 to address GHSA-wq5f-xc86-pv6w (librsvg CVE-2026-96889),
restoring the dependency audit without changing Next.js or the ESLint patch. - PyJWT is locked at 2.15.1 and urllib3 at 2.8.0 to address the runtime
dependency audit findings. PyJWT is transitive throughmcpand
supabase-auth; the update retains the earlier CVE-2026-102274 fix and
adds the inconsistent OKP key fix and token-padding compatibility repair. - Site dependencies use patched Next.js 16.3.8, KaTeX 0.18.2,
brace-expansion, and source-map-js. Remove the unused react-katex wrapper
and replace gray-matter's legacy YAML chain with a YAML 2.9.1 frontmatter
parser, preserving published seed metadata and bodies. - Remove the unpatched braces dependency from Next's ESLint plugin through a
source-pinned local root-directory glob replacement. Preserve upstream rules,
configuration severities and tested pattern/diagnostic behavior; reject
excessive brace nesting. Keep the audit gate and document the patch's source,
licenses, integrity checks and official-release removal procedure.