docs/ios-development.md records the decision to keep ARKit/SceneKit in Swift, and gives an instruction alongside it:
Phase 9 recommendation: keep ARKit and SceneKit in Swift permanently. … Zig-native is a means, not an end, and five actions of SceneKit glue is where it stops paying. Declare the boundary in
capability_registry.zigwith areason.
The declaration was never written. grep -rn "startAR\|getARPlanes" packages/zig/src/ finds the five actions only in ios_config.zig's negative-space assertion; capability_registry.zig has no AR entry at all.
Why it matters more than tidiness
For startAR, stopAR, getARPlanes, placeARObject and removeARObject, the doc is the only record anywhere that the omission is deliberate. An action that is absent from every A block and absent from the registry is indistinguishable from one nobody has gotten to yet — which is exactly how #114 found five entries sitting on a "permanently Swift" list years after they had been migrated.
capability_registry.zig already carries reason strings for this purpose (see the marketplace entry, declared .unrouted precisely so it does not stay invisible).
What this needs
An entry declaring the five AR actions with a reason naming the SceneKit judgement, so the boundary lives in the code that the conformance tooling reads rather than in a prose document that has already proven it can drift.
Related: #114 corrected the doc these reasons currently live in.