CNA-GAP-003: CNA::Runtime and CNA::RuntimeOptions are declared in CNA/Misc.hpp but not implemented
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.
The runtime module's public include path declares a CNA::Runtime subsystem facade with documented behaviour, but no translation unit defines it, so any call fails to link; CNA knows and guards the fact with a CMake check.
- Identifier
CNA-GAP-003- Category
- Functional gap
- Subsystem
- Core & runtime
- 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::Runtime::Initialize(const RuntimeOptions&), Shutdown(), IsGraphicsEnabled(), IsAudioEnabled(), IsInputEnabled(); CNA::RuntimeOptions
Expected behaviour
A class in a header on the module's public include path, documented as managing “the lifetime of the CNA runtime and its subsystems”, either works or says that it does not exist yet.
Actual behaviour at TARGET
CNA/Misc.hpp declares RuntimeOptions (four flags) and Runtime with five methods and Doxygen describing working behaviour. No source defines them and no translation unit includes the header, so a program that calls any method fails at link time. The C API records the rows as not applicable because the facade "is declared and defined nowhere". The CApi_UnimplementedRuntimeFacade CTest test (CheckUnimplementedRuntimeFacade.cmake, which runs nm over the runtime archive) fails the day CNA::Runtime:: symbols appear, so the gap is known and guarded; that test is defined only in builds configured with CNA_BUILD_C_API, which is off by default, and it fails a test run rather than the build. The header itself does not say the facade is unimplemented. Game is the working startup boundary.
Source locations
modules/runtime/include/CNA/Misc.hpp— RuntimeOptions and Runtime declarations with Doxygenmodules/c-api/cmake/CheckUnimplementedRuntimeFacade.cmake— nm check that CNA::Runtime defines no symbolstools/c-api/coverage_mappings.json— rule 'cna-runtime-facade': rows not applicable because the facade is unimplemented
Evidence
Checked by reading Misc.hpp, CheckUnimplementedRuntimeFacade.cmake and the coverage mapping at 009d40f5, and by searching the tree for includes of the header and for definitions of the methods (none). CNA's own check inspects the compiled runtime archive with nm; it was not run here.
Independent re-verification: Checked by reading Misc.hpp, CheckUnimplementedRuntimeFacade.cmake, its add_test registration in CMakeLists.txt and the coverage mapping at 009d40f5, and by searching the tree for includes of the header and for definitions of the methods (none). CNA's own check inspects the compiled runtime archive with nm; it was not run here.
Focused reproduction
Illustrative: CNA::Runtime r; r.Initialize({}); compiles against the header and fails to link with an undefined reference to CNA::Runtime::Initialize.
Current tests
The CMake check above is the only guard; no unit test covers the facade because there is nothing to call.
Regression test
If the facade is implemented: unit tests for each flag and the C API rows the coverage mapping marks not applicable. If it is removed: the header disappears and the CMake check and mapping rule go with it.
Blast radius
Only code that tries to use CNA::Runtime or CNA::RuntimeOptions; nothing in CNA does. The failure is a link error, never a runtime misbehaviour.
Workaround
Use Game (or the C API's game handle) as the startup and shutdown boundary.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Architecture
- Runtime lifecycle: startup
- Reference
- Public headers: runtime module
- Known issues
- Functional gap index