chore(release): prepare 0.13.0 — bump version, update changelog, cut docs snapshot - #197
Closed
xfgong wants to merge 7 commits into
Closed
chore(release): prepare 0.13.0 — bump version, update changelog, cut docs snapshot#197xfgong wants to merge 7 commits into
xfgong wants to merge 7 commits into
Conversation
…ruption One escaping exception in a parallel tool batch (HitlControlException from a tool body, CancelledError, or a BaseException from after_tool_call) used to abort the bare-await collection loop: every ToolResultMessage in the batch was dropped — including succeeded siblings — leaving dangling tool_calls in the checkpoint (providers 400 on every later turn) and leaking still-running sibling tasks whose side effects then get duplicated on resume. - _execute_parallel now settles every task via gather(return_exceptions= True), synthesizes per-call error results (with paired End events) for ordinary failures, and for HITL/outer-cancel emits all settled sibling results BEFORE re-raising, so the suspend/backfill contracts keep working on an intact transcript. - _execute_prepared/_finalize catch BaseException (re-raising HITL/Cancel/ KeyboardInterrupt/SystemExit) so hook and tool failures degrade to error results at the source. - Checkpointer load paths (sqlite/postgres/mysql) wrap per-row deserialization in CheckpointCorruptionError carrying thread_id/backend/ row_ref; unknown roles are now corruption in all three backends (sqlite previously passed raw dicts through silently). Spec: dev/specs/2026-07-05-tool-batch-fault-isolation.md
…pend persistence, propagate emitter failures - HitlControlException gains partial_tool_results; both executors attach the already-persisted sibling ToolResultMessages, and the stateless loop HITL handlers append them to the returned message lists, so callers persisting run_agent_loop*'s return value keep completed siblings' results across a suspend. - Sibling persistence before a suspend is no longer best-effort: an emit/checkpoint failure propagates (run fails rather than durably suspending with completed work missing). The cancel salvage path stays best-effort — CancelledError must reach the Agent backfill. - Non-control exceptions reaching batch classification are framework failures (emit_fn raising in a worker), not tool failures: re-raised after all tasks settle instead of being masked as synthetic tool_results.
…docs snapshot - Bump pyproject.toml to version 0.13.0 - Update CHANGELOG.md with comprehensive 0.13.0 changes: - Reasoning capability primitives & provider rendering - Run-scoped compaction with real-token triggering - Tool-batch fault isolation + typed checkpoint corruption handling - Parallel HITL approval replay fixes - Checkpointer corruption detection improvements - Cut documentation snapshot for 0.13: - Create versioned_docs/version-0.13 with all current docs + generated API ref - Create versioned i18n/zh-Hans locale mirror (version-0.13) - Update docusaurus.config.ts: lastVersion='0.13', add version config entries - Add /docs/0.12/** to sitemap ignorePatterns - Create versioned_sidebars/version-0.13-sidebars.json - Prepend 0.13 to versions.json - Add missing api/index.mdx to zh-Hans current locale - Revert intro.mdx (en + zh-Hans) to "Next 🚧" for unreleased channel
| ): | ||
| raise | ||
| except Exception as exc: | ||
| except BaseException as exc: |
| SystemExit, | ||
| ): | ||
| raise | ||
| except BaseException as exc: |
| prompt_task.cancel() | ||
| with pytest.raises(asyncio.CancelledError): | ||
| await agent.prompt("Run the blocking tool") | ||
| await prompt_task |
| prompt_task.cancel() | ||
| with pytest.raises(asyncio.CancelledError): | ||
| await agent.prompt("second") | ||
| await prompt_task |
| await asyncio.sleep(0.02) # let fast_ok finish | ||
| runner.cancel() | ||
| with pytest.raises(asyncio.CancelledError): | ||
| await runner |
| await asyncio.sleep(0.02) | ||
| runner.cancel() | ||
| with pytest.raises(asyncio.CancelledError): | ||
| await runner |
| await asyncio.sleep(0.02) | ||
| runner.cancel() | ||
| with pytest.raises(asyncio.CancelledError): | ||
| await runner |
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
….mdx The frozen version-0.13 snapshot must use hardcoded version strings, not PackageVersion component which reads pyproject.toml at build time. After the next release bumps the version, the snapshot would render the wrong version without this fix.
Docusaurus expects version strings to match the versioned_docs/version-X directory names and docusaurus.config.ts version keys. Change from 0.13.0 to 0.13 for consistency.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Release preparation for CubePi v0.13.0 with comprehensive changelog, version bump, and documentation snapshot.
Changes
Features in 0.13.0
Ready to merge
After merge: