Skip to content

fix: address all open issues (33 issues)#66

Merged
nficano merged 2 commits into
mainfrom
fix/all-open-issues-2026-05-24
May 24, 2026
Merged

fix: address all open issues (33 issues)#66
nficano merged 2 commits into
mainfrom
fix/all-open-issues-2026-05-24

Conversation

@nficano
Copy link
Copy Markdown
Contributor

@nficano nficano commented May 24, 2026

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

Test plan

  • ./gradlew compileJava compileTestJava passes
  • ./gradlew test passes — all existing + new tests green
  • CI green on PR

🤖 Generated with Claude Code

nficano and others added 2 commits May 24, 2026 11:09
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) {
@nficano nficano merged commit e0aeadf into main May 24, 2026
6 checks passed
This was referenced May 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant