← ArchiveArea
Completed

Resolve the fatal-admission test contract before finishing UrlProtocol drain reconciliation

RESOLVED 2026-09-24: orchestrator-approved test adaptation applied on recon/574-on-585 at f09993fe; baseline fails as diagnosed, patched test 6/6 local, 4 fatal/drain neighbors pass. Remaining reconciliation (rebase onto 585 final, reviews, push onto PR 574, fresh coordinate since 0.0.529 is taken) is owned by the parent UrlProtocol main-green handoff. Note PR 574 was rebased onto main 2026-09-24T02:51Z without the recon fixes.

Handoff document

Markdown

Handoff: Resolve the fatal-admission test contract before finishing UrlProtocol drain reconciliation

Written 2026-09-20T22:45:53.998055+00:00. RE-VERIFY: this is a write-time snapshot. Check git ls-remote origin refs/heads/recon/574-on-585, the two contextual PRs with gh pr view <full-url> --json state,headRefOid,mergeStateStatus,statusCheckRollup, and Maven metadata before acting. Local paths below are optional harness records; the complete diagnosis, proposed patch, raw failure and selector results are embedded here.

Mission

The lane was assigned two design gaps and three test gaps in the reconciliation of https://github.com/CodexCoder21Organization/UrlProtocol/pull/574 onto https://github.com/CodexCoder21Organization/UrlProtocol/pull/585. User required the specified 3a8c33c9 base, version 0.0.529, seven new/changed test scenarios proved failing-before then passing five times, the reconciliation and inherited regression matrices, one branch push, no PR or CI wait. The fixes are pushed; one inherited test requires a decision because its post-fatal admission contract contradicts the new required boundary.

Current result and remaining decision

2026-09-20T22:45:53.996250+00:00 — final durable state, BLOCKED on one contract decision

OBSERVED: One and only one push completed to https://github.com/CodexCoder21Organization/UrlProtocol/tree/recon/574-on-585. Remote and local head both https://github.com/CodexCoder21Organization/UrlProtocol/commit/d57995ec70116dadc4512980b5e2803e17cb5c2f; git ls-remote confirms equality, working tree/stashes are clean, and the assigned base https://github.com/CodexCoder21Organization/UrlProtocol/commit/3a8c33c910c36bfea589682ccb714ad83b45b5c8 is an ancestor. The force-with-lease push explicitly expected the original remote head, protecting concurrent work. No PR exists for this branch, and none was created. Metadata immediately before push reports latest 0.0.525 and contains no 0.0.529. No artifact was published, no service deployed/restarted, no merge/enqueue or CI rerun occurred. OBSERVED: Final targeted matrix completed 145 invocations on that exact head: 144 pass, 1 fails. All seven round-2 changed/new selectors pass 5/5 (35/35). All 33 reconciliation selectors pass. Original 585 set: 79/80 pass; its additional supplied-base selector passes, making the expanded set 80/81. Original lifecycle set: 15/16 pass. These groups overlap; the sole failure in both affected groups is testTcpServerClassifiesReaderStartFailureMessages. Every selector was run; the failed test was not retried, skipped, disabled, edited, or weakened. No local full suite or remote test run was launched. OBSERVED: At 22:43:47 UTC, automatic checks on the pushed head are kotlin.build (remote) IN_PROGRESS (https://github.com/CodexCoder21Organization/UrlProtocol/runs/106162685348) and kotlin.build (kompile-remote-build) IN_PROGRESS (https://github.com/CodexCoder21Organization/UrlProtocol/runs/106162689014). No separate commit-status contexts are attached; combined status is pending. No GitHub Actions build/all-tests check is attached. No CI wait was performed. OBSERVED: Contextual pull requests remain OPEN/BLOCKED: https://github.com/CodexCoder21Organization/UrlProtocol/pull/574 and https://github.com/CodexCoder21Organization/UrlProtocol/pull/585. The latter advanced to https://github.com/CodexCoder21Organization/UrlProtocol/commit/b2d071ef91d686eff8d63ebd2050dc12ed3728de, changing three tests only. This lane keeps its expressly assigned base; those later test changes are not included.

Brief item State / evidence
1 replacement terminal-write admission DONE: retained per terminal write; public failing-before probe, 5/5 after; verifies 50 terminal replies and out-of-order settlement
2 reject late shared-stream RPC without cancelling admitted work DONE: no stream close on rejected admission; first admitted caller receives its response; failing-before probe and 5/5 after
3 fatal exit as sole request-admission boundary DONE implementation and new test, 5/5; original fatal-during-drain test preserved and passes. Compatibility with the inherited post-fatal-new-request-success assertion is REFUTED by the observed deterministic failure; authorization required before adapting it
4 canceled queued admission DONE test: pause observer proves request 100 admitted with 64 blocked handlers; server cancellation completes before release; missing completion mutation fails, correct implementation 5/5
5 public P2P observation DONE: all three private-attribute tests replaced/adapted to public held writes and exact responses. Private diagnostic-observer contract claim explicitly dropped in favor of public write-failure coverage; all three reject wrong ownership and pass 5/5
33-selector and 585 matrix DONE execution and reporting; 33/33, expanded 585 80/81. A green 585 result cannot be claimed with the conflicting inherited assertion unchanged
Durability/version/draft DONE: one verified push, 0.0.529 absent, draft updated with round-2 findings; no PR/CI wait

Blocking question already sent: may the classification test admit and hold its healthy request before fatal exit, then verify it completes while both uncaught handlers remain blocked? Recommendation is yes; it preserves every existing isolation/response/cause/identity/cleanup assertion while honoring the new admission rule. The user lane rule requiring a stop before changing a test judged wrong is why authorization is required. The unapplied/unverified proposal is l96-proposed-classification-admission.patch.

Workarounds/limits: repository-local git identity configured; initial rebase conflict resolved with the exact specified base test; one pre-build rebase attempt found unstaged tests, then succeeded after committing. The supplied ignored coursier symlink already worked. An initial 8-pass partial matrix was restarted after preserving the original fatal-during-drain test in a separate test-only commit; those preliminary results are excluded. No failure was dismissed to obtain green. The sole final failure is the explicit contract contradiction above.

Relevant refs

Repository Branch Remote head PR Contents State
https://github.com/CodexCoder21Organization/UrlProtocol https://github.com/CodexCoder21Organization/UrlProtocol/tree/recon/574-on-585 https://github.com/CodexCoder21Organization/UrlProtocol/commit/d57995ec70116dadc4512980b5e2803e17cb5c2f No PR Two P2P fixes, fatal TCP admission fix, seven public regression scenarios Compiles; 144/145 targeted invocations pass; one contract conflict

Deployed or published but unmerged: none. Tool history contains no publication, deployment, service restart, merge, enqueue, or CI rerun; Maven 0.0.529 remains absent at the final pre-push check.

