agentleFS
dylanroscoverdylanroscover/Embody/.claude/skills/operator-gotchas/SKILL.md

operator-gotchas

Skill213 starsChanged 2 months agoMITView on GitHub

MUST READ before wiring a TOP, CHOP, MAT, DAT, light, camera or instancing chain you have not built before: the parameter names TD abbreviates, the defaults that silently do the wrong thing, and the input-order rules, per operator, verified on TD 2025.33230. Pair with describe_op_type.

The file

We split this skill into the rules it gives an agent

2 rules. About 0 are common, 0 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈0

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Never drive a long-running show's motion from absTime.seconds: the accumulated value loses float precision on the GPU (noise goes blocky, …

    line 46
  2. Very specific:

    Every execute DAT has ONE source parameter and is silently inert without it: chopexecuteDAT.chop, datexecuteDAT.dat, parameterexecuteDAT.op …

    line 50

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md
<!-- Generated by Embody/Envoy - Do not remove this comment - sha:25bf8f0d0830692c -->

Operator Gotchas

Per-operator traps, verified live on TD 2025.33230 (2026-09-25) unless marked as a field note. Before touching an unfamiliar operator, describe_op_type(op_type, pattern=...) returns its real parameter names, creation defaults and menu values, and set_parameter rejects a bad menu value and names the valid ones. A guessed name costs a round trip; a wrong guess that happens to exist costs a show.

