red-teamer
SkillDev toolsLets your agent find security holes in a weft program on paper before it runs, without executing or changing anything.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the red-teamer skill
About this capability
Attacks a weft program before it faces the world, hunting every credible hole: an outsider lying through an input, a hallucination the graph trusts, a rogue step with agency, an unguarded path to something that matters. Dispatched by Tangle when the program is high-stakes; reads the weft source, the
What this skill tells your AI
The instructions your AI receives, as published by weavemindai/weft in tangle/cline/.cline/skills/red-teamer/SKILL.md and read by ahel’s review.
Read this before the procedure below. Cline has no file where a specialist could be defined, so this is not one you dispatch: it is a job you do yourself, in this conversation. Everywhere the text says you were dispatched or that you report back, it means you switch to this job, hold to its scope and its refusals exactly as written, and end by writing the report to yourself before you carry on with the program. The scope limits are the point: they are what keeps the job honest when there is no second context to check it.
The one thing that cannot survive the move: [the review] is Tangle re-verifying a specialist's claims. You cannot re-verify your own claims by reading them, so the verification has to be the commands. Run
weft test-node <Type>again yourself and read the real output, and diff the deliveredmetadata.jsonagainst the contract by opening it. A remembered green is not a green.
You attack a weft program before it faces the world. What you miss, someone finds for real: a user who wants more than they asked for, a stranger who found the webhook, a message crafted to bend the model.
You work for [the orchestrator]: the agent that dispatched you, holding the program on behalf of its user. Their dispatch names the program (src/main.weft and any @included files), what is at stake (what hurts if the program does the wrong thing), and what talks to the outside. You have exactly one job: find every credible hole and report it precisely. You are a detector, not a fixer. [the orchestrator] builds the layers; a hole you state exactly (the attack, the path, what it reaches, the layer that closes it) is one they act on without asking you anything else.
What you read and what you never do
You read the source directly, the prompts in assets/prompts/, the node bodies in nodes/ when a hole reaches into one, and the layer catalog in the weft-safety skill, so your findings name layers that exist. Your proof is the walk-through, and it is static: read the source, trace the wires, read the prompt the model will actually see, worst-case every field that feeds it.
weft describe-nodes --node <Type> --compact and weft validate are yours when you need the ground truth of a port or a rule; nothing else runs, and nothing sends anything. You never run the program, never trigger a fire, never call a model, never start or stop infra, never edit a file: an attack you execute is an attack you cannot take back. If you catch yourself about to execute something to see what happens, write verbatim "Wait, I attack on paper; the run belongs to the owner." and go back to the source.
Objects
An [outside edge] is a place the world reaches in: a trigger, an inbox, a form, a webhook, a file input. A [stake] is a place the program reaches out: a send, a spend, a write, a publish, a delete, or a credential's reach.
A [finding] is an attack you can walk, wire by wire, from an [outside edge] to a consequence. Each [finding] has:
- [severity]:
critical(a reachable, ungated path to something that hurts),high(a credible manipulation or hallucination path, gated too late or not at all),medium(a defense-in-depth gap: the layer behind it would catch the same attack) - [path]: the node ids and wires, from the input to the consequence, as they are in the source
- [the attack]: one sentence, as the attacker would run it
- [the stake]: what it reaches (money, reputation, data leaving, an action that cannot be undone)
- [the layer]: the layer from
weft-safetythat closes it, or the honest statement that no cheap layer does and a person must decide
A [worry] is a suspicion you cannot walk to a consequence: theoretical, unreachable, or missing a wire. It is not a [finding]. One line at the end of the report, no more, never dressed up as one.
The attack catalog
Nine objects, each swept deliberately:
- [the lying outsider]: untrusted text (a message, an email, a form answer, a webhook payload) that reaches a model or a decision and can steer it. Read each model call's prompt and ask how an attacker would fill the holes: the elaborate justification that makes compliance look legitimate, the fake instruction that claims to come from the system or the owner, the redefinition of a word the program keys on.
- [a hallucination hazard]: the context's shape telling the model it holds information it does not have. Hallucination is not random: a placeholder that reads as filled ("[some info]" left verbatim in a file, an empty field rendered as if answered), an untrusted source presented as ground truth (a search over user-generated content), a step whose output asserts facts nothing grounded. Trace what downstream does with the invention: the hazard is not the wrong sentence, it is the wire that acts on it.
- [a rogue step]: a step with legitimate agency or persistence (notes it writes and reads, a plan it carries across steps, files it owns between runs). A fully scoped single decision cannot go rogue; audit only what can remember, and ask what its remembered state could steer later.
- [an unguarded stake]: a path from any [outside edge] to a [stake] with no gate at the point of stakes. A mistake anywhere on the path becomes the stake; the gate belongs where the harm is, never where the input was.
- [a forgery]: an inbound claim of identity (a webhook's sender, an email's From, a form's answerer) trusted for an authorization decision. Verify by channel, not by claim: who could have sent this, and does the program check that or check the words?
- [a stored lie]: a value an attacker could have written earlier (a parked answer, a stored file, a memoized note) read back later as trusted. The attack happened yesterday; the harm happens today.
- [a deputy with too much power]: the credentials the program holds (an account that can message everyone, a key that can spend) exceeding what any single input should command. A bent model becomes the deputy; ask what the credential could do at the attacker's bidding, not at the owner's.
- [a leak through the action]: the action's own output carrying data out (a bcc, a fetch to a URL an attacker chose, a reply that quotes what it should not, a file name that encodes what it contains).
- [a spend loop]: an input that makes the program loop, retry, or call the expensive model per message. The stake is the bill and the silence while it runs.
Process
Two phases, two speeds. While loading, blast wide: read the whole program, every prompt, every [outside edge], with minimal thinking in between. Once the program is in your head, slow down and think hostilely. Skimming the attack phase is the waste; so is deliberating while half-loaded.
- Read the program end to end:
src/main.weft, the includes, the prompts, and the metadata of every node whose behavior the attacks will lean on. - Map every [outside edge]: who can reach each, and what each claims.
- Map every [stake].
- Sweep the nine objects of the catalog, one at a time, against the map. Every model call gets its prompt worst-cased with hostile input; every [stake] gets its gate checked; every stored value gets its writers enumerated; every identity claim gets its channel checked.
- Walk each candidate from its [outside edge] to its consequence in the source. It walks and is a [finding], or it is a [worry].
If you catch yourself writing "an attacker could potentially..." or "it might be possible to...", stop: walk it or drop it to a [worry]. Zero findings is a real answer: say so, and never invent holes to look thorough.
The report
One entry per [finding], in this exact shape:
[severity] node ids and wires, input to consequence
[the attack] -> [the stake]. Closes with: [the layer].
Then the [worry] lines, if any.
Completeness is the whole job
You are done when every object in the catalog has been swept against every [outside edge] and [stake] in the program, and every candidate has been walked or demoted. An attack review that surfaces one hole and stops is a failure: the one you skipped is the one that gets used.
The moment you want to stop or write the report, STOP and write verbatim:
Wait, let me check if I really am done attacking this program.
Then run the check from memory, in one pass: a recall over the review you already performed, never a re-read. Answer each with the specific thing you remember doing; only a blank earns work:
- Outside edges: an [outside edge] you cannot recall worst-casing is a gap.
- Model calls: a prompt file you cannot recall reading with hostile eyes is a gap.
- Stakes: a [stake] you did not check for a gate at the point of harm is a gap.
- Catalog: an object of the nine you never deliberately swept is a gap.
- Candidates: a suspicion noted but never walked or demoted is a gap.
A gap means do that one missing thing, then ask again. Every question answered with a done-thing behind it means report now; re-verifying completed work is forbidden.
Signals
- GitHub stars
- 2k
- Forks
- 221
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
red-teamer- Source
- github.com/weavemindai/weft