Surfaced by closing a hole in test_reachability_shipped_callers.py (#553): __all__ entries were being counted as references, so any symbol could be made to look reachable by exporting it. Closing that exposed 26 symbols. Eleven of them are one feature.
What is unreachable
| module |
lines |
glyph/timelock.py |
290 |
glyph/timelock_reveal_tx.py |
394 |
crypto/aead.py |
220 |
crypto/kem.py |
207 |
Internally connected — kem imports aead, timelock_reveal_tx imports timelock — and not reached from anywhere outside itself.
Flagged symbols: add_timelock_to_metadata, get_unlock_remaining, is_unlocked, verify_cek_reveal, create_reveal_proof, parse_reveal_proof_script, validate_reveal_proof, encrypt_chunked, decrypt_chunked, wrap_cek_x25519, unwrap_cek_x25519.
The only outside reference is prose
glyph/encrypted_content.py:236:
Construct via :func:pyrxd.glyph.timelock.build_timelock_mint
A docstring, not a call. build_timelock_mint has no caller either, so the mint side is as unreachable as the reveal side. crypto.kem has zero importers anywhere.
Why this matters more than an unused module
There are five test files — test_glyph_timelock.py, test_glyph_timelock_e2e.py, test_glyph_timelock_reveal_tx.py, test_crypto_aead.py, test_crypto_kem.py. The feature is built and covered, so it reads as shipped. What it lacks is any path a user can reach: no CLI command, no GlyphClient method, no export in the curated pyrxd namespace.
That is the reachability class at subsystem scale — "a test that constructs the input by hand proves the mechanism; at least one test must reach the code through the production entry point" — and it stayed invisible because the scanner's registry rule swallowed __all__.
Not proposing a fix
Three defensible outcomes and the choice is a product one, not a code one:
- Wire it — a CLI command and/or a
GlyphClient method, which is what the docstring already promises users.
- Export it — deliberate
__init__ exports if it is an SDK-only surface, which also clears the allowlist entries.
- Delete it — if timelocked content was superseded, ~1,100 lines and five test files stop being maintained.
Recorded in the allowlist as debt in the meantime, deliberately loud. crypto/aead and crypto/kem may deserve separate treatment: they are general primitives that could have callers beyond this feature.
Surfaced by closing a hole in
test_reachability_shipped_callers.py(#553):__all__entries were being counted as references, so any symbol could be made to look reachable by exporting it. Closing that exposed 26 symbols. Eleven of them are one feature.What is unreachable
glyph/timelock.pyglyph/timelock_reveal_tx.pycrypto/aead.pycrypto/kem.pyInternally connected —
kemimportsaead,timelock_reveal_tximportstimelock— and not reached from anywhere outside itself.Flagged symbols:
add_timelock_to_metadata,get_unlock_remaining,is_unlocked,verify_cek_reveal,create_reveal_proof,parse_reveal_proof_script,validate_reveal_proof,encrypt_chunked,decrypt_chunked,wrap_cek_x25519,unwrap_cek_x25519.The only outside reference is prose
glyph/encrypted_content.py:236:A docstring, not a call.
build_timelock_minthas no caller either, so the mint side is as unreachable as the reveal side.crypto.kemhas zero importers anywhere.Why this matters more than an unused module
There are five test files —
test_glyph_timelock.py,test_glyph_timelock_e2e.py,test_glyph_timelock_reveal_tx.py,test_crypto_aead.py,test_crypto_kem.py. The feature is built and covered, so it reads as shipped. What it lacks is any path a user can reach: no CLI command, noGlyphClientmethod, no export in the curatedpyrxdnamespace.That is the reachability class at subsystem scale — "a test that constructs the input by hand proves the mechanism; at least one test must reach the code through the production entry point" — and it stayed invisible because the scanner's registry rule swallowed
__all__.Not proposing a fix
Three defensible outcomes and the choice is a product one, not a code one:
GlyphClientmethod, which is what the docstring already promises users.__init__exports if it is an SDK-only surface, which also clears the allowlist entries.Recorded in the allowlist as debt in the meantime, deliberately loud.
crypto/aeadandcrypto/kemmay deserve separate treatment: they are general primitives that could have callers beyond this feature.