User Story
As a developer, in order to quickly locate every LLM integration point and understand each service’s public interface, I want the catalog to surface LLM touchpoints explicitly and each service to “scream” its intent through a clear public entrypoint that the catalog can link to on GitHub.
Preconditions
- Architecture principles (P1–P4) documented in
catalog/architecture/software-architecture.md - Services currently under
src/services/*with per-servicetypes.tsbut no consistent “public API” file - Catalog already has architecture, decisions, and experiments sections
Acceptance Criteria
- New catalog page (e.g.
catalog/architecture/llm-integrations.md) enumerates every LLM touchpoint (extraction, shaping, evaluation/judge, conversational filling, future RAG) with deep links to the relevant GitHub source lines - Each service under
src/services/*has a single, obvious public-interface entrypoint (e.g.index.tsre-exports, or a documented convention) so a reader sees the service’s intent without scanning every file - The software-architecture doc is updated to describe the “service public interface” convention, reinforcing P1 (intent over mechanism)
- Internal helpers are clearly internal: imports from other layers route only through each service’s public entrypoint (enforced by
test/architecture/dependency-rule.test.tsor a sibling test) - Catalog pages that describe a service or experiment link to the service’s public entrypoint on GitHub (permalinked to a commit or tag where practical)
- A short “how to navigate this codebase” section exists in the catalog (system-overview or a new page) that names the convention and points at the LLM-integrations page as an example
- No behavior change: all existing tests and
bun run checkpass
Success Metrics
- A developer new to the project can list every LLM call site from the catalog in under 5 minutes
- Service directories read as a list of intents (one entrypoint per service), not a flat pile of files
- Cross-service imports reference only the public entrypoint of the target service
Notes
- Framing: this is a “screaming architecture” pass focused on service public interfaces, not a rewrite. Prefer moving/renaming and re-exports over refactors.
- Consider whether the convention is
src/services/<name>/index.ts(re-exports) or a named file likesrc/services/<name>/<name>.ts. Pick one and document why. - Good candidate services to audit first:
forms/(many files — resolver, session, submission, shaping, filling, etc.),extraction/,evaluation/,data-collection/ - LLM-integrations catalog page should cross-reference the experiment roadmap (
catalog/experiments/_roadmap.md) so readers can trace from a variant back to the code that runs it - GitHub links should use the
flexion/forms-labrepo with line ranges; prefer permalinks tomainunless pinning to a commit is needed - Consider adding a dependency-rule test that forbids deep imports across service boundaries once the entrypoint convention is established
- Start this work after the first round of experiment stories merges to main
Definition of Done
- Acceptance criteria met
- Threat model updated if security-relevant (unlikely — navigation/docs change)
- Tests pass (including dependency-rule tests)
- Type checking passes
- CI pipeline green
- Deployed and demoable (catalog page reachable on the deployed branch)
A digital services project by Flexion