Next steps

  1. Re-verify current branch, contextual PR heads, checks, and any answer to the blocking question. Do not overwrite other lane work. The newer base changed three tests only; coordinate integrating those with its lane.
  2. Obtain authorization to adapt the classification test before editing it. The lane explicitly said: "If you believe a test itself is wrong, say so with evidence in the findings and stop on that point instead of changing it." The proposed patch below is NOT applied and NOT tested.
  3. If authorized, apply the patch, run scripts/test.bash --local --test testTcpServerClassifiesReaderStartFailureMessages five times, review every original assertion remains, and run the fatal-admission and fatal-during-drain neighbors. Baseline failure is already reproduced with the unchanged inherited test; do not repeat CI to diagnose it.
  4. Rebase/fetch before each build as required. Preserve no-timeout-increase, no-iteration-reduction, no skips, no mocks/reflection, no weakening, no service/production actions, and no merge/enqueue/publication. The next lane needs its own explicit push budget; this lane already used its one final push.
  5. Update the round-2 draft and evidence with the final passing head, run the required reconciliation/inherited matrix for any contract changes, then return the branch to the orchestrator for separate review. Creating/retargeting a PR and merging were not this lane's authority.

Evidence and mechanisms

The outbox removed entries and settled their host admissions before submitting replacement terminal responses; a held public write promise showed delegate shutdown beginning too early. The fix carries each original Entry through its corresponding terminal write callback. The test holds the first of 50 writes while later promises settle and verifies all 50 exact terminal replies. The late-RPC branch closed a shared stream on failed host admission; its public probe held the first handler, observed the second frame's dispatch, and found the first caller canceled. Rejection now returns without stream close; host drain closes transports after admitted work settles. Fatal TCP accept cleanup passed closeRequestAdmission=false; it now passes true while cancelWork remains false.

The inherited classification test waits for fatalFailureObserved, then constructs and sends a new healthy request at test line 273 and demands a response. The new required rule rejects that request, leaving sendRequest waiting until the test's 30000ms deadline. This is the exact opposing contract; injected OutOfMemoryError strings are intentional test inputs, not host resource exhaustion. A real ping/pong barrier in the new rejection test proves the post-fatal request was processed before checking the public admitted-handler count.

The public queued-cancellation test keeps 64 genuine handlers blocked, sends through request 100, waits for RpcReadPauseObserver, closes the client, waits for server channelInactive propagation, and only then releases workers. Removing invokeOnCompletion reproduced its stuck drain. Omitting Entry.transferToWriter reproduced all three rewritten public held-write tests. All seven changed tests pass 5/5 on the pushed head.

Proposed patch, not applied or tested

--- a/tests/testTcpServerClassifiesReaderStartFailureMessages.kts
+++ b/tests/testTcpServerClassifiesReaderStartFailureMessages.kts
@@ -20,6 +20,8 @@
 import java.net.InetSocketAddress
 import java.net.ServerSocket
 import java.net.Socket
+import java.util.concurrent.Callable
+import java.util.concurrent.FutureTask
 import java.util.concurrent.CountDownLatch
 import java.util.concurrent.TimeUnit
 import java.util.concurrent.atomic.AtomicBoolean
@@ -156,6 +158,7 @@
     val fatalFactoryThread = AtomicReference<Thread?>(null)
     val observedFatalThread = AtomicReference<Thread?>(null)
     val healthyRequestHandled = CountDownLatch(1)
