tdmcp-bridge-endpoint-099a8e — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited tdmcp-bridge-endpoint-099a8e (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A bridge feature is correct only when four layers agree on one shape: the Python route, the TS client method, the Zod validator, and the tool that consumes it. This skill is that contract. Build the slice top-to-bottom, keep an exec fallback so it ships safely before every bridge in the wild updates, and prove it all offline.
Run bridge slices one at a time — they sharetouchDesignerClient.ts,validators.ts, and the bridge route registry. Two in parallel is merge hell.
The bridge runs arbitrary Python on /api/exec. A security-conscious VJ runs TDMCP_BRIDGE_ALLOW_EXEC=0 on a venue network — and ~69 tools silently die. Promoting a well-defined op (connect, param-mode read/write, DAT text, node flags, logs) to its own REST route makes it survive that hardened config. You are promoting proven logic, not inventing it — start from the Python the tool already sends through /api/exec.
td/)route**. Find how routes are registered (the request dispatcher in td/) and follow that exact pattern — don't invent a second mechanism.
op, app, project, ui) **inside the handlerfunction** so the module imports cleanly outside TD (the tests rely on this).
ok/error and the data.Mirror the envelope the existing endpoints return so parsePythonReport/the validators stay uniform.
TDMCP_BRIDGE_TOKEN (bearer auth) and the ALLOW_EXEC gate exactly assibling routes do — a new route must not become an auth bypass.
python3 -m py_compile td/**/<changed>.py on every changed file.src/td-client/touchDesignerClient.ts)TdApiError (4xx/5xx with a body),TdConnectionError (refused/DNS), TdTimeoutError. Never let a raw fetch error escape.
fall back to the previous /api/exec Python path. This is what lets the promotion ship before the bridge is reinstalled everywhere. Make the fallback a private helper so the test can force both paths.
src/td-client/validators.ts).parse() it in the client —never hand a raw wire object upward. Reuse the shared envelope helpers already in the file.
connect_nodes/disconnect_nodes/read_parameter_modes/set_parameter_expression/edit_dat_content/set_dat_content/get_bridge_logs/ the node_detail consumers at the new method. Preserve current behavior and output exactly — this is a transport swap, not a redesign. Keep fail-forward: validate inputs with Zod, turn TD failures into friendly isError via errorResult/friendlyTdError; never throw out of a handler.
Attribute names that vary by TD build are the trap: connector semantics for connect/disconnect, ParMode/.expr/.mode names for param-modes, Error DAT column layout for logs, optype enumeration for createable. The backlog flags these probe-live.
get_td_info ok): probe the real names in a scratch networkfirst (create a couple of ops, read the actual attrs), then lock the schema.
(tdmcp://operators/..., tdmcp://classes/...) and TD's documented Python API; write the offline tests; and flag every probe-dependent assumption `UNVERIFIED-live` in your report (with the source you used). Do not claim a live pass you could not observe. The campaign-lead holds UNVERIFIED-live items for a live pass before the final release.
td/tests/test_<name>.py: import the handler, call it with afaked op()/payload, assert the report shape and the error branch. At minimum py_compile. Run python3 -m unittest discover -s td/tests.
tests/unit/*: stub the route; assert (a) success → validatedshape, (b) 4xx/5xx → correct TdError subclass, (c) timeout → TdTimeoutError, (d) 404 → exec-fallback path returns the same shape. Mirror the closest existing client test.
npm run typecheck · npm run build · ./node_modules/.bin/biome check . (NOT npm run lint) · npm test · npm run test:bridge. Fix forward; never disable a gate or use --no-verify.
Endpoint(s) added + method + validator; tool(s) rewired; the exec-fallback behavior; every UNVERIFIED-live assumption with its source; gate results; and the ledger fields to set (files[], status). On a re-run, treat feedback as a diff — don't rewrite a green slice.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.