Skip to content

Release v2.61.0 - #6697

Merged
atomantic merged 176 commits into
releasefrom
main
Sep 9, 2026
Merged

Release v2.61.0#6697
atomantic merged 176 commits into
releasefrom
main

Conversation

@atomantic

Copy link
Copy Markdown
Owner

Release v2.61.0

Released: 2026-09-09

Highlights

Chief of Staff and scheduled work

  • Scheduled audits can now be organized by labeled lenses, with shared guidance, actionable disabled states, and live maintenance progress.
  • Quota Burn and scheduled maintenance now preserve ordered plans and invoke the same maintenance sequence independently of one another.
  • Agent lifecycle and completion handling now share one consistent path across CLI, TUI, read-only, and claim runs.

Providers and review operations

  • Code review configuration now selects supported providers, models, and effort pins from the shared catalog, with a larger-model fallback for oversized reviews.
  • Provider controls, model metadata, and local backend management now use shared ownership and safer readiness rules.

Communication and federation

  • Added Beeper as a third communications source, including a desktop bridge and feature-group controls alongside existing messaging integrations.
  • Hosted Eidoverse guest sessions now cap microphone input and re-read live session state before relaying it.

Creative workspaces

  • Universe Builder now offers character-sheet casting plus relationship graph views, timeline navigation, gap inspection, and poster export.
  • Writers Room editing is more focused with collapsible sections and stabilized saves, while video asset readiness and repair warnings are now unified.

Reliability and everyday UI

  • Backup, restore, update, notification, voice-call, and cron paths now report failures and preserve state more consistently.
  • Responsive layouts, navigation, disabled controls, and mobile headers received focused fixes across the main workspaces.

Changes

Chief of Staff, audits, and maintenance

  • Added labeled scheduled-audit lenses and shared run guidance, with catalog-derived audit stages and lane tests.
  • Added maintenance sequences that can be launched from scheduled tasks or directly from the Schedule tab, with HTTP-safe identifiers and streamed agent notifications.
  • Added ordered maintenance steps to Quota Burn and preserved maintenance plans across refresh failures and disabled-run states.
  • Hardened autonomous issue filing with shared labels, substantive-review requirements, and issue-count quota guards.
  • Compacted completed agents into a responsive grid and kept claim, read-only, and non-coding runs accurately identified.

Agent execution and task lifecycle

  • Centralized agent completion and status-transition handling across CLI and TUI spawners.
  • Contained scheduled handler loading and execution failures and prevented unrelated skill templates from entering scheduled-task prompts.
  • Exposed safe shared seams for provider controls and aligned launch behavior with the Claude harness.
  • Preserved boundary contracts for task intake, write-task updates, and spawn block-and-bail gates.

Providers, models, and review

  • Added catalog-backed provider and model selection for code review, including effort pins and safe fallback assignments for oversized reviews.
  • Gave local model metadata a shared service owner and unified hosted VideoGen backend predicates and asset readiness.
  • Added a feature-group toggle for related instance features and attributed group changes to the user.
  • Preserved provider control state across refreshes and kept disabled providers from being selected.

Communications, federation, and voice

  • Added Beeper as a desktop-bridge communications source and hardened its integration and feature-group behavior.
  • Preserved Telegram notification coverage and aligned unread badges with authoritative server totals.
  • Kept voice-call openings pending until TTS delivery, decoded misaligned PCM frames, and capped hosted guest microphone input.

Creative and media workspaces

  • Redesigned Universe Builder cast entries as character sheets and added relationship graph, timeline, gaps, and poster-export workflows.
  • Added focused Writers Room controls, collapsible sections, and stable save behavior for narrow and mobile layouts.
  • Centralized pinned video snapshot resolution and unified video repair labels and readiness warnings, including missing metadata.
  • Preserved scene, media-queue, and render-lane accounting through retries, cancellations, and recovery paths.

Backup, restore, update, and infrastructure

  • Made backup schedule defaults resolve consistently and clarified exclusion-rule state without promising unsupported file inclusion.
  • Bound database restores to previewed scope and valid previews, with locked live restore controls.
  • Made self-update launch readiness explicit and preserved exact Git paths in CI test selection.
  • Improved PM2 log line buffering, cron validation, and cross-platform send guards.

Full Changelog

Full Diff: v2.60.0...v2.61.0

