diff --git a/README.md b/README.md
index f5c8a95..153a634 100644
--- a/README.md
+++ b/README.md
@@ -38,8 +38,8 @@ Every host already has its own Roslyn constraints (Unity pins 4.8 because of `Sy
## C# in two lines
```xml
-
-
+
+
```
diff --git a/dotnet/Directory.Build.props b/dotnet/Directory.Build.props
index 373ca97..f6154bc 100644
--- a/dotnet/Directory.Build.props
+++ b/dotnet/Directory.Build.props
@@ -6,7 +6,7 @@
true
$(NoWarn);CS1591
true
- 0.3.1
+ 0.4.0
Ivan Murzak
Copyright (c) 2026 Ivan Murzak
https://github.com/IvanMurzak/Code-Exec
diff --git a/python/code_exec/__init__.py b/python/code_exec/__init__.py
index da95b45..c9f4992 100644
--- a/python/code_exec/__init__.py
+++ b/python/code_exec/__init__.py
@@ -13,4 +13,4 @@
__all__ = ["run", "run_json", "run_b64", "set_value_converter", "set_default_timeout_ms", "set_max_timeout_ms",
"set_max_recursion_limit", "SnippetTimeout", "SnippetThreadStopped", "SNIPPET_FILE"]
-__version__ = "0.3.0"
+__version__ = "0.4.0"
diff --git a/spec/contract.md b/spec/contract.md
index 7b2705d..1570977 100644
--- a/spec/contract.md
+++ b/spec/contract.md
@@ -1,4 +1,4 @@
-# Code-Exec contract (v0.3)
+# Code-Exec contract (v0.4)
One request/response shape for every runtime (C# and Python) and every host (Unity, Godot, BRUTAL, Unreal, plain
.NET). **This file is normative: a runtime that disagrees with it is the bug.** Behaviour changes start here, then
@@ -301,7 +301,7 @@ Lengths are in characters: UTF-16 code units in C#, code points in Python. A lim
## Changelog
-- **Unreleased** — execution guards (§3.6): C# snippets, full source and includes stop with `Runtime`
+- **v0.4.0** — execution guards (§3.6): C# snippets, full source and includes stop with `Runtime`
(`Recursion too deep`) before a stack overflow and with `Timeout` once `timeoutMs` is spent, also in synchronous code
on the main thread; Python stops with `Timeout` through a watchdog (§4). `timeoutMs` applies to both runtimes; `0`
means the host's default (120000), a negative value is `InvalidRequest`. Full-source mode gets the request's `usings`