CNA-GAP-062: The C ABI has no route for 468 public C++ declarations that the coverage inventory records as planned
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
docs/c-api/COVERAGE.md— Snapshot line and module summary tableplans/plan_binding.md— rows of CBIND-117, CBIND-120, CBIND-121, CBIND-122, CBIND-125, CBIND-127docs/c-api/RELEASE_GATE.md— the coverage-closed criterion, not mettools/c-api/generate_coverage_inventory.py— owner_task and planned_mappingtools/c-api/check_release_gate.py— check_coverage_has_no_planned_rows
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.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- User guide
- C API: measured coverage · C API: status
- Maintainer workflow
- Update the C API: the coverage inventory
- Known issues
- Functional gap index