atomantic and others added 30 commits September 8, 2026 05:37
The federation teleport bar rendered a "No connected guest worlds
available" row above the page header even when there was nothing to
travel to, and the header action buttons (Labels/Controls/World only)
wrapped onto their own cramped row on narrow screens. Hide the
teleport bar when there are no destinations, and collapse the action
buttons to icon-only below sm so they fit alongside the title.
The compact CoS status grid shows an extra Learning row on phones,
pushing the Queue/Agent controls below the fold. Keep it on the
desktop sidebar grid (where there's room) and hide it under lg:.
fix: tighten Eidoverse header for mobile, hide empty federation bar
CreativeDirectorModelsDrawer (video production model editor) and
AiAssignmentsTab labeled disabled providers "(disabled)" in the text
but never set the <option> disabled attribute, so a user could still
select and save a pin to a provider that can't actually run. Thread
the enabled flag through assignmentProviderOptions and mark the
option itself disabled.
fix: clarify video production setup recheck action
fix: disable selecting a disabled provider in AI model pickers
… task drawer

A bare-tag CSS rule (aside.bg-port-card, header.bg-port-card) meant only for
the app shell's own sidebar/mobile topbar also matched the shared Drawer
panel, since it's rendered as an <aside class="bg-port-card ..."> too. On
translucent "glass" themes that swapped the drawer's opaque fill for the
sidebar's ~50-60%-alpha gradient, so on mobile WebKit the scrolled page behind
the drawer ghosted through legibly — reported as a large blank/empty region
to scroll past before reaching a scheduled task's settings.

Scope the sidebar rule to dedicated .port-app-sidebar/.port-app-topbar
classes, and generalize the existing .port-menu-surface opaque-surface class
(previously only used by the "Run on App" picker) to .port-opaque-surface so
the Drawer panel can reuse it instead of adding a one-off rule.
fix: stop the sidebar's glass-theme background from bleeding into the task drawer
feat: select configured providers and models for code review
…ne-mtsdq1rl/agent-8784b0c5

fix: separate agent workspace lookup from JIRA prompt support
…uest schema

`addTask` in cosTaskStore.js had grown to 400 lines, 250 of which were the
pure mapping from a request's top-level fields onto the persisted `metadata`.
The request schema (`createCosTaskSchema`, lib/cosValidation.js) lived in
another file with nothing checking the two agreed, and they drifted three
times: `optionalReviewers` was validated but never persisted (the task form's
`~opt` badges silently fell back to the Code Review Defaults), and
`discardWorktree` / `noCodeOutput` were reachable only through the raw path.
Over the last 90 days 13 of the 25 feature commits that touched `addTask`
also edited the schema, so every new task option paid that two-file cost.

The mapping now lives in `services/cosTaskIntake.js` as `buildTaskMetadata` /
`buildQueuedTask` (a verbatim move, no behavior change), and
`cosTaskIntake.test.js` classifies every schema field: it either maps (a
schema-valid sample must change the metadata) or is named as a non-metadata
field with the reason. Adding a schema field without either fails the suite;
dropping a mapping fails the field's sample.

`PRIORITY_VALUES` was a second copy of taskParser.js's table; the store now
re-exports the original at the same address.
…ready proves

Follow-up to the intake extraction, from the simplify pass:
- cosTaskIntake.js reached the lib/validation.js barrel (122-module closure)
  for seven names that cosValidation.js / reviewerConfig.js declare; import
  them there (49 modules) and pin the narrowing in importScoping.test.js.
- The two buildQueuedTask tests duplicated store-level addTask cases; only the
  schema parity guard stays.
- PRIORITY_VALUES now has one address (lib/taskParser.js); the store no longer
  re-exports it.
- Collapse the raw/non-raw branch to a ternary and fix two relative
  "above/below" comments the move made stale.
…t-module-hygiene-mtsr2zpx/agent-4ef18a89

Move the CoS task intake mapping out of addTask and pin it to the request schema
…bar by default

The songbook viewer's play mode stacked two full-height transport/control bars
above the sheet and kept "Chords used" inside the scroller, so on a phone the
sheet started a third of the way down the screen and the shapes you are
reaching for scrolled away after bar 1.

The header band is now three collapsible cards with remembered open state and a
one-line summary while closed: Audio (the sounding transport — collapsed by
default, since it is the tallest band and one you set once), Sheet controls
(autoscroll/transpose/size/view/stage), and Chords used, lifted out of
TabSheetView so it sits above the scroller and stays visible while the sheet
moves under it.
… hooks

Follow-up cleanup on the previous commit: the new CollapsibleBar and
usePersistedDisclosure both re-implemented primitives the tree already had.

- ui/CollapsibleSection gains a `bar` size, an `id`/`aria-controls` pass-through
  and an opt-in `keepMounted` (body hidden rather than unmounted, on a wrapper a
  caller's bodyClassName can't restyle) — enough for all three songbook cards,
  so CollapsibleBar is gone and the headers keep the 44px touch target.
- useLocalStorageBool returns a third `toggle` element instead of a parallel
  persisted-boolean hook.
- Both transport bars are memoized and take `pulse` only while their card is
  open, so a collapsed Audio card costs no per-beat reconciliation.
- A play/`p` shortcut now opens the Audio card it drives, instead of sounding a
  kit whose transport is off screen.
…them into client/src/utils/providerTypes.js

client/src/utils/providerTypes.js was the one provider table the #6364 /
c82dcdf sweep left as a hand copy: commandBasename, the isXProvider
vendor predicates, localRuntimeNamespace, isCodexSubscriptionProvider,
PROVIDER_TYPES and isOllamaBackedProvider, each behind a "keep in
lockstep" comment and none behind a parity test (the mirror suite that
sweep deleted pinned the effort ladders, not these). Every vendor
addition since landed the same predicate on both sides in one commit —
kimi (682411f), cursor (75d755e), the grok effort flag (5cdaaf5),
antigravity (d718914), the codex subscription rule (9394882,
d0f5e33) — and the copies had already drifted: the server trims the
codex command before matching it, the client did not.