+    val releaseHealthyRequest = CountDownLatch(1)
     val readerThreadFactory = TcpServerReaderThreadFactory { name, action ->
         when (readerStartAttempts.getAndIncrement()) {
             0 -> thread(name = name, isDaemon = true, block = action).also {
@@ -187,6 +190,7 @@
         { request, _ ->
             if (request.method == "healthy-isolation") {
                 healthyRequestHandled.countDown()
+                releaseHealthyRequest.await()
                 Libp2pRpcProtocol.RpcResponse.success(
                     request.id,
                     mapOf("status" to "healthy", "requestId" to request.id),
@@ -199,6 +203,7 @@
         readerThreadFactory = readerThreadFactory,
     )
     var healthyStream: TcpRpcStream? = null
+    var healthyRequestThread: Thread? = null
     val failedClient = Socket()
     val priorRepository = `$effectHandlerRepository`.get()
     val unrelatedFailure = IllegalStateException("unrelated thread failure")
@@ -236,6 +241,17 @@
             healthyReaderStarted.await(5, TimeUnit.SECONDS),
             "TcpServer did not start the healthy reader before the fatal connection"
         )
+        val healthyRequest = Libp2pRpcProtocol.RpcRequest(
+            id = "healthy-during-fatal-observation",
+            method = "healthy-isolation",
+        )
+        val healthyCall = FutureTask(Callable { healthyStream!!.sendRequest(healthyRequest) })
+        healthyRequestThread = Thread(healthyCall, "healthy-request-before-fatal-exit").apply {
+            isDaemon = true
+            start()
+        }
+        assertTrue(healthyRequestHandled.await(5, TimeUnit.SECONDS),
+            "The healthy request must be admitted before fatal accept exit closes admission")
         failedClient.soTimeout = 5_000
         failedClient.connect(InetSocketAddress("127.0.0.1", port), 5_000)
         assertTrue(
@@ -258,7 +274,7 @@
             server.connectionCount,
             "TcpServer must retain the unrelated healthy connection after the rejected heap OOM message"
         )
-        // Keep both uncaught handlers active while a real request uses the healthy reader. This
+        // Keep both uncaught handlers active while the already-admitted request completes. This
         // catches a process-wide handler assignment as well as an accept-thread handler that
         // accidentally blocks or changes another request's execution.
         unrelatedThread.start()
@@ -266,11 +282,8 @@
             unrelatedHandlerEntered.await(5, TimeUnit.SECONDS),
             "The unrelated thread must enter its own uncaught handler while fatal observation runs"
         )
-        val healthyRequest = Libp2pRpcProtocol.RpcRequest(
-            id = "healthy-during-fatal-observation",
-            method = "healthy-isolation",
-        )
-        val healthyResponse = healthyStream!!.sendRequest(healthyRequest)
+        releaseHealthyRequest.countDown()
+        val healthyResponse = healthyCall.get(5, TimeUnit.SECONDS)
         assertEquals(healthyRequest.id, healthyResponse.id)
         assertEquals(null, healthyResponse.error)
         assertEquals(
@@ -316,6 +329,7 @@
             "The fatal failure must be observed by the accept thread that raised it"
         )
     } finally {
+        releaseHealthyRequest.countDown()
         releaseFatalClose.countDown()
         unrelatedHandlerReleased.countDown()
         fatalHandlerReleased.countDown()
@@ -336,6 +350,8 @@
                         unrelatedThread.join(5_000)
                     }
                     fatalFactoryThread.get()?.join(5_000)
+                    healthyRequestThread?.join(5_000)
+                    assertFalse(healthyRequestThread?.isAlive == true, "The healthy request caller must terminate after cleanup")
                     assertFalse(unrelatedThread.isAlive, "The unrelated thread must terminate after cleanup")
                     assertTrue(fatalFactoryThread.get()?.isAlive != true, "The fatal accept thread must terminate after cleanup")
                 } finally {

Full failing-test output and thread dumps

Current branch recon/574-on-585 is up to date.
Picked up JAVA_TOOL_OPTIONS: -Dfoundation.url.test.isolated=true
'getter for id: Long' is deprecated. Deprecated in Java
Unnecessary non-null assertion (!!) on a non-null receiver of type TcpRpcStream
warning: no package at top of file: /tmp/claude-501/-code/ca89812b-bfcc-4ad0-91ea-9366a832809d/scratchpad/workspace/l96-fix574r2/UrlProtocol/tests/testTcpServerClassifiesReaderStartFailureMessages.kts
java.lang.RuntimeException: Test 'testTcpServerClassifiesReaderStartFailureMessages' timed out after 30000ms, stuck at: foundation.url.protocol.TcpRpcStream.sendRequest(TcpRpcStream.kt:115)
	at kompile.WorkspaceKt.executeTestInSeparateJvm(Workspace.kt:2407)
	at kompile.WorkspaceKt.runTests(Workspace.kt:3570)
	at kompile.LocalBuildWorkspace.runTests$kompile(Workspace.kt:1249)
	at kompile.LocalBuildWorkspace.executeInternal(Workspace.kt:570)
	at kompile.LocalBuildWorkspace.execute(Workspace.kt:508)
	at kompile.cli.CliKt.main(Cli.kt:1232)
FAILED foundation.url.protocol.testTcpServerClassifiesReaderStartFailureMessages -> Test 'testTcpServerClassifiesReaderStartFailureMessages' timed out after 30000ms, stuck at: foundation.url.protocol.TcpRpcStream.sendRequest(TcpRpcStream.kt:115) (in 31.3 seconds)
--- Console output (foundation.url.protocol.testTcpServerClassifiesReaderStartFailureMessages) ---
Picked up JAVA_TOOL_OPTIONS: -Dfoundation.url.test.isolated=true
An uncaught NotificationEffect bubbled up to the thread root!
You can learn more about handling NotificationEffects at https://github.com/kotlin-algebraic-effects/
TcpServer on port 41203 could not start a connection reader thread for an accepted socket; the socket was removed from the connection set and closed; cause: java.lang.OutOfMemoryError: UNABLE TO CREATE NATIVE THREAD: possibly out of memory or process/resource limits reached [unhandled TcpServerReaderThreadStartFailureEffect from TcpServer.kt:1390]
TcpServer on port 42947 could not start a connection reader thread for an accepted socket; the socket was removed from the connection set and closed; cause: java.lang.OutOfMemoryError: unable to create new native thread: possibly out of memory or process/resource limits reached [unhandled TcpServerReaderThreadStartFailureEffect from TcpServer.kt:1390]
TcpServer on port 36529 could not start a connection reader thread for an accepted socket; the socket was removed from the connection set and closed; cause: java.lang.OutOfMemoryError: Failed to create a thread: retVal -1, errno 11 [unhandled TcpServerReaderThreadStartFailureEffect from TcpServer.kt:1390]
TcpServer on port 41381 could not start a connection reader thread for an accepted socket; the socket was removed from the connection set and closed; cause: java.lang.OutOfMemoryError: FAILED TO CREATE A THREAD: retVal -1, errno 11 (0xb), errno2 0x9b [unhandled TcpServerReaderThreadStartFailureEffect from TcpServer.kt:1390]
TcpServer on port 41159 could not start a connection reader thread for an accepted socket; the socket was removed from the connection set and closed; cause: java.lang.OutOfMemoryError: Java heap space [unhandled TcpServerReaderThreadStartFailureEffect from TcpServer.kt:1390]
Full thread dump (kompile in-child self-dump: foundation.url.protocol.TestTcpServerClassifiesReaderStartFailureMessagesKt.testTcpServerClassifiesReaderStartFailureMessages exceeded 30000ms):

"main" #1 prio=5
   java.lang.Thread.State: TIMED_WAITING
	at jdk.internal.misc.Unsafe.park(Native Method)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:269)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:790)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1160)
	at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:276)
	at foundation.url.protocol.TcpRpcStream.sendRequest(TcpRpcStream.kt:115)
	at foundation.url.protocol.TestTcpServerClassifiesReaderStartFailureMessagesKt.testTcpServerClassifiesReaderStartFailureMessages(testTcpServerClassifiesReaderStartFailureMessages.kt:273)
	at java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
	at java.lang.invoke.LambdaForm$MH/0x000000e00100c800.invoke(LambdaForm$MH)
	at java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
	at jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:153)
	at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.lang.reflect.Method.invoke(Method.java:580)
	at kompile.TestRunner.executeTest(TestRunner.kt:46)
	at java.lang.invoke.LambdaForm$DMH/0x000000e001001800.invokeStatic(LambdaForm$DMH)
	at java.lang.invoke.LambdaForm$MH/0x000000e001005400.invoke(LambdaForm$MH)
	at java.lang.invoke.Invokers$Holder.invokeExact_MT(Invokers$Holder)
	at jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(DirectMethodHandleAccessor.java:154)
	at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.lang.reflect.Method.invoke(Method.java:580)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:416)

"Notification Thread" #26 daemon prio=9
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #27 daemon prio=8
   java.lang.Thread.State: TIMED_WAITING
	at jdk.internal.misc.Unsafe.park(Native Method)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:269)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1886)
	at java.lang.ref.ReferenceQueue.await(ReferenceQueue.java:71)
	at java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:143)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:218)
	at jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:140)
	at java.lang.Thread.runWith(Thread.java:1596)
	at java.lang.Thread.run(Thread.java:1583)
	at jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:186)

"Signal Dispatcher" #11 daemon prio=9
   java.lang.Thread.State: RUNNABLE

"TcpServer-Accept-41159" #42 daemon prio=5
   java.lang.Thread.State: WAITING
	at jdk.internal.misc.Unsafe.park(Native Method)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:221)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:788)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1133)
	at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
	at foundation.url.protocol.TestTcpServerClassifiesReaderStartFailureMessagesKt.testTcpServerClassifiesReaderStartFailureMessages$lambda$7$lambda$6(testTcpServerClassifiesReaderStartFailureMessages.kt:172)
	at foundation.url.protocol.TestTcpServerClassifiesReaderStartFailureMessagesKt$$Lambda/0x000000e001087818.uncaughtException(Unknown Source)
	at java.lang.Thread.dispatchUncaughtException(Thread.java:2902)

"TcpServer-Writer-/127.0.0.1:50974" #45 daemon prio=5
   java.lang.Thread.State: TIMED_WAITING
	at java.lang.Object.wait0(Native Method)
	at java.lang.Object.wait(Object.java:366)
	at foundation.url.protocol.TcpServer$ConnectionHandler.writeLoop(TcpServer.kt:1914)
	at foundation.url.protocol.TcpServer$ConnectionHandler.access$writeLoop(TcpServer.kt:1637)
	at foundation.url.protocol.TcpServer$ConnectionHandler$start$startedWriterThread$1.invoke(TcpServer.kt:1783)
	at foundation.url.protocol.TcpServer$ConnectionHandler$start$startedWriterThread$1.invoke(TcpServer.kt:1780)
	at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)

