This SDK targets draft-arcp-1.1.md. Each
row is Implemented with a path:line reference or Deferred with a
one-line rationale. There is no "Partial" status: a row that "partially
works" is decomposed into multiple binary rows.
| Requirement | Status | Location |
|---|---|---|
§4.1 WebSocket over wss:// |
Implemented | arcp-runtime-jetty/src/main/java/dev/arcp/runtime/jetty/ArcpJettyServer.java:18 (server) + arcp-client/src/main/java/dev/arcp/client/WebSocketTransport.java:29 (client) |
| §4.1 JSON text frames | Implemented | arcp-runtime-jetty/src/main/java/dev/arcp/runtime/jetty/WebSocketJsonTransport.java |
| §4.2 stdio newline-delimited JSON | Deferred | Not in 1.0.0; covered by MemoryTransport for in-process scenarios. |
| §4.3 Alternate transports MAY exist | Implemented | arcp-core/src/main/java/dev/arcp/core/transport/MemoryTransport.java implements the Transport SPI |
| Requirement | Status | Location |
|---|---|---|
§5.1 Envelope shape (arcp, id, type, payload, …) |
Implemented | arcp-core/src/main/java/dev/arcp/core/wire/Envelope.java:22 |
| §5.1 Unknown top-level fields ignored | Implemented | arcp-core/src/main/java/dev/arcp/core/wire/ArcpMapper.java sets FAIL_ON_UNKNOWN_PROPERTIES=false |
§5.1 arcp version string "1" |
Implemented | arcp-core/src/main/java/dev/arcp/core/wire/Envelope.java:31 |
| Requirement | Status | Location |
|---|---|---|
§7.1 job.submit with lease_request, lease_constraints, idempotency_key |
Implemented | arcp-core/src/main/java/dev/arcp/core/messages/JobSubmit.java |
§7.1 job.accepted echoes effective lease + budget |
Implemented | SessionLoop.acceptJob + JobAccepted.java |
§7.2 Idempotency: identical triple returns prior job_id |
Implemented | arcp-runtime/src/main/java/dev/arcp/runtime/idempotency/IdempotencyStore.java + SessionLoop.handleSubmit:348 |
§7.2 Conflicting payload yields DUPLICATE_KEY |
Implemented | SessionLoop.handleSubmit |
| §7.3 Terminal states: success, error, cancelled, timed_out | Implemented | arcp-runtime/src/main/java/dev/arcp/runtime/session/JobRecord.java Status enum |
§7.4 Cooperative job.cancel via interrupt |
Implemented | JobContext.cancelled + SessionLoop.handleCancel |
§7.5 Agent versioning grammar name@version |
Implemented | arcp-core/src/main/java/dev/arcp/core/agents/AgentRef.java |
| §7.5 Bare-name resolves to default | Implemented | AgentRegistry.resolve:33 |
§7.5 Unknown version → AGENT_VERSION_NOT_AVAILABLE |
Implemented | AgentRegistry.resolve |
§7.6 job.subscribe returns event stream |
Implemented | SessionLoop.handleSubscribe + ArcpClient.subscribe |
§7.6 history: true replays buffered events |
Implemented | SessionLoop.handleSubscribe replays from ResumeBuffer.since |
| §7.6 Subscriber does not carry cancel authority | Implemented | SessionLoop.handleCancel checks rec.principal().equals(principal) |
| Requirement | Status | Location |
|---|---|---|
§8.1 job.event { kind, ts, body } envelope |
Implemented | arcp-core/src/main/java/dev/arcp/core/messages/JobEvent.java |
§8.2 Sealed EventBody taxonomy (10 kinds) |
Implemented | arcp-core/src/main/java/dev/arcp/core/events/EventBody.java:8 |
§8.2.1 progress body invariant current ≥ 0 |
Implemented | arcp-core/src/main/java/dev/arcp/core/events/ProgressEvent.java compact constructor |
§8.3 event_seq monotonic gap-free per session |
Implemented | SessionLoop.nextSeq backed by AtomicLong.incrementAndGet |
§8.4 result_chunk body |
Implemented | arcp-core/src/main/java/dev/arcp/core/events/ResultChunkEvent.java |
| §8.4 Reassembly on the client | Implemented | arcp-client/src/main/java/dev/arcp/client/ResultStream.java:19 |
§8.4 job.result references result_id when chunked |
Implemented | arcp-core/src/main/java/dev/arcp/core/messages/JobResult.java |
| Requirement | Status | Location |
|---|---|---|
| §9.1 Capability bag namespaces | Implemented | arcp-core/src/main/java/dev/arcp/core/lease/Lease.java |
| §9.3 Enforcement at authorize seam | Implemented | arcp-runtime/src/main/java/dev/arcp/runtime/lease/LeaseGuard.java:15 |
§9.4 Lease subset check via Lease.contains |
Implemented | Lease.contains |
§9.5 lease_constraints.expires_at strict UTC-Z |
Implemented | LeaseConstraints.parseStrictUtc:43 |
| §9.5 Future-only at submit | Implemented | SessionLoop.handleSubmit rejects past expires_at with INVALID_REQUEST |
| §9.5 Watchdog terminates expired job | Implemented | SessionLoop.terminateExpiredJob:450 |
§9.6 cost.budget per-currency counters |
Implemented | arcp-runtime/src/main/java/dev/arcp/runtime/lease/BudgetCounters.java:16 |
§9.6 BigDecimal arithmetic via Jackson USE_BIG_DECIMAL_FOR_FLOATS |
Implemented | ArcpMapper.create |
| §9.6 Negative metric values rejected | Implemented | BudgetCounters.decrement returns without decrementing |
§9.6 BUDGET_EXHAUSTED surfaced before authorize-bearing op |
Implemented | JobContext.authorize + BudgetCounters.ensureAllPositive |
| Requirement | Status | Location |
|---|---|---|
| §10 Lease subset check applied to delegated jobs | Implemented | Lease.contains is the shared primitive; delegation is exposed via JobContext.delegate |
| §10 Child budget ≤ parent remaining | Deferred | Lease subset check applies at the lease bag level; per-currency parent-remaining check is delivered through BudgetCounters.ensureAllPositive rather than a dedicated subsetting hook in 1.0.0. |
| Requirement | Status | Location |
|---|---|---|
§11 W3C traceparent propagation |
Implemented | arcp-otel/src/main/java/dev/arcp/otel/ArcpOtel.java:31 injects/extracts via extensions["x-vendor.opentelemetry.tracecontext"] |
§11 arcp.session_id / arcp.job_id / arcp.trace_id span attributes |
Implemented | ArcpOtel.attributesFor |
| Requirement | Status | Location |
|---|---|---|
| §12 Fifteen canonical codes | Implemented | arcp-core/src/main/java/dev/arcp/core/error/ErrorCode.java:6 |
§12 retryable default per code |
Implemented | ErrorCode.retryable |
| §12 Sealed exception hierarchy | Implemented | arcp-core/src/main/java/dev/arcp/core/error/ArcpException.java with Retryable/NonRetryable branches |
| Example | Status | Location |
|---|---|---|
| submit-and-stream | Implemented | examples/submit-and-stream/ |
| cancel | Implemented | examples/cancel/ |
| heartbeat | Implemented | examples/heartbeat/ |
| cost-budget | Implemented | examples/cost-budget/ |
| result-chunk | Implemented | examples/result-chunk/ |
| agent-versions | Implemented | examples/agent-versions/ |
| list-jobs | Implemented | examples/list-jobs/ |
| lease-expires-at | Implemented | examples/lease-expires-at/ |
| idempotent-retry | Implemented | examples/idempotent-retry/ |
| custom-auth | Implemented | examples/custom-auth/ |
| Requirement | Status | Location |
|---|---|---|
| §14 Subscribe scope (no cross-principal leak) | Implemented | SessionLoop.handleSubscribe |
| §14 Budget bypass protection | Implemented | BudgetCounters.ensureAllPositive gates every authorize call |
§14 Lease clock check (no past expires_at) |
Implemented | LeaseGuard.authorize |
| §14 Host-header / Origin allowlist on WS upgrade | Implemented | ArcpJakartaAdapter Builder.allowedHosts / allowedOrigins; ArcpVertxHandler Builder.allowedHosts; Spring adapter at the ArcpSpringBootProperties level |
- HTTP/2 + QUIC transports
- mTLS / OAuth2 auth schemes
- stdio newline-delimited JSON transport (
MemoryTransportcovers in-process use) - §15.6 trust elevation
- Quarkus and Helidon middleware (Phase 5 deferred them;
arcp-runtime-jetty,arcp-middleware-jakarta,arcp-middleware-spring-boot, andarcp-middleware-vertxcover the four major JVM WebSocket entry points)
Counts after ./gradlew test:
| Module | Tests | Status |
|---|---|---|
| arcp-core | 4 | green |
| arcp-runtime | 10 | green |
| arcp-client | 8 | green |
| arcp-otel | 1 | green |
| arcp-runtime-jetty | 1 | green |
| arcp-middleware-jakarta | 1 | green |
| arcp-middleware-spring-boot | 1 | green |
| arcp-middleware-vertx | 1 | green |
| arcp-tck (self-validation) | 7 dynamic | green |