fix: address all open issues (33 issues)#66
Merged
Conversation
Addresses these open issues with the noted change: - #23 sessions map key stability: key sessions by stable pendingKey() so removeSession() finds the entry after handshake flips the id. - #24 concurrent submit correlation: pendingSubmits is now a FIFO Deque keyed by request order; submitLock serializes put-and-send. - #25 transport failAll path: failAll() drains every outstanding future and live subscription on transport error, unexpected onComplete, and heartbeat loss. - #26 list_jobs pagination: server respects req.limit() and req.cursor() with stable ordering by (createdAt, jobId); cursor is opaque url-safe base64. - #27 canonical idempotency fingerprint: SHA-256 over canonical JSON of (agent, input, lease_request, lease_constraints, max_runtime_sec) replaces the 32-bit hashCode payload hash. - #28 SubmissionPublisher executor lifecycle: MemoryTransport, WebSocketTransport, ReplayingPublisher, and ArcpClient.subscribe now own their virtual-thread executors and shut them down on close. - #29 close() respects external executor ownership: ArcpRuntime and ArcpClient track owned vs externally supplied scheduler/workerPool and only shut down the ones they created. - #30 empty feature set: safeFeatureCopy(Set.of()) returns an empty EnumSet instead of throwing IllegalArgumentException. - #31 advertised exposes mutable state: ArcpRuntime.advertised is wrapped in Collections.unmodifiableSet at construction. - #32 Session/Page mutable aliases: compact constructors defensively copy collection components into immutable views. - #34 partial Javadoc on named public APIs. - #35 Capabilities Javadoc now accurately documents drop behavior. - #36 CONFORMANCE.md stdio + version 1.1 entries refreshed. - #37 BudgetCounters Javadoc corrected to describe void semantics. - #38 WebSocket middleware send synchronization: writeLock added to Spring, Jakarta, Vert.x, and Jetty WebSocket transports. - #42 WebSocketTransport pre-attach frame race: listener captures transport directly and buffers inbound frames; send() gates on socket attachment. - #43 ReplayingPublisher Reactive Streams §1.9: onSubscribe is the first downstream signal; live items queued during replay. - #46 LeaseGuard regex cache: per-guard ConcurrentHashMap caches compiled glob Patterns; matchesCached used on the hot path. - #47 JobRecord credentials atomic ops: synchronized lock around credentials list; drainCredentials, replaceCredential, and setCredentials are atomic. - #48 BearerVerifier constant-time compare + SHA-256 acceptAny. - #50 SessionLoop shutdown atomic: phase is now AtomicReference; only the first caller runs cleanup. - #51 ArcpOtel guards extensions cast: returns envelope unchanged when extensions exists but is not an object. - #52 ArcpMapper.shared Javadoc revised to document mutable contract. - #53 fromWire lookup maps: O(1) BY_WIRE maps replace stream walks on Message.Type, EventBody.Kind, and Feature. - #55 IdempotencyStore scheduled prune: prune moved off the claim hot path; runs every minute under the runtime's scheduler. - #56 FileCredentialRevocationStore durable journal: long-lived RandomAccessFile in rwd mode with explicit FD sync per append. - #57 ArcpClient.listJobs typed exceptions: declared InterruptedException, TimeoutException, ArcpException; restores interrupt flag. - #59 ArcpClient.subscribe idempotent: JOB_SUBSCRIBE sent only on publisher insert; unsubscribe() closes local publisher and notifies the runtime. Server-side handleSubscribe is idempotent. - #60 CredentialBinding retry/backoff: narrowed catch, log full cause, exponential sleep between attempts, markRevocationFailed. - #61 JobRecord.subscribers encapsulation: unmodifiable view + addSubscriber/removeSubscribersWhere mutators. - #63 MemoryTransport.pair record: typed Pair(runtime, client) replaces the array return; all callers updated. - #64 WebSocketTransport HttpClient close: HttpClient stored as field and closed in close() to release selector threads. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Apply the jacoco plugin to every java-library subproject so every test task is finalized by jacocoTestReport with XML and HTML output. Coverage threshold enforcement (#33 80% target) is left as follow-up — the plumbing is in place so further test additions raise the headline number incrementally. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
| * Note that revocation failed for this credential after exhausting retries. Default | ||
| * implementation is a no-op so existing implementations continue to compile. | ||
| */ | ||
| default void markRevocationFailed(CredentialId id, Throwable cause) { |
| * Note that revocation failed for this credential after exhausting retries. Default | ||
| * implementation is a no-op so existing implementations continue to compile. | ||
| */ | ||
| default void markRevocationFailed(CredentialId id, Throwable cause) { |
This was referenced May 24, 2026
Closed
Closed
This was referenced May 24, 2026
Closed
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
Addresses 30 of the 33 open issues across correctness, concurrency, performance, API ergonomics, and docs in a single bundled PR. See commit message for the full per-issue change list.
Fixed (closes when merged)
Partial / not fully addressed in this PR
SessionHello.resumeToken; this is a deeper architectural change requiring a runtime-scoped resumable-session registry. The hello plumbing is unchanged; this issue should remain open after merge.Test plan
./gradlew compileJava compileTestJavapasses./gradlew testpasses — all existing + new tests green🤖 Generated with Claude Code