"kompile-timeout-self-dump" #28 daemon prio=5
   java.lang.Thread.State: RUNNABLE
	at java.lang.Thread.dumpThreads(Native Method)
	at java.lang.Thread.getAllStackTraces(Thread.java:2522)
	at kompile.TestRunner.printSelfThreadDump(TestRunner.kt:75)
	at kompile.TestRunner.executeTest$lambda$0(TestRunner.kt:35)
	at kompile.TestRunner$$Lambda/0x000000e001009ba8.run(Unknown Source)
	at java.lang.Thread.runWith(Thread.java:1596)
	at java.lang.Thread.run(Thread.java:1583)

"Unrelated-Uncaught-Failure" #41 daemon prio=5
   java.lang.Thread.State: WAITING
	at jdk.internal.misc.Unsafe.park(Native Method)
	at java.util.concurrent.locks.LockSupport.park(LockSupport.java:221)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:788)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1133)
	at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
	at foundation.url.protocol.TestTcpServerClassifiesReaderStartFailureMessagesKt.testTcpServerClassifiesReaderStartFailureMessages$lambda$8(testTcpServerClassifiesReaderStartFailureMessages.kt:221)
	at foundation.url.protocol.TestTcpServerClassifiesReaderStartFailureMessagesKt$$Lambda/0x000000e001085048.uncaughtException(Unknown Source)
	at java.lang.Thread.dispatchUncaughtException(Thread.java:2902)

"TcpRpcStream-Reader-41159" #44 daemon prio=5
   java.lang.Thread.State: RUNNABLE
	at sun.nio.ch.SocketDispatcher.read0(Native Method)
	at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:48)
	at sun.nio.ch.NioSocketImpl.tryRead(NioSocketImpl.java:256)
	at sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:307)
	at sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346)
	at sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796)
	at java.net.Socket$SocketInputStream.read(Socket.java:1099)
	at foundation.url.protocol.Libp2pRpcProtocol.readFully(Libp2pRpcProtocol.kt:3353)
	at foundation.url.protocol.Libp2pRpcProtocol.readJsonFrameLength(Libp2pRpcProtocol.kt:3206)
	at foundation.url.protocol.Libp2pRpcProtocol.readMessageFrameFromStream$foundation_url_protocol(Libp2pRpcProtocol.kt:2861)
	at foundation.url.protocol.TcpRpcStream.runReaderLoop(TcpRpcStream.kt:271)
	at foundation.url.protocol.TcpRpcStream.access$runReaderLoop(TcpRpcStream.kt:30)
	at foundation.url.protocol.TcpRpcStream$1.invoke(TcpRpcStream.kt:54)
	at foundation.url.protocol.TcpRpcStream$1.invoke(TcpRpcStream.kt:53)
	at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)

"Finalizer" #10 daemon prio=8
   java.lang.Thread.State: WAITING
	at java.lang.Object.wait0(Native Method)
	at java.lang.Object.wait(Object.java:366)
	at java.lang.Object.wait(Object.java:339)
	at java.lang.ref.NativeReferenceQueue.await(NativeReferenceQueue.java:48)
	at java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:158)
	at java.lang.ref.NativeReferenceQueue.remove(NativeReferenceQueue.java:89)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:173)

"TcpServer-Reader-/127.0.0.1:50974" #43 daemon prio=5
   java.lang.Thread.State: RUNNABLE
	at sun.nio.ch.SocketDispatcher.read0(Native Method)
	at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:48)
	at sun.nio.ch.NioSocketImpl.tryRead(NioSocketImpl.java:256)
	at sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:307)
	at sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346)
	at sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796)
	at java.net.Socket$SocketInputStream.read(Socket.java:1099)
	at foundation.url.protocol.Libp2pRpcProtocol.readFully(Libp2pRpcProtocol.kt:3353)
	at foundation.url.protocol.Libp2pRpcProtocol.readJsonFrameLength(Libp2pRpcProtocol.kt:3206)
	at foundation.url.protocol.Libp2pRpcProtocol.readMessageFrameFromStream$foundation_url_protocol(Libp2pRpcProtocol.kt:2829)
	at foundation.url.protocol.Libp2pRpcProtocol.readMessageFrameFromStream$foundation_url_protocol$default(Libp2pRpcProtocol.kt:2820)
	at foundation.url.protocol.Libp2pRpcProtocol.readMessageFrameFromStream(Libp2pRpcProtocol.kt:2811)
	at foundation.url.protocol.TcpServer$ConnectionHandler.readConnection(TcpServer.kt:2368)
	at foundation.url.protocol.TcpServer$ConnectionHandler.handleConnection(TcpServer.kt:2235)
	at foundation.url.protocol.TcpServer$ConnectionHandler.access$handleConnection(TcpServer.kt:1637)
	at foundation.url.protocol.TcpServer$ConnectionHandler$start$startedReaderThread$1.invoke(TcpServer.kt:1771)
	at foundation.url.protocol.TcpServer$ConnectionHandler$start$startedReaderThread$1.invoke(TcpServer.kt:1769)
	at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)

"Reference Handler" #9 daemon prio=10
   java.lang.Thread.State: RUNNABLE
	at java.lang.ref.Reference.waitForReferencePendingList(Native Method)
	at java.lang.ref.Reference.processPendingReferences(Reference.java:246)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:208)

JNI global refs: 0 (not measured; kompile in-child self-dump)
2026-09-20 22:30:18
Full thread dump OpenJDK 64-Bit Server VM (21.0.12.1+1-LTS mixed mode, emulated-client, sharing):

Threads class SMR info:
_java_thread_list=0x0000ffff68001b00, length=10, elements={
0x0000ffffa002dcb0, 0x0000ffffa00dd550, 0x0000ffffa00deb50, 0x0000ffffa00e0420,
0x0000ffffa00e1a80, 0x0000ffffa00e3040, 0x0000ffffa00e4770, 0x0000ffffa00f1660,
0x0000ffffa00f4730, 0x0000ffff68000f70
}

"main" #1 [63686] prio=5 os_prio=0 cpu=123.22ms elapsed=30.81s tid=0x0000ffffa002dcb0 nid=63686 runnable  [0x0000ffffa5c7d000]
   java.lang.Thread.State: RUNNABLE
	at sun.nio.ch.Net.poll(java.base@21.0.12.1/Native Method)
	at sun.nio.ch.NioSocketImpl.park(java.base@21.0.12.1/NioSocketImpl.java:191)
	at sun.nio.ch.NioSocketImpl.timedRead(java.base@21.0.12.1/NioSocketImpl.java:280)
	at sun.nio.ch.NioSocketImpl.implRead(java.base@21.0.12.1/NioSocketImpl.java:304)
	at sun.nio.ch.NioSocketImpl.read(java.base@21.0.12.1/NioSocketImpl.java:346)
	at sun.nio.ch.NioSocketImpl$1.read(java.base@21.0.12.1/NioSocketImpl.java:796)
	at java.net.Socket$SocketInputStream.read(java.base@21.0.12.1/Socket.java:1099)
	at java.net.Socket$SocketInputStream.read(java.base@21.0.12.1/Socket.java:1093)
	at java.io.ObjectInputStream$PeekInputStream.peek(java.base@21.0.12.1/ObjectInputStream.java:2893)
	at java.io.ObjectInputStream$BlockDataInputStream.peek(java.base@21.0.12.1/ObjectInputStream.java:3220)
	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(java.base@21.0.12.1/ObjectInputStream.java:3230)
	at java.io.ObjectInputStream.readObject0(java.base@21.0.12.1/ObjectInputStream.java:1713)
	at java.io.ObjectInputStream.readObject(java.base@21.0.12.1/ObjectInputStream.java:540)
	at java.io.ObjectInputStream.readObject(java.base@21.0.12.1/ObjectInputStream.java:498)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.sendMessageAndGetResponse(BootstrapRunner.java:116)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.sendMessageAndExpectAck(BootstrapRunner.java:134)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.reportUncaughtException(BootstrapRunner.java:262)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:447)

