The project and sidebar specs follow main's project main agents with the
English source labels; the project conversation label is translated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
* chore: remove legacy orchestrator, trading and one-off script leftovers
The repository still carried the pre-evOo prototype: a Python orchestrator,
the old HTML "evoo-platform" cockpit (whose test ran in the root unit
suite), an apex-trading package, the hot-reload deploy.sh for it, a
permissions manifest, an architecture note with local file links, agent
handoff notes, a Steve Jobs persona template and about ninety one-off
scripts that probe a developer database with hard-coded local URLs. None
of it is used by the product, CI or the real deploy in ops/evo-deploy.
Delete those files, drop the evoo-platform test glob from the root vitest
config, the Cockpit section from .env.example and the dead biome and
gitignore entries, and update the docs that listed the removed tools.
scripts/start-tmux.sh no longer starts the removed sentinel and resolves
the checkout from its own location instead of a machine-specific path;
scripts/seed-ollama.ts requires DATABASE_URL instead of falling back to a
local URL with a username.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
* fix(web): drop trading and persona prompts from the conversation shell
The web shell still showed leftovers from the trading prototype: composer
chips with German trading and "Steve Jobs" prompts, trading suggestion
chips under the empty conversation line, a German trading hero for the
empty transcript, and a German "data protection" status panel in the
sidebar. They suggested actions the product does not have and added
persistent chrome.
Remove the composer chips and their helper, the empty-state chips and the
hero (the empty conversation keeps its existing one-line start hint), the
sidebar trading indicator and the data trust panel. The new-bot E2E now
asserts the plain empty state; the sidebar spec no longer expects the
trading status, and the placeholder Steve Jobs spec with no assertions is
gone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* refactor: remove the trading bot status integration
With the sidebar trading indicator gone, the only remaining consumer of
the trading bot status was a banner in General settings that reused the
same component. evOo is a personal assistant; a status proxy and poller
for one external trading service, configured through service-specific
TRADING_BOT_URL and VITE_TRADING_BOT_URL variables, does not belong in
the core product.
Remove the settings banner and its prop plumbing, the web poller, the
indicator component, the /api/trading-bot/status proxy, the shared core
contract, the env loading and both variables from .env.example, together
with their tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
* chore: remove one-off database scripts and a stale review note
packages/db carried four hand-run scripts outside the package build that
query or seed a developer database with a hard-coded connection string,
one of them for a specific account. docs/VOICE-FIRST-REVIEW.md was a
one-time verification note for a workflow that no longer exists and
named private machines and local paths. Nothing references them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
* chore: replace machine-specific paths and addresses with placeholders
ORIGIN.md pinned the intended checkout to an absolute path under a
personal home directory, docs/LOCAL-SETUP.md listed folders on one
developer's machine, and two tests used what looks like a real tailnet
address. Use a home-relative path, drop the machine-specific folder list,
and use 100.100.100.100 in the tests; it is still inside 100.64.0.0/10,
so both tests check the same thing as before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
* test(web): drop the trading status from the shell contrast test
main's contrast test now waits for the sidebar trading status before
measuring; this branch removes that status.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
Several web surfaces hard-coded German (the project card, roster and
activity status labels, the sidebar "Heute" label) or used German text as
the Lingui source message (sidebar sections, project timeline, bot picker,
voice entry, group stage, copy and read-aloud buttons). English users saw
German, and because production builds keep only message ids, none of these
strings could be translated per locale.
Convert them to English source messages, keeping the meaning:
- ProjectCreatedCard: Lingui Trans/Plural instead of literals.
- agent-activity: labels go through i18n._ with literal ids so the module
stays importable from plain unit tests; the extractor still collects them.
- Shell, ProjectSessionTimeline, bot-picker, StageVoiceEntry, OoStage:
English sources, reusing existing messages where one already fit
("just now", "{n}m ago", "Search", "No bots match", "Set up voice",
"Group conversation", "Transcript").
- The conversation picker matches its create entry against the translated
label instead of a fixed German string.
The German wording returns through the de catalog in the next commit.
Unit and E2E tests now assert the English labels.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
* Sidebar: rename 1:1 section heading and add list spacing
Rename the sidebar conversations section from 'Unterhaltungen' to
'Sprich mit deinen Oo's', remove the '1:1 mit deinen Oos' subtitle,
and add modest vertical spacing above and below the conversation list.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* chore(mobile): bump Expo SDK 57 patch deps for typecheck gate
Expo published SDK 57 patch releases after main last passed CI; expo install
--check now fails on the pinned versions. Align mobile deps with the current
SDK expectations so the required Typecheck job stays green.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* chore(mobile): sync lockfile specifiers after Expo pin normalization
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(ci): restore browser preview module and onboarding e2e
The web bundle imported a browser-preview store that was never added, so production builds and every Playwright signup failed before the shell rendered. Mobile check failed because Expo packages were a patch behind the SDK.
Restore the store, type the optional desktop bridge, and walk whichever onboarding step scripted CI actually opens.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(ci): stop the blank web client and the send 500
The core barrel pulled git checkout into the browser, so node:child_process crashed the page before sign-up. Serve that module from a node export instead.
Add the missing run tool-call budget columns that threads/send writes. Guard an indexed shell flag for typecheck, and expect the files key the desktop preload already exposes.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(ci): isolate pnpm setup and the takeover membership
The Team Computer takeover journey inserted a space member the
default-space trigger had already created, so shared Postgres rejected
the unique pair. Self-hosted jobs now keep a per-job pnpm home and
store, and artifact uploads no longer fail a job that already passed.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(ci): clear typecheck, lint, and unit failures
Inbound channel rosters can mark a participant list as authoritative.
Answered channel asks stay off the group, and clearing a thread waits
until delegated returns land. Lint, unit, and web e2e contracts follow
the current shell, composer, and settings.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): align e2e with the shipped shell and onboarding
Web E2E still expected older focus buttons, nested project rows, and
settings that never opened MCP. Persist the signed-in space, list
non-default spaces under Projekte, and keep the quote control on screen.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): open group reply from a revealed hover rail
The first user row covered its Reply control until the rail accepted
pointer events. The group transcript now reveals that rail, then replies.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): stop the shell render loop and settle computer and mention UI
A working bot rewrote preview state on every render, the computer menu never stayed still, and the mention picker did not expose its expanded state or option name.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(ci): stop idle probes hanging and accept a follow-up send
Background probes walked every process fd and timed out on the shared runner. Linux now tracks the marker with flock and /proc/locks. A new composer draft can send while an earlier send is still refreshing, and group members stay mentionable.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(adapters): detect background work when flock ids are padded
The idle probe compared /proc/locks with an unpadded device key, so majors
or minors under 16 never matched. It deleted the live marker and reported
idle while the command still held the lock. Probe by taking the lock, and
print the cancel key the way the kernel does.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(adapters): stabilize background-work probe tests on self-hosted CI
Clear stale marker files before each probe scenario and allow longer
polling so launch can acquire flock on busy persistent runners.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): do not block onboarding on spaces list
Render the first onboarding step from me and integration setup alone.
Resolve the optional skip-to-app redirect after that so Playwright
signups are not stuck on the loading shell when spaces.list is slow.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(ci): restore green gates after second main rebase
Re-apply biome formatting on Shell/SortableGroup and strict TypeScript
assertions in computer-idle tests dropped when skipping the duplicate
conflict-resolution commit.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): wait for onboarding bootstrap before E2E proceeds
Expose data-onboarding-step on the onboarding shell and have Playwright
wait until loading finishes. Ignore ad-hoc screenshot scripts on
self-hosted runners so they do not fail lint.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): fall back when onboarding bootstrap stalls
Race me/integration setup against a timeout and promote loading to the
emoji step after 20s so Playwright is not blocked on a hung RPC.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): render onboarding immediately for E2E signups
Start on the emoji step instead of a loading shell that waits on RPC.
Bootstrap can still redirect once me and integration setup resolve.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(ci): stabilize web e2e on self-hosted runners
Per-job pnpm stores broke node_modules symlinks when setup-node restored
cached installs, so Vite could not resolve react during dependency
optimization. Keep a runner-scoped store, clear stale Vite caches, and pin
Playwright to one worker in CI to reduce onboarding RPC contention.
Add Vite resolve aliases for react/react-dom, wait for an interactive
onboarding step in E2E helpers, and include the React hook smoke spec from
main.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): resolve React aliases through pnpm package layout
Root node_modules/react does not exist under pnpm, so Vite aliases pointed
at missing paths and broke production builds and the Playwright webServer.
Resolve react and react-dom from the web package and map jsx-runtime to the
actual entry files.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(core): type the lazy child_process spawn cache
Main's lazy require left spawn typed as null after assignment, which broke
Typecheck on the rebased branch.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(db): mock git-checkout export path in unit tests
Vitest resolves vi.mock against package exports; the .js suffix is not
declared for @rakazo/core/git-checkout.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): stabilize E2E after main sidebar and onboarding changes
Use first() for duplicate transcript lines, wait for interactive onboarding
before model-required assertions, and allow project sidebar to settle after
create. Extend the Playwright job timeout so the single-worker suite can finish.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): restore Projekte sidebar and integrations MCP entry
Use the default space for Unterhaltungen/Projekte separation instead of the
active space header, persist the bootstrapped space in localStorage, wire
SettingsOverlay to MCP management, and compare hover tones on inactive rows.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): satisfy biome format on homeSpaceId line
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): align sidebar E2E with nested Projekte shell layout
Scope Unterhaltungen assertions to conversation rows only, target project-space
Chief actions under .sidebar-projekte, and stabilize hover-tone polling.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix: satisfy lint after main merge (format and unused var)
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): show project-space 1:1 bots in Projekte sidebar
Include lone bots in projectSidebarGroups, render bot rows in Projekte,
and stabilize E2E for nested sidebar layout and duplicate group entries.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): disambiguate duplicate group sidebar buttons in E2E
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): align spaces and group-chats E2E with Projekte sidebar IA
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): dedupe Projekte sidebar rows and stabilize E2E specs
- Deduplicate project space and group-chat entries in projectSidebarGroups
- Scope group-chats/spaces E2E clicks to first Projekte match after IA split
- Wait for shell ready before mention-picker keyboard test; restore main locators
- Fix PrivacySettingsOverlay lint and align biome schema with CLI 2.5.13
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): restrict project drag handle and stabilize space E2E
- Move SortableGroup drag listeners to ProjectDragGrip only so sidebar clicks work
- Scope space delete actions to project-space rows; wait for menu in E2E
- Switch group settings E2E via direct navigation after unsaved draft check
- Merge main (DataTrustPanel) and fix Shell import order for CI lint
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): stabilize message hover Escape assertion in E2E
Assert the More menu closes and the hover rail stays visible instead of
requiring focus restoration, which is flaky across Chromium builds.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* chore: format apps/api/src/app.ts after main merge
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
* fix(web): stabilize team-computer E2E send after bot switch
Wait for shell ready and use the Send button instead of Enter after
switching bots and closing the computer overlay. The prior run timed
out on threads/send with only an apps/api format commit in between.
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
The Live Trading control stored its mode in localStorage, so the shell could
claim live money while the bot was in dry-run. Show the Tradingbot status
when TRADING_BOT_URL is set, and an unknown state when it is not.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>