skills/distribution-channel/SKILL.md
Identify and evaluate distribution channels for the ML engineer apprenticeship
npx skillsauth add sofer/.agents distribution-channelInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Evaluate and rank distribution channels for the ML engineer apprenticeship. This skill combines business context configuration with optional data from Notion and Postgres to produce informed, prioritised channel recommendations suited to a sole operator.
Before executing, read the required configuration:
~/.agents/config/business-context/offerings.yaml for apprenticeship details (name, description, audience, USPs, pricing)~/.agents/config/business-context/company.yaml for company context (optional but useful for positioning)offerings.yaml is missing, stop and report: "Required config not found: ~/.agents/config/business-context/offerings.yaml. This file must contain at least one offering with details about the ML apprenticeship."offerings.yaml exists but all offering fields are empty, stop and report: "The offerings config at ~/.agents/config/business-context/offerings.yaml needs to be populated with actual apprenticeship details (name, audience, USPs)."From the loaded offerings.yaml, identify the ML engineer apprenticeship offering. If there are multiple offerings, select the one that most clearly relates to ML engineering or apprenticeships. Note the following details for use in evaluation:
If Notion is available and not explicitly excluded, search for existing documentation that could inform channel selection.
Use mcp__claude_ai_Notion__notion-search with the following queries (run each separately):
"distribution strategy" or "distribution channels""marketing" combined with the offering name"campaign results" or "signup sources"For each search:
mcp__claude_ai_Notion__notion-fetch to retrieve the full content of each relevant pageIf the Notion MCP server is unavailable (tools mcp__claude_ai_Notion__notion-search or mcp__claude_ai_Notion__notion-fetch are not accessible), note this and proceed without Notion data. Do not treat this as a fatal error.
If searches return no relevant results, note this and proceed.
If Postgres is available and not explicitly excluded, query for historical signup and channel performance data.
Check credentials: Verify that database connection credentials are available from environment variables (DATABASE_URL, or the combination of PGHOST, PGDATABASE, PGUSER, PGPASSWORD). If credentials are not set, note that Postgres is unavailable and proceed to step 4.
Inspect schema: Run the following query via psql (or a Postgres MCP server if available):
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
ORDER BY table_schema, table_name;
Look for tables related to signups, leads, campaigns, or channel tracking. If relevant tables exist, inspect their columns:
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = '{table}'
ORDER BY ordinal_position;
Query signup data: If tables with signup or channel data exist, query for:
Apply a LIMIT 100 to all queries. Use --csv --no-psqlrc -v ON_ERROR_STOP=1 flags with psql.
Read-only only: Execute only SELECT queries. Never execute INSERT, UPDATE, DELETE, DROP, ALTER, TRUNCATE, CREATE, or any other write operation.
If Postgres is unreachable, credentials are missing, or the schema contains no relevant tables, note this and proceed to step 4. Do not treat this as a fatal error.
Using the data gathered from the previous steps, evaluate distribution channels across these dimensions:
| Dimension | Description | Weight | |---|---|---| | Audience fit | How well does this channel reach the target audience? | High | | Effort | How much time does this require from a sole operator? | High (lower is better) | | Estimated reach | How many potential signups could this channel generate? | Medium | | Cost | What is the financial outlay? | Medium | | Historical performance | What does past data say about this channel? | High (when available) |
For each channel, produce:
When ranking:
Aim for 5-10 channel recommendations. Include a mix of organic, paid, and community-based channels where appropriate for the audience.
Present the results in the format described in the output format section below.
~/.agents/config/business-context/offerings.yaml is missing or empty, stop and report the expected path and what it should containdata_sources_used and proceed without Notion datadata_sources_used and proceed without historical dataReturn the following structured output:
List every source that informed the recommendations:
offerings.yaml)If a focus constraint was provided, state it here. Otherwise omit this section.
Present as a ranked list. For each channel:
**Rank N: Channel name**
- Rationale: Why this channel suits the ML apprenticeship audience
- Estimated reach: Qualitative or quantitative estimate
- Effort: What the operator needs to do and how much time it takes
- Cost: Financial estimate
- Historical performance: What the data shows (or "No historical data available")
A brief (2-3 sentence) summary of the overall recommendation: which channels to prioritise first and why, given the operator's constraints.
tools
Check whether Claude and Codex have equivalent access to shared agent resources, skills, hooks, plugins, MCP servers, permissions, startup behaviour, and provider-specific adapter config. Use when comparing agent environments, debugging missing capabilities after restart, or deciding whether to symlink a resource or configure a runtime.
testing
Record substantive skill use in an append-only local log. Use after choosing or invoking a non-system skill for real work, when a skill is inspected but not used, or when a skill fails to apply. Do not use for routine system skills or incidental file reads.
testing
Turn a vague or underspecified request into a self-contained problem statement. Use when the user has a rough idea, when a request would fail if handed directly to an agent, or before non-trivial work that needs shared understanding.
data-ai
Append a one-line learning to ~/.agents/learning-log.md. Use when the user types /learning, or when something genuinely worth remembering surfaced during work and the user confirms it should be captured.