"Reference Handler" #9 [63699] daemon prio=10 os_prio=0 cpu=0.27ms elapsed=30.80s tid=0x0000ffffa00dd550 nid=63699 waiting on condition  [0x0000ffffa4527000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.ref.Reference.waitForReferencePendingList(java.base@21.0.12.1/Native Method)
	at java.lang.ref.Reference.processPendingReferences(java.base@21.0.12.1/Reference.java:246)
	at java.lang.ref.Reference$ReferenceHandler.run(java.base@21.0.12.1/Reference.java:208)

"Finalizer" #10 [63700] daemon prio=8 os_prio=0 cpu=0.15ms elapsed=30.80s tid=0x0000ffffa00deb50 nid=63700 in Object.wait()  [0x0000ffffa4319000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait0(java.base@21.0.12.1/Native Method)
	- waiting on <0x00000000f8340f88> (a java.lang.ref.NativeReferenceQueue$Lock)
	at java.lang.Object.wait(java.base@21.0.12.1/Object.java:366)
	at java.lang.Object.wait(java.base@21.0.12.1/Object.java:339)
	at java.lang.ref.NativeReferenceQueue.await(java.base@21.0.12.1/NativeReferenceQueue.java:48)
	at java.lang.ref.ReferenceQueue.remove0(java.base@21.0.12.1/ReferenceQueue.java:158)
	at java.lang.ref.NativeReferenceQueue.remove(java.base@21.0.12.1/NativeReferenceQueue.java:89)
	- locked <0x00000000f8340f88> (a java.lang.ref.NativeReferenceQueue$Lock)
	at java.lang.ref.Finalizer$FinalizerThread.run(java.base@21.0.12.1/Finalizer.java:173)

"Signal Dispatcher" #11 [63701] daemon prio=9 os_prio=0 cpu=0.26ms elapsed=30.80s tid=0x0000ffffa00e0420 nid=63701 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #12 [63702] daemon prio=9 os_prio=0 cpu=0.21ms elapsed=30.80s tid=0x0000ffffa00e1a80 nid=63702 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Deflation Thread" #13 [63703] daemon prio=9 os_prio=0 cpu=2.03ms elapsed=30.80s tid=0x0000ffffa00e3040 nid=63703 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread0" #14 [63704] daemon prio=9 os_prio=0 cpu=25.60ms elapsed=30.80s tid=0x0000ffffa00e4770 nid=63704 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Notification Thread" #26 [63705] daemon prio=9 os_prio=0 cpu=0.06ms elapsed=30.79s tid=0x0000ffffa00f1660 nid=63705 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #27 [63706] daemon prio=8 os_prio=0 cpu=0.22ms elapsed=30.79s tid=0x0000ffffa00f4730 nid=63706 waiting on condition  [0x0000ffff85be1000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at jdk.internal.misc.Unsafe.park(java.base@21.0.12.1/Native Method)
	- parking to wait for  <0x00000000f839d180> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(java.base@21.0.12.1/LockSupport.java:269)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@21.0.12.1/AbstractQueuedSynchronizer.java:1886)
	at java.lang.ref.ReferenceQueue.await(java.base@21.0.12.1/ReferenceQueue.java:71)
	at java.lang.ref.ReferenceQueue.remove0(java.base@21.0.12.1/ReferenceQueue.java:143)
	at java.lang.ref.ReferenceQueue.remove(java.base@21.0.12.1/ReferenceQueue.java:218)
	at jdk.internal.ref.CleanerImpl.run(java.base@21.0.12.1/CleanerImpl.java:140)
	at java.lang.Thread.runWith(java.base@21.0.12.1/Thread.java:1596)
	at java.lang.Thread.run(java.base@21.0.12.1/Thread.java:1583)
	at jdk.internal.misc.InnocuousThread.run(java.base@21.0.12.1/InnocuousThread.java:186)

"Attach Listener" #46 [64217] daemon prio=9 os_prio=0 cpu=0.29ms elapsed=0.11s tid=0x0000ffff68000f70 nid=64217 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"VM Thread" os_prio=0 cpu=1.94ms elapsed=30.80s tid=0x0000ffffa00d2d40 nid=63698 runnable  

"VM Periodic Task Thread" os_prio=0 cpu=12.82ms elapsed=30.80s tid=0x0000ffffa00c1720 nid=63697 waiting on condition  

"G1 Service" os_prio=0 cpu=0.65ms elapsed=30.81s tid=0x0000ffffa00aad50 nid=63691 runnable  

"G1 Refine#0" os_prio=0 cpu=14.64ms elapsed=30.81s tid=0x0000ffffa00a9d80 nid=63690 runnable  

"G1 Conc#0" os_prio=0 cpu=0.05ms elapsed=30.81s tid=0x0000ffffa0050280 nid=63689 runnable  

"G1 Main Marker" os_prio=0 cpu=0.06ms elapsed=30.81s tid=0x0000ffffa004f2d0 nid=63688 runnable  

"GC Thread#0" os_prio=0 cpu=3.60ms elapsed=30.81s tid=0x0000ffffa004ce60 nid=63687 runnable  

JNI global refs: 25, weak refs: 0

Heap
 garbage-first heap   total 131072K, used 7254K [0x00000000f8000000, 0x0000000100000000)
  region size 1024K, 3 young (3072K), 1 survivors (1024K)
 Metaspace       used 5223K, committed 5376K, reserved 1114112K
  class space    used 496K, committed 576K, reserved 1048576K

Failed to report exception to parent: TCP communication error in reportUncaughtException
java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:416)
Caused by: java.lang.AssertionError: Expected <null>, actual <RpcError(code=TIMEOUT, message=Request timed out after 30 seconds, data=null)>.
	at kotlin.test.DefaultAsserter.fail(DefaultAsserter.kt:16)
	at kotlin.test.Asserter$DefaultImpls.assertTrue(Assertions.kt:652)
	at kotlin.test.DefaultAsserter.assertTrue(DefaultAsserter.kt:11)
	at kotlin.test.Asserter$DefaultImpls.assertEquals(Assertions.kt:671)
	at kotlin.test.DefaultAsserter.assertEquals(DefaultAsserter.kt:11)
	at kotlin.test.AssertionsKt__AssertionsKt.assertEquals(Assertions.kt:63)
	at kotlin.test.AssertionsKt.assertEquals(Unknown Source)
	at kotlin.test.AssertionsKt__AssertionsKt.assertEquals$default(Assertions.kt:62)
	at kotlin.test.AssertionsKt.assertEquals$default(Unknown Source)
	at foundation.url.protocol.TestTcpServerClassifiesReaderStartFailureMessagesKt.testTcpServerClassifiesReaderStartFailureMessages(testTcpServerClassifiesReaderStartFailureMessages.kt:275)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at kompile.TestRunner.executeTest(TestRunner.kt:46)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	... 2 more
