CNA-GAP-062: The C ABI has no route for 468 public C++ declarations that the coverage inventory records as planned

CNA snapshot 009d40f5  ·  Known Issues › Functional gaps  ·  source links pinned to 009d40f5

✓

Evidence basis: source-verified at the pinned commit; tests exist (not executed for this page). Claims on this page were checked by reading the CNA source at commit 009d40f5; unless a sentence says otherwise, nothing here was built or executed. Nothing on this page was executed unless the Evidence section says so.

COVERAGE.md records 468 in-scope public C++ declarations without a C mapping (320 runtime surface added after the binding campaign, 134 CNB Model-v2 surface, 14 smaller seams), which is why the C ABI release gate reads Not ready.

Identifier
CNA-GAP-062
Category
Functional gap
Subsystem
C API & bindings
Status
Open
Verified against
CNA 009d40f5 (009d40f5dd085c4e674d3479675fac84b12b3e0a)
Evidence basis
Source-verified: read at TARGET, not executed
Tests touching this area
Yes: see Current tests
Affected contract
CNA C ABI 0.29.0 (modules/c-api/include/CNA/C) against the public C++ surface of the modules it links

Expected behaviour

The release gate's coverage-closed criterion: every in-scope public C++ declaration has a C route, an owner-approved partial mapping, or a recorded reason for having no C form.

Actual behaviour at TARGET

COVERAGE.md records 468 planned rows: content 188, graphics 116, graphics-ext 133, input 10, math 10, runtime 11. plans/plan_binding.md assigns them to open tasks: CBIND-127 (320 rows, “predominantly the CNAEXT engine layer and the 3D graphics resources that arrived after their slices closed”, naming StorageTexture2D, Texture2DArray, Texture3D, ShaderPackageEXT, ShaderCodeEXT and their device entry points), CBIND-117 (134 rows: whether a C consumer gets the CNB Model-v2 CPU API), CBIND-122 (5 untyped XNB loading seams), CBIND-125 (5 inheritance-aware reflective-reader customisations), CBIND-120 (3 texture profile-format queries) and CBIND-121 (1 reflective shared-resource field). A C caller cannot reach these through the ABI; the C++ API provides them. The figure is the committed snapshot: it cannot be regenerated at this commit (CNA-BUG-062), and three modules are not classified at all.

Source locations

Evidence

Checked by reading COVERAGE.md and plan_binding.md at 009d40f5; the plan's row counts sum to the inventory's 468. The per-symbol matrix is generated on demand and could not be generated at this commit, so individual symbols were not listed. Not executed.

Independently observed as a separate finding (merged): docs/c-api/RELEASE_GATE.md records exactly one unmet criterion, 'No public C++ symbol is unaccounted for', with 468 public symbols still unmapped, so the 0.29.0 C ABI remains experimental at this snapshot.

Focused reproduction

No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.

Current tests

CApiCoverageMatrix and CApiReleaseGate measure the backlog; at this snapshot they fail for an unrelated reason (CNA-BUG-062).

Regression test

Each owning task closes with pure-C tests for its routes (the route-test ratchet already requires a caller), and the release gate's coverage-closed criterion turns met.

Blast radius

C and binding consumers that need the engine-layer storage/array textures, shader packages, CNB Model-v2 decoding or the smaller seams listed; the bound XNA-shaped surface is unaffected.

Workaround

Use the C++ API for those declarations, or generate build/c-api/COVERAGE_FULL.md in a tree where the generator runs to see the exact rows.

The same subject is explained at several altitudes. These are the neighbouring pages at each one.