Every source is a pure leaf the browser bundle already reaches
(providerModels.js, aiToolkit/constants.js) or a dependency-free
aiToolkit leaf (internal/ollamaBacked.js — its public barrel pulls fs
and child_process, so the browser takes the leaf that barrel itself
re-exports). Two predicates move INTO providerModels.js so the browser
gets them without a second module: isCodexSubscriptionProvider leaves
codexAccount.js (which re-exports it for its server callers) because
that module's frozen protocol tables are top-level Object.freeze calls
the bundler cannot shake — importing it cost the providers chunk ~1 KB
of never-read strings; and the OpenCode-on-a-local-backend gate that
effortLevelsForProvider inlined becomes isOpencodeLocalProvider, so the
client's effort-picker gate is the ladder's own predicate rather than a
restatement of it. isGrokBuildCli is now isProcessProvider &&
isGrokProvider. isClaudeCommandProvider stays client-local on purpose:
the server's isClaudeCommand counts a blank command as Claude, which
would strip the sampling controls off api providers that carry no
command at all; the type-gated form the server uses lives in
providerFamilies.js, which is not browser-safe.

The client test now pins identity — every name the module shares with a
server leaf IS that leaf's export, which a copy cannot satisfy, and the
shared set is listed so a dropped re-export or a shadowing local
declaration fails too — in place of the two parity tests that became
tautological. Verified with a re-inlined copy and with a shadowing
declaration: only the intended rows fail.
pin the songbook chord shapes above the sheet and collapse the audio bar by default
…t-code-quality-mtsryh58/agent-6d320f1e

re-export the provider predicates from server/lib instead of copying them into client/src/utils/providerTypes.js
…ement task

Add six audit task types so each category of software quality can be scheduled,
pinned to its own provider/model, and toggled between filing issues and fixing
on its own — instead of being reachable only by fanning eight sub-agents out of
a single /do:better run.

  better-complexity          counted cyclomatic complexity, ranked by churn
  better-cognitive-load      reader cost no metric captures
  better-structural-drift    the same fact kept in two places
  better-runtime-safety      latent defects not yet triggered
  better-dependency-freedom  whether a dependency should exist at all
  better-test-quality        existing tests that prove nothing

The better- prefix marks a parity obligation with the bundled slashdo lens the
mission mirrors, so an improvement here is a candidate to push upstream rather
than to drift. DO_BETTER_LENS_COVERAGE records which lane owns each lens, and
the catalog test reads the submodule and fails when a lens declared upstream has
no lane here. The prefix is hyphenated rather than "better:" because a task type
is interpolated into the CoS task id, which becomes a git branch name and a
worktree directory: git refs, Windows paths, and the TASKS.md id pattern all
reject a colon.

code-quality was doing too much, so its structural-drift half moves to the new
lane and its body now names what it cedes. Every audit mission states its
boundaries, so twenty-five lanes cannot file each other's findings.