TIMEOUT: Test 'foundation.url.protocol.TestTcpServerClassifiesReaderStartFailureMessagesKt.testTcpServerClassifiesReaderStartFailureMessages' exceeded per-test timeout of 30000ms; child process killed
[JSTACK THREAD DUMPS BEGIN]
Picked up JAVA_TOOL_OPTIONS: -Dfoundation.url.test.isolated=true
2026-09-20 22:30:18
Full thread dump OpenJDK 64-Bit Server VM (21.0.12.1+1-LTS mixed mode, emulated-client, sharing):

Threads class SMR info:
_java_thread_list=0x0000ffff68001b00, length=10, elements={
0x0000ffffa002dcb0, 0x0000ffffa00dd550, 0x0000ffffa00deb50, 0x0000ffffa00e0420,
0x0000ffffa00e1a80, 0x0000ffffa00e3040, 0x0000ffffa00e4770, 0x0000ffffa00f1660,
0x0000ffffa00f4730, 0x0000ffff68000f70
}

"main" #1 [63686] prio=5 os_prio=0 cpu=123.22ms elapsed=30.80s tid=0x0000ffffa002dcb0 nid=63686 runnable  [0x0000ffffa5c7d000]
   java.lang.Thread.State: RUNNABLE
	at sun.nio.ch.Net.poll(java.base@21.0.12.1/Native Method)
	at sun.nio.ch.NioSocketImpl.park(java.base@21.0.12.1/NioSocketImpl.java:191)
	at sun.nio.ch.NioSocketImpl.timedRead(java.base@21.0.12.1/NioSocketImpl.java:280)
	at sun.nio.ch.NioSocketImpl.implRead(java.base@21.0.12.1/NioSocketImpl.java:304)
	at sun.nio.ch.NioSocketImpl.read(java.base@21.0.12.1/NioSocketImpl.java:346)
	at sun.nio.ch.NioSocketImpl$1.read(java.base@21.0.12.1/NioSocketImpl.java:796)
	at java.net.Socket$SocketInputStream.read(java.base@21.0.12.1/Socket.java:1099)
	at java.net.Socket$SocketInputStream.read(java.base@21.0.12.1/Socket.java:1093)
	at java.io.ObjectInputStream$PeekInputStream.peek(java.base@21.0.12.1/ObjectInputStream.java:2893)
	at java.io.ObjectInputStream$BlockDataInputStream.peek(java.base@21.0.12.1/ObjectInputStream.java:3220)
	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(java.base@21.0.12.1/ObjectInputStream.java:3230)
	at java.io.ObjectInputStream.readObject0(java.base@21.0.12.1/ObjectInputStream.java:1713)
	at java.io.ObjectInputStream.readObject(java.base@21.0.12.1/ObjectInputStream.java:540)
	at java.io.ObjectInputStream.readObject(java.base@21.0.12.1/ObjectInputStream.java:498)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.sendMessageAndGetResponse(BootstrapRunner.java:116)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.sendMessageAndExpectAck(BootstrapRunner.java:134)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.reportUncaughtException(BootstrapRunner.java:262)
	at community.kotlin.kompile.testrunner.bootstrap.BootstrapRunner.main(BootstrapRunner.java:447)

"Reference Handler" #9 [63699] daemon prio=10 os_prio=0 cpu=0.27ms elapsed=30.79s tid=0x0000ffffa00dd550 nid=63699 waiting on condition  [0x0000ffffa4527000]
   java.lang.Thread.State: RUNNABLE
	at java.lang.ref.Reference.waitForReferencePendingList(java.base@21.0.12.1/Native Method)
	at java.lang.ref.Reference.processPendingReferences(java.base@21.0.12.1/Reference.java:246)
	at java.lang.ref.Reference$ReferenceHandler.run(java.base@21.0.12.1/Reference.java:208)

"Finalizer" #10 [63700] daemon prio=8 os_prio=0 cpu=0.15ms elapsed=30.79s tid=0x0000ffffa00deb50 nid=63700 in Object.wait()  [0x0000ffffa4319000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait0(java.base@21.0.12.1/Native Method)
	- waiting on <0x00000000f8340f88> (a java.lang.ref.NativeReferenceQueue$Lock)
	at java.lang.Object.wait(java.base@21.0.12.1/Object.java:366)
	at java.lang.Object.wait(java.base@21.0.12.1/Object.java:339)
	at java.lang.ref.NativeReferenceQueue.await(java.base@21.0.12.1/NativeReferenceQueue.java:48)
	at java.lang.ref.ReferenceQueue.remove0(java.base@21.0.12.1/ReferenceQueue.java:158)
	at java.lang.ref.NativeReferenceQueue.remove(java.base@21.0.12.1/NativeReferenceQueue.java:89)
	- locked <0x00000000f8340f88> (a java.lang.ref.NativeReferenceQueue$Lock)
	at java.lang.ref.Finalizer$FinalizerThread.run(java.base@21.0.12.1/Finalizer.java:173)

"Signal Dispatcher" #11 [63701] daemon prio=9 os_prio=0 cpu=0.24ms elapsed=30.79s tid=0x0000ffffa00e0420 nid=63701 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #12 [63702] daemon prio=9 os_prio=0 cpu=0.21ms elapsed=30.79s tid=0x0000ffffa00e1a80 nid=63702 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Deflation Thread" #13 [63703] daemon prio=9 os_prio=0 cpu=2.03ms elapsed=30.79s tid=0x0000ffffa00e3040 nid=63703 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread0" #14 [63704] daemon prio=9 os_prio=0 cpu=25.60ms elapsed=30.79s tid=0x0000ffffa00e4770 nid=63704 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Notification Thread" #26 [63705] daemon prio=9 os_prio=0 cpu=0.06ms elapsed=30.79s tid=0x0000ffffa00f1660 nid=63705 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #27 [63706] daemon prio=8 os_prio=0 cpu=0.22ms elapsed=30.79s tid=0x0000ffffa00f4730 nid=63706 waiting on condition  [0x0000ffff85be1000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at jdk.internal.misc.Unsafe.park(java.base@21.0.12.1/Native Method)
	- parking to wait for  <0x00000000f839d180> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(java.base@21.0.12.1/LockSupport.java:269)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@21.0.12.1/AbstractQueuedSynchronizer.java:1886)
	at java.lang.ref.ReferenceQueue.await(java.base@21.0.12.1/ReferenceQueue.java:71)
	at java.lang.ref.ReferenceQueue.remove0(java.base@21.0.12.1/ReferenceQueue.java:143)
	at java.lang.ref.ReferenceQueue.remove(java.base@21.0.12.1/ReferenceQueue.java:218)
	at jdk.internal.ref.CleanerImpl.run(java.base@21.0.12.1/CleanerImpl.java:140)
	at java.lang.Thread.runWith(java.base@21.0.12.1/Thread.java:1596)
	at java.lang.Thread.run(java.base@21.0.12.1/Thread.java:1583)
	at jdk.internal.misc.InnocuousThread.run(java.base@21.0.12.1/InnocuousThread.java:186)

