diff --git a/pr-dependencies.md b/pr-dependencies.md
index b0c3ae4f0..46e49d3f2 100644
--- a/pr-dependencies.md
+++ b/pr-dependencies.md
@@ -9,7 +9,8 @@ Snapshot: 2026-10-23. Upstream `main` is
[`301e3da`](https://github.com/swiftlang/swift-java/commit/301e3da710ede7af93e798f1ce1c7950715a5748).
Only fixes not yet merged upstream are included. Fixes are tracked primarily by
their **origin PRs in `qoncept/swift-java`**. Corresponding upstream PR numbers
-and statuses are labeled separately.
+and statuses are labeled separately. Documentation-only PRs are excluded; both
+open and merged origin proposals can be tracked here.
## Dependency graph
@@ -24,10 +25,18 @@ flowchart LR
PROTOCOL_EXT["qoncept/swift-java#2
Exclude protocol extension members
Upstream PR pending"]
ACTOR_PROPERTIES["qoncept/swift-java#4
Synchronous actor property witnesses
Upstream PR pending"]
FOUNDATION["qoncept/swift-java#5
Foundation values in protocol callbacks
Upstream PR pending"]
+ ENUM_NAMES["qoncept/swift-java#7
Noncolliding enum case record names
Upstream PR pending"]
+ OPTIONAL_CALLS["qoncept/swift-java#8
Qualified Optional convenience calls
Upstream PR pending"]
+ PROTOCOL_ADAPTERS["qoncept/swift-java#9
Shared protocol parameter adapters
Upstream PR pending"]
+ ASYNC_CANCEL["qoncept/swift-java#10
Swift task cancellation from futures
Upstream PR pending"]
end
PROTOCOL_NAMES["qoncept/swift-java#3
Consistent inherited requirement names
Upstream PR pending"]
+ PROTOCOL_DEFAULTS["qoncept/swift-java#11
Java bridges for Swift protocol defaults
Upstream PR pending"]
+ ACTOR_CONSTRAINTS["qoncept/swift-java#14
Standard constraints on actor witnesses
Upstream PR pending"]
PROTOCOL_EXT -->|"requires requirement classification"| PROTOCOL_NAMES
+ PROTOCOL_NAMES -->|"requires naming and fixtures"| PROTOCOL_DEFAULTS
+ ACTOR_PROPERTIES -->|"extends witness discovery"| ACTOR_CONSTRAINTS
```
## Origin tracking and upstream PRs
@@ -42,6 +51,28 @@ dependencies to the graph.
| [#3](https://github.com/qoncept/swift-java/pull/3) | `PROTOCOL_NAMES` | Keep requirement names consistent across Java interfaces, inherited box methods, and JNI dispatch thunks. | Not opened | `codex/fix-jni-protocol-requirement-names` | [`c47f646`](https://github.com/qoncept/swift-java/commit/c47f64619346f418d9c278743b77ed2d8756ac19) |
| [#4](https://github.com/qoncept/swift-java/pull/4) | `ACTOR_PROPERTIES` | Preserve synchronous access to explicit `nonisolated` actor properties and immutable protocol getter witnesses. | Not opened | `codex/fix-jni-actor-property-witnesses` | [`07e66d9`](https://github.com/qoncept/swift-java/commit/07e66d937526eb957ce97cf083732ee61f70d002) |
| [#5](https://github.com/qoncept/swift-java/pull/5) | `FOUNDATION` | Bridge `Data`, `Date`, `URL`, and `UUID` through JNI protocol callbacks. | Not opened | `codex/fix-jni-foundation-callbacks` | [`06061b0`](https://github.com/qoncept/swift-java/commit/06061b09f87b90cb8f9fb555539748fc7cce26d3) |
+| [#7](https://github.com/qoncept/swift-java/pull/7) | `ENUM_NAMES` | Avoid enum case record names that collide with enclosing Java types; keep payload accessors consistent. | Not opened | `codex/fix-jni-enum-case-name-collisions` | [`1e8ce49`](https://github.com/qoncept/swift-java/commit/1e8ce4963a09117396b00256234fe6d977413468) |
+| [#8](https://github.com/qoncept/swift-java/pull/8) | `OPTIONAL_CALLS` | Qualify Optional convenience calls with `self` so generated parameters cannot shadow their target methods. | Not opened | `codex/fix-wrap-java-optional-method-calls` | [`6e80f20`](https://github.com/qoncept/swift-java/commit/6e80f208defe39e63967e59cf22a633403ff1214) |
+| [#9](https://github.com/qoncept/swift-java/pull/9) | `PROTOCOL_ADAPTERS` | Reuse identical protocol-parameter adapters across overloaded initializers, methods, and free functions. | Not opened | `codex/fix-jni-protocol-parameter-overloads` | [`e133956`](https://github.com/qoncept/swift-java/commit/e1339562fa18c0364f68a67199e9374670180ca2) |
+| [#10](https://github.com/qoncept/swift-java/pull/10) | `ASYNC_CANCEL` | Forward cancellation through generated result conversion to the Swift task, preserving legacy Future behavior. | Not opened | `codex/fix-jni-async-cancellation` | [`8c2c819`](https://github.com/qoncept/swift-java/commit/8c2c819aa6dd3196f4a62b4620a5a0233d991604) |
+| [#11](https://github.com/qoncept/swift-java/pull/11) | `PROTOCOL_DEFAULTS` | Bridge supported Swift requirement defaults to Java interface default methods, including refinements and nested protocols. | Not opened | `codex/bridge-jni-protocol-default-methods` | [`08f9082`](https://github.com/qoncept/swift-java/commit/08f908272438d9d6e3e63a8421197bdd0fe6071b) |
+| [#14](https://github.com/qoncept/swift-java/pull/14) | `ACTOR_CONSTRAINTS` | Preserve synchronous actor-property witnesses when protocols inherit standard `AnyObject` or `Sendable` constraints, including `Swift.`-qualified spellings. | Not opened | `codex/fix-actor-property-standard-constraints` | [`e5d844f`](https://github.com/qoncept/swift-java/commit/e5d844ffe43cfc83e5e809e44f01758c95c16373) |
+
+### Generated-output follow-ups
+
+Origin [#13](https://github.com/qoncept/swift-java/pull/13), on
+`codex/refresh-generated-wrapper-outputs`, contains generated-output follow-ups
+for existing fixes rather than another feature node in the graph:
+
+- Include [`558e8a2`](https://github.com/qoncept/swift-java/commit/558e8a27c4bbdf16305ff1b0766b776610ee50dc)
+ with `OPTIONAL_CALLS` (origin #8). It refreshes the checked-in Optional
+ conveniences so regenerating wrappers does not change their receiver calls.
+- Include [`d479825`](https://github.com/qoncept/swift-java/commit/d479825bbe40fe5744f26586e847fe38de58405d)
+ with `FOUNDATION` (origin #5). It replaces the hand-written UUID projection with
+ its generated file, avoiding duplicate declarations after regeneration.
+
+Each follow-up applies after its corresponding fix alone. Fold it into that
+fix's upstream submission; it does not add a dependency between origins #5 and #8.
## Why these dependencies exist
@@ -50,31 +81,113 @@ dependencies to the graph.
`supportedProtocolRequirements(of:)` with it. `PROTOCOL_NAMES` builds its
overload disambiguation and declaring-interface naming on that filtered set.
Its patch requires `PROTOCOL_EXT`; it does not require `MAIN_ACTOR`.
+- **`PROTOCOL_NAMES` → `PROTOCOL_DEFAULTS`:** the default bridge must preserve
+ the declaring interface's requirement names across Java interfaces, returned
+ boxes, native thunks, and callback forwarding witnesses. It reuses the naming
+ regression fixtures introduced by origin #3, updating them for a Java default
+ method and an explicit Java override. Origin #11 therefore requires origin #3
+ for its current source and regression-test patch. Origin #2 is a transitive
+ prerequisite: `protocolDefaultMethods(of:)` uses `isProtocolRequirement` to
+ distinguish requirements from extension implementations. The graph omits the
+ redundant direct edge from origin #2 to origin #11.
- **`MAIN_ACTOR` is independent:** it annotates synchronous thunks and generic
openers and checks the caller's executor. It does not use the other fixes.
- **`ACTOR_PROPERTIES` is independent:** it adds
`SwiftFunctionSignature.nonisolatedWitnessProtocol` and reads actor properties
through that protocol. It uses neither the new protocol-requirement classifier
nor the `MAIN_ACTOR` thunk changes.
+- **`ACTOR_PROPERTIES` → `ACTOR_CONSTRAINTS`:** origin #14 extends the
+ `synchronousPropertyWitness` / `isNonisolatedProtocol` discovery introduced by
+ origin #4. It recognizes standard `AnyObject` and `Sendable` constraints,
+ including their `Swift.`-qualified spellings, without bypassing isolation on
+ locally declared protocols with the same names. Its extraction, generator,
+ and runtime regressions extend the actor-property fixtures from origin #4.
+ Origin #14 requires origin #4, but not `MAIN_ACTOR`, the protocol naming/default
+ chain, or any other independent fix.
- **`FOUNDATION` is independent:** it extends the existing callback conversions
and adds the `JavaUtilUUID` runtime projection. It does not require protocol
extension filtering, requirement-name changes, or either isolation fix.
+- **`ENUM_NAMES` is independent:** it changes enum case record naming and
+ associated payload accessor names. It does not use protocol callback or async
+ task machinery.
+- **`OPTIONAL_CALLS` is independent:** it changes `JavaClassTranslator`'s
+ `wrap-java` Optional conveniences, independently of the `jextract` fixes.
+- **`PROTOCOL_ADAPTERS` is independent:** it tracks identical generated wrapper
+ declarations in `emittedProtocolParameterWrappers`, using protocol adapters
+ already present upstream. Requirement classification, inherited naming, and
+ default-method bridges are not prerequisites.
+- **`ASYNC_CANCEL` is independent:** it adds `SwiftCompletableFuture`,
+ `_JNIAsyncTask`, and cancellation forwarding to the existing JNI async lowering.
+ The synchronous MainActor checks, actor property witness selection, and
+ protocol fixes are not prerequisites.
+- **`PROTOCOL_DEFAULTS` does not require origin #7–#10:** its native companions
+ and receiver adapters have distinct helper names. It does not rely on the
+ overload-adapter deduplication in origin #9 or the task runtime in origin #10.
+ Its nested-interface projection, `Int`/`long` conversions, and refined-protocol
+ forwarding witnesses are included in origin #11 itself. Foundation callback
+ values from origin #5 are an additional capability, not a prerequisite for
+ default bridges using the already-supported value types.
+
+## Patch applicability checks
-These relationships were checked against the source patches. The four
-independent patches each pass `git apply --check` against upstream `301e3da`.
-`PROTOCOL_NAMES` does not apply to that baseline alone, and passes the same check
-after applying `PROTOCOL_EXT`. Patch applicability supports the source analysis;
-it is not a substitute for compiling and testing each upstream submission.
+These relationships were checked against the source patches and the source
+commits above. Each check starts with a temporary Git index containing upstream
+`301e3da`. Prerequisites are applied with `git apply --cached`, followed by
+`git apply --cached --check` for the proposed patch; the working tree is unchanged.
+
+| Proposed origin patch | Prerequisites applied first | Result |
+| --- | --- | --- |
+| #1, #2, #4, #5, #7, #8, #9, #10 (each checked separately) | None | Pass |
+| #5 plus its UUID output follow-up from #13 | None; apply #5, then `d479825` | Pass |
+| #8 plus its Optional output follow-up from #13 | None; apply #8, then `558e8a2` | Pass |
+| #3 | None | Does not apply |
+| #3 | #2 | Pass |
+| #11 | None | Does not apply |
+| #11 | #2 only | Does not apply; the naming regression fixtures from #3 are absent |
+| #11 | #2, then #3 | Pass |
+| #14 | None | Does not apply; witness discovery and actor-property fixtures from #4 are absent |
+| #14 | #4 | Pass |
+
+Patch applicability supports the source analysis; shared context alone does not
+create a semantic prerequisite. These checks are not a substitute for compiling
+and testing each upstream submission. Regenerate bindings and run the relevant
+Swift and Java tests after adapting each patch to its eventual upstream base.
## Upstream submission order
-1. `MAIN_ACTOR` is already submitted as upstream #938. `PROTOCOL_EXT`,
- `ACTOR_PROPERTIES`, and `FOUNDATION` can each be submitted against upstream
- `main` without waiting for #938 or for one another.
-2. Submit `PROTOCOL_NAMES` after `PROTOCOL_EXT` merges upstream, or submit it as
- a stacked PR with an explicit dependency on the upstream `PROTOCOL_EXT` PR.
- Keep the naming PR's diff limited to its own changes, then rebase onto
- upstream `main` and retarget after the prerequisite merges.
+1. **Independent submissions:** `MAIN_ACTOR` (origin #1) is already submitted
+ as upstream [#938](https://github.com/swiftlang/swift-java/pull/938), which is
+ still open. Submit `PROTOCOL_EXT` (#2), `ACTOR_PROPERTIES` (#4), `FOUNDATION`
+ (#5), `ENUM_NAMES` (#7), `OPTIONAL_CALLS` (#8), `PROTOCOL_ADAPTERS` (#9), and
+ `ASYNC_CANCEL` (#10) against upstream `main` independently. They need not wait
+ for #938 or for one another. Prioritize origin #2 to unblock the protocol
+ naming/default chain; there is no required order among the other independent
+ submissions. Include the matching generated-output follow-ups from origin
+ #13 with origins #5 and #8, as described above. Since origin #4 has not been
+ submitted upstream, prefer including origin #14's `e5d844f` and its regressions
+ in the same `ACTOR_PROPERTIES` submission. This combined #4 + #14 patch needs
+ no other prerequisite.
+2. **Dependent follow-ups:** submit `PROTOCOL_NAMES` (origin #3) after the
+ upstream equivalent of origin #2 merges. If `ACTOR_CONSTRAINTS` (origin #14)
+ is submitted separately rather than included with #4, submit it after the
+ upstream equivalent of origin #4 merges. These two chains can progress
+ independently.
+3. **Protocol defaults:** submit `PROTOCOL_DEFAULTS` (origin #11) after the
+ upstream equivalent of origin #3 merges. Origin #2 must already be present
+ transitively. Origin #11 need not wait for origins #4, #5, #7–#10, or #14.
+
+If review should begin before prerequisites merge, submit the protocol work as
+an explicit stack: origin #2's upstream equivalent targets `main`, origin #3's
+upstream equivalent targets the #2 implementation branch, and origin #11's
+upstream equivalent targets the #3 implementation branch. Keep each PR's diff
+limited to its own change. After each prerequisite merges upstream, rebase the
+next dependent branch onto upstream `main`, retarget its PR, and recheck the diff
+and tests. A merge in `qoncept/swift-java` does not satisfy an upstream prerequisite.
+
+If #14 is kept separate and reviewed before #4 merges upstream, use the same
+stacking approach: #4's upstream equivalent targets `main`, and #14's upstream
+equivalent targets the #4 implementation branch until it can be rebased and
+retargeted to upstream `main`.
Shared files and merge conflicts may require rebasing; they do not by themselves
create a prerequisite. When adding a fix, record its origin PR, corresponding