The typed e.ctx for a hook that declared needs: N — ONLY the declared facts
are present (built-in name → its typed value, inline → string), so reading an
undeclared one is a tsc error (the typed-purity trick). With N = readonly []
the ctx is empty. The default readonly ProviderName[] is the erased runtime
shape (built-ins only — an inline string name would force an index signature
that clashes with git.isDirty: boolean; concrete authored inline names are
literals, so they never clash).
The typed
e.ctxfor a hook that declaredneeds: N— ONLY the declared facts are present (built-in name → its typed value, inline → string), so reading an undeclared one is atscerror (the typed-purity trick). WithN = readonly []the ctx is empty. The defaultreadonly ProviderName[]is the erased runtime shape (built-ins only — an inlinestringname would force an index signature that clashes withgit.isDirty: boolean; concrete authored inline names are literals, so they never clash).