Rewrite the eleven legacy audit prompts that predate the file-issues toggle.
None carried {modeInstructions}, so the mode banner was prepended while the body
still instructed the agent to fix and commit — the two fought on every
file-issues dispatch. Each now carries the placeholder and an evidence bar:
performance requires a quantity, security defers to the app's documented threat
model, test-coverage names the regression a new test uniquely catches. ux gets
the same treatment; its hardcoded "no branches, no PRs" contradicted the do-work
banner outright.

Also stop keyword-guessing a skill template for a registered audit type. The
security matcher claims the bare word "audit", which every audit prompt says
about itself in its opening line, so eleven of nineteen audit types were being
handed OWASP scoping guidance nobody chose.
… catalog

Cleanup pass over the audit-lane commit.

- workflow.js listed all 25 audit types by hand. It is exactly the catalog plus
  dependency-updates, so derive it. That deletes a fourth edit site per new
  audit type and the parity test whose only job was catching the copy going
  stale; the test now asserts the one thing that is still a decision, which is
  the single non-catalog type the stage adds.
- The expansion guard re-implemented resolveTrackerFilingBlock and got its
  preset precedence wrong: production resolves alwaysPreset || auditPreset, and
  ux is the one audit type in both registries, so the test rendered a tracker
  block no dispatch produces. Drive the real resolver instead, and drop the
  ux-only render loop the catalog-wide one already covers.
- Merge the two lane-registration tests, which asserted the same file-issues
  posture 20 lines apart, and derive the better-* list so a seventh lane cannot
  be added without landing in it.
- Cross-check that the catalog default and the seeded schedule row agree on
  every audit's mode. The seeded row always sets fileIssues, so the catalog
  default is unreachable for a scheduled dispatch and the two could disagree
  unnoticed.
- Drop the "primary owner first" claim from the lens map: nothing reads it, no
  test enforced it, and the test title asserted it anyway.
- Anchor the submodule read on PATHS.slashdo. A missing file there skips rather
  than fails outside CI, so a stale relative path would have silently disabled
  the upstream-lens guard.
Schedule every do:better audit lens as its own self-improvement task
…-mtsuvc4j/agent-095086fb

fix: contain scheduled handler loading and execution failures
atomantic and others added 29 commits September 8, 2026 20:50
refactor: unify media queue lane admission accounting
…t-module-hygiene-mttjug8g/agent-42b955c0

feat: give local model metadata a shared service owner
…idating all 186

The built UI was served with express.static defaults, so every content-hashed
chunk under /assets/ went out with `Cache-Control: public, max-age=0`. A browser
treats that as stale on arrival: measured against a spare-port server with a
request-counting proxy and Chrome with service workers blocked (the default
plain-HTTP tailnet posture, where no service worker can register), a warm
dashboard load re-sent all 186 chunks as conditional GETs and got 186 304s back
before the app could start. Over HTTP/1.1 at six connections per host that is
~31 sequential round-trip waves of pure revalidation on every reload.

Vite renames a chunk whenever its bytes change and the `no-cache` index.html is
what points at the current set, so `/assets/**` is safe to serve with
`immutable, max-age=1y`. `mountClientDist` in services/assetMounts.js does that
as a first tier and keeps the revalidate-per-load default for the rest of
dist/ — `sw.js`, `manifest.json`, `fonts/`, `sky/`, `hdri/` are client/public
files copied under stable names whose bytes do change. `index: false` stays on
both so `/` still reaches the build-id-stamped SPA fallback, and a chunk the
current build no longer ships still misses both tiers and 404s, which the
stale-chunk reload depends on.

Same measurement after the change: 0 asset requests on a warm load or reload,
and a warm navigation to a not-yet-visited route fetches only its own new
chunks (14 instead of 42).
fix: restore completed agent card mobile layout
…t-performance-mttjv4la/agent-90a874f2

Serve hashed client chunks as immutable so warm page loads stop revalidating all 186
refactor: name VideoGen hosted backend predicates (#6680)
refactor: centralize pinned video snapshot resolution
refactor: unify video asset readiness and repair warnings
perf: skip unused CoS status during live activity polls
perf: query generating 3D summaries for activity polls
fix: make Writers Room headers collapsible and stabilize Save
refactor: make self-update launch readiness explicit
…t-documentation-mttnjjg5/agent-89783d06

fix: clarify database selection during setup
@atomantic
atomantic merged commit 9d1453d into release Sep 9, 2026
12 of 14 checks passed
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.

2 participants