You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Prerelease RC artifacts are published on their tag page, for example [`v6.3.0-rc.1`](https://github.com/joi-lab/ouroboros-desktop/releases/tag/v6.3.0-rc.1); `/releases/latest` intentionally stays on the latest stable release.
34
+
Prerelease RC artifacts are published on their tag page, for example [`v6.3.0-rc.2`](https://github.com/joi-lab/ouroboros-desktop/releases/tag/v6.3.0-rc.2); `/releases/latest` intentionally stays on the latest stable release.
35
35
36
36
<palign="center">
37
37
<imgsrc="assets/setup.png"width="500"alt="Drag Ouroboros.app to install">
@@ -475,13 +475,13 @@ not paraphrase it.
475
475
476
476
| Version | Date | Description |
477
477
|---------|------|-------------|
478
+
| 6.3.0-rc.2 | 2026-05-27 |**rc(runtime): harden review unification, tool surface, and replay retention.** Restores `claude_code_edit` as a first-class coding tool, makes task-result Auto review LLM-first instead of host-enforced, routes plan/scope/multi-model calls through the shared review substrate, fixes forensic redaction over-match, adds observability retention audit plus service-log archival/pruning, and documents Tool API v2 as a breaking public rename without legacy aliases. |
478
479
| 6.3.0-rc.1 | 2026-05-27 |**rc(runtime): add forensic observability, typed outcomes, Tool API v2, task acceptance review, and code inventory.** Captures private full replay payloads with redacted projections, records semantic task outcomes/artifact/verification ledgers, exposes neutral canonical tools plus task-scoped services, shares reviewer slots across review surfaces, and improves benchmark harness failure reporting without changing BIBLE.md. |
479
480
| 6.2.0-rc.1 | 2026-05-25 |**rc(ui/runtime): port multi-attachment chat and budget/model fixes.** Adds bounded multi-file chat staging with partial-upload cleanup, shares budget controls between Settings and Costs with validation, preserves Anthropic Opus 4.7 routing, updates current model pricing fallbacks, and avoids no-op settings reconfiguration side effects. |
480
481
| 6.1.0-rc.1 | 2026-05-25 |**rc(runtime): harden live subagent handoff, isolation, and UI lineage.** Adds effective task-status SSOT, real bounded wait tools including `wait_tasks`, forged subagent ingress rejection, strict local-readonly constraints, DNS fail-closed browser isolation, child-drive mailbox routing/retention, web_search source attribution, lineage-aware cost observability, threaded child cards, and focused regressions. |
481
482
| 6.0.0 | 2026-05-25 |**major(runtime): add live local-readonly subagents.** Upgrades `schedule_subagent` to a strict child-task contract, runs leaf subagents through the existing queue and workers with forked memory by default, enforces schema and execute-time local-readonly isolation, preserves full task-result handoff, and documents the delegation review rules. |
482
483
| 5.33.0-rc.6 | 2026-05-24 |**rc(gateway): prevent masking upload connection/parse faults as size-limit errors.** Introduces a typed ChatUploadPayloadTooLarge exception class to isolate file-size 413 blocks from connection cuts and form-parse faults, returning a standard 400 with original message for ASGI/socket errors. Includes focused test coverage. |
483
-
| 5.33.0-rc.5 | 2026-05-24 |**rc(gateway): prevent masking upload connection/parse faults as size-limit errors.** Refactors the chat upload ASGI stream wrapper to verify if caught exceptions are indeed the 'oversized' signal before returning a 413, returning a 400 with the original error message for connection cuts and malformed formats. |
484
-
Older releases are preserved in Git tags and GitHub releases. The 5.2.0 through 5.33.0-rc.4 rows and former `4.0.0` rows are rolled off to respect the P9 changelog cap; their full bodies remain at their git tags.
484
+
Older releases are preserved in Git tags and GitHub releases. The 5.2.0 through 5.33.0-rc.5 rows and former `4.0.0` rows are rolled off to respect the P9 changelog cap; their full bodies remain at their git tags.
│ ├── review.py ← Task acceptance review tool plus multi-review adapters backed by the shared review substrate
142
142
│ ├── review_context_atlas.py ← Deterministic bounded-context compiler for scope_review, plan_task, and deep_self_review; raw-inlines selected files and accounts for every tracked path in the manifest
│ ├── skill_publish.py ← Agent-callable `submit_skill_to_hub` tool: validates a fresh clean-reviewed local skill (sources `external`/`self_authored`/`user_repo`/`ouroboroshub`/`clawhub`; `native` only when no `.seed-origin` marker), infers OuroborosHub from `OUROBOROS_HUB_CATALOG_URL`, commits payload + catalog update to the user's fork via GitHub GraphQL, and opens a PR without mutating the local Ouroboros repo. For marketplace-managed sources the generated PR body is force-prefixed with a `## Provenance` block read from the local sidecar (`.ouroboroshub.json` slug / `.clawhub.json` clawhub_slug); when no sidecar exists the source is reclassified as `external` by skill_loader and submit proceeds without the block.
`run_command`, `run_script`, service tools, `commit_reviewed`, `vcs_*`,
764
-
`schedule_subagent`, `wait_task`, and `wait_tasks`. Private legacy aliases
765
-
exist only in `tools/legacy_aliases.py` for migration; prompts and skills
766
-
should not rely on them.
762
+
`run_command`, `run_script`, `claude_code_edit`, service tools,
763
+
`commit_reviewed`, `vcs_*`, `schedule_subagent`, `wait_task`, and
764
+
`wait_tasks`. Legacy public tool names are a breaking rename in v6.3: they
765
+
are not exposed and are not translated at execute time.
767
766
768
767
### Safety and runtime mode
769
768
@@ -891,7 +890,9 @@ Runtime floors:
891
890
| OUROBOROS_WEBSEARCH_MODEL | gpt-5.2 | Official OpenAI Responses model for `web_search` when `OPENAI_BASE_URL` is empty |
892
891
| OUROBOROS_REVIEW_MODELS | openai/gpt-5.5,google/gemini-3.5-flash,anthropic/claude-opus-4.6 | Comma-separated reviewer slots for triad/plan/task/skill review; duplicate model IDs are independent slots |
893
892
| OUROBOROS_SCOPE_REVIEW_MODELS | openai/gpt-5.5 | Comma-separated scope reviewer slots; falls back from legacy `OUROBOROS_SCOPE_REVIEW_MODEL`|
894
-
| OUROBOROS_TASK_REVIEW_MODE | auto | Task result review mode: `off`, `auto`, or `required`; verdicts are advisory, full output is injected untruncated |
893
+
| OUROBOROS_TASK_REVIEW_MODE | auto | Task result review mode: `off`, `auto`, or `required`; `auto` is agent-choice via the visible review tool, `required` is host-injected before finalization, verdicts are advisory, full output is injected untruncated |
894
+
| OUROBOROS_OBSERVABILITY_RETENTION_DAYS | unset | Deprecated audit knob for private observability manifests/blobs; forensic replay blobs are kept compressed indefinitely |
895
+
| OUROBOROS_SERVICE_LOG_RETENTION_DAYS | 14 | Startup prune for leftover task-scoped live service log directories; pruned small logs are copied into private blobs first and oversized logs are retained |
895
896
| OUROBOROS_REVIEW_MODEL_TIMEOUT_SEC | 600 | Env-only override read directly by `ouroboros.tools.review`. Per-reviewer model call timeout for multi-model review; timed-out reviewers become ERROR actors and quorum still requires at least two parseable reviewers. |
896
897
| OUROBOROS_REVIEW_ENFORCEMENT | advisory | Review enforcement: `blocking` blocks commit critical findings, fresh-advisory open obligations/debts, and skill `blockers`; `advisory` downgrades those to warnings by operator choice. Fresh advisory with open obligations/debts writes `advisory_obligations_acknowledged`; stale advisory still blocks. Skill `warnings` do not block execution in either mode. |
897
898
| OUROBOROS_AUTO_GRANT_REVIEWED_SKILLS | false | Owner-confirmed setting. When enabled, a fresh executable skill review grants only the manifest-declared settings keys and host permissions for that exact content hash so closed-loop skill development can run without repeated manual grants. Under `blocking`, blocker reviews are not executable and do not auto-grant; under `advisory`, blocker findings may auto-grant only because the current enforcement mode makes the review executable. Plain `/api/settings` POST drops this key; desktop uses the launcher confirmation bridge and web uses `/api/owner/auto-grant`. |
@@ -1004,8 +1005,8 @@ The panic sequence (in `server.py:_execute_panic_stop()`):
1004
1005
3. Write ~/Ouroboros/data/state/panic_stop.flag
1005
1006
4. LocalModelManager.stop_server() ← kill local model server if running
1006
1007
5. kill_all_tracked_subprocesses() ← os.killpg(SIGKILL) every tracked
1007
-
│ subprocess process group (SDK agent,
1008
-
│ shell commands, and ALL their children)
1008
+
│ foreground subprocess process group
1009
+
│ (shell commands and ALL their children)
1009
1010
6. kill_workers(force=True) ← SIGTERM+SIGKILL all multiprocessing workers
1010
1011
7. os._exit(99) ← immediate hard exit, kills daemon threads
1011
1012
```
@@ -1029,19 +1030,32 @@ On next manual launch:
1029
1030
1030
1031
### 9.3 Subprocess Process Group Management
1031
1032
1032
-
All subprocesses spawned by agent tools (`run_command`, `run_script`, service tools, and internal SDK gateways)
1033
-
use `start_new_session=True` (via `_tracked_subprocess_run()` in
1034
-
`ouroboros/tools/shell.py`). This creates a separate process group for each
1035
-
subprocess and all its children.
1033
+
Subprocesses spawned by foreground agent tools (`run_command` and `run_script`)
1034
+
use `start_new_session=True` via `_tracked_subprocess_run()` in
1035
+
`ouroboros/tools/shell.py`. Task-scoped service tools use
1036
+
`ouroboros/tools/services.py::_start_service`, which starts each service with
1037
+
`subprocess_new_group_kwargs()` and records it in the `_SERVICES` registry.
1038
+
Both paths create a separate process group for each subprocess and its children.
1036
1039
1037
1040
On panic or timeout, the entire process tree is killed via
1038
1041
`os.killpg(pgid, SIGKILL)` — no orphans possible, even for deeply nested
1039
-
subprocess trees (e.g., SDK agent processes spawned during internal review/advisory gateways).
1042
+
foreground shell/script/service subprocess trees.
1043
+
Panic/emergency paths call `kill_all_tracked_subprocesses()` and
1044
+
`kill_all_services()` without log finalization so emergency stop remains fast;
1045
+
normal lifespan shutdown may pass a drive root to `kill_all_services(drive_root)`
1046
+
to archive server-process service logs before removing live log files. Services
1047
+
started inside worker tasks normally finalize in `loop.py` task cleanup; forced
1048
+
worker termination kills the worker process tree and archives remaining task
1049
+
service logs best-effort from `data/services/<task_id>/`.
1040
1050
1041
1051
Active subprocesses are tracked in a thread-safe global set and cleaned up
1042
1052
automatically on completion or via `kill_all_tracked_subprocesses()` on panic.
1043
1053
`run_command` surfaces timeout-vs-signal distinctions in its result text so
1044
1054
`exit_code=-9` no longer looks like a silent success in summaries/reflections.
1055
+
Claude Agent SDK gateways (`gateways/claude_code.py`) use the SDK client
1056
+
lifecycle and SDK-level path/tool guards; they are not represented in
1057
+
`_tracked_subprocess_run()` unless a future SDK transport exposes a first-class
0 commit comments