"Attach Listener" #46 [64217] daemon prio=9 os_prio=0 cpu=0.25ms elapsed=0.10s tid=0x0000ffff68000f70 nid=64217 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"VM Thread" os_prio=0 cpu=1.71ms elapsed=30.79s tid=0x0000ffffa00d2d40 nid=63698 runnable  

"VM Periodic Task Thread" os_prio=0 cpu=12.82ms elapsed=30.79s tid=0x0000ffffa00c1720 nid=63697 waiting on condition  

"G1 Service" os_prio=0 cpu=0.65ms elapsed=30.80s tid=0x0000ffffa00aad50 nid=63691 runnable  

"G1 Refine#0" os_prio=0 cpu=14.64ms elapsed=30.80s tid=0x0000ffffa00a9d80 nid=63690 runnable  

"G1 Conc#0" os_prio=0 cpu=0.05ms elapsed=30.80s tid=0x0000ffffa0050280 nid=63689 runnable  

"G1 Main Marker" os_prio=0 cpu=0.06ms elapsed=30.80s tid=0x0000ffffa004f2d0 nid=63688 runnable  

"GC Thread#0" os_prio=0 cpu=3.60ms elapsed=30.80s tid=0x0000ffffa004ce60 nid=63687 runnable  

JNI global refs: 25, weak refs: 0

[JSTACK THREAD DUMPS END]
--- End console output (foundation.url.protocol.testTcpServerClassifiesReaderStartFailureMessages) ---
TESTS FAILED (0/1 tests completed successfully, 1 failed)

Exact final selector results

