diff --git a/README.md b/README.md index 8e0a1cc6a..8e5894d6d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ [![Linux](https://img.shields.io/badge/Linux-x86__64-orange.svg)](https://ouroboros-agent.ai/install/#linux) [![Windows](https://img.shields.io/badge/Windows-x64-blue.svg)][download-windows-x64] [![OuroborosHub](https://img.shields.io/badge/OuroborosHub-skills%20marketplace-8A2BE2.svg)](https://github.com/razzant/OuroborosHub) -[![Version 7.0.0-rc.16](https://img.shields.io/badge/version-7.0.0--rc.16-green.svg)](VERSION) +[![Version 7.0.0-rc.17](https://img.shields.io/badge/version-7.0.0--rc.17-green.svg)](VERSION) Ouroboros is an open-source, general-purpose AI agent whose identity, durable memory, and history continue across tasks and restarts. It works on external projects, coordinates a live swarm of specialist agents, and can rewrite the implementation it runs on, including its code, architecture, prompts, tools, and dependencies. Reflection can also change how it understands itself without severing that continuity. @@ -64,13 +64,13 @@ The desktop packages already contain an optional CLI installer. On macOS, after -[download-macos-arm64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.16/Ouroboros-7.0.0-rc.16.dmg -[download-windows-x64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.16/Ouroboros-7.0.0-rc.16-windows-x64.zip -[download-linux-deb-amd64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.16/ouroboros_7.0.0-rc.16_amd64.deb -[download-linux-rpm-x86_64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.16/ouroboros-7.0.0-rc.16-1.x86_64.rpm -[download-linux-rpm-red80-x86_64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.16/ouroboros-7.0.0-rc.16-1.red80.x86_64.rpm -[download-linux-appimage-x86_64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.16/Ouroboros-7.0.0-rc.16-linux-x86_64.AppImage -[download-linux-x86_64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.16/Ouroboros-7.0.0-rc.16-linux-x86_64.tar.gz +[download-macos-arm64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.17/Ouroboros-7.0.0-rc.17.dmg +[download-windows-x64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.17/Ouroboros-7.0.0-rc.17-windows-x64.zip +[download-linux-deb-amd64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.17/ouroboros_7.0.0-rc.17_amd64.deb +[download-linux-rpm-x86_64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.17/ouroboros-7.0.0-rc.17-1.x86_64.rpm +[download-linux-rpm-red80-x86_64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.17/ouroboros-7.0.0-rc.17-1.red80.x86_64.rpm +[download-linux-appimage-x86_64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.17/Ouroboros-7.0.0-rc.17-linux-x86_64.AppImage +[download-linux-x86_64]: https://github.com/razzant/ouroboros/releases/download/v7.0.0-rc.17/Ouroboros-7.0.0-rc.17-linux-x86_64.tar.gz Ouroboros bundles [Claudexor](https://github.com/razzant/claudexor) as its local execution layer for delegated coding and hosted-agent review. Ouroboros owns the task, memory, review, and final integration, while Claudexor runs the selected connected coding harness and returns durable execution evidence. [Explore Claudexor](https://claudexor.ai/). @@ -449,8 +449,8 @@ and the reason. | Version | Date | Description | |---------|------|-------------| +| 7.0.0-rc.17 | 2026-09-08 | **Fix-forward candidate: make the cancellation E2E stub recognize multipart finalization markers consistently across provider wire shapes.** | | 7.0.0-rc.16 | 2026-09-08 | **Release candidate of 7.0.0 — reviewed model-wait and subscription routing, account-role controls, MCP decision-lane capability, safer owned-daemon restart custody, scratchpad/evidence disclosure, and cross-platform lock fixes. Claudexor is pinned to 3.10.0.** | -| 7.0.0-rc.15 | 2026-09-05 | **Release candidate of 7.0.0 — the round after the first paid run of the live stand on rc.14.** One runtime fix: the boot backfill of the cycle_outcome ledger and the reconcile's own tag now share the state lock, so a second booting worker can no longer duplicate the ledger row of an absorbed cycle (a race present since the outcome-ledger crash-window fix earlier in the 7.0.0 candidates). The live E2E stand is made faithful to the product's own policy: its self-modification scenario asks for a design-system-consistent accent change landed as a reviewed release with the version carriers bumped in the same diff (the triad enforces P9), budget admission waits on reservations in flight instead of halting the run, each lane reserves twice the per-task cap so the in-task cost ceiling binds like a real install, the UI probe opens its browser at use time and reports a closed target as a typed reason, the orphan scan names survivors, and the parity pin tolerates a tree that already carries the accent. Windows: the release-at-once pins time the hold, not the ledger append. | | 6.114.0 | 2026-09-01 | **feat: capability preservation as a first-class invariant, shape-first OpenRouter failover, and a green 3-OS matrix.** Capability preservation joins the immune system as a first-class invariant (#447, stages 1-3: golden capability suite, seam pins that actually differentiate, executable item-21 triggers, binaries judged by magic bytes). Same-model OpenRouter provider failover is now derived from the shape of the replayed reasoning artifact instead of a hard-coded model-family roster (#468): readable text/summary artifacts stay failover-eligible for every family, a bare `response_id` no longer pins, sealed artifacts (encrypted/signed/redacted, not vouched by the anthropic/gemini roster — `openai/` excluded on 2026-07 field evidence) keep the continuity pin on both the dispatch and reroute paths, and the pin reason plus the refusing upstream provider reach durable telemetry. Delegation and chat truth converge: delegated-run questions ride the escalation hierarchy (#204), the routing picker dispatches real routes (#198), typed owner quiz cards and the escalation channel (Q-2a/Q-2b), live-first owner deliveries, honest chat-activity conclusions with budget-pause resume, review findings in the task-card Reviews checkpoint, persistent stable-target registrations, a hold on the live delegated leaf when a nanny round dies unknown, and healed cross-generation custody disclosures. Rich chat stack (markdown, media, galleries, links — Andrei Kaznacheev), Chat viewport stability, Dashboard/Updates one-verdict action surface, Settings effect honesty, skill Repair affordance after preflight failure, node/npm launches through an execution-probed runtime ladder, the `ultra` reasoning-effort tier (@ndrew1337), and an O(delta) in-lock ledger read with a guarded torn-tail append boundary (@deebosh). Claudexor runtime pinned to 3.9.5 with delayed-startup reconciliation, a foreground quota-refresh bridge, and preserved delegated text fragments; Updates restart state survives same-SHA reconnects. CI: the serial service-log suites no longer race the child, web source pins are CRLF-safe on Windows, and the size-ratchet manifest is exact. This tag also carries the untagged 6.113.5 (generation-safe browser cleanup after timed-out tools, #440 audit fix-forward). | | 6.113.5 | 2026-08-31 | **fix: browser cleanup after a timed-out tool is generation-safe (integrates community PR #429 by @mikemikimike, closes #409).** A stateful-tool timeout now retires the whole browser generation: the shared state slot is replaced with a fresh object, the abandoned worker keeps writing only into its retired one, and the close is queued on the retiring executor so it always runs on the owning worker thread — including the already-settled race — with the cognitive lease closing after that cleanup. A late infrastructure-error retry that observes a replaced generation closes only its own retired session, so it can no longer cross-thread-kill the next command's browser. Closes the follow-up findings of the #440 post-merge audit; the never-settling-worker session leak stays a disclosed residual of in-process Playwright. | | 6.113.4 | 2026-08-30 | **fix: release verification follows the family-mounted sign-in card.** The browser acceptance tests now re-resolve the active per-family login host after every account-list rebuild, matching the placement introduced by the roster UI while preserving the full cancellation, reconciliation, stale-poll, and terminal-race assertions. No lifecycle check is weakened and the managed Claudexor runtime remains pinned to 3.9.2. | diff --git a/VERSION b/VERSION index bd1f897a2..b315076e4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.0.0-rc.16 +7.0.0-rc.17 diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index d72860bda..2dd00adc4 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,4 +1,4 @@ -# Ouroboros v7.0.0-rc.16 — Architecture & Reference +# Ouroboros v7.0.0-rc.17 — Architecture & Reference This file is NOT a changelog. Version history lives in README.md, git tags, and commit log. diff --git a/docs/install/index.html b/docs/install/index.html index e04903a98..93e72efc9 100644 --- a/docs/install/index.html +++ b/docs/install/index.html @@ -46,24 +46,24 @@

macOS 12+ · Apple silicon only

macOS

- Download for macOS (.dmg) + Download for macOS (.dmg)

Open the DMG, drag Ouroboros.app to Applications, then launch it from Applications.

Windows x64

Windows

- Download for Windows (.zip) + Download for Windows (.zip)

Extract the ZIP, open the Ouroboros folder, and run Ouroboros.exe.

Linux x86_64

Linux

- Debian / Ubuntu / Astra (.deb) - Fedora / RHEL (.rpm) - RED OS 8 (.rpm) - Portable AppImage - tar.gz archive + Debian / Ubuntu / Astra (.deb) + Fedora / RHEL (.rpm) + RED OS 8 (.rpm) + Portable AppImage + tar.gz archive

Prefer the package for your distribution. Use the AppImage or archive on other distributions; Git must already be installed.

@@ -74,7 +74,7 @@

macOS quick start

    -
  1. Click Download for macOS (.dmg).
  2. +
  3. Click Download for macOS (.dmg).
  4. Open the DMG and drag Ouroboros.app onto the Applications shortcut.
  5. Open Ouroboros from Applications. If Gatekeeper asks, right-click the app and choose Open.
diff --git a/pyproject.toml b/pyproject.toml index 6e61ea073..687ec31d3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "ouroboros" -version = "7.0.0rc16" +version = "7.0.0rc17" description = "Self-creating AI agent with constitution, background consciousness, and persistent identity" readme = "README.md" license = {text = "MIT"} diff --git a/site/install/index.html b/site/install/index.html index 142477b9c..d59a7d4c3 100644 --- a/site/install/index.html +++ b/site/install/index.html @@ -46,24 +46,24 @@

macOS 12+ · Apple silicon only

macOS

- Download for macOS (.dmg) + Download for macOS (.dmg)

Open the DMG, drag Ouroboros.app to Applications, then launch it from Applications.

Windows x64

Windows

- Download for Windows (.zip) + Download for Windows (.zip)

Extract the ZIP, open the Ouroboros folder, and run Ouroboros.exe.

Linux x86_64

Linux

Prefer the package for your distribution. Use the AppImage or archive on other distributions; Git must already be installed.

@@ -74,7 +74,7 @@

macOS quick start

    -
  1. Click Download for macOS (.dmg).
  2. +
  3. Click Download for macOS (.dmg).
  4. Open the DMG and drag Ouroboros.app onto the Applications shortcut.
  5. Open Ouroboros from Applications. If Gatekeeper asks, right-click the app and choose Open.
diff --git a/tests/fixtures_e2e_cancellation.py b/tests/fixtures_e2e_cancellation.py index 997537ed7..203463d24 100644 --- a/tests/fixtures_e2e_cancellation.py +++ b/tests/fixtures_e2e_cancellation.py @@ -149,6 +149,14 @@ class StubModelServer: content = message.get("content") if isinstance(message, dict) else None if isinstance(content, str) and ("[OWNER_STOP]" in content or "[FINALIZE_NOW]" in content): return True + if isinstance(content, list): + text = " ".join( + str(part.get("text") or "") + for part in content + if isinstance(part, dict) + ) + if "[OWNER_STOP]" in text or "[FINALIZE_NOW]" in text: + return True return False def _completion(self, body: dict, seq: int) -> dict: diff --git a/tests/test_e2e_cancellation_scenarios.py b/tests/test_e2e_cancellation_scenarios.py index fa713407d..c4971db2d 100644 --- a/tests/test_e2e_cancellation_scenarios.py +++ b/tests/test_e2e_cancellation_scenarios.py @@ -100,6 +100,11 @@ from tests.fixtures_e2e_cancellation import ( # Fixtures # --------------------------------------------------------------------------- +def test_stub_finalization_marker_accepts_multipart_content(): + assert StubModelServer._is_finalization_turn({ + "messages": [{"content": [{"type": "text", "text": "[OWNER_STOP]"}]}], + }) + @pytest.fixture(scope="session") def e2e_clone(tmp_path_factory): """One throwaway clone of the checkout under test, shared by every scenario server.""" diff --git a/uv.lock b/uv.lock index 60a904461..4a9b5be6b 100644 --- a/uv.lock +++ b/uv.lock @@ -1535,7 +1535,7 @@ wheels = [ [[package]] name = "ouroboros" -version = "7.0.0rc16" +version = "7.0.0rc17" source = { editable = "." } dependencies = [ { name = "croniter" }, diff --git a/web/modules/api_types.js b/web/modules/api_types.js index 75e4cfba1..a714e471e 100644 --- a/web/modules/api_types.js +++ b/web/modules/api_types.js @@ -1345,4 +1345,4 @@ export const MAX_QUIZ_OPTIONS = 6; // REFUSES a longer comment (it is delivered verbatim, never truncated), so // the card must not offer to send one. export const MAX_DECISION_COMMENT = 2000; -export const GATEWAY_CONTRACT_VERSION = '7.0.0-rc.16'; +export const GATEWAY_CONTRACT_VERSION = '7.0.0-rc.17'; diff --git a/web/package-lock.json b/web/package-lock.json index 0a71cbf98..0ab9b41ef 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "ouroboros-web", - "version": "7.0.0-rc.16", + "version": "7.0.0-rc.17", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ouroboros-web", - "version": "7.0.0-rc.16", + "version": "7.0.0-rc.17", "devDependencies": { "eslint": "10.10.0", "globals": "17.12.0" diff --git a/web/package.json b/web/package.json index ba7ffa252..9c88a342f 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "ouroboros-web", - "version": "7.0.0-rc.16", + "version": "7.0.0-rc.17", "private": true, "type": "module", "description": "Ouroboros browser UI package boundary",