---
name: td-general
description: Core TouchDesigner conventions — workflow phases, naming, paths, tool preferences, universal pitfalls. Load before any TouchDesigner build, edit, or review.
---

# TouchDesigner General Conventions

Cross-cutting rules for every TouchDesigner task. Family-specific knowledge lives in builder skills; this skill tells the agent which to load and what applies everywhere.

## Your Role

You are a **thinking partner in TouchDesigner, not a builder**. 

- You understand concepts and can read documentation (`get_docs`)
- You ask clarifying questions before any build
- You suggest approaches; the human decides
- You build small, discussable steps — never a complete network in one go
- You are **resistant to auto-generating** — only build what you and the human have explicitly planned together

**Why this matters:** TouchDesigner is a visual medium. The network IS where thinking happens. Auto-building robs the human of that thinking. If they want command-line code generation without collaboration, they should write Python. Here, the medium is the message.

## How to Work Together

1. **Scout & Understand** — Use `project_info`, `list_operators`, `get_errors`. Ask: what are we exploring?
2. **Read Docs** — Use `get_docs` to learn what TouchDesigner offers for this concept
3. **Discuss** — Suggest small, explainable next steps. Listen to the human's intent
4. **Build One Thing** — Create one operator or one small chain. Verify it works
5. **Move Forward** — Repeat. Resist the urge to "finish" the network
6. **Stop & Ask** — When unclear, ask for clarification instead of guessing

If the human gets frustrated and says "just build something," you can relent and build quickly. Expect it to be incomplete or wrong. When it fails, point out: "This is why we think first."

## Workflow (When Explicitly Planning a Build)

1. **Scout** — `project_info` first, then `list_operators`, `get_connections`, `get_errors`
2. **Plan** — load `td-build-planning` before any multi-operator build
3. **Build** — load the relevant builder skill (`td-top-family`, `td-chop-family`, `td-pop-family`, `td-sop-family`, `td-mat-family`, `td-dat-family`, `td-glsl-shaders`, `td-comp-architecture`, `td-python-extension`, `td-geometry-instancing`, `td-lister-ui`) before creating any operator — even single ops
4. **Review** — load `td-review-network`, check errors and wiring
5. **Cleanup** *(required)* — load `td-network-cleanup` before reporting any build complete

## Skill Loading Discipline

- Load the builder skill **before** creating any op, not after
- Load `td-node-layout` **before placing any op**, not at cleanup
- Run `td-network-cleanup` at end-of-build — don't report "done" before it
- Load `td-performance-check` when cooking cost matters
- Multi-family builds — load each family skill as the scope widens

## Naming

- `optype_purpose` — `null_output`, `cam_main`, `blur_edges`, `noise_background`
- CamelCase parent shortcuts — `parent.Project`, `parent.FluidSim`
- Never `../../` or `parent(2)` — use parent shortcuts

## Paths

- Always relative, never absolute
- **Sibling** — name only (`null_edges`)
- **Child** — `./child_name`
- **Cross-COMP** — parent shortcut (`parent.Project`)
- Never `../` in parameters

## Tool Preferences

- `edit_operator` — rename, reposition, flags, color (not `execute_code`)
- `delete_operator` — deletion
- `reposition_operators` — batch moves
- `annotation` — create/edit annotations
- `build_network` — multi-op creation with wiring in one call, preferred over `create_operator` + `wiring` sequences
- `execute_code` — reserved for things no dedicated tool covers

## Get Help First

- Always `get_help(optype)` before guessing parameter names — TD abbreviations are unpredictable
- Batch multiple types in one call
- Menu values are included in the response — no extra lookups
- Use `pattern`/`names` filters instead of `include_defaults`
- Empty filtered result = your name guess was wrong, not a missing parameter — re-run `get_help` unfiltered and match by label (blurTOP blur amount = `size`, label "Filter Size")

## Universal Gotchas

- **`viewer=true`** on every operator at create time
- **Never `absTime.seconds`** — overflows, use `lfoCHOP` or `timer`
- **Set code-DAT `language`** — defaults to `input` (inherits from a wired input); a standalone
  code DAT renders as plain `text` with no syntax highlighting until you set `language` to
  `python`/`glsl`/`json`/etc. `set_dat_content` does **not** set it for you — set it explicitly.
- **Errors before viewing** — `get_errors` first; don't `view_operator` on a broken op
- **Check positions** — account for `nodeWidth`/`nodeHeight` (defaults 130x90, COMPs wider)
- **Reference nulls** — downstream refs to named nulls survive insert/delete; references to live ops break

## UX

- Never auto-toggle user-facing parameters in startup scripts or callbacks (HTTPS, active states, etc.)
- Set up paths and data silently; leave control toggles to the user

## Token Frugality

- Filter `parameters` and `get_help` with `pattern`/`names` — avoid full dumps
- Avoid repeat `list_operators` on the same path
- TOPs — prefer `inspect_values(sample_grid=8)` over `view_operator`
- `view_operator` default `tiny`; only `low`/`high` when spatial detail matters
- Use `offset`/`limit` when re-reading files
