What is actually wired up
The audit of which modules have a live entry point, and which are code the app can no longer reach.
A module existing in lib/registry.ts and having a prompt in the database does not mean a user can reach it. The app moved to a chat-first model where every capability is an agent triggered from conversation, and the older per-feature pages were left behind rather than deleted.
This page records the state as audited on 2026-07-30. Re-run the check before trusting it.
How to re-audit
Three questions, in order:
- Is the module in
AGENT_DEFINITIONS? If yes, the host can call it as a tool and it is live. - If not, does application code reference
MODULES["<slug>"].id? Internal helpers (attachment summarizer, character map, cast list, shared guidelines, image prompt engine, storyboard frames, talking-head engine) live here. - If neither, is there a route or component that calls it? And is that route reachable from navigation, or only by typing the URL?
grep -rn 'MODULES\["<slug>"\]' --include='*.ts' --include='*.tsx' lib src
Live
23 agent definitions are callable by the host as tools. Two of them (campaign-builder, storyboard-director) are in EXCLUDED_SLUGS, meaning they are not exposed as ordinary tools but are reached through their own flows: start_campaign and create_storyboard.
Internal helpers with live callers, not user-facing agents and correctly absent from the tool list:
| Module | Called by |
|---|---|
image-prompt-engine |
every image path: chat, Creative Studio, character portraits |
storyboard-frames |
the pipeline, for Route A scene frames |
talking-head-video-prompt-engine |
the talking-head engine, three callers |
character-map-prompt-engine |
the character map build |
cast-list |
propose_cast_list |
attachment-summarizer |
lib/attachment-summarizer.ts |
shared-guidelines |
lib/chat-v2/agent-runner.ts, prepended to every agent run |
campaign-visual-recommender |
the campaign chat’s visual category picker |
host |
the chat loop itself |
Not reachable
Nothing, as of this audit. Two modules were on this list and both are resolved:
viral-shortsis a host tool now. It was a good agent for organic short-form copy and the only thing wrong with it was the missing door.bulk-creativeswas removed, and then its row came back as something better. The row was never deleted (a deleted prompt is unrecoverable and history is cheap), andstatic-ad-directornow reuses its module id deliberately, because everything looks modules up by id and reviving the row kept its prompt history intact. The slug rename cost nothing.
The is_active trap
cast-list and attachment-summarizer both sat at is_active = false while being called on every run of their flow. They kept working, because the runtime prompt lookup filters on is_default only and never reads is_active.
Both flags are corrected, and the internal engines now share one utility category instead of eight one-off values. Fixing the data rather than the lookup is deliberate: making the runtime honour is_active would turn a mislabelled row into an outage.
Orphaned pages
src/routes/_app/tools/ holds ten pages from before the chat-first architecture: ad hooks, advertorial, copy analyzer, FB ads, headline master, mini VSL, pain points, viral shorts, who’s my buyer.
Only one is linked from anywhere in the app: /tools/whos-my-buyer, from the dashboard onboarding steps. The rest are reachable only by typing the URL.
The lesson from viral-shorts: an orphaned page is worth checking against the agent behind it before deleting either. The page was disposable, the agent was not.
This is duplication rather than loss: every one of those agents is a live host tool, and chat is the intended way in.
The campaign pages (/campaigns, /campaigns/$campaignId) are also absent from the sidebar, but they are not orphaned: the host’s start_campaign tool navigates into them.