Todo2code already contains the three underlying deterministic boundaries and exports their modules from the package root. The missing part is a uniform, discoverable product-level facade: AST takes an options object, configuration takes a positional root, and documentation requires callers to resolve files themselves. None of those names expresses that its result is a valid but source-limited Intent DSL document.
The smallest compatible change is to add one named facade in each owning extractor module. Each facade delegates to the mature extractor, validates the complete returned record array with the existing strict runtime validator and preserves warnings and cache evidence. This avoids duplicating parsing or creating dependencies between the three adapters.
The Wellmanifest review sharpens that boundary. ExtractionResult is an
adapter envelope, while each records element is the canonical
t2c.intent/v1 JSON document. SSOT requires delegation plus parity rather than
copied converters; Modularity requires acyclic adapter dependencies and one
contract owner; DSL and POA require descriptive output with no authority or
execution effect. Env DSL is currently uncommitted and blocked, so only its
safe data/no-evaluation direction is applicable. Exact evidence and adoption
limits are in STANDARDS.md.
code2dsl({ root }, config) beside the AST coordinator.docs2dsl({ root, files?, patterns?, excludes? }, config), resolving
patterns only when explicit files are absent.config2dsl({ root }, config) beside the configuration extractor.T2CConfig at every facade so deterministic extraction
never imports or reads ambient provider/secret environment configuration;
fail closed when the root or emitted DSL is invalid..env secret material remains outside configuration DSL
extraction and that no adapter imports another.npm run verify (including module boundaries),
./project/governance-check.sh and make docker-smoke.IN_PROGRESS / EDIT before touching implementation.T2CConfig and validates the
emitted t2c.intent/v1 records before returning the unchanged envelope..env non-disclosure.npm run verify, including the transitive
no-LLM and module-boundary gates; passed governance, Docker smoke and diff
checks. The existing JDK-only Java test remained skipped on this host.IN_PROGRESS / PUBLICATION; protected exact-head review and
merge are intentionally not claimed by this ticket-local validation.origin/main so the approved plan and intent.json are committed
first, implementation follows in a separate commit, and this remediation is
last; no product bytes changed during the history repair.944288f8c6a458ccc26d1d7c13217b84414edbb7.main@24ca3a13f0529da99f56ff06b6e992bb34c1dff3 and verified automatic remote
implementation-branch deletion.DONE / DONE only in this governance-only follow-up from integrated
main.verify:no-llm because its
runtime getConfig import reached OPENROUTER_API_KEY. The corrected public
contract requires explicit config and restores the deterministic boundary.