Selector Pass / run Groups
stressTestPeerExchangeHostStopReportsStuckApply 1/1 new_or_adapted, 574_matrix
testBindClosePreservesInterruptionAndReusesPort 1/1 585_regression
testBindRepeatedCloseAndRebindAfterRpc 1/1 585_regression, neighbor
testBindingCloseWaitsForAcceptExitBeforeSamePortRebind 1/1 585_regression
testConcurrentStartStopJoinsPublishedAcceptThread 1/1 new_or_adapted, 585_regression, neighbor
testConcurrentStartStopWaitsForLifecycleMonitorAcrossRepeatedCalls 1/1 new_or_adapted, 585_regression
testForwardedDisconnectDuringPreparationReleasesResources 1/1 neighbor
testForwardedPreparationErrorPartialWriteClosesCaller 1/1 neighbor
testInterruptedBindingCloseWaitsForAcceptExitAndRestoresInterrupt 1/1 585_regression
testListenerCreatedAfterReentrantStopIsRetainedForCloseRetry 1/1 585_regression
testR81AcceptedSocketOwnedBeforeHandlerConstruction 1/1 585_regression
testR81ConcurrentInterruptedStopsJoinAfterStart 1/1 585_regression
testR81DisconnectCloseReentryDoesNotRepeatCleanup 1/1 585_regression
testR81FactoryReentryAndCloseNotifications 1/1 new_or_adapted, 585_regression
testR81FatalReaderFailureKeepsOriginalCause 1/1 585_regression
testR81LateAcceptFatalCloseFailureRemainsOwned 1/1 585_regression
testR81ListenerCloseReentryOwnsSingleClose 1/1 585_regression
testR81ListenerFailuresRemainRetryableAcrossKinds 1/1 585_regression
testR81ObserverFailureReleasesEveryQueuedResponse 1/1 585_regression
testR81OutboxCallbacksCanStopServer 1/1 new_or_adapted, 585_regression
testR94ConcurrentCloseReentryDoesNotInvertLocks 1/1 new_or_adapted, 585_regression
testR94DistinctEqualSocketsRemainOwned 1/1 585_regression
testR94FatalRelayListenerReleasesCandidate 1/1 585_regression
testR95TcpServerInterruptedWriterPreservesFlagThroughCleanup 1/1 585_regression
testRelayCloseClearsCommittedCandidateBeforeInterruptingListener 1/1 585_regression
testRelayListenerFailureKeepsCloseFailureAsCleanupDetail 1/1 585_regression
testRelayListenerFailurePreservesRefreshCause 1/1 585_regression
testRelayListenerFatalFailureClosesRegistration 1/1 585_regression
testRelayServiceCloseObserverFailureCompletesPendingRefresh 1/1 585_regression, neighbor
testRpcReadPauseDoesNotCountAsPeerIdle 1/1 neighbor
testServerHostDrainKeepsAdmittedRpcOnLateRequest 5/5 round2
testServerHostDrainRetainsResponseAfterWriteFailure 5/5 new_or_adapted
testServerHostDrainSettlesFailedReadPauseAdmission 1/1 new_or_adapted
testServerHostDrainSettlesForwardedResponse 1/1 new_or_adapted
testServerHostDrainWaitsForForwardedPreparationError 5/5 new_or_adapted
testServerHostDrainWaitsForQueuedRpcResponse 5/5 new_or_adapted, 574_matrix
testServerHostDrainWaitsForTerminalCloseWrite 5/5 round2
testServerHostForceCloseClosesTransportWithoutGracefulStop 1/1 new_or_adapted
testServerHostStopReleasesCanceledQueuedResponseAdmission 5/5 new_or_adapted, 574_matrix
testStopReenteredFromListenerCloseDoesNotJoinUnderOuterLock 1/1 585_regression
testStopRejectsLaterStartAndDoesNotJoinRevivedAcceptLoop 1/1 585_regression
testTcpServerAcceptedCloseFailureStillClosesOtherConnections 1/1 585_regression
testTcpServerAcceptedCloseReentryDoesNotRepeatCleanup 1/1 585_regression
testTcpServerCancelsQueuedRequestHandlersWhenClientDisconnects 1/1 neighbor
testTcpServerClassifiesReaderStartFailureMessages 0/1 574_matrix, 585_regression
testTcpServerCloseFromReaderFactoryReusesPort 1/1 585_regression
testTcpServerCloseNowJoinsAcceptThread 1/1 new_or_adapted, 574_matrix
testTcpServerConcurrentDrainCoversMultipleHandlers 1/1 new_or_adapted, 574_matrix
testTcpServerConcurrentReaderAndStopCleanupHaveIndependentOwnership 1/1 new_or_adapted, 585_regression
testTcpServerConcurrentSocketCloseCallbacksStop 1/1 585_regression
testTcpServerDoesNotStartQueuedHandlerAfterStopBegins 1/1 neighbor
testTcpServerDrainAllowsCallbackStop 1/1 new_or_adapted
testTcpServerDrainTracksDetachedWriter 1/1 new_or_adapted
testTcpServerFatalAcceptRejectsLaterRequests 5/5 round2
testTcpServerFatalAcceptWhileDraining 1/1 new_or_adapted
testTcpServerFatalStartReportingPreservesOriginalAndCleanupFailures 1/1 585_regression
testTcpServerForceDuringListenerRetry 1/1 new_or_adapted
testTcpServerForceRacesOrdinaryStop 1/1 new_or_adapted
testTcpServerForceReleasesDetachedWriterDrain 1/1 new_or_adapted
testTcpServerHandlerConstructionCloseReentryRetainsOwnership 1/1 585_regression
testTcpServerHandlerStopJoinsPinnedAcceptAndCancelsOtherHandlers 1/1 585_regression
testTcpServerInterruptedDrainCanBeRetried 1/1 new_or_adapted, 574_matrix
testTcpServerInterruptedDrainRetriesGracefully 1/1 new_or_adapted
testTcpServerInterruptedDrainWhileJoiningAccept 1/1 new_or_adapted
testTcpServerInterruptedWriterClosesConnection 1/1 585_regression
testTcpServerLateAcceptFatalCloseReentryRetainsOwnership 1/1 585_regression
testTcpServerLateCloseFailureAfterConcurrentSuccessDoesNotReturnOwnership 1/1 585_regression
testTcpServerLateConstructionFailureReachesStop 1/1 585_regression
testTcpServerListenerCloseFailureFinishesShutdownAndRetryJoinsAccept 1/1 585_regression
testTcpServerListenerFatalCloseReentryRetainsOwnership 1/1 585_regression
testTcpServerObserverFailureReleasesAllQueuedResponses 1/1 new_or_adapted, 574_matrix
testTcpServerObserverFailuresReleaseEveryQueuedResponse 1/1 585_regression
testTcpServerPostFactoryFatalCloseReentryRetainsOwnership 1/1 585_regression
testTcpServerPropagatesFatalReaderStartFailure 1/1 574_matrix, 585_regression
testTcpServerReaderCloseReentryAcceptOrdering 1/1 585_regression
testTcpServerReaderCloseReentryDoesNotRepeatCleanup 1/1 585_regression
testTcpServerReaderFactoryReturnAfterFailedStopDoesNotRepeatClose 1/1 585_regression
testTcpServerReaderFinallyFatalCloseReentryRetainsOwnership 1/1 585_regression
testTcpServerReaderInputFailurePreservesFatalCauseWhenCloseFails 1/1 585_regression
testTcpServerReaderStartFailureFatalCloseReentryRetainsOwnership 1/1 585_regression
testTcpServerReaderStartFailureStopsServer 1/1 new_or_adapted, 574_matrix
testTcpServerRecoversWhenReaderStartEffectIsUnhandled 1/1 585_regression
testTcpServerRefusalReportingPreservesOriginalAndCleanupFailures 1/1 585_regression
testTcpServerRejectsConnectionAcceptedDuringShutdown 1/1 585_regression
testTcpServerRejectsStartAfterListenerCloseFailure 1/1 585_regression
testTcpServerRejectsStartAfterStop 1/1 585_regression
testTcpServerRejectsStartFromSocketFactoryAfterStop 1/1 585_regression
testTcpServerReleaseObserverConcurrentStop 1/1 585_regression
testTcpServerReleaseObserverDoesNotWaitForSocketCleanup 1/1 585_regression
testTcpServerRetainsAcceptedSocketAfterHandlerConstructionAndCloseFail 1/1 585_regression
testTcpServerRetainsDisconnectSocketAfterReentrantFatalClose 1/1 585_regression
testTcpServerRetainsLateAcceptedSocketWhenCloseFails 1/1 585_regression
testTcpServerRetainsPushWatchdogSocketAfterReentrantFatalClose 1/1 585_regression
testTcpServerRetainsSocketWhenReaderCleanupAlsoFails 1/1 585_regression
testTcpServerRetainsUndeliverableResponseSocketAfterReentrantFatalClose 1/1 585_regression
testTcpServerRetainsWriterFailureSocketAfterReentrantFatalClose 1/1 585_regression
testTcpServerRetriesAcceptedSocketCloseFailure 1/1 585_regression
testTcpServerRetriesCloseAfterReaderFactoryFailure 1/1 585_regression
testTcpServerRetriesStartAfterSocketCreationFailure 1/1 585_regression
testTcpServerRetriesUncheckedAcceptedSocketCloseFailure 1/1 585_regression
testTcpServerStopAggregatesEveryPhysicalCleanupFailure 1/1 585_regression
testTcpServerStopAndJoinsOwnedAcceptThread 1/1 new_or_adapted, 574_matrix
testTcpServerStopBeforeStartIsTerminal 1/1 585_regression
testTcpServerStopCancelsMixedQueuedAndRunningRequestHandlers 1/1 neighbor
testTcpServerStopCleansConnectionsAfterUncheckedListenerCloseFailure 1/1 585_regression
testTcpServerStopDoesNotWaitForResponseInput 1/1 585_regression
testTcpServerStopFromRequestHandlerPreservesInterruptionAndReusesPort 1/1 585_regression
testTcpServerStopOwnedFatalCloseReentryRetainsOwnership 1/1 585_regression
testTcpServerStopReportsListenerCloseFailure 1/1 585_regression
testTcpServerStopReportsPostStartCleanupFailure 1/1 585_regression
testTcpServerStopUnderHandlerSaturationTerminatesAccept 1/1 585_regression
testTcpServerWriterErrorClosesConnection 1/1 new_or_adapted, 574_matrix
testTcpServerWriterObserverFailureOwnsSocketCleanup 1/1 585_regression
testTcpServiceBindingCloseNowAbortsStuckDrain 1/1 new_or_adapted, 574_matrix
testTcpServiceBindingStopAndDrainWaitsForHandlers 1/1 new_or_adapted, 574_matrix
testTcpServiceBindingStopAndDrainWaitsForWriterSettlement 1/1 new_or_adapted, 574_matrix
testTcpServiceBindingStopAndJoinIgnoresUnrelatedThread 1/1 new_or_adapted, 574_matrix

Operational notes

All tests ran locally one invocation at a time. No remote suite was submitted. The checkout already had ignored jars/coursier -> /usr/local/bin/coursier; no launcher edit was needed. No jars, caches, test outputs or logs were committed. The single source branch contains all implemented work; this service body preserves the proposed patch and full failure evidence instead of adding test artifacts to the repository or pushing an extra branch. Harness records are SCRATCH/out/l96-fix574r2-findings.md, l96-matrix-plan.json, l96-matrix-results.json, l96-matrix-progress.log, l96-proposed-classification-admission.patch and the updated l75-recon574-pr-draft.md. SCRATCH was /tmp/claude-501/-code/ca89812b-bfcc-4ad0-91ea-9366a832809d/scratchpad.

No status reports yet.

Completed Sep 24, 2026 · 06:42 UTC This handoff is read-only in ArchiveArea.