Merge branch '0.23.0' into master
diff --git a/CHANGES.md b/CHANGES.md
index cc89059..8e6721c 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,100 @@
 # Apache Thrift Changelog
 
+## 0.23.0
+
+### Build Process
+
+- [THRIFT-5877](https://issues.apache.org/jira/browse/THRIFT-5877) - Add cpp cross tests
+- [THRIFT-5866](https://issues.apache.org/jira/browse/THRIFT-5866) - Dockerfile to support Ubuntu 24.04 LTS (Noble Numbat)
+- [THRIFT-5909](https://issues.apache.org/jira/browse/THRIFT-5909) - add Ruby in GitHub workflow
+- [THRIFT-5649](https://issues.apache.org/jira/browse/THRIFT-5649) - add go in GitHub workflow / action
+
+### C glib
+
+- [THRIFT-5931](https://issues.apache.org/jira/browse/THRIFT-5931) - thrift_ssl_socket_get_ssl_error() can underflow its remaining-buffer counter and write past the stack buffer
+- [THRIFT-5871](https://issues.apache.org/jira/browse/THRIFT-5871) - Improve MAX_MESSAGE_SIZE check and friends
+
+### C++ 
+
+- [THRIFT-5911](https://issues.apache.org/jira/browse/THRIFT-5911) - Inconsistent UUID compilation for aliased types
+- [THRIFT-5912](https://issues.apache.org/jira/browse/THRIFT-5912) - Assertion failed: `delta > 0`, file ThreadManagerTests.h, line 162
+- [THRIFT-5880](https://issues.apache.org/jira/browse/THRIFT-5880) - C++ TSocket on an IPv6-only system fails if you use a hostname of 127.0.0.1
+- [THRIFT-3268](https://issues.apache.org/jira/browse/THRIFT-3268) - warning: token pasting of ',' and `__VA_ARGS__` is a GNU extension
+- [THRIFT-5887](https://issues.apache.org/jira/browse/THRIFT-5887) - build/cmake/ should be prepended (not appended) to CMAKE_MODULE_PATH
+- [THRIFT-5878](https://issues.apache.org/jira/browse/THRIFT-5878) - Add UUID support for THeaderProtocol and TProtocolTap
+- [THRIFT-5898](https://issues.apache.org/jira/browse/THRIFT-5898) - Unable to build Thrift as a shared library on Windows
+
+### Contributed
+
+- [THRIFT-5920](https://issues.apache.org/jira/browse/THRIFT-5920) - Remove threadsafe warnings in thrift-maven-plugin
+
+### Delphi
+
+- [THRIFT-5939](https://issues.apache.org/jira/browse/THRIFT-5939) - Replace GUID generation with stable UUID algorithm
+- [THRIFT-5876](https://issues.apache.org/jira/browse/THRIFT-5876) - Add Delphi WinHTTP client TLS1.3 support
+
+### Go
+
+- [THRIFT-5896](https://issues.apache.org/jira/browse/THRIFT-5896) - Race condition in TServerSocket.Addr() method
+
+
+### Java
+
+- [THRIFT-5925](https://issues.apache.org/jira/browse/THRIFT-5925) - UUID implementation in JAVA is not according to the Thrift Specification
+- [THRIFT-5869](https://issues.apache.org/jira/browse/THRIFT-5869) - Close the transport after TServerEventHandler deleteContext
+- [THRIFT-5863](https://issues.apache.org/jira/browse/THRIFT-5863) - Make TServerTransport able to customize the max message size
+- [THRIFT-5774](https://issues.apache.org/jira/browse/THRIFT-5774) - Add remote client's IP address to ServerContext in TServerEventHandler
+- [THRIFT-4280](https://issues.apache.org/jira/browse/THRIFT-4280) - Add async nonblocking ssl support in java client
+- [THRIFT-5879](https://issues.apache.org/jira/browse/THRIFT-5879) - java and kotlin cross tests fail in the GitHub action 
+
+### netstd
+
+- [THRIFT-5902](https://issues.apache.org/jira/browse/THRIFT-5902) - Add net10 support
+- [THRIFT-5874](https://issues.apache.org/jira/browse/THRIFT-5874) - Introduce new type `MESSAGE_SIZE_LIMIT` in TTransportException
+
+### nodejs
+
+- [THRIFT-5937](https://issues.apache.org/jira/browse/THRIFT-5937) - nodejs episodic generation does not handle extending services 
+
+### PHP
+
+- [THRIFT-5935](https://issues.apache.org/jira/browse/THRIFT-5935) - Fix deprecated non-canonical casts for PHP 8.5 compatibility
+- [THRIFT-5921](https://issues.apache.org/jira/browse/THRIFT-5921) - Ubuntu focal fail to run composer install
+
+## Python
+
+- [THRIFT-5927](https://issues.apache.org/jira/browse/THRIFT-5927) - Cannot use reserved language keyword "None" with target language Python
+- [THRIFT-5885](https://issues.apache.org/jira/browse/THRIFT-5885) - TBinaryProtocolAccelerated incorrectly deserializes IntEnum to None
+- [THRIFT-5923](https://issues.apache.org/jira/browse/THRIFT-5923) - UUID support for Python
+- [THRIFT-5926](https://issues.apache.org/jira/browse/THRIFT-5926) - TSaslClientTransport.open() crashes with DIGEST-MD5 due to None initial response
+- [THRIFT-5915](https://issues.apache.org/jira/browse/THRIFT-5915) - Python 3.12+ is not supported due to distutils
+- [THRIFT-5892](https://issues.apache.org/jira/browse/THRIFT-5892) - PY_SSIZE_T_CLEAN error in some environments
+- [THRIFT-5873](https://issues.apache.org/jira/browse/THRIFT-5873) - mTLS broken with python THttpClient
+- [THRIFT-792](https://issues.apache.org/jira/browse/THRIFT-792) - TSocket hides underlying exceptions when open() fails 
+- [THRIFT-5888](https://issues.apache.org/jira/browse/THRIFT-5888) - declare support for free-threaded CPython in extension modules
+- [THRIFT-5900](https://issues.apache.org/jira/browse/THRIFT-5900) - Thrift Cross Test broken in Github (Python 3.14)
+
+### Ruby
+
+- [THRIFT-5308](https://issues.apache.org/jira/browse/THRIFT-5308) - implement ruby seq reply 
+- [THRIFT-5910](https://issues.apache.org/jira/browse/THRIFT-5910) - Add UUID support in Ruby
+- [THRIFT-5906](https://issues.apache.org/jira/browse/THRIFT-5906) - Remove Fixnum references to support modern Ruby versions
+- [THRIFT-5905](https://issues.apache.org/jira/browse/THRIFT-5905) - Add base64 and logger as explicit dependencies
+- [THRIFT-5903](https://issues.apache.org/jira/browse/THRIFT-5903) - Fixnum is no longer supported since Ruby 3.2
+- [THRIFT-5687](https://issues.apache.org/jira/browse/THRIFT-5687) - Ruby gems deprecation warning: Gem::Specification#has_rdoc= is deprecated with no replacement
+- [THRIFT-4035](https://issues.apache.org/jira/browse/THRIFT-4035) - Thrift ruby runtime does not send unique sequence IDs in requests according to the unit tests
+- [THRIFT-1911](https://issues.apache.org/jira/browse/THRIFT-1911) - IOError not being caught in socket.rb
+- [THRIFT-4526](https://issues.apache.org/jira/browse/THRIFT-4526) - Implement rubocop for ruby in the sca build, once clean into every make
+- [THRIFT-5273](https://issues.apache.org/jira/browse/THRIFT-5273) - warning in ruby version >= 2.4
+- [THRIFT-5918](https://issues.apache.org/jira/browse/THRIFT-5918) - Implement header protocol support for Ruby
+
+### Rust
+
+- [THRIFT-5559](https://issues.apache.org/jira/browse/THRIFT-5559) - Processor can be implemented on handler trait itself
+- [THRIFT-5928](https://issues.apache.org/jira/browse/THRIFT-5928) - skip() call on unknown binary field fails deserialization instead of graceful skipping over field
+- [THRIFT-5739](https://issues.apache.org/jira/browse/THRIFT-5739) - set_nodelay should be enabled for TTcpChannel
+
+
 ## 0.22.0
 
 ### Build Process
diff --git a/Makefile.am b/Makefile.am
index 735cd40..733c07e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -151,10 +151,12 @@
 	.github/workflows/release_rust.yml \
 	.travis.yml \
 	ApacheThrift.nuspec \
+	AGENTS.md \
 	appveyor.yml \
 	bootstrap.sh \
 	bower.json \
 	build \
+	CLAUDE.md \
 	CHANGES.md \
 	CMakeLists.txt \
 	composer.json \
@@ -165,6 +167,7 @@
 	doc \
 	dub.json \
 	eslint.config.mjs \
+	FUZZING.md \
 	go.mod \
 	jitpack.yml \
 	LANGUAGES.md \
diff --git a/compiler/cpp/Makefile.am b/compiler/cpp/Makefile.am
index 29ef1bd..bd0571f 100644
--- a/compiler/cpp/Makefile.am
+++ b/compiler/cpp/Makefile.am
@@ -41,6 +41,7 @@
                  src/thrift/generate/t_generator_registry.h \
                  src/thrift/generate/t_html_generator.h \
                  src/thrift/generate/t_oop_generator.h \
+				 src/thrift/generate/sha256.h\
                  src/thrift/globals.h \
                  src/thrift/logging.h \
                  src/thrift/main.cc \
diff --git a/debian/changelog b/debian/changelog
index 9b66cad..ffb9568 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+thrift (0.23.0) stable; urgency=low
+
+  * update to 0.23.0
+
+ -- Apache Thrift Developers <dev@thrift.apache.org>  Wed, 08 Apr 2026 00:10:00 +0100
+
 thrift (0.22.0) stable; urgency=low
 
   * update to 0.22.0
diff --git a/doap.rdf b/doap.rdf
index 88f445d..0edd9c5 100644
--- a/doap.rdf
+++ b/doap.rdf
@@ -57,6 +57,11 @@
     <release rdf:parseType="Collection">
       <Version>
         <name>Apache Thrift</name>
+        <created>2025-04-08</created>
+        <revision>0.23.0</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift</name>
         <created>2025-05-14</created>
         <revision>0.22.0</revision>
       </Version>
diff --git a/lib/c_glib/test/fuzz/Makefile.am b/lib/c_glib/test/fuzz/Makefile.am
index e7d0e35..c000754 100644
--- a/lib/c_glib/test/fuzz/Makefile.am
+++ b/lib/c_glib/test/fuzz/Makefile.am
@@ -19,10 +19,6 @@
 
 AUTOMAKE_OPTIONS = subdir-objects serial-tests nostdinc
 
-BUILT_SOURCES = \
-    gen-c_glib/fuzz_test_no_uuid_types.h \
-    gen-c_glib/fuzz_test_no_uuid_types.c
-
 noinst_LTLIBRARIES = libtestgencfuzz.la
 nodist_libtestgencfuzz_la_SOURCES = \
     gen-c_glib/fuzz_test_no_uuid_types.c \
@@ -60,6 +56,10 @@
 gen-c_glib/fuzz_test_no_uuid_types.c gen-c_glib/fuzz_test_no_uuid_types.h: $(top_srcdir)/test/v0.16/FuzzTestNoUuid.thrift
 	$(THRIFT) --gen c_glib -r $<
 
+# Ensure generated headers exist before compiling sources that include them
+fuzz_parse_compact.$(OBJEXT): gen-c_glib/fuzz_test_no_uuid_types.h
+fuzz_parse_binary.$(OBJEXT): gen-c_glib/fuzz_test_no_uuid_types.h
+
 clean-local:
 	$(RM) -r gen-c_glib/
 	$(RM) *.o
diff --git a/lib/cpp/test/fuzz/Makefile.am b/lib/cpp/test/fuzz/Makefile.am
index 940484d..a4fc1b9 100644
--- a/lib/cpp/test/fuzz/Makefile.am
+++ b/lib/cpp/test/fuzz/Makefile.am
@@ -19,9 +19,6 @@
 
 AUTOMAKE_OPTIONS = subdir-objects serial-tests nostdinc
 
-# Generate FuzzTest code
-BUILT_SOURCES = gen-cpp/FuzzTest_types.h
-
 noinst_LTLIBRARIES = libfuzztest_gen.la
 
 nodist_libfuzztest_gen_la_SOURCES = \
@@ -84,6 +81,14 @@
 gen-cpp/FuzzTest_types.cpp gen-cpp/FuzzTest_types.h: $(top_srcdir)/test/FuzzTest.thrift
 	$(THRIFT) --gen cpp $<
 
+# Ensure generated headers exist before compiling sources that include them
+FuzzParseCompact.$(OBJEXT): gen-cpp/FuzzTest_types.h
+FuzzParseBinary.$(OBJEXT): gen-cpp/FuzzTest_types.h
+FuzzRoundtripCompact.$(OBJEXT): gen-cpp/FuzzTest_types.h
+FuzzRoundtripBinary.$(OBJEXT): gen-cpp/FuzzTest_types.h
+FuzzParseJson.$(OBJEXT): gen-cpp/FuzzTest_types.h
+FuzzRoundtripJson.$(OBJEXT): gen-cpp/FuzzTest_types.h
+
 # Clean target
 clean-local:
 	$(RM) -rf gen-cpp
diff --git a/lib/py/Makefile.am b/lib/py/Makefile.am
index 0abd349..81170e2 100644
--- a/lib/py/Makefile.am
+++ b/lib/py/Makefile.am
@@ -81,6 +81,8 @@
 	compat \
 	setup.py \
 	setup.cfg \
+	pyproject.toml \
 	src \
 	test \
 	README.md
+	
\ No newline at end of file
diff --git a/lib/rb/Makefile.am b/lib/rb/Makefile.am
index fd5218f..64ff7b1 100644
--- a/lib/rb/Makefile.am
+++ b/lib/rb/Makefile.am
@@ -52,9 +52,13 @@
 	$(MAKE) $(AM_MAKEFLAGS) distdir-am
 
 EXTRA_DIST = \
+	.rubocop.yml \
 	coding_standards.md \
 	Rakefile \
 	Gemfile \
+	Gemfile.linters \
+	Gemfile.lock \
+	test/fuzz/.gitignore \
 	thrift.gemspec \
 	lib \
 	ext \
diff --git a/lib/rs/Makefile.am b/lib/rs/Makefile.am
index 307f842..71e6335 100644
--- a/lib/rs/Makefile.am
+++ b/lib/rs/Makefile.am
@@ -53,6 +53,7 @@
 	Cargo.toml \
 	README.md \
 	release.sh \
+	test/fuzz/.gitignore \
 	NOTICE \
 	LICENSE \
 	RELEASING.md
diff --git a/test/Makefile.am b/test/Makefile.am
index c53d3b1..bee3a6d 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -130,6 +130,7 @@
 	cpp \
 	crossrunner \
 	dart \
+	delphi \
 	erl \
 	keys \
 	lua \
@@ -147,9 +148,7 @@
 	AnnotationTest.thrift \
 	BrokenConstants.thrift \
 	ConstantsDemo.thrift \
-	v0.16/ConstantsDemo.thrift \
 	DebugProtoTest.thrift \
-	v0.16/DebugProtoTest.thrift \
 	DenseLinkingTest.thrift \
 	DocTest.thrift \
 	DoubleConstantsTest.thrift \
@@ -157,36 +156,40 @@
 	EnumTest.thrift \
 	ExceptionStruct.thrift \
 	FullCamelTest.thrift \
-	Include.thrift \
+	FuzzTest.thrift \
 	Identifiers.thrift \
+	Include.thrift \
+	index.html \
 	Int64Test.thrift \
 	JsDeepConstructorTest.thrift \
+	keys/keygen/.gitignore \
+	known_failures_Linux.json \
 	ManyOptionals.thrift \
 	ManyTypedefs.thrift \
 	NameConflictTest.thrift \
-	v0.16/NameConflictTest.thrift \
 	OptionalRequiredTest.thrift \
+	partial/thrift_test_schema.thrift \
+	README.md \
+	rebuild_known_failures.sh \
 	Recursive.thrift \
+	result.js \
 	ReuseObjects.thrift \
+	Service.thrift \
 	SmallTest.thrift \
+	SpecificNameTest.thrift \
 	StressTest.thrift \
+	test.py \
+	tests.json \
 	ThriftTest.thrift \
-	v0.16/ThriftTest.thrift \
 	TypedefTest.thrift \
 	Types.thrift \
 	UnsafeTypes.thrift \
-	Service.thrift \
-	SpecificNameTest.thrift \
+	v0.16/ConstantsDemo.thrift \
+	v0.16/DebugProtoTest.thrift \
+	v0.16/FuzzTestNoUuid.thrift \
+	v0.16/NameConflictTest.thrift \
+	v0.16/ThriftTest.thrift \
 	VoidMethExceptionsTest.thrift \
-	partial/thrift_test_schema.thrift \
-	keys/keygen/.gitignore \
-	known_failures_Linux.json \
-	test.py \
-	tests.json \
-	rebuild_known_failures.sh \
-	result.js \
-	index.html \
-	README.md \
 	valgrind.suppress
 
 precross-%: