Skills Documentation System
Single source of truth for both human-readable web docs and LLM agent consumption.
Architecture
skills/skills/{skill-name}/
SKILL.md # Overview + quick start (LLM entry point)
references/
{name}.md # Reference, tutorial, how-to, or explanation
Two build targets from one source:
- Web docs: Telecine reads directly, renders with MDX + convention-based component mapping
- LLM skills: strips human-only metadata, converts API metadata to prose, outputs to (gitignored build artifact)
Authoring Workflow
- Edit source files in
- Preview on web — telecine reads source directly, no build step needed
- Generate LLM files:
npx tsx scripts/generate-skills.ts
- Push to skills remote:
./scripts/push-skills [--branch name]
Steps 3-4 only needed when publishing to the LLM-consumable repository. During development, web preview validates changes immediately.
Never edit — overwritten on every build.
Frontmatter Quick Reference
SKILL.md files
| Field | Required | Survives generation |
|---|
| yes | yes |
| yes | yes |
| no | yes |
| (, ) | no | yes |
Reference files
| Field | Required | Survives generation | Purpose |
|---|
| yes | yes (as ) | Display name |
| yes | yes | Brief description |
| yes | no | | | | |
| no | no | Tree sidebar: , , |
| no | no | Topic-grouped sidebar category |
| no | no | Sort order within topic group |
| no | no | Learning path identifier |
| no | no | Position in learning path |
| no | no | Display title for track nav |
| no | no | Required reading references |
| no | no | Suggested next references |
| no | converted to prose | Structured API metadata |
| no | no | Split into multiple web pages |
For complete field documentation, see frontmatter.md.
Critical Constraints
YAML Parser Limitations
The generation script uses a
hand-rolled YAML parser (
scripts/generate-skills.ts
) that supports only:
- Top-level scalar fields ()
- One level of object nesting ()
- Arrays of objects at 4-space indent ()
- Object properties at 6+ space indent within array items
Not supported (silently produces wrong output):
- Multi-line strings ( or block scalars)
- Flow sequences inline ()
- YAML comments
- Nesting deeper than 3 levels
- Quoted keys
Always test generation locally after frontmatter changes:
bash
npx tsx scripts/generate-skills.ts
# Inspect skills/skills-generated/ to verify output
Sections-Heading Coupling
The
frontmatter references markdown H2 headings via the
field. The match must be exact. If you rename an H2, update the corresponding
.
yaml
sections:
- slug: tutorial
heading: Video Tutorial # Must match "## Video Tutorial" in body
Nav Parent Paths
uses
-delimited paths (with spaces around slash) to build the sidebar tree:
yaml
nav:
parent: "Elements / Media" # Creates: Elements > Media > this page
Misspelling a parent path creates a silently orphaned node. Check existing references for established paths before inventing new ones.
Rendering Conventions
The web renderer detects markdown patterns and upgrades them to interactive components. See conventions.md for authoring details.
| Pattern | Web rendering | LLM output |
|---|
| Interactive preview + filmstrip | Plain code block |
| Rendered Mermaid diagram | Plain code block |
| Blue callout box | Standard blockquote |
| Gold callout box | Standard blockquote |
| Attribute/Type/Description table | Enhanced PropertyDoc styling | Standard table |
| in tutorials | Step-indicator styling | Standard heading |
[references/X.md](references/X.md)
| React Router link | Relative link |
| frontmatter | Card-based ApiReference after H1 | Prose list after H1 |
Generation Transform
What
does to each source file:
- → becomes in output frontmatter
- , , → preserved
- , , , , , , , , → stripped
- → converted to prose and injected after H1:
markdown
## Attributes
- **src** (string) (required) - URL or path to video source
- **volume** (number, default: 1.0) - Audio volume
## Properties
- **sourceIn** (string) - Absolute start time
## Methods
- **play()** - Start playback
- Returns: void
## Functions
- **createRender(client, payload)** - Create a new render job
- Returns: CreateRenderResult
Markdown body is preserved unchanged.
API Metadata Types
The
frontmatter supports four sub-keys for different API surface types:
-
: HTML element attributes (e.g.,
)
- Use for: Custom elements, web components
- Fields: , , , , ,
-
: React component props (e.g.,
<Preview className="...">
)
- Use for: React components, TypeScript interfaces
- Fields: , , , , ,
-
: Instance methods on objects or elements (e.g.,
)
- Use for: Methods that exist on instances, DOM APIs
- Fields: , , ,
-
: Standalone exported functions (e.g.,
createRender(client, payload)
)
- Use for: SDK functions, utility functions, top-level exports
- Fields: , , ,
All four types render as card grids on the web and convert to indented prose lists for LLM consumption.
Key File Locations
Skills content
- — source files (edit these)
- — build artifacts (never edit, gitignored)
- — build process documentation
Build pipeline
scripts/generate-skills.ts
— generation script
- — generate + push to skills remote
Web renderer (telecine)
telecine/services/web/app/utils/skills.server.ts
— loading, nav building, section extraction
telecine/services/web/app/utils/skills-mdx-components.tsx
— convention-based MDX components
telecine/services/web/app/routes/skills/reference-detail.tsx
— reference page
telecine/services/web/app/routes/skills/skill-detail.tsx
— skill overview page + sidebar tree
telecine/services/web/app/components/skills/ApiReference.tsx
— API reference cards
telecine/services/web/app/components/skills/OnThisPage.tsx
— auto-generated TOC from H2/H3
Legacy docs (content migration source)
telecine/services/web/app/content/docs/
— MDX files to draw content from
telecine/services/web/app/components/docs/
— legacy components (Demonstration, PropertyDoc)
When Modifying the Renderer
The convention-based rendering lives in
skills-mdx-components.tsx
:
- — detects via attribute (set by plugin)
- — renders raw HTML inside Preview/FitScale/FocusOverlay/Filmstrip from
- — detects Attribute/Type/Description column headers for enhanced styling
- — detects Note/Warning prefixes for callout boxes
getSkillsMDXComponents(skillName, api?)
— returns the full component mapping; when is provided, wraps H1 to inject ApiReference
Both
and
use the shared component mapping.
- — builds tree from paths
- — builds topic groups from field
- Type ordering: tutorial → how-to → explanation → reference
Content Guidelines
Length Targets
| Type | Target | Focus |
|---|
| 60-100 lines | Attributes, basic usage, common patterns |
| ~90 lines | Step-by-step with demos, minimal intro |
| 20-40 lines | Single task, actions only, no rationale |
| 60-80 lines | Conceptual deep-dive, no code/config |
Writing Principles
One mode per document. Each file fits one
. If content belongs in another mode, link to it instead of including it. Tutorials don't explain architecture. References don't include rationale. How-tos don't teach concepts.
Don't repeat across files. If a concept is explained in one reference, link to it from others. If a sentence shares meaning with another sentence in the same document, remove one.
Neutral, technical language. Describe platform constraints and outcomes, not prescriptive commands or comparative critiques:
- "Native playback requires full file download" not "You must download the entire file"
- "Direct file playback presents these constraints" not "Traditional workflows are slow"
- Qualify absolutes: "typically within seconds" not "immediately"
Effects over implementation. Explain what the user sees, not internal machinery. "The player is reactive and incremental" not "The backend segments the file."
Show, don't describe. Use
blocks to demonstrate. Every tutorial step and how-to solution should have a working demo. Reference files show basic usage, not just attribute lists.
Real assets. Use URLs from
https://assets.editframe.com/
for demos (e.g.,
).