Generates wiring verification YAML for loom plans.
Scanned 9/5/2026
Install to Claude Code
npx -y skills add cosmix/loom --skill loom-wiring-test --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Loom Wiring Test?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/cosmix-loom-wiring-test)More formats (shields.io, HTML) on the badges page.
---
name: loom-wiring-test
description: Generates wiring verification YAML for loom plans.
allowed-tools:
- Read
- Grep
- Glob
- Edit
- Write
- Bash
triggers:
- wiring
- wiring-test
- wiring_tests
- integration test
- integration verification
- verify wiring
- prove integration
- command registered
- endpoint mounted
- module exported
---
# Wiring Test Skill
## Overview
Tests pass and code compiles, yet the feature is never wired up — command not registered, endpoint not mounted, module not imported, component never rendered. This is the exact failure loom's goal-backward verification exists to catch. Use this skill to write strong verification fields for a stage.
> ⚠️ **`truths` is GONE.** It was removed as a standalone field. Behavioral commands now live in `acceptance`; the goal-backward layers are `artifacts`, `wiring`, `wiring_tests`, `dead_code_check`. Plan parsing rejects `truths` and every other unknown field, so migrate retired fields before initialization or verification.
## The five verification fields
| Field | Type | Proves | Timeout |
| ----- | ---- | ------ | ------- |
| `acceptance` | `Vec<AcceptanceCriterion>` | Build/test/lint and observable behavior | 5 min (Simple) / 30 s (Extended) |
| `artifacts` | `Vec<String>` (globs) | Files exist with real implementation | — |
| `wiring` | `Vec<WiringCheck>` | Static connection point present (regex in a file) | — |
| `wiring_tests` | `Vec<WiringTest>` | Runtime integration: command output matches criteria | — |
| `dead_code_check` | `Option<DeadCodeCheck>` | No orphaned code (see `/loom-dead-code-check`) | — |
`loom check <stage-id> [--suggest]` runs `acceptance` and the goal-backward layers (`artifacts`, `wiring`, `wiring_tests`, `dead_code_check`) without changing stage state. `loom stage complete` also runs acceptance before transitioning the stage.
**Requirement (enforced by `loom init` and `loom plan verify`):** every `standard` and `integration-verify` stage must define `acceptance` OR at least one goal-backward check. Knowledge stages are exempt.
**CRITICAL PATH RULE:** all paths (`artifacts`, `wiring.source`) are relative to the stage's `working_dir`. `working_dir: "loom"` + `src/x.rs` → `.worktrees/<stage>/loom/src/x.rs`. Never `../`. Double-path (`loom/loom/...`) is the classic mistake.
**YAML WARNING:** never put triple backticks inside a `description` field — breaks the parser (often surfaces as a misleading "missing artifacts/wiring" error). Use plain indented text.
## The one rule that matters: verify the CONSUMER, not the PRODUCER
A wiring pattern that greps where a symbol is **declared / exported / imported** passes while the feature is still unwired — the exact trap, committed inside the verification field. Grep the **call / mount / render / dispatch** site that proves the symbol is USED.
| ❌ Producer (exists ≠ wired) | ✅ Consumer (proves reachable) |
| --------------------------- | ----------------------------- |
| `pattern: "mod new_command"` | `source: "src/cli.rs", pattern: "NewCommand =>"` (dispatch arm) |
| `pattern: "pub fn handler"` | `source: "src/routes.rs", pattern: "/features.*create_feature"` (route registration) |
| `pattern: "export function Foo"` | `source: "src/pages/Home.tsx", pattern: "<Foo"` (render site) |
Pair every `wiring` entry with a behavioral `acceptance` command where one exists — observable behavior is the strongest wiring proof.
## Field mechanics (how loom actually evaluates each)
### wiring — `WiringCheck { source, pattern, description }`
- `pattern` is a **regex** (Rust `regex` crate, `RegexBuilder`), passes if it matches **anywhere** in `source`. A missing/unreadable `source` file is a gap.
- ⚠ **`!` is a LITERAL character, not negation.** You cannot express "must NOT contain" in `wiring` — use `dead_code_check` or an `acceptance` command with `!` shell negation for that.
- ⚠ Match all visibility modifiers with `pub.*fn name`, not `pub fn name` — `pub(crate) fn`, `pub(super) fn`, and bare `fn` all differ.
- Escape regex metacharacters you mean literally: `Vec<String>`, `foo()`, `a.b` — `.` `(` `)` `<` `[` `*` `+` `?` `|` `\` are all special. Prefer anchoring on a distinctive substring over a fragile full-signature regex.
### artifacts — `Vec<String>` glob patterns
A file is a gap if it is **missing**, **empty after trimming whitespace**, or **contains a stub pattern**:
```text
TODO FIXME unimplemented! todo! panic!("not implemented
pass # TODO raise NotImplementedError throw new Error("Not implemented
```
- ⚠ **Markdown files (`.md`/`.mdx`/`.markdown`) skip stub detection** — they legitimately contain "TODO" in prose.
- ⚠ Stub matching is a plain substring scan, so **"TODO" inside a string literal or comment in a real source file trips it.** If your implementation must contain the literal text `TODO`, don't list that file as an artifact.
- There is **no minimum byte size** — the check is non-empty-after-trim, not ">100 bytes". Empty-file and stub gaps are distinct (`ArtifactEmpty` vs `ArtifactStub`).
- Point at **implementation** files, not directories or bare test files.
### wiring_tests — `WiringTest { name, command, success_criteria, description }`
The runtime, structured cousin of a behavioral check — a goal-backward layer (unlike `acceptance`). `success_criteria` (`SuccessCriteria`) fields, all optional:
```yaml
wiring_tests:
- name: "health endpoint responds"
command: "curl -sf localhost:8080/health"
success_criteria:
exit_code: 0
stdout_contains: ["ok"]
stdout_not_contains: ["error"]
stderr_contains: []
stderr_empty: true
description: "Health route mounted and reachable"
```
Use `wiring_tests` (not `acceptance`) when you want a runtime check counted as goal-backward proof and surfaced by `loom check`.
### acceptance — Simple or Extended
```yaml
acceptance:
- "cargo test" # Simple: exit 0, 5-min timeout
- command: "loom check st --suggest" # Extended (TruthCheck): 30-s timeout
stdout_contains: ["PASS"]
stdout_not_contains: ["panic"]
stderr_empty: false
exit_code: 0
```
## Templates by feature type
### CLI command
```yaml
acceptance:
- "myapp new-cmd --help" # command responds
- 'myapp new-cmd --help | rg -q "usage"' # primary use case wired
artifacts:
- "src/commands/new_cmd.rs"
wiring:
- source: "src/cli/dispatch.rs"
pattern: "Commands::NewCmd" # CONSUMER: dispatch arm, not `mod new_cmd`
description: "Command dispatched in CLI"
```
### API endpoint
```yaml
acceptance:
- 'curl -sf -X POST localhost:8080/api/features -d ''{"name":"t"}'' | rg -q id'
artifacts:
- "src/handlers/features.rs"
wiring:
- source: "src/routes/api.rs"
pattern: 'post.*/features.*create_feature' # route registration (consumer)
description: "POST /features mounted"
wiring_tests:
- name: "features endpoint reachable"
command: "curl -sf -o /dev/null -w '%{http_code}' localhost:8080/api/features"
success_criteria:
stdout_contains: ["200"]
```
### Module / library
```yaml
acceptance:
- "cargo test auth::"
artifacts:
- "src/auth/mod.rs"
- "src/auth/jwt.rs"
wiring:
- source: "src/orchestrator/core.rs"
pattern: "use crate::auth" # a REAL consumer, not just `pub mod auth` in lib.rs
description: "Auth used by orchestrator"
```
### UI component
```yaml
acceptance:
- "bun test FeatureCard"
- "bun run build" # build catches asset/CSS wiring a unit test misses
artifacts:
- "src/components/FeatureCard.tsx"
wiring:
- source: "src/pages/Dashboard.tsx"
pattern: "<FeatureCard" # rendered (consumer), not just exported from barrel
description: "FeatureCard rendered in Dashboard"
```
## Good vs bad
```yaml
# ❌ proves nothing: tests pass with the feature unregistered; `src/` matches anything
acceptance: ["cargo test"]
artifacts: ["src/"]
wiring: []
# ✅ proves the feature is reachable end-to-end
acceptance:
- "loom check st-1 --suggest"
- 'loom check --help | rg -q "suggest"'
artifacts:
- "src/commands/verify.rs"
wiring:
- source: "src/cli/dispatch.rs"
pattern: "Commands::Check"
description: "Check command dispatched in CLI"
```
## Realizability — a green check must actually PROVE something
A check that passes while asserting nothing is worse than none — it reads as "covered." Before finalizing, put each check through four gates:
1. **Expressible** — the harness can already do this. "Stub the response / seed this store" is not free; confirm the suite has the mechanism or add it as explicit work.
2. **Executes the code under test** — the runtime that runs the check loads the code asserted. A `wiring` grep only proves the call site *exists in the file*; it does not run it. Any change with real logic needs an `acceptance`/`wiring_tests` command that RUNS it.
3. **Assertion strength matches the claim** — a `stdout_contains` substring cannot guard a "byte-identical" contract; a presence check cannot guard behavior.
4. **Actually selected** — for EACH artifact a stage produces, at least one `acceptance`/`wiring_tests` command must FAIL if that artifact were broken. A test a CI filter never selects is dead coverage.
## Final checklist
- [ ] No stale top-level `truths:` block anywhere (removed field — plan parsing rejects it)
- [ ] Every `wiring` targets a CONSUMER site (call/mount/render/dispatch), not a declaration/export/import
- [ ] `wiring` patterns are valid regex, metacharacters escaped, `pub.*fn` for visibility; no `!`-negation assumed
- [ ] `artifacts` are specific implementation files that contain no stub text and aren't markdown-exempt where you needed stub detection
- [ ] At least one `acceptance` or `wiring_tests` command exercises the primary use case end-to-end
- [ ] Standard/IV stage has `acceptance` OR ≥1 goal-backward check (else `loom init` rejects it)
- [ ] All paths relative to `working_dir`; no `../`; no double-path
- [ ] No triple backticks inside any `description`
- [ ] For each artifact, some command would FAIL if it were broken
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!