Universal

  • Reference nulls, not live ops. An expression or OP parameter that names a Null survives inserting or deleting the ops before it; one that names the working op breaks the moment a filter goes in front. End every chain in a Null and point everything at that.
  • OP-reference parameters hold a path string and do not follow a rename of their target (a Select TOP pointed at a renamed Constant TOP read None). After any rename, sweep par.val, par.expr and par.bindExpr for the old name (td-python.md).
  • Menu values are the lowercase token, never the label: ortho not orthographic, deg not degrees, aa8 not aa8high, chanpercol not Channel per Column.
  • Par.default can disagree with what a fresh operator actually holds (a Text DAT's language declares input but a new one reads text); describe_op_type reports the creation value and flags the divergence.
  • Time-dependent operators cook only when something demands their output: a viewer, a Render or Out TOP, a Null with its viewer on, a CHOP Execute DAT. A silent chain is usually undemanded, not broken (td-python.md, Cook Model).

TOPs

  • compositeTOP: operand defaults to multiply. With over, input 0 is the FOREGROUND (on top) and later inputs sit underneath, the reverse of a layer stack.
  • constantTOP is white with alpha 1 by default; set colorr/g/b=0 and alpha=0 for an empty seed. It exposes type=texture3d but has no customdepth, so it cannot seed a real volume; use a small glslTOP (/glsl-shaders).
  • feedbackTOP: top names the Null that closes the loop, resetpulse resets. Keep format identical through the loop (rgba16float or rgba32float for anything outside 0-1) and pin outputresolution=custom inside it. Field note (TDMCPSkills): on reset it takes the input's resolution, afterwards the target's, so a mismatch changes resolution after the first frame.
  • selectTOP: top is a path string (see Universal: a rename breaks it).
  • depthTOP: pixelformat=rgba16float + depthspace=reranged gives usable 0-1 depth.
  • moviefileinTOP: paths resolve relative to the .toe; a file change or reloadpulse lands only across a real frame advance (/td-api-reference, Cook Model Gotchas). playmode is locked, specify, sequential or timecodeop; cuepulse + cuepoint jump.
  • renderTOP: camera defaults to cam1, geometry and lights to *; antialias is aa1..aa32; bgcolora 0 keeps the background transparent for compositing; set a float format before bloom or tone-mapping or every value clips at 1.0 (/visual-aesthetics).
  • rgba8fixed, the default output format everywhere, clamps to 0-1. Data textures, feedback, random values and HDR need rgba16float or rgba32float.
  • choptoTOP: dataformat packs channels (r, one channel per row by default; rgba packs four) and needs a float format for data bakes.
  • glslTOP has 3 input connectors; use glslmultiTOP for more (/glsl-shaders).

CHOPs

  • selectCHOP: the remote reference is chops (plural); channames, renamefrom and renameto take TD patterns (*, ?, [xyz], [0-2], a|b, ~exclude). Use it to fan one source out to many consumers without long wires.
  • parameterCHOP (ops defaults to ..): custom is ON and builtin is OFF by default, so reading tx needs builtin on, and a parameters filter alone does nothing while the category toggle is off.
  • lagCHOP: lag1 (rise) and lag2 (fall) in lagunit seconds; there is no lag. filterCHOP: type (gauss default), width, widthunit (seconds by default).
  • mathCHOP: chopop/chanop combine across inputs or channels (add, sub, mul, div, avg, min, max, len); preop/postop act per value (negate, pos, root, square, inverse); preoff, gain and postoff apply as (value + preoff) * gain + postoff; integer rounds.
  • logicCHOP convert: only bound reads boundmin/boundmax; gt, ge, lt, le, eq, ne compare between inputs, not against a threshold. "Value above a threshold" is Math CHOP preoff=-threshold into Logic convert=pos.
  • functionCHOP: func (sqrt, abs, sign, trig, ...), angunit is deg, rad or cycle. lookupCHOP: input 0 is the index, input 1 the table, index1/index2 the index range. shuffleCHOP method=spliteveryn with nval de-interleaves samples into channels. resampleCHOP rate fixes a rate mismatch before a Merge or Math.
  • nullCHOP cooktype=selective on a chain end that only needs to update on change.
  • timerCHOP ships with cycle OFF and cyclelimit ON at maxcycles 4: a periodic timer needs cycle on and the limit off or it stops after four. length 10 s; ondone is donothing, reinit, restart or restartnoinit; segments come from segdat with segmethod serial or parallel and deferpars on while they play; lengthtype=infinite disables the fraction; callbacks is its docked DAT.
  • constantCHOP: const0name (default chan1) / const0value is a sequence, and set_parameter on const5name grows it.
  • switchCHOP index is an Int; switchTOP index is a Float with a blend toggle.
  • speedCHOP integrates its input (a rate becomes a position). Field note (TDMCPSkills): triggerCHOP will not re-fire while the input stays high; detect edges in a CHOP Execute DAT onOffToOn instead.
  • The audio input is audiodeviceinCHOP (there is no audiodevinCHOP); long files play from audiofileinCHOP; analysis is audiospectrumCHOP (fftsize, frequencylog), analyzeCHOP (function=rmspower), beatCHOP.
  • Never drive a long-running show's motion from absTime.seconds: the accumulated value loses float precision on the GPU (noise goes blocky, motion steps). Use cyclic sources (LFO sin/cos into a 4D noise offset, beatCHOP, timerCHOP) or absTime.frame modulo a period.

DATs and callbacks

  • Every execute DAT has ONE source parameter and is silently inert without it: chopexecuteDAT.chop, datexecuteDAT.dat, parameterexecuteDAT.op (with pars a pattern; empty watches nothing), panelexecuteDAT.panels (plural). active and the callback toggle you rely on (offtoon, valuechange, tablechange, ...) must both be on.
  • parameterexecuteDAT ships with builtin AND custom ON; turn builtin off for a custom-parameter dispatcher (/parameter-design).
  • executeDAT ships with every hook OFF (framestart, frameend, start, create, exit); a frame driver that was never enabled demands nothing.
  • A CHOP Execute DAT makes its watched CHOP cook every frame whether or not anything else pulls it.
  • A Text DAT's language (python, glsl, json, yaml, xml, text) is what gives a code DAT colouring and error checking; a hand-created one reads text, while create_op and create_extension make it python; for any other content pass create_op(language=...), which also picks the matching file type when the DAT is auto-externalized. Embody's externalize_op sets file and syncfile; never set them yourself.
  • webclientDAT: reqmethod, url, request pulse, timeout in ms (60000 default), authtype, output (text or table), and a docked _callbacks DAT whose onResponse runs on the main thread (/td-api-reference, Background Work). jsonDAT: filter is a JSONPath ($), output is results, result or source.
  • Table cells are strings: op('t')[1, 2] + 1 auto-casts, .val + 1 raises (/td-api-reference).

MATs, lights, cameras

  • pbrMAT: metallic AND roughness default to 1.0, so untouched it renders as rough chrome; set metallic=0 for dielectrics and vary roughness. It needs an environmentlightCOMP (envlightmap) plus a Light COMP or it renders near-black. POP geometry under PBR needs normalPOP tangents (/pop-networks).
  • pointspriteMAT: pointsize in pixels, colormap, blending on for transparency (blendop), sizingmodel constatten (with attennear, attenfar, attensizenear, attensizefar) or perspective. Points render as single pixels under any other MAT.
  • lineMAT: linecoloratt defaults to Color, linewidthatt to LineWidth; widthnear/widthfar attenuate with distance; widthaffectedbyfov OFF keeps pixel widths when the camera is normalized.
  • glslMAT: blending off by default; srcblend/destblend (one, zero, sa, omsa, ...) plus the alpha pair srcblenda/destblenda; cullface is userender, neither, backfaces or frontfaces; wireframe is off, tesselated or topology.
  • lightCOMP: lighttype point, cone or distant; dimmer; coneangle/conedelta; shadowtype off, hard2d, soft2d; attenuated. cameraCOMP: projection perspective or ortho; fov 45; near 0.1 and far 1000 (a computed camera distance can clip -- raise far); lookat; fog off, linear, exp, exp2 with fogcolorr/g/b and fogdensity.
  • A fresh geometryCOMP holds torus1 with its render flag ON: delete it or it renders behind your scene (/create-operator).

Instancing (Geometry COMP, Instance pages)

  • instancing=1, instanceop = the data OP (CHOP, DAT, TOP or POP); instancecountmode oplength (default) or manual; a DAT with a header row needs instancefirstrow=names.
  • Channel selectors are strings that must match a channel name, DAT column or POP attribute exactly: instancetx/ty/tz, instancerx/ry/rz, instancesx/sy/sz, instancer/g/b/a (instancecolormode replace, multiply, add, subtract), instanceactive. Per-group OP overrides: instancetop (translate), instancerop (rotate), instancesop (scale), instancecolorop, instancetexcoordop.
  • POP data goes in directly: instanceop = a nullPOP, selectors P(0), P(1), P(2), Color(0), ... No poptoCHOP round trip, no GPU-to-CPU copy.
  • Rotate-to-vector: instancerottoop + instancerottox/y/z, instancerottoforward (negz default; posy for tubes), instancerottoorder (rottoxform, rotaterotto, rottorotate), up vector from instancerotupop + instancerotupx/y/z.
  • Textures per instance: instancetexs (a TOP list), instancetexindexop + instancetexindex, instancetexmode replace or transform.
  • OP-reference parameters inside a Geometry COMP resolve from INSIDE it: reach the COMP's siblings through a parent-shortcut expression, never ../name (parameters.md).

In and Out

  • A COMP has no input connector until an in* operator exists inside it; with several, set connectorder explicitly (default order is creation order). Wire a default source into an inTOP/inCHOP's own input: it is used when nothing is connected outside.
  • outTOP label defaults to $ON (its own name). A specimen's output is an Out TOP named out1.

Topics cross-checked against Derivative's TDMCPSkills family skills with permission; every unmarked claim was probed live on 2025.33230, and three of theirs were corrected here (chops, panels, audiodeviceinCHOP).

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.