The skill graph at a glance
191 skills
Procedural skills covering everything from platform scraping to fan message drafting — all stored as
.md files with YAML frontmatter.252 nodes
Skill nodes plus category nodes, plus cross-category correlation nodes. The graph has more nodes than skills because categories and correlation anchors are nodes too.
12,880+ edges
Weighted edges between skills, categories, and correlation nodes — seeded from co-occurrence data and reinforced by Hebbian decay.
DuckDB backend
The skill graph lives in
memory/core/agent_memory.duckdb. Fast, local, no server process required.Skill categories
Skills are organized into 11 categories. The first 10 cover general development and infrastructure domains. Category 11 —11-genie-user-skills — contains the platform-specific skills that power the GenieHelper agent’s day-to-day work:
01 · Content scraping
01 · Content scraping
Skills for pulling data from OnlyFans, Fansly, and other platforms. Covers
scrape-platform-content, capture-platform-cookies, and check-scrape-status. These are the skills the agent hydrates when a creator asks to pull their stats or sync their subscriber list.02 · Media management
02 · Media management
Upload, process, search, and download media assets. Covers the FFmpeg pipeline, watermarking jobs, teaser clip creation, and thumbnail generation. Hydrated when the agent handles media ingest or processing requests.
03 · Publishing
03 · Publishing
Schedule posts, publish immediately, generate captions, and surface content ideas. Covers the full editorial pipeline from
suggest-ideas through publish-post-now. The most frequently hydrated category for content-focused sessions.04 · Platform connect
04 · Platform connect
Connect, verify, and disconnect platform accounts. Handles the authentication and session management flow for OnlyFans, Fansly, Instagram, and TikTok — including HITL escalation when platforms block headless automation.
05 · Creator profile
05 · Creator profile
Create and update creator personas, manage subscription tier changes, and configure writing voice rules. Hydrated during onboarding and when a creator updates their identity configuration.
06 · Analytics
06 · Analytics
Analyze fan insights, generate analytics reports, and run taxonomy classification on historical content. Covers the full reporting surface from per-fan scoring to platform-level growth curves.
07 · User settings
07 · User settings
Configure user preferences — notification rules, automation defaults, tier limits. Hydrated when a creator adjusts their platform configuration.
08 · Communication
08 · Communication
Skills for fan messaging, template management, and broadcast campaigns. Includes
learn-user-typos — a skill that trains the agent on a creator’s specific writing style quirks so AI-drafted messages match their voice.Categories
01-10 (generic development and infrastructure skills) were purged on 2026-03-14. The canonical platform skills now live exclusively in agent-skills/11-genie-user-skills/. If you’re ingesting into DuckDB after a purge, run with --reset: python3 memory/core/ingest_skills.py --resetHow JIT hydration works
At session start — specifically when a chat request hits/api/genie/stream-chat — the server runs surgical_context.py before invoking the LLM:
surgical_context.py commands
Thesurgical_context.py script is the CLI interface to the skill graph. It is called programmatically by the server at session start, but you can also run it directly:
memory.recall MCP plugin
Thememory.recall MCP plugin exposes the skill graph to the LLM agent as a set of 4 tools. These are served by the unified genie-mcp-server (part of the 83-tool bundle):
activate_skills
The primary tool. Takes a task description string and returns the top-N most relevant skills via stimulus propagation. This is what
surgical_context.py activate calls under the hood.get_skill
Retrieves the full content of a named skill from
agent-skills/. Returns the skill’s YAML frontmatter, description, steps, and any tool-call examples.find_skills
Tag-based skill search. Returns all skills matching one or more comma-separated tags — useful when the agent knows what kind of skill it needs but not the exact name.
memory_recall
Full retrieval pipeline returning context chunks ready for LLM prompt injection. Combines BM25 sparse search, DuckDB dense activation, RRF fusion, synaptic propagation, and entropy pruning. Takes a query string and optional
max_tokens budget.The DuckDB schema
The skill graph is stored inmemory/core/agent_memory.duckdb. The schema is maintained by ingest_skills.py and seed_linkages.sql:
Ingest: agent-skills/ → DuckDB
Ingest: agent-skills/ → DuckDB
python3 memory/core/ingest_skills.py reads every .md file in agent-skills/11-genie-user-skills/, parses the YAML frontmatter (name, category, tags, description), and writes skill records into the skills table. Nodes and initial edges are derived from the category hierarchy.After ingest, run the hierarchical goosehints generator to update directory-level context files:Seed linkages: Hebbian correlation edges
Seed linkages: Hebbian correlation edges
duckdb memory/core/agent_memory.duckdb < memory/core/seed_linkages.sql populates the initial Hebbian correlation edges. These are co-occurrence pairs derived from session data — skills that tend to be useful together get a weighted edge between them.Sync to Directus
Sync to Directus
python3 scripts/directus/ingest-skills-to-directus.py mirrors the skill records to the agent_skills Directus collection. This makes skills queryable via the CMS API and available to the cms.directus MCP plugin.For a full reset and re-ingest:How this differs from preloaded skills
The distinction matters for understanding how the system scales:| Preloaded skills | JIT skill hydration |
|---|---|
| All skills injected at session start | Only relevant skills injected |
| Context window cost is constant and grows with every new skill | Context window cost scales with task complexity, not library size |
| Adding skills makes the agent slower and more expensive | Adding skills has no cost unless they are relevant to the task |
| Skill relevance depends on prompt engineering | Skill relevance is computed via graph propagation |
| Skills do not reinforce each other | Frequently co-activated skills develop stronger edges — the graph learns |
The key insight: because relevance is computed at query time rather than at system design time, you can add skills freely without degrading performance. The graph handles routing.
Automatic skill creation (in progress)
When the agent handles a request type it has not seen before — a new platform API change, an edge case in the media pipeline, a novel fan communication pattern — new skills can be drafted automatically:- The agent encounters a request it cannot fully resolve with existing skills
- A new skill is drafted to
agent-skills/11-genie-user-skills/in the 3-layer.mdformat ingest_skills.pyingests the new skill into DuckDB- The skill becomes retrievable on future sessions via
activate_skills - If the skill is activated frequently enough, Hebbian reinforcement strengthens its edges
Adding a skill manually
Skills use a 3-layer.md format with YAML frontmatter:
Related
Taxonomy system overview
The 3,205-node content taxonomy and how it connects to retrieval
Synaptic propagation
The LIF neuron model used by both the taxonomy and skill graph
Hebbian consolidation
Nightly edge weight decay and the cross-user pattern promotion pipeline
memory.recall MCP plugin
Full reference for activate_skills, memory_recall, get_skill, find_skills